4.6.0 20100713 r162159 cross, target arm-unknown-eabi, newlib 1.18 Compile:
arm-unknown-eabi-gcc -O1 -S -o bug.s bug.c With bug.c: --8<-- extern void foo1 (int status) __attribute__ ((__noreturn__)); extern void _Exit (int status) __attribute__ ((__noreturn__)); extern void foo3 (int status) __attribute__ ((__noreturn__)); void foo1 (int status) { _Exit (status); } void _Exit (int status) { foo3 (status); } --8<-- Results in: --8<-- .global _Exit .type _Exit, %function _Exit: @ Function supports interworking. @ Volatile: function does not return. @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 stmfd sp!, {r3, lr} bl foo3 .size _Exit, .-_Exit .align 2 .global foo1 .type foo1, %function foo1: @ Function supports interworking. @ Volatile: function does not return. @ args = 0, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. bx lr .size foo1, .-foo1 --8<-- I.e. foo1() does not call _Exit() while it should. Changing -O1 into another level makes it work and changing _Exit() into another function name (but also marked as noreturn) makes it work as well. -- Summary: Function with attribute noreturn omits a call to another function with noreturn Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: John dot Tytgat at aaug dot net GCC build triplet: x86_64-unknown-linux-gnu GCC host triplet: x86_64-unknown-linux-gnu GCC target triplet: arm-unknown-eabi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44974