OSDN Git Service

PR c++/49418
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.dg / template / sfinae20.C
1 // PR c++/44907
2 // { dg-options "-std=c++0x" }
3
4 #include <utility>
5
6 struct A { };
7
8 struct B
9 : public A { };
10
11 struct C
12 : public A { };
13
14 struct D
15 : public B, public C { };
16
17 template<typename From, typename To>
18   class mini_is_convertible
19   {
20     typedef char one;
21     typedef struct { char arr[2]; } two;
22
23     template<typename To1>
24       static void test_aux(To1);
25
26     template<typename To1, typename From1>
27       static decltype(test_aux<To1>(std::declval<From1>()), one())
28       test(int);
29
30     template<typename, typename>
31       static two test(...);
32
33     public:
34       static const bool value = sizeof(test<To, From>(0)) == 1;
35   }; 
36
37 template<typename From, typename To>
38   const bool mini_is_convertible<From, To>::value;
39
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, "");