This catches the case when a trait defines a default method that calls
itself, but on a type that isn't necessarily `Self`, e.g. there's no
reason that `T = Self` in the following, so the call isn't necessarily
recursive (`T` may override the call).
trait Bar {
fn method<T: Bar>(&self, x: &T) {
x.method(x)
}
}
Fixes #26333.
// method instead.
ty::MethodTypeParam(
ty::MethodParam { ref trait_ref, method_num, impl_def_id: None, }) => {
+
+ let on_self = m.substs.self_ty().map_or(false, |t| t.is_self());
+ if !on_self {
+ // we can only be recurring in a default
+ // method if we're being called literally
+ // on the `Self` type.
+ return false
+ }
+
tcx.trait_item(trait_ref.def_id, method_num).def_id()
}
let _f = all_fine;
}
+// issue 26333
+trait Bar {
+ fn method<T: Bar>(&self, x: &T) {
+ x.method(x)
+ }
+}
+
fn main() {}