[Bug c++/11652] New: incorrect template instantiation in some circumstances
yangg2 at rpi dot edu
gcc-bugzilla@gcc.gnu.org
Wed Jul 23 22:34:00 GMT 2003
PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11652
Summary: incorrect template instantiation in some circumstances
Product: gcc
Version: 3.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: yangg2 at rpi dot edu
CC: gcc-bugs at gcc dot gnu dot org
---------------- temp.cxx ---------------------------------
#include <vector>
#include <iostream>
// a template class definition
// but it cannot be instantiated without
// the definition of function by_val()
template<class T>
class container {
T a;
T* b;
public:
T* by_addr() const { return b; }
T by_val() const;
int size() const { return 100; }
};
class trace_pt {
int i;
};
// with template class definition
// we can define varibles in template type
// note that this variable definition would not
// trigger template instantiation because it still
// lacks of one member function
class trace {
container<trace_pt> a_;
public:
int size() const { return a_.size(); }
};
// supply member function definition here
template<class T>
T container<T>::by_val() const
{
return a;
}
// do explicit template instantiation
// At this point, it should be able to
// compile the template code
template class container<trace_pt>;
------------------------ END -------------------------------
Symtom: GCC3.3 would not generate (extern) symbol and code for
container<trace_pt>::size() function. But some other previous versions of GCC
do NOT have this problem (including GCC 2.95, 3.04, and 3.2).
Here are the nm results from object files of different GCC versions:
pre yangg2 $ g++295 -o temp.o -c temp.cxx
pre yangg2 $ nm -Cg temp.o | grep size
00000000 W container<trace_pt>::size(void) const
pre yangg2 $ g++304 -o temp.o -c temp.cxx
pre yangg2 $ nm -Cg | grep size
00000000 W container<trace_pt>::size() const
pre yangg2 $ g++33 -o temp.o -c temp.cxx
pre yangg2 $ nm -Cg temp.o | grep size
pre yangg2 $
pre yangg2 $ nm -C temp.o | grep by_addr
00000000 W container<trace_pt>::by_addr() const
As we can see, only GCC3.3 does not generate the code for function
container<trace_pt>::size() and this function only.
----------- My GCC configurations -----------------
pre yangg2 $ g++295 -v
Using builtin specs.
gcc version 2.95.4 20020320 [FreeBSD]
pre yangg2 $ g++33 -v
Reading specs from /usr/local/bin/../lib/gcc-lib/i386-unknown-
freebsd4.8/3.3/specs
Configured with: ../gcc-3.3/configure --prefix=/software/gcc-3.3-0/pkg --
localstatedir=/var --disable-nls --program-suffix=33 --enable-shared --enable-
version-specific-runtime-libs
Thread model: posix
gcc version 3.3
pre yangg2 $ gcc304 -v
Reading specs from /usr/local/bin/../lib/gcc-lib/i386-unknown-
freebsd4.5/3.0.4/specs
Configured with: ../gcc-3.0.4/configure --prefix=/servers/sys/packages/gcc-
3.0.4-1 --enable-version-specific-runtime-libs
Thread model: posix
gcc version 3.0.4
-------------------- end -------------------------------
More information about the Gcc-bugs
mailing list