On Fri, 21 Nov 2008, Geert Uytterhoeven wrote:
> > That sounds like your __noreturn macro is wrong.
> > Try using __attribute__ ((__noreturn__))
> > if that works then fix up the __noreturn definitions for the MIPS and gcc
> > you have.
> Nope, gcc is too smart:
> $ cat a.c
> int f(void) __attribute__((__noreturn__));
> int f(void)
> $ gcc -c -Wall a.c
> a.c: In function f:
> a.c:6: warning: `noreturn' function does return
Hmm, in the case of your example the warning is justified, because the
(virtual) "return" statement of your function is in a unconditional block.
Otherwise it looks like the attribute is useless -- it looks like it can
only be used for functions where GCC can determine the function does not
return anyway. Which means it is redundant.
The cases where within the function concerned there is a volatile asm or
a conditional block which cannot be determined with simple static analysis
that it does stop look like legitimate ones for the use of the "noreturn"
attribute and my opinion is GCC should not warn about them with -Wall,
though a separate -W<whatever> option for the inquisitive would make sense
to me. It might be worthwhile to have a look into archives of the GCC
mailing lists to see how the implementation has evolved into the current
form and if no useful conclusion can be made, to bring the issue now
and/or file a bug report.