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

Reply via email to