未验证 提交 fda5cc9b 编写于 作者: R Ralf Jung 提交者: Oliver Schneider

avoid downcasting for enum variants without further fields

上级 a91ee4bb
......@@ -561,13 +561,18 @@ pub(super) fn acquire_valid(&mut self, lvalue: Lvalue<'tcx>, ty: Ty<'tcx>, outer
let variant_idx = adt.discriminants(self.tcx)
.position(|variant_discr| variant_discr.to_u128_unchecked() == discr)
.ok_or(EvalError::InvalidDiscriminant)?;
let variant = &adt.variants[variant_idx];
// Downcast to this variant
let lvalue = self.eval_lvalue_projection(lvalue, ty, &mir::ProjectionElem::Downcast(adt, variant_idx))?;
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
let variant = &adt.variants[variant_idx];
self.validate_variant(lvalue, ty, variant, subst, outer_mutbl)
// 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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册