1 /* PR rtl-optimization/23585 */
2 /* Testcase by Matti Rintala <matti.rintala@iki.fi> */
3
4 /* { dg-do run } */
5 /* { dg-options "-O2" } */
6
7 template <class _Ret, class _Tp>
8 class const_mem_fun_t
9 {
10 public:
11 explicit
const_mem_fun_t(_Ret (_Tp::* __pf)()const)12 const_mem_fun_t(_Ret (_Tp::*__pf)() const)
13 : _M_f(__pf) {}
14
15 _Ret
operator()16 operator()(const _Tp* __p) const
17 { return (__p->*_M_f)(); }
18 private:
19 _Ret (_Tp::*_M_f)() const;
20 };
21
22 template <class _Ret, class _Tp>
23 class const_mem_fun_ref_t
24 {
25 public:
26 explicit
const_mem_fun_ref_t(_Ret (_Tp::* __pf)()const)27 const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const)
28 : _M_f(__pf) {}
29
30 _Ret
operator()31 operator()(const _Tp& __r) const
32 { return (__r.*_M_f)(); }
33 private:
34 _Ret (_Tp::*_M_f)() const;
35 };
36
37 template <class _Ret, class _Tp, class _Arg>
38 class const_mem_fun1_t
39 {
40 public:
41 explicit
const_mem_fun1_t(_Ret (_Tp::* __pf)(_Arg)const)42 const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const)
43 : _M_f(__pf) {}
44
45 _Ret
operator()46 operator()(const _Tp* __p, _Arg __x) const
47 { return (__p->*_M_f)(__x); }
48 private:
49 _Ret (_Tp::*_M_f)(_Arg) const;
50 };
51
52
53 template <class _Ret, class _Tp, class _Arg>
54 class const_mem_fun1_ref_t
55 {
56 public:
57 explicit
const_mem_fun1_ref_t(_Ret (_Tp::* __pf)(_Arg)const)58 const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const)
59 : _M_f(__pf) {}
60
61 _Ret
operator()62 operator()(const _Tp& __r, _Arg __x) const
63 { return (__r.*_M_f)(__x); }
64 private:
65 _Ret (_Tp::*_M_f)(_Arg) const;
66 };
67
68 template <class _Ret, class _Tp>
69 inline const_mem_fun_t<_Ret, _Tp>
mem_fun(_Ret (_Tp::* __f)()const)70 mem_fun(_Ret (_Tp::*__f)() const)
71 { return const_mem_fun_t<_Ret, _Tp>(__f); }
72
73 template <class _Ret, class _Tp>
74 inline const_mem_fun_ref_t<_Ret, _Tp>
mem_fun_ref(_Ret (_Tp::* __f)()const)75 mem_fun_ref(_Ret (_Tp::*__f)() const)
76 { return const_mem_fun_ref_t<_Ret, _Tp>(__f); }
77
78 template <class _Ret, class _Tp, class _Arg>
79 inline const_mem_fun1_t<_Ret, _Tp, _Arg>
mem_fun(_Ret (_Tp::* __f)(_Arg)const)80 mem_fun(_Ret (_Tp::*__f)(_Arg) const)
81 { return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); }
82
83 template <class _Ret, class _Tp, class _Arg>
84 inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg>
mem_fun_ref(_Ret (_Tp::* __f)(_Arg)const)85 mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const)
86 { return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); }
87
88 class Klasse {
89 public:
90 void vf0c() const;
91 void vf1c(const int&) const;
92 };
93
main()94 int main()
95 {
96 Klasse obj;
97 const Klasse& objc = obj;
98
99 mem_fun(&Klasse::vf0c)(&objc);
100 mem_fun(&Klasse::vf1c)(&objc, 1);
101
102 mem_fun_ref(&Klasse::vf0c)(objc);
103 mem_fun_ref(&Klasse::vf1c)(objc, 1);
104 return 0;
105 }
106
vf0c()107 void Klasse::vf0c() const
108 {}
109
vf1c(const int &)110 void Klasse::vf1c(const int&) const
111 {}
112