http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49107

           Summary: [C++0x] incomplete type regression with std::pair
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: marc.gli...@normalesup.org


Hello,

this code very recently stopped compiling. I am reporting it against libstdc++
because it uses std::pair, but feel free to reassign to the C++ FE if
appropriate, I didn't have time to investigate further.

#include <utility>

template < class R_ >
struct VectorH3
{
  typedef typename R_::RT                   RT;
  typedef typename R_::Ray_3                Ray_3;
  typedef typename R_::Line_3               Line_3;
  VectorH3() {}
  VectorH3(const Ray_3& r) ; 
  VectorH3(const Line_3& l) ; 
  VectorH3(const RT& x, const RT& y, const RT& z, const RT& w) ;
};

template < class R_ >
class RayH3
{
   typedef typename R_::Point_3              Point_3;
   typedef typename R_::Vector_3             Vector_3;
   typedef std::pair<Point_3, Vector_3>             Rep;
   Rep base;
};

template < class R_ >
struct LineC3
{
  typedef typename R_::Point_3              Point_3;
  typedef typename R_::Vector_3             Vector_3;
  typedef std::pair<Point_3, Vector_3>             Rep;
  Rep base;
};

template < typename Kernel >
struct Homogeneous_base
{
    typedef double                                  RT;
    struct Point_3{};
    typedef VectorH3<Kernel>                        Vector_3;
    typedef LineC3<Kernel>                          Line_3;
    typedef RayH3<Kernel>                           Ray_3;
    struct Construct_vector_3
    {
    Vector_3 operator()(const RT& x, const RT& y, const RT& z, const RT& w)
const
    { return Vector_3(x, y, z, w); }
    };
};

struct Simple_homogeneous
  : public Homogeneous_base< Simple_homogeneous >
{};

int main()
{
  Simple_homogeneous::Construct_vector_3()( 8, 2, 4, 1);
}



$ c++ -std=gnu++0x -c Simple_homogeneous.cpp
Simple_homogeneous.cpp: In instantiation of 'LineC3<Simple_homogeneous>':
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:730:46:
  instantiated from
'std::__is_direct_constructible_impl<VectorH3<Simple_homogeneous>,
VectorH3<Simple_homogeneous>&&>'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:79:12:
  instantiated from
'std::__and_<std::is_destructible<VectorH3<Simple_homogeneous> >,
std::__is_direct_constructible_impl<VectorH3<Simple_homogeneous>,
VectorH3<Simple_homogeneous>&&> >'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:734:12:
  instantiated from
'std::__is_direct_constructible_new_safe<VectorH3<Simple_homogeneous>,
VectorH3<Simple_homogeneous>&&>'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:806:12:
  instantiated from
'std::__is_direct_constructible_new<VectorH3<Simple_homogeneous>,
VectorH3<Simple_homogeneous>&&>'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:814:12:
  instantiated from
'std::__is_direct_constructible<VectorH3<Simple_homogeneous>,
VectorH3<Simple_homogeneous>&&>'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:853:12:
  [ skipping 4 instantiation contexts ]
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:981:12:
  instantiated from
'std::__is_nothrow_move_constructible_impl<VectorH3<Simple_homogeneous>,
false>'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/type_traits:987:12:
  instantiated from
'std::is_nothrow_move_constructible<VectorH3<Simple_homogeneous> >'
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:185:7:
  instantiated from 'std::pair<Homogeneous_base<Simple_homogeneous>::Point_3,
VectorH3<Simple_homogeneous> >'
Simple_homogeneous.cpp:21:8:   instantiated from 'RayH3<Simple_homogeneous>'
Simple_homogeneous.cpp:44:30:   instantiated from
'Homogeneous_base<Kernel>::Vector_3
Homogeneous_base<Kernel>::Construct_vector_3::operator()(const RT&, const RT&,
const RT&, const RT&) const [with Kernel = Simple_homogeneous,
Homogeneous_base<Kernel>::Vector_3 = VectorH3<Simple_homogeneous>,
Homogeneous_base<Kernel>::RT = double]'
Simple_homogeneous.cpp:54:55:   instantiated from here
Simple_homogeneous.cpp:30:7: error: 'LineC3<R_>::base' has incomplete type
/tmp/gcc/inst/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:88:12:
error: declaration of 'LineC3<Simple_homogeneous>::Rep'

Reply via email to