diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-10-19 14:05:51 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-19 14:05:51 +0530 |
| commit | 5c2c476ad17b7cf4c883dedd3802b5b8a9d1b8f3 (patch) | |
| tree | e63a8e812c2a9a49fb89db99646259df67edd152 /src/test | |
| parent | 84365fff0a99fbf6deab383bd9a8152202b6779b (diff) | |
| parent | 35f157073238b9e0e97d9e9d17b4861103d87962 (diff) | |
| download | rust-5c2c476ad17b7cf4c883dedd3802b5b8a9d1b8f3.tar.gz rust-5c2c476ad17b7cf4c883dedd3802b5b8a9d1b8f3.zip | |
Rollup merge of #102863 - compiler-errors:call-suggestion-on-unimplemented, r=nagisa
Standardize "use parentheses to call" suggestions between typeck and trait selection 1. Suggest calling constructors, since they're basically `FnDef`s but they have a different def kind and hir representation, so we were leaving them out. 2. Standardize the call suggestions between trait fulfillment errors and type mismatch. In the type mismatch suggestion, we suggest `/* Ty */` as the placeholder for an arg, and not the parameter's name, which is less helpful. 3. Use `predicate_must_hold_modulo_regions` instead of matching on `EvaluationResult` -- this might cause some suggestions to be filtered out, but we really shouldn't be suggesting a call if it "may" hold, only when it "must" hold. 4. Borrow some logic from `extract_callable_info` to generalize this suggestion to fn pointers, type parameters, and opaque types. Fixes #102852
Diffstat (limited to 'src/test')
15 files changed, 94 insertions, 26 deletions
diff --git a/src/test/ui/binop/issue-77910-1.stderr b/src/test/ui/binop/issue-77910-1.stderr index 9c7bf6228be..263a35d9829 100644 --- a/src/test/ui/binop/issue-77910-1.stderr +++ b/src/test/ui/binop/issue-77910-1.stderr @@ -19,7 +19,7 @@ LL | assert_eq!(foo, y); | ^^^^^^^^^^^^^^^^^^ `for<'a> fn(&'a i32) -> &'a i32 {foo}` cannot be formatted using `{:?}` because it doesn't implement `Debug` | = help: the trait `Debug` is not implemented for fn item `for<'a> fn(&'a i32) -> &'a i32 {foo}` - = help: use parentheses to call the function: `foo(s)` + = help: use parentheses to call this function: `foo(/* &i32 */)` = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/src/test/ui/closures/closure-bounds-subtype.stderr b/src/test/ui/closures/closure-bounds-subtype.stderr index 1a40326d986..8ad8273fc2b 100644 --- a/src/test/ui/closures/closure-bounds-subtype.stderr +++ b/src/test/ui/closures/closure-bounds-subtype.stderr @@ -11,6 +11,10 @@ note: required by a bound in `take_const_owned` | LL | fn take_const_owned<F>(_: F) where F: FnOnce() + Sync + Send { | ^^^^ required by this bound in `take_const_owned` +help: use parentheses to call this type parameter + | +LL | take_const_owned(f()); + | ++ help: consider further restricting this bound | LL | fn give_owned<F>(f: F) where F: FnOnce() + Send + std::marker::Sync { diff --git a/src/test/ui/issues/issue-35241.stderr b/src/test/ui/issues/issue-35241.stderr index 9ee7654a088..42a78ed97e0 100644 --- a/src/test/ui/issues/issue-35241.stderr +++ b/src/test/ui/issues/issue-35241.stderr @@ -11,7 +11,7 @@ LL | fn test() -> Foo { Foo } | = note: expected struct `Foo` found fn item `fn(u32) -> Foo {Foo}` -help: use parentheses to instantiate this tuple struct +help: use parentheses to construct this tuple struct | LL | fn test() -> Foo { Foo(/* u32 */) } | +++++++++++ diff --git a/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr b/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr index 7f29709ce50..b30bcfb776c 100644 --- a/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr +++ b/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr @@ -29,7 +29,7 @@ LL | assert_eq!(a, 0); | ^^^^^^^^^^^^^^^^ `fn() -> i32 {a}` cannot be formatted using `{:?}` because it doesn't implement `Debug` | = help: the trait `Debug` is not implemented for fn item `fn() -> i32 {a}` - = help: use parentheses to call the function: `a()` + = help: use parentheses to call this function: `a()` = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 3 previous errors diff --git a/src/test/ui/resolve/privacy-enum-ctor.stderr b/src/test/ui/resolve/privacy-enum-ctor.stderr index a369dc6db52..82a4211f08a 100644 --- a/src/test/ui/resolve/privacy-enum-ctor.stderr +++ b/src/test/ui/resolve/privacy-enum-ctor.stderr @@ -327,7 +327,7 @@ LL | let _: Z = Z::Fn; | = note: expected enum `Z` found fn item `fn(u8) -> Z {Z::Fn}` -help: use parentheses to instantiate this tuple variant +help: use parentheses to construct this tuple variant | LL | let _: Z = Z::Fn(/* u8 */); | ++++++++++ @@ -362,7 +362,7 @@ LL | let _: E = m::E::Fn; | = note: expected enum `E` found fn item `fn(u8) -> E {E::Fn}` -help: use parentheses to instantiate this tuple variant +help: use parentheses to construct this tuple variant | LL | let _: E = m::E::Fn(/* u8 */); | ++++++++++ @@ -397,7 +397,7 @@ LL | let _: E = E::Fn; | = note: expected enum `E` found fn item `fn(u8) -> E {E::Fn}` -help: use parentheses to instantiate this tuple variant +help: use parentheses to construct this tuple variant | LL | let _: E = E::Fn(/* u8 */); | ++++++++++ diff --git a/src/test/ui/suggestions/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr b/src/test/ui/suggestions/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr index bfd506c9f6e..8ed62f854f0 100644 --- a/src/test/ui/suggestions/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr +++ b/src/test/ui/suggestions/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr @@ -1,9 +1,6 @@ error[E0277]: `fn() -> impl Future<Output = ()> {foo}` is not a future --> $DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:10:9 | -LL | async fn foo() {} - | --- consider calling this function -... LL | bar(foo); | --- ^^^ `fn() -> impl Future<Output = ()> {foo}` is not a future | | @@ -16,7 +13,7 @@ note: required by a bound in `bar` | LL | fn bar(f: impl Future<Output=()>) {} | ^^^^^^^^^^^^^^^^^ required by this bound in `bar` -help: use parentheses to call the function +help: use parentheses to call this function | LL | bar(foo()); | ++ @@ -24,8 +21,6 @@ LL | bar(foo()); error[E0277]: `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:33]` is not a future --> $DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:12:9 | -LL | let async_closure = async || (); - | -------- consider calling this closure LL | bar(async_closure); | --- ^^^^^^^^^^^^^ `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:33]` is not a future | | @@ -38,7 +33,7 @@ note: required by a bound in `bar` | LL | fn bar(f: impl Future<Output=()>) {} | ^^^^^^^^^^^^^^^^^ required by this bound in `bar` -help: use parentheses to call the closure +help: use parentheses to call this closure | LL | bar(async_closure()); | ++ diff --git a/src/test/ui/suggestions/call-on-unimplemented-ctor.rs b/src/test/ui/suggestions/call-on-unimplemented-ctor.rs new file mode 100644 index 00000000000..5f811044eb3 --- /dev/null +++ b/src/test/ui/suggestions/call-on-unimplemented-ctor.rs @@ -0,0 +1,17 @@ +fn main() { + insert_resource(Marker); + insert_resource(Time); + //~^ ERROR the trait bound `fn(u32) -> Time {Time}: Resource` is not satisfied + //~| HELP use parentheses to construct this tuple struct +} + +trait Resource {} + +fn insert_resource<R: Resource>(resource: R) {} + +struct Marker; +impl Resource for Marker {} + +struct Time(u32); + +impl Resource for Time {} diff --git a/src/test/ui/suggestions/call-on-unimplemented-ctor.stderr b/src/test/ui/suggestions/call-on-unimplemented-ctor.stderr new file mode 100644 index 00000000000..58612cbfb23 --- /dev/null +++ b/src/test/ui/suggestions/call-on-unimplemented-ctor.stderr @@ -0,0 +1,21 @@ +error[E0277]: the trait bound `fn(u32) -> Time {Time}: Resource` is not satisfied + --> $DIR/call-on-unimplemented-ctor.rs:3:21 + | +LL | insert_resource(Time); + | --------------- ^^^^ the trait `Resource` is not implemented for fn item `fn(u32) -> Time {Time}` + | | + | required by a bound introduced by this call + | +note: required by a bound in `insert_resource` + --> $DIR/call-on-unimplemented-ctor.rs:10:23 + | +LL | fn insert_resource<R: Resource>(resource: R) {} + | ^^^^^^^^ required by this bound in `insert_resource` +help: use parentheses to construct this tuple struct + | +LL | insert_resource(Time(/* u32 */)); + | +++++++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/suggestions/call-on-unimplemented-fn-ptr.rs b/src/test/ui/suggestions/call-on-unimplemented-fn-ptr.rs new file mode 100644 index 00000000000..86490c724e0 --- /dev/null +++ b/src/test/ui/suggestions/call-on-unimplemented-fn-ptr.rs @@ -0,0 +1,15 @@ +struct Foo; + +trait Bar {} + +impl Bar for Foo {} + +fn needs_bar<T: Bar>(_: T) {} + +fn blah(f: fn() -> Foo) { + needs_bar(f); + //~^ ERROR the trait bound `fn() -> Foo: Bar` is not satisfied + //~| HELP use parentheses to call this function pointer +} + +fn main() {} diff --git a/src/test/ui/suggestions/call-on-unimplemented-fn-ptr.stderr b/src/test/ui/suggestions/call-on-unimplemented-fn-ptr.stderr new file mode 100644 index 00000000000..167f7e592a9 --- /dev/null +++ b/src/test/ui/suggestions/call-on-unimplemented-fn-ptr.stderr @@ -0,0 +1,21 @@ +error[E0277]: the trait bound `fn() -> Foo: Bar` is not satisfied + --> $DIR/call-on-unimplemented-fn-ptr.rs:10:15 + | +LL | needs_bar(f); + | --------- ^ the trait `Bar` is not implemented for `fn() -> Foo` + | | + | required by a bound introduced by this call + | +note: required by a bound in `needs_bar` + --> $DIR/call-on-unimplemented-fn-ptr.rs:7:17 + | +LL | fn needs_bar<T: Bar>(_: T) {} + | ^^^ required by this bound in `needs_bar` +help: use parentheses to call this function pointer + | +LL | needs_bar(f()); + | ++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/suggestions/fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr b/src/test/ui/suggestions/fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr index fe603b67575..955148315ba 100644 --- a/src/test/ui/suggestions/fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr +++ b/src/test/ui/suggestions/fn-ctor-passed-as-arg-where-it-should-have-been-called.stderr @@ -1,9 +1,6 @@ error[E0277]: the trait bound `fn() -> impl T<O = ()> {foo}: T` is not satisfied --> $DIR/fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:17:9 | -LL | fn foo() -> impl T<O=()> { S } - | --- consider calling this function -... LL | bar(foo); | --- ^^^ the trait `T` is not implemented for fn item `fn() -> impl T<O = ()> {foo}` | | @@ -14,7 +11,7 @@ note: required by a bound in `bar` | LL | fn bar(f: impl T<O=()>) {} | ^^^^^^^ required by this bound in `bar` -help: use parentheses to call the function +help: use parentheses to call this function | LL | bar(foo()); | ++ @@ -22,8 +19,6 @@ LL | bar(foo()); error[E0277]: the trait bound `[closure@$DIR/fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:18:19: 18:21]: T` is not satisfied --> $DIR/fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:19:9 | -LL | let closure = || S; - | -- consider calling this closure LL | bar(closure); | --- ^^^^^^^ the trait `T` is not implemented for closure `[closure@$DIR/fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:18:19: 18:21]` | | @@ -34,7 +29,7 @@ note: required by a bound in `bar` | LL | fn bar(f: impl T<O=()>) {} | ^^^^^^^ required by this bound in `bar` -help: use parentheses to call the closure +help: use parentheses to call this closure | LL | bar(closure()); | ++ diff --git a/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr b/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr index f05dba1d4ca..597dc61c3f7 100644 --- a/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr +++ b/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr @@ -49,7 +49,7 @@ LL | let _: S = S; | = note: expected struct `S` found fn item `fn(usize, usize) -> S {S}` -help: use parentheses to instantiate this tuple struct +help: use parentheses to construct this tuple struct | LL | let _: S = S(/* usize */, /* usize */); | ++++++++++++++++++++++++++ @@ -85,7 +85,7 @@ LL | let _: V = V; | = note: expected struct `V` found fn item `fn() -> V {V}` -help: use parentheses to instantiate this tuple struct +help: use parentheses to construct this tuple struct | LL | let _: V = V(); | ++ @@ -139,7 +139,7 @@ LL | let _: E = E::A; | = note: expected enum `E` found fn item `fn(usize) -> E {E::A}` -help: use parentheses to instantiate this tuple variant +help: use parentheses to construct this tuple variant | LL | let _: E = E::A(/* usize */); | +++++++++++++ diff --git a/src/test/ui/typeck/issue-87181/empty-tuple-method.stderr b/src/test/ui/typeck/issue-87181/empty-tuple-method.stderr index a18c54a29b5..23e7b7cc363 100644 --- a/src/test/ui/typeck/issue-87181/empty-tuple-method.stderr +++ b/src/test/ui/typeck/issue-87181/empty-tuple-method.stderr @@ -4,7 +4,7 @@ error[E0599]: no method named `foo` found for fn item `fn() -> Foo {Foo}` in the LL | thing.bar.foo(); | ^^^ method not found in `fn() -> Foo {Foo}` | -help: use parentheses to instantiate this tuple struct +help: use parentheses to construct this tuple struct | LL | (thing.bar)().foo(); | + +++ diff --git a/src/test/ui/typeck/issue-87181/enum-variant.stderr b/src/test/ui/typeck/issue-87181/enum-variant.stderr index 90641410d8e..2247ea27021 100644 --- a/src/test/ui/typeck/issue-87181/enum-variant.stderr +++ b/src/test/ui/typeck/issue-87181/enum-variant.stderr @@ -4,7 +4,7 @@ error[E0599]: no method named `foo` found for fn item `fn() -> Foo {Foo::Tup}` i LL | thing.bar.foo(); | ^^^ method not found in `fn() -> Foo {Foo::Tup}` | -help: use parentheses to instantiate this tuple variant +help: use parentheses to construct this tuple variant | LL | (thing.bar)().foo(); | + +++ diff --git a/src/test/ui/typeck/issue-87181/tuple-field.stderr b/src/test/ui/typeck/issue-87181/tuple-field.stderr index c1ca26ee9af..0a7d30b615a 100644 --- a/src/test/ui/typeck/issue-87181/tuple-field.stderr +++ b/src/test/ui/typeck/issue-87181/tuple-field.stderr @@ -4,7 +4,7 @@ error[E0609]: no field `0` on type `fn(char, u16) -> Foo {Foo}` LL | thing.bar.0; | ^ | -help: use parentheses to instantiate this tuple struct +help: use parentheses to construct this tuple struct | LL | (thing.bar)(/* char */, /* u16 */).0; | + ++++++++++++++++++++++++ |
