111
|
1 // PR c++/44907
|
|
2 // { dg-do compile { target c++11 } }
|
|
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, "");
|