>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: