Skip to content

Commit c02ac83

Browse files
committed
allow discriminants on empty enum
1 parent f301b67 commit c02ac83

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

strum_macros/src/macros/enum_discriminants.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,12 @@ pub fn enum_discriminants_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
136136
})
137137
.collect::<Vec<_>>();
138138

139-
let from_fn_body = quote! { match val { #(#arms),* } };
139+
let from_fn_body = if variants.is_empty() {
140+
//this method on empty enum is impossible to be called. it is therefor left empty
141+
quote! { unreachable!()}
142+
} else {
143+
quote! { match val { #(#arms),* } }
144+
};
140145

141146
let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
142147
let impl_from = quote! {

strum_tests/tests/enum_discriminants.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::mem::{align_of, size_of};
33
use enum_variant_type::EnumVariantType;
44
use strum::{
55
Display, EnumDiscriminants, EnumIter, EnumMessage, EnumString, FromRepr, IntoEnumIterator,
6+
VariantArray,
67
};
78

89
mod core {} // ensure macros call `::core`
@@ -363,3 +364,16 @@ fn with_explicit_discriminant_value() {
363364
WithExplicitDicriminantValueDiscriminants::Variant0 as u8
364365
);
365366
}
367+
368+
#[allow(dead_code)]
369+
#[derive(Debug, Eq, PartialEq, EnumIter, EnumDiscriminants)]
370+
#[strum_discriminants(derive(EnumIter, VariantArray))]
371+
enum Empty {}
372+
373+
#[test]
374+
fn empty_test() {
375+
let discriminants = Empty::iter().map(|i| i.into()).collect::<Vec<_>>();
376+
let expected: Vec<_> = EmptyDiscriminants::VARIANTS.to_vec();
377+
378+
assert_eq!(expected, discriminants);
379+
}

0 commit comments

Comments
 (0)