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