Skip to content

Commit aecaa34

Browse files
author
Remi Delmas
committed
Propagate upstream representation change for enums with no variants
Propagated from rust-lang/rust#133702. Empty enums now have `Variants::Empty` as variants instead of `Variants::Single{ index: None }`.
1 parent 902f224 commit aecaa34

File tree

6 files changed

+15
-4
lines changed

6 files changed

+15
-4
lines changed

kani-compiler/src/codegen_cprover_gotoc/codegen/place.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ impl GotocCtx<'_> {
611611
};
612612
let layout = self.layout_of(rustc_internal::internal(self.tcx, ty));
613613
let expr = match &layout.variants {
614-
Variants::Single { .. } => before.goto_expr,
614+
Variants::Empty | Variants::Single { .. } => before.goto_expr,
615615
Variants::Multiple { tag_encoding, .. } => match tag_encoding {
616616
TagEncoding::Direct => {
617617
let cases = if ty_kind.is_coroutine() {

kani-compiler/src/codegen_cprover_gotoc/codegen/rvalue.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,9 @@ impl GotocCtx<'_> {
554554
let variant_expr = variant_proj.goto_expr.clone();
555555
let layout = self.layout_of_stable(res_ty);
556556
let fields = match &layout.variants {
557+
Variants::Empty => {
558+
unreachable!("Aggregate expression for uninhabited enum with no variants")
559+
}
557560
Variants::Single { index } => {
558561
if *index != rustc_internal::internal(self.tcx, variant_index) {
559562
// This may occur if all variants except for the one pointed by
@@ -960,6 +963,7 @@ impl GotocCtx<'_> {
960963
pub fn codegen_get_discriminant(&mut self, e: Expr, ty: Ty, res_ty: Ty) -> Expr {
961964
let layout = self.layout_of_stable(ty);
962965
match &layout.variants {
966+
Variants::Empty => unreachable!("Discriminant for uninhabited enum with no variants"),
963967
Variants::Single { index } => {
964968
let discr_val = layout
965969
.ty

kani-compiler/src/codegen_cprover_gotoc/codegen/statement.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ impl GotocCtx<'_> {
305305
let variant_index_internal = rustc_internal::internal(self.tcx, variant_index);
306306
let layout = self.layout_of(dest_ty_internal);
307307
match &layout.variants {
308-
Variants::Single { .. } => Stmt::skip(location),
308+
Variants::Empty | Variants::Single { .. } => Stmt::skip(location),
309309
Variants::Multiple { tag, tag_encoding, .. } => match tag_encoding {
310310
TagEncoding::Direct => {
311311
let discr = dest_ty_internal

kani-compiler/src/codegen_cprover_gotoc/codegen/typ.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,12 +1191,17 @@ impl<'tcx> GotocCtx<'tcx> {
11911191
let layout = self.layout_of(ty);
11921192
// variants appearing in mir code
11931193
match &layout.variants {
1194+
Variants::Empty => {
1195+
// an empty enum with no variants (its value cannot be instantiated)
1196+
self.ensure_struct(self.ty_mangled_name(ty), pretty_name, |_, _| vec![])
1197+
}
11941198
Variants::Single { index } => {
11951199
self.ensure_struct(self.ty_mangled_name(ty), pretty_name, |gcx, _| {
11961200
match source_variants.get(*index) {
11971201
None => {
1198-
// an empty enum with no variants (its value cannot be instantiated)
1199-
vec![]
1202+
unreachable!(
1203+
"Enum with no variants must be represented as Variants::Empty"
1204+
);
12001205
}
12011206
Some(variant) => {
12021207
// a single enum is pretty much like a struct

kani-compiler/src/kani_middle/transform/check_uninit/ty_layout.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ fn data_bytes_for_ty(
217217
// Support basic enumeration forms
218218
let ty_variants = def.variants();
219219
match layout.variants {
220+
VariantsShape::Empty => Ok(vec![]),
220221
VariantsShape::Single { index } => {
221222
// Only one variant is reachable. This behaves like a struct.
222223
let fields = ty_variants[index.to_index()].fields();

kani-compiler/src/kani_middle/transform/check_values.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ pub fn ty_validity_per_offset(
879879
// Support basic enumeration forms
880880
let ty_variants = def.variants();
881881
match layout.variants {
882+
VariantsShape::Empty => Ok(vec![]),
882883
VariantsShape::Single { index } => {
883884
// Only one variant is reachable. This behaves like a struct.
884885
let fields = ty_variants[index.to_index()].fields();

0 commit comments

Comments
 (0)