]>
Commit | Line | Data |
---|---|---|
b811d2c2 | 1 | /* Copyright 2015-2020 Free Software Foundation, Inc. |
078a0207 KS |
2 | |
3 | This program is free software; you can redistribute it and/or modify | |
4 | it under the terms of the GNU General Public License as published by | |
5 | the Free Software Foundation; either version 3 of the License, or | |
6 | (at your option) any later version. | |
7 | ||
8 | This program is distributed in the hope that it will be useful, | |
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | GNU General Public License for more details. | |
12 | ||
13 | You should have received a copy of the GNU General Public License | |
14 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
15 | ||
16 | class A; | |
17 | static int get_value (const A* a); | |
18 | ||
19 | class A | |
20 | { | |
21 | public: | |
22 | typedef int ATYPE; | |
23 | ||
24 | A () : a_ (21) {} | |
25 | ATYPE get_var () { return a_; } | |
26 | ATYPE get_var (unsigned long a) { return 100; } | |
27 | ATYPE get_var (ATYPE a) { return 101; } | |
28 | ATYPE get_var (float a) { return 102; } | |
29 | ATYPE get_var (void *a) { return 103;} | |
30 | ATYPE get_var (A& lr) { return 104; } | |
31 | ATYPE get_var (A const& lr) { return 105; } | |
32 | ||
33 | ATYPE get_var1 (int n) { return a_ << n; } | |
34 | ATYPE get_var2 (int incr, unsigned n) { return (a_ + incr) << n; } | |
35 | ||
36 | static ATYPE get_1 (int a) { return a + 1; } | |
37 | static ATYPE get_2 (int a, int b) { return a + b + 2; } | |
38 | ||
39 | friend ATYPE get_value (const A*); | |
40 | ||
41 | private: | |
42 | ATYPE a_; | |
43 | }; | |
44 | ||
45 | static A::ATYPE | |
46 | get_value (A::ATYPE a) | |
47 | { | |
48 | return a; | |
49 | } | |
50 | ||
51 | static A::ATYPE | |
52 | get_value (const A* a) | |
53 | { | |
54 | return a->a_; | |
55 | } | |
56 | ||
57 | static A::ATYPE | |
58 | get_value () | |
59 | { | |
60 | return 200; | |
61 | } | |
62 | ||
63 | typedef int (A::*PMF) (A::ATYPE); | |
64 | ||
65 | int | |
66 | main () | |
67 | { | |
68 | A *a = new A (); | |
69 | int var = 1234; | |
70 | float f = 1.23; | |
71 | unsigned long ul = 0xdeadbeef; | |
72 | A const* ac = a; | |
73 | ||
74 | PMF pmf = &A::get_var; | |
75 | PMF *pmf_p = &pmf; | |
76 | ||
77 | var -= a->get_var (); // break here | |
78 | var -= a->get_var (1); | |
79 | var -= a->get_var (ul); | |
80 | var -= a->get_var (f); | |
81 | var -= a->get_var (a); | |
82 | var -= a->get_var (*a); | |
83 | var -= a->get_var (*ac); | |
84 | var -= a->get_var1 (1); | |
85 | var -= a->get_var2 (1, 2); | |
86 | var += (a->*pmf) (1); | |
87 | var -= (a->**pmf_p) (1); | |
88 | ||
89 | return var - A::get_1 (1) + A::get_2 (1, 2) + get_value () | |
90 | + get_value (get_value ()) + get_value (a); | |
91 | } |