1 // PR c++/49107
2 // { dg-do compile { target c++11 } }
3 
4 template<typename _Tp>
5 _Tp declval() noexcept;
6 
7 template<typename _Tp , typename = decltype(_Tp(declval<_Tp&&>()))>
8 struct trait
9 {
10   static const bool value=true;
11 };
12 
13 template<class _T2>
14 struct pair
15 {
16   _T2 second;
17   void swap(pair& __p)
18     noexcept(trait<_T2>::value);
19 };
20 
21 template < class R_ >
22 struct Main
23 {
MainMain24   Main() {}
25   Main(const typename R_::Sub1T& r) ;
26   Main(const typename R_::Sub2T& l) ;
27 };
28 
29 template < class R_ >
30 class Sub1
31 {
32   typedef pair<typename R_::MainT> Rep;
33   Rep base;
34 };
35 
36 template < class R_ >
37 struct Sub2
38 {
39   typedef pair<typename R_::MainT> Rep;
40   Rep base;
41 };
42 
43 struct Kernel
44 {
45   typedef Main<Kernel> MainT;
46   typedef Sub1<Kernel> Sub1T;
47   typedef Sub2<Kernel> Sub2T;
48 };
49 
f()50 Main<Kernel> f()
51 {
52   return Main<Kernel> ();
53 }
54