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

            Bug ID: 82443
           Summary: Would like a way to control emission of vague/weak
                    symbol for inline variables
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: thiago at kde dot org
  Target Milestone: ---

C++17 introduced inline variables and made all static constexpr members be
implicitly inline. With C++14, this code:

=== header.h ===
struct S
{
    static constexpr int i = 42;
};

=== tu1.cpp ===
#include <header.h>
constexpr int S::i;

=== tu2.cpp ===
#include <header.h>
const void *f() { return &S::i; }

======

Clang 5 and GCC 7.2, when compiled with -std=c++14, emit the S::i symbol in
tu1.o and it's not weak. There's no S::i symbol emitted in tu2.o.

When compiled with -std=c++17, GCC 7 does not emit the symbol in tu1.o. Clang 5
does. Both compilers emit a weak symbol in tu2.o.

ICC 17 with -std=c++14 emits nothing in tu1.o and emits a weak S::i in tu2.o.

This inconsistency is fragile.

Now add -fvisibility=hidden -fvisibility-inlines-hidden: I'd like a way to make
sure that he inline variable is emitted only in my .cpp file. Everywhere else
that needs to take the address will not emit a copy and will get it from my
.so.

Reply via email to