Bug 65309 - [4.9 Regression] Executes wrong function inside an anonymous namespace on runtime
Summary: [4.9 Regression] Executes wrong function inside an anonymous namespace on run...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.9.2
: P1 normal
Target Milestone: 4.9.3
Assignee: Jason Merrill
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2015-03-04 10:50 UTC by Albert Astals Cid
Modified: 2015-03-04 18:14 UTC (History)
6 users (show)

See Also:
Host:
Target:
Build:
Known to work: 4.8.4, 4.9.2, 5.0
Known to fail: 4.9.3
Last reconfirmed: 2015-03-04 00:00:00


Attachments
tar.gz containing files to reproduce (837 bytes, application/binary)
2015-03-04 10:50 UTC, Albert Astals Cid
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Albert Astals Cid 2015-03-04 10:50:01 UTC
Created attachment 34947 [details]
tar.gz containing files to reproduce

To be honest the summary is probably wrong, not much of a compiler expert myself

I have this code that when compiled with gcc 4.9.2 and -g fails but works with -O2 (also works with 4.8.2 whenever the flags used)

Fails when printing:
a.cpp
a.cpp

Works if printing:
a.cpp
b.cpp

This is affecting Qt since this is reduced test case from Qt sources

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.2-10ubuntu7' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.2 (Ubuntu 4.9.2-10ubuntu7)
Comment 1 Albert Astals Cid 2015-03-04 10:51:24 UTC
Works fine with

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.8/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-i386/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-i386 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-i386 --with-arch-directory=i386 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-targets=all --enable-multiarch --disable-werror --with-arch-32=i686 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
Comment 2 Markus Trippelsdorf 2015-03-04 11:05:44 UTC
I cannot reproduce this. What linker are you using?
Comment 3 Albert Astals Cid 2015-03-04 11:16:14 UTC
I guess i'm using the system default one, that would be

$ `which ld` -V
GNU ld (GNU Binutils for Ubuntu) 2.25
  Supported emulations:
   elf_x86_64
   elf32_x86_64
   elf_i386
   i386linux
   elf_l1om
   elf_k1om
   i386pep
   i386pe

I'm not the only one with this problem, doesn't seem to be Ubuntu specific either, see http://lists.qt-project.org/pipermail/development/2015-March/020632.html
Comment 4 Markus Trippelsdorf 2015-03-04 11:22:05 UTC
Does it also happens with -fuse-ld=gold?
Comment 5 ecloud 2015-03-04 11:26:36 UTC
I can also reproduce this on Arch linux.

Yes it still fails if I change the Makefile to set

LINK          = g++ -fuse-ld=gold

However changing

CXX           = g++ -O2

makes it pass.

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /build/gcc-multilib/src/gcc-4.9-20150204/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 4.9.2 20150204 (prerelease) (GCC)
Comment 6 Albert Astals Cid 2015-03-04 11:30:21 UTC
Same as ecloud, also fails if using gold.
Comment 7 Markus Trippelsdorf 2015-03-04 11:30:50 UTC
Confirmed on 4.9 branch. I was using 4.9 release first. 
Bisecting.
Comment 8 Sergio Martins 2015-03-04 11:32:07 UTC
gcc-4.9.2 $ nm gccbug  | c++filt  | grep operator
00000000004008ea W GlobalStatic<Bar, (anonymous namespace)::innerFunction()>::operator()()

00000000004008ea W GlobalStatic<Bar, (anonymous namespace)::innerFunction()>::operator()()

gcc-4.8.4 $ nm gccbug  | c++filt  | grep operator
00000000004008cc t GlobalStatic<Bar, (anonymous namespace)::innerFunction()>::operator()()
00000000004009a4 t GlobalStatic<Bar, (anonymous namespace)::innerFunction()>::operator()()

With 4.9.2 the address of both operator()() is the same
Comment 9 Markus Trippelsdorf 2015-03-04 11:43:57 UTC
Started with r219305.
Comment 10 Richard Biener 2015-03-04 12:16:59 UTC
Confirmed also on trunk.  P1 because of a regression on the branch that wasn't released yet.
Comment 11 Markus Trippelsdorf 2015-03-04 13:35:49 UTC
The issue was fixed on trunk by r220991.
Comment 12 Jason Merrill 2015-03-04 18:14:03 UTC
Fixed for 4.9.3.
Comment 13 Jason Merrill 2015-03-04 18:14:16 UTC
Author: jason
Date: Wed Mar  4 18:13:44 2015
New Revision: 221192

URL: https://gcc.gnu.org/viewcvs?rev=221192&root=gcc&view=rev
Log:
	PR c++/65209
	PR c++/65309
	* decl2.c (constrain_visibility_for_template): Handle reference
	arguments.

Added:
    branches/gcc-4_9-branch/gcc/testsuite/g++.dg/abi/anon4.C
Modified:
    branches/gcc-4_9-branch/gcc/cp/ChangeLog
    branches/gcc-4_9-branch/gcc/cp/decl2.c