On Sun, Apr 1, 2018 at 7:34 AM, Jason Vas Dias <[email protected]> wrote:
> And even worse, the obvious workaround does not work:
>
> static inline __attribute__((always_inline))
> void foo(void) {}
>
> // static inline __attribute__((always_inline, alias("foo")))
> // void bar(void);
>
> static inline __attribute__((always_inline))
> void (&bar)(void) = foo;
>
> void f(void)
> { bar();
> }
> So one has to do just
> static
> void (&bar) ( void ) = foo;
>
> So now foo() has lost its inline-ness:
>
> $ nm -C t.o
> 0000000000000007 T f()
> 0000000000000000 r bar
> 0000000000000000 t foo()
That's a missed-optimization bug, the compiler should be able to see
through the reference and inline foo(). But it probably won't be
fixed for GCC 8.
> ie. the compiler did not warn that foo
> has been made into an ordinary symbol:
>
> '
> $ cat t.c
> static inline __attribute__((always_inline))
> void foo(void) {}
> static
> void (&bar)(void) = foo;
> void f(void){ bar();}
> $ g++ -std=gnu++11 -x c++ -Wall -Wextra -c t.c
> $
> '
> I think g++ should have warned that it is not treating
> an always inline function as inline here !
Yes, we should probably warn about emitting an always_inline function.
Jason