Skip to content

Commit 20cc0e1

Browse files
committed
fix check_field for recovered_variant
1 parent 01d0944 commit 20cc0e1

File tree

1 file changed

+7
-12
lines changed
  • compiler/rustc_hir_typeck/src

1 file changed

+7
-12
lines changed

compiler/rustc_hir_typeck/src/expr.rs

+7-12
Original file line numberDiff line numberDiff line change
@@ -2330,6 +2330,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
23302330
let base_ty = self.structurally_resolve_type(base.span, base_ty);
23312331
let mut private_candidate = None;
23322332
let mut autoderef = self.autoderef(expr.span, base_ty);
2333+
let mut recovered_variant = None;
23332334
while let Some((deref_base_ty, _)) = autoderef.next() {
23342335
debug!("deref_base_ty: {:?}", deref_base_ty);
23352336
match deref_base_ty.kind() {
@@ -2342,6 +2343,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
23422343
let mut last_ty = None;
23432344
let mut nested_fields = Vec::new();
23442345
let mut index = None;
2346+
if let Err(guard) = adt_def.non_enum_variant().has_errors() {
2347+
recovered_variant = Some(guard);
2348+
break;
2349+
}
23452350
while let Some(idx) = self.tcx.find_field((adt_def.did(), ident)) {
23462351
let &mut first_idx = index.get_or_insert(idx);
23472352
let field = &adt_def.non_enum_variant().fields[idx];
@@ -2420,7 +2425,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
24202425
) {
24212426
self.ban_take_value_of_method(expr, base_ty, field)
24222427
} else if !base_ty.is_primitive_ty() {
2423-
self.ban_nonexisting_field(field, base, expr, base_ty)
2428+
recovered_variant
2429+
.unwrap_or_else(|| self.ban_nonexisting_field(field, base, expr, base_ty))
24242430
} else {
24252431
let field_name = field.to_string();
24262432
let mut err = type_error_struct!(
@@ -2545,17 +2551,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
25452551
ident, base, expr, base_ty
25462552
);
25472553

2548-
for (ty, _) in self.autoderef(expr.span, base_ty) {
2549-
if let ty::Adt(def, _) = ty.kind()
2550-
&& !def.is_enum()
2551-
{
2552-
let variant = def.non_enum_variant();
2553-
if let Err(taint) = variant.has_errors() {
2554-
return taint;
2555-
}
2556-
}
2557-
}
2558-
25592554
let mut err = self.no_such_field_err(ident, base_ty, base.hir_id);
25602555

25612556
match *base_ty.peel_refs().kind() {

0 commit comments

Comments
 (0)