http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60274

            Bug ID: 60274
           Summary: String as template parameter - regression in 4.8.2
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ondrej.kolacek1 at centrum dot cz

Greetings, this issue happened to me with Debian's g++ so it is possible it is
just their bug but hopefully (well this is debatable :) ) it is not.


<begin file test.cpp>
typedef const char *const&  ProtocolIdType;
//typedef int ProtocolIdType;

template <ProtocolIdType protocolId>
class C {
public:
    typedef int ProtocolVersion;

    class D
    {
    public:
        ProtocolVersion GetProtocolVersion();
    };

};
template <ProtocolIdType protocolId>
typename C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion()
{
    return 1;
}

int main(void)
{
}
<end file test.cpp>

>g++ test.cpp
test.cpp:18:41: error: prototype for ‘typename C<protocolId>::ProtocolVersion
C<protocolId>::D::GetProtocolVersion()’ does not match any in class
‘C<protocolId>::D’
 typename C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion()
                                         ^
test.cpp:13:19: error: candidate is: C<protocolId>::ProtocolVersion
C<protocolId>::D::GetProtocolVersion()
   ProtocolVersion GetProtocolVersion();


The code used to work for ages, is compilable with MSVC, clang and gcc on
various platforms, was compilable with 4.8.1 but broke with 4.8.2. The issue is
with string template parameter; replacing 
typedef const char *const&  ProtocolIdType;
by 
typedef int ProtocolIdType;
makes the error go away.


> g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.8.2-15'
--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-amd64/jre --enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-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 --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.8.2 (Debian 4.8.2-15)

Reply via email to