PR c++/86728 - C variadic generic lambda.
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / sfinae39.C
blob8183bda39abee4dbd7b59b46c5c27f7eb7f99d8b
1 // PR c++/54191
2 // { dg-do compile { target c++11 } }
4 struct B
5 {};
7 struct D
8   : private B
9 {};
11 template<typename T>
12 T &&declval();
15 template<typename From, typename = decltype(B{declval<From>()})>
16 constexpr bool test_braced_cast_to_base(int)
17 { return true; }
19 template<typename>
20 constexpr bool test_braced_cast_to_base(bool)
21 { return false; }
23 static_assert(!test_braced_cast_to_base<D>(0), "");
26 template<typename From, typename = decltype(D{declval<From>()})>
27 constexpr bool test_braced_cast_to_derived(int)
28 { return true; }
30 template<typename>
31 constexpr bool test_braced_cast_to_derived(bool)
32 { return false; }
34 static_assert(!test_braced_cast_to_derived<B>(0), "");
37 typedef B *PB;
39 template<typename From, typename = decltype(PB{declval<From>()})>
40 constexpr bool test_braced_cast_to_ptr_to_base(int)
41 { return true; }
43 template<typename>
44 constexpr bool test_braced_cast_to_ptr_to_base(bool)
45 { return false; }
47 static_assert(!test_braced_cast_to_ptr_to_base<D *>(0), "");
50 typedef D *PD;
52 template<typename From, typename = decltype(PD{declval<From>()})>
53 constexpr bool test_braced_cast_to_ptr_to_derived(int)
54 { return true; }
56 template<typename>
57 constexpr bool test_braced_cast_to_ptr_to_derived(bool)
58 { return false; }
60 static_assert(!test_braced_cast_to_ptr_to_derived<B *>(0), "");
63 template<typename From, typename To,
64          typename = decltype(static_cast<To>(declval<From>()))>
65 constexpr bool test_static_cast(int)
66 { return true; }
68 template<typename, typename>
69 constexpr bool test_static_cast(bool)
70 { return false; }
72 static_assert(!test_static_cast<B &, D &>(0), "");
73 static_assert(!test_static_cast<B *, D *>(0), "");
76 template<typename From, typename To,
77          typename = decltype(dynamic_cast<To>(declval<From>()))>
78 constexpr bool test_dynamic_cast(int)
79 { return true; }
81 template<typename, typename>
82 constexpr bool test_dynamic_cast(bool)
83 { return false; }
85 static_assert(!test_dynamic_cast<D &, B &>(0), "");
86 static_assert(!test_dynamic_cast<D *, B *>(0), "");
89 int B::*pm = 0;
91 template<typename T, typename = decltype(declval<T>().*pm)>
92 constexpr bool test_member_ptr_dot(int)
93 { return true; }
95 template<typename>
96 constexpr bool test_member_ptr_dot(bool)
97 { return false; }
99 static_assert(!test_member_ptr_dot<D>(0), "");
102 template<typename T, typename = decltype(declval<T>()->*pm)>
103 constexpr bool test_member_ptr_arrow(int)
104 { return true; }
106 template<typename>
107 constexpr bool test_member_ptr_arrow(bool)
108 { return false; }
110 static_assert(!test_member_ptr_arrow<D *>(0), "");
113 template<typename T, typename U,
114          typename = decltype(declval<T>() < declval<U>())>
115 constexpr bool test_rel_op(int)
116 { return true; }
118 template<typename, typename>
119 constexpr bool test_rel_op(bool)
120 { return false; }
122 static_assert(!test_rel_op<D *, B *>(0), "");
125 template<typename T, typename U,
126          typename = decltype(declval<T>() == declval<U>())>
127 constexpr bool test_eq(int)
128 { return true; }
130 template<typename, typename>
131 constexpr bool test_eq(bool)
132 { return false; }
134 static_assert(!test_eq<D *, B *>(0), "");
137 template<typename T, typename U,
138          typename = decltype(false ? declval<T>() : declval<U>())>
139 constexpr bool test_cond_op(int)
140 { return true; }
142 template<typename, typename>
143 constexpr bool test_cond_op(bool)
144 { return false; }
146 static_assert(!test_cond_op<B *, D *>(0), "");