https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89878
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |rejects-valid
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
The converse of accepting multiple definitions of the same symbol is that valid
redeclarations of the same symbol are rejected as shown in the test case below:
$ cat z.C && gcc -c -Wall -std=c++2a z.C
struct A1 { char c[5]; };
template <A1> struct B { };
typedef B<A1{ { 'A' } }> A_A____;
typedef B<A1{ { 'A', 0 } }> A_AZ___;
typedef B<A1{ { 'A', 0, 0 } }> A_AZZ__;
typedef B<A1{ { 'A', 0, 0, 0 } }> A_AZZZ_;
typedef B<A1{ { 'A', 0, 0, 0, 0 } }> A_AZZZZ;
extern A_A____ same_type_B_A1_A;
extern A_AZ___ same_type_B_A1_A;
extern A_AZZ__ same_type_B_A1_A;
extern A_AZZZ_ same_type_B_A1_A;
extern A_AZZZZ same_type_B_A1_A;
z.C:12:16: error: conflicting declaration ‘A_AZ___ same_type_B_A1_A’
12 | extern A_AZ___ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:11:16: note: previous declaration as ‘A_A____ same_type_B_A1_A’
11 | extern A_A____ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:13:16: error: conflicting declaration ‘A_AZZ__ same_type_B_A1_A’
13 | extern A_AZZ__ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:11:16: note: previous declaration as ‘A_A____ same_type_B_A1_A’
11 | extern A_A____ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:14:16: error: conflicting declaration ‘A_AZZZ_ same_type_B_A1_A’
14 | extern A_AZZZ_ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:11:16: note: previous declaration as ‘A_A____ same_type_B_A1_A’
11 | extern A_A____ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:15:16: error: conflicting declaration ‘A_AZZZZ same_type_B_A1_A’
15 | extern A_AZZZZ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~
z.C:11:16: note: previous declaration as ‘A_A____ same_type_B_A1_A’
11 | extern A_A____ same_type_B_A1_A;
| ^~~~~~~~~~~~~~~~