Platform£º WinXP SP3 + Eclipse CDT 6.0 + MinGW 5.1.4 + GCC 4.4.1 (TDM's Build)
Bug description: GCC failed to correctly resolve the template parameters when nestedly calling friend function templates of class templates. Sample codes£º /* TestMinGW.cpp*/ #include <iostream> #include <vector> /* Class Inner */ struct Inner { template < class IStream > friend IStream& operator >> ( IStream& in, Inner& inner ); Inner() : data(0) {} template < class IStream > explicit Inner( IStream& in ) { operator >> (in,*this); } int data; }; template < class IStream > IStream& operator >> ( IStream& in, Inner& inner ) { in >> inner.data; return in; } /* Class Outter */ struct Outter { template < class IStream > friend IStream& operator >> ( IStream& in, Outter& outter ); template < class IStream > explicit Outter( IStream& in ) { Inner inner(in); inners.push_back(inner); } std::vector <Inner> inners; }; template < class IStream > IStream& operator >> ( IStream& in, Outter& inner ) { in >> inner; return in; } /* Main */ int main ( int argc, char* argv[] ) { Inner inner(std::cin); // OK. Outter outter(std::cin); // Compilation error. return 0; } Compiler log: g++ -v -save-temps -O3 -Wall -c -fmessage-length=0 -oSrc\TestMinGW.o ..\Src\TestMinGW.cpp Using built-in specs. Target: mingw32 Configured with: ../../gcc-4.4.1/configure --prefix=/mingw --build=mingw32 --enable-languages=c,ada,c++,fortran,objc,obj-c++ --disable-nls --disable-win32-registry --enable-libgomp --enable-cxx-flags='-fno-function-sections -fno-data-sections' --disable-werror --enable-threads --disable-symvers --enable-version-specific-runtime-libs --enable-fully-dynamic-string --with-pkgversion='TDM-1 mingw32' --enable-sjlj-exceptions --with-bugurl=http://www.tdragon.net/recentgcc/bugs.php Thread model: win32 gcc version 4.4.1 (TDM-1 mingw32) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O3' '-Wall' '-c' '-fmessage-length=0' '-oSrc\TestMinGW.o' '-mtune=i386' d:/mingw-5.1.4/bin/../libexec/gcc/mingw32/4.4.1/cc1plus.exe -E -quiet -v -iprefix d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/ ..\Src\TestMinGW.cpp -mtune=i386 -Wall -fmessage-length=0 -O3 -fpch-preprocess -o TestMinGW.ii ignoring nonexistent directory "d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/../../../../mingw32/include" ignoring duplicate directory "d:/mingw-5.1.4/lib/gcc/../../lib/gcc/mingw32/4.4.1/include/c++" ignoring duplicate directory "d:/mingw-5.1.4/lib/gcc/../../lib/gcc/mingw32/4.4.1/include/c++/mingw32" ignoring duplicate directory "d:/mingw-5.1.4/lib/gcc/../../lib/gcc/mingw32/4.4.1/include/c++/backward" ignoring nonexistent directory "/mingw/include" ignoring duplicate directory "d:/mingw-5.1.4/lib/gcc/../../include" ignoring duplicate directory "d:/mingw-5.1.4/lib/gcc/../../lib/gcc/mingw32/4.4.1/include" ignoring duplicate directory "d:/mingw-5.1.4/lib/gcc/../../lib/gcc/mingw32/4.4.1/include-fixed" ignoring nonexistent directory "d:/mingw-5.1.4/lib/gcc/../../lib/gcc/mingw32/4.4.1/../../../../mingw32/include" ignoring nonexistent directory "/mingw/include" #include "..." search starts here: #include <...> search starts here: D:/boost-1.40.0/include D:/dlib-17.21 d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++ d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/mingw32 d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/backward d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/../../../../include d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include-fixed End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-O3' '-Wall' '-c' '-fmessage-length=0' '-oSrc\TestMinGW.o' '-mtune=i386' d:/mingw-5.1.4/bin/../libexec/gcc/mingw32/4.4.1/cc1plus.exe -fpreprocessed TestMinGW.ii -quiet -dumpbase TestMinGW.cpp -mtune=i386 -auxbase-strip Src\TestMinGW.o -O3 -Wall -version -fmessage-length=0 -o TestMinGW.s GNU C++ (TDM-1 mingw32) version 4.4.1 (mingw32) compiled by GNU C version 4.4.1, GMP version 4.3.0, MPFR version 2.4.1. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 8d2e404a57d82e42e16008cfa0818446 ..\Src\TestMinGW.cpp: In function 'IStream& operator>>(IStream&, Inner&) [with IStream = Inner]': ..\Src\TestMinGW.cpp:8: instantiated from 'Inner::Inner(IStream&) [with IStream = Inner]' d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_uninitialized.h:74: instantiated from 'static _ForwardIterator std::__uninitialized_copy<<anonymous> >::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = Inner*, _ForwardIterator = Inner*, bool <anonymous> = false]' d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_uninitialized.h:117: instantiated from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = Inner*, _ForwardIterator = Inner*]' d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_uninitialized.h:257: instantiated from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = Inner*, _ForwardIterator = Inner*, _Tp = Inner]' d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_uninitialized.h:267: instantiated from '_ForwardIterator std::__uninitialized_move_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator = Inner*, _ForwardIterator = Inner*, _Allocator = std::allocator<Inner>]' d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/vector.tcc:338: instantiated from 'void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Inner, _Alloc = std::allocator<Inner>]' d:\mingw-5.1.4\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_vector.h:741: instantiated from 'void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Inner, _Alloc = std::allocator<Inner>]' ..\Src\TestMinGW.cpp:24: instantiated from 'Outter::Outter(IStream&) [with IStream = std::istream]' ..\Src\TestMinGW.cpp:40: instantiated from here ..\Src\TestMinGW.cpp:16: error: no match for 'operator>>' in 'in >> inner->Inner::data' Build error occurred, build is stopped Time consumed: 500 ms. -- Summary: G++ failed to correctly resolve the template parameters. Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yimingli0126 at 163 dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41216