https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88574
Bug ID: 88574 Summary: -Wmissing-attributes vs -Wattribute-alias=2 wrong for noreturn Product: gcc Version: 9.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: --- The definition of the alias fa() below is diagnosed with -Wall but the definition of ga() is not, despite the fact that the former is safe (and just leads to suboptimal code) while the latter is unsafe (GCC emits code based on the function not returning when it in fact does). $ cat t.c && gcc -S -Wall t.c __attribute__ ((noreturn)) void f (void) { __builtin_abort (); } __attribute__ ((alias ("f"))) void fa (void); void g (void) { } __attribute__ ((alias ("g"), noreturn)) void ga (void); t.c:3:36: warning: ‘fa’ specifies less restrictive attribute than its target ‘f’: ‘noreturn’ [-Wmissing-attributes] 3 | __attribute__ ((alias ("f"))) void fa (void); | ^~ t.c:1:33: note: ‘fa’ target declared here 1 | __attribute__ ((noreturn)) void f (void) { __builtin_abort (); } | ^ $ gcc -S -Wall -Wattribute-alias=2 t.c t.c:3:36: warning: ‘fa’ specifies less restrictive attribute than its target ‘f’: ‘noreturn’ [-Wmissing-attributes] 3 | __attribute__ ((alias ("f"))) void fa (void); | ^~ t.c:1:33: note: ‘fa’ target declared here 1 | __attribute__ ((noreturn)) void f (void) { __builtin_abort (); } | ^ t.c:8:46: warning: ‘ga’ specifies more restrictive attribute than its target ‘g’: ‘noreturn’ [-Wattribute-alias=] 8 | __attribute__ ((alias ("g"), noreturn)) void ga (void); | ^~ t.c:6:6: note: ‘ga’ target declared here 6 | void g (void) { } | ^