diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 3d5eb422b63..190e2965e76 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -2007,6 +2007,15 @@ impl LintPass for UnconditionalRecursion { // 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() } diff --git a/src/test/compile-fail/lint-unconditional-recursion.rs b/src/test/compile-fail/lint-unconditional-recursion.rs index 0cd71aebd63..47bb7f948a7 100644 --- a/src/test/compile-fail/lint-unconditional-recursion.rs +++ b/src/test/compile-fail/lint-unconditional-recursion.rs @@ -67,4 +67,11 @@ fn all_fine() { let _f = all_fine; } +// issue 26333 +trait Bar { + fn method(&self, x: &T) { + x.method(x) + } +} + fn main() {}