diff options
-rw-r--r-- | gcc/c/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/enum-redef-1.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr79983.c | 2 |
5 files changed, 42 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 4944696..533aebc 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,7 @@ +2019-08-08 Richard Sandiford <richard.sandiford@arm.com> + + * c-decl.c (finish_enum): Clear C_TYPE_BEING_DEFINED. + 2019-08-08 Jakub Jelinek <jakub@redhat.com> * c-typeck.c (c_finish_omp_clauses): For C_ORT_OMP diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index f85f481..9859cc7 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -8781,6 +8781,8 @@ finish_enum (tree enumtype, tree values, tree attributes) && !in_sizeof && !in_typeof && !in_alignof) struct_parse_info->struct_types.safe_push (enumtype); + C_TYPE_BEING_DEFINED (enumtype) = 0; + return enumtype; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ed8aab..a9f6c54 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-08-08 Richard Sandiford <richard.sandiford@arm.com> + + * gcc.dg/pr79983.c (enum E): Don't allow an error about nested + definitions. + * gcc.dg/enum-redef-1.c: New test. + 2019-08-08 Marek Polacek <polacek@redhat.com> PR c++/87519 - bogus warning with -Wsign-conversion. diff --git a/gcc/testsuite/gcc.dg/enum-redef-1.c b/gcc/testsuite/gcc.dg/enum-redef-1.c new file mode 100644 index 0000000..b3fa6cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/enum-redef-1.c @@ -0,0 +1,29 @@ +enum a { A }; +enum a { B }; /* { dg-bogus "nested redefinition" } */ +/* { dg-error "redeclaration of 'enum a'" "" { target *-*-* } .-1 } */ + +enum empty {}; /* { dg-error "empty enum is invalid" } */ +enum empty {}; /* { dg-bogus "nested redefinition" } */ +/* { dg-error "empty enum is invalid" "" { target *-*-* } .-1 } */ + +enum nested_first { + C1 = sizeof(enum nested_first { C1a }), /* { dg-error "nested redefinition of 'enum nested_first" } */ + C2 = sizeof(enum nested_first { C2a }) /* { dg-error "redeclaration of 'enum nested_first'" "" } */ +}; + +enum nested_second { + D1, + D2 = sizeof(enum nested_second { D2a }), /* { dg-error "nested redefinition of 'enum nested_second" } */ + D3 = sizeof(enum nested_second { D3a }) /* { dg-error "redeclaration of 'enum nested_second'" "" } */ +}; + +enum nested_repeat { E }; +enum nested_repeat { /* { dg-error "redeclaration of 'enum nested_repeat'" "" } */ + F = sizeof(enum nested_repeat { Fa }) /* { dg-error "nested redefinition of 'enum nested_repeat" } */ +}; + +enum nested_empty { + G1 = sizeof(enum nested_empty {}), /* { dg-error "nested redefinition of 'enum nested_empty" } */ + /* { dg-error "empty enum is invalid" "" { target *-*-* } .-1 } */ + G2 = sizeof(enum nested_empty { G2a }) +}; diff --git a/gcc/testsuite/gcc.dg/pr79983.c b/gcc/testsuite/gcc.dg/pr79983.c index 84aae69..1e292d4 100644 --- a/gcc/testsuite/gcc.dg/pr79983.c +++ b/gcc/testsuite/gcc.dg/pr79983.c @@ -8,7 +8,7 @@ struct S { int i, j; }; /* { dg-error "redefinition of 'struct S'" } */ enum E; enum E { A, B, C }; /* { dg-message "originally defined here" } */ -enum E { D, F }; /* { dg-error "nested redefinition of 'enum E'|redeclaration of 'enum E'" } */ +enum E { D, F }; /* { dg-error "redeclaration of 'enum E'" } */ union U; union U { int i; }; /* { dg-message "originally defined here" } */ |