use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
use rustc_middle::ty::fast_reject::simplify_type;
use rustc_middle::ty::print::with_crate_prefix;
+use rustc_middle::ty::subst::GenericArgKind;
use rustc_middle::ty::{
self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness,
};
return None;
} else {
span = item_name.span;
+
+ // issue #81576, elision of generic argument when no methode can be found in any implementation
+ let mut ty_str_reported = ty_str.clone();
+ if let ty::Adt(_, ref generics) = actual.kind() {
+ if generics.len() > 0 {
+ let candidate_numbers: usize = self
+ .autoderef(span, actual)
+ .map(|(ty, _)| {
+ if let ty::Adt(ref adt_deref, _) = ty.kind() {
+ self.tcx
+ .inherent_impls(adt_deref.did)
+ .iter()
+ .filter_map(|def_id| {
+ self.associated_item(
+ *def_id,
+ item_name,
+ Namespace::ValueNS,
+ )
+ })
+ .count()
+ } else {
+ 0
+ }
+ })
+ .sum();
+ if candidate_numbers == 0 && unsatisfied_predicates.is_empty() {
+ if let Some((path_string, _)) = ty_str.split_once('<') {
+ ty_str_reported = format!("{}<", path_string);
+ for (index, arg) in generics.iter().enumerate() {
+ let arg_replace = match arg.unpack() {
+ GenericArgKind::Lifetime(_) => "'_",
+ GenericArgKind::Type(_)
+ | GenericArgKind::Const(_) => "_",
+ };
+ ty_str_reported =
+ format!("{}{}", ty_str_reported, arg_replace);
+ if index < generics.len() - 1 {
+ ty_str_reported = format!("{}, ", ty_str_reported);
+ }
+ }
+ ty_str_reported = format!("{}>", ty_str_reported);
+ }
+ }
+ }
+ }
+
let mut err = struct_span_err!(
tcx.sess,
span,
item_kind,
item_name,
actual.prefix_string(self.tcx),
- ty_str,
+ ty_str_reported,
);
if let Mode::MethodCall = mode {
if let SelfSource::MethodCall(call) = source {
let mut label_span_not_found = || {
if unsatisfied_predicates.is_empty() {
err.span_label(span, format!("{item_kind} not found in `{ty_str}`"));
+ if let ty::Adt(ref adt, _) = rcvr_ty.kind() {
+ let mut inherent_impls_candidate = self
+ .tcx
+ .inherent_impls(adt.did)
+ .iter()
+ .copied()
+ .filter(|def_id| {
+ if let Some(assoc) =
+ self.associated_item(*def_id, item_name, Namespace::ValueNS)
+ {
+ // Check for both mode is the same so we avoid suggesting
+ // incorect associated item.
+ match (mode, assoc.fn_has_self_parameter) {
+ (Mode::MethodCall, true) => {
+ if let SelfSource::MethodCall(_) = source {
+ // We check that the suggest type is actually
+ // different from the received one
+ // So we avoid suggestion method with Box<Self>
+ // for instance
+ self.tcx.at(span).type_of(*def_id) != actual
+ && self.tcx.at(span).type_of(*def_id)
+ != rcvr_ty
+ } else {
+ false
+ }
+ }
+ (Mode::Path, false) => true,
+ _ => false,
+ }
+ } else {
+ false
+ }
+ })
+ .collect::<Vec<_>>();
+ if inherent_impls_candidate.len() > 0 {
+ inherent_impls_candidate.sort();
+ inherent_impls_candidate.dedup();
+ // number of type to shows at most.
+ const LIMIT: usize = 3;
+ let mut note = format!("The {item_kind} was found for");
+ if inherent_impls_candidate.len() > 1 {
+ for impl_item in inherent_impls_candidate.iter().take(LIMIT - 2)
+ {
+ let impl_ty = self.tcx.at(span).type_of(*impl_item);
+ note = format!("{} {},", note, impl_ty);
+ }
+ let impl_ty = self.tcx.at(span).type_of(
+ inherent_impls_candidate
+ [inherent_impls_candidate.len() - 1],
+ );
+ if inherent_impls_candidate.len() > LIMIT {
+ note = format!("{} {},", note, impl_ty);
+ } else {
+ note = format!("{} {} and", note, impl_ty);
+ }
+ }
+ let impl_ty = self
+ .tcx
+ .at(span)
+ .type_of(*inherent_impls_candidate.last().unwrap());
+ note = format!("{} {}", note, impl_ty);
+ if inherent_impls_candidate.len() > LIMIT {
+ note = format!(
+ "{} and {} more",
+ note,
+ inherent_impls_candidate.len() - LIMIT
+ );
+ }
+ err.note(&format!("{}.", note));
+ }
+ }
} else {
err.span_label(span, format!("{item_kind} cannot be called on `{ty_str}` due to unsatisfied trait bounds"));
}
-error[E0599]: no method named `test_mut` found for struct `Vec<{integer}>` in the current scope
+error[E0599]: no method named `test_mut` found for struct `Vec<_, _>` in the current scope
--> $DIR/auto-ref-slice-plus-ref.rs:7:7
|
LL | a.test_mut();
LL | trait MyIter {
| ^^^^^^^^^^^^
-error[E0599]: no method named `test` found for struct `Vec<{integer}>` in the current scope
+error[E0599]: no method named `test` found for struct `Vec<_, _>` in the current scope
--> $DIR/auto-ref-slice-plus-ref.rs:8:7
|
LL | a.test();
-error[E0599]: no method named `eat` found for struct `Box<dyn Noisy>` in the current scope
+error[E0599]: no method named `eat` found for struct `Box<_, _>` in the current scope
--> $DIR/class-cast-to-trait.rs:53:8
|
LL | nyan.eat();
-error[E0599]: no method named `closure` found for struct `Obj<[closure@$DIR/issue-18343.rs:6:28: 6:33]>` in the current scope
+error[E0599]: no method named `closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-18343.rs:7:7
|
LL | struct Obj<F> where F: FnMut() -> u32 {
-error[E0599]: no method named `closure` found for struct `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope
+error[E0599]: no method named `closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-2392.rs:36:15
|
LL | struct Obj<F> where F: FnOnce() -> u32 {
LL | (o_closure.closure)();
| ^ ^
-error[E0599]: no method named `not_closure` found for struct `Obj<[closure@$DIR/issue-2392.rs:35:36: 35:41]>` in the current scope
+error[E0599]: no method named `not_closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-2392.rs:38:15
|
LL | struct Obj<F> where F: FnOnce() -> u32 {
| |
| field, not a method
-error[E0599]: no method named `closure` found for struct `Obj<fn() -> u32 {func}>` in the current scope
+error[E0599]: no method named `closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-2392.rs:42:12
|
LL | struct Obj<F> where F: FnOnce() -> u32 {
LL | (boxed_closure.boxed_closure)();
| ^ ^
-error[E0599]: no method named `closure` found for struct `Obj<fn() -> u32 {func}>` in the current scope
+error[E0599]: no method named `closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-2392.rs:53:12
|
LL | struct Obj<F> where F: FnOnce() -> u32 {
LL | (w.wrap.closure)();
| ^ ^
-error[E0599]: no method named `not_closure` found for struct `Obj<fn() -> u32 {func}>` in the current scope
+error[E0599]: no method named `not_closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-2392.rs:55:12
|
LL | struct Obj<F> where F: FnOnce() -> u32 {
| |
| field, not a method
-error[E0599]: no method named `closure` found for struct `Obj<Box<(dyn FnOnce() -> u32 + 'static)>>` in the current scope
+error[E0599]: no method named `closure` found for struct `Obj<_>` in the current scope
--> $DIR/issue-2392.rs:58:24
|
LL | struct Obj<F> where F: FnOnce() -> u32 {
LL | use no_method_suggested_traits::Reexported;
|
-error[E0599]: no method named `method` found for struct `Rc<&mut Box<&u32>>` in the current scope
+error[E0599]: no method named `method` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:26:44
|
LL | std::rc::Rc::new(&mut Box::new(&1u32)).method();
LL | use foo::Bar;
|
-error[E0599]: no method named `method` found for struct `Rc<&mut Box<&char>>` in the current scope
+error[E0599]: no method named `method` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:32:43
|
LL | std::rc::Rc::new(&mut Box::new(&'a')).method();
LL | use no_method_suggested_traits::foo::PubPub;
|
-error[E0599]: no method named `method` found for struct `Rc<&mut Box<&i32>>` in the current scope
+error[E0599]: no method named `method` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:37:44
|
LL | std::rc::Rc::new(&mut Box::new(&1i32)).method();
candidate #3: `no_method_suggested_traits::qux::PrivPub`
candidate #4: `Reexported`
-error[E0599]: no method named `method` found for struct `Rc<&mut Box<&Foo>>` in the current scope
+error[E0599]: no method named `method` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:42:43
|
LL | std::rc::Rc::new(&mut Box::new(&Foo)).method();
LL | pub trait Bar {
| ^^^^^^^^^^^^^
-error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&u64>>` in the current scope
+error[E0599]: no method named `method2` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:47:44
|
LL | std::rc::Rc::new(&mut Box::new(&1u64)).method2();
LL | pub trait Bar {
| ^^^^^^^^^^^^^
-error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&no_method_suggested_traits::Foo>>` in the current scope
+error[E0599]: no method named `method2` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:52:71
|
LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method2();
LL | pub trait Bar {
| ^^^^^^^^^^^^^
-error[E0599]: no method named `method2` found for struct `Rc<&mut Box<&no_method_suggested_traits::Bar>>` in the current scope
+error[E0599]: no method named `method2` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:56:74
|
LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method2();
= note: the following trait defines an item `method3`, perhaps you need to implement it:
candidate #1: `PubPub`
-error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&Foo>>` in the current scope
+error[E0599]: no method named `method3` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:61:43
|
LL | std::rc::Rc::new(&mut Box::new(&Foo)).method3();
= note: the following trait defines an item `method3`, perhaps you need to implement it:
candidate #1: `PubPub`
-error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&Bar>>` in the current scope
+error[E0599]: no method named `method3` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:65:46
|
LL | std::rc::Rc::new(&mut Box::new(&Bar::X)).method3();
LL | 1_usize.method3();
| ^^^^^^^ method not found in `usize`
-error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&usize>>` in the current scope
+error[E0599]: no method named `method3` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:70:47
|
LL | std::rc::Rc::new(&mut Box::new(&1_usize)).method3();
LL | no_method_suggested_traits::Foo.method3();
| ^^^^^^^ method not found in `no_method_suggested_traits::Foo`
-error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&no_method_suggested_traits::Foo>>` in the current scope
+error[E0599]: no method named `method3` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:72:71
|
LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Foo)).method3();
LL | no_method_suggested_traits::Bar::X.method3();
| ^^^^^^^ method not found in `no_method_suggested_traits::Bar`
-error[E0599]: no method named `method3` found for struct `Rc<&mut Box<&no_method_suggested_traits::Bar>>` in the current scope
+error[E0599]: no method named `method3` found for struct `Rc<_>` in the current scope
--> $DIR/no-method-suggested-traits.rs:75:74
|
LL | std::rc::Rc::new(&mut Box::new(&no_method_suggested_traits::Bar::X)).method3();
|
LL | let ug = Graph::<i32, i32>::new_undirected();
| ^^^^^^^^^^^^^^ function or associated item not found in `issue_30123_aux::Graph<i32, i32>`
+ |
+ = note: The function or associated item was found for issue_30123_aux::Graph<N, E, Undirected>.
error: aborting due to previous error
-error[E0599]: no method named `iter` found for struct `Iterate<{integer}, [closure@$DIR/issue-41880.rs:26:24: 26:31]>` in the current scope
+error[E0599]: no method named `iter` found for struct `Iterate<_, _>` in the current scope
--> $DIR/issue-41880.rs:27:24
|
LL | pub struct Iterate<T, F> {
--- /dev/null
+// Test for issue 81576
+// Remove generic arguments if no method is found for all possible generic argument
+
+
+struct Wrapper2<'a, T, const C: usize> {
+ x: &'a T,
+}
+
+impl<'a, const C: usize> Wrapper2<'a, i8, C> {
+ fn method(&self) {}
+}
+
+impl<'a, const C: usize> Wrapper2<'a, i16, C> {
+ fn method(&self) {}
+}
+
+impl<'a, const C: usize> Wrapper2<'a, i32, C> {
+ fn method(&self) {}
+}
+struct Wrapper<T>(T);
+
+
+
+impl Wrapper<i8> {
+ fn method(&self) {}
+}
+
+impl Wrapper<i16> {
+ fn method(&self) {}
+}
+
+impl Wrapper<i32> {
+ fn method(&self) {}
+}
+
+impl Wrapper<i64> {
+ fn method(&self) {}
+}
+
+impl Wrapper<u8> {
+ fn method(&self) {}
+}
+
+impl Wrapper<u16> {
+ fn method(&self) {}
+}
+
+struct Point<T> {
+ x: T,
+ y: T,
+}
+
+impl Point<f64> {
+ fn distance(&self) -> f64 {
+ self.x.hypot(self.y)
+ }
+}
+
+struct Other;
+
+impl Other {
+ fn other(&self) {}
+}
+
+fn main() {
+ let point_f64 = Point{ x: 1_f64, y: 1_f64};
+ let d = point_f64.distance();
+ let point_i32 = Point{ x: 1_i32, y: 1_i32};
+ let d = point_i32.distance();
+ //~^ ERROR no method named `distance` found for struct `Point<i32>
+ let d = point_i32.other();
+ //~^ ERROR no method named `other` found for struct `Point<_>
+ let v = vec![1_i32, 2, 3];
+ v.iter().map(|x| x * x).extend(std::iter::once(100));
+ //~^ ERROR no method named `extend` found for struct `Map<_, _>
+ let wrapper = Wrapper(true);
+ wrapper.method();
+ //~^ ERROR no method named `method` found for struct `Wrapper<bool>
+ wrapper.other();
+ //~^ ERROR no method named `other` found for struct `Wrapper<_>
+ let boolean = true;
+ let wrapper = Wrapper2::<'_, _, 3> {x: &boolean};
+ wrapper.method();
+ //~^ ERROR no method named `method` found for struct `Wrapper2<'_, bool, 3_usize>
+ wrapper.other();
+ //~^ ERROR no method named `other` found for struct `Wrapper2<'_, _, _>
+ let a = vec![1, 2, 3];
+ a.not_found();
+ //~^ ERROR no method named `not_found` found for struct `Vec<_, _>
+}
--- /dev/null
+error[E0599]: no method named `distance` found for struct `Point<i32>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:69:23
+ |
+LL | struct Point<T> {
+ | --------------- method `distance` not found for this
+...
+LL | let d = point_i32.distance();
+ | ^^^^^^^^ method not found in `Point<i32>`
+ |
+ = note: The method was found for Point<f64>.
+
+error[E0599]: no method named `other` found for struct `Point<_>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:71:23
+ |
+LL | struct Point<T> {
+ | --------------- method `other` not found for this
+...
+LL | let d = point_i32.other();
+ | ^^^^^ method not found in `Point<i32>`
+
+error[E0599]: no method named `extend` found for struct `Map<_, _>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:74:29
+ |
+LL | v.iter().map(|x| x * x).extend(std::iter::once(100));
+ | ^^^^^^ method not found in `Map<std::slice::Iter<'_, i32>, [closure@$DIR/method-not-found-generic-arg-elision.rs:74:18: 74:27]>`
+
+error[E0599]: no method named `method` found for struct `Wrapper<bool>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:77:13
+ |
+LL | struct Wrapper<T>(T);
+ | --------------------- method `method` not found for this
+...
+LL | wrapper.method();
+ | ^^^^^^ method not found in `Wrapper<bool>`
+ |
+ = note: The method was found for Wrapper<i8>, Wrapper<u16>, Wrapper<u16> and 3 more.
+
+error[E0599]: no method named `other` found for struct `Wrapper<_>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:79:13
+ |
+LL | struct Wrapper<T>(T);
+ | --------------------- method `other` not found for this
+...
+LL | wrapper.other();
+ | ^^^^^ method not found in `Wrapper<bool>`
+
+error[E0599]: no method named `method` found for struct `Wrapper2<'_, bool, 3_usize>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:83:13
+ |
+LL | struct Wrapper2<'a, T, const C: usize> {
+ | -------------------------------------- method `method` not found for this
+...
+LL | wrapper.method();
+ | ^^^^^^ method not found in `Wrapper2<'_, bool, 3_usize>`
+ |
+ = note: The method was found for Wrapper2<'a, i8, C>, Wrapper2<'a, i32, C> and Wrapper2<'a, i32, C>.
+
+error[E0599]: no method named `other` found for struct `Wrapper2<'_, _, _>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:85:13
+ |
+LL | struct Wrapper2<'a, T, const C: usize> {
+ | -------------------------------------- method `other` not found for this
+...
+LL | wrapper.other();
+ | ^^^^^ method not found in `Wrapper2<'_, bool, 3_usize>`
+
+error[E0599]: no method named `not_found` found for struct `Vec<_, _>` in the current scope
+ --> $DIR/method-not-found-generic-arg-elision.rs:88:7
+ |
+LL | a.not_found();
+ | ^^^^^^^^^ method not found in `Vec<{integer}>`
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0599`.
LL | x.owned();
| ^^^^^ method not found in `&mut dyn Foo`
-error[E0599]: no method named `managed` found for struct `Box<(dyn Foo + 'static)>` in the current scope
+error[E0599]: no method named `managed` found for struct `Box<_, _>` in the current scope
--> $DIR/object-pointer-types.rs:23:7
|
LL | x.managed();