Fix "maint print" error messages
[binutils-gdb.git] / gdb / testsuite / gdb.cp / member-ptr.cc
blob7fb2a91c677dbd73c882fa905075169932f2f996
1 /* This testcase is part of GDB, the GNU debugger.
3 Copyright 1998-2024 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 extern "C" {
19 #include <stdio.h>
23 class A {
24 public:
25 A();
26 int foo (int x);
27 int bar (int y);
28 virtual int baz (int z);
29 char c;
30 int j;
31 int jj;
32 static int s;
35 class B {
36 public:
37 static int s;
40 int A::s = 10;
41 int B::s = 20;
43 A::A()
45 c = 'x';
46 j = 5;
49 int A::foo (int dummy)
51 j += 3;
52 return j + dummy;
55 int A::bar (int dummy)
57 int r;
58 j += 13;
59 r = this->foo(15);
60 return r + j + 2 * dummy;
63 int A::baz (int dummy)
65 int r;
66 j += 15;
67 r = this->foo(15);
68 return r + j + 12 * dummy;
71 int fum (int dummy)
73 return 2 + 13 * dummy;
76 typedef int (A::*PMF)(int);
78 typedef int A::*PMI;
80 /* This class is in front of the other base classes of Diamond, so
81 that we can detect if the offset for Left or the first Base is
82 added twice - otherwise it would be 2 * 0 == 0. */
83 class Padding
85 public:
86 int spacer;
87 virtual int vspacer();
90 int Padding::vspacer()
92 return this->spacer;
95 class Base
97 public:
98 int x;
99 int get_x();
100 virtual int vget_base ();
103 int Base::get_x ()
105 return this->x;
108 int Base::vget_base ()
110 return this->x + 1000;
113 class Left : public Base {
114 public:
115 virtual int vget ();
118 int Left::vget ()
120 return this->x + 100;
123 class Right : public Base {
124 public:
125 virtual int vget ();
128 int Right::vget ()
130 return this->x + 200;
133 class Diamond : public Padding, public Left, public Right
135 public:
136 virtual int vget_base ();
137 int (*func_ptr) (int);
140 int Diamond::vget_base ()
142 return this->Left::x + 2000;
145 struct Container
147 PMI member;
151 func (int x)
153 return 19 + x;
156 int main ()
158 A a;
159 A * a_p;
160 PMF pmf;
162 PMF * pmf_p;
163 PMI pmi;
165 Diamond diamond;
166 int (Diamond::*left_pmf) ();
167 int (Diamond::*right_pmf) ();
168 int (Diamond::*left_vpmf) ();
169 int (Diamond::*left_base_vpmf) ();
170 int (Diamond::*right_vpmf) ();
171 int (Base::*base_vpmf) ();
172 int Diamond::*diamond_pmi;
173 int (* Diamond::*diamond_pfunc_ptr) (int);
175 PMI null_pmi;
176 PMF null_pmf;
178 a.j = 121;
179 a.jj = 1331;
181 int k;
183 a_p = &a;
185 pmi = &A::j;
186 pmf = &A::bar;
187 pmf_p = &pmf;
189 diamond.Left::x = 77;
190 diamond.Right::x = 88;
191 diamond.func_ptr = func;
193 /* Some valid pointer to members from a base class. */
194 left_pmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::get_x);
195 right_pmf = (int (Diamond::*) ()) (int (Right::*) ()) (&Base::get_x);
196 left_vpmf = &Left::vget;
197 left_base_vpmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::vget_base);
198 right_vpmf = &Right::vget;
200 /* An unspecified, value preserving pointer to member cast. */
201 base_vpmf = (int (Base::*) ()) (int (Left::*) ()) &Diamond::vget_base;
203 /* A pointer to data member from a base class. */
204 diamond_pmi = (int Diamond::*) (int Left::*) &Base::x;
206 /* A pointer to data member, where the member is itself a pointer to
207 a function. */
208 diamond_pfunc_ptr = (int (* Diamond::*) (int)) &Diamond::func_ptr;
210 null_pmi = NULL;
211 null_pmf = NULL;
213 Container contain;
214 contain.member = &A::j;
216 pmi = NULL; /* Breakpoint 1 here. */
218 (diamond.*diamond_pfunc_ptr) (20);
220 k = (a.*pmf)(3);
222 pmi = &A::jj;
223 pmf = &A::foo;
224 pmf_p = &pmf;
226 k = (a.*pmf)(4);
228 k = (a.**pmf_p)(5);
230 k = a.*pmi;
233 k = a.bar(2);
235 k += fum (4);
237 B b;
239 k += b.s;
241 return 0;