> I thought I fixed this!
> It seems to be related to what happens after the call to the noreturn
> function pointer. If there's nothing after it, it doesn't warn, but if
> there's something after it, it does warn.
> Here's another useful and interesting tidbit: if you put the noreturn
> attribute inside the parentheses with the function name, or after the
> parameter list, the problem goes away:
> static void (NORETURN *die_routine)(int i); /* this works */
> static void (*die_routine)(int i) NORETURN; /* so does this */
> static NORETURN void (*die_routine)(int i); /* but not this */
> static void NORETURN (*die_routine)(int i); /* and not this */
> The reason is that, when clang sees the noreturn in the second two
> cases, it hasn't yet seen the whole function header yet, so it tries (in
> vain) to apply it to the return type. What we really want is for clang
> to try to apply it to the function type, not the type it returns. I need
> to figure this out anyway, so calling convention attributes work
> properly in my future patches.
I think clang needs to be able to attach attributes to the declarator
itself, rather than the declaration. C++0x encourages this
interpretation (but, interestingly enough, not for [[noreturn]].
Possibly a defect?).