// PR c++/49107 // { dg-do compile { target c++11 } } namespace std { template _Tp&& declval() noexcept; struct true_type { static const bool value = true; }; struct false_type { static const bool value = false; }; template struct __is_direct_constructible_impl { template()))> static true_type __test(int); template static false_type __test(...); typedef decltype(__test<_Tp, _Arg>(0)) type; }; template struct __is_direct_constructible_new_safe : public __is_direct_constructible_impl<_Tp, _Arg>::type { }; template struct pair { pair() = default; constexpr pair(const pair&) = default; pair(pair&& __p) noexcept(__is_direct_constructible_new_safe<_T2,_T2&&>::value); }; } template struct Vector3 { typedef typename R_::Ray_3 Ray_3; Vector3() {} explicit Vector3(const Ray_3& r); }; template < class R_ > class LineC3 { typedef typename R_::Vector_3 Vector_3; std::pair x; }; template < class R_ > class RayH3 { typedef typename R_::Vector_3 Vector_3; std::pair x; }; template struct Homogeneous_base { typedef LineC3 Line_3; typedef RayH3 Ray_3; }; template < typename RT_> struct Simple_homogeneous : public Homogeneous_base< Simple_homogeneous > { typedef Vector3 > Vector_3; }; int main() { typedef Simple_homogeneous R; R::Line_3 l3; }