diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs
index 2345cdab208..c44e007dbdb 100644
--- a/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs
+++ b/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs
@@ -2378,6 +2378,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
.filter_map(|variant| {
let sole_field = &variant.single_field();
+ // When expected_ty and expr_ty are the same ADT, we prefer to compare their internal generic params,
+ // When the current variant has a sole field whose type is still an unresolved inference variable,
+ // suggestions would be often wrong. So suppress the suggestion. See #145294.
+ if let (ty::Adt(exp_adt, _), ty::Adt(act_adt, _)) = (expected.kind(), expr_ty.kind())
+ && exp_adt.did() == act_adt.did()
+ && sole_field.ty(self.tcx, args).is_ty_var() {
+ return None;
+ }
+
let field_is_local = sole_field.did.is_local();
let field_is_accessible =
sole_field.vis.is_accessible_from(expr.hir_id.owner.def_id, self.tcx)
diff --git a/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr b/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr
index ef5eeb29cf5..5e4ad132210 100644
--- a/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr
+++ b/tests/ui/typeck/suggestions/suggest-add-wrapper-issue-145294.stderr
@@ -6,10 +6,6 @@ LL | assert_eq!(Ok(Some("hi")), foo());
|
= note: expected enum `Result