| // PR c++/49107 |
| // { dg-do compile { target c++11 } } |
| |
| template<typename _Tp> |
| _Tp declval() noexcept; |
| |
| template<typename _Tp , typename = decltype(_Tp(declval<_Tp&&>()))> |
| struct trait |
| { |
| static const bool value=true; |
| }; |
| |
| template<class _T2> |
| struct pair |
| { |
| _T2 second; |
| void swap(pair& __p) |
| noexcept(trait<_T2>::value); |
| }; |
| |
| template < class R_ > |
| struct Main |
| { |
| Main() {} |
| Main(const typename R_::Sub1T& r) ; |
| Main(const typename R_::Sub2T& l) ; |
| }; |
| |
| template < class R_ > |
| class Sub1 |
| { |
| typedef pair<typename R_::MainT> Rep; |
| Rep base; |
| }; |
| |
| template < class R_ > |
| struct Sub2 |
| { |
| typedef pair<typename R_::MainT> Rep; |
| Rep base; |
| }; |
| |
| struct Kernel |
| { |
| typedef Main<Kernel> MainT; |
| typedef Sub1<Kernel> Sub1T; |
| typedef Sub2<Kernel> Sub2T; |
| }; |
| |
| Main<Kernel> f() |
| { |
| return Main<Kernel> (); |
| } |