Skip to content

Commit

Permalink
Rollup merge of rust-lang#104334 - compiler-errors:ufcs-sugg-wrong-de…
Browse files Browse the repository at this point in the history
…f-id, r=estebank

Use impl's def id when calculating type to specify in UFCS

Fixes rust-lang#104327
Fixes rust-lang#104328

Also addresses rust-lang#102670 (comment)
  • Loading branch information
matthiaskrgr authored Dec 15, 2022
2 parents a8847df + 1225a65 commit 10e94e8
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 11 deletions.
11 changes: 6 additions & 5 deletions compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2290,18 +2290,19 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let trait_impls = self.tcx.trait_impls_of(data.trait_ref.def_id);

if trait_impls.blanket_impls().is_empty()
&& let Some((impl_ty, _)) = trait_impls.non_blanket_impls().iter().next()
&& let Some(impl_def_id) = impl_ty.def() {
let message = if trait_impls.non_blanket_impls().len() == 1 {
&& let Some(impl_def_id) = trait_impls.non_blanket_impls().values().flatten().next()
{
let non_blanket_impl_count = trait_impls.non_blanket_impls().values().flatten().count();
let message = if non_blanket_impl_count == 1 {
"use the fully-qualified path to the only available implementation".to_string()
} else {
format!(
"use a fully-qualified path to a specific available implementation ({} found)",
trait_impls.non_blanket_impls().len()
non_blanket_impl_count
)
};
let mut suggestions = vec![(
trait_path_segment.ident.span.shrink_to_lo(),
path.span.shrink_to_lo(),
format!("<{} as ", self.tcx.type_of(impl_def_id))
)];
if let Some(generic_arg) = trait_path_segment.args {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ LL | fn bar() -> isize;
...
LL | let x: isize = Foo::bar();
| ^^^^^^^^ cannot call associated function of trait
|
help: use the fully-qualified path to the only available implementation
|
LL | let x: isize = <isize as Foo>::bar();
| +++++++++ +

error: aborting due to previous error

Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/error-codes/E0790.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ LL | inner::MyTrait::my_fn();
|
help: use the fully-qualified path to the only available implementation
|
LL | inner::<MyStruct as MyTrait>::my_fn();
| ++++++++++++ +
LL | <MyStruct as inner::MyTrait>::my_fn();
| ++++++++++++ +

error[E0790]: cannot refer to the associated constant on trait without specifying the corresponding `impl` type
--> $DIR/E0790.rs:30:13
Expand All @@ -51,8 +51,8 @@ LL | let _ = inner::MyTrait::MY_ASSOC_CONST;
|
help: use the fully-qualified path to the only available implementation
|
LL | let _ = inner::<MyStruct as MyTrait>::MY_ASSOC_CONST;
| ++++++++++++ +
LL | let _ = <MyStruct as inner::MyTrait>::MY_ASSOC_CONST;
| ++++++++++++ +

error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type
--> $DIR/E0790.rs:50:5
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/suggestions/issue-104327.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
trait Bar {}

trait Foo {
fn f() {}
}

impl Foo for dyn Bar {}

fn main() {
Foo::f();
//~^ ERROR cannot call associated function on trait without specifying the corresponding `impl` type
}
17 changes: 17 additions & 0 deletions src/test/ui/suggestions/issue-104327.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type
--> $DIR/issue-104327.rs:10:5
|
LL | fn f() {}
| --------- `Foo::f` defined here
...
LL | Foo::f();
| ^^^^^^ cannot call associated function of trait
|
help: use the fully-qualified path to the only available implementation
|
LL | <(dyn Bar + 'static) as Foo>::f();
| +++++++++++++++++++++++ +

error: aborting due to previous error

For more information about this error, try `rustc --explain E0790`.
12 changes: 12 additions & 0 deletions src/test/ui/suggestions/issue-104328.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#![feature(object_safe_for_dispatch)]

trait Foo {
fn f() {}
}

impl Foo for dyn Sized {}

fn main() {
Foo::f();
//~^ ERROR cannot call associated function on trait without specifying the corresponding `impl` type
}
17 changes: 17 additions & 0 deletions src/test/ui/suggestions/issue-104328.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0790]: cannot call associated function on trait without specifying the corresponding `impl` type
--> $DIR/issue-104328.rs:10:5
|
LL | fn f() {}
| --------- `Foo::f` defined here
...
LL | Foo::f();
| ^^^^^^ cannot call associated function of trait
|
help: use the fully-qualified path to the only available implementation
|
LL | <(dyn Sized + 'static) as Foo>::f();
| +++++++++++++++++++++++++ +

error: aborting due to previous error

For more information about this error, try `rustc --explain E0790`.
4 changes: 2 additions & 2 deletions src/test/ui/traits/static-method-generic-inference.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ LL | let _f: base::Foo = base::HasNew::new();
|
help: use the fully-qualified path to the only available implementation
|
LL | let _f: base::Foo = base::<Foo as HasNew>::new();
| +++++++ +
LL | let _f: base::Foo = <Foo as base::HasNew>::new();
| +++++++ +

error: aborting due to previous error

Expand Down

0 comments on commit 10e94e8

Please sign in to comment.