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)

Reply via email to