diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-08-29 21:12:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-29 21:12:54 +0200 |
| commit | 091017c244af24adc3ef44a853189eebbee943cf (patch) | |
| tree | 04a9f7bf46d019fb2eaed83a5e9742321cf54906 /src | |
| parent | fcc2bddd262b26c3a4aeff2328e39b8e2b6d3254 (diff) | |
| parent | c3f568b3312bed99d0e4b95daecd3c9eca1ae895 (diff) | |
| download | rust-091017c244af24adc3ef44a853189eebbee943cf.tar.gz rust-091017c244af24adc3ef44a853189eebbee943cf.zip | |
Rollup merge of #100898 - compiler-errors:too-many-expr-fields, r=spastorino
Do not report too many expr field candidates
When considering "this expressions' field has a {field/method}" suggestions:
1. Don't report methods that are out of scope
2. Use `span_suggestions` instead of reporting each field candidate, which caps the number of suggestions to 4
4. Blacklist some common traits like `Clone` and `Deref`
Fixes #100894
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/copy-a-resource.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-2823.stderr | 4 | ||||
| -rw-r--r-- | src/test/ui/noncopyable-class.stderr | 8 | ||||
| -rw-r--r-- | src/test/ui/suggestions/too-many-field-suggestions.rs | 29 | ||||
| -rw-r--r-- | src/test/ui/suggestions/too-many-field-suggestions.stderr | 44 |
5 files changed, 73 insertions, 16 deletions
diff --git a/src/test/ui/copy-a-resource.stderr b/src/test/ui/copy-a-resource.stderr index b92449c6e0a..128087f1e37 100644 --- a/src/test/ui/copy-a-resource.stderr +++ b/src/test/ui/copy-a-resource.stderr @@ -10,10 +10,6 @@ LL | let _y = x.clone(); = help: items from traits can only be used if the trait is implemented and in scope = note: the following trait defines an item `clone`, perhaps you need to implement it: candidate #1: `Clone` -help: one of the expressions' fields has a method of the same name - | -LL | let _y = x.i.clone(); - | ++ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-2823.stderr b/src/test/ui/issues/issue-2823.stderr index 208b340d064..b5a2b2f55a6 100644 --- a/src/test/ui/issues/issue-2823.stderr +++ b/src/test/ui/issues/issue-2823.stderr @@ -10,10 +10,6 @@ LL | let _d = c.clone(); = help: items from traits can only be used if the trait is implemented and in scope = note: the following trait defines an item `clone`, perhaps you need to implement it: candidate #1: `Clone` -help: one of the expressions' fields has a method of the same name - | -LL | let _d = c.x.clone(); - | ++ error: aborting due to previous error diff --git a/src/test/ui/noncopyable-class.stderr b/src/test/ui/noncopyable-class.stderr index 15e22e946da..0c696163a26 100644 --- a/src/test/ui/noncopyable-class.stderr +++ b/src/test/ui/noncopyable-class.stderr @@ -10,14 +10,6 @@ LL | let _y = x.clone(); = help: items from traits can only be used if the trait is implemented and in scope = note: the following trait defines an item `clone`, perhaps you need to implement it: candidate #1: `Clone` -help: one of the expressions' fields has a method of the same name - | -LL | let _y = x.i.clone(); - | ++ -help: one of the expressions' fields has a method of the same name - | -LL | let _y = x.j.x.clone(); - | ++++ error: aborting due to previous error diff --git a/src/test/ui/suggestions/too-many-field-suggestions.rs b/src/test/ui/suggestions/too-many-field-suggestions.rs new file mode 100644 index 00000000000..905f9502cf5 --- /dev/null +++ b/src/test/ui/suggestions/too-many-field-suggestions.rs @@ -0,0 +1,29 @@ +struct Thing { + a0: Foo, + a1: Foo, + a2: Foo, + a3: Foo, + a4: Foo, + a5: Foo, + a6: Foo, + a7: Foo, + a8: Foo, + a9: Foo, +} + +struct Foo { + field: Field, +} + +struct Field; + +impl Foo { + fn bar(&self) {} +} + +fn bar(t: Thing) { + t.bar(); //~ ERROR no method named `bar` found for struct `Thing` + t.field; //~ ERROR no field `field` on type `Thing` +} + +fn main() {} diff --git a/src/test/ui/suggestions/too-many-field-suggestions.stderr b/src/test/ui/suggestions/too-many-field-suggestions.stderr new file mode 100644 index 00000000000..63ad6fdb169 --- /dev/null +++ b/src/test/ui/suggestions/too-many-field-suggestions.stderr @@ -0,0 +1,44 @@ +error[E0599]: no method named `bar` found for struct `Thing` in the current scope + --> $DIR/too-many-field-suggestions.rs:25:7 + | +LL | struct Thing { + | ------------ method `bar` not found for this struct +... +LL | t.bar(); + | ^^^ method not found in `Thing` + | +help: some of the expressions' fields have a method of the same name + | +LL | t.a0.bar(); + | +++ +LL | t.a1.bar(); + | +++ +LL | t.a2.bar(); + | +++ +LL | t.a3.bar(); + | +++ + and 6 other candidates + +error[E0609]: no field `field` on type `Thing` + --> $DIR/too-many-field-suggestions.rs:26:7 + | +LL | t.field; + | ^^^^^ unknown field + | + = note: available fields are: `a0`, `a1`, `a2`, `a3`, `a4` ... and 5 others +help: some of the expressions' fields have a field of the same name + | +LL | t.a0.field; + | +++ +LL | t.a1.field; + | +++ +LL | t.a2.field; + | +++ +LL | t.a3.field; + | +++ + and 6 other candidates + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0599, E0609. +For more information about an error, try `rustc --explain E0599`. |
