<div dir="ltr">On Wed, Oct 16, 2013 at 4:30 PM, Justin Bogner <span dir="ltr"><<a href="mailto:mail@justinbogner.com" target="_blank">mail@justinbogner.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The following program fails to link when built with -O0:<br>
<br>
    inline void func(void) { }<br>
<br>
    int main(int argc, const char *argv[]) {<br>
      void (*f)(void) = func;<br>
      f();<br>
      return 0;<br>
    }<br>
<br>
This is because `func` has GVA_C99Inline linkage, so we decide that an<br>
external definition is available and we don't need to emit the inline<br>
definition. Since we use `func` through a function pointer, we end up<br>
referencing and undefined symbol.<br>
<br>
Is this correct? The C99 and C11 standards aren't very clear on whether<br>
or not this is allowed. The relevant paragraph is n1570 6.7.4, p7:<br>
<br>
    Any function with internal linkage can be an inline function. For a<br>
    function with external linkage, the following restrictions apply: If<br>
    a function is declared with an inline function specifier, then it<br>
    shall also be defined in the same translation unit. If all of the<br>
    file scope declarations for a function in a translation unit include<br>
    the inline function specifier without extern, then the definition in<br>
    that translation unit is an inline definition. An inline definition<br>
    does not provide an external definition for the function, and does<br>
    not forbid an external definition in another translation unit. An<br>
    inline definition provides an alternative to an external definition,<br>
    which a translator may use to implement any call to the function in<br>
    the same translation unit. It is unspecified whether a call to the<br>
    function uses the inline definition or the external definition.<br>
<br>
I think this says that a separate extern definition is needed, but also<br>
that it's acceptable to call the inline function here.</blockquote><div><br></div><div>Right. It's unspecified whether we use the inline definition, so we're allowed (but not required) to reject this code.</div>
</div></div></div>