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)