diff --git a/src/librustc_middle/ty/mod.rs b/src/librustc_middle/ty/mod.rs index a961d02f7a2b1..364059a5993be 100644 --- a/src/librustc_middle/ty/mod.rs +++ b/src/librustc_middle/ty/mod.rs @@ -1971,6 +1971,9 @@ bitflags! { const NO_VARIANT_FLAGS = 0; /// Indicates whether the field list of this variant is `#[non_exhaustive]`. const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0; + /// Indicates whether this variant was obtained as part of recovering from + /// a syntactic error. May be incomplete or bogus. + const IS_RECOVERED = 1 << 1; } } @@ -1994,9 +1997,6 @@ pub struct VariantDef { pub ctor_kind: CtorKind, /// Flags of the variant (e.g. is field list non-exhaustive)? flags: VariantFlags, - /// Variant is obtained as part of recovering from a syntactic error. - /// May be incomplete or bogus. - pub recovered: bool, } impl<'tcx> VariantDef { @@ -2039,6 +2039,10 @@ impl<'tcx> VariantDef { flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE; } + if recovered { + flags |= VariantFlags::IS_RECOVERED; + } + VariantDef { def_id: variant_did.unwrap_or(parent_did), ctor_def_id, @@ -2047,7 +2051,6 @@ impl<'tcx> VariantDef { fields, ctor_kind, flags, - recovered, } } @@ -2057,6 +2060,12 @@ impl<'tcx> VariantDef { self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE) } + /// Was this variant obtained as part of recovering from a syntactic error? + #[inline] + pub fn is_recovered(&self) -> bool { + self.flags.intersects(VariantFlags::IS_RECOVERED) + } + /// `repr(transparent)` structs can have a single non-ZST field, this function returns that /// field. pub fn transparent_newtype_field(&self, tcx: TyCtxt<'tcx>) -> Option<&FieldDef> { diff --git a/src/librustc_typeck/check/expr.rs b/src/librustc_typeck/check/expr.rs index 0e9f64c359690..8fb3d0b7d98fb 100644 --- a/src/librustc_typeck/check/expr.rs +++ b/src/librustc_typeck/check/expr.rs @@ -1296,7 +1296,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { kind_name: &str, ty_span: Span, ) { - if variant.recovered { + if variant.is_recovered() { self.set_tainted_by_errors(); return; } diff --git a/src/librustc_typeck/check/pat.rs b/src/librustc_typeck/check/pat.rs index dc1ce2d89ba0e..d1864ee2b35af 100644 --- a/src/librustc_typeck/check/pat.rs +++ b/src/librustc_typeck/check/pat.rs @@ -1080,7 +1080,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { .filter(|ident| !used_fields.contains_key(&ident)) .collect::>(); - let inexistent_fields_err = if !inexistent_fields.is_empty() && !variant.recovered { + let inexistent_fields_err = if !(inexistent_fields.is_empty() || variant.is_recovered()) { Some(self.error_inexistent_fields( adt.variant_descr(), &inexistent_fields,