From fda5cc9b4c048f2db64c5e23525961633aa5f2d4 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 19 Jun 2017 23:49:57 -0700 Subject: [PATCH] avoid downcasting for enum variants without further fields --- src/librustc_mir/interpret/lvalue.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/librustc_mir/interpret/lvalue.rs b/src/librustc_mir/interpret/lvalue.rs index 6693b89baaee..9f344d195577 100644 --- a/src/librustc_mir/interpret/lvalue.rs +++ b/src/librustc_mir/interpret/lvalue.rs @@ -561,13 +561,18 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let variant_idx = adt.discriminants(self.tcx) .position(|variant_discr| variant_discr.to_u128_unchecked() == discr) .ok_or(EvalError::InvalidDiscriminant)?; - - // Downcast to this variant - let lvalue = self.eval_lvalue_projection(lvalue, ty, &mir::ProjectionElem::Downcast(adt, variant_idx))?; - - // Recursively validate the fields let variant = &adt.variants[variant_idx]; - self.validate_variant(lvalue, ty, variant, subst, outer_mutbl) + + if variant.fields.len() > 0 { + // Downcast to this variant + let lvalue = self.eval_lvalue_projection(lvalue, ty, &mir::ProjectionElem::Downcast(adt, variant_idx))?; + + // Recursively validate the fields + self.validate_variant(lvalue, ty, variant, subst, outer_mutbl) + } else { + // No fields, nothing left to check. Downcasting may fail, e.g. in case of a CEnum. + Ok(()) + } } AdtKind::Struct => { self.validate_variant(lvalue, ty, adt.struct_variant(), subst, outer_mutbl)