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 {};
+

Reply via email to