111
|
1 // PR c++/44908
|
|
2 // { dg-do compile { target c++11 } }
|
|
3
|
|
4 #include <utility>
|
|
5
|
|
6 struct A { };
|
|
7
|
|
8 struct B
|
|
9 : public virtual A { };
|
|
10
|
|
11 template<typename From, typename To>
|
|
12 class mini_is_convertible
|
|
13 {
|
|
14 typedef char one;
|
|
15 typedef struct { char arr[2]; } two;
|
|
16
|
|
17 template<typename To1>
|
|
18 static void test_aux(To1);
|
|
19
|
|
20 template<typename To1, typename From1>
|
|
21 static decltype(test_aux<To1>(std::declval<From1>()), one())
|
|
22 test(int);
|
|
23
|
|
24 template<typename, typename>
|
|
25 static two test(...);
|
|
26
|
|
27 public:
|
|
28 static const bool value = sizeof(test<To, From>(0)) == 1;
|
|
29 };
|
|
30
|
|
31 template<typename From, typename To>
|
|
32 const bool mini_is_convertible<From, To>::value;
|
|
33
|
|
34 static_assert (!mini_is_convertible<int (B::*) (int),
|
|
35 int (A::*) (int)>::value, "");
|
|
36 static_assert (!mini_is_convertible<int (B::*), int (A::*)>::value, "");
|
|
37 static_assert (!mini_is_convertible<int (A::*) (int),
|
|
38 int (B::*) (int)>::value, "");
|
|
39 static_assert (!mini_is_convertible<int (A::*), int (B::*)>::value, "");
|