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