>Submitter-Id:  net
>Originator:    Franck Branjonneau
>Organization:  
>Confidential:  no
>Synopsis:       ice-on-legal-code or rejects-legal on bad instanciation path
>Severity:      
>Priority:      
>Category:       c++
>Class:          ice-on-legal-code
>Release:       3.3.3 (Debian 20040401) (Debian testing/unstable)
>Environment:
System: Linux alpha.tchume.net 2.6.6 #1 SMP Mon May 10 15:37:10 UTC 2004 x86_64 
GNU/Linux
Architecture: x86_64

        
host: i486-pc-linux-gnu
build: i486-pc-linux-gnu
target: i486-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 i486-linux
>Description:
        
g++-3.4 compiles the following code:

#include <iterator>
#include <vector>


template< unsigned _k >
struct I {};

template< unsigned _k >
struct C {

 typedef I< _k > I;

 struct S {};

};

template< unsigned _k >
struct A;

template< unsigned _k >
struct S {

 typedef A< _k > A;

 typedef typename A::IS IS;


 template< int, unsigned _dummy= _k >
 struct Foo;

 template< typename _Iterator >
 inline _Iterator
 foo(
   _Iterator target) const;


 typename A::IS s1_; // # 1
 typename C< _k >::S s2_; // # 2

};

 template< unsigned _k >
 struct A {

  typedef C< _k > C;

  typedef typename C::S IS;

 };


 template< unsigned _k >
 template< unsigned _dummy >
 struct S< _k >::Foo< 0, _dummy > {

  typedef S< _k > S;


  template< typename _Iterator >
  _Iterator
  operator()(
    _Iterator target) const;

 };


 template< unsigned _k >
 template< unsigned _dummy >
 template< typename _Iterator >
 _Iterator
 S< _k >::Foo< 0, _dummy >::operator()(
   _Iterator target) const {

   return target;
 }


 template< unsigned _k >
 template< typename _Iterator >
 inline _Iterator
 S< _k >::foo(
   _Iterator target) const {

   return Foo< 0 >().template operator()(target);
 }


int
main(
  int argc,
  char * argv[]) {

  S< 0 > s;

  s.foo(0);

  std::vector< int > v;
  // s.foo(std::back_inserter(v)); // # 3
}

But, if I uncomment the line # 3, I got (line #1):

error: `S<_k>::s1_' has incomplete type

and g++ seg fault on line #2.
 
>How-To-Repeat:
        
>Fix:
        


Reply via email to