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 }
58