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