diff --git a/compiler/rustc_save_analysis/src/lib.rs b/compiler/rustc_save_analysis/src/lib.rs index 89bca39512f52..c2cc2cff957c5 100644 --- a/compiler/rustc_save_analysis/src/lib.rs +++ b/compiler/rustc_save_analysis/src/lib.rs @@ -600,8 +600,9 @@ impl<'tcx> SaveContext<'tcx> { if seg.res != Res::Err { seg.res } else { + // Avoid infinite recursion! let parent_node = self.tcx.hir().get_parent_node(hir_id); - self.get_path_res(parent_node) + if parent_node != hir_id { self.get_path_res(parent_node) } else { Res::Err } } } diff --git a/src/test/ui/save-analysis/issue-101505.rs b/src/test/ui/save-analysis/issue-101505.rs new file mode 100644 index 0000000000000..46f65a6880d37 --- /dev/null +++ b/src/test/ui/save-analysis/issue-101505.rs @@ -0,0 +1,7 @@ +// compile-flags: -Zsave-analysis + +// Check that this doesn't loop infinitely. + +fn a(self) {} //~ ERROR `self` parameter is only allowed in associated functions + +fn main() {} diff --git a/src/test/ui/save-analysis/issue-101505.stderr b/src/test/ui/save-analysis/issue-101505.stderr new file mode 100644 index 0000000000000..3457bdc8422e0 --- /dev/null +++ b/src/test/ui/save-analysis/issue-101505.stderr @@ -0,0 +1,10 @@ +error: `self` parameter is only allowed in associated functions + --> $DIR/issue-101505.rs:5:6 + | +LL | fn a(self) {} + | ^^^^ not semantically valid as function parameter + | + = note: associated functions are those in `impl` or `trait` definitions + +error: aborting due to previous error +