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, "");
46