https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100069
Bug ID: 100069
Summary: function redeclaration with noreturn not rejected
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
In [dcl.attr.noreturn] the C++ standard specifies that
The first declaration of a function shall specify the noreturn attribute if
any declaration of that function specifies the noreturn attribute.
The test case below shows that GCC fails to enforce this constraint for
declarations in different scopes.
$ cat t.C && gcc -O2 -S -Wall -Wextra -Wpedantic t.C
void g ()
{
void f ();
}
void h ()
{
[[noreturn]] void f ();
}
void ff ();
[[noreturn]] void ff ();
t.C:12:19: error: function ‘void ff()’ declared ‘[[noreturn]]’ but its first
declaration was not
12 | [[noreturn]] void ff ();
| ^~
t.C:11:6: note: previous declaration of ‘void ff()’
11 | void ff ();
| ^~
In contrast, Clang issues errors for both redeclarations:
t.C:8:5: error: function declared '[[noreturn]]' after its first declaration
[[noreturn]] void f ();
^
t.C:3:8: note: declaration missing '[[noreturn]]' attribute is here
void f ();
^
t.C:12:3: error: function declared '[[noreturn]]' after its first declaration
[[noreturn]] void ff ();
^
t.C:11:6: note: declaration missing '[[noreturn]]' attribute is here
void ff ();
^
2 errors generated.