aboutsummaryrefslogtreecommitdiff
path: root/gcc/c/c-decl.cc
diff options
context:
space:
mode:
authorJoseph Myers <josmyers@redhat.com>2024-01-31 21:39:53 +0000
committerJoseph Myers <josmyers@redhat.com>2024-01-31 21:39:53 +0000
commitd22d1a9346f27db41459738c6eb404f8f0956e6f (patch)
treea93a318d7de1910284f57126083cddcc180583f7 /gcc/c/c-decl.cc
parent8123f3ca3fd891034a8366518e756f161c4ff40d (diff)
downloadgcc-d22d1a9346f27db41459738c6eb404f8f0956e6f.zip
gcc-d22d1a9346f27db41459738c6eb404f8f0956e6f.tar.gz
gcc-d22d1a9346f27db41459738c6eb404f8f0956e6f.tar.bz2
c: Fix ICE for nested enum redefinitions with/without fixed underlying type [PR112571]
Bug 112571 reports an ICE-on-invalid for cases where an enum is defined, without a fixed underlying type, inside the enum type specifier for a definition of that same enum with a fixed underlying type. The ultimate cause is attempting to access ENUM_UNDERLYING_TYPE in a case where it is NULL. Avoid this by clearing ENUM_FIXED_UNDERLYING_TYPE_P in thie case of inconsistent definitions. Bootstrapped wth no regressions for x86_64-pc-linux-gnu. PR c/112571 gcc/c/ * c-decl.cc (start_enum): Clear ENUM_FIXED_UNDERLYING_TYPE_P when defining without a fixed underlying type an enumeration previously declared with a fixed underlying type. gcc/testsuite/ * gcc.dg/c23-enum-9.c, gcc.dg/c23-enum-10.c: New tests.
Diffstat (limited to 'gcc/c/c-decl.cc')
-rw-r--r--gcc/c/c-decl.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 8d18a3e..934e557 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -9905,8 +9905,11 @@ start_enum (location_t loc, struct c_enum_contents *the_enum, tree name,
if (ENUM_FIXED_UNDERLYING_TYPE_P (enumtype)
&& fixed_underlying_type == NULL_TREE)
- error_at (loc, "%<enum%> declared with but defined without "
- "fixed underlying type");
+ {
+ error_at (loc, "%<enum%> declared with but defined without "
+ "fixed underlying type");
+ ENUM_FIXED_UNDERLYING_TYPE_P (enumtype) = false;
+ }
the_enum->enum_next_value = integer_zero_node;
the_enum->enum_type = enumtype;