https://gcc.gnu.org/g:e1844765af501eb044598e4dc6ad8e729948f7bc
commit r16-8465-ge1844765af501eb044598e4dc6ad8e729948f7bc Author: Roger Sayle <[email protected]> Date: Sat Apr 4 13:57:55 2026 +0100 PR c++/124573: ICE on invalid P4 regression This patch addresses PR c++/124573 by making finish_enum_value_list more robust to DECL_INITIAL being NULL, which I believe only occurs in the event of an error, and treating it as integer_zero_node for the purposes of error recovery. 2026-04-04 Roger Sayle <[email protected]> gcc/cp/ChangeLog PR c++/124573 * decl.cc (finish_enum_value_list): Defend against a DECL_INITIAL being NULL during error recovery. gcc/testsuite/ChangeLog PR c++/124573 * g++.dg/other/enum4.C: New test case. Diff: --- gcc/cp/decl.cc | 4 +++- gcc/testsuite/g++.dg/other/enum4.C | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index feaca1c3f52a..eb9699529126 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -19081,7 +19081,7 @@ finish_enum_value_list (tree enumtype) /* Update the minimum and maximum values, if appropriate. */ value = DECL_INITIAL (decl); - if (TREE_CODE (value) != INTEGER_CST) + if (!value || TREE_CODE (value) != INTEGER_CST) value = integer_zero_node; /* Figure out what the minimum and maximum values of the enumerators are. */ @@ -19234,6 +19234,8 @@ finish_enum_value_list (tree enumtype) value = perform_implicit_conversion (underlying_type, DECL_INITIAL (decl), tf_warning_or_error); + if (!value) + value = integer_zero_node; /* Do not clobber shared ints. But do share identical enumerators. */ value = fold_convert (enumtype, value); diff --git a/gcc/testsuite/g++.dg/other/enum4.C b/gcc/testsuite/g++.dg/other/enum4.C new file mode 100644 index 000000000000..c5136bd33085 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/enum4.C @@ -0,0 +1,19 @@ +/* PR c++/124573 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-require-effective-target c++11 } */ + +template <typename T> +struct A { + enum E : T; +}; + +using X = A<int>; + +template <typename T> +enum X::E : /* { dg-error "cannot add an enumerator list" } */ + T { e1 }; /* { dg-error "different underlying type" } */ + +template <> +enum A<int>::E : int {}; +
