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