>Submitter-Id:  net
>Originator:    Matt Kern
>Organization:  none
>Confidential:  no
>Synopsis:      invalid template instantiations
>Severity:      serious
>Priority:      medium
>Category:      c++
>Class:         rejects-legal
>Release:       3.3 (Debian) (Debian testing/unstable)
>Environment:
System: Linux xanadu 2.4.20pre7int #1 SMP Thu Nov 14 17:17:34 GMT 2002 i686 
GNU/Linux
Architecture: i686
        
host: i386-pc-linux-gnu
build: i386-pc-linux-gnu
target: i386-pc-linux-gnu
configured with: ../src/configure -v 
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr 
--mandir=/usr/share/man --infodir=/usr/share/info 
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib 
--enable-nls --without-included-gettext --enable-__cxa_atexit 
--enable-clocale=gnu --enable-debug --enable-java-gc=boehm 
--enable-java-awt=xlib --enable-objc-gc i386-linux
>Description:
I am having problems manually instantiating some template functions.

>How-To-Repeat:
I can compile the following code into an executable with no problems:

    g++-3.3 test.cpp -o test

If I attempt to compile with -fno-implicit-templates it will obviously
throw up missing symbols:

    g++-3.3 test.cpp -o test -fno-implicit-templates

I repeatedly instantiated those symbols to give the template lines in
the code below.  The problem is in the macro-ed out line.  If you
define this on the compile line it throws up:

test.cpp:31: error: template-id `
   fill_n<__gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*>
   >**, unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const char* const,
   TestClass*> >*>' for `__gnu_cxx::_Hashtable_node<std::pair<const char*
   const, TestClass*> >** fill_n(__gnu_cxx::_Hashtable_node<std::pair<const
   char* const, TestClass*> >*, unsigned int,
   __gnu_cxx::_Hashtable_node<std::pair<const char* const, TestClass*> >*
   const&)' does not match any template declaration

This is despite the fact that the instantiation is basically cut and
pasted from a diff of the missing symbols on a partial compile (no link):


  g++-3.3 test.cpp -c -o test1.o
  g++-3.3 test.cpp -c -o test2.o -fno-implicit-templates
  nm --demangle test1.o >a
  nm --demangle test2.o >b
  diff a b
116c116
<          U __gnu_cxx::_Hashtable_node<std::pair<char const* const, 
TestClass*> >** std::fill_n<__gnu_cxx::_Hashtable_node<std::pair<char const* 
const, TestClass*> >**, unsigned, __gnu_cxx::_Hashtable_node<std::pair<char 
const* const, TestClass*> >*>(__gnu_cxx::_Hashtable_node<std::pair<char const* 
const, TestClass*> >*, unsigned, __gnu_cxx::_Hashtable_node<std::pair<char 
const* const, TestClass*> >* const&)
---
> 00000000 W __gnu_cxx::_Hashtable_node<std::pair<char const* const, 
> TestClass*> >** std::fill_n<__gnu_cxx::_Hashtable_node<std::pair<char const* 
> const, TestClass*> >**, unsigned, __gnu_cxx::_Hashtable_node<std::pair<char 
> const* const, TestClass*> >*>(__gnu_cxx::_Hashtable_node<std::pair<char 
> const* const, TestClass*> >*, unsigned, 
> __gnu_cxx::_Hashtable_node<std::pair<char const* const, TestClass*> >* const&)


==================== CODE BEGINS ====================
#include <typeinfo>
#include <ext/hash_map>
using namespace std;
using namespace __gnu_cxx;


class TestClass;


int main ()
{
  hash_map<const char*, TestClass*> M;
  M["testing"] = 0;
  return 0;
}


template pair<char const* const, TestClass*>& hashtable<pair<char const* const, 
TestClass*>, char const*, hash<char const*>, _Select1st<pair<char const* const, 
TestClass*> >, equal_to<char const*>, allocator<TestClass*> 
>::find_or_insert(pair<char const* const, TestClass*> const&);

template void hashtable<pair<char const* const, TestClass*>, char const*, 
hash<char const*>, _Select1st<pair<char const* const, TestClass*> >, 
equal_to<char const*>, allocator<TestClass*> >::resize(unsigned);

template void vector<_Hashtable_node<pair<char const* const, TestClass*> >*, 
allocator<TestClass*> >::reserve(unsigned);

template void vector<_Hashtable_node<pair<char const* const, TestClass*> >*, 
allocator<TestClass*> 
>::_M_fill_insert(__normal_iterator<_Hashtable_node<pair<char const* const, 
TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, 
allocator<TestClass*> > >, unsigned, _Hashtable_node<pair<char const* const, 
TestClass*> >* const&);

template void fill<__normal_iterator<_Hashtable_node<pair<char const* const, 
TestClass*> >**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, 
allocator<TestClass*> > >, _Hashtable_node<pair<char const* const, TestClass*> 
>*>(__normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> >**, 
vector<_Hashtable_node<pair<char const* const, TestClass*> >*, 
allocator<TestClass*> > >, __normal_iterator<_Hashtable_node<pair<char const* 
const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, 
TestClass*> >*, allocator<TestClass*> > >, _Hashtable_node<pair<char const* 
const, TestClass*> >* const&);

template void hashtable<pair<char const* const, TestClass*>, char const*, 
hash<char const*>, _Select1st<pair<char const* const, TestClass*> >, 
equal_to<char const*>, allocator<TestClass*> >::clear();

#ifdef STOP_WORKING
template _Hashtable_node<pair<char const* const, TestClass*> >** 
fill_n<_Hashtable_node<pair<char const* const, TestClass*> >**, unsigned, 
_Hashtable_node<pair<char const* const, TestClass*> 
>*>(_Hashtable_node<pair<char const* const, TestClass*> >*, unsigned, 
_Hashtable_node<pair<char const* const, TestClass*> >* const&);
#endif

template __normal_iterator<_Hashtable_node<pair<char const* const, TestClass*> 
>**, vector<_Hashtable_node<pair<char const* const, TestClass*> >*, 
allocator<TestClass*> > > fill_n<__normal_iterator<_Hashtable_node<pair<char 
const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, 
TestClass*> >*, allocator<TestClass*> > >, unsigned, _Hashtable_node<pair<char 
const* const, TestClass*> >*>(__normal_iterator<_Hashtable_node<pair<char 
const* const, TestClass*> >**, vector<_Hashtable_node<pair<char const* const, 
TestClass*> >*, allocator<TestClass*> > >, unsigned, _Hashtable_node<pair<char 
const* const, TestClass*> >* const&);

template unsigned long const* lower_bound<unsigned long const*, unsigned 
long>(unsigned long const*, unsigned long const*, unsigned long const&);
==================== CODE END ====================

>Fix:
None.


Reply via email to