Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion strum_macros/src/macros/enum_discriminants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,12 @@ pub fn enum_discriminants_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
})
.collect::<Vec<_>>();

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

let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();
let impl_from = quote! {
Expand Down
14 changes: 14 additions & 0 deletions strum_tests/tests/enum_discriminants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use std::mem::{align_of, size_of};
use enum_variant_type::EnumVariantType;
use strum::{
Display, EnumDiscriminants, EnumIter, EnumMessage, EnumString, FromRepr, IntoEnumIterator,
VariantArray,
};

mod core {} // ensure macros call `::core`
Expand Down Expand Up @@ -363,3 +364,16 @@ fn with_explicit_discriminant_value() {
WithExplicitDicriminantValueDiscriminants::Variant0 as u8
);
}

#[allow(dead_code)]
#[derive(Debug, Eq, PartialEq, EnumIter, EnumDiscriminants)]
#[strum_discriminants(derive(EnumIter, VariantArray))]
enum Empty {}

#[test]
fn empty_test() {
let discriminants = Empty::iter().map(|i| i.into()).collect::<Vec<_>>();
let expected: Vec<_> = EmptyDiscriminants::VARIANTS.to_vec();

assert_eq!(expected, discriminants);
}