Suppress wrapper suggestion when expected and actual ty are the same adt and the variant is unresolved

Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
This commit is contained in:
xizheyin 2025-08-13 23:23:18 +08:00
parent 12d1665d11
commit e0cc2beea3
No known key found for this signature in database
GPG Key ID: 0A0D90BE99CEDEAD
2 changed files with 9 additions and 8 deletions

View File

@ -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)

View File

@ -6,10 +6,6 @@ LL | assert_eq!(Ok(Some("hi")), foo());
|
= note: expected enum `Result<Option<&str>, _>`
found enum `Result<Option<String>, ()>`
help: try wrapping the expression in `Err`
|
LL | assert_eq!(Ok(Some("hi")), Err(foo()));
| ++++ +
error[E0308]: mismatched types
--> $DIR/suggest-add-wrapper-issue-145294.rs:25:30
@ -19,10 +15,6 @@ LL | assert_eq!(Bar::A("hi"), bar());
|
= note: expected enum `Bar<&str, _>`
found enum `Bar<String, ()>`
help: try wrapping the expression in `Bar::B`
|
LL | assert_eq!(Bar::A("hi"), Bar::B(bar()));
| +++++++ +
error: aborting due to 2 previous errors