This commit was manufactured by cvs2svn to create branch
[official-gcc.git] / gcc / testsuite / g++.dg / template / mem_func_ptr.C
blobbcdda5ca69decb7528853d905504bf3c5c8b2e68
1 // { dg-do compile }
2 template<typename T> struct takes_member_ptr;
3 template<typename T, typename Class> struct takes_member_ptr<T Class::*> {};
5 template<typename T, typename Class>
6 void fun_takes_member_ptr(T Class::*) {}
9 template<typename T> struct order_member_ptrs;
10 template<typename T, typename Class> struct order_member_ptrs<T Class::*> {};
11 template<typename R, typename T1, typename Class> 
12   struct order_member_ptrs<R (Class::*)(T1)>
13   {
14     typedef int type;
15   };
17 template<typename R, typename T1, typename Class>
18   struct order_member_ptrs<R (Class::*)(T1) const>
19   {
20     typedef int c_type;
21   };
23 template<typename R, typename T1, typename Class>
24   struct order_member_ptrs<R (Class::*)(T1) volatile>
25   {
26     typedef int v_type;
27   };
29 template<typename R, typename T1, typename Class>
30   struct order_member_ptrs<R (Class::*)(T1) const volatile>
31   {
32     typedef int cv_type;
33   };
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 {}
43 void foo()
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);