On Sun, May 26, 2013 at 1:49 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div class="im"><div><div>On May 24, 2013, at 9:45 AM, Jordan Rose <<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>> wrote:</div><blockquote type="cite">
<div style="word-wrap:break-word"><a href="http://llvm.org/bugs/show_bug.cgi?id=16131" target="_blank">PR16131</a> describes an analyzer assertion on taking the address of an extern void variable:<div><br></div><div><pre style="width:50em;font-size:small;white-space:pre-wrap">
extern void v;
static void f(void) {
        &v;
}
</pre></div><div>Clearly the analyzer shouldn't crash, but I'm surprised that this is legal at all. Yet I can't find anything in the standard actually forbidding it—you can certainly do the same thing with any incomplete struct type. Can somebody confirm that this is at least grammatically correct?</div>
</div></blockquote><br></div></div><div>This is definitely well-formed.</div></div></blockquote><div><br></div><div>In C, I think you're right. In C++, I think it's ill-formed (and gcc and EDG agree). In particular, 'void' is not an object type ([basic.types]p8), so 'v' cannot be a declaration of an object ([intro.object]p1), so it cannot be a declaration of a variable ([basic]p6). Therefore, the 'extern' keyword cannot be applied to the declaration of 'v' ([dcl.stc]p6).</div>
</div>