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 # Please email any bugs, comments, and/or additions to this file to:
19 # bug-gdb@prep.ai.mit.edu
21 # This file was written by Fred Fish. (fnf@cygnus.com)
22 # And rewritten by Michael Chastain. (mec.gnu@mindspring.com)
32 if { [skip_cplus_tests] } { continue }
34 set testfile "inherit"
36 set binfile ${objdir}/${subdir}/${testfile}
38 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
39 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
42 # Single inheritance, print type definitions.
44 proc test_ptype_si { } {
49 # Print class A as a type.
51 set re_class "class A \{${ws}public:"
52 set re_fields "int a;${ws}int x;"
53 set re_synth_gcc_23 "A & operator=\\(A const ?&\\);${ws}A\\(A const ?&\\);${ws}A\\((void|)\\);"
55 set name "ptype A (FIXME)"
56 gdb_test_multiple "ptype A" $name {
57 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
60 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
65 # Print class A as an explicit class.
67 set name "ptype class A (FIXME)"
68 gdb_test_multiple "ptype class A" $name {
69 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
72 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
77 # Print type of an object of type A.
79 set name "ptype g_A (FIXME)"
80 gdb_test_multiple "ptype g_A" $name {
81 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
84 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
89 # Print class B as a type.
91 set re_class "class B : public A \{${ws}public:"
92 set re_fields "int b;${ws}int x;"
93 set re_synth_gcc_23 "B & operator=\\(B const ?&\\);${ws}B\\(B const ?&\\);${ws}B\\((void|)\\);"
96 gdb_test_multiple "ptype B" $name {
97 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
100 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
105 # Print class B as an explicit class.
107 set name "ptype class B"
108 gdb_test_multiple "ptype class B" $name {
109 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
112 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
117 # Print type of an object of type B.
120 gdb_test_multiple "ptype g_B" $name {
121 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
124 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
129 # Print class C as a type.
131 set re_class "class C : public A \{${ws}public:"
132 set re_fields "int c;${ws}int x;"
133 set re_synth_gcc_23 "C & operator=\\(C const ?&\\);${ws}C\\(C const ?&\\);${ws}C\\((void|)\\);"
136 gdb_test_multiple "ptype C" $name {
137 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
140 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
145 # Print class C as an explicit class.
147 set name "ptype class C"
148 gdb_test_multiple "ptype class C" $name {
149 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
152 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
157 # Print type of an object of type g_C.
160 gdb_test_multiple "ptype g_C" $name {
161 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
164 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
169 # Print a structure with no tag.
171 set re_tag "tagless_struct"
173 set re_class "(class $re_tag \{${ws}public:|class \{${ws}public:|struct $re_tag \{|struct \{)"
174 set XX_class "(class $XX_tag \{${ws}public:|struct $XX_tag \{)"
175 set re_fields "int one;${ws}int two;"
176 set re_synth_gcc_23 "$re_tag & operator=\\($re_tag const ?&\\);${ws}$re_tag\\($re_tag const ?&\\);${ws}$re_tag\\((void|)\\);"
177 set XX_synth_gcc_23 "($re_tag|$XX_tag) & operator=\\($XX_tag const ?&\\);${ws}$XX_tag\\($XX_tag const ?&\\);${ws}$XX_tag\\((void|)\\);"
179 set name "ptype tagless struct"
180 gdb_test_multiple "ptype tagless_struct" $name {
181 -re "type = $XX_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
182 # gcc 2.95.3 -gdwarf-2
183 pass "$name (obsolete gcc or gdb)"
185 -re "type = $re_class${ws}$re_fields${ws}$XX_synth_gcc_23$nl\}$nl$gdb_prompt $" {
186 # gcc 2.95.3 -gstabs+
187 pass "$name (obsolete gcc or gdb)"
189 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
190 # gcc 3.3.2 -gdwarf-2
191 # gcc HEAD 2004-01-21 -gdwarf-2
192 pass "$name (obsolete gcc or gdb)"
194 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
196 # gcc HEAD 2004-01-21 -gstabs+
201 set name "ptype variable of type tagless struct"
202 gdb_test_multiple "ptype v_tagless" $name {
203 -re "type = $XX_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
204 # gcc 2.95.3 -gdwarf-2
205 pass "$name (obsolete gcc or gdb)"
207 -re "type = $re_class${ws}$re_fields${ws}$XX_synth_gcc_23$nl\}$nl$gdb_prompt $" {
208 # gcc 2.95.3 -gstabs+
209 pass "$name (obsolete gcc or gdb)"
211 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
212 # gcc 3.3.2 -gdwarf-2
213 # gcc HEAD 2004-01-21 -gdwarf-2
214 pass "$name (obsolete gcc or gdb)"
216 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
218 # gcc HEAD 2004-01-21 -gstabs+
224 # Multiple inheritance, print type definitions.
226 proc test_ptype_mi { } {
231 set re_class "class D : public B, public C \{${ws}public:"
232 set re_fields "int d;${ws}int x;"
233 set re_synth_gcc_23 "D & operator=\\(D const ?&\\);${ws}D\\(D const ?&\\);${ws}D\\((void|)\\);"
235 # ptype D: type, class, object.
238 gdb_test_multiple "ptype D" $name {
239 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
242 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
247 set name "ptype class D"
248 gdb_test_multiple "ptype class D" $name {
249 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
252 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
258 gdb_test_multiple "ptype g_D" $name {
259 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
262 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
267 set re_class "class E : public D \{${ws}public:"
268 set re_fields "int e;${ws}int x;"
269 set re_synth_gcc_23 "E & operator=\\(E const ?&\\);${ws}E\\(E const ?&\\);${ws}E\\((void|)\\);"
271 # ptype E: type, class, object.
274 gdb_test_multiple "ptype E" $name {
275 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
278 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
283 set name "ptype class E"
284 gdb_test_multiple "ptype class E" $name {
285 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
288 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
294 gdb_test_multiple "ptype g_E" $name {
295 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
298 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
304 # Single virtual inheritance, print type definitions.
306 proc test_ptype_vi { } {
311 # ptype vA: type, class, object.
313 set re_class "class vA \{${ws}public:"
314 set re_fields "int va;${ws}int vx;"
315 set re_synth_gcc_23 "vA & operator=\\(vA const ?&\\);${ws}vA\\(vA const ?&\\);${ws}vA\\((void|)\\);"
318 gdb_test_multiple "ptype vA" $name {
319 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
322 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
327 set name "ptype class vA"
328 gdb_test_multiple "ptype class vA" $name {
329 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
332 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
337 set name "ptype g_vA"
338 gdb_test_multiple "ptype g_vA" $name {
339 -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
342 -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
347 # ptype vB: type, class, object.
349 set re_class "class vB : public virtual vA \{(${ws}private:|)"
350 set re_vbptr "vA \\*(_vb.2vA|_vb.vA);${ws}"
351 set re_access "public:"
352 set re_fields "int vb;${ws}int vx;"
353 set re_synth_gcc_2 "vB & operator=\\(vB const ?&\\);${ws}vB\\(int, vB const ?&\\);${ws}vB\\(int\\);"
354 set re_synth_gcc_3 "vB & operator=\\(vB const ?&\\);${ws}vB\\(vB const ?&\\);${ws}vB\\(\\);"
357 gdb_test_multiple "ptype vB" $name {
358 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
359 # gcc 2.95.3 -gdwarf-2
362 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
363 # gcc 2.95.3 -gstabs+
366 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
367 # gcc 3.3.2 -gdwarf-2
368 # gcc HEAD 2004-01-21 -gdwarf-2
371 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
373 # gcc HEAD 2004-01-21 -gstabs+
378 set name "ptype class vB"
379 gdb_test_multiple "ptype class vB" $name {
380 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
381 # gcc 2.95.3 -gdwarf-2
384 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
385 # gcc 2.95.3 -gstabs+
388 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
389 # gcc 3.3.2 -gdwarf-2
390 # gcc HEAD 2004-01-21 -gdwarf-2
393 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
395 # gcc HEAD 2004-01-21 -gstabs+
400 set name "ptype g_vB"
401 gdb_test_multiple "ptype g_vB" $name {
402 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
403 # gcc 2.95.3 -gdwarf-2
406 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
407 # gcc 2.95.3 -gstabs+
410 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
411 # gcc 3.3.2 -gdwarf-2
412 # gcc HEAD 2004-01-21 -gdwarf-2
415 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
417 # gcc HEAD 2004-01-21 -gstabs+
422 # ptype vC: type, class, object.
424 set re_class "class vC : public virtual vA \{(${ws}private:|)"
425 set re_vbptr "vA \\*(_vb.2vA|_vb.vA);${ws}"
426 set re_access "public:"
427 set re_fields "int vc;${ws}int vx;"
428 set re_synth_gcc_2 "vC & operator=\\(vC const ?&\\);${ws}vC\\(int, vC const ?&\\);${ws}vC\\(int\\);"
429 set re_synth_gcc_3 "vC & operator=\\(vC const ?&\\);${ws}vC\\(vC const ?&\\);${ws}vC\\(\\);"
432 gdb_test_multiple "ptype vC" $name {
433 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
434 # gcc 2.95.3 -gdwarf-2
437 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
438 # gcc 2.95.3 -gstabs+
441 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
442 # gcc 3.3.2 -gdwarf-2
443 # gcc HEAD 2004-01-21 -gdwarf-2
446 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
448 # gcc HEAD 2004-01-21 -gstabs+
453 set name "ptype class vC"
454 gdb_test_multiple "ptype class vC" $name {
455 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
456 # gcc 2.95.3 -gdwarf-2
459 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
460 # gcc 2.95.3 -gstabs+
463 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
464 # gcc 3.3.2 -gdwarf-2
465 # gcc HEAD 2004-01-21 -gdwarf-2
468 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
470 # gcc HEAD 2004-01-21 -gstabs+
475 set name "ptype g_vC"
476 gdb_test_multiple "ptype g_vC" $name {
477 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
478 # gcc 2.95.3 -gdwarf-2
481 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
482 # gcc 2.95.3 -gstabs+
485 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
486 # gcc 3.3.2 -gdwarf-2
487 # gcc HEAD 2004-01-21 -gdwarf-2
490 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
492 # gcc HEAD 2004-01-21 -gstabs+
498 # Multiple virtual inheritance, print type definitions.
500 proc test_ptype_mvi { } {
505 # ptype vD: type, class, object.
507 set re_class "class vD : public virtual vB, public virtual vC \{(${ws}private:|)"
508 set re_vbptr "vC \\*(_vb.2vC|_vb.vC);${ws}vB \\*(_vb.2vB|_vb.vB);"
509 set re_access "public:"
510 set re_fields "int vd;${ws}int vx;"
511 set re_synth_gcc_2 "vD & operator=\\(vD const ?&\\);${ws}vD\\(int, vD const ?&\\);${ws}vD\\(int\\);"
512 set re_synth_gcc_3 "vD & operator=\\(vD const ?&\\);${ws}vD\\(vD const ?&\\);${ws}vD\\(\\);"
515 gdb_test_multiple "ptype vD" $name {
516 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
517 # gcc 2.95.3 -gdwarf-2
520 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
521 # gcc 2.95.3 -gstabs+
524 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
525 # gcc 3.3.2 -gdwarf-2
526 # gcc HEAD 2004-01-21 -gdwarf-2
529 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
531 # gcc HEAD 2004-01-21 -gstabs+
536 set name "ptype class vD"
537 gdb_test_multiple "ptype class vD" $name {
538 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
539 # gcc 2.95.3 -gdwarf-2
542 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
543 # gcc 2.95.3 -gstabs+
546 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
547 # gcc 3.3.2 -gdwarf-2
548 # gcc HEAD 2004-01-21 -gdwarf-2
551 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
553 # gcc HEAD 2004-01-21 -gstabs+
558 set name "ptype g_vD"
559 gdb_test_multiple "ptype g_vD" $name {
560 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
561 # gcc 2.95.3 -gdwarf-2
564 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
565 # gcc 2.95.3 -gstabs+
568 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
569 # gcc 3.3.2 -gdwarf-2
570 # gcc HEAD 2004-01-21 -gdwarf-2
573 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
575 # gcc HEAD 2004-01-21 -gstabs+
580 # ptype vE: type, class, object.
582 set re_class "class vE : public virtual vD \{(${ws}private:|)"
583 set re_vbptr "vD \\*(_vb.2vD|_vb.vD);"
584 set re_access "public:"
585 set re_fields "int ve;${ws}int vx;"
586 set re_synth_gcc_2 "vE & operator=\\(vE const ?&\\);${ws}vE\\(int, vE const ?&\\);${ws}vE\\(int\\);"
587 set re_synth_gcc_3 "vE & operator=\\(vE const ?&\\);${ws}vE\\(vE const ?&\\);${ws}vE\\(\\);"
590 gdb_test_multiple "ptype vE" $name {
591 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
592 # gcc 2.95.3 -gdwarf-2
595 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
596 # gcc 2.95.3 -gstabs+
599 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
600 # gcc 3.3.2 -gdwarf-2
601 # gcc HEAD 2004-01-21 -gdwarf-2
604 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
606 # gcc HEAD 2004-01-21 -gstabs+
611 set name "ptype class vE"
612 gdb_test_multiple "ptype class vE" $name {
613 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
614 # gcc 2.95.3 -gdwarf-2
617 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
618 # gcc 2.95.3 -gstabs+
621 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
622 # gcc 3.3.2 -gdwarf-2
623 # gcc HEAD 2004-01-21 -gdwarf-2
626 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
628 # gcc HEAD 2004-01-21 -gstabs+
633 set name "ptype g_vE"
634 gdb_test_multiple "ptype g_vE" $name {
635 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
636 # gcc 2.95.3 -gdwarf-2
639 -re "type = $re_class${ws}$re_vbptr${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_2$nl\}$nl$gdb_prompt $" {
640 # gcc 2.95.3 -gstabs+
643 -re "type = $re_class${ws}$re_access${ws}$re_fields$nl\}$nl$gdb_prompt $" {
644 # gcc 3.3.2 -gdwarf-2
645 # gcc HEAD 2004-01-21 -gdwarf-2
648 -re "type = $re_class${ws}$re_access${ws}$re_fields${ws}$re_synth_gcc_3$nl\}$nl$gdb_prompt $" {
650 # gcc HEAD 2004-01-21 -gstabs+
656 # Single inheritance, print individual members.
658 proc test_print_si_members { } {
661 # Print all members of g_A using fully qualified form.
662 gdb_test "print g_A.A::a" "$vhn = 1"
663 gdb_test "print g_A.A::x" "$vhn = 2"
665 # Print members of g_A using nonambiguous compact form.
666 gdb_test "print g_A.a" "$vhn = 1"
667 gdb_test "print g_A.x" "$vhn = 2"
669 # Print all members of g_B using fully qualified form.
670 gdb_test "print g_B.A::a" "$vhn = 3"
671 gdb_test "print g_B.A::x" "$vhn = 4"
672 gdb_test "print g_B.B::b" "$vhn = 5"
673 gdb_test "print g_B.B::x" "$vhn = 6"
675 # Print members of g_B using nonambiguous compact form.
676 gdb_test "print g_B.a" "$vhn = 3"
677 gdb_test "print g_B.b" "$vhn = 5"
678 gdb_test "print g_B.x" "$vhn = 6"
680 # Print all members of g_C using fully qualified form.
681 gdb_test "print g_C.A::a" "$vhn = 7"
682 gdb_test "print g_C.A::x" "$vhn = 8"
683 gdb_test "print g_C.C::c" "$vhn = 9"
684 gdb_test "print g_C.C::x" "$vhn = 10"
686 # Print members of g_C using nonambiguous compact form.
687 gdb_test "print g_C.a" "$vhn = 7"
688 gdb_test "print g_C.c" "$vhn = 9"
689 gdb_test "print g_C.x" "$vhn = 10"
692 # Single inheritance, print complete classes.
694 proc test_print_si_classes { } {
697 # Print all members of g_A, g_B, g_C.
698 gdb_test "print g_A" "$vhn = \{a = 1, x = 2\}"
699 gdb_test "print g_B" "$vhn = \{<(class A|A)> = \{a = 3, x = 4\}, b = 5, x = 6\}"
700 gdb_test "print g_C" "$vhn = \{<(class A|A)> = \{a = 7, x = 8\}, c = 9, x = 10\}"
703 # Multiple inheritance, print individual members.
705 proc test_print_mi_members {} {
710 # Print all members of g_A.
711 gdb_test "print g_A.A::a" "$vhn = 1"
712 gdb_test "print g_A.A::x" "$vhn = 2"
714 # Print all members of g_B.
715 gdb_test "print g_B.A::a" "$vhn = 3"
716 gdb_test "print g_B.A::x" "$vhn = 4"
717 gdb_test "print g_B.B::b" "$vhn = 5"
718 gdb_test "print g_B.B::x" "$vhn = 6"
720 # Print all members of g_C.
721 gdb_test "print g_C.A::a" "$vhn = 7"
722 gdb_test "print g_C.A::x" "$vhn = 8"
723 gdb_test "print g_C.C::c" "$vhn = 9"
724 gdb_test "print g_C.C::x" "$vhn = 10"
726 # Print all members of g_D.
728 # g_D.A::a and g_D.A::x are ambiguous member accesses, and gdb
729 # should detect these. There are no ways to PASS these tests
730 # because I don't know what the gdb message will be. -- chastain
733 set name "print g_D.A::a"
734 gdb_test_multiple "print g_D.A::a" $name {
735 -re "$vhn = (15|11)$nl$gdb_prompt $" {
736 kfail "gdb/68" "print g_D.A::a"
740 set name "print g_D.A::x"
741 gdb_test_multiple "print g_D.A::x" $name {
742 -re "$vhn = (16|12)$nl$gdb_prompt $" {
743 kfail "gdb/68" "print g_D.A::x"
747 gdb_test "print g_D.B::b" "$vhn = 13"
748 gdb_test "print g_D.B::x" "$vhn = 14"
749 gdb_test "print g_D.C::c" "$vhn = 17"
750 gdb_test "print g_D.C::x" "$vhn = 18"
751 gdb_test "print g_D.D::d" "$vhn = 19"
752 gdb_test "print g_D.D::x" "$vhn = 20"
754 # Print all members of g_E.
755 # g_E.A::a and g_E.A::x are ambiguous.
757 set name "print g_E.A::a"
758 gdb_test_multiple "print g_E.A::a" $name {
759 -re "$vhn = (21|25)$nl$gdb_prompt $" {
760 kfail "gdb/68" "print g_E.A::a"
764 set name "print g_E.A::x"
765 gdb_test_multiple "print g_E.A::x" $name {
766 -re "$vhn = (26|22)$nl$gdb_prompt $" {
767 kfail "gdb/68" "print g_E.A::x"
771 gdb_test "print g_E.B::b" "$vhn = 23"
772 gdb_test "print g_E.B::x" "$vhn = 24"
773 gdb_test "print g_E.C::c" "$vhn = 27"
774 gdb_test "print g_E.C::x" "$vhn = 28"
775 gdb_test "print g_E.D::d" "$vhn = 29"
776 gdb_test "print g_E.D::x" "$vhn = 30"
777 gdb_test "print g_E.E::e" "$vhn = 31"
778 gdb_test "print g_E.E::x" "$vhn = 32"
781 # Multiple inheritance, print complete classes.
783 proc test_print_mi_classes { } {
786 # Print all members of g_D.
787 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\}"
789 # Print all members of g_E.
790 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\}"
793 # Single inheritance, print anonymous unions.
794 # GDB versions prior to 4.14 entered an infinite loop when printing
795 # the type of a class containing an anonymous union, and they were also
796 # incapable of printing the member of an anonymous union.
797 # We test the printing of the member first, and perform the other tests
798 # only if the test succeeds, to avoid the infinite loop.
800 # GDB HEAD 2004-01-27 with hp aCC A.03.45 crashes on the first test.
801 # -- chastain 2004-01-27
803 proc test_print_anon_union {} {
809 gdb_test "print g_anon_union.a" "$vhn = 2" "print anonymous union member"
811 set name "print variable of type anonymous union"
812 gdb_test_multiple "print g_anon_union" $name {
813 -re "$vhn = \{one = 1, \{a = 2, b = 2\}\}$nl$gdb_prompt $" {
818 set re_class "class class_with_anon_union \{${ws}public:"
819 set re_fields "int one;${ws}"
820 set re_anon_union "union \{${ws}int a;${ws}long int b;${ws}\};"
821 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|)\\);"
823 set name "print type of anonymous union"
824 gdb_test_multiple "ptype g_anon_union" $name {
825 -re "type = $re_class${ws}$re_fields${ws}$re_anon_union$nl\}$nl$gdb_prompt $" {
828 -re "type = $re_class${ws}$re_fields${ws}$re_anon_union${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
835 # Single virtual inheritance, print individual members.
837 proc test_print_svi_members { } {
840 # Print all members of g_vA.
841 gdb_test "print g_vA.vA::va" "$vhn = 1"
842 gdb_test "print g_vA.vA::vx" "$vhn = 2"
844 # Print members of g_vA using compact form.
845 gdb_test "print g_vA.va" "$vhn = 1"
846 gdb_test "print g_vA.vx" "$vhn = 2"
848 # Print all members of g_vB.
849 gdb_test "print g_vB.vA::va" "$vhn = 3"
850 gdb_test "print g_vB.vA::vx" "$vhn = 4"
851 gdb_test "print g_vB.vB::vb" "$vhn = 5"
852 gdb_test "print g_vB.vB::vx" "$vhn = 6"
854 # Print members of g_vB using compact form.
855 gdb_test "print g_vB.va" "$vhn = 3"
856 gdb_test "print g_vB.vb" "$vhn = 5"
857 gdb_test "print g_vB.vx" "$vhn = 6"
859 # Print all members of g_vC.
860 gdb_test "print g_vC.vA::va" "$vhn = 7"
861 gdb_test "print g_vC.vA::vx" "$vhn = 8"
862 gdb_test "print g_vC.vC::vc" "$vhn = 9"
863 gdb_test "print g_vC.vC::vx" "$vhn = 10"
865 # Print members of g_vC using compact form.
866 gdb_test "print g_vC.va" "$vhn = 7" "print g_vC.va"
867 gdb_test "print g_vC.vc" "$vhn = 9" "print g_vC.vc"
868 gdb_test "print g_vC.vx" "$vhn = 10" "print g_vC.vx"
871 # Single virtual inheritance, print complete classes.
873 proc test_print_svi_classes { } {
879 # Print all members of g_vA.
880 gdb_test "print g_vA" "$vhn = \{va = 1, vx = 2\}"
882 # Print all members of g_vB.
883 set re_vbptr_2 "(_vb.2vA|_vb.vA)"
884 set re_vbptr_3 "_vptr.vB"
886 set name "print g_vB"
887 gdb_test_multiple "print g_vB" $name {
888 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_2 = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
889 # gcc 2.95.3 -gdwarf-2
890 # gcc 2.95.3 -gstabs+
893 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
894 # gcc 3.3.2 -gdwarf-2
895 # gcc HEAD 2004-01-21 -gdwarf-2
896 # gcc HEAD 2004-01-21 -gstabs+
897 pass "$name (FIXME v3 vtbl ptr)"
899 -re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex <VTT for vB>, vb = 5, vx = 6\}$nl$gdb_prompt $" {
905 # Print all members of g_vC.
906 set re_vbptr_2 "(_vb.2vA|_vb.vA)"
907 set re_vbptr_3 "_vptr.vC"
909 set name "print g_vC"
910 gdb_test_multiple "print g_vC" $name {
911 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_2 = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
912 # gcc 2.95.3 -gdwarf-2
913 # gcc 2.95.3 -gstabs+
916 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
917 # gcc 3.3.2 -gdwarf-2
918 # gcc HEAD 2004-01-21 -gdwarf-2
919 # gcc HEAD 2004-01-21 -gstabs+
920 pass "$name (FIXME v3 vtbl ptr)"
922 -re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex <VTT for vC>, vc = 9, vx = 10\}$nl$gdb_prompt $" {
929 # Multiple virtual inheritance, print individual members.
931 proc test_print_mvi_members { } {
934 # Print all members of g_vD.
935 gdb_test "print g_vD.vA::va" "$vhn = 19"
936 gdb_test "print g_vD.vA::vx" "$vhn = 20"
937 gdb_test "print g_vD.vB::vb" "$vhn = 21"
938 gdb_test "print g_vD.vB::vx" "$vhn = 22"
939 gdb_test "print g_vD.vC::vc" "$vhn = 23"
940 gdb_test "print g_vD.vC::vx" "$vhn = 24"
941 gdb_test "print g_vD.vD::vd" "$vhn = 25"
942 gdb_test "print g_vD.vD::vx" "$vhn = 26"
944 # Print all members of g_vE.
945 gdb_test "print g_vE.vA::va" "$vhn = 0"
946 gdb_test "print g_vE.vA::vx" "$vhn = 0"
947 gdb_test "print g_vE.vB::vb" "$vhn = 0"
948 gdb_test "print g_vE.vB::vx" "$vhn = 0"
949 gdb_test "print g_vE.vC::vc" "$vhn = 0"
950 gdb_test "print g_vE.vC::vx" "$vhn = 0"
951 gdb_test "print g_vE.vD::vd" "$vhn = 0"
952 gdb_test "print g_vE.vD::vx" "$vhn = 0"
953 gdb_test "print g_vE.vE::ve" "$vhn = 27"
954 gdb_test "print g_vE.vE::vx" "$vhn = 28"
957 # Multiple virtual inheritance, print complete classes.
959 proc test_print_mvi_classes { } {
966 # Virtual base pointers for everybody.
968 set re_vbptr_2_vA "(_vb.2vA|_vb.vA)"
969 set re_vbptr_2_vB "(_vb.2vB|_vb.vB)"
970 set re_vbptr_2_vC "(_vb.2vC|_vb.vC)"
971 set re_vbptr_2_vD "(_vb.2vD|_vb.vD)"
972 set re_vbptr_3_vA "_vptr.vA"
973 set re_vbptr_3_vB "_vptr.vB"
974 set re_vbptr_3_vC "_vptr.vC"
975 set re_vbptr_3_vD "_vptr.vD"
976 set re_vbptr_3_vE "_vptr.vE"
978 # Print all members of g_vD.
980 set name "print g_vD"
981 gdb_test_multiple "print g_vD" $name {
982 -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 $" {
983 # gcc 2.95.3 -gdwarf-2
984 # gcc 2.95.3 -gstabs+
987 -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 $" {
988 # gcc 3.3.2 -gdwarf-2
989 # gcc HEAD 2004-01-21 -gdwarf-2
990 # gcc HEAD 2004-01-21 -gstabs+
991 pass "$name (FIXME v3 vtbl ptr)"
993 -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 $" {
999 # Print all members of g_vE.
1001 set name "print g_vE"
1002 gdb_test_multiple "print g_vE" $name {
1003 -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 $" {
1004 # gcc 2.95.3 -gdwarf-2
1005 # gcc 2.95.3 -gstabs+
1008 -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 $" {
1009 # gcc 3.3.2 -gdwarf-2
1010 # gcc 3.3.2 -gstabs+
1011 # gcc HEAD 2004-01-21 -gdwarf-2
1012 # gcc HEAD 2004-01-21 -gstabs+
1013 pass "$name (FIXME v3 vtbl ptr)"
1015 -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 $" {
1016 # gcc 3.2.7-rh -gstabs+
1017 pass "$name (FIXME v3 vtbl ptr)"
1033 # Start with a fresh gdb.
1037 gdb_reinitialize_dir $srcdir/$subdir
1040 gdb_test "set language c++" ""
1041 gdb_test "set width 0" ""
1043 if { ![runto_main] } then {
1044 perror "couldn't run to main"
1053 if { ![runto 'inheritance2'] } then {
1054 perror "couldn't run to inheritance2"
1058 test_print_si_members
1059 test_print_si_classes
1060 test_print_mi_members
1061 test_print_mi_classes
1062 test_print_anon_union
1064 if { ![runto 'inheritance4'] } {
1065 perror "couldn't run to inheritance4"
1069 test_print_svi_members
1070 test_print_svi_classes
1071 test_print_mvi_members
1072 test_print_mvi_classes