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

            Bug ID: 71968
           Summary: Type with no linkage in signature: symbols for unique
                    entities link together
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hstong at ca dot ibm.com
  Target Milestone: ---

GCC produces symbols for entities which cannot possibly be referenced from
another translation unit in such a way that distinct entities link together.

In the following program, the templates in question are neither equivalent nor
functionally equivalent.

Online compiler: http://melpon.org/wandbox/permlink/YXAMmVBat8N2aXRe

### SOURCE (a.cc):
extern "C" void abort();
void bar();

namespace {
  struct A { A(int); char sizer[1]; };
}

template <typename T> void foo(char (*)[sizeof A(T(0))]) {
  static unsigned cnt = 0;
  if (cnt++) abort();
}

int main(void) { bar(); foo<int>(0); }


### SOURCE (b.cc):
extern "C" void abort();

namespace {
  struct A { A(int); char sizer[2]; };
}

template <typename T> void foo(char (*)[sizeof A(T(0))]) {
  static unsigned cnt = 0;
  if (cnt++) abort();
}

void bar() { foo<int>(0); }


### COMMANDS:
g++ -c -o a.o -std=c++11 a.cc
g++ -c -o b.o -std=c++11 b.cc
g++ -o a.out a.o b.o
./a.out


### EXPECTED OUTPUT:
rc=0


### ACTUAL OUTPUT:
(aborts)


### COMPILER VERSION INFO (g++ -v):
Using built-in specs.
COLLECT_GCC=/usr/local/gcc-head/bin/g++
COLLECT_LTO_WRAPPER=/usr/local/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/7.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /home/heads/gcc/gcc-source/configure
--prefix=/usr/local/gcc-head --enable-languages=c,c++ --enable-lto
--disable-multilib --without-ppl --without-cloog-ppl --enable-checking=release
--disable-nls
Thread model: posix
gcc version 7.0.0 20160721 (experimental) (GCC)

Reply via email to