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