diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs index 4a73ce2e64095..d9e5289f6323b 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs @@ -2011,12 +2011,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { for (span, code) in errors_causecode { self.dcx().try_steal_modify_and_emit_err(span, StashKey::MaybeForgetReturn, |err| { if let Some(fn_sig) = self.body_fn_sig() - && let ExprBindingObligation(_, _, hir_id, ..) = code + && let ExprBindingObligation(_, _, binding_hir_id, ..) = code && !fn_sig.output().is_unit() { let mut block_num = 0; let mut found_semi = false; - for (_, node) in self.tcx.hir().parent_iter(hir_id) { + for (hir_id, node) in self.tcx.hir().parent_iter(binding_hir_id) { + // Don't proceed into parent bodies + if hir_id.owner != binding_hir_id.owner { + break; + } match node { hir::Node::Stmt(stmt) => { if let hir::StmtKind::Semi(expr) = stmt.kind { diff --git a/tests/ui/inference/dont-collect-stmts-from-parent-body.rs b/tests/ui/inference/dont-collect-stmts-from-parent-body.rs new file mode 100644 index 0000000000000..635fe74b8679d --- /dev/null +++ b/tests/ui/inference/dont-collect-stmts-from-parent-body.rs @@ -0,0 +1,15 @@ +// issue: rust-lang/rust#124022 + +struct Type; +//~^ ERROR type parameter `T` is never used + +fn main() { + { + impl Type { + fn new() -> Type { + Type + //~^ ERROR type annotations needed + } + } + }; +} diff --git a/tests/ui/inference/dont-collect-stmts-from-parent-body.stderr b/tests/ui/inference/dont-collect-stmts-from-parent-body.stderr new file mode 100644 index 0000000000000..f82527273fbee --- /dev/null +++ b/tests/ui/inference/dont-collect-stmts-from-parent-body.stderr @@ -0,0 +1,24 @@ +error[E0392]: type parameter `T` is never used + --> $DIR/dont-collect-stmts-from-parent-body.rs:3:13 + | +LL | struct Type; + | ^ unused type parameter + | + = help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData` + = help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead + +error[E0282]: type annotations needed + --> $DIR/dont-collect-stmts-from-parent-body.rs:10:17 + | +LL | Type + | ^^^^ cannot infer type of the type parameter `T` declared on the struct `Type` + | +help: consider specifying the generic argument + | +LL | Type:: + | +++++ + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0282, E0392. +For more information about an error, try `rustc --explain E0282`.