xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.compile/compile-cplus-method.cc (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /* Copyright 2015-2019 Free Software Foundation, Inc.
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 }
92