https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100068
Bug ID: 100068 Summary: inconsistent handling of noreturn on nested function declarations 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: --- For the test case below, in f1() GCC (in both C and C++ modes) emits just one call to g1() while Clang, ICC emit two. Visual C gives an error for the noreturn mismatch between the two declarations of g1(). In f0(), all compilers emit just one call to g0() (Visual C with optimization; without optimization it warns about the second call to g0() being unreachable). $ cat a.c && gcc -O -S -Wall -fdump-tree-optimized=/dev/stdout a.c void f0 (void) { extern __attribute__ ((noreturn)) int g0 (void); { extern int g0 (void); } g0 (); g0 (); // eliminated by all tested compilers } void f1 (void) { extern int g1 (void); { extern __attribute__ ((noreturn)) int g1 (void); } g1 (); g1 (); // eliminated by GCC, emitted by Clang and ICC } ;; Function f0 (f0, funcdef_no=0, decl_uid=1943, cgraph_uid=1, symbol_order=0) (executed once) void f0 () { <bb 2> [local count: 1073741824]: g0 (); } ;; Function f1 (f1, funcdef_no=1, decl_uid=1952, cgraph_uid=2, symbol_order=1) (executed once) void f1 () { <bb 2> [local count: 1073741824]: g1 (); }