https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105255

--- Comment #1 from Giovanni Cerretani <cerrigno at gmail dot com> ---
I attach also a more comprehensive test that also checks conversions from
integer to enumeration types (https://godbolt.org/z/jbe76E3c1). The behavior of
direct-list-initialization has changed on C++17, and all tested compilers
correctly implement it.



#if __cplusplus < 201703L

// unscoped
static_assert( is_narrowing<my_enum_opaque_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_opaque_unsigned, signed_t>::value, "");
static_assert( is_narrowing<my_enum, signed_t>::value, "");
static_assert( is_narrowing<my_enum_auto_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_auto_unsigned, signed_t>::value, "");
static_assert( is_narrowing<my_enum_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_unsigned, signed_t>::value, "");

// scoped
static_assert( is_narrowing<my_enum_opaque_scoped, signed_t>::value, "");
static_assert( is_narrowing<my_enum_opaque_scoped_signed, signed_t>::value,
"");
static_assert( is_narrowing<my_enum_opaque_scoped_unsigned, signed_t>::value,
"");
static_assert( is_narrowing<my_enum_scoped, signed_t>::value, "");
static_assert( is_narrowing<my_enum_scoped_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_scoped_unsigned, signed_t>::value, "");

#else

// unscoped
static_assert(!is_narrowing<my_enum_opaque_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_opaque_unsigned, signed_t>::value, "");
static_assert( is_narrowing<my_enum, signed_t>::value, "");
static_assert( is_narrowing<my_enum_auto_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_auto_unsigned, signed_t>::value, "");
static_assert(!is_narrowing<my_enum_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_unsigned, signed_t>::value, "");

// scoped
static_assert(!is_narrowing<my_enum_opaque_scoped, signed_t>::value, "");
static_assert(!is_narrowing<my_enum_opaque_scoped_signed, signed_t>::value,
"");
static_assert( is_narrowing<my_enum_opaque_scoped_unsigned, signed_t>::value,
"");
static_assert(!is_narrowing<my_enum_scoped, signed_t>::value, "");
static_assert(!is_narrowing<my_enum_scoped_signed, signed_t>::value, "");
static_assert( is_narrowing<my_enum_scoped_unsigned, signed_t>::value, "");

#endif

Reply via email to