suggestion applicabilities for libsyntax and librustc, run-rustfix tests

Consider this a down payment on #50723. To recap, an `Applicability`
enum was recently (#50204) added, to convey to Rustfix and other tools
whether we think it's OK for them to blindly apply the suggestion, or
whether to prompt a human for guidance (because the suggestion might
contain placeholders that we can't infer, or because we think it has a
sufficiently high probability of being wrong even though it's—
presumably—right often enough to be worth emitting in the first place).

When a suggestion is marked as `MaybeIncorrect`, we try to use comments
to indicate precisely why (although there are a few places where we just
say `// speculative` because the present author's subjective judgement
balked at the idea that the suggestion has no false positives).

The `run-rustfix` directive is opporunistically set on some relevant UI
tests (and a couple tests that were in the `test/ui/suggestions`
directory, even if the suggestions didn't originate in librustc or
libsyntax). This is less trivial than it sounds, because a surprising
number of test files aren't equipped to be tested as fixed even when
they contain successfully fixable errors, because, e.g., there are more,
not-directly-related errors after fixing. Some test files need an
attribute or underscore to avoid unused warnings tripping up the "fixed
code is still producing diagnostics" check despite the fixes being
correct; this is an interesting contrast-to/inconsistency-with the
behavior of UI tests (which secretly pass `-A unused`), a behavior which
we probably ought to resolve one way or the other (filed issue #50926).

A few suggestion labels are reworded (e.g., to avoid phrasing it as a
question, which which is discouraged by the style guidelines listed in
`.span_suggestion`'s doc-comment).
This commit is contained in:
Zack M. Davis 2018-05-19 14:52:24 -07:00
parent 6bb4aad51f
commit 98a04291e4
33 changed files with 424 additions and 117 deletions

View file

@ -0,0 +1,25 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// compile-flags: -Z continue-parse-after-error
extern "C" {
static C: u8; //~ ERROR extern items cannot be `const`
}
fn main() {
// We suggest turning the (illegal) extern `const` into an extern `static`,
// but this also requires `unsafe` (a deny-by-default lint at comment time,
// future error; Issue #36247)
unsafe {
let _x = C;
}
}

View file

@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
// compile-flags: -Z continue-parse-after-error
extern "C" {
@ -15,5 +16,10 @@ extern "C" {
}
fn main() {
let x = C;
// We suggest turning the (illegal) extern `const` into an extern `static`,
// but this also requires `unsafe` (a deny-by-default lint at comment time,
// future error; Issue #36247)
unsafe {
let _x = C;
}
}

View file

@ -1,8 +1,8 @@
error: extern items cannot be `const`
--> $DIR/extern-const.rs:14:5
--> $DIR/extern-const.rs:15:5
|
LL | const C: u8; //~ ERROR extern items cannot be `const`
| ^^^^^ help: instead try using: `static`
| ^^^^^ help: try using a static value: `static`
error: aborting due to previous error

View file

@ -0,0 +1,24 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(unused_must_use, unused_comparisons)]
macro_rules! is_plainly_printable {
($i: ident) => {
($i as u32) < 0 //~ `<` is interpreted as a start of generic arguments
};
}
fn main() {
let c = 'a';
is_plainly_printable!(c);
}

View file

@ -8,6 +8,10 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(unused_must_use, unused_comparisons)]
macro_rules! is_plainly_printable {
($i: ident) => {
$i as u32 < 0 //~ `<` is interpreted as a start of generic arguments

View file

@ -1,5 +1,5 @@
error: `<` is interpreted as a start of generic arguments for `u32`, not a comparison
--> $DIR/issue-42954.rs:13:19
--> $DIR/issue-42954.rs:17:19
|
LL | $i as u32 < 0 //~ `<` is interpreted as a start of generic arguments
| --------- ^ - interpreted as generic arguments

View file

@ -8,7 +8,7 @@ error: expected type, found keyword `true`
--> $DIR/issue-44406.rs:18:10
|
LL | bar(baz: $rest)
| - help: did you mean to use `;` here?
| - help: try using a semicolon: `;`
...
LL | foo!(true); //~ ERROR expected type, found keyword
| ^^^^ expecting a type here because of type ascription

View file

@ -0,0 +1,21 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(dead_code)]
struct S {
x: u8,
/// The id of the parent core
y: u8,
}
//~^^^ ERROR found a documentation comment that doesn't document anything
fn main() {}

View file

@ -8,6 +8,10 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(dead_code)]
struct S {
x: u8
/// The id of the parent core

View file

@ -1,5 +1,5 @@
error[E0585]: found a documentation comment that doesn't document anything
--> $DIR/issue-48636.rs:13:5
--> $DIR/issue-48636.rs:17:5
|
LL | x: u8
| - help: missing comma here: `,`

View file

@ -0,0 +1,30 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// Regression test for #47244: in this specific scenario, when the
// expected type indicated 1 argument but the closure takes two, we
// would (early on) create type variables for the type of `b`. If the
// user then attempts to invoke a method on `b`, we would get an error
// saying that the type of `b` must be known, which was not very
// helpful.
// run-rustfix
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("foo", "bar");
let _n = m.iter().map(|(_, b)| {
//~^ ERROR closure is expected to take a single 2-tuple
b.to_string()
});
}

View file

@ -15,15 +15,16 @@
// saying that the type of `b` must be known, which was not very
// helpful.
// run-rustfix
use std::collections::HashMap;
fn main() {
let mut m = HashMap::new();
m.insert("foo", "bar");
let m = HashMap::new();
m.insert( "foo", "bar" );
m.iter().map( |_, b| {
let _n = m.iter().map(|_, b| {
//~^ ERROR closure is expected to take a single 2-tuple
b.to_string()
});
}

View file

@ -1,14 +1,14 @@
error[E0593]: closure is expected to take a single 2-tuple as argument, but it takes 2 distinct arguments
--> $DIR/closure-arg-count-expected-type-issue-47244.rs:24:14
--> $DIR/closure-arg-count-expected-type-issue-47244.rs:26:23
|
LL | m.iter().map( |_, b| {
| ^^^ ------ takes 2 distinct arguments
| |
| expected closure that takes a single 2-tuple as argument
LL | let _n = m.iter().map(|_, b| {
| ^^^ ------ takes 2 distinct arguments
| |
| expected closure that takes a single 2-tuple as argument
help: change the closure to accept a tuple instead of individual arguments
|
LL | m.iter().map( |(_, b)| {
| ^^^^^^^^
LL | let _n = m.iter().map(|(_, b)| {
| ^^^^^^^^
error: aborting due to previous error

View file

@ -0,0 +1,21 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(dead_code)]
#[repr(align(8))] //~ ERROR incorrect `repr(align)` attribute format
struct A(u64);
#[repr(align(8))] //~ ERROR incorrect `repr(align)` attribute format
struct B(u64);
fn main() {}

View file

@ -8,6 +8,10 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(dead_code)]
#[repr(align=8)] //~ ERROR incorrect `repr(align)` attribute format
struct A(u64);

View file

@ -1,11 +1,11 @@
error[E0693]: incorrect `repr(align)` attribute format
--> $DIR/repr-align-assign.rs:11:8
--> $DIR/repr-align-assign.rs:15:8
|
LL | #[repr(align=8)] //~ ERROR incorrect `repr(align)` attribute format
| ^^^^^^^ help: use parentheses instead: `align(8)`
error[E0693]: incorrect `repr(align)` attribute format
--> $DIR/repr-align-assign.rs:14:8
--> $DIR/repr-align-assign.rs:18:8
|
LL | #[repr(align="8")] //~ ERROR incorrect `repr(align)` attribute format
| ^^^^^^^^^ help: use parentheses instead: `align(8)`

View file

@ -0,0 +1,26 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(unused_imports)]
pub mod extension1 {
pub trait ConstructorExtension {}
}
pub mod extension2 {
pub trait ConstructorExtension {}
}
use extension1::ConstructorExtension;
use extension2::ConstructorExtension as OtherConstructorExtension; //~ ERROR is defined multiple times
fn main() {}

View file

@ -8,6 +8,10 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
#![allow(unused_imports)]
pub mod extension1 {
pub trait ConstructorExtension {}
}

View file

@ -1,5 +1,5 @@
error[E0252]: the name `ConstructorExtension` is defined multiple times
--> $DIR/issue-32354-suggest-import-rename.rs:20:5
--> $DIR/issue-32354-suggest-import-rename.rs:24:5
|
LL | use extension1::ConstructorExtension;
| -------------------------------- previous import of the trait `ConstructorExtension` here

View file

@ -2,7 +2,7 @@ error: missing `fn` or `struct` for method or struct definition
--> $DIR/pub-ident-fn-or-struct-2.rs:11:4
|
LL | pub S();
| ---^- help: if you meant to call a macro, write instead: `S!`
| ---^- help: if you meant to call a macro, try: `S!`
error: aborting due to previous error

View file

@ -2,7 +2,7 @@ error: missing `fn` or `struct` for method or struct definition
--> $DIR/pub-ident-fn-or-struct.rs:11:4
|
LL | pub S (foo) bar
| ---^- help: if you meant to call a macro, write instead: `S!`
| ---^- help: if you meant to call a macro, try: `S!`
error: aborting due to previous error

View file

@ -0,0 +1,18 @@
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// run-rustfix
pub fn foo(_s: usize) -> bool { true }
//~^ ERROR missing `fn` for method definition
fn main() {
foo(2);
}

View file

@ -8,7 +8,9 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
pub foo(s: usize) -> bool { true }
// run-rustfix
pub foo(_s: usize) -> bool { true }
//~^ ERROR missing `fn` for method definition
fn main() {

View file

@ -1,11 +1,11 @@
error: missing `fn` for method definition
--> $DIR/pub-ident-fn.rs:11:4
--> $DIR/pub-ident-fn.rs:13:4
|
LL | pub foo(s: usize) -> bool { true }
LL | pub foo(_s: usize) -> bool { true }
| ^^^
help: add `fn` here to parse `foo` as a public method
|
LL | pub fn foo(s: usize) -> bool { true }
LL | pub fn foo(_s: usize) -> bool { true }
| ^^
error: aborting due to previous error

View file

@ -2,7 +2,7 @@ error: expected type, found `0`
--> $DIR/type-ascription-instead-of-statement-end.rs:15:5
|
LL | println!("test"):
| - help: did you mean to use `;` here?
| - help: try using a semicolon: `;`
LL | 0; //~ ERROR expected type, found `0`
| ^ expecting a type here because of type ascription