1 # Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
2 # 2004 Free Software Foundation, Inc.
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 # This file was written by Fred Fish. (fnf@cygnus.com)
19 # And rewritten by Michael Chastain. (mec.gnu@mindspring.com)
29 if { [skip_cplus_tests] } { continue }
31 set testfile "inherit"
33 set binfile ${objdir}/${subdir}/${testfile}
35 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
36 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
39 # Single inheritance, print type definitions.
41 proc test_ptype_si { } {
46 # Print class A as a type.
48 set re_class "((class|struct) A \{${ws}public:|struct A \{)"
49 set re_fields "int a;${ws}int x;"
50 set re_synth_gcc_23 "A & operator=\\(A const ?&\\);${ws}A\\(A const ?&\\);${ws}A\\((void|)\\);"
52 set name "ptype A (FIXME)"
53 gdb_test_multiple "ptype A" $name {
54 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
57 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
62 # Print class A as an explicit class.
64 set name "ptype class A (FIXME)"
65 gdb_test_multiple "ptype class A" $name {
66 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
69 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
74 # Print type of an object of type A.
76 set name "ptype g_A (FIXME)"
77 gdb_test_multiple "ptype g_A" $name {
78 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
81 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
86 # Print class B as a type.
88 set re_class "((class|struct) B : public A \{${ws}public:|struct B : public A \{)"
89 set re_fields "int b;${ws}int x;"
90 set re_synth_gcc_23 "B & operator=\\(B const ?&\\);${ws}B\\(B const ?&\\);${ws}B\\((void|)\\);"
93 gdb_test_multiple "ptype B" $name {
94 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
97 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
102 # Print class B as an explicit class.
104 set name "ptype class B"
105 gdb_test_multiple "ptype class B" $name {
106 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
109 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
114 # Print type of an object of type B.
117 gdb_test_multiple "ptype g_B" $name {
118 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
121 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
126 # Print class C as a type.
128 set re_class "((class|struct) C : public A \{${ws}public:|struct C : public A \{)"
129 set re_fields "int c;${ws}int x;"
130 set re_synth_gcc_23 "C & operator=\\(C const ?&\\);${ws}C\\(C const ?&\\);${ws}C\\((void|)\\);"
133 gdb_test_multiple "ptype C" $name {
134 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
137 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
142 # Print class C as an explicit class.
144 set name "ptype class C"
145 gdb_test_multiple "ptype class C" $name {
146 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
149 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
154 # Print type of an object of type g_C.
157 gdb_test_multiple "ptype g_C" $name {
158 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
161 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
166 # Print a structure with no tag.
168 set re_tag "tagless_struct"
170 set re_class "(class $re_tag \{${ws}public:|class \{${ws}public:|struct $re_tag \{|struct \{)"
171 set XX_class "(class $XX_tag \{${ws}public:|struct $XX_tag \{)"
172 set re_fields "int one;${ws}int two;"
173 set re_synth_gcc_23 "$re_tag & operator=\\($re_tag const ?&\\);${ws}$re_tag\\($re_tag const ?&\\);${ws}$re_tag\\((void|)\\);"
174 set XX_synth_gcc_23 "($re_tag|$XX_tag) & operator=\\($XX_tag const ?&\\);${ws}$XX_tag\\($XX_tag const ?&\\);${ws}$XX_tag\\((void|)\\);"
176 set name "ptype tagless struct"
177 gdb_test_multiple "ptype tagless_struct" $name {
178 -re "type = $XX_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
179 # gcc 2.95.3 -gdwarf-2
182 -re "type = $re_class${ws}$re_fields${ws}$XX_synth_gcc_23$nl\}$nl$gdb_prompt $" {
183 # gcc 2.95.3 -gstabs+
186 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
187 # gcc 3.3.4 -gdwarf-2
188 # gcc 3.4.1 -gdwarf-2
189 # gcc HEAD 2004-07-31 -gdwarf-2
190 # gcc HEAD 2004-07-31 -gstabs+
193 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
200 set name "ptype variable of type tagless struct"
201 gdb_test_multiple "ptype v_tagless" $name {
202 -re "type = $XX_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
203 # gcc 2.95.3 -gdwarf-2
206 -re "type = $re_class${ws}$re_fields${ws}$XX_synth_gcc_23$nl\}$nl$gdb_prompt $" {
207 # gcc 2.95.3 -gstabs+
210 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
211 # gcc 3.3.4 -gdwarf-2
212 # gcc 3.4.1 -gdwarf-2
213 # gcc HEAD 2004-07-31 -gdwarf-2
214 # gcc HEAD 2004-07-31 -gstabs+
217 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
225 # Multiple inheritance, print type definitions.
227 proc test_ptype_mi { } {
232 set re_class "class D : public B, public C \{${ws}public:"
233 set re_fields "int d;${ws}int x;"
234 set re_synth_gcc_23 "D & operator=\\(D const ?&\\);${ws}D\\(D const ?&\\);${ws}D\\((void|)\\);"
236 # ptype D: type, class, object.
239 gdb_test_multiple "ptype D" $name {
240 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
243 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
248 set name "ptype class D"
249 gdb_test_multiple "ptype class D" $name {
250 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
253 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
259 gdb_test_multiple "ptype g_D" $name {
260 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
263 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
268 set re_class "class E : public D \{${ws}public:"
269 set re_fields "int e;${ws}int x;"
270 set re_synth_gcc_23 "E & operator=\\(E const ?&\\);${ws}E\\(E const ?&\\);${ws}E\\((void|)\\);"
272 # ptype E: type, class, object.
275 gdb_test_multiple "ptype E" $name {
276 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
279 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
284 set name "ptype class E"
285 gdb_test_multiple "ptype class E" $name {
286 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
289 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
295 gdb_test_multiple "ptype g_E" $name {
296 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
299 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
305 # Single virtual inheritance, print type definitions.
307 proc test_ptype_vi { } {
312 # ptype vA: type, class, object.
314 set re_class "((class|struct) vA \{${ws}public:|struct vA \{)"
315 set re_fields "int va;${ws}int vx;"
316 set re_synth_gcc_23 "vA & operator=\\(vA const ?&\\);${ws}vA\\(vA const ?&\\);${ws}vA\\((void|)\\);"
319 gdb_test_multiple "ptype vA" $name {
320 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
323 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
328 set name "ptype class vA"
329 gdb_test_multiple "ptype class vA" $name {
330 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
333 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
338 set name "ptype g_vA"
339 gdb_test_multiple "ptype g_vA" $name {
340 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
343 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
348 # ptype vB: type, class, object.
350 set re_class "class vB : public virtual vA \{(${ws}private:|)"
351 set re_vbptr "vA \\*(_vb.2vA|_vb.vA);${ws}"
352 set re_access "public:"
353 set re_fields "int vb;${ws}int vx;"
354 set re_synth_gcc_2 "vB & operator=\\(vB const ?&\\);${ws}vB\\(int, vB const ?&\\);${ws}vB\\(int\\);"
355 set re_synth_gcc_3 "(vB & operator=\\(vB const ?&\\);${ws}|)vB\\(vB const ?&\\);${ws}vB\\((void|)\\);"
358 gdb_test_multiple "ptype vB" $name {
359 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
360 # gcc 2.95.3 -gdwarf-2
363 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
364 # gcc 2.95.3 -gstabs+
367 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
368 # gcc 3.3.2 -gdwarf-2
369 # gcc HEAD 2004-01-21 -gdwarf-2
372 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
374 # gcc HEAD 2004-01-21 -gstabs+
379 set name "ptype class vB"
380 gdb_test_multiple "ptype class vB" $name {
381 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
382 # gcc 2.95.3 -gdwarf-2
385 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
386 # gcc 2.95.3 -gstabs+
389 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
390 # gcc 3.3.2 -gdwarf-2
391 # gcc HEAD 2004-01-21 -gdwarf-2
394 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
396 # gcc HEAD 2004-01-21 -gstabs+
401 set name "ptype g_vB"
402 gdb_test_multiple "ptype g_vB" $name {
403 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
404 # gcc 2.95.3 -gdwarf-2
407 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
408 # gcc 2.95.3 -gstabs+
411 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
412 # gcc 3.3.2 -gdwarf-2
413 # gcc HEAD 2004-01-21 -gdwarf-2
416 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
418 # gcc HEAD 2004-01-21 -gstabs+
423 # ptype vC: type, class, object.
425 set re_class "class vC : public virtual vA \{(${ws}private:|)"
426 set re_vbptr "vA \\*(_vb.2vA|_vb.vA);${ws}"
427 set re_access "public:"
428 set re_fields "int vc;${ws}int vx;"
429 set re_synth_gcc_2 "vC & operator=\\(vC const ?&\\);${ws}vC\\(int, vC const ?&\\);${ws}vC\\(int\\);"
430 set re_synth_gcc_3 "(vC & operator=\\(vC const ?&\\);${ws}|)vC\\(vC const ?&\\);${ws}vC\\((void|)\\);"
433 gdb_test_multiple "ptype vC" $name {
434 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
435 # gcc 2.95.3 -gdwarf-2
438 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
439 # gcc 2.95.3 -gstabs+
442 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
443 # gcc 3.3.2 -gdwarf-2
444 # gcc HEAD 2004-01-21 -gdwarf-2
447 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
449 # gcc HEAD 2004-01-21 -gstabs+
454 set name "ptype class vC"
455 gdb_test_multiple "ptype class vC" $name {
456 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
457 # gcc 2.95.3 -gdwarf-2
460 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
461 # gcc 2.95.3 -gstabs+
464 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
465 # gcc 3.3.2 -gdwarf-2
466 # gcc HEAD 2004-01-21 -gdwarf-2
469 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
471 # gcc HEAD 2004-01-21 -gstabs+
476 set name "ptype g_vC"
477 gdb_test_multiple "ptype g_vC" $name {
478 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
479 # gcc 2.95.3 -gdwarf-2
482 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
483 # gcc 2.95.3 -gstabs+
486 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
487 # gcc 3.3.2 -gdwarf-2
488 # gcc HEAD 2004-01-21 -gdwarf-2
491 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
493 # gcc HEAD 2004-01-21 -gstabs+
499 # Multiple virtual inheritance, print type definitions.
501 proc test_ptype_mvi { } {
506 # ptype vD: type, class, object.
508 set re_class "class vD : public virtual vB, public virtual vC \{(${ws}private:|)"
509 set re_vbptr "vC \\*(_vb.2vC|_vb.vC);${ws}vB \\*(_vb.2vB|_vb.vB);"
510 set re_access "public:"
511 set re_fields "int vd;${ws}int vx;"
512 set re_synth_gcc_2 "vD & operator=\\(vD const ?&\\);${ws}vD\\(int, vD const ?&\\);${ws}vD\\(int\\);"
513 set re_synth_gcc_3 "(vD & operator=\\(vD const ?&\\);${ws}|)vD\\(vD const ?&\\);${ws}vD\\((void|)\\);"
516 gdb_test_multiple "ptype vD" $name {
517 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
518 # gcc 2.95.3 -gdwarf-2
521 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
522 # gcc 2.95.3 -gstabs+
525 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
526 # gcc 3.3.2 -gdwarf-2
527 # gcc HEAD 2004-01-21 -gdwarf-2
530 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
532 # gcc HEAD 2004-01-21 -gstabs+
537 set name "ptype class vD"
538 gdb_test_multiple "ptype class vD" $name {
539 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
540 # gcc 2.95.3 -gdwarf-2
543 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
544 # gcc 2.95.3 -gstabs+
547 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
548 # gcc 3.3.2 -gdwarf-2
549 # gcc HEAD 2004-01-21 -gdwarf-2
552 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
554 # gcc HEAD 2004-01-21 -gstabs+
559 set name "ptype g_vD"
560 gdb_test_multiple "ptype g_vD" $name {
561 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
562 # gcc 2.95.3 -gdwarf-2
565 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
566 # gcc 2.95.3 -gstabs+
569 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
570 # gcc 3.3.2 -gdwarf-2
571 # gcc HEAD 2004-01-21 -gdwarf-2
574 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
576 # gcc HEAD 2004-01-21 -gstabs+
581 # ptype vE: type, class, object.
583 set re_class "class vE : public virtual vD \{(${ws}private:|)"
584 set re_vbptr "vD \\*(_vb.2vD|_vb.vD);"
585 set re_access "public:"
586 set re_fields "int ve;${ws}int vx;"
587 set re_synth_gcc_2 "vE & operator=\\(vE const ?&\\);${ws}vE\\(int, vE const ?&\\);${ws}vE\\(int\\);"
588 set re_synth_gcc_3 "(vE & operator=\\(vE const ?&\\);${ws}|)vE\\(vE const ?&\\);${ws}vE\\((void|)\\);"
591 gdb_test_multiple "ptype vE" $name {
592 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
593 # gcc 2.95.3 -gdwarf-2
596 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
597 # gcc 2.95.3 -gstabs+
600 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
601 # gcc 3.3.2 -gdwarf-2
602 # gcc HEAD 2004-01-21 -gdwarf-2
605 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
607 # gcc HEAD 2004-01-21 -gstabs+
612 set name "ptype class vE"
613 gdb_test_multiple "ptype class vE" $name {
614 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
615 # gcc 2.95.3 -gdwarf-2
618 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
619 # gcc 2.95.3 -gstabs+
622 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
623 # gcc 3.3.2 -gdwarf-2
624 # gcc HEAD 2004-01-21 -gdwarf-2
627 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
629 # gcc HEAD 2004-01-21 -gstabs+
634 set name "ptype g_vE"
635 gdb_test_multiple "ptype g_vE" $name {
636 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
637 # gcc 2.95.3 -gdwarf-2
640 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
641 # gcc 2.95.3 -gstabs+
644 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
645 # gcc 3.3.2 -gdwarf-2
646 # gcc HEAD 2004-01-21 -gdwarf-2
649 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
651 # gcc HEAD 2004-01-21 -gstabs+
657 # Single inheritance, print individual members.
659 proc test_print_si_members { } {
662 # Print all members of g_A using fully qualified form.
663 gdb_test "print g_A.A::a" "$vhn = 1"
664 gdb_test "print g_A.A::x" "$vhn = 2"
666 # Print members of g_A using nonambiguous compact form.
667 gdb_test "print g_A.a" "$vhn = 1"
668 gdb_test "print g_A.x" "$vhn = 2"
670 # Print all members of g_B using fully qualified form.
671 gdb_test "print g_B.A::a" "$vhn = 3"
672 gdb_test "print g_B.A::x" "$vhn = 4"
673 gdb_test "print g_B.B::b" "$vhn = 5"
674 gdb_test "print g_B.B::x" "$vhn = 6"
676 # Print members of g_B using nonambiguous compact form.
677 gdb_test "print g_B.a" "$vhn = 3"
678 gdb_test "print g_B.b" "$vhn = 5"
679 gdb_test "print g_B.x" "$vhn = 6"
681 # Print all members of g_C using fully qualified form.
682 gdb_test "print g_C.A::a" "$vhn = 7"
683 gdb_test "print g_C.A::x" "$vhn = 8"
684 gdb_test "print g_C.C::c" "$vhn = 9"
685 gdb_test "print g_C.C::x" "$vhn = 10"
687 # Print members of g_C using nonambiguous compact form.
688 gdb_test "print g_C.a" "$vhn = 7"
689 gdb_test "print g_C.c" "$vhn = 9"
690 gdb_test "print g_C.x" "$vhn = 10"
693 # Single inheritance, print complete classes.
695 proc test_print_si_classes { } {
698 # Print all members of g_A, g_B, g_C.
699 gdb_test "print g_A" "$vhn = \{a = 1, x = 2\}"
700 gdb_test "print g_B" "$vhn = \{<(class A|A)> = \{a = 3, x = 4\}, b = 5, x = 6\}"
701 gdb_test "print g_C" "$vhn = \{<(class A|A)> = \{a = 7, x = 8\}, c = 9, x = 10\}"
704 # Multiple inheritance, print individual members.
706 proc test_print_mi_members {} {
711 # Print all members of g_A.
712 gdb_test "print g_A.A::a" "$vhn = 1"
713 gdb_test "print g_A.A::x" "$vhn = 2"
715 # Print all members of g_B.
716 gdb_test "print g_B.A::a" "$vhn = 3"
717 gdb_test "print g_B.A::x" "$vhn = 4"
718 gdb_test "print g_B.B::b" "$vhn = 5"
719 gdb_test "print g_B.B::x" "$vhn = 6"
721 # Print all members of g_C.
722 gdb_test "print g_C.A::a" "$vhn = 7"
723 gdb_test "print g_C.A::x" "$vhn = 8"
724 gdb_test "print g_C.C::c" "$vhn = 9"
725 gdb_test "print g_C.C::x" "$vhn = 10"
727 # Print all members of g_D.
729 # g_D.A::a and g_D.A::x are ambiguous member accesses, and gdb
730 # should detect these. There are no ways to PASS these tests
731 # because I don't know what the gdb message will be. -- chastain
734 set name "print g_D.A::a"
735 gdb_test_multiple "print g_D.A::a" $name {
736 -re "$vhn = (15|11)$nl$gdb_prompt $" {
737 kfail "gdb/68" "print g_D.A::a"
741 set name "print g_D.A::x"
742 gdb_test_multiple "print g_D.A::x" $name {
743 -re "$vhn = (16|12)$nl$gdb_prompt $" {
744 kfail "gdb/68" "print g_D.A::x"
748 gdb_test "print g_D.B::b" "$vhn = 13"
749 gdb_test "print g_D.B::x" "$vhn = 14"
750 gdb_test "print g_D.C::c" "$vhn = 17"
751 gdb_test "print g_D.C::x" "$vhn = 18"
752 gdb_test "print g_D.D::d" "$vhn = 19"
753 gdb_test "print g_D.D::x" "$vhn = 20"
755 # Print all members of g_E.
756 # g_E.A::a and g_E.A::x are ambiguous.
758 set name "print g_E.A::a"
759 gdb_test_multiple "print g_E.A::a" $name {
760 -re "$vhn = (21|25)$nl$gdb_prompt $" {
761 kfail "gdb/68" "print g_E.A::a"
765 set name "print g_E.A::x"
766 gdb_test_multiple "print g_E.A::x" $name {
767 -re "$vhn = (26|22)$nl$gdb_prompt $" {
768 kfail "gdb/68" "print g_E.A::x"
772 gdb_test "print g_E.B::b" "$vhn = 23"
773 gdb_test "print g_E.B::x" "$vhn = 24"
774 gdb_test "print g_E.C::c" "$vhn = 27"
775 gdb_test "print g_E.C::x" "$vhn = 28"
776 gdb_test "print g_E.D::d" "$vhn = 29"
777 gdb_test "print g_E.D::x" "$vhn = 30"
778 gdb_test "print g_E.E::e" "$vhn = 31"
779 gdb_test "print g_E.E::x" "$vhn = 32"
782 # Multiple inheritance, print complete classes.
784 proc test_print_mi_classes { } {
787 # Print all members of g_D.
788 gdb_test "print g_D" "$vhn = \{\<(class |)B\> = \{\<(class |)A\> = \{a = 11, x = 12\}, b = 13, x = 14\}, \<(class |)C\> = \{\<(class |)A\> = \{a = 15, x = 16\}, c = 17, x = 18\}, d = 19, x = 20\}"
790 # Print all members of g_E.
791 gdb_test "print g_E" "$vhn = \{\<(class |)D\> = \{\<(class |)B\> = \{\<(class |)A\> = \{a = 21, x = 22\}, b = 23, x = 24\}, \<(class |)C\> = \{\<(class |)A\> = \{a = 25, x = 26\}, c = 27, x = 28\}, d = 29, x = 30\}, e = 31, x = 32\}"
794 # Single inheritance, print anonymous unions.
795 # GDB versions prior to 4.14 entered an infinite loop when printing
796 # the type of a class containing an anonymous union, and they were also
797 # incapable of printing the member of an anonymous union.
798 # We test the printing of the member first, and perform the other tests
799 # only if the test succeeds, to avoid the infinite loop.
801 # GDB HEAD 2004-01-27 with hp aCC A.03.45 crashes on the first test.
802 # -- chastain 2004-01-27
804 proc test_print_anon_union {} {
810 gdb_test "print g_anon_union.a" "$vhn = 2" "print anonymous union member"
812 set name "print variable of type anonymous union"
813 gdb_test_multiple "print g_anon_union" $name {
814 -re "$vhn = \{one = 1, \{a = 2, b = 2\}\}$nl$gdb_prompt $" {
819 set re_class "((struct|class) class_with_anon_union \{${ws}public:|struct class_with_anon_union \{)"
820 set re_fields "int one;${ws}"
821 set re_anon_union "union \{${ws}int a;${ws}long int b;${ws}\};"
822 set re_synth_gcc_23 "class_with_anon_union & operator=\\(class_with_anon_union const ?&\\);${ws}class_with_anon_union\\(class_with_anon_union const ?&\\);${ws}class_with_anon_union\\((void|)\\);"
824 set name "print type of anonymous union"
825 gdb_test_multiple "ptype g_anon_union" $name {
826 -re "type = $re_class${ws}$re_fields${ws}$re_anon_union$nl\}$nl$gdb_prompt $" {
829 -re "type = $re_class${ws}$re_fields${ws}$re_anon_union${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
836 # Single virtual inheritance, print individual members.
838 proc test_print_svi_members { } {
841 # Print all members of g_vA.
842 gdb_test "print g_vA.vA::va" "$vhn = 1"
843 gdb_test "print g_vA.vA::vx" "$vhn = 2"
845 # Print members of g_vA using compact form.
846 gdb_test "print g_vA.va" "$vhn = 1"
847 gdb_test "print g_vA.vx" "$vhn = 2"
849 # Print all members of g_vB.
850 gdb_test "print g_vB.vA::va" "$vhn = 3"
851 gdb_test "print g_vB.vA::vx" "$vhn = 4"
852 gdb_test "print g_vB.vB::vb" "$vhn = 5"
853 gdb_test "print g_vB.vB::vx" "$vhn = 6"
855 # Print members of g_vB using compact form.
856 gdb_test "print g_vB.va" "$vhn = 3"
857 gdb_test "print g_vB.vb" "$vhn = 5"
858 gdb_test "print g_vB.vx" "$vhn = 6"
860 # Print all members of g_vC.
861 gdb_test "print g_vC.vA::va" "$vhn = 7"
862 gdb_test "print g_vC.vA::vx" "$vhn = 8"
863 gdb_test "print g_vC.vC::vc" "$vhn = 9"
864 gdb_test "print g_vC.vC::vx" "$vhn = 10"
866 # Print members of g_vC using compact form.
867 gdb_test "print g_vC.va" "$vhn = 7" "print g_vC.va"
868 gdb_test "print g_vC.vc" "$vhn = 9" "print g_vC.vc"
869 gdb_test "print g_vC.vx" "$vhn = 10" "print g_vC.vx"
872 # Single virtual inheritance, print complete classes.
874 proc test_print_svi_classes { } {
880 # Print all members of g_vA.
881 gdb_test "print g_vA" "$vhn = \{va = 1, vx = 2\}"
883 # Print all members of g_vB.
884 set re_vbptr_2 "(_vb.2vA|_vb.vA)"
885 set re_vbptr_3 "_vptr.vB"
887 set name "print g_vB"
888 gdb_test_multiple "print g_vB" $name {
889 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_2 = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
890 # gcc 2.95.3 -gdwarf-2
891 # gcc 2.95.3 -gstabs+
894 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
895 # gcc 3.3.4 -gdwarf-2
896 # gcc 3.4.1 -gdwarf-2
898 # gcc HEAD 2004-07-31 -gdwarf-2
899 pass "$name (FIXME v3 vtbl ptr)"
901 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex <VTT for vB>, vb = 5, vx = 6\}$nl$gdb_prompt $" {
905 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex <typeinfo for vB>, vb = 5, vx = 6\}$nl$gdb_prompt $" {
906 # gcc HEAD 2004-07-31 -gstabs+
911 # Print all members of g_vC.
912 set re_vbptr_2 "(_vb.2vA|_vb.vA)"
913 set re_vbptr_3 "_vptr.vC"
915 set name "print g_vC"
916 gdb_test_multiple "print g_vC" $name {
917 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_2 = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
918 # gcc 2.95.3 -gdwarf-2
919 # gcc 2.95.3 -gstabs+
922 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
923 # gcc 3.3.4 -gdwarf-2
924 # gcc 3.4.1 -gdwarf-2
926 # gcc HEAD 2004-07-31 -gdwarf-2
927 pass "$name (FIXME v3 vtbl ptr)"
929 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex <VTT for vC>, vc = 9, vx = 10\}$nl$gdb_prompt $" {
933 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex <typeinfo for vC>, vc = 9, vx = 10\}$nl$gdb_prompt $" {
934 # gcc HEAD 2004-07-31 -gstabs+
940 # Multiple virtual inheritance, print individual members.
942 proc test_print_mvi_members { } {
945 # Print all members of g_vD.
946 gdb_test "print g_vD.vA::va" "$vhn = 19"
947 gdb_test "print g_vD.vA::vx" "$vhn = 20"
948 gdb_test "print g_vD.vB::vb" "$vhn = 21"
949 gdb_test "print g_vD.vB::vx" "$vhn = 22"
950 gdb_test "print g_vD.vC::vc" "$vhn = 23"
951 gdb_test "print g_vD.vC::vx" "$vhn = 24"
952 gdb_test "print g_vD.vD::vd" "$vhn = 25"
953 gdb_test "print g_vD.vD::vx" "$vhn = 26"
955 # Print all members of g_vE.
956 gdb_test "print g_vE.vA::va" "$vhn = 0"
957 gdb_test "print g_vE.vA::vx" "$vhn = 0"
958 gdb_test "print g_vE.vB::vb" "$vhn = 0"
959 gdb_test "print g_vE.vB::vx" "$vhn = 0"
960 gdb_test "print g_vE.vC::vc" "$vhn = 0"
961 gdb_test "print g_vE.vC::vx" "$vhn = 0"
962 gdb_test "print g_vE.vD::vd" "$vhn = 0"
963 gdb_test "print g_vE.vD::vx" "$vhn = 0"
964 gdb_test "print g_vE.vE::ve" "$vhn = 27"
965 gdb_test "print g_vE.vE::vx" "$vhn = 28"
968 # Multiple virtual inheritance, print complete classes.
970 proc test_print_mvi_classes { } {
977 # Virtual base pointers for everybody.
979 set re_vbptr_2_vA "(_vb.2vA|_vb.vA)"
980 set re_vbptr_2_vB "(_vb.2vB|_vb.vB)"
981 set re_vbptr_2_vC "(_vb.2vC|_vb.vC)"
982 set re_vbptr_2_vD "(_vb.2vD|_vb.vD)"
983 set re_vbptr_3_vA "_vptr.vA"
984 set re_vbptr_3_vB "_vptr.vB"
985 set re_vbptr_3_vC "_vptr.vC"
986 set re_vbptr_3_vD "_vptr.vD"
987 set re_vbptr_3_vE "_vptr.vE"
989 # Print all members of g_vD.
991 set name "print g_vD"
992 gdb_test_multiple "print g_vD" $name {
993 -re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_2_vA = $hex, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_2_vA = $hex, vc = 23, vx = 24\}, $re_vbptr_2_vC = $hex, $re_vbptr_2_vB = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
994 # gcc 2.95.3 -gdwarf-2
995 # gcc 2.95.3 -gstabs+
998 -re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_3_vB = $hex, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_3_vC = $hex, vc = 23, vx = 24\}, $re_vbptr_3_vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
999 # gcc 3.3.2 -gdwarf-2
1000 # gcc HEAD 2004-01-21 -gdwarf-2
1001 # gcc HEAD 2004-01-21 -gstabs+
1002 pass "$name (FIXME v3 vtbl ptr)"
1004 -re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_3_vB = $hex, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_3_vC = $hex <VTT for vD>, vc = 23, vx = 24\}, $re_vbptr_3_vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
1005 # gcc 3.3.2 -gstabs+
1010 # Print all members of g_vE.
1012 set name "print g_vE"
1013 gdb_test_multiple "print g_vE" $name {
1014 -re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_2_vA = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_2_vA = $hex, vc = 0, vx = 0\}, $re_vbptr_2_vC = $hex, $re_vbptr_2_vB = $hex, vd = 0, vx = 0\}, $re_vbptr_2_vD = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
1015 # gcc 2.95.3 -gdwarf-2
1016 # gcc 2.95.3 -gstabs+
1019 -re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = $hex, vc = 0, vx = 0\}, $re_vbptr_3_vD = $hex, vd = 0, vx = 0\}, $re_vbptr_3_vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
1020 # gcc 3.3.4 -gdwarf-2
1021 # gcc 3.3.4 -gstabs+
1022 # gcc 3.4.1 -gdwarf-2
1023 # gcc 3.4.1 -gstabs+
1024 # gcc HEAD 2004-07-31 -gdwarf-2
1025 pass "$name (FIXME v3 vtbl ptr)"
1027 -re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = $hex <VTT for vD>, vc = 0, vx = 0\}, $re_vbptr_3_vD = $hex, vd = 0, vx = 0\}, $re_vbptr_3_vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
1028 # gcc 3.2.7-rh -gstabs+
1031 -re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = $hex <typeinfo for vE>, vc = 0, vx = 0\}, $re_vbptr_3_vD = $hex, vd = 0, vx = 0\}, $re_vbptr_3_vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
1032 # gcc HEAD 2004-07-31 -gstabs+
1049 # Start with a fresh gdb.
1053 gdb_reinitialize_dir $srcdir/$subdir
1056 gdb_test "set language c++" ""
1057 gdb_test "set width 0" ""
1059 if { ![runto_main] } then {
1060 perror "couldn't run to main"
1069 if { ![runto 'inheritance2'] } then {
1070 perror "couldn't run to inheritance2"
1074 test_print_si_members
1075 test_print_si_classes
1076 test_print_mi_members
1077 test_print_mi_classes
1078 test_print_anon_union
1080 if { ![runto 'inheritance4'] } {
1081 perror "couldn't run to inheritance4"
1085 test_print_svi_members
1086 test_print_svi_classes
1087 test_print_mvi_members
1088 test_print_mvi_classes