https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65879
Bug ID: 65879 Summary: Bogus linkage errors for member class of anonymous class Product: gcc Version: 4.9.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: tim.bagot at hds dot com The following C++ snippet: static struct { void f(); struct Inner { void g(); }; } x; results in: $ gcc -c test.cpp test.cpp:6:14: error: anonymous type with no linkage used to declare function 'void<anonymous struct>::Inner::g()' with linkage [-fpermissive] void g(); ^ I think this error is incorrect. - C++98 does not seem to define what it means for a type to be "used" in a declaration. (C++11 is clearer - and indeed -std=c++11 makes the error disappear.) But even if you take a broad interpretation, it is hard to see how it could apply to g() but not to f(). - The function g() does not have linkage. As a class member, it can only have linkage if Inner has linkage. Inner can only have linkage if the outer class has linkage. The outer class, being anonymous, does not have linkage (else there would be no error). Therefore g() does not have linkage. (And again if g() did have linkage, then f() surely must as well.) This is a regression, as 4.4 does not report this error. The bug is perhaps somewhat related to PR 55877 - but that (as I read it) involves specifically the typedef struct idiom, and is marked FIXED in 4.9. For completeness: $ 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='Debian 4.9.2-10' --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 --with-arch-32=i586 --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 (Debian 4.9.2-10)