mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-03 02:40:40 +00:00
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:
parent
12d1665d11
commit
e0cc2beea3
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user