111
|
1 // { dg-do compile }
|
|
2 template<typename T> struct takes_member_ptr;
|
|
3 template<typename T, typename Klasse> struct takes_member_ptr<T Klasse::*> {};
|
|
4
|
|
5 template<typename T, typename Klasse>
|
|
6 void fun_takes_member_ptr(T Klasse::*) {}
|
|
7
|
|
8
|
|
9 template<typename T> struct order_member_ptrs;
|
|
10 template<typename T, typename Klasse> struct order_member_ptrs<T Klasse::*> {};
|
|
11 template<typename R, typename T1, typename Klasse>
|
|
12 struct order_member_ptrs<R (Klasse::*)(T1)>
|
|
13 {
|
|
14 typedef int type;
|
|
15 };
|
|
16
|
|
17 template<typename R, typename T1, typename Klasse>
|
|
18 struct order_member_ptrs<R (Klasse::*)(T1) const>
|
|
19 {
|
|
20 typedef int c_type;
|
|
21 };
|
|
22
|
|
23 template<typename R, typename T1, typename Klasse>
|
|
24 struct order_member_ptrs<R (Klasse::*)(T1) volatile>
|
|
25 {
|
|
26 typedef int v_type;
|
|
27 };
|
|
28
|
|
29 template<typename R, typename T1, typename Klasse>
|
|
30 struct order_member_ptrs<R (Klasse::*)(T1) const volatile>
|
|
31 {
|
|
32 typedef int cv_type;
|
|
33 };
|
|
34
|
|
35
|
|
36 struct X {
|
|
37 void bar(float) {}
|
|
38 void bar_c(float) const {}
|
|
39 void bar_v(float) volatile {}
|
|
40 void bar_cv(float) const volatile {}
|
|
41 };
|
|
42
|
|
43 void foo()
|
|
44 {
|
|
45 sizeof(takes_member_ptr<void (X::*)(float)>);
|
|
46 sizeof(takes_member_ptr<void (X::*)(float) const>);
|
|
47 sizeof(takes_member_ptr<void (X::*)(float) volatile>);
|
|
48 sizeof(takes_member_ptr<void (X::*)(float) const volatile>);
|
|
49 sizeof(order_member_ptrs<void (X::*)(float)>::type);
|
|
50 sizeof(order_member_ptrs<void (X::*)(float) const>::c_type);
|
|
51 sizeof(order_member_ptrs<void (X::*)(float) volatile>::v_type);
|
|
52 sizeof(order_member_ptrs<void (X::*)(float) const volatile>::cv_type);
|
|
53 fun_takes_member_ptr(&X::bar);
|
|
54 fun_takes_member_ptr(&X::bar_c);
|
|
55 fun_takes_member_ptr(&X::bar_v);
|
|
56 fun_takes_member_ptr(&X::bar_cv);
|
|
57 }
|