]> git.lizzy.rs Git - rust.git/commitdiff
elision of generic argument in E0599 if the methode has not been found anywhere and...
authorAliénore Bouttefeux <alienore.bouttefeux@gmail.com>
Thu, 15 Apr 2021 14:58:17 +0000 (16:58 +0200)
committerAliénore Bouttefeux <alienore.bouttefeux@gmail.com>
Thu, 15 Apr 2021 14:58:17 +0000 (16:58 +0200)
compiler/rustc_typeck/src/check/method/suggest.rs
src/test/ui/auto-ref-slice-plus-ref.stderr
src/test/ui/class-cast-to-trait.stderr
src/test/ui/confuse-field-and-method/issue-18343.stderr
src/test/ui/confuse-field-and-method/issue-2392.stderr
src/test/ui/impl-trait/no-method-suggested-traits.stderr
src/test/ui/issues/issue-30123.stderr
src/test/ui/issues/issue-41880.stderr
src/test/ui/methods/method-not-found-generic-arg-elision.rs [new file with mode: 0644]
src/test/ui/methods/method-not-found-generic-arg-elision.stderr [new file with mode: 0644]
src/test/ui/object-pointer-types.stderr

index 02fe8312c4c1fed6a777d771762a01c7af3450a6..54a1078383fcb9a4a79842f5337a1db5e98d39c4 100644 (file)
@@ -13,6 +13,7 @@
 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,
 };
@@ -383,6 +384,52 @@ pub fn report_method_error(
                         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,
@@ -391,7 +438,7 @@ pub fn report_method_error(
                             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 {
@@ -449,6 +496,77 @@ pub fn report_method_error(
                 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"));
                     }
index eb8447ff0f3e7c03f7afe7ad963d3afdebf76857..be1b79e936d2480bf43df71e96854daa2888b0e9 100644 (file)
@@ -1,4 +1,4 @@
-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();
@@ -11,7 +11,7 @@ note: `MyIter` defines an item `test_mut`, perhaps you need to implement it
 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();
index 56d10d88d8b25a68cb0c61d34f47c97efd8804da..c01af6d7e2561bda39d105731ac26cca58fbbcdf 100644 (file)
@@ -1,4 +1,4 @@
-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();
index d6b399acb733097ecfdf9658622d638c857ec697..2bf32975a6f45cfdb89a7ff49d435adec909e75f 100644 (file)
@@ -1,4 +1,4 @@
-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 {
index 051940bbe9660282e4ddc9d29d03a22379eba286..f17a56eba2f7acd58b2b9e795e4d4d0641c0718e 100644 (file)
@@ -1,4 +1,4 @@
-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 {
@@ -12,7 +12,7 @@ help: to call the function stored in `closure`, surround the field access with p
 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 {
@@ -23,7 +23,7 @@ LL |     o_closure.not_closure();
    |               |
    |               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 {
@@ -65,7 +65,7 @@ help: to call the function stored in `boxed_closure`, surround the field access
 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 {
@@ -79,7 +79,7 @@ help: to call the function stored in `closure`, surround the field access with p
 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 {
@@ -90,7 +90,7 @@ LL |     w.wrap.not_closure();
    |            |
    |            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 {
index 64ddcb81c0a9be3e6fb609e9d31946d9ff2ac054..5c0f945140a01829626d5f94ffff8ba07df45648 100644 (file)
@@ -16,7 +16,7 @@ LL | use no_method_suggested_traits::qux::PrivPub;
 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();
@@ -46,7 +46,7 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f
 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();
@@ -70,7 +70,7 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f
 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();
@@ -98,7 +98,7 @@ LL |     Foo.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();
@@ -124,7 +124,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it
 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();
@@ -150,7 +150,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it
 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();
@@ -176,7 +176,7 @@ note: `foo::Bar` defines an item `method2`, perhaps you need to implement it
 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();
@@ -202,7 +202,7 @@ LL |     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<&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();
@@ -225,7 +225,7 @@ LL |     Bar::X.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();
@@ -241,7 +241,7 @@ error[E0599]: no method named `method3` found for type `usize` in the current sc
 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();
@@ -253,7 +253,7 @@ error[E0599]: no method named `method3` found for struct `no_method_suggested_tr
 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();
@@ -265,7 +265,7 @@ error[E0599]: no method named `method3` found for enum `no_method_suggested_trai
 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();
index bc6731601f095644e8ee8088d939dd641efd58ae..27b128372c0fe2cc7ec5c428e87b4c26c4f98134 100644 (file)
@@ -3,6 +3,8 @@ error[E0599]: no function or associated item named `new_undirected` found for st
    |
 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
 
index 09d5594f73f06bd360f1eea195d23d3317cc1794..f9d11c47687b9c779862339029bb207db906b691 100644 (file)
@@ -1,4 +1,4 @@
-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> {
diff --git a/src/test/ui/methods/method-not-found-generic-arg-elision.rs b/src/test/ui/methods/method-not-found-generic-arg-elision.rs
new file mode 100644 (file)
index 0000000..85ccb0b
--- /dev/null
@@ -0,0 +1,90 @@
+// 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<_, _>
+}
diff --git a/src/test/ui/methods/method-not-found-generic-arg-elision.stderr b/src/test/ui/methods/method-not-found-generic-arg-elision.stderr
new file mode 100644 (file)
index 0000000..80e1113
--- /dev/null
@@ -0,0 +1,75 @@
+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`.
index a477425edc81b75a564283bd61c6f5988e5b568d..fb3462b2cabd4cbdb28dcb51f9576df1e45f06ce 100644 (file)
@@ -16,7 +16,7 @@ LL |     fn owned(self: Box<Self>);
 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();