PR c++/81917 - ICE with void_t and partial specialization.
[official-gcc.git] / gcc / testsuite / g++.dg / template / sfinae20.C
blob61bd8da93d98d8814b5d0ce88e968cdcd3449c3e
1 // PR c++/44907
2 // { dg-do compile { target c++11 } }
4 #include <utility>
6 struct A { };
8 struct B
9 : public A { };
11 struct C
12 : public A { };
14 struct D
15 : public B, public C { };
17 template<typename From, typename To>
18   class mini_is_convertible
19   {
20     typedef char one;
21     typedef struct { char arr[2]; } two;
23     template<typename To1>
24       static void test_aux(To1);
26     template<typename To1, typename From1>
27       static decltype(test_aux<To1>(std::declval<From1>()), one())
28       test(int);
30     template<typename, typename>
31       static two test(...);
33     public:
34       static const bool value = sizeof(test<To, From>(0)) == 1;
35   }; 
37 template<typename From, typename To>
38   const bool mini_is_convertible<From, To>::value;
40 static_assert (!mini_is_convertible<D*, A*>::value, "");
41 static_assert (!mini_is_convertible<A*, D*>::value, "");
42 static_assert (!mini_is_convertible<D&, A&>::value, "");
43 static_assert (!mini_is_convertible<A&, D&>::value, "");
44 static_assert (!mini_is_convertible<D, A>::value, "");
45 static_assert (!mini_is_convertible<A, D>::value, "");