@@ -92,19 +92,40 @@ fn generate_type_constructor(type_name: TokenStream, fields: &syn::Fields) -> To
92
92
/// Generates a `match` case to construct each variant of the given type. Uses a
93
93
/// symbolic `usize` to decide which variant to construct.
94
94
fn enum_constructor ( ident : & syn:: Ident , data_enum : & syn:: DataEnum ) -> TokenStream {
95
- let variant_constructors = data_enum. variants . iter ( ) . map ( |variant| {
95
+ if data_enum. variants . is_empty ( ) {
96
+ let msg = format ! (
97
+ "Cannot create symbolic enum `{ident}`. Enums with zero-variants cannot be instantiated"
98
+ ) ;
99
+ quote ! {
100
+ panic!( #msg)
101
+ }
102
+ } else if data_enum. variants . len ( ) == 1 {
103
+ let variant = data_enum. variants . first ( ) . unwrap ( ) ;
96
104
let variant_name = & variant. ident ;
97
- generate_type_constructor ( quote ! ( #ident:: #variant_name) , & variant. fields )
98
- } ) ;
99
- let n_variants = data_enum. variants . len ( ) ;
100
- let cases = variant_constructors. enumerate ( ) . map ( |( idx, var_constr) | {
101
- if idx < n_variants - 1 { quote ! ( #idx => #var_constr) } else { quote ! ( _ => #var_constr) }
102
- } ) ;
105
+ let variant_constructor =
106
+ generate_type_constructor ( quote ! ( #ident:: #variant_name) , & variant. fields ) ;
107
+ quote ! {
108
+ #variant_constructor
109
+ }
110
+ } else {
111
+ let variant_constructors = data_enum. variants . iter ( ) . map ( |variant| {
112
+ let variant_name = & variant. ident ;
113
+ generate_type_constructor ( quote ! ( #ident:: #variant_name) , & variant. fields )
114
+ } ) ;
115
+ let n_variants = data_enum. variants . len ( ) ;
116
+ let cases = variant_constructors. enumerate ( ) . map ( |( idx, var_constr) | {
117
+ if idx < n_variants - 1 {
118
+ quote ! ( #idx => #var_constr)
119
+ } else {
120
+ quote ! ( _ => #var_constr)
121
+ }
122
+ } ) ;
103
123
104
- let kani_path = kani_path ( ) ;
105
- quote ! {
106
- match #kani_path:: any( ) {
107
- #( #cases) , * ,
124
+ let kani_path = kani_path ( ) ;
125
+ quote ! {
126
+ match #kani_path:: any( ) {
127
+ #( #cases) , * ,
128
+ }
108
129
}
109
130
}
110
131
}
0 commit comments