111
|
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 {
|
|
24 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
|
|
50 Main<Kernel> f()
|
|
51 {
|
|
52 return Main<Kernel> ();
|
|
53 }
|