https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77555

            Bug ID: 77555
           Summary: unused inline function in-function static variable
                    accessed from outside leads to linker error
           Product: gcc
           Version: 6.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marmoo1024 at gmail dot com
  Target Milestone: ---

Created attachment 39603
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39603&action=edit
examples showing the behavior.

Two part problem,

==== Part one

Unused inline functions can cause static variables to be instantiated by
constexpr variable taking the address of the static variable. The attached
test.cpp shows it working.

=== Part two ===

In-function static variables can be made visible outside, through templates,
and this causes a linker error. Not a compilation error.

test2.cpp:(.text._ZZN9someclass6unusedEvEN6getter3getEv[_ZZN9someclass6unusedEvEN6getter3getEv]+0x7):
undefined reference to `someclass::unused()::function_static'

The error happens with g++ 4.8.5, 5.3.0, 6.1.1, with -std=c++11, -std=c++14,
-std=c++1z. clang++-3.5 crashes, 3.8 and 3.9 compiles and objdump shows that
the in-function static variables are instantiated but the function is not
emitted (since it's implicitly inline). Any static variable that's not used is
not instantiated. The attached test2.cpp shows this. Naturally the behavior
doesn't change if the class is instantiated, and is not affected by
optimization, which I believe in gcc has extra control flow analysis. The only
difference to the error with optimization is that with O1 or above the unused
reference is from _GLOBAL__sub_I_main.

IMHO, gcc should follow the example of clang and instantiate static variables
if they're referenced. Definitely not a linker error, I don't know if part one
is required by the standard, but it seems plausible either way. If so, the
compiler should detect the use of such static variables and emit them.

Reply via email to