Change:
when using i even got this suggestion recommending i return DefKind from the GlobalCtxt::enter closure, which isn't even remotely the right type. it also seems to only show up when using macros? all around quite strange. No response No response <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOT_END --
claim

Discussion:
use rustc_middle::middle::stability::EvalResult; use rustc_middle::span_bug; use rustc_middle::ty::print::with_no_trimmed_paths; <del> use rustc_middle::ty::{ self, suggest_constraining_type_params, Article, Binder, IsSuggestable, Ty, TypeVisitableExt, Upcast, }; </del> <ins> use rustc_middle::ty::{self, suggest_constraining_type_params, Article, Binder}; use rustc_middle::ty::{IsSuggestable, Ty, TyCtxt, TypeVisitableExt, Upcast}; </ins> use rustc_session::errors::ExprParenthesesNeeded; use rustc_span::source_map::Spanned; use rustc_span::symbol::{sym, Ident};

self.tcx.hir().span_with_body(self.tcx.local_def_id_to_hir_id(fn_id)), ) { <del> err.multipart_suggestion( </del> <ins> // When the expr is in a match arm's body, we shouldn't add semicolon ';' at the end. // For example: // fn mismatch_types() -> i32 { //     match 1 { //         x => dbg!(x), //     } //     todo!() // } // -------------^^^^^^^- // Don't add semicolon `;` at the end of `dbg!(x)` expr fn is_in_arm<'tcx>(expr: &'tcx hir::Expr<'tcx>, tcx: TyCtxt<'tcx>) -> bool { for (_, node) in tcx.hir().parent_iter(expr.hir_id) { match node { hir::Node::Block(block) => { if let Some(ret) = block.expr && ret.hir_id == expr.hir_id { continue; } } hir::Node::Arm(arm) => { if let hir::ExprKind::Block(block, _) = arm.body.kind && let Some(ret) = block.expr && ret.hir_id == expr.hir_id { return true; } } hir::Node::Expr(e) if let hir::ExprKind::Block(block, _) = e.kind => { if let Some(ret) = block.expr && ret.hir_id == expr.hir_id { continue; } } _ => { return false; } } } false } let mut suggs = vec![(span.shrink_to_lo(), "return ".to_string())]; if !is_in_arm(expr, self.tcx) { suggs.push((span.shrink_to_hi(), ";".to_string())); } err.multipart_suggestion_verbose( </ins> "you might have meant to return this value", <del> vec![ (span.shrink_to_lo(), "return ".to_string()), (span.shrink_to_hi(), ";".to_string()), ], </del> <ins> suggs, </ins> Applicability::MaybeIncorrect, ); }

<ins> //@ run-rustfix #![allow(unreachable_code, dead_code)] fn main() { fn mismatch_types1() -> i32 { match 1 { x => return dbg!(x), //~ ERROR mismatched types } todo!() } fn mismatch_types2() -> i32 { match 2 { x => { return dbg!(x) //~ ERROR mismatched types } } todo!() } fn mismatch_types3() -> i32 { match 1 { _ => return dbg!(1) //~ ERROR mismatched types } todo!() } fn mismatch_types4() -> i32 { match 1 { _ => {return dbg!(1)} //~ ERROR mismatched types } todo!() } } </ins>

<ins> //@ run-rustfix #![allow(unreachable_code, dead_code)] fn main() { fn mismatch_types1() -> i32 { match 1 { x => dbg!(x), //~ ERROR mismatched types } todo!() } fn mismatch_types2() -> i32 { match 2 { x => { dbg!(x) //~ ERROR mismatched types } } todo!() } fn mismatch_types3() -> i32 { match 1 { _ => dbg!(1) //~ ERROR mismatched types } todo!() } fn mismatch_types4() -> i32 { match 1 { _ => {dbg!(1)} //~ ERROR mismatched types } todo!() } } </ins>

<ins> error[E0308]: mismatched types --> $DIR/mismatched-types-issue-126222.rs:7:18 | LL |             x => dbg!(x), |                  ^^^^^^^ expected `()`, found integer | = note: this error originates in the macro `dbg` (in Nightly builds, run with -Z macro-backtrace for more info) help: you might have meant to return this value | LL |             x => return dbg!(x), |                  ++++++ error[E0308]: mismatched types --> $DIR/mismatched-types-issue-126222.rs:15:17 | LL |                 dbg!(x) |                 ^^^^^^^ expected `()`, found integer | = note: this error originates in the macro `dbg` (in Nightly builds, run with -Z macro-backtrace for more info) help: you might have meant to return this value | LL |                 return dbg!(x) |                 ++++++ error[E0308]: mismatched types --> $DIR/mismatched-types-issue-126222.rs:23:18 | LL |             _ => dbg!(1) |                  ^^^^^^^ expected `()`, found integer | = note: this error originates in the macro `dbg` (in Nightly builds, run with -Z macro-backtrace for more info) help: you might have meant to return this value | LL |             _ => return dbg!(1) |                  ++++++ error[E0308]: mismatched types --> $DIR/mismatched-types-issue-126222.rs:30:19 | LL |             _ => {dbg!(1)} |                   ^^^^^^^ expected `()`, found integer | = note: this error originates in the macro `dbg` (in Nightly builds, run with -Z macro-backtrace for more info) help: you might have meant to return this value | LL |             _ => {return dbg!(1)} |                   ++++++ error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0308`. </ins>