Commit graph

4160 commits

Author SHA1 Message Date
Niko Matsakis
d7bb575b06 use present tense consistently and update references 2017-09-26 11:55:53 -04:00
gaurikholkar
aa6f0c8050 modify message for return time having multiple lifetimes 2017-09-26 11:55:52 -04:00
gaurikholkar
e58f528bb0 merge fixes, addressing CR comments 2017-09-26 11:55:52 -04:00
bors
4b8bf391fd Auto merge of #44735 - tirr-c:issue-42143, r=arielb1
Friendlier error message for closure argument type mismatch

Rebased #42270.
Fixes #42143.

---

`test.rs`:

```rust
fn main() {
    foo(|_: i32, _: usize| ());
}

fn foo<F>(_: F) where F: Fn(&str, usize) {}
```

Before:

```
error[E0281]: type mismatch: `[closure@test.rs:2:9: 2:30]` implements the trait `std::ops::Fn<(i32, usize)>`, but the trait `for<'r> std::ops::Fn<(&'r str, usize)>` is required
 --> test.rs:2:5
  |
2 |     foo(|_: i32, _: usize| ());
  |     ^^^ --------------------- implements `std::ops::Fn<(i32, usize)>`
  |     |
  |     expected &str, found i32
  |     requires `for<'r> std::ops::Fn<(&'r str, usize)>`
  |
  = note: required by `foo`
```

After (early):

```
error[E0631]: type mismatch in closure arguments
 --> test.rs:2:5
  |
2 |     foo(|_: i32, _: usize| ());
  |     ^^^ --------------------- takes arguments of type `i32` and `usize`
  |     |
  |     expected arguments of type `&str` and `usize`
  |
  = note: required by `foo`
```

After (current):

```
error[E0631]: type mismatch in closure arguments
 --> test.rs:2:5
  |
2 |     foo(|_: i32, _: usize| ());
  |     ^^^ --------------------- found signature of `fn(i32, usize) -> _`
  |     |
  |     expected signature of `for<'r> fn(&'r str, usize) -> _`
  |
  = note: required by `foo`
```

~~Compiler output has been changed, and a few tests are failing. Help me writing/fixing tests!~~

r? @nikomatsakis
2017-09-26 05:02:03 +00:00
bors
82ae9682ca Auto merge of #44297 - laumann:suggest-misspelt-methods, r=arielb1
Add suggestions for misspelled method names

Use the syntax::util::lev_distance module to provide suggestions when a
named method cannot be found.

Part of #30197
2017-09-25 23:09:06 +00:00
Esteban Küber
9c3fa4d3ef Point at signature on unused lint 2017-09-25 13:25:54 -07:00
Esteban Küber
ddee9fbc99 Point at parameter type on E0301
On "the parameter type `T` may not live long enough" error, point to the
parameter type suggesting lifetime bindings:

```
error[E0310]: the parameter type `T` may not live long enough
  --> $DIR/lifetime-doesnt-live-long-enough.rs:28:5
   |
27 | struct Foo<T> {
   |            - help: consider adding an explicit lifetime bound `T: 'static`...
28 |     foo: &'static T
   |     ^^^^^^^^^^^^^^^
   |
note: ...so that the reference type `&'static T` does not outlive the data it points at
  --> $DIR/lifetime-doesnt-live-long-enough.rs:28:5
   |
28 |     foo: &'static T
   |     ^^^^^^^^^^^^^^^
```
2017-09-24 11:50:09 -07:00
Thomas Jespersen
4963394f86 Change Levensthein-based method to a single suggestion
The convention for suggesting close matches is to provide at most one match (the
closest one). Change the suggestions for misspelt method names to obey that.
2017-09-24 20:00:02 +02:00
Guillaume Gomez
8a25ec019e Rollup merge of #44103 - zackmdavis:cmp_op_must_use, r=arielb1
add comparison operators to must-use lint (under `fn_must_use` feature)

Although RFC 1940 is about annotating functions with `#[must_use]`, a
key part of the motivation was linting unused equality operators.

(See
https://github.com/rust-lang/rfcs/pull/1812#issuecomment-265695898—it
seems to have not been clear to discussants at the time that marking the
comparison methods as `must_use` would not give us the lints on
comparison operators, at least in (what the present author understood
as) the most straightforward implementation, as landed in #43728
(3645b062).)

To rectify the situation, we here lint unused comparison operators as
part of the unused-must-use lint (feature gated by the `fn_must_use`
feature flag, which now arguably becomes a slight (tolerable in the
opinion of the present author) misnomer).

This is in the matter of #43302.

cc @crumblingstatue
2017-09-24 14:01:49 +02:00
bors
6f9078745e Auto merge of #44786 - thombles:tk/i41314, r=petrochenkov
Improve diagnostics when attempting to match tuple enum variant with struct pattern

Adds an extra note as below to explain that a tuple pattern was probably intended.

```
error[E0026]: variant `X::Y` does not have a field named `data`
  --> src/main.rs:18:16
   |
18 |         X::Y { data } => println!("The data is {}", data)
   |                ^^^^ variant `X::Y` does not have field `data`

error[E0027]: pattern does not mention field `0`
  --> src/main.rs:18:9
   |
18 |         X::Y { data } => println!("The data is {}", data)
   |         ^^^^^^^^^^^^^ missing field `0`
   |
   = note: trying to match a tuple variant with a struct variant pattern
```

Fixes #41314.
2017-09-24 09:02:19 +00:00
Zack M. Davis
6734d39b49 update fn_must_use UI test to exercise nonprimitive comparisons 2017-09-23 10:11:39 -07:00
bors
a83c3e7771 Auto merge of #43870 - GuillaumeGomez:deref-suggestion, r=nikomatsakis
Add deref suggestion

Fixes #34562.
2017-09-23 13:13:15 +00:00
Thomas Karpiniec
def660cad5 UI unit test for note when matching tuple enum with struct pattern 2017-09-23 20:49:28 +10:00
Wonwoo Choi
1bfbfb20a1 Print fn signature when there is closure argument type mismatch
Fixes #42143.
E0281 is totally replaced by E0631. UI tests are updated accordingly.
2017-09-23 10:15:30 +09:00
Zack M. Davis
8917616e6a add comparison operators to must-use lint (under fn_must_use feature)
Although RFC 1940 is about annotating functions with `#[must_use]`, a
key part of the motivation was linting unused equality operators.

(See
https://github.com/rust-lang/rfcs/pull/1812#issuecomment-265695898—it
seems to have not been clear to discussants at the time that marking the
comparison methods as `must_use` would not give us the lints on
comparison operators, at least in (what the present author understood
as) the most straightforward implementation, as landed in #43728
(3645b062).)

To rectify the situation, we here lint unused comparison operators as
part of the unused-must-use lint (feature gated by the `fn_must_use`
feature flag, which now arguably becomes a slight (tolerable in the
opinion of the present author) misnomer).

This is in the matter of #43302.
2017-09-22 15:45:47 -07:00
Zack M. Davis
083f053294 suggest an outer attribute when #![derive(...)] (predictably) fails 2017-09-21 21:20:31 -07:00
Zack M. Davis
35176867f6 only set non-ADT derive error once per attribute, not per trait
A slight eccentricity of this change is that now non-ADT-derive errors prevent
derive-macro-not-found errors from surfacing (see changes to the
gating-of-derive compile-fail tests).

Resolves #43927.
2017-09-21 21:20:23 -07:00
Guillaume Gomez
c30435be5b Add deref suggestion 2017-09-21 23:30:00 +02:00
bors
17f56c549c Auto merge of #44215 - oli-obk:import_sugg, r=nrc
don't suggest placing `use` statements into expanded code

r? @nrc

fixes #44210

```rust
#[derive(Debug)]
struct Foo;

type X = Path;
```

will try to place `use std::path::Path;` between `#[derive(Debug)]` and `struct Foo;`

I am not sure how to obtain a span before the first attribute, because derive attributes are removed during expansion.

It would be trivial to detect this case and place the `use` after the item, but that would be somewhat weird I think.
2017-09-21 20:12:22 +00:00
Thomas Jespersen
09defbcb5b Add suggestions for misspelled method names
Use the syntax::util::lev_distance module to provide suggestions when a
named method cannot be found.

Part of #30197
2017-09-21 12:05:56 +02:00
Ariel Ben-Yehuda
5c0feb86b9 add proofs and fix postorder traversal
I don't think the "quasi-postorder" travesal could cause any issues, but
there's no reason for it to stay broken.
2017-09-20 16:36:24 +03:00
John Kåre Alsaker
3a511e06a5 Only consider yields coming after the expressions when computing generator interiors 2017-09-20 16:36:24 +03:00
bors
325ba23d55 Auto merge of #44620 - zackmdavis:rfc_1940_housekeeping, r=nikomatsakis
RFC 1940 housekeeping

* move test to own directory, as requested in https://github.com/rust-lang/rust/issues/43302#issuecomment-329579185
* exercise trait methods in test
* unstable book section

r? @nikomatsakis
2017-09-19 13:06:31 +00:00
Tim Neumann
efdcd5efef Rollup merge of #44549 - gaurikholkar:master, r=arielb1
extend E0623 for earlybound and latebound for structs

This fixes #44508

r? @nikomatsakis
2017-09-17 13:19:05 +02:00
Tim Neumann
bc638b8635 Rollup merge of #44088 - bjorn3:better_trace_macros, r=jseyfried
Fix "new trace_macros doesn't work if there's an error during expansion"

Fixes #43493
2017-09-17 13:19:00 +02:00
bors
ae8efdc87d Auto merge of #43017 - durka:stabilize-const-invocation, r=eddyb
Individualize feature gates for const fn invocation

This PR changes the meaning of `#![feature(const_fn)]` so it is only required to declare a const fn but not to call one. Based on discussion at #24111. I was hoping we could have an FCP here in order to move that conversation forward.

This sets the stage for future stabilization of the constness of several functions in the standard library (listed below), so could someone please tag the lang team for review.

- `std::cell`
    - `Cell::new`
    - `RefCell::new`
    - `UnsafeCell::new`
- `std::mem`
    - `size_of`
    - `align_of`
- `std::ptr`
    - `null`
    - `null_mut`
- `std::sync`
    - `atomic`
        - `Atomic{Bool,Ptr,Isize,Usize}::new`
    - `once`
        - `Once::new`
- primitives
    - `{integer}::min_value`
    - `{integer}::max_value`

Some other functions are const but they are also unstable or hidden, e.g. `Unique::new` so they don't have to be considered at this time.

After this stabilization, the following `*_INIT` constants in the standard library can be deprecated. I wasn't sure whether to include those deprecations in the current PR.

- `std::sync`
    - `atomic`
        - `ATOMIC_{BOOL,ISIZE,USIZE}_INIT`
    - `once`
        - `ONCE_INIT`
2017-09-16 17:02:17 +00:00
Alex Burka
681e5da61e change #![feature(const_fn)] to specific gates 2017-09-16 15:53:02 +00:00
Zack M. Davis
e9569d91cf RFC 1940 UI test in own directory, exercise must_use trait methods
(It was put forward that all tests related to a feature being in their own
directory makes stabilization decisionmaking more convenient.)
2017-09-15 16:26:34 -07:00
Corey Farwell
2a86884a37 Rollup merge of #44569 - est31:master, r=estebank
"avoid" is a better word here than "disable"

You don't "disable" the warning really, you just avoid it (as a conscious action).
2017-09-14 22:32:51 -04:00
est31
168f624c7c "avoid" is a better word here than "disable" 2017-09-14 17:23:47 +02:00
gaurikholkar
9240454a3f add ui tests for EBR 2017-09-14 10:27:41 +05:30
gaurikholkar
f8df89a5cb adding ui tests 2017-09-14 09:56:44 +05:30
bors
94211416bc Auto merge of #44516 - gaurikholkar:fns, r=arielb1
Extend E0623 for fn items

This fixes #44516
The below example now gives
```
error[E0623]: lifetime mismatch
 --> gg.rs:3:10
  |
2 | fn foo(x:fn(&u8, &u8), y: Vec<&u8>, z: &u8) {
  |                               ---      --- these two types are declared with different lifetimes...
3 |   y.push(z);
  |          ^ ...but data from `z` flows into `y` here

error: aborting due to previous error
```

r? @nikomatsakis
cc @arielb1
2017-09-13 21:20:19 +00:00
gaurikholkar
e71eef1775 fix ui tests 2017-09-13 20:56:27 +05:30
bors
824952f48b Auto merge of #44386 - est31:master, r=pnkfelix
Fix mispositioned error indicators

Fixes #38384

Most of the Rust community uses 4 spaces for indentation,
but there are also tab users of Rust (including myself!).

This patch fixes a bug in error printing which mispositions
error indicators when near code with tabs.

The code attempted to fix the issue by replacing spaces
with tabs, but it sadly wasn't enough, as sometimes
you may not print spaces but _ or ^ instead.

This patch employs the reverse strategy: it replaces each
tab with a space, so that the number of _ and ^ and spaces
in error indicators below the code snippet line up
perfectly.

In a study [1] preceeding this patch, we could see that
this strategy is also chosen by gcc version 6.3.0.

Its not perfect, as the output is not beautiful, but its
the easiest to implement. If anyone wants to improve on
this, be my guest! This patch is meant as improvement of
the status quo, not as perfect end status. It fixes the
actual issue of mispositioning error indicators.

[1]: https://github.com/rust-lang/rust/issues/38384#issuecomment-326813710
2017-09-13 10:28:33 +00:00
bors
7eefed392f Auto merge of #44456 - eddyb:stable-drop-const, r=nikomatsakis
Stabilize drop_types_in_const.

Closes #33156, stabilizing the new, revised, rules, and improving the error message.

r? @nikomatsakis cc @SergioBenitez
2017-09-13 03:04:49 +00:00
gaurikholkar
6e3cdcea4c Adding changes for trait objects 2017-09-12 18:22:22 +05:30
gaurikholkar
93529b40ca add ui test for fn items, tidy fixes 2017-09-12 16:48:18 +05:30
gaurikholkar
2f50c33290 Adding E0623 for structs 2017-09-12 10:06:29 +05:30
Eduard-Mihai Burtescu
74349fa288 rustc: evaluate fixed-length array length expressions lazily. 2017-09-11 08:41:16 +03:00
bors
b413f34087 Auto merge of #44079 - gaurikholkar:named_conf, r=nikomatsakis
Extend E0623 for LateBound and EarlyBound Regions

This is a fix for #43882
```
fn foo<'a,'b>(x: &mut Vec<&'a u8>, y: &'b u8) {
    x.push(y);
}
```
now gives

```
error[E0623]: lifetime mismatch
  --> $DIR/ex3-both-anon-regions-latebound-regions.rs:12:12
   |
11 | fn foo<'a,'b>(x: &mut Vec<&'a u8>, y: &'b u8) {
   |                           ------      ------ these two types are declared with different lifetimes...
12 |     x.push(y);
   |            ^ ...but data from `y` flows into `x` here
```
cc @nikomatsakis @arielb1

Please ignore the second commit. It will be merged in a separate PR.
2017-09-10 15:32:20 +00:00
Eduard-Mihai Burtescu
5601ae4b72 Stabilize drop_types_in_const. 2017-09-09 17:39:30 +03:00
bors
18366f4e8a Auto merge of #44212 - eddyb:drop-const, r=nikomatsakis
Allow Drop types in const's too, with #![feature(drop_types_in_const)].

Implements the remaining amendment, see #33156. cc @SergioBenitez

r? @nikomatsakis
2017-09-09 11:48:57 +00:00
gaurikholkar
cfc7cf3961 adding E0623 for LateBound regions 2017-09-09 11:12:27 +05:30
est31
d58281097a Fix mispositioned error indicators
Fixes #38384

Most of the Rust community uses 4 spaces for indentation,
but there are also tab users of Rust (including myself!).

This patch fixes a bug in error printing which mispositions
error indicators when near code with tabs.

The code attempted to fix the issue by replacing spaces
with tabs, but it sadly wasn't enough, as sometimes
you may not print spaces but _ or ^ instead.

This patch employs the reverse strategy: it replaces each
tab with a space, so that the number of _ and ^ and spaces
in error indicators below the code snippet line up
perfectly.

In a study [1] preceeding this patch, we could see that
this strategy is also chosen by gcc version 6.3.0.

Its not perfect, as the output is not beautiful, but its
the easiest to implement. If anyone wants to improve on
this, be my guest! This patch is meant as improvement of
the status quo, not as perfect end status. It fixes the
actual issue of mispositioning error indicators.

[1]: https://github.com/rust-lang/rust/issues/38384#issuecomment-326813710
2017-09-07 10:26:27 +02:00
Mark Simulacrum
f8b7c3e1db Rollup merge of #44361 - oli-obk:lit_sugg, r=nikomatsakis
Suggest changing literals instead of calling methods (fixes #44307)
2017-09-06 18:28:06 -06:00
Oliver Schneider
ddd01455e9
Suggest changing literals instead of calling methods (fixes #44307) 2017-09-06 10:09:25 +02:00
Masaki Hara
d153ff3f79 Print more detailed trait-ref for intercrate ambiguity. 2017-09-05 12:19:35 -04:00
Masaki Hara
043786dcdf Fix a very subtle mistake in a ui test. 2017-09-05 12:19:35 -04:00
Masaki Hara
a59cc32ed4 Add tests for intercrate ambiguity hints. 2017-09-05 12:19:35 -04:00