[Bug c++/92359] New: function static variable instantiated at -O1 despite extern template

sbence92 at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Nov 4 15:48:00 GMT 2019


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

            Bug ID: 92359
           Summary: function static variable instantiated at -O1 despite
                    extern template
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sbence92 at gmail dot com
  Target Milestone: ---
              Host: all
            Target: all
             Build: all

Created attachment 47169
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47169&action=edit
minimal example

In the below example func is inlined and function_local_static becomes a
defined symbol when compiled with -O1 and above regardless of extern template
class declaration.

The problem is solved by adding -fno-inline to -O1 or -Og, but not with -O2 and
above.
Same can be observed with all gcc versions, clang 5.0+ (works with 4.0.1), icc,
but not with msvc.

This is problematic when one tries to rely on the extern template mechanism in
shared libraries. The result is that function static variables get instantiated
more than 1 times.
Attached you find a minimal example showing exactly this.


template <typename T>
struct S {
  int func() {
    static int function_local_static = 0;
    return ++function_local_static;
  }
};

extern template class S<int>;

int user()
{
    return S<int>().func();
}


More information about the Gcc-bugs mailing list