[Bug c++/99968] New: [11 Regression] ICE on remove_const_t<incomplete enum type> in requires-expression
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Apr 8 10:37:57 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99968
Bug ID: 99968
Summary: [11 Regression] ICE on remove_const_t<incomplete enum
type> in requires-expression
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Keywords: ice-on-valid-code
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
template<typename T> struct remove_const { using type = T; };
template<typename T> struct remove_const<const T> { using type = T; };
template<typename T> using remove_const_t = typename remove_const<T>::type;
template<typename T>
constexpr inline bool is_enum_v = __is_enum(T);
template<typename T>
struct is_scoped_enum
{
static constexpr bool value = false;
};
template<typename T>
requires is_enum_v<T> && requires (remove_const_t<T> t) { t = t; }
struct is_scoped_enum<T>
{
static constexpr bool value = !requires (T t, int i) { i = t; };
};
template<typename T>
constexpr inline bool is_scoped_enum_v = is_scoped_enum<T>::value;
void f()
{
enum E { e0 = is_enum_v<E>, e1 = is_scoped_enum_v<E> };
static_assert( e0 );
static_assert( ! e1 );
}
Compiled with -std=gnu++20:
e.C: In instantiation of 'struct remove_const<f()::E>':
e.C:3:28: required by substitution of 'template<class T> using remove_const_t
= typename remove_const::type [with T = f()::E]'
e.C:15:26: required by substitution of 'template<class T> requires
(is_enum_v<T>) && requires(typename remove_const<T>::type t) {t = t;} struct
is_scoped_enum<T> [with T = f()::E]'
e.C:22:61: required from 'constexpr const bool is_scoped_enum_v<f()::E>'
e.C:26:36: required from here
e.C:1:29: error: enum value type is not 'INTEGER_TYPE' nor convertible to the
enum
1 | template<typename T> struct remove_const { using type = T; };
| ^~~~~~~~~~~~
<const_decl 0x7fcf7f625070 e0
type <boolean_type 0x7fcf7f4c1b28 bool public unsigned type_6 QI
size <integer_cst 0x7fcf7f4a3fa8 constant 8>
unit-size <integer_cst 0x7fcf7f4a3fc0 constant 1>
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7fcf7f4c1b28 precision:1 min <integer_cst 0x7fcf7f4c4210 0> max <integer_cst
0x7fcf7f4c4240 1>>
readonly constant VOID e.C:26:12
align:1 warn_if_not_align:0 context <enumeral_type 0x7fcf7f61cf18 E>
initial <integer_cst 0x7fcf7f4c4240 1> chain <type_decl 0x7fcf7f61f7b8 E>>
<identifier_node 0x7fcf7f61b900 e0 normal local bindings <(nil)>>
<enumeral_type 0x7fcf7f61cf18 E type_6 VOID
align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x7fcf7f61cf18 precision:0
values <tree_list 0x7fcf7f61de88
purpose <identifier_node 0x7fcf7f61b900 e0
normal local bindings <(nil)>>
value <const_decl 0x7fcf7f625070 e0 type <boolean_type 0x7fcf7f4c1b28
bool>
readonly constant VOID e.C:26:12
align:1 warn_if_not_align:0 context <enumeral_type 0x7fcf7f61cf18
E> initial <integer_cst 0x7fcf7f4c4240 1> chain <type_decl 0x7fcf7f61f7b8 E>>>
context <function_decl 0x7fcf7f608d00 f>
chain <type_decl 0x7fcf7f61f7b8 E>>
e.C:1:29: internal compiler error: 'verify_type' failed
0x1385d10 verify_type(tree_node const*)
/home/jwakely/src/gcc/gcc/gcc/tree.c:14926
0xcdd13d gen_type_die_with_usage
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25731
0xcdeaa6 gen_type_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25962
0xcdf01c modified_type_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:13727
0xce29f1 add_type_attribute
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:21910
0xcf78da gen_typedef_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25638
0xcf78da gen_typedef_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25572
0xcd9f8a gen_decl_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:26604
0xcdc18d gen_member_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25415
0xcdc18d gen_struct_or_union_type_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25511
0xcdc18d gen_tagged_type_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25712
0xcdd42a gen_tagged_type_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25666
0xcdd42a gen_type_die_with_usage
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25907
0xcdeaa6 gen_type_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:25962
0xcd9a52 gen_decl_die
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:26601
0xcdac53 dwarf2out_decl
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:27156
0xcdb1e1 dwarf2out_type_decl
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:26874
0xcdb1e1 dwarf2out_type_decl
/home/jwakely/src/gcc/gcc/gcc/dwarf2out.c:26869
0xfc7994 rest_of_type_compilation(tree_node*, int)
/home/jwakely/src/gcc/gcc/gcc/passes.c:339
0x8fdc63 finish_struct_1(tree_node*)
/home/jwakely/src/gcc/gcc/gcc/cp/class.c:7548
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
More information about the Gcc-bugs
mailing list