Bug 3797

Summary: gcc 3.0 fails to emit explicit specialization of a template member
Product: gcc Reporter: Martin Sebor <msebor>
Component: c++Assignee: Kriang Lerdsuwanakij <lerdsuwa>
Status: RESOLVED FIXED    
Severity: normal CC: gcc-bugs
Priority: P3    
Version: 3.0   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed:

Description Martin Sebor 2001-07-24 11:36:00 UTC
Declaring the explicit specialization of the member of the
class template causes the compiler to 'forget' to emit the
out-of-line symbol for the explicit specialization defined
later.

$ cat t.cpp
template <class T>
struct S
{
    int foo () { return 0; }
};

template <>
int S<int>::foo ();

template <>
int S<int>::foo () { return 1; }
$ g++ -c -v t.cpp   
Reading specs from /usr/local/gcc-3.0/lib/gcc-lib/i686-pc-linux-gnu/3.0/specs
Configured with: ../gcc-3.0/configure --prefix=/usr/local/gcc-3.0 --enable-shared
Thread model: single
gcc version 3.0
 /usr/local/gcc-3.0/lib/gcc-lib/i686-pc-linux-gnu/3.0/cc1plus -v -D__GNUC__=3 -D__GNUC_MINOR__=0 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ t.cpp -D__GNUG__=3 -D__GXX_DEPRECATED -D__EXCEPTIONS -D__GXX_ABI_VERSION=100 -quiet -dumpbase t.cpp -version -o /tmp/ccoYegSb.s
GNU CPP version 3.0 (cpplib) (i386 Linux/ELF)
GNU C++ version 3.0 (i686-pc-linux-gnu)
        compiled by GNU C version 2.95.2 19991024 (release).
ignoring nonexistent directory "/usr/local/gcc-3.0/i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/gcc-3.0/include/g++-v3
 /usr/local/gcc-3.0/include/g++-v3/i686-pc-linux-gnu
 /usr/local/gcc-3.0/include/g++-v3/backward
 /usr/local/gcc-3.0/include
 /usr/local/gcc-3.0/lib/gcc-lib/i686-pc-linux-gnu/3.0/include
 /usr/include
End of search list.
 as --traditional-format -V -Qy -o t.o /tmp/ccoYegSb.s
GNU assembler version 2.9.1 (i386-redhat-linux), using BFD version 2.9.1.0.23
$ nm t.o
$

Release:
gcc version 3.0

How-To-Repeat:
template <class T>
struct S
{
    int foo () { return 0; }
};

template <>
int S<int>::foo ();

template <>
int S<int>::foo () { return 1; }
Comment 1 Martin Sebor 2001-07-24 11:36:00 UTC
Fix:
Omit the declaration of the specialization or the definition
of the member of the primary template (neither is acceptable
if the specialization is to exist in a portable library).
Comment 2 Kriang Lerdsuwanakij 2002-05-26 08:08:36 UTC
State-Changed-From-To: open->analyzed
State-Changed-Why: Confirmed.
Comment 3 Kriang Lerdsuwanakij 2002-06-01 08:09:35 UTC
Responsible-Changed-From-To: unassigned->lerdsuwa
Responsible-Changed-Why: Patch in progress.
Comment 4 Kriang Lerdsuwanakij 2002-07-17 07:27:31 UTC
State-Changed-From-To: analyzed->closed
State-Changed-Why: Fixed in the main trunk (future GCC 3.3).
Comment 5 Kriang Lerdsuwanakij 2002-07-17 14:07:43 UTC
From: lerdsuwa@gcc.gnu.org
To: gcc-gnats@gcc.gnu.org
Cc:  
Subject: c++/3797
Date: 17 Jul 2002 14:07:43 -0000

 CVSROOT:	/cvs/gcc
 Module name:	gcc
 Changes by:	lerdsuwa@gcc.gnu.org	2002-07-17 07:07:43
 
 Modified files:
 	gcc/cp         : ChangeLog decl.c 
 
 Log message:
 	PR c++/3797
 	* decl.c (duplicate_decls): Don't propagate inlining parameters from
 	olddecl to newdecl when newdecl is a specialization of the
 	instantiation olddecl.
 
 Patches:
 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.2884&r2=1.2885
 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl.c.diff?cvsroot=gcc&r1=1.920&r2=1.921