From 1105b7eff4c333814e2f260a4ff3df45057a78a4 Mon Sep 17 00:00:00 2001 From: Michael Chastain Date: Sat, 23 Aug 2003 03:55:59 +0000 Subject: 2003-08-22 Michael Chastain * gdb.cp: New directory. * gdb.cp/*: Copy from gdb.c++/*. * gdb.c++/*: Remove. * Makefile.in: Change gdb.c++ to gdb.cp. * configure.in: Ditto. * configure: Regnerate. --- gdb/testsuite/ChangeLog | 9 + gdb/testsuite/Makefile.in | 2 +- gdb/testsuite/configure | 4 +- gdb/testsuite/configure.in | 2 +- gdb/testsuite/gdb.c++/Makefile.in | 16 - gdb/testsuite/gdb.c++/ambiguous.cc | 110 --- gdb/testsuite/gdb.c++/ambiguous.exp | 237 ----- gdb/testsuite/gdb.c++/annota2.cc | 28 - gdb/testsuite/gdb.c++/annota2.exp | 234 ----- gdb/testsuite/gdb.c++/annota3.cc | 28 - gdb/testsuite/gdb.c++/annota3.exp | 238 ----- gdb/testsuite/gdb.c++/anon-union.cc | 55 -- gdb/testsuite/gdb.c++/anon-union.exp | 348 -------- gdb/testsuite/gdb.c++/casts.cc | 20 - gdb/testsuite/gdb.c++/casts.exp | 85 -- gdb/testsuite/gdb.c++/classes.exp | 918 ------------------- gdb/testsuite/gdb.c++/cplusfuncs.cc | 196 ---- gdb/testsuite/gdb.c++/cplusfuncs.exp | 564 ------------ gdb/testsuite/gdb.c++/ctti.exp | 269 ------ gdb/testsuite/gdb.c++/cttiadd.cc | 29 - gdb/testsuite/gdb.c++/cttiadd1.cc | 16 - gdb/testsuite/gdb.c++/cttiadd2.cc | 22 - gdb/testsuite/gdb.c++/cttiadd3.cc | 33 - gdb/testsuite/gdb.c++/demangle.exp | 1582 --------------------------------- gdb/testsuite/gdb.c++/derivation.cc | 240 ----- gdb/testsuite/gdb.c++/derivation.exp | 337 ------- gdb/testsuite/gdb.c++/hang.H | 12 - gdb/testsuite/gdb.c++/hang.exp | 128 --- gdb/testsuite/gdb.c++/hang1.C | 3 - gdb/testsuite/gdb.c++/hang2.C | 8 - gdb/testsuite/gdb.c++/hang3.C | 4 - gdb/testsuite/gdb.c++/inherit.exp | 1018 --------------------- gdb/testsuite/gdb.c++/local.cc | 66 -- gdb/testsuite/gdb.c++/local.exp | 228 ----- gdb/testsuite/gdb.c++/m-data.cc | 64 -- gdb/testsuite/gdb.c++/m-data.exp | 119 --- gdb/testsuite/gdb.c++/m-static.cc | 72 -- gdb/testsuite/gdb.c++/m-static.exp | 128 --- gdb/testsuite/gdb.c++/m-static.h | 11 - gdb/testsuite/gdb.c++/m-static1.cc | 5 - gdb/testsuite/gdb.c++/maint.exp | 113 --- gdb/testsuite/gdb.c++/member-ptr.cc | 106 --- gdb/testsuite/gdb.c++/member-ptr.exp | 549 ------------ gdb/testsuite/gdb.c++/method.cc | 80 -- gdb/testsuite/gdb.c++/method.exp | 194 ---- gdb/testsuite/gdb.c++/misc.cc | 587 ------------ gdb/testsuite/gdb.c++/misc.exp | 159 ---- gdb/testsuite/gdb.c++/namespace.cc | 163 ---- gdb/testsuite/gdb.c++/namespace.exp | 219 ----- gdb/testsuite/gdb.c++/namespace1.cc | 31 - gdb/testsuite/gdb.c++/overload.cc | 168 ---- gdb/testsuite/gdb.c++/overload.exp | 400 --------- gdb/testsuite/gdb.c++/ovldbreak.cc | 177 ---- gdb/testsuite/gdb.c++/ovldbreak.exp | 360 -------- gdb/testsuite/gdb.c++/pr-1023.cc | 20 - gdb/testsuite/gdb.c++/pr-1023.exp | 79 -- gdb/testsuite/gdb.c++/pr-1210.cc | 19 - gdb/testsuite/gdb.c++/pr-1210.exp | 76 -- gdb/testsuite/gdb.c++/pr-574.cc | 22 - gdb/testsuite/gdb.c++/pr-574.exp | 72 -- gdb/testsuite/gdb.c++/printmethod.cc | 14 - gdb/testsuite/gdb.c++/printmethod.exp | 69 -- gdb/testsuite/gdb.c++/psmang.exp | 226 ----- gdb/testsuite/gdb.c++/psmang1.cc | 159 ---- gdb/testsuite/gdb.c++/psmang2.cc | 152 ---- gdb/testsuite/gdb.c++/ref-types.cc | 79 -- gdb/testsuite/gdb.c++/ref-types.exp | 663 -------------- gdb/testsuite/gdb.c++/rtti.exp | 127 --- gdb/testsuite/gdb.c++/rtti.h | 48 - gdb/testsuite/gdb.c++/rtti1.cc | 67 -- gdb/testsuite/gdb.c++/rtti2.cc | 36 - gdb/testsuite/gdb.c++/templates.cc | 785 ---------------- gdb/testsuite/gdb.c++/templates.exp | 516 ----------- gdb/testsuite/gdb.c++/try_catch.cc | 121 --- gdb/testsuite/gdb.c++/try_catch.exp | 82 -- gdb/testsuite/gdb.c++/userdef.cc | 341 ------- gdb/testsuite/gdb.c++/userdef.exp | 148 --- gdb/testsuite/gdb.c++/virtfunc.cc | 201 ----- gdb/testsuite/gdb.c++/virtfunc.exp | 948 -------------------- gdb/testsuite/gdb.cp/Makefile.in | 16 + gdb/testsuite/gdb.cp/ambiguous.cc | 110 +++ gdb/testsuite/gdb.cp/ambiguous.exp | 237 +++++ gdb/testsuite/gdb.cp/annota2.cc | 28 + gdb/testsuite/gdb.cp/annota2.exp | 234 +++++ gdb/testsuite/gdb.cp/annota3.cc | 28 + gdb/testsuite/gdb.cp/annota3.exp | 238 +++++ gdb/testsuite/gdb.cp/anon-union.cc | 55 ++ gdb/testsuite/gdb.cp/anon-union.exp | 348 ++++++++ gdb/testsuite/gdb.cp/casts.cc | 20 + gdb/testsuite/gdb.cp/casts.exp | 85 ++ gdb/testsuite/gdb.cp/classes.exp | 918 +++++++++++++++++++ gdb/testsuite/gdb.cp/cplusfuncs.cc | 196 ++++ gdb/testsuite/gdb.cp/cplusfuncs.exp | 564 ++++++++++++ gdb/testsuite/gdb.cp/ctti.exp | 269 ++++++ gdb/testsuite/gdb.cp/cttiadd.cc | 29 + gdb/testsuite/gdb.cp/cttiadd1.cc | 16 + gdb/testsuite/gdb.cp/cttiadd2.cc | 22 + gdb/testsuite/gdb.cp/cttiadd3.cc | 33 + gdb/testsuite/gdb.cp/demangle.exp | 1582 +++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.cp/derivation.cc | 240 +++++ gdb/testsuite/gdb.cp/derivation.exp | 337 +++++++ gdb/testsuite/gdb.cp/hang.H | 12 + gdb/testsuite/gdb.cp/hang.exp | 128 +++ gdb/testsuite/gdb.cp/hang1.C | 3 + gdb/testsuite/gdb.cp/hang2.C | 8 + gdb/testsuite/gdb.cp/hang3.C | 4 + gdb/testsuite/gdb.cp/inherit.exp | 1018 +++++++++++++++++++++ gdb/testsuite/gdb.cp/local.cc | 66 ++ gdb/testsuite/gdb.cp/local.exp | 228 +++++ gdb/testsuite/gdb.cp/m-data.cc | 64 ++ gdb/testsuite/gdb.cp/m-data.exp | 119 +++ gdb/testsuite/gdb.cp/m-static.cc | 72 ++ gdb/testsuite/gdb.cp/m-static.exp | 128 +++ gdb/testsuite/gdb.cp/m-static.h | 11 + gdb/testsuite/gdb.cp/m-static1.cc | 5 + gdb/testsuite/gdb.cp/maint.exp | 113 +++ gdb/testsuite/gdb.cp/member-ptr.cc | 106 +++ gdb/testsuite/gdb.cp/member-ptr.exp | 549 ++++++++++++ gdb/testsuite/gdb.cp/method.cc | 80 ++ gdb/testsuite/gdb.cp/method.exp | 194 ++++ gdb/testsuite/gdb.cp/misc.cc | 587 ++++++++++++ gdb/testsuite/gdb.cp/misc.exp | 159 ++++ gdb/testsuite/gdb.cp/namespace.cc | 163 ++++ gdb/testsuite/gdb.cp/namespace.exp | 219 +++++ gdb/testsuite/gdb.cp/namespace1.cc | 31 + gdb/testsuite/gdb.cp/overload.cc | 168 ++++ gdb/testsuite/gdb.cp/overload.exp | 400 +++++++++ gdb/testsuite/gdb.cp/ovldbreak.cc | 177 ++++ gdb/testsuite/gdb.cp/ovldbreak.exp | 360 ++++++++ gdb/testsuite/gdb.cp/pr-1023.cc | 20 + gdb/testsuite/gdb.cp/pr-1023.exp | 79 ++ gdb/testsuite/gdb.cp/pr-1210.cc | 19 + gdb/testsuite/gdb.cp/pr-1210.exp | 76 ++ gdb/testsuite/gdb.cp/pr-574.cc | 22 + gdb/testsuite/gdb.cp/pr-574.exp | 72 ++ gdb/testsuite/gdb.cp/printmethod.cc | 14 + gdb/testsuite/gdb.cp/printmethod.exp | 69 ++ gdb/testsuite/gdb.cp/psmang.exp | 226 +++++ gdb/testsuite/gdb.cp/psmang1.cc | 159 ++++ gdb/testsuite/gdb.cp/psmang2.cc | 152 ++++ gdb/testsuite/gdb.cp/ref-types.cc | 79 ++ gdb/testsuite/gdb.cp/ref-types.exp | 663 ++++++++++++++ gdb/testsuite/gdb.cp/rtti.exp | 127 +++ gdb/testsuite/gdb.cp/rtti.h | 48 + gdb/testsuite/gdb.cp/rtti1.cc | 67 ++ gdb/testsuite/gdb.cp/rtti2.cc | 36 + gdb/testsuite/gdb.cp/templates.cc | 785 ++++++++++++++++ gdb/testsuite/gdb.cp/templates.exp | 516 +++++++++++ gdb/testsuite/gdb.cp/try_catch.cc | 121 +++ gdb/testsuite/gdb.cp/try_catch.exp | 82 ++ gdb/testsuite/gdb.cp/userdef.cc | 341 +++++++ gdb/testsuite/gdb.cp/userdef.exp | 148 +++ gdb/testsuite/gdb.cp/virtfunc.cc | 201 +++++ gdb/testsuite/gdb.cp/virtfunc.exp | 948 ++++++++++++++++++++ 154 files changed, 15860 insertions(+), 15851 deletions(-) delete mode 100644 gdb/testsuite/gdb.c++/Makefile.in delete mode 100644 gdb/testsuite/gdb.c++/ambiguous.cc delete mode 100644 gdb/testsuite/gdb.c++/ambiguous.exp delete mode 100644 gdb/testsuite/gdb.c++/annota2.cc delete mode 100644 gdb/testsuite/gdb.c++/annota2.exp delete mode 100644 gdb/testsuite/gdb.c++/annota3.cc delete mode 100644 gdb/testsuite/gdb.c++/annota3.exp delete mode 100644 gdb/testsuite/gdb.c++/anon-union.cc delete mode 100644 gdb/testsuite/gdb.c++/anon-union.exp delete mode 100644 gdb/testsuite/gdb.c++/casts.cc delete mode 100644 gdb/testsuite/gdb.c++/casts.exp delete mode 100644 gdb/testsuite/gdb.c++/classes.exp delete mode 100644 gdb/testsuite/gdb.c++/cplusfuncs.cc delete mode 100644 gdb/testsuite/gdb.c++/cplusfuncs.exp delete mode 100644 gdb/testsuite/gdb.c++/ctti.exp delete mode 100644 gdb/testsuite/gdb.c++/cttiadd.cc delete mode 100644 gdb/testsuite/gdb.c++/cttiadd1.cc delete mode 100644 gdb/testsuite/gdb.c++/cttiadd2.cc delete mode 100644 gdb/testsuite/gdb.c++/cttiadd3.cc delete mode 100644 gdb/testsuite/gdb.c++/demangle.exp delete mode 100644 gdb/testsuite/gdb.c++/derivation.cc delete mode 100644 gdb/testsuite/gdb.c++/derivation.exp delete mode 100644 gdb/testsuite/gdb.c++/hang.H delete mode 100644 gdb/testsuite/gdb.c++/hang.exp delete mode 100644 gdb/testsuite/gdb.c++/hang1.C delete mode 100644 gdb/testsuite/gdb.c++/hang2.C delete mode 100644 gdb/testsuite/gdb.c++/hang3.C delete mode 100644 gdb/testsuite/gdb.c++/inherit.exp delete mode 100644 gdb/testsuite/gdb.c++/local.cc delete mode 100644 gdb/testsuite/gdb.c++/local.exp delete mode 100644 gdb/testsuite/gdb.c++/m-data.cc delete mode 100644 gdb/testsuite/gdb.c++/m-data.exp delete mode 100644 gdb/testsuite/gdb.c++/m-static.cc delete mode 100644 gdb/testsuite/gdb.c++/m-static.exp delete mode 100644 gdb/testsuite/gdb.c++/m-static.h delete mode 100644 gdb/testsuite/gdb.c++/m-static1.cc delete mode 100644 gdb/testsuite/gdb.c++/maint.exp delete mode 100644 gdb/testsuite/gdb.c++/member-ptr.cc delete mode 100644 gdb/testsuite/gdb.c++/member-ptr.exp delete mode 100644 gdb/testsuite/gdb.c++/method.cc delete mode 100644 gdb/testsuite/gdb.c++/method.exp delete mode 100644 gdb/testsuite/gdb.c++/misc.cc delete mode 100644 gdb/testsuite/gdb.c++/misc.exp delete mode 100644 gdb/testsuite/gdb.c++/namespace.cc delete mode 100644 gdb/testsuite/gdb.c++/namespace.exp delete mode 100644 gdb/testsuite/gdb.c++/namespace1.cc delete mode 100644 gdb/testsuite/gdb.c++/overload.cc delete mode 100644 gdb/testsuite/gdb.c++/overload.exp delete mode 100644 gdb/testsuite/gdb.c++/ovldbreak.cc delete mode 100644 gdb/testsuite/gdb.c++/ovldbreak.exp delete mode 100644 gdb/testsuite/gdb.c++/pr-1023.cc delete mode 100644 gdb/testsuite/gdb.c++/pr-1023.exp delete mode 100644 gdb/testsuite/gdb.c++/pr-1210.cc delete mode 100644 gdb/testsuite/gdb.c++/pr-1210.exp delete mode 100644 gdb/testsuite/gdb.c++/pr-574.cc delete mode 100644 gdb/testsuite/gdb.c++/pr-574.exp delete mode 100644 gdb/testsuite/gdb.c++/printmethod.cc delete mode 100644 gdb/testsuite/gdb.c++/printmethod.exp delete mode 100644 gdb/testsuite/gdb.c++/psmang.exp delete mode 100644 gdb/testsuite/gdb.c++/psmang1.cc delete mode 100644 gdb/testsuite/gdb.c++/psmang2.cc delete mode 100644 gdb/testsuite/gdb.c++/ref-types.cc delete mode 100644 gdb/testsuite/gdb.c++/ref-types.exp delete mode 100644 gdb/testsuite/gdb.c++/rtti.exp delete mode 100644 gdb/testsuite/gdb.c++/rtti.h delete mode 100644 gdb/testsuite/gdb.c++/rtti1.cc delete mode 100644 gdb/testsuite/gdb.c++/rtti2.cc delete mode 100644 gdb/testsuite/gdb.c++/templates.cc delete mode 100644 gdb/testsuite/gdb.c++/templates.exp delete mode 100644 gdb/testsuite/gdb.c++/try_catch.cc delete mode 100644 gdb/testsuite/gdb.c++/try_catch.exp delete mode 100644 gdb/testsuite/gdb.c++/userdef.cc delete mode 100644 gdb/testsuite/gdb.c++/userdef.exp delete mode 100644 gdb/testsuite/gdb.c++/virtfunc.cc delete mode 100644 gdb/testsuite/gdb.c++/virtfunc.exp create mode 100644 gdb/testsuite/gdb.cp/Makefile.in create mode 100644 gdb/testsuite/gdb.cp/ambiguous.cc create mode 100644 gdb/testsuite/gdb.cp/ambiguous.exp create mode 100644 gdb/testsuite/gdb.cp/annota2.cc create mode 100644 gdb/testsuite/gdb.cp/annota2.exp create mode 100644 gdb/testsuite/gdb.cp/annota3.cc create mode 100644 gdb/testsuite/gdb.cp/annota3.exp create mode 100644 gdb/testsuite/gdb.cp/anon-union.cc create mode 100644 gdb/testsuite/gdb.cp/anon-union.exp create mode 100644 gdb/testsuite/gdb.cp/casts.cc create mode 100644 gdb/testsuite/gdb.cp/casts.exp create mode 100644 gdb/testsuite/gdb.cp/classes.exp create mode 100644 gdb/testsuite/gdb.cp/cplusfuncs.cc create mode 100644 gdb/testsuite/gdb.cp/cplusfuncs.exp create mode 100644 gdb/testsuite/gdb.cp/ctti.exp create mode 100644 gdb/testsuite/gdb.cp/cttiadd.cc create mode 100644 gdb/testsuite/gdb.cp/cttiadd1.cc create mode 100644 gdb/testsuite/gdb.cp/cttiadd2.cc create mode 100644 gdb/testsuite/gdb.cp/cttiadd3.cc create mode 100644 gdb/testsuite/gdb.cp/demangle.exp create mode 100644 gdb/testsuite/gdb.cp/derivation.cc create mode 100644 gdb/testsuite/gdb.cp/derivation.exp create mode 100644 gdb/testsuite/gdb.cp/hang.H create mode 100644 gdb/testsuite/gdb.cp/hang.exp create mode 100644 gdb/testsuite/gdb.cp/hang1.C create mode 100644 gdb/testsuite/gdb.cp/hang2.C create mode 100644 gdb/testsuite/gdb.cp/hang3.C create mode 100644 gdb/testsuite/gdb.cp/inherit.exp create mode 100644 gdb/testsuite/gdb.cp/local.cc create mode 100644 gdb/testsuite/gdb.cp/local.exp create mode 100644 gdb/testsuite/gdb.cp/m-data.cc create mode 100644 gdb/testsuite/gdb.cp/m-data.exp create mode 100644 gdb/testsuite/gdb.cp/m-static.cc create mode 100644 gdb/testsuite/gdb.cp/m-static.exp create mode 100644 gdb/testsuite/gdb.cp/m-static.h create mode 100644 gdb/testsuite/gdb.cp/m-static1.cc create mode 100644 gdb/testsuite/gdb.cp/maint.exp create mode 100644 gdb/testsuite/gdb.cp/member-ptr.cc create mode 100644 gdb/testsuite/gdb.cp/member-ptr.exp create mode 100644 gdb/testsuite/gdb.cp/method.cc create mode 100644 gdb/testsuite/gdb.cp/method.exp create mode 100644 gdb/testsuite/gdb.cp/misc.cc create mode 100644 gdb/testsuite/gdb.cp/misc.exp create mode 100644 gdb/testsuite/gdb.cp/namespace.cc create mode 100644 gdb/testsuite/gdb.cp/namespace.exp create mode 100644 gdb/testsuite/gdb.cp/namespace1.cc create mode 100644 gdb/testsuite/gdb.cp/overload.cc create mode 100644 gdb/testsuite/gdb.cp/overload.exp create mode 100644 gdb/testsuite/gdb.cp/ovldbreak.cc create mode 100644 gdb/testsuite/gdb.cp/ovldbreak.exp create mode 100644 gdb/testsuite/gdb.cp/pr-1023.cc create mode 100644 gdb/testsuite/gdb.cp/pr-1023.exp create mode 100644 gdb/testsuite/gdb.cp/pr-1210.cc create mode 100644 gdb/testsuite/gdb.cp/pr-1210.exp create mode 100644 gdb/testsuite/gdb.cp/pr-574.cc create mode 100644 gdb/testsuite/gdb.cp/pr-574.exp create mode 100644 gdb/testsuite/gdb.cp/printmethod.cc create mode 100644 gdb/testsuite/gdb.cp/printmethod.exp create mode 100644 gdb/testsuite/gdb.cp/psmang.exp create mode 100644 gdb/testsuite/gdb.cp/psmang1.cc create mode 100644 gdb/testsuite/gdb.cp/psmang2.cc create mode 100644 gdb/testsuite/gdb.cp/ref-types.cc create mode 100644 gdb/testsuite/gdb.cp/ref-types.exp create mode 100644 gdb/testsuite/gdb.cp/rtti.exp create mode 100644 gdb/testsuite/gdb.cp/rtti.h create mode 100644 gdb/testsuite/gdb.cp/rtti1.cc create mode 100644 gdb/testsuite/gdb.cp/rtti2.cc create mode 100644 gdb/testsuite/gdb.cp/templates.cc create mode 100644 gdb/testsuite/gdb.cp/templates.exp create mode 100644 gdb/testsuite/gdb.cp/try_catch.cc create mode 100644 gdb/testsuite/gdb.cp/try_catch.exp create mode 100644 gdb/testsuite/gdb.cp/userdef.cc create mode 100644 gdb/testsuite/gdb.cp/userdef.exp create mode 100644 gdb/testsuite/gdb.cp/virtfunc.cc create mode 100644 gdb/testsuite/gdb.cp/virtfunc.exp (limited to 'gdb') diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8657935..c32a6a5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2003-08-22 Michael Chastain + + * gdb.cp: New directory. + * gdb.cp/*: Copy from gdb.c++/*. + * gdb.c++/*: Remove. + * Makefile.in: Change gdb.c++ to gdb.cp. + * configure.in: Ditto. + * configure: Regnerate. + 2003-08-18 Mark Kettenis * gdb.arch/i386-prologue.exp: Add testcase for PR backtrace/1338. diff --git a/gdb/testsuite/Makefile.in b/gdb/testsuite/Makefile.in index 898e6ed..3f3b7ad 100644 --- a/gdb/testsuite/Makefile.in +++ b/gdb/testsuite/Makefile.in @@ -35,7 +35,7 @@ SHELL = @SHELL@ EXEEXT = @EXEEXT@ SUBDIRS = @subdirs@ RPATH_ENVVAR = @RPATH_ENVVAR@ -ALL_SUBDIRS = gdb.arch gdb.asm gdb.base gdb.c++ gdb.disasm gdb.java gdb.mi \ +ALL_SUBDIRS = gdb.arch gdb.asm gdb.base gdb.cp gdb.disasm gdb.java gdb.mi \ gdb.objc gdb.threads gdb.trace $(SUBDIRS) EXPECT = `if [ -f $${rootme}/../../expect/expect ] ; then \ diff --git a/gdb/testsuite/configure b/gdb/testsuite/configure index eb505fe..f5cb089 100755 --- a/gdb/testsuite/configure +++ b/gdb/testsuite/configure @@ -1050,7 +1050,7 @@ done ac_given_srcdir=$srcdir trap 'rm -fr `echo "Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile \ - gdb.c++/Makefile gdb.disasm/Makefile gdb.java/Makefile gdb.mi/Makefile \ + gdb.cp/Makefile gdb.disasm/Makefile gdb.java/Makefile gdb.mi/Makefile \ gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF diff --git a/gdb/testsuite/configure.in b/gdb/testsuite/configure.in index 14300ec..c60cf57 100644 --- a/gdb/testsuite/configure.in +++ b/gdb/testsuite/configure.in @@ -113,5 +113,5 @@ AC_EXEEXT AC_CONFIG_SUBDIRS($configdirs) AC_OUTPUT([Makefile gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile \ - gdb.c++/Makefile gdb.disasm/Makefile gdb.java/Makefile gdb.mi/Makefile \ + gdb.cp/Makefile gdb.disasm/Makefile gdb.java/Makefile gdb.mi/Makefile \ gdb.objc/Makefile gdb.threads/Makefile gdb.trace/Makefile]) diff --git a/gdb/testsuite/gdb.c++/Makefile.in b/gdb/testsuite/gdb.c++/Makefile.in deleted file mode 100644 index 8f4a90e..0000000 --- a/gdb/testsuite/gdb.c++/Makefile.in +++ /dev/null @@ -1,16 +0,0 @@ -VPATH = @srcdir@ -srcdir = @srcdir@ - -EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \ - derivation inherit local member-ptr method misc \ - overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace ref-types - -all info install-info dvi install uninstall installcheck check: - @echo "Nothing to be done for $@..." - -clean mostlyclean: - -rm -f *~ *.o *.ci - -rm -f core ${EXECUTABLES} - -distclean maintainer-clean realclean: clean - -rm -f Makefile config.status config.log diff --git a/gdb/testsuite/gdb.c++/ambiguous.cc b/gdb/testsuite/gdb.c++/ambiguous.cc deleted file mode 100644 index 6ee7bc1..0000000 --- a/gdb/testsuite/gdb.c++/ambiguous.cc +++ /dev/null @@ -1,110 +0,0 @@ - -void marker1() -{ - return; -} - -class A1 { -public: - int x; - int y; -}; - -class A2 { -public: - int x; - int y; -}; - -class A3 { -public: - int x; - int y; -}; - -class X : public A1, public A2 { -public: - int z; -}; - -class L : public A1 { -public: - int z; -}; - -class LV : public virtual A1 { -public: - int z; -}; - -class M : public A2 { -public: - int w; -}; - -class N : public L, public M { -public: - int r; -}; - -class K : public A1 { -public: - int i; -}; - -class KV : public virtual A1 { -public: - int i; -}; - -class J : public K, public L { -public: - int j; -}; - -class JV : public KV, public LV { -public: - int jv; -}; - -class JVA1 : public KV, public LV, public A1 { -public: - int jva1; -}; - -class JVA2 : public KV, public LV, public A2 { -public: - int jva2; -}; - -class JVA1V : public KV, public LV, public virtual A1 { -public: - int jva1v; -}; - -int main() -{ - A1 a1; - A2 a2; - A3 a3; - X x; - L l; - M m; - N n; - K k; - J j; - JV jv; - JVA1 jva1; - JVA2 jva2; - JVA1V jva1v; - - int i; - - i += k.i + m.w + a1.x + a2.x + a3.x + x.z + l.z + n.r + j.j; - - marker1(); - -} - - - diff --git a/gdb/testsuite/gdb.c++/ambiguous.exp b/gdb/testsuite/gdb.c++/ambiguous.exp deleted file mode 100644 index 4224b2d..0000000 --- a/gdb/testsuite/gdb.c++/ambiguous.exp +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright 1998, 1999 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file is part of the gdb testsuite - -# tests relating to ambiguous class members -# Written by Satish Pai 1997-07-28 - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# - -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "ambiguous" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile} "c++"] { - return -1; -} - -if { $gcc_compiled } then { continue } - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -# -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" - send_gdb "cont\n" - gdb_expect { - -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { - send_gdb "up\n" - gdb_expect { - -re ".*$gdb_prompt $" { pass "up from marker1" } - timeout { fail "up from marker1" } - } - } - -re "$gdb_prompt $" { fail "continue to marker1" } - timeout { fail "(timeout) continue to marker1" } - } - -# print out various class objects' members. The values aren't -# important, just check that the warning is emitted at the -# right times. - -# X is derived from A1 and A2; both A1 and A2 have a member 'x' -send_gdb "print x.x\n" -gdb_expect { - -re "warning: x ambiguous; using X::A2::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print x.x" - } - -re "warning: x ambiguous; using X::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print x.x" - } - -re ".*$gdb_prompt $" { fail "print x.x" } - timeout { fail "(timeout) print x.x" } -} - - -# N is derived from A1 and A2, but not immediately -- two steps -# up in the hierarchy. Both A1 and A2 have a member 'x'. -send_gdb "print n.x\n" -gdb_expect { - -re "warning: x ambiguous; using N::M::A2::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print n.x" - } - -re "warning: x ambiguous; using N::L::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print n.x" - } - -re ".*$gdb_prompt $" { fail "print n.x" } - timeout { fail "(timeout) print n.x" } -} - -# J is derived from A1 twice. A1 has a member x. -send_gdb "print j.x\n" -gdb_expect { - -re "warning: x ambiguous; using J::L::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print j.x" - } - -re "warning: x ambiguous; using J::K::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print j.x" - } - -re ".*$gdb_prompt $" { fail "print j.x" } - timeout { fail "(timeout) print j.x" } -} - -# JV is derived from A1 but A1 is a virtual base. Should not -# report an ambiguity in this case. -send_gdb "print jv.x\n" -gdb_expect { - -re "warning: x ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - fail "print jv.x (ambiguity reported)" - } - -re "\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { pass "print jv.x" } - -re ".*$gdb_prompt $" { fail "print jv.x (??)" } - timeout { fail "(timeout) print jv.x" } -} - -# JVA1 is derived from A1; A1 occurs as a virtual base in two -# ancestors, and as a non-virtual immediate base. Ambiguity must -# be reported. -send_gdb "print jva1.x\n" -gdb_expect { - -re "warning: x ambiguous; using JVA1::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print jva1.x" - } - -re "warning: x ambiguous; using JVA1::KV::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print jva1.x" - } - -re ".*$gdb_prompt $" { fail "print jva1.x" } - timeout { fail "(timeout) print jva1.x" } -} - -# JVA2 is derived from A1 & A2; A1 occurs as a virtual base in two -# ancestors, and A2 is a non-virtual immediate base. Ambiguity must -# be reported as A1 and A2 both have a member 'x'. -send_gdb "print jva2.x\n" -gdb_expect { - -re "warning: x ambiguous; using JVA2::A2::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print jva2.x" - } - -re "warning: x ambiguous; using JVA2::KV::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - pass "print jva2.x" - } - -re ".*$gdb_prompt $" { fail "print jva2.x" } - timeout { fail "(timeout) print jva2.x" } -} - -# JVA1V is derived from A1; A1 occurs as a virtual base in two -# ancestors, and also as a virtual immediate base. Ambiguity must -# not be reported. -send_gdb "print jva1v.x\n" -gdb_expect { - -re "warning: x ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { - fail "print jva1v.x (ambiguity reported)" - } - -re "\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { pass "print jva1v.x" } - -re ".*$gdb_prompt $" { fail "print jva1v.x (??)" } - timeout { fail "(timeout) print jva1v.x" } -} - -# Now check for ambiguous bases. - -# J is derived from A1 twice; report ambiguity if a J is -# cast to an A1. -send_gdb "print (A1)j\n" -gdb_expect { - -re "warning: A1 ambiguous; using J::L::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { - pass "print (A1)j" - } - -re "warning: A1 ambiguous; using J::K::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { - pass "print (A1)j" - } - -re ".*$gdb_prompt $" { fail "print (A1)j" } - timeout { fail "(timeout) print (A1)j" } -} - -# JV is derived from A1 twice, but A1 is a virtual base; should -# not report ambiguity when a JV is cast to an A1. -send_gdb "print (A1)jv\n" -gdb_expect { - -re "warning: A1 ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { - fail "print (A1)jv (ambiguity reported)" - } - -re "\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { pass "print (A1)jv" } - -re ".*$gdb_prompt $" { fail "print (A1)jv (??)" } - timeout { fail "(timeout) print (A1)jv" } -} - -# JVA1 is derived from A1; A1 is a virtual base and also a -# non-virtual base. Must report ambiguity if a JVA1 is cast to an A1. -send_gdb "print (A1)jva1\n" -gdb_expect { - -re "warning: A1 ambiguous; using JVA1::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { - pass "print (A1)jva1" - } - -re "warning: A1 ambiguous; using JVA1::KV::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { - pass "print (A1)jva1" - } - -re ".*$gdb_prompt $" { fail "print (A1)jva1" } - timeout { fail "(timeout) print (A1)jva1" } -} - -# JVA1V is derived from A1; A1 is a virtual base indirectly -# and also directly; must not report ambiguity when a JVA1V is cast to an A1. -send_gdb "print (A1)jva1v\n" -gdb_expect { - -re "warning: A1 ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { - fail "print (A1)jva1v (ambiguity reported)" - } - -re "\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { pass "print (A1)jva1v" - } - -re ".*$gdb_prompt $" { fail "print (A1)jva1v (??)" } - timeout { fail "(timeout) print (A1)jva1v" } -} - diff --git a/gdb/testsuite/gdb.c++/annota2.cc b/gdb/testsuite/gdb.c++/annota2.cc deleted file mode 100644 index 234752e..0000000 --- a/gdb/testsuite/gdb.c++/annota2.cc +++ /dev/null @@ -1,28 +0,0 @@ -#include - -class A { -public: - int x; - int y; - int foo (int arg); -}; - - -int A::foo (int arg) -{ - x += arg; - return arg *2; -} - -int main() -{ - A a; - - a.x = 0; - a.x = 1; - a.y = 2; - - printf ("a.x is %d\n", a.x); - return 0; -} - diff --git a/gdb/testsuite/gdb.c++/annota2.exp b/gdb/testsuite/gdb.c++/annota2.exp deleted file mode 100644 index 0446eb3..0000000 --- a/gdb/testsuite/gdb.c++/annota2.exp +++ /dev/null @@ -1,234 +0,0 @@ -# Copyright 1999, 2000, 2001, 2002, 2003 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Elena Zannoni (ezannoni@cygnus.com) - -if $tracelevel then { - strace $tracelevel -} - - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "annota2" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++ additional_flags=-w}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# are we on a target board? If so, don't run these tests. -# note: this is necessary because we cannot use runto_main (which would -# work for remote targets too) because of the different prompt we get -# when using annotation level 2. -# -if [is_remote target] then { - return 0 -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if [target_info exists gdb_stub] { - gdb_step_for_stub; -} - -# -# line number where we need to stop in main -# -set main_line 25 - -# The commands we test here produce many lines of output; disable "press -# to continue" prompts. -send_gdb "set height 0\n" -gdb_expect -re "$gdb_prompt $" - -# -# break at main -# -gdb_test "break 25" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ - "breakpoint main" - - -# -# NOTE: this prompt is OK only when the annotation level is > 1 -# NOTE: When this prompt is in use the gdb_test procedure cannot be used because -# it assumes that the last char of the gdb_prompt is a white space. This is not -# true with this annotated prompt. So we must use send_gdb and gdb_expect. -# - -set old_gdb_prompt $gdb_prompt -set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n" - -send_gdb "set annotate 2\n" -gdb_expect { - -re "set annotate 2\r\n$gdb_prompt$" { pass "annotation set at level 2" } - -re ".*$gdb_prompt$" { fail "annotation set at level 2" } - timeout { fail "annotation set at level 2 (timeout)" } - } - -send_gdb "run\n" - gdb_expect { - -re "$main_line.*$gdb_prompt$" { pass "run until main breakpoint" } - -re ".*$gdb_prompt$" { fail "run until main breakpoint" } - timeout { fail "run until main breakpoint (timeout)" } - } - -# -# print class 'a' with public fields. -# this will test: -# annotate-field-begin -# annotate-field-name-end -# annotate-field-value -# annotate-field-end -# -send_gdb "print a\n" -gdb_expect { - -re "\r\n\032\032post-prompt\r\n\r\n\032\032value-history-begin 1 -\r\n.*= \r\n\032\032value-history-value\r\n\\{\r\n\032\032field-begin -\r\nx\r\n\032\032field-name-end\r\n = \r\n\032\032field-value\r\n1\r\n\032\032field-end\r\n, \r\n\032\032field-begin -\r\ny\r\n\032\032field-name-end\r\n = \r\n\032\032field-value\r\n2\r\n\032\032field-end\r\n\\}\r\n\r\n\032\032value-history-end\r\n$gdb_prompt$" \ - { pass "print class" } - -re ".*$gdb_prompt$" { fail "print class" } - timeout { fail "print class (timeout)" } -} - -# -# continue until exit -# this will test: -# annotate-exited -# -send_gdb "continue\n" -gdb_expect { - -re "\r\n\032\032post-prompt\r\nContinuing.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\na.x is 1\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032exited 0\r\n\r\nProgram exited normally.\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ - { pass "continue until exit" } - -re ".*$gdb_prompt$" { fail "continue to exit" } - timeout { fail "continue to exit (timeout)" } -} - -# -# delete all breakpoints -# -send_gdb "delete\n" -gdb_expect { - -re ".*Delete all breakpoints. \\(y or n\\) \r\n\032\032query.*$" { - send_gdb "y\n" - gdb_expect { - -re "\r\n\032\032post-query\r\n$gdb_prompt$" { pass "delete bps" } - -re ".*$gdb_prompt$" { fail "delete bps" } - timeout { fail "delete bps (timeout)" } - } - } - -re ".*$gdb_prompt$" { fail "delete bps" } - timeout { fail "delete bps (timeout)" } -} - -# -# break at first line of main. -# -send_gdb "break 22\n" -gdb_expect { - -re "\r\n\032\032post-prompt\r\n\r\n\032\032breakpoints-invalid\r\nBreakpoint.*at $hex: file.*$srcfile, line.*\r\n$gdb_prompt$" \ - { pass "breakpoint at main" } - -re ".*$gdb_prompt$" { fail "break at main" } - timeout { fail "break at main (timeout)" } -} - -# -# change value of main_line -# -set main_line 22 - -# -# run program up to breakpoint. -# - - -send_gdb "run\n" - gdb_expect { - -re "$main_line.*$gdb_prompt$" { pass "run until main breakpoint" } - -re ".*$gdb_prompt$" { fail "run until main breakpoint" } - timeout { fail "run until main breakpoint (timeout)" } - } - -# -# set up a watch point on a.x -# -send_gdb "watch a.x\n" -gdb_expect { - -re "\r\n\032\032post-prompt\r\n\r\n\032\032breakpoints-invalid\r\n.*atchpoint 3: a.x\r\n$gdb_prompt$" \ - { pass "set watch on a.x" } - -re ".*$gdb_prompt$" { fail "set watch on a.x" } - timeout { fail "set watch on a.x (timeout)" } -} - -# -# do a next, so that the watchpoint triggers. This will test: -# annotate-watchpoint -# -send_gdb "next\n" -gdb_expect { - -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032watchpoint 3\r\nWatchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\n\r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*$srcfile\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$decimal\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ - { pass "watch triggered on a.x" } - -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032watchpoint 3\r\n\.*atchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\n\r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*$srcfile\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$decimal\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n.*$gdb_prompt$" \ - { pass "watch triggered on a.x" } - -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ - { kfail "gdb/38" "watch triggered on a.x" } - -re ".*$gdb_prompt$" { fail "watch triggered on a.x" } - timeout { fail "watch triggered on a.x (timeout)" } -} - - -# -# send ^C to gdb, so that the quit() function gets called -# and annotate-quit is tested -# test: -# annotate-quit -# -# This test sometimes fails, but not reproducibly. See gdb/544. -# -send_gdb "\003" -gdb_expect { - -re "\r\n\032\032error-begin\r\nQuit\r\n\r\n\032\032quit\r\n$gdb_prompt$" \ - { pass "annotate-quit" } - -re "$gdb_prompt$" { kfail "gdb/544" "annotate-quit" } - -re ".*$gdb_prompt$" { fail "annotate-quit" } - timeout { fail "annotate-quit (timeout)" } -} - -# -# FIXME: the testsuite does not currently have tests for -# annotate_catchpoints and annotate_function_call -# and a few variants of the annotations that are -# tested (marked by FIXME on the annot?.exp files) -# - -# reinstall the old prompt for the rest of the testsuite. - -set gdb_prompt $old_gdb_prompt - diff --git a/gdb/testsuite/gdb.c++/annota3.cc b/gdb/testsuite/gdb.c++/annota3.cc deleted file mode 100644 index 234752e..0000000 --- a/gdb/testsuite/gdb.c++/annota3.cc +++ /dev/null @@ -1,28 +0,0 @@ -#include - -class A { -public: - int x; - int y; - int foo (int arg); -}; - - -int A::foo (int arg) -{ - x += arg; - return arg *2; -} - -int main() -{ - A a; - - a.x = 0; - a.x = 1; - a.y = 2; - - printf ("a.x is %d\n", a.x); - return 0; -} - diff --git a/gdb/testsuite/gdb.c++/annota3.exp b/gdb/testsuite/gdb.c++/annota3.exp deleted file mode 100644 index 431ed4f..0000000 --- a/gdb/testsuite/gdb.c++/annota3.exp +++ /dev/null @@ -1,238 +0,0 @@ -# Copyright 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Elena Zannoni (ezannoni@cygnus.com) - -if $tracelevel then { - strace $tracelevel -} - - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "annota3" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++ additional_flags=-w}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# are we on a target board? If so, don't run these tests. -# note: this is necessary because we cannot use runto_main (which would -# work for remote targets too) because of the different prompt we get -# when using annotation level 2. -# -if [is_remote target] then { - return 0 -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if [target_info exists gdb_stub] { - gdb_step_for_stub; -} - -# -# line number where we need to stop in main -# -set main_line 25 - -# The commands we test here produce many lines of output; disable "press -# to continue" prompts. -send_gdb "set height 0\n" -gdb_expect -re "$gdb_prompt $" - -# -# break at main -# -gdb_test "break 25" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ - "breakpoint main" - - -# -# NOTE: this prompt is OK only when the annotation level is > 1 -# NOTE: When this prompt is in use the gdb_test procedure cannot be used because -# it assumes that the last char of the gdb_prompt is a white space. This is not -# true with this annotated prompt. So we must use send_gdb and gdb_expect. -# - -set old_gdb_prompt $gdb_prompt -set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n" - -send_gdb "set annotate 3\n" -gdb_expect_list "annotation set at level 3" "\r\n$gdb_prompt$" { - "set annotate 3" -} - -send_gdb "run\n" -gdb_expect_list "first run until main breakpoint" "$gdb_prompt$" { - "\r\n\032\032post-prompt\r\n" - "Starting program: .*annota3 \r\n" - "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" - "\r\n\032\032starting\r\n" - "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" - "\r\n\032\032breakpoint 1\r\n" - "\r\n" - "Breakpoint 1, main \\(\\) at .*annota3.cc:25\r\n" - "\r\n\032\032source.*annota3.cc:25:.*:beg:0x\[0-9a-z\]+\r\n" - "\r\n\032\032stopped\r\n" -} - -# -# print class 'a' with public fields. -# -send_gdb "print a\n" -gdb_expect_list "print class" "$gdb_prompt$" { - "\r\n\032\032post-prompt\r\n" - ".*= \\{x = 1, y = 2\\}\r\n" -} - -# -# continue until exit -# this will test: -# annotate-exited -# -send_gdb "continue\n" -gdb_expect_list "continue to exit" "$gdb_prompt$" { - "\r\n\032\032post-prompt\r\n" - "Continuing.\r\n" - "\r\n\032\032starting\r\n" - "\r\n\032\032frames-invalid\r\n" - "a.x is 1\r\n" - "\r\n\032\032frames-invalid\r\n" - "\r\n\032\032exited 0\r\n" - "\r\n" - "Program exited normally.\r\n" - "\r\n\032\032frames-invalid\r\n" - "\r\n\032\032stopped\r\n" -} - -# -# delete all breakpoints -# -send_gdb "delete\n" -gdb_expect { - -re ".*Delete all breakpoints. \\(y or n\\) \r\n\032\032query.*$" { - send_gdb "y\n" - gdb_expect { - -re "\r\n\032\032post-query\r\n$gdb_prompt$" { pass "delete bps" } - -re ".*$gdb_prompt$" { fail "delete bps" } - timeout { fail "delete bps (timeout)" } - } - } - -re ".*$gdb_prompt$" { fail "delete bps" } - timeout { fail "delete bps (timeout)" } -} - -# -# break at first line of main. -# -send_gdb "break 22\n" -gdb_expect_list "break at main" "$gdb_prompt$" { - "\r\n\032\032post-prompt\r\n" - "\r\n\032\032breakpoints-invalid\r\n" - "Breakpoint.*at 0x\[a-z0-9\]+: file.*annota3.cc, line 22.\r\n" -} - -# -# run program up to breakpoint. -# - - -send_gdb "run\n" -gdb_expect_list "second run until main breakpoint" "$gdb_prompt$" { - "\r\n\032\032post-prompt\r\n" - "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" - "\r\n\032\032starting\r\n" - "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" - "\r\n\032\032breakpoint 2\r\n" - "\r\n" - "Breakpoint 2, main \\(\\) at .*annota3.cc:22\r\n" - "\r\n\032\032source.*annota3.cc:22:.*:beg:0x\[0-9a-z\]+\r\n" - "\r\n\032\032stopped\r\n" -} - -# -# set up a watch point on a.x -# -send_gdb "watch a.x\n" -gdb_expect_list "set watch on a.x" "$gdb_prompt$" { - "\r\n\032\032post-prompt\r\n" - "\r\n\032\032breakpoints-invalid\r\n" - ".*atchpoint 3: a.x\r\n" \ -} - -# -# do a next, so that the watchpoint triggers. This will test: -# annotate-watchpoint -# -send_gdb "next\n" -gdb_expect { - -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\(\r\n\032\032frames-invalid\r\n\)+\r\n\032\032watchpoint 3\r\nWatchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\nmain \\(\\) at .*$srcfile:$decimal\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032stopped\r\n.*$gdb_prompt$" { - pass "watch triggered on a.x" - } - -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032stopped\r\n$gdb_prompt$" { - kfail "gdb/38" "watch triggered on a.x" - } - -re ".*$gdb_prompt$" { - fail "watch triggered on a.x" - } - timeout { - fail "watch triggered on a.x (timeout)" - } -} - -# -# send ^C to gdb, so that the quit() function gets called -# and annotate-quit is tested -# test: -# annotate-quit -# -# This test sometimes fails, but not reproducibly. See gdb/544. -# -send_gdb "\003" -gdb_expect_list "annotate-quit" "$gdb_prompt$" { - "\r\n\032\032error-begin\r\n" - "Quit\r\n" - "\r\n\032\032quit\r\n" -} - -# -# FIXME: the testsuite does not currently have tests for -# annotate_catchpoints and annotate_function_call -# and a few variants of the annotations that are -# tested (marked by FIXME on the annot?.exp files) -# - -# reinstall the old prompt for the rest of the testsuite. - -set gdb_prompt $old_gdb_prompt - diff --git a/gdb/testsuite/gdb.c++/anon-union.cc b/gdb/testsuite/gdb.c++/anon-union.cc deleted file mode 100644 index 0b3fd13..0000000 --- a/gdb/testsuite/gdb.c++/anon-union.cc +++ /dev/null @@ -1,55 +0,0 @@ - -struct Foo { - union { - int zero; - unsigned int one; - } num1; - struct X { - int rock; - unsigned int rock2; - }; - union { - int pebble; - X x; - union { - int qux; - unsigned int mux; - }; - unsigned int boulder; - }; - union { - int paper; - unsigned int cloth; - }; - union { - int two; - unsigned int three; - } num2; -}; - -union Bar { - int x; - unsigned int y; -}; - - -int main() -{ - Foo foo = {0, 0}; - - foo.paper = 33; - foo.pebble = 44; - foo.mux = 55; - - Bar bar = {0}; - - union { - int z; - unsigned int w; - }; w = 0; - - bar.x = 33; - - w = 45; - -} diff --git a/gdb/testsuite/gdb.c++/anon-union.exp b/gdb/testsuite/gdb.c++/anon-union.exp deleted file mode 100644 index 0d5c777..0000000 --- a/gdb/testsuite/gdb.c++/anon-union.exp +++ /dev/null @@ -1,348 +0,0 @@ -# Tests for anonymous union support. -# Copyright 1998, 1999, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# Written by Satish Pai 1997-08-19 - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# - -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "anon-union" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - perror "Testcase compile failed" 0 - continue -} - -# Start with a fresh gdb -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -send_gdb "set width 0\n" -gdb_expect -re "$gdb_prompt $" - -#send_gdb "ptype foo\n" -#gdb_expect { -# -re "\r\n$gdb_prompt $" { -# pass "ptype foo" -# } -# -re ".*$gdb_prompt $" { fail "ptype foo" } -# timeout { fail "(timeout) ptype foo" } -#} - -#send_gdb "ptype bar\n" -#gdb_expect { -# -re "\r\n$gdb_prompt $" { -# pass "ptype foo" -# } -# -re ".*$gdb_prompt $" { fail "ptype foo" } -# timeout { fail "(timeout) ptype foo" } -#} - -# NOTE: Add -- ptype foo.x, etc. when things are working - -#Initialize foo -send_gdb "next\n" -gdb_expect { - -re "40\[ \t\]*foo.paper = 33;\r\n$gdb_prompt $" { - pass "next 1" - } - -re ".*$gdb_prompt $" { fail "next 1" } - timeout { fail "(timeout) next 1" } -} - -# Print out the big anon union. -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 0, cloth = 0\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 1" - } - -re ".*$gdb_prompt $" { fail "print foo 1" } - timeout { fail "(timeout) print foo 1" } -} - -# Step over assignment to member - -send_gdb "next\n" -gdb_expect { - -re "41\[ \t\]*foo.pebble = 44;\r\n$gdb_prompt $" { - pass "next 1" - } - -re ".*$gdb_prompt $" { fail "next 1" } - timeout { fail "(timeout) next 1" } -} - -# Now print out anon union again -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 33, cloth = 33\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 2" - } - -re ".*$gdb_prompt $" { fail "print foo 2" } - timeout { fail "(timeout) print foo 2" } -} - -# Modify the member just set -send_gdb "set var foo.cloth = 35\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var foo.cloth" - } - timeout { fail "(timeout) set var foo.cloth" } -} - -# Now print out anon union again to see if the right member was set -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 3" - } - -re ".*$gdb_prompt $" { fail "print foo 3" } - timeout { fail "(timeout) print foo 3" } -} - - -# Step over next assignment to member - -send_gdb "next\n" -gdb_expect { - -re "42\[ \t\]*foo.mux = 55;\r\n$gdb_prompt $" { - pass "next 2" - } - -re ".*$gdb_prompt $" { fail "next 2" } - timeout { fail "(timeout) next 2" } -} - -# Now print out anon union again -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 44, x = \{rock = 44, rock2 = 0\}, \{qux = 44, mux = 44\}, boulder = 44\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 4" - } - -re ".*$gdb_prompt $" { fail "print foo 4" } - timeout { fail "(timeout) print foo 4" } -} - -# Modify the member just set -send_gdb "set var foo.pebble = 45\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var foo.pebble" - } - timeout { fail "(timeout) set var foo.pebble" } -} - -# Now print out anon union again to see if the right member was set -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 45, x = \{rock = 45, rock2 = 0\}, \{qux = 45, mux = 45\}, boulder = 45\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 5" - } - -re ".*$gdb_prompt $" { fail "print foo 5" } - timeout { fail "(timeout) print foo 5" } -} - -# Modify another member at a different level -send_gdb "set var foo.qux = 46\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var foo.qux" - } - timeout { fail "(timeout) set var foo.qux" } -} - -# Now print out anon union again to see if the right member was set -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 46, x = \{rock = 46, rock2 = 0\}, \{qux = 46, mux = 46\}, boulder = 46\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 6" - } - -re ".*$gdb_prompt $" { fail "print foo 6" } - timeout { fail "(timeout) print foo 6" } -} - -# Modify the member at another level, but not the first one in the union -send_gdb "set var foo.mux = 47\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var foo.mux" - } - timeout { fail "(timeout) set var foo.mux" } -} - -# Now print out anon union again to see if things worked -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 47, x = \{rock = 47, rock2 = 0\}, \{qux = 47, mux = 47\}, boulder = 47\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 7" - } - -re ".*$gdb_prompt $" { fail "print foo 7" } - timeout { fail "(timeout) print foo 7" } -} - -# Modify a member of a struct in an anon union -send_gdb "set var foo.x.rock = 48\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var foo.x.rock" - } - timeout { fail "(timeout) set var foo.x.rock" } -} - -# Now print out anon union again to see if things worked -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 48, x = \{rock = 48, rock2 = 0\}, \{qux = 48, mux = 48\}, boulder = 48\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 8" - } - -re ".*$gdb_prompt $" { fail "print foo 8" } - timeout { fail "(timeout) print foo 8" } -} - -# Modify a member of a struct in an anon union, but something -# that doesn't alias to some other union member -send_gdb "set var foo.x.rock2 = 49\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var foo.x.rock2" - } - timeout { fail "(timeout) set var foo.x.rock2" } -} - -# Now print out anon union again to see if things worked -send_gdb "print foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 48, x = \{rock = 48, rock2 = 49\}, \{qux = 48, mux = 48\}, boulder = 48\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { - pass "print foo 9" - } - -re ".*$gdb_prompt $" { fail "print foo 9" } - timeout { fail "(timeout) print foo 9" } -} - - -# Step over next four assignments -send_gdb "next 4\n" -gdb_expect { - -re "53\[ \t\]*w = 45;\r\n$gdb_prompt $" { - pass "next 3" - } - -re ".*$gdb_prompt $" { fail "next 3" } - timeout { fail "(timeout) next 3" } -} - -# Tests for anon unions that are not members of a class or struct - -send_gdb "print w\n" -gdb_expect { - -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" { - pass "print w 1" - } - -re ".*$gdb_prompt $" { fail "print w 1" } - timeout { fail "(timeout) print w 1" } -} - -send_gdb "print z\n" -gdb_expect { - -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" { - pass "print z 1" - } - -re ".*$gdb_prompt $" { fail "print z 1" } - timeout { fail "(timeout) print z 1" } -} - -# Step over next assignment to w -send_gdb "next\n" -gdb_expect { - -re "55\[ \t\]*\}\r\n$gdb_prompt $" { - pass "next 4" - } - -re ".*$gdb_prompt $" { fail "next 4" } - timeout { fail "(timeout) next 4" } -} - -# See if the change in value is noticed -send_gdb "print w\n" -gdb_expect { - -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" { - pass "print w 2" - } - -re ".*$gdb_prompt $" { fail "print w 2" } - timeout { fail "(timeout) print w 2" } -} - -# See if z shows the same value -send_gdb "print z\n" -gdb_expect { - -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" { - pass "print z 2" - } - -re ".*$gdb_prompt $" { fail "print z 2" } - timeout { fail "(timeout) print z 2" } -} - -# Set the anon union member -send_gdb "set var z = 27\n" -gdb_expect { - -re "\r\n$gdb_prompt $" { - pass "set var z" - } - timeout { fail "(timeout) set var z" } -} - -# See if the change in value is noticed -send_gdb "print w\n" -gdb_expect { - -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" { - pass "print w 3" - } - -re ".*$gdb_prompt $" { fail "print w 3" } - timeout { fail "(timeout) print w 3" } -} - -# See if z shows the same value -send_gdb "print z\n" -gdb_expect { - -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" { - pass "print z 3" - } - -re ".*$gdb_prompt $" { fail "print z 3" } - timeout { fail "(timeout) print z 3" } -} diff --git a/gdb/testsuite/gdb.c++/casts.cc b/gdb/testsuite/gdb.c++/casts.cc deleted file mode 100644 index 831add9..0000000 --- a/gdb/testsuite/gdb.c++/casts.cc +++ /dev/null @@ -1,20 +0,0 @@ -struct A -{ - int a; - A (int aa): a (aa) {} -}; - -struct B: public A -{ - int b; - B (int aa, int bb): A (aa), b(bb) {} -}; - -int -main (int argc, char **argv) -{ - A *a = new B(42, 1729); - B *b = (B *) a; - - return 0; /* breakpoint spot: casts.exp: 1 */ -} diff --git a/gdb/testsuite/gdb.c++/casts.exp b/gdb/testsuite/gdb.c++/casts.exp deleted file mode 100644 index 5b6cabe..0000000 --- a/gdb/testsuite/gdb.c++/casts.exp +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright 2002, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file is part of the gdb testsuite - -# Test casting, especially between class types or pointer-to-class -# types. - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# - -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "casts" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile} "c++"] { - return -1; -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -gdb_test "break [gdb_get_line_number "casts.exp: 1"]" \ - "Breakpoint.*at.* file .*" \ - "" - -gdb_test "continue" "Breakpoint .* at .*casts.cc.*" "" - -# Casting a pointer to a base class to a pointer to a derived class -# should yield the entire derived class. Until August 2002, GDB got -# the enclosing type on `(B *) a' wrong: while the value's static type -# was `B *', as it should be, the enclosing type (which is supposed to -# be the dynamic type) was `A *'. It's senseless to have a static -# type derived from the dynamic type; it should be the other way -# 'round. Dereferencing this oddly typed pointer yielded a value in -# which only the base class's members were initialized, since GDB uses -# the enclosing type to decide how many bytes to read. Members from -# the derived class were garbage, from GDB's address space. -gdb_test "print * (B *) a" ".* = { = {a = 42}, b = 1729}" \ - "cast base class pointer to derived class pointer" - -# Check also that we get the same results from letting the compiler do -# the dereference. -gdb_test "print * b" ".* = { = {a = 42}, b = 1729}" \ - "let compiler cast base class pointer to derived class pointer" diff --git a/gdb/testsuite/gdb.c++/classes.exp b/gdb/testsuite/gdb.c++/classes.exp deleted file mode 100644 index 3f398ac..0000000 --- a/gdb/testsuite/gdb.c++/classes.exp +++ /dev/null @@ -1,918 +0,0 @@ -# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) - -set ws "\[\r\n\t \]+" -set nl "\[\r\n\]+" - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -set testfile "misc" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -# Create and source the file that provides information about the compiler -# used to compile the test case. - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# -# Test ptype of class objects. -# - -proc test_ptype_class_objects {} { - global gdb_prompt - global ws - global nl - - # Note that struct members are public by default, so we don't print - # "public:" for the public members of structs. - # Accept it if gdb just fails to distinguish between - # class and struct, and everything else is OK. - - send_gdb "ptype struct default_public_struct\n" - gdb_expect { - -re "type = struct default_public_struct \{${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { - pass "ptype struct default_public_struct" - } - -re "type = class default_public_struct \{$nl.*int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct default_public_struct" - } - -re ".*$gdb_prompt $" { fail "ptype struct default_public_struct" } - timeout { fail "ptype struct default_public_struct (timeout)" ; return } - } - - # Note that struct members are public by default, so we don't print - # "public:" for the public members of structs. - # Accept it if gdb just fails to distinguish between - # class and struct, and everything else is OK. - - send_gdb "ptype struct explicit_public_struct\n" - gdb_expect { - -re "type = struct explicit_public_struct \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct explicit_public_struct" - } - -re "type = class explicit_public_struct \{$nl.*int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct explicit_public_struct" - } - -re ".*$gdb_prompt $" { fail "ptype struct explicit_public_struct" } - timeout { fail "ptype struct explicit_public_struct (timeout)" ; return } - } - - # Accept it if gdb just fails to distinguish between - # class and struct, and everything else is OK. - - send_gdb "ptype struct protected_struct\n" - gdb_expect { - -re "type = struct protected_struct \{${ws}protected:${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { - pass "ptype struct protected_struct" - } - -re "type = class protected_struct \{${ws}protected:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct protected_struct" - } - -re ".*$gdb_prompt $" { fail "ptype struct protected_struct" } - timeout { fail "ptype struct protected_struct (timeout)" ; return } - } - - # Accept it if gdb just fails to distinguish between - # class and struct, and everything else is OK. - - send_gdb "ptype struct private_struct\n" - gdb_expect { - -re "type = struct private_struct \{${ws}private:${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { - pass "ptype struct private_struct" - } - -re "type = class private_struct \{${ws}private:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct private_struct" - } - -re ".*$gdb_prompt $" { fail "ptype struct private_struct" } - timeout { fail "ptype struct private_struct (timeout)" ; return } - } - - # Accept it if gdb just fails to distinguish between - # class and struct, and everything else is OK. - - send_gdb "ptype struct mixed_protection_struct\n" - gdb_expect { - -re "type = struct mixed_protection_struct \{${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl\}$nl$gdb_prompt $" { - pass "ptype struct mixed_protection_struct" - } - -re "type = struct mixed_protection_struct \{${ws}public:${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct mixed_protection_struct (extra public)" - } - -re "type = class mixed_protection_struct \{${ws}public:${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl.*\}$nl$gdb_prompt $" { - pass "ptype struct mixed_protection_struct" - } - -re ".*$gdb_prompt $" { fail "ptype struct mixed_protection_struct" } - timeout { fail "ptype struct mixed_protection_struct (timeout)" ; return } - } - - # Accept it if gdb just fails to distinguish between - # class and struct, and everything else is OK. - - send_gdb "ptype class public_class\n" - gdb_expect { - -re "type = class public_class \{${ws}public:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class public_class" - } - -re "type = struct public_class \{${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { - pass "ptype class public_class" - } - -re ".*$gdb_prompt $" { fail "ptype class public_class" } - timeout { fail "ptype class public_class (timeout)" ; return } - } - - send_gdb "ptype class protected_class\n" - gdb_expect { - -re "type = class protected_class \{${ws}protected:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class protected_class" - } - -re "type = struct protected_class \{${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { - fail "ptype class protected_class" - } - -re ".*$gdb_prompt $" { fail "ptype class protected_class" } - timeout { fail "ptype class protected_class (timeout)" ; return } - } - - # Accept it if gdb just emits a superflous "private:" - # attribute, since classes default to private and for consistency with - # structs (where we don't print the "public:" attribute) we don't print - # the "private:" attribute. - - send_gdb "ptype class default_private_class\n" - gdb_expect { - -re "type = class default_private_class \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class default_private_class" - } - -re "type = class default_private_class \{${ws}private:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class default_private_class" - } - -re ".*$gdb_prompt $" { fail "ptype class default_private_class" } - timeout { fail "ptype class default_private_class (timeout)" ; return } - } - - send_gdb "ptype class explicit_private_class\n" - gdb_expect { - -re "type = class explicit_private_class \{${ws}private:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class explicit_private_class" - } - -re "type = class explicit_private_class \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class explicit_private_class" - } - -re "type = struct explicit_private_class \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { - fail "ptype class explicit_private_class" - } - -re ".*$gdb_prompt $" { fail "ptype class explicit_private_class" } - timeout { fail "ptype class explicit_private_class (timeout)" ; return } - } - - send_gdb "ptype class mixed_protection_class\n" - gdb_expect { - -re "type = class mixed_protection_class \{${ws}public:${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class mixed_protection_class" - } - -re "type = struct mixed_protection_class \{${ws}int a;${ws}int b;${ws}int c;${ws}int d;${ws}int e;${ws}int f;${ws}int g;${ws}int h;${ws}int i;$nl.*\}$nl$gdb_prompt $" { - fail "ptype class mixed_protection_class" - } - -re ".*$gdb_prompt $" { fail "ptype class mixed_protection_class" } - timeout { fail "ptype class mixed_protection_class (timeout)" ; return } - } - - # This class does not use any C++-specific features, so it's fine for - # it to print as "struct". - send_gdb "ptype class A\n" - gdb_expect { - -re "type = (class|struct) A \{(${ws}public:|)${ws}int a;${ws}int x;((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\((A const|const A) ?&\\);)|(${ws}A\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class A" - } - -re ".*$gdb_prompt $" { - fail "ptype class A" - } - timeout { - fail "ptype class A (timeout)" - return - } - } - - send_gdb "ptype class B\n" - gdb_expect { - -re "type = class B : public A \{${ws}public:${ws}int b;${ws}int x;${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class B" - } - -re "type = class B : public A \{${ws}public:${ws}int b;${ws}int x;((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(B const ?&\\);)|(${ws}B\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class B (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class B" - } - timeout { - fail "ptype class B (timeout)" - return - } - } - - send_gdb "ptype class C\n" - gdb_expect { - -re "type = class C : public A \{${ws}public:${ws}int c;${ws}int x;${ws}C & operator=\\(C const ?&\\);${ws}C\\((C const|const C) ?&\\);${ws}C\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class C" - } - -re "type = class C : public A \{${ws}public:${ws}int c;${ws}int x;((${ws}C & operator=\\(C const ?&\\);)|(${ws}C\\(C const ?&\\);)|(${ws}C\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class C (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class C" - } - timeout { - fail "ptype class C (timeout)" - return - } - } - - send_gdb "ptype class D\n" - gdb_expect { - -re "type = class D : public B, public C \{${ws}public:${ws}int d;${ws}int x;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class D" - } - -re "type = class D : public B, public C \{${ws}public:${ws}int d;${ws}int x;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(D const ?&\\);)|(${ws}D\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class D (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class D" - } - timeout { - fail "ptype class D (timeout)" - return - } - } - - send_gdb "ptype class E\n" - gdb_expect { - -re "type = class E : public D \{${ws}public:${ws}int e;${ws}int x;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class E" - } - -re "type = class E : public D \{${ws}public:${ws}int e;${ws}int x;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\((E const|const E) ?&\\);)|(${ws}E\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class E" - } - -re ".*$gdb_prompt $" { - fail "ptype class E" - } - timeout { - fail "ptype class E (timeout)" - return - } - } - - # With g++ 2.x and stabs debug info, we misinterpret static methods - # whose name matches their argument mangling. - send_gdb "ptype class Static\n" - gdb_expect { - -re "type = (class|struct) Static \{(${ws}public:|)${ws}Static & operator=\\(Static const ?&\\);${ws}Static\\((Static const|const Static) ?&\\);${ws}Static\\((void|)\\);${ws}static void ii\\(int, int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class Static" - } - -re "type = (class|struct) Static \{(${ws}public:|)${ws}static void ii\\(int, int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class Static" - } - -re ".*$gdb_prompt $" { - fail "ptype class Static" - } - timeout { - fail "ptype class Static (timeout)" - return - } - } - - send_gdb "ptype class vA\n" - gdb_expect { - -re "type = (class|struct) vA \{(${ws}public:|)${ws}int va;${ws}int vx;${ws}\}$nl$gdb_prompt $" { - pass "ptype class vA" - } - -re "type = (class|struct) vA \{(${ws}public:|)${ws}int va;${ws}int vx;${ws}vA & operator=\\(vA const ?&\\);${ws}vA\\((vA const|const vA) ?&\\);${ws}vA\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class vA" - } - -re "type = (class|struct) vA \{(${ws}public:|)${ws}int va;${ws}int vx;((${ws}vA & operator=\\(vA const ?&\\);)|(${ws}vA\\(vA const ?&\\);)|(${ws}vA\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class vA (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class vA" - } - timeout { - fail "ptype class vA (timeout)" - return - } - } - - # Accept the form with embedded GNU style mangled virtual table constructs - # for now, but with a FIXME. At some future point, gdb should use a - # portable representation for the virtual table constructs. - - # The format of a g++ virtual base pointer. - set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?" - - send_gdb "ptype class vB\n" - gdb_expect { - -re "type = class vB : public virtual vA \{${ws}public:${ws}int vb;${ws}int vx;${ws}vB & operator=\\(vB const ?&\\);${ws}vB\\((vB const|const vB) ?&\\);${ws}vB\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class vB" - } - -re "type = class vB : public virtual vA \{${ws}private:${ws}vA \\*${vbptr}vA;${ws}public:${ws}int vb;${ws}int vx;${ws}vB & operator=\\(vB const ?&\\);${ws}vB\\(int, vB const ?&\\);${ws}vB\\(int\\);${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vB (FIXME: non-portable virtual table constructs)" - } - -re "type = class vB : public virtual vA \{${ws}public:${ws}int vb;${ws}int vx;${ws}\}$nl$gdb_prompt $" { - pass "ptype class vB" - } - -re "type = class vB : public virtual vA \{${ws}private:${ws}vA \\*_vb.vA;${ws}public:${ws}int vb;${ws}int vx;((${ws}vB & operator=\\(vB const ?&\\);)|(${ws}vB\\(int, vB const ?&\\);)|(${ws}vB\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vB (FIXME) (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class vB" - } - timeout { - fail "ptype class vB (timeout)" - return - } - } - - # Accept the form with embedded GNU style mangled virtual table constructs - # for now, but with a FIXME. At some future point, gdb should use a - # portable representation for the virtual table constructs. - - send_gdb "ptype class vC\n" - gdb_expect { - -re "type = class vC : public virtual vA \{${ws}public:${ws}int vc;${ws}int vx;${ws}vC & operator=\\(vC const ?&\\);${ws}vC\\((vC const|const vC) ?&\\);${ws}vC\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class vC" - } - -re "type = class vC : public virtual vA \{${ws}private:${ws}vA \\*${vbptr}vA;${ws}public:${ws}int vc;${ws}int vx;${ws}vC & operator=\\(vC const ?&\\);${ws}vC\\(int, vC const ?&\\);${ws}vC\\(int\\);${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vC (FIXME: non-portable virtual table constructs)" - } - -re "type = class vC : public virtual vA \{${ws}public:${ws}int vc;${ws}int vx;${ws}\}$nl$gdb_prompt $" { - pass "ptype class vC" - } - -re "type = class vC : public virtual vA \{${ws}private:${ws}vA \\*_vb.vA;${ws}public:${ws}int vc;${ws}int vx;((${ws}vC & operator=\\(vC const ?&\\);)|(${ws}vC\\(int, vC const ?&\\);)|(${ws}vC\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vC (FIXME) (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class vC" - } - timeout { - fail "ptype class vC (timeout)" - return - } - } - - # Accept the form with embedded GNU style mangled virtual table constructs - # for now, but with a FIXME. At some future point, gdb should use a - # portable representation for the virtual table constructs. - - send_gdb "ptype class vD\n" - gdb_expect { - -re "type = class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;${ws}vD & operator=\\(vD const ?&\\);${ws}vD\\((vD const|const vD) ?&\\);${ws}vD\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class vD" - } - -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;${ws}vD & operator=\\(vD const ?&\\);${ws}vD\\(int, vD const ?&\\);${ws}vD\\(int\\);${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vD (FIXME: non-portable virtual table constructs)" - } - -re "type = class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;${ws}\}$nl$gdb_prompt $" { - pass "ptype class vD" - } - -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*_vb.vC;${ws}vB \\*_vb.vB;${ws}public:${ws}int vd;${ws}int vx;((${ws}vD & operator=\\(vD const ?&\\);)|(${ws}vD\\(int, vD const ?&\\);)|(${ws}vD\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vD (FIXME) (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class vD" - } - timeout { - fail "ptype class vD (timeout)" - return - } - } - - # Accept the form with embedded GNU style mangled virtual table constructs - # for now, but with a FIXME. At some future point, gdb should use a - # portable representation for the virtual table constructs. - - send_gdb "ptype class vE\n" - gdb_expect { - -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;${ws}vE & operator=\\(vE const ?&\\);${ws}vE\\((vE const|const vE) ?&\\);${ws}vE\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class vE" - } - -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;${ws}vE & operator=\\(vE const ?&\\);${ws}vE\\(int, vE const ?&\\);${ws}vE\\(int\\);${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vE (FIXME: non-portable virtual table constructs)" - } - -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;${ws}\}$nl$gdb_prompt $" { - pass "ptype class vE" - } - -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*_vb.vD;${ws}public:${ws}int ve;${ws}int vx;((${ws}vE & operator=\\(vE const ?&\\);)|(${ws}vE\\(int, vE const ?&\\);)|(${ws}vE\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype class vE (FIXME) (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class vE" - } - timeout { - fail "ptype class vE (timeout)" - return - } - } - - send_gdb "ptype class Base1\n" - gdb_expect { - -re "type = class Base1 \{${ws}public:${ws}int x;${ws}Base1 & operator=\\(Base1 const ?&\\);${ws}Base1\\(((Base1 const)|(const Base1)) ?&\\);${ws}Base1\\(int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class Base1" - } - -re "type = class Base1 \{${ws}public:${ws}int x;${ws}Base1\\(int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class Base1" - } - -re "type = class Base1 \{${ws}public:${ws}int x;((${ws}Base1 & operator=\\(Base1 const ?&\\);)|(${ws}Base1\\(Base1 const ?&\\);)|(${ws}Base1\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class Base1 (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class Base1" - } - timeout { - fail "ptype class Base1 (timeout)" - return - } - } - - send_gdb "ptype class Foo\n" - gdb_expect { - -re "type = class Foo \{${ws}public:${ws}int x;${ws}int y;${ws}static int st;\r\n${ws}Foo\\(int, int\\);${ws}int operator!\\((void|)\\);${ws}operator int\\((void|)\\);${ws}int times\\(int\\);$nl\}$nl$gdb_prompt $" { - pass "ptype class Foo" - } - -re "type = class Foo \{${ws}public:${ws}int x;${ws}int y;${ws}static int st;${ws}Foo & operator=\\(Foo const ?&\\);${ws}Foo\\((Foo const|const Foo) ?&\\);${ws}Foo\\(int, int\\);${ws}int operator!\\((void|)\\);${ws}operator int\\((void|)\\);${ws}int times\\(int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class Foo" - } - -re "type = class Foo \{${ws}public:${ws}int x;${ws}int y;${ws}static int st;((${ws}Foo & operator=\\(Foo const ?&\\);)|(${ws}Foo\\(Foo const ?&\\);)|(${ws}Foo\\(int, int\\);)|(${ws}int operator!\\((void|)\\);)|(${ws}int operator int\\((void|)\\);)|(${ws}int times\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class Foo (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class Foo" - } - timeout { - fail "ptype class Foo (timeout)" - return - } - } - - send_gdb "ptype class Bar\n" - gdb_expect { - -re "type = class Bar : public Base1, public Foo \{${ws}public:${ws}int z;${ws}Bar & operator=\\(Bar const ?&\\);${ws}Bar\\((Bar const|const Bar) ?&\\);${ws}Bar\\(int, int, int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype class Bar" - } - -re "type = class Bar : public Base1, public Foo \{${ws}public:${ws}int z;((${ws}Bar & operator=\\(Bar const ?&\\);)|(${ws}Bar\\(Bar const ?&\\);)|(${ws}Bar\\(int, int, int\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype class Bar (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype class Bar" - } - timeout { - fail "ptype class Bar (timeout)" - return - } - } -} - -# -# Test simple access to class members. -# - -proc test_non_inherited_member_access {} { - global gdb_prompt - - # Print non-inherited members of g_A. - - gdb_test "print g_A.a" ".* = 1" "g_A.a incorrect" - - gdb_test "print g_A.x" ".* = 2" "g_A.x incorrect" - - # Print non-inherited members of g_B. - - gdb_test "print g_B.b" ".* = 5" "g_B.b incorrect" - - gdb_test "print g_B.x" ".* = 6" "g_B.x incorrect" - - # Print non-inherited members of g_C. - - gdb_test "print g_C.c" ".* = 9" "g_C.c incorrect" - - gdb_test "print g_C.x" ".* = 10" "g_C.x incorrect" - - # Print non-inherited members of g_D. - - gdb_test "print g_D.d" ".* = 19" "g_D.d incorrect" - - gdb_test "print g_D.x" ".* = 20" "g_D.x incorrect" - - # Print non-inherited members of g_E. - - gdb_test "print g_E.e" ".* = 31" "g_E.e incorrect" - - gdb_test "print g_E.x" ".* = 32" "g_E.x incorrect" -} - -# -# Try access to non-members that are members of another class. -# Should give errors. -# - -proc test_wrong_class_members {} { - global gdb_prompt - - gdb_test "print g_A.b" "There is no member( or method|) named b." "print g_A.b should be error" - - gdb_test "print g_B.c" "There is no member( or method|) named c." "print g_B.c should be error" - - gdb_test "print g_B.d" "There is no member( or method|) named d." "print g_B.d should be error" - - gdb_test "print g_C.b" "There is no member( or method|) named b." "print g_C.b should be error" - - gdb_test "print g_C.d" "There is no member( or method|) named d." "print g_C.d should be error" - - gdb_test "print g_D.e" "There is no member( or method|) named e." "print g_D.e should be error" -} - -# -# Try access to non-members that are not members of any class. -# Should give errors. -# - -proc test_nonexistent_members {} { - global gdb_prompt - - gdb_test "print g_A.y" "There is no member( or method|) named y." "print g_A.y should be error" - - gdb_test "print g_B.z" "There is no member( or method|) named z." "print g_B.z should be error" - - gdb_test "print g_C.q" "There is no member( or method|) named q." "print g_C.q should be error" - - gdb_test "print g_D.p" "There is no member( or method|) named p." "print g_D.p should be error" -} - -# -# Call a method that expects a base class parameter with base, inherited, -# and unrelated class arguments. -# - -proc test_method_param_class {} { - gdb_test "call class_param.Aptr_a (&g_A)" ".* = 1" "base class param->a" - gdb_test "call class_param.Aptr_x (&g_A)" ".* = 2" "base class param->x" - gdb_test "call class_param.Aptr_a (&g_B)" ".* = 3" "inherited class param->a" - gdb_test "call class_param.Aptr_x (&g_B)" ".* = 4" "inherited class param->x" - gdb_test "call class_param.Aref_a (g_A)" ".* = 1" "base class (¶m)->a" - gdb_test "call class_param.Aref_x (g_A)" ".* = 2" "base class (¶m)->x" - gdb_test "call class_param.Aref_a (g_B)" ".* = 3" "inherited class (¶m)->a" - gdb_test "call class_param.Aref_x (g_B)" ".* = 4" "inherited class (¶m)->x" - gdb_test "call class_param.Aval_a (g_A)" ".* = 1" "base class param.a" - gdb_test "call class_param.Aval_x (g_A)" ".* = 2" "base class param.x" - gdb_test "call class_param.Aval_a (g_B)" ".* = 3" "inherited class param.a" - gdb_test "call class_param.Aval_x (g_B)" ".* = 4" "inherited class param.x" - - gdb_test "call class_param.Aptr_a (&foo)" "Cannot resolve .*" "unrelated class *param" - gdb_test "call class_param.Aref_a (foo)" "Cannot resolve .*" "unrelated class ¶m" - gdb_test "call class_param.Aval_a (foo)" "Cannot resolve .*" "unrelated class param" -} - -# -# Examine a class with an enum field. -# - -proc test_enums {} { - global gdb_prompt - global hp_aCC_compiler - - # print the object - send_gdb "print obj_with_enum\n" - gdb_expect { - -re "\\$\[0-9\]* = \\{priv_enum = red, x = 0\\}.*$gdb_prompt $" { pass "print obj_with_enum (1)" } - -re "$gdb_prompt $" { fail "print obj_with_enum (1)" } - timeout { fail "(timeout) print obj_with_enum (1)" } - } - - send_gdb "next\n" - gdb_expect { - -re "$gdb_prompt $" { pass "next" } - timeout { fail "(timeout) next" } - } - - # print the object again - send_gdb "print obj_with_enum\n" - gdb_expect { - -re "\\$\[0-9\]* = \\{priv_enum = green, x = 0\\}.*$gdb_prompt $" { pass "print obj_with_enum (2)" } - -re "$gdb_prompt $" { fail "print obj_with_enum (2)" } - timeout { fail "(timeout) print obj_with_enum (2)" } - } - - # print out the enum member - send_gdb "print obj_with_enum.priv_enum\n" - gdb_expect { - -re "\\$\[0-9\]* = green.*$gdb_prompt $" { pass "print obj_with_enum.priv_enum" } - -re "$gdb_prompt $" { fail "print obj_with_enum.priv_enum" } - timeout { fail "(timeout) print obj_with_enum.priv_enum" } - } - - # ptype on the enum member - # The third success case is a little dubious, but it's not clear what - # ought to be required of a ptype on a private enum... -sts 19990324 - send_gdb "ptype obj_with_enum.priv_enum\n" - gdb_expect { - -re "type = enum ClassWithEnum::PrivEnum \\{red, green, blue, yellow = 42\\}.*$gdb_prompt $" { pass "ptype obj_with_enum.priv_enum" } - -re "type = enum PrivEnum \\{red, green, blue, yellow = 42\\}.*$gdb_prompt $" { pass "ptype obj_with_enum.priv_enum" } - -re "type = enum \\{red, green, blue, yellow = 42\\}.*$gdb_prompt $" { pass "ptype obj_with_enum.priv_enum" } - -re "$gdb_prompt $" { fail "ptype obj_with_enum.priv_enum" } - timeout { fail "(timeout) ptype obj_with_enum.priv_enum" } - } - - # ptype on the object - send_gdb "ptype obj_with_enum\n" - gdb_expect { - -re "type = class ClassWithEnum \\{\r\n\[ \t\]*public:\r\n\[ \t\]*(enum |)ClassWithEnum::PrivEnum priv_enum;\r\n\[ \t\]*int x;\r\n\\}\r\n$gdb_prompt $" { pass "ptype obj_with_enum" } - -re "type = class ClassWithEnum \\{\r\n\[ \t\]*public:\r\n\[ \t\]*(enum |)PrivEnum priv_enum;\r\n\[ \t\]*int x;.*\\}\r\n$gdb_prompt $" - { - # NOTE: carlton/2003-02-28: One could certainly argue that - # this output is acceptable: PrivEnum is a member of - # ClassWithEnum, so there's no need to explicitly qualify - # its name with "ClassWithEnum::". The truth, though, is - # that GDB is simply forgetting that PrivEnum is a member - # of ClassWithEnum, so we do that output for a bad reason - # instead of a good reason. Under stabs, we probably - # can't get this right; under DWARF-2, we can. - kfail "gdb/57" "ptype obj_with_enum" - } - -re "$gdb_prompt $" { fail "ptype obj_with_enum" } - timeout { fail "(timeout) ptype obj_with_enum" } - } - - # We'll do this test twice, because of a parser bug: see - # PR gdb/826. - - send_gdb "print (ClassWithEnum::PrivEnum) 42\n" - gdb_expect { - -re "\\$\[0-9\]* = yellow.*$gdb_prompt $" { pass "print (ClassWithEnum::PrivEnum) 42" } - -re "A parse error in expression, near `42'.\r\n$gdb_prompt $" - { kfail "gdb/826" "print (ClassWithEnum::PrivEnum) 42" } - -re "$gdb_prompt $" { fail "print (ClassWithEnum::PrivEnum) 42" } - timeout { fail "(timeout) print (ClassWithEnum::PrivEnum) 42" } - } - - send_gdb "print ('ClassWithEnum::PrivEnum') 42\n" - gdb_expect { - -re "\\$\[0-9\]* = yellow.*$gdb_prompt $" { pass "print ('ClassWithEnum::PrivEnum') 42" } - -re "No symbol \"ClassWithEnum::PrivEnum\" in current context.\r\n$gdb_prompt $" - { kfail "gdb/57" "print ('ClassWithEnum::PrivEnum') 42" } - -re "$gdb_prompt $" { fail "print ('ClassWithEnum::PrivEnum') 42" } - timeout { fail "(timeout) print ('ClassWithEnum::PrivEnum') 42" } - } -} - -# -# Pointers to class members -# - -proc test_pointers_to_class_members {} { - global gdb_prompt - global decimal - global nl - - gdb_test "print Bar::z" ".* = .int\[ \]*\[( \]*Bar::&\[)\]+\[ \]*Bar::z" "print Bar::z" - - gdb_test "print &Foo::x" ".* = .int\[ \]*\[( \]*Foo::\[*)\]+\[ \]*&Foo::x" "print &Foo::x" - - gdb_test "print (int)&Foo::x" ".* = 0" "print (int)&Foo::x" - - send_gdb "print (int)&Bar::y == 2*sizeof(int)\n" - gdb_expect { - -re ".* = true$nl$gdb_prompt $" { - pass "print (int)&Bar::y == 2*sizeof(int)" - } - -re "There is no field named y.*$gdb_prompt $" { - setup_xfail "*-*-*" - fail "print (int)&Bar::y == 2*sizeof(int)" - } - -re ".*$gdb_prompt $" { fail "print (int)&Bar::y == 2*sizeof(int)" } - timeout { fail "print (int)&Bar::y == 2*sizeof(int) (timeout)" ; return } - } - - send_gdb "next 2\n" - setup_xfail "*-*-*" - gdb_expect { - -re "$decimal\[ \t\]+inheritance3 \[)(\]+;$nl$gdb_prompt $" {} - -re ".*$gdb_prompt $" { fail "next to inheritance3" ; return } - } - clear_xfail "*-*-*" - - gdb_test "print (int)pmi == sizeof(int)" ".* = false" "print (int)pmi == sizeof(int)" -} - -# -# Test static members. -# - -proc test_static_members {} { - global gdb_prompt - global hex - global nl - - send_gdb "print Foo::st\n" - gdb_expect { - -re ".* = 100$nl$gdb_prompt $" { - pass "print Foo::st" - } - -re "There is no field named st.*$gdb_prompt $" { - setup_xfail "*-*-*" - fail "print Foo::st" - } - -re ".*$gdb_prompt $" { fail "print Foo::st" } - timeout { fail "print Foo::st (timeout)" ; return } - } - - send_gdb "set foo.st = 200\n" - gdb_expect { - -re ".*$gdb_prompt $" {} - } - - send_gdb "print bar.st\n" - gdb_expect { - -re ".* = 200$nl$gdb_prompt $" { - pass "print bar.st" - } - -re "There is no member( or method|) named st.*$gdb_prompt $" { - setup_xfail "*-*-*" - fail "print bar.st" - } - -re ".*$gdb_prompt $" { fail "print bar.st" } - timeout { fail "print bar.st (timeout)" ; return } - } - - send_gdb "print &foo.st\n" - gdb_expect { - -re ".* = .int \[*)\]+ $hex$nl$gdb_prompt $" { - pass "print &foo.st" - } - -re "There is no member( or method|) named st.*$gdb_prompt $" { - setup_xfail "*-*-*" - fail "print &foo.st" - } - -re ".*$gdb_prompt $" { fail "print &foo.st" } - timeout { fail "print &foo.st (timeout)" ; return } - } - - set got_bar_st 0 - send_gdb "print &Bar::st\n" - gdb_expect { - -re ".* = .int \[*)\]+ $hex$nl$gdb_prompt $" { - pass "print &Bar::st" - set got_bar_st 1 - } - -re "There is no field named st.*$gdb_prompt $" { - setup_xfail "*-*-*" - fail "print &Bar::st" - } - -re ".*$gdb_prompt $" { fail "print &Bar::st" } - timeout { fail "print &Bar::st (timeout)" ; return } - } - - if $got_bar_st then { - gdb_test "print *\$" ".* = 200" "print *\$" - } - - gdb_test "set print static-members off" "" - gdb_test "print csi" \ - "{x = 10, y = 20}" \ - "print csi without static members" - gdb_test "print cnsi" \ - "{x = 30, y = 40}" \ - "print cnsi without static members" - - gdb_test "set print static-members on" "" - gdb_test "print csi" \ - "{x = 10, y = 20, static null = {x = 0, y = 0, static null = }}" \ - "print csi with static members" - gdb_test "print cnsi" \ - "{x = 30, y = 40, static null = {x = 0, y = 0, static null = , static yy = {z = 5, static xx = {x = 1, y = 2, static null = , static yy = }}}, static yy = }" \ - "print cnsi with static members" -} - -proc do_tests {} { - global prms_id - global bug_id - global subdir - global objdir - global srcdir - global binfile - global gdb_prompt - - set prms_id 0 - set bug_id 0 - - # Start with a fresh gdb. - - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - - send_gdb "set language c++\n" - gdb_expect -re "$gdb_prompt $" - send_gdb "set width 0\n" - gdb_expect -re "$gdb_prompt $" - - runto_main - test_ptype_class_objects - - if [ runto 'inheritance2' ] then { - test_non_inherited_member_access - test_wrong_class_members - test_nonexistent_members - test_method_param_class - } - - gdb_breakpoint enums2 - if [ gdb_continue "enums2(\\(\\)|)" ]==0 then { - gdb_test "finish" "" "" - test_enums - } - - if [istarget "mips-idt-*"] then { - # Restart because IDT/SIM runs out of file descriptors. - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - } - - if [ runto_main ] then { - test_pointers_to_class_members - test_static_members - } - - if [istarget "mips-idt-*"] then { - # Restart because IDT/SIM runs out of file descriptors. - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - } - - if [ runto marker_reg1 ] then { - - gdb_test "finish" "Run till exit from.*" "finish from marker_reg1" - - send_gdb "print v.method ()\n" - gdb_expect { - -re "= 82.*$gdb_prompt $" { - pass "calling method for small class" - } - -re "Address requested for identifier .v. which is in register.*$gdb_prompt $" { - setup_xfail "*-*-*" 2972 - fail "calling method for small class" - } - -re ".*$gdb_prompt $" { fail "calling method for small class" } - timeout { fail "calling method for small class (timeout)" } - eof { fail "calling method for small class (eof)" } - } - } - -} - -do_tests - -send_gdb "maint demangle inheritance1__Fv\n" -gdb_expect { - -re "inheritance1\\(void\\).*$gdb_prompt $" { pass "demangle" } - -re ".*$gdb_prompt $" { fail "demangle" } - timeout { fail "(timeout) demangle" } -} diff --git a/gdb/testsuite/gdb.c++/cplusfuncs.cc b/gdb/testsuite/gdb.c++/cplusfuncs.cc deleted file mode 100644 index 7f033d6..0000000 --- a/gdb/testsuite/gdb.c++/cplusfuncs.cc +++ /dev/null @@ -1,196 +0,0 @@ -#include - -class foo { -public: - foo (int); - foo (int, const char *); - foo (foo&); - ~foo (); - - void operator * (foo&); - void operator % (foo&); - void operator - (foo&); - void operator >> (foo&); - void operator != (foo&); - void operator > (foo&); - void operator >= (foo&); - void operator | (foo&); - void operator && (foo&); - void operator ! (void); - void operator ++ (int); - void operator = (foo&); - void operator += (foo&); - void operator *= (foo&); - void operator %= (foo&); - void operator >>= (foo&); - void operator |= (foo&); - void operator , (foo&); - void operator / (foo&); - void operator + (foo&); - void operator << (foo&); - void operator == (foo&); - void operator < (foo&); - void operator <= (foo&); - void operator & (foo&); - void operator ^ (foo&); - void operator || (foo&); - void operator ~ (void); - void operator -- (int); - foo* operator -> (void); - void operator -= (foo&); - void operator /= (foo&); - void operator <<= (foo&); - void operator &= (foo&); - void operator ^= (foo&); - void operator ->* (foo&); - void operator [] (foo&); - void operator () (foo&); - void* operator new (size_t) throw (); - void operator delete (void *); - /**/ operator int (); - /**/ operator char* (); - - int foofunc (int); // forced to have int return type, which is required - int foofunc (int, signed char *); // forced to have int return type, which is required - int ifoo; - const char *ccpfoo; -}; - -#ifdef usestubs -extern "C" { - void set_debug_traps(); - void breakpoint(); -}; -#endif - -int main () { -#ifdef usestubs - set_debug_traps(); - breakpoint(); -#endif - int z=3; -} - -foo::foo (int i) { ifoo = i;} -foo::foo (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; } -foo::foo (foo& afoo) { afoo.ifoo = 0; } -foo::~foo () {} - -void foo::operator * (foo& afoo) { afoo.ifoo = 0; } -void foo::operator % (foo& afoo) { afoo.ifoo = 0; } -void foo::operator - (foo& afoo) { afoo.ifoo = 0; } -void foo::operator >> (foo& afoo) { afoo.ifoo = 0; } -void foo::operator != (foo& afoo) { afoo.ifoo = 0; } -void foo::operator > (foo& afoo) { afoo.ifoo = 0; } -void foo::operator >= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator | (foo& afoo) { afoo.ifoo = 0; } -void foo::operator && (foo& afoo) { afoo.ifoo = 0; } -void foo::operator ! (void) {} -void foo::operator ++ (int ival) { ival = 0; } -void foo::operator = (foo& afoo) { afoo.ifoo = 0; } -void foo::operator += (foo& afoo) { afoo.ifoo = 0; } -void foo::operator *= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator %= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator >>= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator |= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator , (foo& afoo) { afoo.ifoo = 0; } -void foo::operator / (foo& afoo) { afoo.ifoo = 0; } -void foo::operator + (foo& afoo) { afoo.ifoo = 0; } -void foo::operator << (foo& afoo) { afoo.ifoo = 0; } -void foo::operator == (foo& afoo) { afoo.ifoo = 0; } -void foo::operator < (foo& afoo) { afoo.ifoo = 0; } -void foo::operator <= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator & (foo& afoo) { afoo.ifoo = 0; } -void foo::operator ^ (foo& afoo) { afoo.ifoo = 0; } -void foo::operator || (foo& afoo) { afoo.ifoo = 0; } -void foo::operator ~ (void) {} -void foo::operator -- (int ival) { ival = 0; } -foo* foo::operator -> (void) {return this;} -void foo::operator -= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator /= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator <<= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator &= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator ^= (foo& afoo) { afoo.ifoo = 0; } -void foo::operator ->* (foo& afoo) { afoo.ifoo = 0; } -void foo::operator [] (foo& afoo) { afoo.ifoo = 0; } -void foo::operator () (foo& afoo) { afoo.ifoo = 0; } -void* foo::operator new (size_t ival) throw () { ival = 0; return 0; } -void foo::operator delete (void *ptr) { ptr = 0; } -/**/ foo::operator int () { return 0; } -/**/ foo::operator char* () { return 0; } - -/* Some functions to test overloading by varying one argument type. */ - -void overload1arg (void) { } -void overload1arg (char arg) { arg = 0; } -void overload1arg (signed char arg) { arg = 0; } -void overload1arg (unsigned char arg) { arg = 0; } -void overload1arg (short arg) { arg = 0; } -void overload1arg (unsigned short arg) { arg = 0; } -void overload1arg (int arg) { arg = 0; } -void overload1arg (unsigned int arg) { arg = 0; } -void overload1arg (long arg) { arg = 0; } -void overload1arg (unsigned long arg) { arg = 0; } -void overload1arg (float arg) { arg = 0; } -void overload1arg (double arg) { arg = 0; } - -/* Some functions to test overloading by varying argument count. */ - -void overloadargs (int a1) { a1 = 0; } -void overloadargs (int a1, int a2) { a1 = a2 = 0; } -void overloadargs (int a1, int a2, int a3) { a1 = a2 = a3 = 0; } -void overloadargs (int a1, int a2, int a3, int a4) - { a1 = a2 = a3 = a4 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5) - { a1 = a2 = a3 = a4 = a5 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6) - { a1 = a2 = a3 = a4 = a5 = a6 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = - a10 = 0; } -void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10, int a11) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = - a10 = a11 == 0; } - -/* Some hairy function definitions. - Use typedefs to help maintain sanity. */ - -typedef int (*PFPc_i)(char *); -typedef short (*PFPl_s)(long *); -typedef short (*PFPc_s)(char *); -typedef int (*PFl_i)(long); -typedef PFl_i (*PFPc_PFl_i)(char *); -typedef PFl_i (*PFPi_PFl_i)(int *); -typedef PFl_i (*PFPFPc_i_PFl_i)(PFPc_i); -typedef PFl_i (*PFs_PFl_i)(short); -typedef int (*PFPFPl_s_i)(PFPl_s); -typedef int (*PFPFPc_s_i)(PFPc_s); - -PFs_PFl_i hairyfunc1 (int arg) { arg = 0; return 0; } -int hairyfunc2 (PFPc_i arg) { arg = 0; return 0; } -int hairyfunc3 (PFPFPl_s_i arg) { arg = 0; return 0; } -int hairyfunc4 (PFPFPc_s_i arg) { arg = 0; return 0; } -int hairyfunc5 (PFPc_PFl_i arg) { arg = 0; return 0; } -int hairyfunc6 (PFPi_PFl_i arg) { arg = 0; return 0; } -int hairyfunc7 (PFPFPc_i_PFl_i arg) { arg = 0; return 0; } - -/* gdb has two demanglers (one for g++ 2.95, one for g++ 3). - These marker functions help me figure out which demangler is in use. */ - -char * dm_type_char_star (char * p) { return p; } -int dm_type_foo_ref (foo & foo) { return foo.ifoo; } -int * dm_type_int_star (int * p) { return p; } -long * dm_type_long_star (long * p) { return p; } -int dm_type_unsigned_int (unsigned int i) { return i; } -int dm_type_void (void) { return 0; } -void * dm_type_void_star (void * p) { return p; } diff --git a/gdb/testsuite/gdb.c++/cplusfuncs.exp b/gdb/testsuite/gdb.c++/cplusfuncs.exp deleted file mode 100644 index 0a5e1b3..0000000 --- a/gdb/testsuite/gdb.c++/cplusfuncs.exp +++ /dev/null @@ -1,564 +0,0 @@ -# Copyright 1992, 1997, 1999, 2001, 2002, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) -# Adapted for g++ 3.0 ABI by Michael Chastain. (chastain@redhat.com) - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -set testfile "cplusfuncs" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [get_compiler_info $binfile "c++"] } { - return -1 -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# -# g++ changed its ABI between 2.95 and 3.0. gdb has two demanglers -# for the two different styles. The two demanglers have some subtle -# discrepancies in their output. -# -# old demangler new demangler -# --- --------- --- --------- -# "operator, " "operator," -# "char *" "char*" -# "int *" "int*" -# "long *" "long*" -# "void *" "void*" -# "foo &" "foo&" -# "unsigned int" "unsigned" -# "void" "" -# -# I probe for the forms in use. -# The defaults are for the v3 demangler (as of 2001-02-13). -# - -set dm_operator_comma "," -set dm_type_char_star "char*" -set dm_type_char_star_quoted "char\\*" -set dm_type_foo_ref "foo&" -set dm_type_int_star "int*" -set dm_type_long_star "long*" -set dm_type_unsigned_int "unsigned" -set dm_type_void "" -set dm_type_void_star "void*" - -proc probe_demangler { } { - global gdb_prompt - global dm_operator_comma - global dm_type_char_star - global dm_type_char_star_quoted - global dm_type_foo_ref - global dm_type_int_star - global dm_type_long_star - global dm_type_unsigned_int - global dm_type_void - global dm_type_void_star - - send_gdb "print &'foo::operator,(foo&)'\n" - gdb_expect { - -re ".*foo::operator, \\(.*foo.*&.*\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_operator_comma ", " - pass "detect dm_operator_comma" - } - -re ".*foo::operator,\\(.*foo.*&.*\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_operator_comma" - } - -re ".*$gdb_prompt $" { - fail "detect dm_operator_comma" - } - timeout { - fail "detect dm_operator_comma" - } - } - - send_gdb "print &'dm_type_char_star'\n" - gdb_expect { - -re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_char_star "char *" - set dm_type_char_star_quoted "char \\*" - pass "detect dm_type_char_star" - } - -re ".*dm_type_char_star\\(char\\*\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_char_star" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_char_star" - } - timeout { - fail "detect dm_type_char_star (timeout)" - } - } - - send_gdb "print &'dm_type_foo_ref'\n" - gdb_expect { - -re ".*dm_type_foo_ref\\(foo &\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_foo_ref "foo &" - pass "detect dm_type_foo_ref" - } - -re ".*dm_type_foo_ref\\(foo&\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_foo_ref" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_foo_ref" - } - timeout { - fail "detect dm_type_foo_ref (timeout)" - } - } - - send_gdb "print &'dm_type_int_star'\n" - gdb_expect { - -re ".*dm_type_int_star\\(int \\*\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_int_star "int *" - pass "detect dm_type_int_star" - } - -re ".*dm_type_int_star\\(int\\*\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_int_star" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_int_star" - } - timeout { - fail "detect dm_type_int_star (timeout)" - } - } - - send_gdb "print &'dm_type_long_star'\n" - gdb_expect { - -re ".*dm_type_long_star\\(long \\*\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_long_star "long *" - pass "detect dm_type_long_star" - } - -re ".*dm_type_long_star\\(long\\*\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_long_star" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_long_star" - } - timeout { - fail "detect dm_type_long_star (timeout)" - } - } - - send_gdb "print &'dm_type_unsigned_int'\n" - gdb_expect { - -re ".*dm_type_unsigned_int\\(unsigned int\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_unsigned_int "unsigned int" - pass "detect dm_type_unsigned_int" - } - -re ".*dm_type_unsigned_int\\(unsigned\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_unsigned_int" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_unsigned_int" - } - timeout { - fail "detect dm_unsigned int (timeout)" - } - } - - send_gdb "print &'dm_type_void'\n" - gdb_expect { - -re ".*dm_type_void\\(void\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_void "void" - pass "detect dm_type_void" - } - -re ".*dm_type_void\\(\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_void" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_void" - } - timeout { - fail "detect dm_type_void (timeout)" - } - } - - send_gdb "print &'dm_type_void_star'\n" - gdb_expect { - -re ".*dm_type_void_star\\(void \\*\\).*\r\n$gdb_prompt $" { - # v2 demangler - set dm_type_void_star "void *" - pass "detect dm_type_void_star" - } - -re ".*dm_type_void_star\\(void\\*\\).*\r\n$gdb_prompt $" { - # v3 demangler - pass "detect dm_type_void_star" - } - -re ".*$gdb_prompt $" { - fail "detect dm_type_void_star" - } - timeout { - fail "detect dm_type_void_star (timeout)" - } - } -} - -# -# Lookup a specific C++ function and print the demangled type. -# This form accepts the demangled type as a regexp. -# - -proc info_func_regexp { name demangled } { - global gdb_prompt - - send_gdb "info function $name\n" - gdb_expect { - -re ".*File .*:\r\n(class |)$demangled\r\n.*$gdb_prompt $" { - pass "info function for \"$name\"" - } - -re ".*$gdb_prompt $" { - fail "info function for \"$name\"" - } - timeout { - fail "info function for \"$name\" (timeout)" - } - } -} - -# -# Lookup a specific C++ function and print the demangled type. -# This form accepts the demangled type as a literal string. -# - -proc info_func { name demangled } { - info_func_regexp "$name" [string_to_regexp "$demangled"] -} - -# -# Print the address of a function. -# This checks that I can lookup a fully qualified C++ function. -# This also checks the argument types on the return string. - -# Note: carlton/2003-01-16: If you modify this, make a corresponding -# modification to print_addr_2_kfail. - -proc print_addr_2 { name good } { - global gdb_prompt - global hex - - set good_pattern [string_to_regexp $good] - - send_gdb "print &'$name'\n" - gdb_expect { - -re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" { - pass "print &'$name'" - } - -re ".*$gdb_prompt $" { - fail "print &'$name'" - } - timeout { - fail "print &'$name' (timeout)" - } - } -} - -# NOTE: carlton/2003-01-16: hairyfunc5-6 fail on GCC 3.x (for at least -# x=1 and x=2.1). So I'm modifying print_addr_2 to accept a failure -# condition. FIXME: It would be nice if the failure condition were -# conditional on the compiler version, but I'm not sufficiently -# motivated. I did hardwire in the versions of char * and int *, -# which will give some compiler-specificity to the failure. - -proc print_addr_2_kfail { name good bad bugid } { - global gdb_prompt - global hex - - set good_pattern [string_to_regexp $good] - set bad_pattern [string_to_regexp $bad] - - send_gdb "print &'$name'\n" - gdb_expect { - -re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" { - pass "print &'$name'" - } - -re ".* = .* $hex <$bad_pattern>\r\n$gdb_prompt $" { - kfail $bugid "print &'$name'" - } - -re ".*$gdb_prompt $" { - fail "print &'$name'" - } - timeout { - fail "print &'$name' (timeout)" - } - } -} - -# -# Simple interfaces to print_addr_2. -# - -proc print_addr { name } { - print_addr_2 "$name" "$name" -} - -# -# Test name demangling for operators. -# -# The '(' at the end of each regex input pattern is so that we match only -# the one we are looking for. I.E. "operator&" would match both -# "operator&(foo &)" and "operator&&(foo &)". -# -# gdb-gnats bug gdb/18: -# "gdb can't parse "info func operator*" or "info func operator\*". -# The star in "operator*" is interpreted as a regexp, but the "\*" -# in "operator\*" is not a legal operator. -# - -proc test_lookup_operator_functions {} { - global dm_operator_comma - global dm_type_char_star - global dm_type_char_star_quoted - global dm_type_foo_ref - global dm_type_void - global dm_type_void_star - - # operator* requires quoting so that GDB does not treat it as a regexp. - info_func "operator\\*(" "void foo::operator*($dm_type_foo_ref);" - info_func "operator%(" "void foo::operator%($dm_type_foo_ref);" - info_func "operator-(" "void foo::operator-($dm_type_foo_ref);" - info_func "operator>>(" "void foo::operator>>($dm_type_foo_ref);" - info_func "operator!=(" "void foo::operator!=($dm_type_foo_ref);" - info_func "operator>(" "void foo::operator>($dm_type_foo_ref);" - info_func "operator>=(" "void foo::operator>=($dm_type_foo_ref);" - info_func "operator|(" "void foo::operator|($dm_type_foo_ref);" - info_func "operator&&(" "void foo::operator&&($dm_type_foo_ref);" - info_func "operator!(" "void foo::operator!($dm_type_void);" - info_func "operator++(" "void foo::operator++(int);" - info_func "operator=(" "void foo::operator=($dm_type_foo_ref);" - info_func "operator+=(" "void foo::operator+=($dm_type_foo_ref);" - # operator*= requires quoting so that GDB does not treat it as a regexp. - info_func "operator\\*=(" "void foo::operator*=($dm_type_foo_ref);" - info_func "operator%=(" "void foo::operator%=($dm_type_foo_ref);" - info_func "operator>>=(" "void foo::operator>>=($dm_type_foo_ref);" - info_func "operator|=(" "void foo::operator|=($dm_type_foo_ref);" - info_func "operator$dm_operator_comma\(" \ - "void foo::operator$dm_operator_comma\($dm_type_foo_ref);" - info_func "operator/(" "void foo::operator/($dm_type_foo_ref);" - info_func "operator+(" "void foo::operator+($dm_type_foo_ref);" - info_func "operator<<(" "void foo::operator<<($dm_type_foo_ref);" - info_func "operator==(" "void foo::operator==($dm_type_foo_ref);" - info_func "operator<(" "void foo::operator<($dm_type_foo_ref);" - info_func "operator<=(" "void foo::operator<=($dm_type_foo_ref);" - info_func "operator&(" "void foo::operator&($dm_type_foo_ref);" - info_func "operator^(" "void foo::operator^($dm_type_foo_ref);" - info_func "operator||(" "void foo::operator||($dm_type_foo_ref);" - info_func "operator~(" "void foo::operator~($dm_type_void);" - info_func "operator--(" "void foo::operator--(int);" - info_func "operator->(" "foo *foo::operator->($dm_type_void);" - info_func "operator-=(" "void foo::operator-=($dm_type_foo_ref);" - info_func "operator/=(" "void foo::operator/=($dm_type_foo_ref);" - info_func "operator<<=(" "void foo::operator<<=($dm_type_foo_ref);" - info_func "operator&=(" "void foo::operator&=($dm_type_foo_ref);" - info_func "operator^=(" "void foo::operator^=($dm_type_foo_ref);" - # operator->* requires quoting so that GDB does not treat it as a regexp. - info_func "operator->\\*(" "void foo::operator->*($dm_type_foo_ref);" - - # operator[] needs double backslashes, so that a single backslash - # will be sent to GDB, preventing the square brackets from being - # evaluated as a regular expression. - info_func "operator\\\[\\\](" "void foo::operator\[\]($dm_type_foo_ref);" - - # These are gnarly because they might end with 'static'. - set dm_type_void_star_regexp [string_to_regexp $dm_type_void_star] - info_func_regexp "operator new(" "void \\*foo::operator new\\(.*\\)(| static);" - info_func_regexp "operator delete(" "void foo::operator delete\\($dm_type_void_star_regexp\\)(| static);" - - info_func "operator int(" "int foo::operator int($dm_type_void);" - info_func "operator()(" "void foo::operator()($dm_type_foo_ref);" - info_func "operator $dm_type_char_star_quoted\(" \ - "char *foo::operator $dm_type_char_star\($dm_type_void);" - -} - - -proc test_paddr_operator_functions {} { - global hex - global hp_aCC_compiler - global dm_operator_comma - global dm_type_char_star - global dm_type_foo_ref - global dm_type_long_star - global dm_type_unsigned_int - global dm_type_void - global dm_type_void_star - - print_addr "foo::operator*($dm_type_foo_ref)" - print_addr "foo::operator%($dm_type_foo_ref)" - print_addr "foo::operator-($dm_type_foo_ref)" - print_addr "foo::operator>>($dm_type_foo_ref)" - print_addr "foo::operator!=($dm_type_foo_ref)" - print_addr "foo::operator>($dm_type_foo_ref)" - print_addr "foo::operator>=($dm_type_foo_ref)" - print_addr "foo::operator|($dm_type_foo_ref)" - print_addr "foo::operator&&($dm_type_foo_ref)" - print_addr "foo::operator!($dm_type_void)" - print_addr "foo::operator++(int)" - print_addr "foo::operator=($dm_type_foo_ref)" - print_addr "foo::operator+=($dm_type_foo_ref)" - print_addr "foo::operator*=($dm_type_foo_ref)" - print_addr "foo::operator%=($dm_type_foo_ref)" - print_addr "foo::operator>>=($dm_type_foo_ref)" - print_addr "foo::operator|=($dm_type_foo_ref)" - print_addr "foo::operator$dm_operator_comma\($dm_type_foo_ref)" - print_addr "foo::operator/($dm_type_foo_ref)" - print_addr "foo::operator+($dm_type_foo_ref)" - print_addr "foo::operator<<($dm_type_foo_ref)" - print_addr "foo::operator==($dm_type_foo_ref)" - print_addr "foo::operator<($dm_type_foo_ref)" - print_addr "foo::operator<=($dm_type_foo_ref)" - print_addr "foo::operator&($dm_type_foo_ref)" - print_addr "foo::operator^($dm_type_foo_ref)" - print_addr "foo::operator||($dm_type_foo_ref)" - print_addr "foo::operator~($dm_type_void)" - print_addr "foo::operator--(int)" - print_addr "foo::operator->($dm_type_void)" - print_addr "foo::operator-=($dm_type_foo_ref)" - print_addr "foo::operator/=($dm_type_foo_ref)" - print_addr "foo::operator<<=($dm_type_foo_ref)" - print_addr "foo::operator&=($dm_type_foo_ref)" - print_addr "foo::operator^=($dm_type_foo_ref)" - print_addr "foo::operator->*($dm_type_foo_ref)" - print_addr "foo::operator\[\]($dm_type_foo_ref)" - print_addr "foo::operator()($dm_type_foo_ref)" - - gdb_test "print &'foo::operator new'" \ - " = .* $hex " - if { !$hp_aCC_compiler } { - print_addr "foo::operator delete($dm_type_void_star)" - } else { - gdb_test "print &'foo::operator delete($dm_type_void_star) static'" \ - " = .*(0x\[0-9a-f\]+|) " - } - - print_addr "foo::operator int($dm_type_void)" - print_addr "foo::operator $dm_type_char_star\($dm_type_void)" -} - -# -# Test overloaded functions (1 arg). -# - -proc test_paddr_overloaded_functions {} { - global dm_type_unsigned_int - global dm_type_void - - print_addr "overload1arg($dm_type_void)" - print_addr "overload1arg(char)" - print_addr "overload1arg(signed char)" - print_addr "overload1arg(unsigned char)" - print_addr "overload1arg(short)" - print_addr "overload1arg(unsigned short)" - print_addr "overload1arg(int)" - print_addr "overload1arg($dm_type_unsigned_int)" - print_addr "overload1arg(long)" - print_addr "overload1arg(unsigned long)" - print_addr "overload1arg(float)" - print_addr "overload1arg(double)" - - print_addr "overloadargs(int)" - print_addr "overloadargs(int, int)" - print_addr "overloadargs(int, int, int)" - print_addr "overloadargs(int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int, int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int)" - print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int, int)" -} - -proc test_paddr_hairy_functions {} { - global gdb_prompt - global hex - global dm_type_char_star - global dm_type_int_star - global dm_type_long_star - - print_addr_2 "hairyfunc1" "hairyfunc1(int)" - print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" - print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" - print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" - - # gdb-gnats bug gdb/19: - # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" - print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" - print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" - print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" -} - -proc do_tests {} { - global prms_id - global bug_id - global subdir - global objdir - global srcdir - global binfile - global gdb_prompt - - set prms_id 0 - set bug_id 0 - - # Start with a fresh gdb. - - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - - send_gdb "set language c++\n" - gdb_expect -re "$gdb_prompt $" - send_gdb "set width 0\n" - gdb_expect -re "$gdb_prompt $" - - runto_main - - probe_demangler - test_paddr_overloaded_functions - test_paddr_operator_functions - test_paddr_hairy_functions - test_lookup_operator_functions -} - -do_tests diff --git a/gdb/testsuite/gdb.c++/ctti.exp b/gdb/testsuite/gdb.c++/ctti.exp deleted file mode 100644 index 96e9fcf..0000000 --- a/gdb/testsuite/gdb.c++/ctti.exp +++ /dev/null @@ -1,269 +0,0 @@ -# Copyright 1998, 1999, 2001 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - - -# This file is part of the gdb testsuite -# file written by Elena Zannoni (ezannoni@cygnus.com) -# -# source files cttiadd.cc, cttiadd1.cc, cttiadd2.cc, cttiadd3.cc -# - - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -# Check to see if we have an executable to test. If not, then either we -# haven't tried to compile one, or the compilation failed for some reason. -# In either case, just notify the user and skip the tests in this file. - -set testfile "cttiadd" -set srcfile ${testfile}.cc -set srcfile1 ${testfile}1.cc -set srcfile2 ${testfile}2.cc -set srcfile3 ${testfile}3.cc -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile} "c++"] { - return -1; -} - -if { $gcc_compiled } then { continue } - -#if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1} ${srcdir}/${subdir}/${srcfile2} ${srcdir}/${subdir}/${srcfile3}" "${binfile}" executable {debug c++}] != "" } { -# gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -#} - -set cmdline "$CXX_FOR_TARGET ${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1} ${srcdir}/${subdir}/${srcfile2} ${srcdir}/${subdir}/${srcfile3} -g -o ${binfile}" - -remote_exec build $cmdline - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - - -send_gdb "n\n" -gdb_expect { - -re "$decimal.*i = 2;.*$gdb_prompt $" { - pass "next " - } - -re ".*$gdb_prompt $" { fail "next " } - timeout { fail "next " } - } - - -send_gdb "n\n" -gdb_expect { - -re "$decimal.*f = 4.5;.*$gdb_prompt $" { - pass "next " - } - -re ".*$gdb_prompt $" { fail "next " } - timeout { fail "next " } - } - -send_gdb "n\n" -gdb_expect { - -re "$decimal.*c = add\\(c, c\\);.*$gdb_prompt $" { - pass "next " - } - -re ".*$gdb_prompt $" { fail "next " } - timeout { fail "next " } - } - -send_gdb "n\n" -gdb_expect { - -re "$decimal.*i = add\\(i, i\\);.*$gdb_prompt $" { - pass "next " - } - -re ".*$gdb_prompt $" { fail "next " } - timeout { fail "next " } - } - -send_gdb "n\n" -gdb_expect { - -re "$decimal.*f = add\\(f, f\\);.*$gdb_prompt $" { - pass "next " - } - -re ".*$gdb_prompt $" { fail "next " } - timeout { fail "next " } - } - -send_gdb "n\n" -gdb_expect { - -re "$decimal.*add1\\(\\);.*$gdb_prompt $" { - pass "next " - } - -re ".*$gdb_prompt $" { fail "next " } - timeout { fail "next " } - } - -send_gdb "print c\n" -gdb_expect { - -re ".$decimal = -62.*\r\n$gdb_prompt $" { - pass "print value of c" - } - -re ".*$gdb_prompt $" { fail "print value of c" } - timeout { fail "(timeout) print value of c" } - } - - -send_gdb "print f\n" -gdb_expect { - -re ".$decimal = 9\r\n$gdb_prompt $" { - pass "print value of f" - } - -re ".*$gdb_prompt $" { fail "print value of f" } - timeout { fail "(timeout) print value of f" } - } - - -send_gdb "print i\n" -gdb_expect { - -re ".$decimal = 4\r\n$gdb_prompt $" { - pass "print value of i" - } - -re ".*$gdb_prompt $" { fail "print value of i" } - timeout { fail "(timeout) print value of i" } - } - - - -send_gdb "print add(2,2)\n" -gdb_expect { - -re ".$decimal = 4\r\n$gdb_prompt $" { - pass "print value of add(2,2)" - } - -re ".*$gdb_prompt $" { fail "print value of add(2,2)" } - timeout { fail "(timeout) print value of add(2,2)" } - } - -send_gdb "print add(2.3,2.3)\n" -gdb_expect { - -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { - pass "print value of add(2.3,2.3)" - } - -re ".*$gdb_prompt $" { fail "print value of add(2.3,2.3)" } - timeout { fail "(timeout) print value of add(2.3,2.3)" } - } - -send_gdb "print add('A','A')\n" -gdb_expect { - -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { - pass "print value of add('A','A')" - } - -re ".*$gdb_prompt $" { fail "print value of add('A','A')" } - timeout { fail "(timeout) print value of add('A','A')" } - } - - -send_gdb "print add2(2,2)\n" -gdb_expect { - -re ".$decimal = 4\r\n$gdb_prompt $" { - pass "print value of add2(2,2)" - } - -re ".*$gdb_prompt $" { fail "print value of add2(2,2)" } - timeout { fail "(timeout) print value of add2(2,2)" } - } - -send_gdb "print add2(2.3,2.3)\n" -gdb_expect { - -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { - pass "print value of add2(2.3,2.3)" - } - -re ".*$gdb_prompt $" { fail "print value of add2(2.3,2.3)" } - timeout { fail "(timeout) print value of add2(2.3,2.3)" } - } - -send_gdb "print add2('A','A')\n" -gdb_expect { - -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { - pass "print value of add2('A','A')" - } - -re ".*$gdb_prompt $" { fail "print value of add2('A','A')" } - timeout { fail "(timeout) print value of add2('A','A')" } - } - -send_gdb "print add3(2,2)\n" -gdb_expect { - -re ".$decimal = 4\r\n$gdb_prompt $" { - pass "print value of add3(2,2)" - } - -re ".*$gdb_prompt $" { fail "print value of add3(2,2)" } - timeout { fail "(timeout) print value of add3(2,2)" } - } - -send_gdb "print add3(2.3,2.3)\n" -gdb_expect { - -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { - pass "print value of add3(2.3,2.3)" - } - -re ".*$gdb_prompt $" { fail "print value of add3(2.3,2.3)" } - timeout { fail "(timeout) print value of add3(2.3,2.3)" } - } - -send_gdb "print add3('A','A')\n" -gdb_expect { - -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { - pass "print value of add3('A','A')" - } - -re ".*$gdb_prompt $" { fail "print value of add3('A','A')" } - timeout { fail "(timeout) print value of add3('A','A')" } - } - -send_gdb "print add4(2,2)\n" -gdb_expect { - -re ".$decimal = 4\r\n$gdb_prompt $" { - pass "print value of add4(2,2)" - } - -re ".*$gdb_prompt $" { fail "print value of add4(2,2)" } - timeout { fail "(timeout) print value of add4(2,2)" } - } - -send_gdb "print add4(2.3,2.3)\n" -gdb_expect { - -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { - pass "print value of add4(2.3,2.3)" - } - -re ".*$gdb_prompt $" { fail "print value of add4(2.3,2.3)" } - timeout { fail "(timeout) print value of add4(2.3,2.3)" } - } - -send_gdb "print add4('A','A')\n" -gdb_expect { - -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { - pass "print value of add4('A','A')" - } - -re ".*$gdb_prompt $" { fail "print value of add4('A','A')" } - timeout { fail "(timeout) print value of add4('A','A')" } - } - - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/cttiadd.cc b/gdb/testsuite/gdb.c++/cttiadd.cc deleted file mode 100644 index 1f50fae..0000000 --- a/gdb/testsuite/gdb.c++/cttiadd.cc +++ /dev/null @@ -1,29 +0,0 @@ -template T add(T v1, T v2) -{ - T v3; - v3 = v1; - v3 += v2; - return v3; - } - -int main() -{ - char c; - int i; - float f; - extern void add1(); - extern void subr2(); - extern void subr3(); - - c = 'a'; - i = 2; - f = 4.5; - - c = add(c, c); - i = add(i, i); - f = add(f, f); - - add1(); - subr2(); - subr3(); -} diff --git a/gdb/testsuite/gdb.c++/cttiadd1.cc b/gdb/testsuite/gdb.c++/cttiadd1.cc deleted file mode 100644 index 7113ece..0000000 --- a/gdb/testsuite/gdb.c++/cttiadd1.cc +++ /dev/null @@ -1,16 +0,0 @@ -template T add(T v1, T v2); - -void add1() -{ - char c; - int i; - float f; - - c = 'b'; - i = 3; - f = 6.5; - - c = add(c, c); - i = add(i, i); - f = add(f, f); -} diff --git a/gdb/testsuite/gdb.c++/cttiadd2.cc b/gdb/testsuite/gdb.c++/cttiadd2.cc deleted file mode 100644 index d0d9891..0000000 --- a/gdb/testsuite/gdb.c++/cttiadd2.cc +++ /dev/null @@ -1,22 +0,0 @@ -template T add2(T v1, T v2) -{ - T v3; - v3 = v1; - v3 += v2; - return v3; -} - -void subr2() -{ - char c; - int i; - float f; - - c = 'b'; - i = 3; - f = 6.5; - - c = add2(c, c); - i = add2(i, i); - f = add2(f, f); -} diff --git a/gdb/testsuite/gdb.c++/cttiadd3.cc b/gdb/testsuite/gdb.c++/cttiadd3.cc deleted file mode 100644 index 7ba1b01..0000000 --- a/gdb/testsuite/gdb.c++/cttiadd3.cc +++ /dev/null @@ -1,33 +0,0 @@ -template T add3(T v1, T v2) -{ - T v3; - v3 = v1; - v3 += v2; - return v3; -} - -template T add4(T v1, T v2) -{ - T v3; - v3 = v1; - v3 += v2; - return v3; -} - -void subr3() -{ - char c; - int i; - float f; - - c = 'b'; - i = 3; - f = 6.5; - - c = add3(c, c); - i = add3(i, i); - f = add3(f, f); - c = add4(c, c); - i = add4(i, i); - f = add4(f, f); -} diff --git a/gdb/testsuite/gdb.c++/demangle.exp b/gdb/testsuite/gdb.c++/demangle.exp deleted file mode 100644 index 7bd9fc5..0000000 --- a/gdb/testsuite/gdb.c++/demangle.exp +++ /dev/null @@ -1,1582 +0,0 @@ -# Copyright (C) 1992, 1997, 1999, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -### The demangling style we last sent to GDB. -set current_demangling_style none - -### Set GDB's current demangling style to STYLE. Subsequent calls to -### test_demangle will include STYLE in the test name when reporting -### passes and failures. -proc set_demangling_style {style} { - global gdb_prompt - global current_demangling_style - - send_gdb "set demangle-style $style\n" - gdb_expect { - -re "set demangle-style $style\[\r\n\]+$gdb_prompt $" { - pass "$style: set demangle-style" - } - -re ".*$gdb_prompt $" { - fail "$style: set demangle-style" - error "set_demangling_style: set style" - } - timeout { - fail "$style: set demangle-style (timeout)" - error "set_demangling_style: set style" - } - } - - send_gdb "show demangle-style\n" - gdb_expect { - -re "The current C\[+\]+ demangling style is \"$style\".\r\n$gdb_prompt $" { - pass "$style: check demangling style" - } - -re ".*$gdb_prompt $" { - fail "$style: check demangling style" - error "set_demangling_style: check style" - } - timeout { - fail "$style: check demangling style (timeout)" - error "set_demangling_style: check style" - } - } - - set current_demangling_style $style -} - - -### Utility function for test_demangling and test_demangling_exact. -proc test_demangling_core {tester test result} { - global current_demangling_style - - if {! [regexp {^([^ ]+): (.+)$} $test dummy style name]} { - error "bad test name passed to test_demangling" - } - - if {[string compare $style $current_demangling_style]} { - set_demangling_style $style - } - - $tester "maintenance demangle $name" $result $test -} - -### Demangle an identifier, and check that the result matches a pattern. -### -### TEST should be of the form "STYLE: NAME", where STYLE is the name -### of a demangling style (like "gnu" or "arm"), and NAME is a mangled -### identifier to demangle. Pass when the result matches the regular -### expression RESULT. Report passes and fails using TEST as the name -### of the test. -### -### Why don't we just pass the STYLE and NAME as two separate -### arguments, or let the style be a global variable? That would be -### cleaner. However, doing it this way means that: -### -### 1) the name of the test, as recorded in the summary and log, -### appears verbatim in the script, and -### -### 2) that test names are unique, even though we try to demangle the same -### identifiers using several different mangling styles. -### -### This makes it a lot easier for people tracking down failures to -### find the one they care about. - -proc test_demangling {test result} { - test_demangling_core gdb_test $test $result -} - -### Like test_demangling, above, except that RESULT is not a regexp, -### but a string that must match exactly. - -proc test_demangling_exact {test result} { - test_demangling_core gdb_test_exact $test $result -} - - - -# -# Test gnu style name demangling -# - -proc test_gnu_style_demangling {} { - global gdb_prompt - - test_demangling "gnu: Abort__FP6EditoriPCc" \ - "Abort\[(\]+Editor \[*\]+, int, (const char|char const) \[*\]+\[)\]+" - test_demangling_exact "gnu: AddAlignment__9ivTSolverUiP12ivInteractorP7ivTGlue" "ivTSolver::AddAlignment(unsigned int, ivInteractor *, ivTGlue *)" - test_demangling "gnu: Append__15NameChooserViewPCc" \ - "NameChooserView::Append\[(\]+(const char|char const) \[*\]+\[)\]+" - test_demangling_exact "gnu: ArrowheadIntersects__9ArrowLineP9ArrowheadR6BoxObjP7Graphic" "ArrowLine::ArrowheadIntersects(Arrowhead *, BoxObj &, Graphic *)" - test_demangling_exact "gnu: AtEnd__13ivRubberGroup" "ivRubberGroup::AtEnd(void)" - test_demangling_exact "gnu: BgFilter__9ivTSolverP12ivInteractor" "ivTSolver::BgFilter(ivInteractor *)" - test_demangling "gnu: BitPatterntoa__FRC10BitPatternccc" \ - "BitPatterntoa\[(\]+(const BitPattern|BitPattern const) &, char, char, char\[)\]+" - test_demangling_exact "gnu: Check__6UArrayi" "UArray::Check(int)" - test_demangling_exact "gnu: CoreConstDecls__8TextCodeR7ostream" "TextCode::CoreConstDecls(ostream &)" - test_demangling_exact "gnu: Detach__8StateVarP12StateVarView" "StateVar::Detach(StateVarView *)" - test_demangling_exact "gnu: Done__9ComponentG8Iterator" "Component::Done(Iterator)" - test_demangling "gnu: DrawDestinationTransformedImage__FP7_XImageiiT0iiUlUiiiUiUlUlP4_XGCRC13ivTransformeriiii" \ - "DrawDestinationTransformedImage\[(\]+_XImage \[*\]+, int, int, _XImage \[*\]+, int, int, unsigned long, unsigned int, int, int, unsigned int, unsigned long, unsigned long, _XGC \[*\]+, (const ivTransformer|ivTransformer const) &, int, int, int, int\[)\]+" - - test_demangling "gnu: Edit__12StringEditorPCcii" \ - "StringEditor::Edit\[(\]+(const char|char const) \[*\]+, int, int\[)\]+" - test_demangling_exact "gnu: Effect__11RelateManipR7ivEvent" "RelateManip::Effect(ivEvent &)" - test_demangling "gnu: FilterName__FPCc" \ - "FilterName\[(\]+(const char|char const) \[*\]+\[)\]+" - test_demangling "gnu: Filter__6PSTextPCci" \ - "PSText::Filter\[(\]+(const char|char const) \[*\]+, int\[)\]+" - test_demangling "gnu: FindColor__7CatalogPCciii" \ - "Catalog::FindColor\[(\]+(const char|char const) \[*\]+, int, int, int\[)\]+" - test_demangling_exact "gnu: FindFixed__FRP4CNetP4CNet" "FindFixed(CNet *&, CNet *)" - test_demangling "gnu: FindFont__7CatalogPCcN21" \ - "Catalog::FindFont\[(\]+(const char|char const) \[*\]+, (const char|char const) \[*\]+, (const char|char const) \[*\]+\[)\]+" - test_demangling_exact "gnu: Fix48_abort__FR8twolongs" "Fix48_abort(twolongs &)" - test_demangling_exact "gnu: GetBarInfo__15iv2_6_VScrollerP13ivPerspectiveRiT2" "iv2_6_VScroller::GetBarInfo(ivPerspective *, int &, int &)" - test_demangling_exact "gnu: GetBgColor__C9ivPainter" "ivPainter::GetBgColor(void) const" - - test_demangling "gnu: Iisdouble__FPC6IntRep" \ - "Iisdouble\[(\]+(const IntRep|IntRep const) \[*\]+\[)\]+" - test_demangling_exact "gnu: InsertBody__15H_PullrightMenuii" "H_PullrightMenu::InsertBody(int, int)" - test_demangling_exact "gnu: InsertCharacter__9TextManipc" "TextManip::InsertCharacter(char)" - - test_demangling_exact "gnu: InsertToplevel__7ivWorldP12ivInteractorT1" "ivWorld::InsertToplevel(ivInteractor *, ivInteractor *)" - test_demangling_exact "gnu: InsertToplevel__7ivWorldP12ivInteractorT1iiUi" "ivWorld::InsertToplevel(ivInteractor *, ivInteractor *, int, int, unsigned int)" - test_demangling "gnu: IsADirectory__FPCcR4stat" \ - "IsADirectory\[(\]+(const char|char const) \[*\]+, stat &\[)\]+" - test_demangling_exact "gnu: IsAGroup__FP11GraphicViewP11GraphicComp" "IsAGroup(GraphicView *, GraphicComp *)" - test_demangling_exact "gnu: IsA__10ButtonCodeUl" "ButtonCode::IsA(unsigned long)" - - test_demangling_exact "gnu: ReadName__FR7istreamPc" "ReadName(istream &, char *)" - test_demangling_exact "gnu: Redraw__13StringBrowseriiii" "StringBrowser::Redraw(int, int, int, int)" - test_demangling_exact "gnu: Rotate__13ivTransformerf" "ivTransformer::Rotate(float)" - test_demangling_exact "gnu: Rotated__C13ivTransformerf" "ivTransformer::Rotated(float) const" - test_demangling_exact "gnu: Round__Ff" "Round(float)" - - test_demangling_exact "gnu: SetExport__16MemberSharedNameUi" "MemberSharedName::SetExport(unsigned int)" - test_demangling_exact "gnu: Set__14ivControlState13ControlStatusUi" "ivControlState::Set(ControlStatus, unsigned int)" - test_demangling_exact "gnu: Set__5DFacePcii" "DFace::Set(char *, int, int)" - - test_demangling_exact "gnu: VConvert__9ivTSolverP12ivInteractorRP8TElementT2" "ivTSolver::VConvert(ivInteractor *, TElement *&, TElement *&)" - test_demangling_exact "gnu: VConvert__9ivTSolverP7ivTGlueRP8TElement" "ivTSolver::VConvert(ivTGlue *, TElement *&)" - test_demangling_exact "gnu: VOrder__9ivTSolverUiRP12ivInteractorT2" "ivTSolver::VOrder(unsigned int, ivInteractor *&, ivInteractor *&)" - test_demangling "gnu: Valid__7CatalogPCcRP4Tool" \ - "Catalog::Valid\[(\]+(const char|char const) \[*\]+, Tool \[*\]+&\[)\]+" - test_demangling_exact "gnu: _10PageButton\$__both" "PageButton::__both" - test_demangling_exact "gnu: _3RNG\$singleMantissa" "RNG::singleMantissa" - test_demangling_exact "gnu: _5IComp\$_release" "IComp::_release" - test_demangling_exact "gnu: _\$_10BitmapComp" "BitmapComp::~BitmapComp(void)" - - test_demangling_exact "gnu: _\$_9__io_defs" "__io_defs::~__io_defs(void)" - test_demangling_exact "gnu: _\$_Q23foo3bar" "foo::bar::~bar(void)" - test_demangling_exact "gnu: _\$_Q33foo3bar4bell" "foo::bar::bell::~bell(void)" - test_demangling_exact "gnu: __10ivTelltaleiP7ivGlyph" "ivTelltale::ivTelltale(int, ivGlyph *)" - test_demangling_exact "gnu: __10ivViewportiP12ivInteractorUi" "ivViewport::ivViewport(int, ivInteractor *, unsigned int)" - test_demangling_exact "gnu: __10ostrstream" "ostrstream::ostrstream(void)" - test_demangling_exact "gnu: __10ostrstreamPcii" "ostrstream::ostrstream(char *, int, int)" - test_demangling "gnu: __11BasicDialogiPCcP13ivButtonStateN22Ui" \ - "BasicDialog::BasicDialog\[(\]+int, (const char|char const) \[*\]+, ivButtonState \[*\]+, (const char|char const) \[*\]+, (const char|char const) \[*\]+, unsigned int\[)\]+" - test_demangling_exact "gnu: __11BitmapTablei" "BitmapTable::BitmapTable(int)" - test_demangling_exact "gnu: __12ViewportCodeP12ViewportComp" "ViewportCode::ViewportCode(ViewportComp *)" - test_demangling "gnu: __12iv2_6_BorderiPCci" \ - "iv2_6_Border::iv2_6_Border\[(\]+int, (const char|char const) \[*\]+, int\[)\]+" - test_demangling_exact "gnu: __12iv2_6_Borderii" "iv2_6_Border::iv2_6_Border(int, int)" - test_demangling "gnu: __12ivBackgroundiP7ivGlyphPC7ivColor" \ - "ivBackground::ivBackground\[(\]+int, ivGlyph \[*\]+, (const ivColor|ivColor const) \[*\]+\[)\]+" - test_demangling_exact "gnu: __12ivBreak_Listl" "ivBreak_List::ivBreak_List(long)" - test_demangling "gnu: __14TextInteractoriPCcUi" \ - "TextInteractor::TextInteractor\[(\]+int, (const char|char const) \[*\]+, unsigned int\[)\]+" - test_demangling_exact "gnu: __14iv2_6_MenuItemiP12ivInteractor" "iv2_6_MenuItem::iv2_6_MenuItem(int, ivInteractor *)" - test_demangling "gnu: __14iv2_6_MenuItemiPCcP12ivInteractor" \ - "iv2_6_MenuItem::iv2_6_MenuItem\[(\]+int, (const char|char const) \[*\]+, ivInteractor \[*\]+\[)\]+" - - test_demangling_exact "gnu: __20DisplayList_IteratorR11DisplayList" "DisplayList_Iterator::DisplayList_Iterator(DisplayList &)" - test_demangling_exact "gnu: __3fooRT0" "foo::foo(foo &)" - test_demangling_exact "gnu: __3fooiN31" "foo::foo(int, int, int, int)" - test_demangling "gnu: __3fooiPCc" \ - "foo::foo\[(\]+int, (const char|char const) \[*\]+\[)\]+" - test_demangling_exact "gnu: __3fooiRT0iT2iT2" "foo::foo(int, foo &, int, foo &, int, foo &)" - test_demangling "gnu: __6GetOptiPPcPCc" \ - "GetOpt::GetOpt\[(\]+int, char \[*\]+\[*\]+, (const char|char const) \[*\]+\[)\]+" - test_demangling_exact "gnu: __6KeyMapPT0" "KeyMap::KeyMap(KeyMap *)" - test_demangling "gnu: __7ivWorldPCcRiPPcPC12ivOptionDescPC14ivPropertyData" \ - "ivWorld::ivWorld\[(\]+(const char|char const) \[*\]+, int &, char \[*\]+\[*\]+, (const ivOptionDesc|ivOptionDesc const) \[*\]+, (const ivPropertyData|ivPropertyData const) \[*\]+\[)\]+" - test_demangling "gnu: __7procbufPCci" \ - "procbuf::procbuf\[(\]+(const char|char const) \[*\]+, int\[)\]+" - test_demangling_exact "gnu: __8ArrowCmdP6EditorUiUi" "ArrowCmd::ArrowCmd(Editor *, unsigned int, unsigned int)" - - test_demangling_exact "gnu: __9F_EllipseiiiiP7Graphic" "F_Ellipse::F_Ellipse(int, int, int, int, Graphic *)" - test_demangling_exact "gnu: __9FrameDataP9FrameCompi" "FrameData::FrameData(FrameComp *, int)" - test_demangling_exact "gnu: __9HVGraphicP9CanvasVarP7Graphic" "HVGraphic::HVGraphic(CanvasVar *, Graphic *)" - test_demangling_exact "gnu: __Q23foo3bar" "foo::bar::bar(void)" - test_demangling_exact "gnu: __Q33foo3bar4bell" "foo::bar::bell::bell(void)" - test_demangling_exact "gnu: __aa__3fooRT0" "foo::operator&&(foo &)" - test_demangling_exact "gnu: __aad__3fooRT0" "foo::operator&=(foo &)" - test_demangling_exact "gnu: __ad__3fooRT0" "foo::operator&(foo &)" - test_demangling_exact "gnu: __adv__3fooRT0" "foo::operator/=(foo &)" - test_demangling_exact "gnu: __aer__3fooRT0" "foo::operator^=(foo &)" - test_demangling_exact "gnu: __als__3fooRT0" "foo::operator<<=(foo &)" - test_demangling_exact "gnu: __amd__3fooRT0" "foo::operator%=(foo &)" - test_demangling_exact "gnu: __ami__3fooRT0" "foo::operator-=(foo &)" - test_demangling_exact "gnu: __aml__3FixRT0" "Fix::operator*=(Fix &)" - test_demangling_exact "gnu: __aml__5Fix16i" "Fix16::operator*=(int)" - test_demangling_exact "gnu: __aml__5Fix32RT0" "Fix32::operator*=(Fix32 &)" - test_demangling_exact "gnu: __aor__3fooRT0" "foo::operator|=(foo &)" - test_demangling_exact "gnu: __apl__3fooRT0" "foo::operator+=(foo &)" - test_demangling_exact "gnu: __ars__3fooRT0" "foo::operator>>=(foo &)" - - test_demangling_exact "gnu: __as__3fooRT0" "foo::operator=(foo &)" - test_demangling_exact "gnu: __cl__3fooRT0" "foo::operator()(foo &)" - test_demangling_exact "gnu: __cl__6Normal" "Normal::operator()(void)" - test_demangling_exact "gnu: __cl__6Stringii" "String::operator()(int, int)" - test_demangling_exact "gnu: __cm__3fooRT0" "foo::operator, (foo &)" - test_demangling_exact "gnu: __co__3foo" "foo::operator~(void)" - test_demangling_exact "gnu: __dl__3fooPv" "foo::operator delete(void *)" - test_demangling_exact "gnu: __dv__3fooRT0" "foo::operator/(foo &)" - test_demangling_exact "gnu: __eq__3fooRT0" "foo::operator==(foo &)" - test_demangling_exact "gnu: __er__3fooRT0" "foo::operator^(foo &)" - test_demangling_exact "gnu: __ge__3fooRT0" "foo::operator>=(foo &)" - test_demangling_exact "gnu: __gt__3fooRT0" "foo::operator>(foo &)" - test_demangling_exact "gnu: __le__3fooRT0" "foo::operator<=(foo &)" - test_demangling_exact "gnu: __ls__3fooRT0" "foo::operator<<(foo &)" - test_demangling_exact "gnu: __ls__FR7ostreamPFR3ios_R3ios" "operator<<(ostream &, ios &(*)(ios &))" - test_demangling_exact "gnu: __ls__FR7ostreamR3Fix" "operator<<(ostream &, Fix &)" - test_demangling_exact "gnu: __lt__3fooRT0" "foo::operator<(foo &)" - test_demangling_exact "gnu: __md__3fooRT0" "foo::operator%(foo &)" - test_demangling_exact "gnu: __mi__3fooRT0" "foo::operator-(foo &)" - test_demangling_exact "gnu: __ml__3fooRT0" "foo::operator*(foo &)" - test_demangling_exact "gnu: __mm__3fooi" "foo::operator--(int)" - - test_demangling_exact "gnu: __ne__3fooRT0" "foo::operator!=(foo &)" - test_demangling "gnu: __ne__FRC7ComplexT0" \ - "operator!=\[(\]+(const Complex|Complex const) &, (const Complex|Complex const) &\[)\]+" - test_demangling "gnu: __ne__FRC7Complexd" \ - "operator!=\[(\]+(const Complex|Complex const) &, double\[)\]+" - test_demangling "gnu: __ne__FRC9SubStringRC6String" \ - "operator!=\[(\]+(const SubString|SubString const) &, (const String|String const) &\[)\]+" - test_demangling_exact "gnu: __nt__3foo" "foo::operator!(void)" - test_demangling_exact "gnu: __nw__3fooi" "foo::operator new(int)" - test_demangling_exact "gnu: __oo__3fooRT0" "foo::operator||(foo &)" - test_demangling_exact "gnu: __opPc__3foo" "foo::operator char *(void)" - test_demangling_exact "gnu: __opi__3foo" "foo::operator int(void)" - test_demangling_exact "gnu: __or__3fooRT0" "foo::operator|(foo &)" - test_demangling_exact "gnu: __pl__3fooRT0" "foo::operator+(foo &)" - test_demangling_exact "gnu: __pp__3fooi" "foo::operator++(int)" - test_demangling_exact "gnu: __rf__3foo" "foo::operator->(void)" - test_demangling_exact "gnu: __rm__3fooRT0" "foo::operator->*(foo &)" - test_demangling_exact "gnu: __rs__3fooRT0" "foo::operator>>(foo &)" - test_demangling "gnu: __vc__3fooRT0" "foo::operator\\\[\\\]\\(foo &\\)" - test_demangling "gnu: _gsub__6StringRC5RegexPCci" \ - "String::_gsub\[(\]+(const Regex|Regex const) &, (const char|char const) \[*\]+, int\[)\]+" - test_demangling_exact "gnu: _new_Fix__FUs" "_new_Fix(unsigned short)" - - # gcc 2.4.5 (and earlier) style virtual tables. We want to continue to - # correctly demangle these even if newer compilers use a different form. - test_demangling_exact "gnu: _vt.foo" "foo virtual table" - test_demangling_exact "gnu: _vt.foo.bar" "foo::bar virtual table" - test_demangling_exact "gnu: _vt\$foo" "foo virtual table" - test_demangling_exact "gnu: _vt\$foo\$bar" "foo::bar virtual table" - - test_demangling_exact "gnu: append__7ivGlyphPT0" "ivGlyph::append(ivGlyph *)" - test_demangling "gnu: arg__FRC7Complex" \ - "arg\[(\]+(const Complex|Complex const) &\[)\]+" - test_demangling_exact "gnu: clearok__FP7_win_sti" "clearok(_win_st *, int)" - - test_demangling_exact "gnu: complexfunc2__FPFPc_i" "complexfunc2(int (*)(char *))" - test_demangling_exact "gnu: complexfunc3__FPFPFPl_s_i" "complexfunc3(int (*)(short (*)(long *)))" - test_demangling_exact "gnu: complexfunc4__FPFPFPc_s_i" "complexfunc4(int (*)(short (*)(char *)))" - test_demangling_exact "gnu: complexfunc5__FPFPc_PFl_i" "complexfunc5(int (*(*)(char *))(long))" - test_demangling_exact "gnu: complexfunc6__FPFPi_PFl_i" "complexfunc6(int (*(*)(int *))(long))" - test_demangling_exact "gnu: complexfunc7__FPFPFPc_i_PFl_i" "complexfunc7(int (*(*)(int (*)(char *)))(long))" - test_demangling "gnu: contains__C9BitStringRC10BitPattern" \ - "BitString::contains\[(\]+(const BitPattern|BitPattern const) &\[)\]+ const" - test_demangling "gnu: contains__C9BitStringRC12BitSubStringi" \ - "BitString::contains\[(\]+(const BitSubString|BitSubString const) &, int\[)\]+ const" - test_demangling "gnu: contains__C9BitStringRT0" \ - "BitString::contains\[(\]+(const BitString|BitString const) &\[)\]+ const" - test_demangling "gnu: div__FPC6IntRepT0P6IntRep" \ - "div\[(\]+(const IntRep|IntRep const) \[*\]+, (const IntRep|IntRep const) \[*\]+, IntRep \[*\]+\[)\]+" - test_demangling "gnu: div__FPC6IntReplP6IntRep" \ - "div\[(\]+(const IntRep|IntRep const) \[*\]+, long, IntRep \[*\]+\[)\]+" - test_demangling "gnu: div__FRC8RationalT0R8Rational" \ - "div\[(\]+(const Rational|Rational const) &, (const Rational|Rational const) &, Rational &\[)\]+" - test_demangling "gnu: divide__FRC7IntegerT0R7IntegerT2" \ - "divide\[(\]+(const Integer|Integer const) &, (const Integer|Integer const) &, Integer &, Integer &\[)\]+" - test_demangling "gnu: divide__FRC7IntegerlR7IntegerRl" \ - "divide\[(\]+(const Integer|Integer const) &, long, Integer &, long &\[)\]+" - test_demangling "gnu: enable__14DocumentViewerPCcUi" \ - "DocumentViewer::enable\[(\]+(const char|char const) \[*\]+, unsigned int\[)\]+" - - test_demangling_exact "gnu: foo__FiN30" "foo(int, int, int, int)" - test_demangling_exact "gnu: foo__FiR3fooiT1iT1" "foo(int, foo &, int, foo &, int, foo &)" - test_demangling_exact "gnu: foo___3barl" "bar::foo_(long)" - test_demangling_exact "gnu: insert__15ivClippingStacklRP8_XRegion" "ivClippingStack::insert(long, _XRegion *&)" - test_demangling_exact "gnu: insert__16ChooserInfo_ListlR11ChooserInfo" "ChooserInfo_List::insert(long, ChooserInfo &)" - test_demangling_exact "gnu: insert__17FontFamilyRepListlRP15ivFontFamilyRep" "FontFamilyRepList::insert(long, ivFontFamilyRep *&)" - test_demangling_exact "gnu: leaveok__FP7_win_stc" "leaveok(_win_st *, char)" - test_demangling_exact "gnu: left_mover__C7ivMFKitP12ivAdjustableP7ivStyle" "ivMFKit::left_mover(ivAdjustable *, ivStyle *) const" - test_demangling "gnu: matches__C9BitStringRC10BitPatterni" \ - "BitString::matches\[(\]+(const BitPattern|BitPattern const) &, int\[)\]+ const" - test_demangling "gnu: matches__C9SubStringRC5Regex" \ - "SubString::matches\[(\]+(const Regex|Regex const) &\[)\]+ const" - - test_demangling_exact "gnu: overload1arg__FSc" "overload1arg(signed char)" - test_demangling_exact "gnu: overload1arg__FUc" "overload1arg(unsigned char)" - test_demangling_exact "gnu: overload1arg__FUi" "overload1arg(unsigned int)" - test_demangling_exact "gnu: overload1arg__FUl" "overload1arg(unsigned long)" - test_demangling_exact "gnu: overload1arg__FUs" "overload1arg(unsigned short)" - test_demangling_exact "gnu: overload1arg__Fc" "overload1arg(char)" - test_demangling_exact "gnu: overload1arg__Fd" "overload1arg(double)" - test_demangling_exact "gnu: overload1arg__Ff" "overload1arg(float)" - test_demangling_exact "gnu: overload1arg__Fi" "overload1arg(int)" - test_demangling_exact "gnu: overload1arg__Fl" "overload1arg(long)" - test_demangling_exact "gnu: overload1arg__Fs" "overload1arg(short)" - test_demangling_exact "gnu: overload1arg__Fv" "overload1arg(void)" - test_demangling_exact "gnu: overloadargs__Fi" "overloadargs(int)" - test_demangling_exact "gnu: overloadargs__Fii" "overloadargs(int, int)" - test_demangling_exact "gnu: overloadargs__Fiii" "overloadargs(int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiii" "overloadargs(int, int, int, int)" - - test_demangling_exact "gnu: overloadargs__Fiiiii" "overloadargs(int, int, int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiiiii" "overloadargs(int, int, int, int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiiiiii" "overloadargs(int, int, int, int, int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int, int)" - test_demangling_exact "gnu: overloadargs__Fiiiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int, int, int)" - test_demangling "gnu: pick__13ivCompositionP8ivCanvasRC12ivAllocationiR5ivHit" \ - "ivComposition::pick\[(\]+ivCanvas \[*\]+, (const ivAllocation|ivAllocation const) &, int, ivHit &\[)\]+" - test_demangling "gnu: pointer__C11ivHScrollerRC7ivEventRC12ivAllocation" \ - "ivHScroller::pointer\[(\]+(const ivEvent|ivEvent const) &, (const ivAllocation|ivAllocation const) &\[)\]+ const" - test_demangling_exact "gnu: poke__8ivRasterUlUlffff" "ivRaster::poke(unsigned long, unsigned long, float, float, float, float)" - test_demangling_exact "gnu: polar__Fdd" "polar(double, double)" - test_demangling "gnu: read__10osStdInputRPCc" \ - "osStdInput::read\[(\]+(const char|char const) \[*\]+&\[)\]+" - - test_demangling_exact "gnu: scale__13ivTransformerff" "ivTransformer::scale(float, float)" - test_demangling "gnu: scanw__12CursesWindowPCce" \ - "CursesWindow::scanw\[(\]+(const char|char const) \[*\]+,...\[)\]+" - test_demangling "gnu: scmp__FPCcT0" \ - "scmp\[(\]+(const char|char const) \[*\]+, (const char|char const) \[*\]+\[)\]+" - test_demangling_exact "gnu: sgetn__7filebufPci" "filebuf::sgetn(char *, int)" - test_demangling_exact "gnu: shift__FP5_FrepiT0" "shift(_Frep *, int, _Frep *)" - test_demangling_exact "gnu: test__C6BitSeti" "BitSet::test(int) const" - test_demangling_exact "gnu: test__C6BitSetii" "BitSet::test(int, int) const" - test_demangling "gnu: testbit__FRC7Integerl" \ - "testbit\[(\]+(const Integer|Integer const) &, long\[)\]+" - test_demangling_exact "gnu: text_source__8Documentl" "Document::text_source(long)" - test_demangling_exact "gnu: variance__6Erlangd" "Erlang::variance(double)" - test_demangling "gnu: vform__8iostreamPCcPc" \ - "iostream::vform\[(\]+(const char|char const) \[*\]+, char \[*\]+\[)\]+" - test_demangling_exact "gnu: view__14DocumentViewerP8ItemViewP11TabularItem" "DocumentViewer::view(ItemView *, TabularItem *)" - test_demangling_exact "gnu: xy_extents__11ivExtensionffff" "ivExtension::xy_extents(float, float, float, float)" - test_demangling_exact "gnu: zero__8osMemoryPvUi" "osMemory::zero(void *, unsigned int)" - test_demangling_exact "gnu: _2T4\$N" "T4::N" - test_demangling_exact "gnu: _Q22T42t1\$N" "T4::t1::N" - test_demangling_exact "gnu: get__2T1" "T1::get(void)" - test_demangling_exact "gnu: get__Q22T11a" "T1::a::get(void)" - test_demangling_exact "gnu: get__Q32T11a1b" "T1::a::b::get(void)" - test_demangling_exact "gnu: get__Q42T11a1b1c" "T1::a::b::c::get(void)" - test_demangling_exact "gnu: get__Q52T11a1b1c1d" "T1::a::b::c::d::get(void)" - test_demangling_exact "gnu: put__2T1i" "T1::put(int)" - test_demangling_exact "gnu: put__Q22T11ai" "T1::a::put(int)" - test_demangling_exact "gnu: put__Q32T11a1bi" "T1::a::b::put(int)" - test_demangling_exact "gnu: put__Q42T11a1b1ci" "T1::a::b::c::put(int)" - test_demangling_exact "gnu: put__Q52T11a1b1c1di" "T1::a::b::c::d::put(int)" - - test_demangling_exact "gnu: bar__3fooPv" "foo::bar(void *)" - test_demangling "gnu: bar__3fooPCv" \ - "foo::bar\[(\]+(const void|void const) *\[*\]+\[)\]+" - test_demangling_exact "gnu: bar__C3fooPv" "foo::bar(void *) const" - test_demangling "gnu: bar__C3fooPCv" \ - "foo::bar\[(\]+(const void|void const) *\[*\]+\[)\]+ const" - test_demangling_exact "gnu: __eq__3fooRT0" "foo::operator==(foo &)" - test_demangling "gnu: __eq__3fooRC3foo" \ - "foo::operator==\[(\]+(const foo|foo const) &\[)\]+" - test_demangling_exact "gnu: __eq__C3fooR3foo" "foo::operator==(foo &) const" - test_demangling "gnu: __eq__C3fooRT0" \ - "foo::operator==\[(\]+(const foo|foo const) &\[)\]+ const" - - test_demangling_exact "gnu: elem__t6vector1Zdi" "vector::elem(int)" - test_demangling_exact "gnu: elem__t6vector1Zii" "vector::elem(int)" - test_demangling_exact "gnu: __t6vector1Zdi" "vector::vector(int)" - test_demangling_exact "gnu: __t6vector1Zii" "vector::vector(int)" - test_demangling_exact "gnu: _\$_t6vector1Zdi" "vector::~vector(int)" - test_demangling_exact "gnu: _\$_t6vector1Zii" "vector::~vector(int)" - - test_demangling_exact "gnu: __nw__t2T11ZcUi" "T1::operator new(unsigned int)" - test_demangling_exact "gnu: __nw__t2T11Z1tUi" "T1::operator new(unsigned int)" - test_demangling_exact "gnu: __dl__t2T11ZcPv" "T1::operator delete(void *)" - test_demangling_exact "gnu: __dl__t2T11Z1tPv" "T1::operator delete(void *)" - test_demangling_exact "gnu: __t2T11Zci" "T1::T1(int)" - test_demangling_exact "gnu: __t2T11Zc" "T1::T1(void)" - test_demangling_exact "gnu: __t2T11Z1ti" "T1::T1(int)" - test_demangling_exact "gnu: __t2T11Z1t" "T1::T1(void)" - - test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3Pix" \ - "List::Pix::Pix(void)" - - test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3PixPQ2t4List1Z10VHDLEntity7element" \ - "List::Pix::Pix(List::element *)" - - test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3PixRCQ2t4List1Z10VHDLEntity3Pix" \ - "List::Pix::Pix(List::Pix const &)" - - test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity7elementRC10VHDLEntityPT0" \ - "List::element::element(VHDLEntity const &, List::element *)" - - test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity7elementRCQ2t4List1Z10VHDLEntity7element" \ - "List::element::element(List::element const &)" - - test_demangling_exact "gnu: __cl__C11VHDLLibraryGt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ - "VHDLLibrary::operator()(PixX >) const" - - test_demangling_exact "gnu: __cl__Ct4List1Z10VHDLEntityRCQ2t4List1Z10VHDLEntity3Pix" \ - "List::operator()(List::Pix const &) const" - - test_demangling_exact "gnu: __ne__FPvRCQ2t4List1Z10VHDLEntity3Pix" \ - "operator!=(void *, List::Pix const &)" - - test_demangling_exact "gnu: __ne__FPvRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ - "operator!=(void *, PixX > const &)" - - test_demangling_exact "gnu: __t4List1Z10VHDLEntityRCt4List1Z10VHDLEntity" \ - "List::List(List const &)" - - test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ - "PixX >::PixX(void)" - - test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityP14VHDLLibraryRepGQ2t4List1Z10VHDLEntity3Pix" \ - "PixX >::PixX(VHDLLibraryRep *, List::Pix)" - - test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ - "PixX >::PixX(PixX > const &)" - - test_demangling_exact "gnu: nextE__C11VHDLLibraryRt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ - "VHDLLibrary::nextE(PixX > &) const" - - test_demangling_exact "gnu: next__Ct4List1Z10VHDLEntityRQ2t4List1Z10VHDLEntity3Pix" \ - "List::next(List::Pix &) const" - - test_demangling_exact "gnu: _GLOBAL_\$D\$set" "global destructors keyed to set" - - test_demangling_exact "gnu: _GLOBAL_\$I\$set" "global constructors keyed to set" - - test_demangling_exact "gnu: __as__t5ListS1ZUiRCt5ListS1ZUi" \ - "ListS::operator=(ListS const &)" - - test_demangling_exact "gnu: __cl__Ct5ListS1ZUiRCQ2t5ListS1ZUi3Vix" \ - "ListS::operator()(ListS::Vix const &) const" - - test_demangling_exact "gnu: __cl__Ct5SetLS1ZUiRCQ2t5SetLS1ZUi3Vix" \ - "SetLS::operator()(SetLS::Vix const &) const" - - test_demangling_exact "gnu: __t10ListS_link1ZUiRCUiPT0" \ - "ListS_link::ListS_link(unsigned int const &, ListS_link *)" - - test_demangling_exact "gnu: __t10ListS_link1ZUiRCt10ListS_link1ZUi" \ - "ListS_link::ListS_link(ListS_link const &)" - - test_demangling_exact "gnu: __t5ListS1ZUiRCt5ListS1ZUi" \ - "ListS::ListS(ListS const &)" - - test_demangling_exact "gnu: next__Ct5ListS1ZUiRQ2t5ListS1ZUi3Vix" \ - "ListS::next(ListS::Vix &) const" - - test_demangling_exact "gnu: __ne__FPvRCQ2t5SetLS1ZUi3Vix" \ - "operator!=(void *, SetLS::Vix const &)" - test_demangling_exact "gnu: __t8ListElem1Z5LabelRt4List1Z5Label" \ - "ListElem = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, d = 7, dd = 8\}\r\n$gdb_prompt $" { - pass "print value of d_instance" - } - -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, d = 7, dd = 8\}\r\n$gdb_prompt $" { - pass "print value of d_instance" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance" } - timeout { fail "(timeout) print value of d_instance" } - } - - if {$gcc_compiled} then { - send_gdb "ptype d_instance\n" - gdb_expect { - -re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t ]+D & operator=\\(D const ?&\\);\[\r\n\t ]+D\\((D const|const D) ?&\\);\[\r\n\t \]+D\\((void|)\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } - -re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t ]+D & operator=\\(D const ?&\\);\[\r\n\t ]+D\\((D const|const D) ?&\\);\[\r\n\t \]+D\\((void|)\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } - -re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t \]+D\\(void\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } - -re ".*$gdb_prompt $" { fail "ptype d_instance" } - timeout { fail "(timeout) ptype d_instance" } - } - } else { - send_gdb "ptype d_instance\n" - gdb_expect { - -re "type = class D : private A, public B, protected C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t \]+D\\(void\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } - -re ".*$gdb_prompt $" { fail "ptype d_instance" } - timeout { fail "(timeout) ptype d_instance" } - } - } - - -send_gdb "print e_instance\n" -gdb_expect { - -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, e = 9, ee = 10\}\r\n$gdb_prompt $" { - pass "print value of e_instance" - } - -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, e = 9, ee = 10\}\r\n$gdb_prompt $" { - pass "print value of e_instance" - } - -re ".*$gdb_prompt $" { fail "print value of e_instance" } - timeout { fail "(timeout) print value of e_instance" } - } - - if {$gcc_compiled} { - send_gdb "ptype e_instance\n" - gdb_expect { - -re "type = class E : public A, private B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t ]+E & operator=\\(E const ?&\\);\[\r\n\t ]+E\\((E const|const E) ?&\\);\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" } - -re "type = class E : public A, private B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" } - -re ".*$gdb_prompt $" { fail "ptype e_instance" } - timeout { fail "(timeout) ptype e_instance" } - } - } else { - send_gdb "ptype e_instance\n" - gdb_expect { - -re "type = class E : public A, private B, protected C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" } - -re ".*$gdb_prompt $" { fail "ptype e_instance" } - timeout { fail "(timeout) ptype e_instance" } - } - } - - -send_gdb "print f_instance\n" -gdb_expect { - -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, f = 11, ff = 12\}\r\n$gdb_prompt $" { - pass "print value of f_instance" - } - -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, f = 11, ff = 12\}\r\n$gdb_prompt $" { - pass "print value of f_instance" - } - -re ".*$gdb_prompt $" { fail "print value of f_instance" } - timeout { fail "(timeout) print value of f_instance" } - } - -send_gdb "ptype f_instance\n" -gdb_expect { - -re "type = class F : private A, public B, private C \{\r\n\[\t \]*public:\r\n\[\t \]*int f;\r\n\[\t \]*int ff;\[\r\n\t ]+F & operator=\\(F const ?&\\);\[\r\n\t ]+F\\((F const|const F) ?&\\);\[\r\n\t \]+F\\((void|)\\);\r\n\[\t \]*int ffoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype f_instance" } - -re "type = class F : private A, public B, private C \{\r\n\[\t \]*public:\r\n\[\t \]*int f;\r\n\[\t \]*int ff;\[\r\n\t \]+F\\((void|)\\);\r\n\[\t \]*int ffoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype f_instance" } - -re ".*$gdb_prompt $" { fail "ptype f_instance" } - timeout { fail "(timeout) ptype f_instance" } -} - - - -send_gdb "print d_instance.a\n" -gdb_expect { - -re ".\[0-9\]* = 1.*$gdb_prompt $" { - pass "print value of d_instance.a" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.a" } - timeout { fail "(timeout) print value of d_instance.a" } - } - -send_gdb "print d_instance.aa\n" -gdb_expect { - -re ".\[0-9\]* = 2.*$gdb_prompt $" { - pass "print value of d_instance.aa" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.aa" } - timeout { fail "(timeout) print value of d_instance.aa" } - } - -send_gdb "print d_instance.b\n" -gdb_expect { - -re ".\[0-9\]* = 3.*$gdb_prompt $" { - pass "print value of d_instance.b" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.b" } - timeout { fail "(timeout) print value of d_instance.b" } - } - -send_gdb "print d_instance.bb\n" -gdb_expect { - -re ".\[0-9\]* = 4.*$gdb_prompt $" { - pass "print value of d_instance.bb" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.bb" } - timeout { fail "(timeout) print value of d_instance.bb" } - } - -send_gdb "print d_instance.c\n" -gdb_expect { - -re ".\[0-9\]* = 5.*$gdb_prompt $" { - pass "print value of d_instance.c" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.c" } - timeout { fail "(timeout) print value of d_instance.c" } - } - -send_gdb "print d_instance.cc\n" -gdb_expect { - -re ".\[0-9\]* = 6.*$gdb_prompt $" { - pass "print value of d_instance.cc" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.cc" } - timeout { fail "(timeout) print value of d_instance.cc" } - } - -send_gdb "print d_instance.d\n" -gdb_expect { - -re ".\[0-9\]* = 7.*$gdb_prompt $" { - pass "print value of d_instance.d" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.d" } - timeout { fail "(timeout) print value of d_instance.d" } - } - -send_gdb "print d_instance.dd\n" -gdb_expect { - -re ".\[0-9\]* = 8.*$gdb_prompt $" { - pass "print value of d_instance.dd" - } - -re ".*$gdb_prompt $" { fail "print value of d_instance.dd" } - timeout { fail "(timeout) print value of d_instance.dd" } - } - -send_gdb "print g_instance.a\n" -gdb_expect { - -re "warning.*$gdb_prompt $" { - # The compiler doesn't think this is ambiguous. - fail "print value of g_instance.a" - } - -re ".\[0-9\]* = 15.*$gdb_prompt $" { - pass "print value of g_instance.a" - } - -re ".*$gdb_prompt $" { fail "print value of g_instance.a" } - timeout { fail "(timeout) print value of g_instance.a" } - } - -send_gdb "print g_instance.b\n" -gdb_expect { - -re "warning.*$gdb_prompt $" { - # The compiler doesn't think this is ambiguous. - fail "print value of g_instance.b" - } - -re ".\[0-9\]* = 16.*$gdb_prompt $" { - pass "print value of g_instance.b" - } - -re ".*$gdb_prompt $" { fail "print value of g_instance.b" } - timeout { fail "(timeout) print value of g_instance.b" } - } - -send_gdb "print g_instance.c\n" -gdb_expect { - -re "warning.*$gdb_prompt $" { - # The compiler doesn't think this is ambiguous. - fail "print value of g_instance.c" - } - -re ".\[0-9\]* = 17.*$gdb_prompt $" { - pass "print value of g_instance.c" - } - -re ".*$gdb_prompt $" { fail "print value of g_instance.c" } - timeout { fail "(timeout) print value of g_instance.c" } - } - -send_gdb "print g_instance.afoo()\n" -gdb_expect { - -re ".\[0-9\]* = 1.*$gdb_prompt $" { - pass "print value of g_instance.afoo()" - } - -re ".*$gdb_prompt $" { fail "print value of g_instance.afoo()" } - timeout { fail "(timeout) print value of g_instance.afoo()" } - } - - -# If GDB fails to restore the selected frame properly after the -# inferior function call above (see GDB PR 1155 for an explanation of -# why this might happen), all the subsequent tests will fail. We -# should detect report that failure, but let the marker call finish so -# that the rest of the tests can run undisturbed. -gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" { - -re "#0 marker1.*$gdb_prompt $" { - setup_kfail "gdb/1155" s390-*-linux-gnu - fail "re-selected 'main' frame after inferior call" - gdb_test "finish" ".*main.*at .*derivation.cc:.*// marker1-returns-here.*" \ - "finish call to marker1" - } - -re "#1 ($hex in )?main.*$gdb_prompt $" { - pass "re-selected 'main' frame after inferior call" - } -} - -send_gdb "print g_instance.bfoo()\n" -gdb_expect { - -re ".\[0-9\]* = 2.*$gdb_prompt $" { - pass "print value of g_instance.bfoo()" - } - -re ".*$gdb_prompt $" { fail "print value of g_instance.bfoo()" } - timeout { fail "(timeout) print value of g_instance.bfoo()" } - } - -send_gdb "print g_instance.cfoo()\n" -gdb_expect { - -re ".\[0-9\]* = 3.*$gdb_prompt $" { - pass "print value of g_instance.cfoo()" - } - -re ".*$gdb_prompt $" { fail "print value of g_instance.cfoo()" } - timeout { fail "(timeout) print value of g_instance.cfoo()" } - } diff --git a/gdb/testsuite/gdb.c++/hang.H b/gdb/testsuite/gdb.c++/hang.H deleted file mode 100644 index 26fec87..0000000 --- a/gdb/testsuite/gdb.c++/hang.H +++ /dev/null @@ -1,12 +0,0 @@ -struct A -{ - struct B *b_ptr_in_a; -}; - -struct C -{ - struct B - { - int member_of_B_in_C; - }; -}; diff --git a/gdb/testsuite/gdb.c++/hang.exp b/gdb/testsuite/gdb.c++/hang.exp deleted file mode 100644 index 4c117a1..0000000 --- a/gdb/testsuite/gdb.c++/hang.exp +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -if $tracelevel then { - strace $tracelevel -} - -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile hang -set binfile ${objdir}/${subdir}/${testfile} - -foreach file {hang1 hang2 hang3} { - if {[gdb_compile "${srcdir}/${subdir}/${file}.C" "${file}.o" object {c++ debug}] != ""} { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." - } -} - -if {[gdb_compile "hang1.o hang2.o hang3.o" ${binfile} executable {c++ debug}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -# As of May 1, 2002, GDB hangs trying to read the debug info for the -# `hang2.o' compilation unit from the executable `hang', when compiled -# by g++ 2.96 with STABS debugging info. Here's what's going on, as -# best as I can tell. -# -# The definition of `struct A' in `hang.H' refers to `struct B' as an -# incomplete type. The stabs declare type number (1,3) to be a cross- -# reference type, `xsB:'. -# -# The definition of `struct C' contains a nested definition for -# `struct B' --- or more properly, `struct C::B'. However, the stabs -# fail to qualify the structure tag: it just looks like a definition -# for `struct B'. I think this is a compiler bug, but perhaps GCC -# doesn't emit qualified names for a reason. -# -# `hang.H' gets #included by both `hang1.C' and `hang2.C'. So the -# stabs for `struct A', the incomplete `struct B', and `struct C' -# appear in both hang1.o's and hang2.o's stabs. -# -# When those two files are linked together, since hang2.o appears -# later in the command line, its #inclusion of `hang.H' gets replaced -# with an N_EXCL stab, referring back to hang1.o's stabs for the -# header file. -# -# When GDB builds psymtabs for the executable hang, it notes that -# hang2.o's stabs contain an N_EXCL referring to a header that appears -# in full in hang1.o's stabs. So hang2.o's psymtab lists a dependency -# on hang1.o's psymtab. -# -# When the user types the command `print var_in_b', GDB scans the -# psymtabs for a symbol by that name, and decides to read full symbols -# for `hang2.o'. -# -# Since `hang2.o''s psymtab lists `hang1.o' as a dependency, GDB first -# reads `hang1.o''s symbols. When GDB sees `(1,3)=xsB:', it creates a -# type object for `struct B', sets its TYPE_FLAG_STUB flag, and -# records it as type number `(1,3)'. -# -# When GDB finds the definition of `struct C::B', since the stabs -# don't indicate that the type is nested within C, it treats it as -# a definition of `struct B'. -# -# When GDB is finished reading `hang1.o''s symbols, it calls -# `cleanup_undefined_types'. This function mistakes the definition of -# `struct C::B' for a definition for `struct B', and overwrites the -# incomplete type object for the real `struct B', using `memcpy'. Now -# stabs type number `(1,3)' refers to this (incorrect) complete type. -# Furthermore, the `memcpy' simply copies the original's `cv_type' -# field to the target, giving the target a corrupt `cv_type' ring: the -# chain does not point back to the target type. -# -# Having satisfied `hang2.o''s psymtab's dependencies, GDB begins to -# read `hang2.o''s symbols. These contain the true definition for -# `struct B', which refers to type number `(1,3)' as the type it's -# defining. GDB looks up type `(1,3)', and finds the (incorrect) -# complete type established by the call to `cleanup_undefined_types' -# above. However, it doesn't notice that the type is already defined, -# and passes it to `read_struct_type', which then writes the new -# definition's size, field list, etc. into the type object which -# already has those fields initialized. Adding insult to injury, -# `read_struct_type' then calls `finish_cv_type'; since the `memcpy' -# in `cleanup_undefined_types' corrupted the target type's `cv_type' -# ring, `finish_cv_type' enters an infinite loop. - -# This checks that GDB recognizes when a structure is about to be -# overwritten, and refuses, with a complaint. -gdb_test "print var_in_b" " = 1729" "doesn't overwrite struct type" - -# This checks that cleanup_undefined_types doesn't create corrupt -# cv_type chains. Note that var_in_hang3 does need to be declared in -# a separate compilation unit, whose psymtab depends on hang1.o's -# psymtab. Otherwise, GDB won't call cleanup_undefined_types (as it -# finishes hang1.o's symbols) before it calls make_cv_type (while -# reading hang3.o's symbols). -# -# The bug only happens when you compile with -gstabs+; Otherwise, GCC -# won't include the `const' qualifier on `const_B_ptr' in `hang3.o''s -# STABS, so GDB won't try to create a const variant of the smashed -# struct type, and get caught by the corrupted cv_type chain. -gdb_test "print var_in_hang3" " = 42" "doesn't corrupt cv_type chain" diff --git a/gdb/testsuite/gdb.c++/hang1.C b/gdb/testsuite/gdb.c++/hang1.C deleted file mode 100644 index 4b04d77..0000000 --- a/gdb/testsuite/gdb.c++/hang1.C +++ /dev/null @@ -1,3 +0,0 @@ -#include "hang.H" - -int main (int argc, char **argv) { return 0; } diff --git a/gdb/testsuite/gdb.c++/hang2.C b/gdb/testsuite/gdb.c++/hang2.C deleted file mode 100644 index 59732f8..0000000 --- a/gdb/testsuite/gdb.c++/hang2.C +++ /dev/null @@ -1,8 +0,0 @@ -#include "hang.H" - -struct B -{ - int member_of_B; -}; - -int var_in_b = 1729; diff --git a/gdb/testsuite/gdb.c++/hang3.C b/gdb/testsuite/gdb.c++/hang3.C deleted file mode 100644 index 92c82fa..0000000 --- a/gdb/testsuite/gdb.c++/hang3.C +++ /dev/null @@ -1,4 +0,0 @@ -#include "hang.H" - -const struct B *const_B_ptr; -int var_in_hang3 = 42; diff --git a/gdb/testsuite/gdb.c++/inherit.exp b/gdb/testsuite/gdb.c++/inherit.exp deleted file mode 100644 index 993bfb1..0000000 --- a/gdb/testsuite/gdb.c++/inherit.exp +++ /dev/null @@ -1,1018 +0,0 @@ -# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) - -set ws "\[\r\n\t \]+" -set nl "\[\r\n\]+" - -# The format of a g++ virtual base pointer. -set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?" - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -# Note - create separate "inherit" executable from misc.cc - -set testfile "inherit" -set srcfile misc.cc -set binfile ${objdir}/${subdir}/${testfile} - - -# Create and source the file that provides information about the compiler -# used to compile the test case. - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# -# Single inheritance, print individual members. -# - -proc test_print_si_members {} { - # Print all members of g_A using fully qualified form. - - gdb_test "print g_A.A::a" ".* = 1" "print g_A.A::a" - - gdb_test "print g_A.A::x" ".* = 2" "print g_A.A::x" - - # Print members of g_A using nonambiguous compact form. - - gdb_test "print g_A.a" ".* = 1" "print g_A.a" - - gdb_test "print g_A.x" ".* = 2" "print g_A.x" - - # Print all members of g_B using fully qualified form. - - gdb_test "print g_B.A::a" ".* = 3" "print g_B.A::a" - - gdb_test "print g_B.A::x" ".* = 4" "print g_B.A::x" - - gdb_test "print g_B.B::b" ".* = 5" "print g_B.B::b" - - gdb_test "print g_B.B::x" ".* = 6" "print g_B.B::x" - - # Print members of g_B using nonambiguous compact form. - - gdb_test "print g_B.a" ".* = 3" "print g_B.a" - - gdb_test "print g_B.b" ".* = 5" "print g_B.b" - - gdb_test "print g_B.x" ".* = 6" "print g_B.x" - - # Print all members of g_C using fully qualified form. - - gdb_test "print g_C.A::a" ".* = 7" "print g_C.A::a" - - gdb_test "print g_C.A::x" ".* = 8" "print g_C.A::x" - - gdb_test "print g_C.C::c" ".* = 9" "print g_C.C::c" - - gdb_test "print g_C.C::x" ".* = 10" "print g_C.C::x" - - # Print members of g_C using nonambiguous compact form. - - gdb_test "print g_C.a" ".* = 7" "print g_C.a" - - gdb_test "print g_C.c" ".* = 9" "print g_C.c" - - gdb_test "print g_C.x" ".* = 10" "print g_C.x" -} - -# -# Single inheritance, print type definitions. -# - -proc test_ptype_si {} { - global gdb_prompt - global ws - global nl - global hp_aCC_compiler - - # Print class A as a type. - - send_gdb "ptype A\n" - gdb_expect { - -re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" { - pass "ptype A (FIXME)" - } - -re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" { - setup_xfail "*-*-*" - fail "ptype A (FIXME)" - } - -re ".*$gdb_prompt $" { fail "ptype A" } - timeout { fail "ptype A (timeout)" ; return } - } - - # Print class A as an explicit class. - - send_gdb "ptype class A\n" - gdb_expect { - -re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" { - pass "ptype class A (FIXME)" - } - -re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" { - if {!$hp_aCC_compiler} {setup_xfail "*-*-*"} - fail "ptype class A (FIXME)" - } - -re ".*$gdb_prompt $" { fail "ptype class A" } - timeout { fail "ptype class A (timeout)" ; return } - } - - # Print type of an object of type A. - - send_gdb "ptype g_A\n" - gdb_expect { - -re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" { - pass "ptype g_A (FIXME)" - } - -re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" { - if {!$hp_aCC_compiler} {setup_xfail "*-*-*"} - fail "ptype g_A (FIXME)" - } - -re ".*$gdb_prompt $" { fail "ptype g_A" } - timeout { fail "ptype g_A (timeout)" ; return } - } - - # Print class B as a type. - - gdb_test "ptype B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype B" - - # Print class B as an explicit class. - - gdb_test "ptype class B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype class B" - - # Print type of an object of type B. - - gdb_test "ptype g_B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype g_B" - - # Print class C as a type. - - gdb_test "ptype C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype C" - - # Print class C as an explicit class. - - gdb_test "ptype class C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype class C" - - # Print type of an object of type g_C. - - gdb_test "ptype g_C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype g_C" - - # gcc cygnus-2.3.3 (Q1) has this bug, but it was fixed as of - # cygnus-2.3.3-930417. PR 2819. - send_gdb "ptype tagless_struct\n" - gdb_expect { - -re "type = class \{${ws}public:${ws}int one;${ws}int two;${ws}tagless_struct & operator=\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype tagless struct" - } - -re "type = class \{${ws}public:${ws}int one;${ws}int two;;${ws}\}$nl$gdb_prompt $" { - pass "ptype tagless struct" - } - -re "type = (struct|class).*\{.*int one;.*int two;.*\}$nl$gdb_prompt $" { - pass "ptype tagless struct (obsolete gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype tagless struct" - } - timeout { - fail "ptype tagless struct (timeout)" - } - } - - send_gdb "ptype v_tagless\n" - gdb_expect { - -re "type = class \{${ws}public:${ws}int one;${ws}int two;${ws}tagless_struct & operator=\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype variable of type tagless struct" - } - -re "type = class \{${ws}public:${ws}int one;${ws}int two;;${ws}\}$nl$gdb_prompt $" { - pass "ptype tagless struct" - } - -re "type = (struct|class).*\{.*int one;.*int two;.*\}$nl$gdb_prompt $" { - pass "ptype variable of type tagless struct (obsolete gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype variable of type tagless struct" - } - timeout { - fail "ptype variable of type tagless struct (timeout)" - } - } -} - -# -# Single inheritance, print complete classes. -# - -proc test_print_si_classes {} { - # Print all members of g_A. - - gdb_test "print g_A" ".* = \{a = 1, x = 2\}" "print g_A" - - # Print all members of g_B. - - gdb_test "print g_B" ".* = \{\<(class |)A\> = \{a = 3, x = 4\}, b = 5, x = 6\}" "print g_B" - - # Print all members of g_C. - - gdb_test "print g_C" ".* = \{\<(class |)A\> = \{a = 7, x = 8\}, c = 9, x = 10\}" "print g_C" -} - -# -# Single inheritance, print anonymous unions. -# GDB versions prior to 4.14 entered an infinite loop when printing -# the type of a class containing an anonymous union, and they were also -# incapable of printing the member of an anonymous union. -# We test the printing of the member first, and perform the other tests -# only if the test succeeds, to avoid the infinite loop. -# - -proc test_print_anon_union {} { - global gdb_prompt - global ws - global nl - - gdb_test "print g_anon_union.a" ".* = 2" "print anonymous union member" - send_gdb "print g_anon_union\n" - gdb_expect { - -re ".* = \{one = 1, ( = |)\{a = 2, b = 2\}\}$nl$gdb_prompt $" { - pass "print variable of type anonymous union" - } - -re ".* = .*\{one = 1, ( = |)\{a = 2, b = .*\}\}$nl$gdb_prompt $" { - pass "print variable of type anonymous union (obsolete gcc or gdb)" - } - -re ".*$nl$gdb_prompt $" { - fail "print variable of type anonymous union" - } - timeout { - fail "print variableof type anonymous union (timeout)" - } - } - send_gdb "ptype g_anon_union\n" - gdb_expect { - -re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}public:${ws}int a;${ws}long int b;${ws}union \{\.\.\.\} & operator=\\(union \{\.\.\.\} &\\);${ws}\\\$_0 \\(union \{\.\.\.\} &\\);${ws}\\\$_0 \\(\\);${ws}\};${ws}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\\);${ws}\}$nl$gdb_prompt $" { - pass "print type of anonymous union" - } - -re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}int a;${ws}long int b;${ws}\};${ws}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|)\\);${ws}\}$nl$gdb_prompt $" { - pass "print type of anonymous union" - } - -re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}int a;${ws}long int b;${ws}\};${ws}\}$nl$gdb_prompt $" { - pass "print type of anonymous union" - } - -re "type = (struct|class).*\{.*int one;.*union \{.*int a;.*(long|long int|int) b;.*\};.*\}$nl$gdb_prompt $" { - pass "print type of anonymous union (obsolete gcc or gdb)" - } - -re ".*$nl$gdb_prompt $" { - fail "print type of anonymous union" - } - timeout { - fail "print type of anonymous union (timeout)" - } - } -} - -# -# Multiple inheritance, print individual members. -# - -proc test_print_mi_members {} { - global gdb_prompt - global nl - global hp_aCC_compiler - - # Print all members of g_A. - - gdb_test "print g_A.A::a" ".* = 1" "print g_A.A::a" - - gdb_test "print g_A.A::x" ".* = 2" "print g_A.A::x" - - # Print all members of g_B. - - gdb_test "print g_B.A::a" ".* = 3" "print g_B.A::a" - - gdb_test "print g_B.A::x" ".* = 4" "print g_B.A::x" - - gdb_test "print g_B.B::b" ".* = 5" "print g_B.B::b" - - gdb_test "print g_B.B::x" ".* = 6" "print g_B.B::x" - - # Print all members of g_C. - - gdb_test "print g_C.A::a" ".* = 7" "print g_C.A::a" - - gdb_test "print g_C.A::x" ".* = 8" "print g_C.A::x" - - gdb_test "print g_C.C::c" ".* = 9" "print g_C.C::c" - - gdb_test "print g_C.C::x" ".* = 10" "print g_C.C::x" - - # Print all members of g_D. - - # The following is ambiguous, and gdb should detect this. - # For now, accept gdb's behavior as an expected failure if it - # simply prints either member correctly. - - send_gdb "print g_D.A::a\n" - gdb_expect { - -re "warning: A ambiguous; using D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 15$nl$gdb_prompt $" { - pass "print g_D.A::a" - } - -re "warning: A ambiguous; using D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 11$nl$gdb_prompt $" { - pass "print g_D.A::a (using B)" - } - -re ".* = 15$nl$gdb_prompt $" { - kfail "gdb/68" "print g_D.A::a" - } - -re ".* = 11$nl$gdb_prompt $" { - kfail "gdb/68" "print g_D.A::a" - } - -re ".*$gdb_prompt $" { fail "print g_D.A::a" } - timeout { fail "print g_D.A::a (timeout)" ; return } - } - - # The following is ambiguous, and gdb should detect this. - # For now, accept gdb's behavior as an expected failure if it - # simply prints either member correctly. - - send_gdb "print g_D.A::x\n" - gdb_expect { - -re "warning: A ambiguous; using D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 16$nl$gdb_prompt $" { - pass "print g_D.A::x" - } - -re "warning: A ambiguous; using D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 12$nl$gdb_prompt $" { - pass "print g_D.A::x (using B)" - } - -re ".* = 16$nl$gdb_prompt $" { - kfail "gdb/68" "print g_D.A::x" - } - -re ".* = 12$nl$gdb_prompt $" { - kfail "gdb/68" "print g_D.A::x" - } - -re ".*$gdb_prompt $" { fail "print g_D.A::x" } - timeout { fail "print g_D.A::x (timeout)" ; return } - } - - gdb_test "print g_D.B::b" ".* = 13" "print g_D.B::b" - - gdb_test "print g_D.B::x" ".* = 14" "print g_D.B::x" - - gdb_test "print g_D.C::c" ".* = 17" "print g_D.C::c" - - gdb_test "print g_D.C::x" ".* = 18" "print g_D.C::x" - - gdb_test "print g_D.D::d" ".* = 19" "print g_D.D::d" - - gdb_test "print g_D.D::x" ".* = 20" "print g_D.D::x" - - # Print all members of g_E. - - # The following is ambiguous, and gdb should detect this. - # For now, accept gdb's behavior as an expected failure if it - # simply prints either member correctly. - - send_gdb "print g_E.A::a\n" - gdb_expect { - -re ".* = 21$nl$gdb_prompt $" { - kfail "gdb/68" "print g_E.A::a" - } - -re ".* = 25$nl$gdb_prompt $" { - kfail "gdb/68" "print g_E.A::a" - } - -re ".*$gdb_prompt $" { fail "print g_E.A::a" } - timeout { fail "print g_E.A::a (timeout)" ; return } - } - - # The following is ambiguous, and gdb should detect this. - # For now, accept gdb's behavior as an expected failure if it - # simply prints either member correctly. - - send_gdb "print g_E.A::x\n" - gdb_expect { - -re "warning: A ambiguous; using E::D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 26$nl$gdb_prompt $" { - pass "print g_E.A::x" - } - -re "warning: A ambiguous; using E::D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 22$nl$gdb_prompt $" { - pass "print g_E.A::x (using B)" - } - -re ".* = 26$nl$gdb_prompt $" { - kfail "gdb/68" "print g_E.A::x" - } - -re ".* = 22$nl$gdb_prompt $" { - kfail "gdb/68" "print g_E.A::x" - } - -re ".*$gdb_prompt $" { fail "print g_E.A::x" } - timeout { fail "print g_E.A::x (timeout)" ; return } - } - - gdb_test "print g_E.B::b" ".* = 23" "print g_E.B::b" - - gdb_test "print g_E.B::x" ".* = 24" "print g_E.B::x" - - gdb_test "print g_E.C::c" ".* = 27" "print g_E.C::c" - - gdb_test "print g_E.C::x" ".* = 28" "print g_E.C::x" - - gdb_test "print g_E.D::d" ".* = 29" "print g_E.D::d" - - gdb_test "print g_E.D::x" ".* = 30" "print g_E.D::x" - - gdb_test "print g_E.E::e" ".* = 31" "print g_E.E::e" - - gdb_test "print g_E.E::x" ".* = 32" "print g_E.E::x" -} - -# -# Multiple inheritance, print type definitions. -# - -proc test_ptype_mi {} { - global nl - - gdb_test "ptype D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype D" - - gdb_test "ptype class D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype class D" - - gdb_test "ptype g_D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype g_D" - - gdb_test "ptype E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype E" - - gdb_test "ptype class E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype class E" - - gdb_test "ptype g_E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype g_E" -} - -# -# Multiple inheritance, print complete classes. -# - -proc test_print_mi_classes {} { - # Print all members of g_D. - - gdb_test "print g_D" ".* = \{\<(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\}" "print g_D" - - # Print all members of g_E. - - gdb_test "print g_E" ".* = \{\<(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\}" "print g_E" -} - -# -# Single virtual inheritance, print individual members. -# - -proc test_print_svi_members {} { - global gdb_prompt - global decimal - global nl - - # Print all members of g_vA. - - gdb_test "print g_vA.vA::va" ".* = 1" "print g_vA.vA::va" - - gdb_test "print g_vA.vA::vx" ".* = 2" "print g_vA.vA::vx" - - # Print members of g_vA using compact form. - - gdb_test "print g_vA.va" ".* = 1" "print g_vA.va" - - gdb_test "print g_vA.vx" ".* = 2" "print g_vA.vx" - - # Print all members of g_vB. - - send_gdb "print g_vB.vA::va\n" - gdb_expect { - -re ".* = 3$nl$gdb_prompt $" { pass "print g_vB.vA::va" } - -re ".*virtual baseclass botch.*$gdb_prompt $" { - # Does not happen with gcc cygnus-2.4.5-930828 - fail "print g_vB.vA::va (known bug with gcc cygnus-2.4.5-930417)" - # Many of the rest of these tests have the same problem. - return 0 - } - -re ".*$gdb_prompt $" { fail "print g_vB.vA::va" } - timeout { fail "print g_vB.vA::va (timeout)" ; return } - } - - gdb_test "print g_vB.vA::vx" ".* = 4" "print g_vB.vA::vx" - - gdb_test "print g_vB.vB::vb" ".* = 5" "print g_vB.vB::vb" - - gdb_test "print g_vB.vB::vx" ".* = 6" "print g_vB.vB::vx" - - # Print members of g_vB using compact form. - - gdb_test "print g_vB.va" ".* = 3" "print g_vB.va" - - gdb_test "print g_vB.vb" ".* = 5" "print g_vB.vb" - - gdb_test "print g_vB.vx" ".* = 6" "print g_vB.vx" - - # Print all members of g_vC. - - gdb_test "print g_vC.vA::va" ".* = 7" "print g_vC.vA::va" - - gdb_test "print g_vC.vA::vx" ".* = 8" "print g_vC.vA::vx" - - gdb_test "print g_vC.vC::vc" ".* = 9" "print g_vC.vC::vc" - - gdb_test "print g_vC.vC::vx" ".* = 10" "print g_vC.vC::vx" - - # Print members of g_vC using compact form. - - gdb_test "print g_vC.va" ".* = 7" "print g_vC.va" - - gdb_test "print g_vC.vc" ".* = 9" "print g_vC.vc" - - gdb_test "print g_vC.vx" ".* = 10" "print g_vC.vx" -} - -# -# Single virtual inheritance, print type definitions. -# - -proc test_ptype_vi {} { - global gdb_prompt - global ws - global nl - global vbptr - - # This class does not use any C++-specific features, so it's fine for - # it to print as "struct". - send_gdb "ptype vA\n" - gdb_expect { - -re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype vA" - } - -re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" { - pass "ptype vA" - } - -re ".*$gdb_prompt $" { fail "ptype vA" } - timeout { fail "ptype vA (timeout)" ; return } - } - - # This class does not use any C++-specific features, so it's fine for - # it to print as "struct". - send_gdb "ptype class vA\n" - gdb_expect { - -re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class vA" - } - -re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" { - pass "ptype class vA" - } - -re ".*$gdb_prompt $" { fail "ptype class vA" } - timeout { fail "ptype class vA (timeout)" ; return } - } - - # This class does not use any C++-specific features, so it's fine for - # it to print as "struct". - send_gdb "ptype g_vA\n" - gdb_expect { - -re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype g_vA" - } - -re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" { - pass "ptype g_vA" - } - -re ".*$gdb_prompt $" { fail "ptype g_vA" } - timeout { fail "ptype g_vA (timeout)" ; return } - } - - send_gdb "ptype vB\n" - gdb_expect { - -re "ptype vB${nl}type = class vB : public virtual vA \{$nl private:${ws}vA \\*${vbptr}vA;$nl public:${ws}int vb;${ws}int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype vB" - } - -re "ptype vB${nl}type = class vB : public virtual vA \{$nl public:${ws}int vb;${ws}int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype vB (aCC)" - } - -re ".*$gdb_prompt $" { fail "ptype vB" } - timeout { fail "ptype vB (timeout)" } - } - - send_gdb "ptype class vB\n" - gdb_expect { - -re "type = class vB : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class vB" - } - -re "type = class vB : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class vB (aCC)" - } - -re ".*$gdb_prompt $" { fail "ptype class vB" } - timeout { fail "ptype class vB (timeout)" } - } - - send_gdb "ptype g_vB\n" - gdb_expect { - -re "type = class vB : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype g_vB" - } - -re "type = class vB : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype g_vB (aCC)" - } - -re ".*$gdb_prompt $" { fail "ptype g_vB" } - timeout { fail "ptype g_vB (timeout)" } - } - - send_gdb "ptype vC\n" - gdb_expect { - -re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype vC" - } - -re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype vC (aCC)" - } - -re ".*$gdb_prompt $" { fail "ptype vC" } - timeout { fail "ptype vC (timeout)" } - } - - send_gdb "ptype class vC\n" - gdb_expect { - -re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class vC" - } - -re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype class vC (aCC)" - } - -re ".*$gdb_prompt $" { fail "ptype class vC" } - timeout { fail "ptype class vC (timeout)" } - } - - send_gdb "ptype g_vC\n" - gdb_expect { - -re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype g_vC" - } - -re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { - pass "ptype g_vC (aCC)" - } - -re ".*$gdb_prompt $" { fail "ptype g_vC" } - timeout { fail "ptype g_vC (timeout)" } - } -} - -# -# Single virtual inheritance, print complete classes. -# - -proc test_print_svi_classes {} { - global gdb_prompt - global hex - global decimal - global nl - global vbptr - - # Print all members of g_vA. - - gdb_test "print g_vA" ".* = \{va = 1, vx = 2\}" "print g_vA" - - # Print all members of g_vB. - - send_gdb "print g_vB\n" - gdb_expect { - -re ".* = \{\ = \{va = 3, vx = 4\}, vb = 5, vx = 6, Virtual table at $hex\}$nl$gdb_prompt $" { - pass "print g_vB (aCC)" - } - -re ".* = \{\ = \{va = 3, vx = 4\}, vb = 5, vx = 6, __vfp = $hex\}$nl$gdb_prompt $" { - pass "print g_vB (aCC)" - } - -re ".* = \{\ = \{va = 3, vx = 4\}, ${vbptr}vA = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" { - pass "print g_vB" - } - -re ".* = \{\ = \{va = 3, vx = 4\}, _vptr.vB = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" { - pass "print g_vB (FIXME v3 vtbl ptr)" - } - -re ".* = \{\ = \{va = 3, vx = 4\}, _vptr.vB = $hex , vb = 5, vx = 6\}$nl$gdb_prompt $" { - # Happens with gcc 3.3 -gstabs+ - # Does not happen with gcc 3.2.3 -gstabs+. - # Does not happen gcc HEAD%20030624 (pre-3.4) -gstabs+. - # -- chastain 2003-06-29 - pass "print g_vB" - } - - -re ".*invalid address 0x0.*$gdb_prompt $" { - # Does not happen with gcc cygnus-2.4.5-930828 - fail "print g_vB (known bug with gcc cygnus-2.4.5-930417)" - # Many of the rest of these tests have the same problem. - return 0 - } - -re ".*$gdb_prompt $" { fail "print g_vB" } - timeout { fail "print g_vB (timeout)" ; return } - } - - # Print all members of g_vC. - - send_gdb "print g_vC\n" - gdb_expect { - -re ".* = \{\ = \{va = 7, vx = 8\}, vc = 9, vx = 10, Virtual table at $hex\}$nl$gdb_prompt $" { - pass "print g_vC (aCC)" - } - -re ".* = \{\ = \{va = 7, vx = 8\}, vc = 9, vx = 10, __vfp = $hex\}$nl$gdb_prompt $" { - pass "print g_vC (aCC)" - } - -re ".* = \{\ = \{va = 7, vx = 8\}, ${vbptr}vA = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" { - pass "print g_vC" - } - -re ".* = \{\ = \{va = 7, vx = 8\}, _vptr.vC = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" { - pass "print g_vC (FIXME v3 vtbl ptr)" - } - -re ".* = \{\ = \{va = 7, vx = 8\}, _vptr.vC = $hex , vc = 9, vx = 10\}$nl$gdb_prompt $" { - # Happens with gcc 3.3 -gstabs+ - # Does not happen with gcc 3.2.3 -gstabs+. - # Does not happen gcc HEAD%20030624 (pre-3.4) -gstabs+. - # -- chastain 2003-06-29 - pass "print g_vC" - } - -re ".*$gdb_prompt $" { fail "print g_vC" } - timeout { fail "print g_vC (timeout)" } - } -} - -# -# Multiple virtual inheritance, print individual members. -# - -proc test_print_mvi_members {} { - global gdb_prompt - global decimal - global nl - - # Print all members of g_vD. - - send_gdb "print g_vD.vA::va\n" - gdb_expect { - -re ".* = 19$nl$gdb_prompt $" { pass "print g_vD.vA::va" } - -re ".*virtual baseclass botch.*$gdb_prompt $" { - # Does not happen with gcc cygnus-2.4.5-930828 - fail "print g_vD.vA::va (known bug with gcc cygnus-2.4.5-930417)" - # Many of the rest of these tests have the same problem. - return 0 - } - -re ".*$gdb_prompt $" { fail "print g_vD.vA::va" } - timeout { fail "print g_vD.vA::va (timeout)" ; return } - } - - gdb_test "print g_vD.vA::vx" ".* = 20" "print g_vD.vA::vx" - - gdb_test "print g_vD.vB::vb" ".* = 21" "print g_vD.vB::vb" - - gdb_test "print g_vD.vB::vx" ".* = 22" "print g_vD.vB::vx" - - gdb_test "print g_vD.vC::vc" ".* = 23" "print g_vD.vC::vc" - - gdb_test "print g_vD.vC::vx" ".* = 24" "print g_vD.vC::vx" - - gdb_test "print g_vD.vD::vd" ".* = 25" "print g_vD.vD::vd" - - gdb_test "print g_vD.vD::vx" ".* = 26" "print g_vD.vD::vx" - - # Print all members of g_vE. - - gdb_test "print g_vE.vA::va" ".* = 0" "print g_vE.vA::va" - - gdb_test "print g_vE.vA::vx" ".* = 0" "print g_vE.vA::vx" - - gdb_test "print g_vE.vB::vb" ".* = 0" "print g_vE.vB::vb" - - gdb_test "print g_vE.vB::vx" ".* = 0" "print g_vE.vB::vx" - - gdb_test "print g_vE.vC::vc" ".* = 0" "print g_vE.vC::vc" - - gdb_test "print g_vE.vC::vx" ".* = 0" "print g_vE.vC::vx" - - gdb_test "print g_vE.vD::vd" ".* = 0" "print g_vE.vD::vd" - - gdb_test "print g_vE.vD::vx" ".* = 0" "print g_vE.vD::vx" - - gdb_test "print g_vE.vE::ve" ".* = 27" "print g_vE.vE::ve" - - gdb_test "print g_vE.vE::vx" ".* = 28" "print g_vE.vE::vx" -} - -# -# Multiple virtual inheritance, print type definitions. -# - -proc test_ptype_mvi {} { - global gdb_prompt - global ws - global nl - global vbptr - - send_gdb "ptype vD\n" - gdb_expect { - -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" { - pass "ptype vD" - } - -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;.*\}.*$gdb_prompt $" { - pass "ptype vD" - } - -re ".*$gdb_prompt $" { fail "ptype vD" } - timeout { fail "(timeout) ptype vD" } - } - - send_gdb "ptype class vD\n" - gdb_expect { - -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" { - pass "ptype class vD" - } - -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;.*\}.*$gdb_prompt $" { - pass "ptype class vD" - } - -re ".*$gdb_prompt $" { fail "ptype class vD" } - timeout { fail "(timeout) ptype class vD" } - } - - send_gdb "ptype g_vD\n" - gdb_expect { - -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" { - pass "ptype g_vD" - } - -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { - pass "ptype g_vD" - } - -re ".*$gdb_prompt $" { fail "ptype g_vD" } - timeout { fail "(timeout) ptype g_vD" } - } - - send_gdb "ptype vE\n" - gdb_expect { - -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" { - pass "ptype vE" - } - -re ".*class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { - pass "ptype vE" - } - -re ".*$gdb_prompt $" { fail "ptype vE" } - timeout { fail "(timeout) ptype vE" } - } - - send_gdb "ptype class vE\n" - gdb_expect { - -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" { - pass "ptype class vE" - } - -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { - pass "ptype class vE" - } - -re ".*$gdb_prompt $" { fail "ptype class vE" } - timeout { fail "(timeout) ptype class vE" } - } - - send_gdb "ptype g_vE\n" - gdb_expect { - -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" { - pass "ptype g_vE" - } - -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { - pass "ptype g_vE" - } - -re ".*$gdb_prompt $" { fail "ptype g_vE" } - timeout { fail "(timeout) ptype g_vE" } - } -} - -# -# Multiple virtual inheritance, print complete classes. -# - -proc test_print_mvi_classes {} { - global gdb_prompt - global hex - global decimal - global nl - global vbptr - - # Print all members of g_vD. - - send_gdb "print g_vD\n" - gdb_expect { - -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, vb = 21, vx = 22, Virtual table at $hex\}, \ = \{vc = 23, vx = 24, Virtual table at $hex\}, vd = 25, vx = 26, Virtual table at $hex\}$nl$gdb_prompt $" { - pass "print g_vD (aCC)" - } - -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, vb = 21, vx = 22, __vfp = $hex\}, \ = \{vc = 23, vx = 24, __vfp = $hex\}, vd = 25, vx = 26, __vfp = $hex\}$nl$gdb_prompt $" { - pass "print g_vD (aCC)" - } - -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, ${vbptr}vA = $hex, vb = 21, vx = 22\}, \ = \{${vbptr}vA = $hex, vc = 23, vx = 24\}, ${vbptr}vC = $hex, ${vbptr}vB = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" { - pass "print g_vD" - } - -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, _vptr.vB = $hex, vb = 21, vx = 22\}, \ = \{_vptr.vC = $hex, vc = 23, vx = 24\}, _vptr.vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" { - pass "print g_vD (FIXME v3 vtbl ptr)" - } - -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, _vptr.vB = $hex, vb = 21, vx = 22\}, \ = \{_vptr.vC = $hex , vc = 23, vx = 24\}, _vptr.vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" { - # Happens with gcc 3.3 -gstabs+ - # Does not happen with gcc 3.2.3 -gstabs+. - # Does not happen gcc HEAD%20030624 (pre-3.4) -gstabs+. - # -- chastain 2003-06-29 - pass "print g_vD" - } - -re ".*invalid address 0x0.*$gdb_prompt $" { - # Does not happen with gcc cygnus-2.4.5-930828 - fail "print g_vD (known bug with gcc cygnus-2.4.5-930417)" - # Many of the rest of these tests have the same problem. - return 0 - } - -re ".*$gdb_prompt $" { fail "print g_vD" } - timeout { fail "print g_vD (timeout)" ; return } - } - - # Print all members of g_vE. - - send_gdb "print g_vE\n" - gdb_expect { - -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, vb = 0, vx = 0, Virtual table at $hex\}, \ = \{vc = 0, vx = 0, Virtual table at $hex\}, vd = 0, vx = 0, Virtual table at $hex\}, ve = 27, vx = 28, Virtual table at $hex\}$nl$gdb_prompt $" { - pass "print g_vE (aCC)" - } - -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, vb = 0, vx = 0, __vfp = $hex\}, \ = \{vc = 0, vx = 0, __vfp = $hex\}, vd = 0, vx = 0, __vfp = $hex\}, ve = 27, vx = 28, __vfp = $hex\}$nl$gdb_prompt $" { - pass "print g_vE (aCC)" - } - -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, ${vbptr}vA = $hex, vb = 0, vx = 0\}, \ = \{${vbptr}vA = $hex, vc = 0, vx = 0\}, ${vbptr}vC = $hex, ${vbptr}vB = $hex, vd = 0, vx = 0\}, ${vbptr}vD = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" { - pass "print g_vE" - } - -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, _vptr.vB = $hex *(\)?, vb = 0, vx = 0\}, \ = \{_vptr.vC = $hex *(\)?, vc = 0, vx = 0\}, _vptr.vD = $hex, vd = 0, vx = 0\}, _vptr.vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" { - pass "print g_vE (FIXME v3 vtbl ptr)" - } - -re ".*$gdb_prompt $" { fail "print g_vE" } - timeout { fail "print g_vE (timeout)" } - } -} - -proc do_tests {} { - global prms_id - global bug_id - global subdir - global objdir - global srcdir - global binfile - - set prms_id 0 - set bug_id 0 - - # Start with a fresh gdb. - - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - - gdb_test "set language c++" "" - gdb_test "set width 0" "" - - # Get the debug format for the compiled test case. - - if { ![ runto_main] } { - gdb_suppress_tests; - } - - test_ptype_si - test_ptype_mi - test_ptype_vi - test_ptype_mvi - - gdb_stop_suppressing_tests; - - if { ![ runto 'inheritance2' ] } { - gdb_suppress_tests; - } - - test_print_si_members - test_print_si_classes - test_print_mi_members - test_print_mi_classes - test_print_anon_union - - gdb_stop_suppressing_tests; - - if { ![ runto 'inheritance4' ] } { - gdb_suppress_tests; - } - - test_print_svi_members - test_print_svi_classes - test_print_mvi_members - test_print_mvi_classes -} - -do_tests diff --git a/gdb/testsuite/gdb.c++/local.cc b/gdb/testsuite/gdb.c++/local.cc deleted file mode 100644 index 85fd6e1..0000000 --- a/gdb/testsuite/gdb.c++/local.cc +++ /dev/null @@ -1,66 +0,0 @@ -// Tests for local types - -void marker1 (void) -{ -} - -void marker2 (void) -{ -} - -int foobar (int x) -{ - class Local { - public: - int loc1; - char loc_foo (char c) - { - return c + 3; - } - }; - - Local l; - static Local l1; - char c; - - marker1 (); - - l.loc1 = 23; - - c = l.loc_foo('x'); - return c + 2; -} - -int main() -{ - int c; - - c = foobar (31); - - { // inner block - class InnerLocal { - public: - char ilc; - int * ip; - int il_foo (unsigned const char & uccr) - { - return uccr + 333; - } - class NestedInnerLocal { - public: - int nil; - int nil_foo (int i) - { - return i * 27; - } - }; - NestedInnerLocal nest1; - }; - - InnerLocal il; - - il.ilc = 'b'; - il.ip = &c; - marker2(); - } -} diff --git a/gdb/testsuite/gdb.c++/local.exp b/gdb/testsuite/gdb.c++/local.exp deleted file mode 100644 index 21ceb7a..0000000 --- a/gdb/testsuite/gdb.c++/local.exp +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# tests for local variables -# Written by Satish Pai 1997-07-08 -# Cleaned by Michael Chastain 2002-04-08 - - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "local" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info $binfile "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -# -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -if ![runto 'marker1'] then { - perror "couldn't run to marker1" - continue -} - -gdb_test "up" ".*foobar.*" "up from marker1" - -# Local classes in g++ get names like "main.1::InnerLocal", just like local -# static variables. Some targets use "___" instead of ".". - -# --- -# Pattern 1: -# PASS -# dwarf-2 -# gcc 2.95.3 -# -# Pattern 2: -# FAIL -# This has a duplicate "char loc_foo" line. This is a bug. -# Historically this has been an XFAIL. -# dwarf-2 -# gcc 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD -# -# Pattern 3: -# PASS -# stabs+ -# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD -# -# Pattern 4: -# This an old pattern from the hppa aCC version of this file. -# I left it alone. -# -# chastain 2002-04-08 - -set sep "(\[.\]|___)\[0-9\]" - -send_gdb "ptype Local\n" -gdb_expect { - -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" } - -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { - kfail "gdb/483" "ptype Local" - } - -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*Local & operator *=\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((void|)\\);\[\r\n\t \]*char loc_foo\\(char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" } - -re "type = class Local \{\r\n\[\t \]*public:\r\n\[\t \]*int loc1;\r\n\r\n\[\t \]*char loc_foo\\(char\\);\r\n\[\t \]*\\(Local at.*local\\.cc:\[0-9\]*\\)\r\n\}.*$gdb_prompt $" { xpass "ptype Local (old aCC)" } - -re ".*$gdb_prompt $" { fail "ptype Local" } - timeout { fail "(timeout) ptype Local" } -} - -gdb_test "break marker2" -gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker2.*" \ - "continuing to marker2" - -gdb_test "up" ".*main.*" "up from marker2" - -# Make sure that `Local' isn't in scope here; it's local to foobar. -# setup_kfail "gdb/825" -send_gdb "ptype Local\n" -set eol "\[\t \]*\[\r\n\]+\[\t \]*" -gdb_expect { - -re "No symbol \"Local\" in current context.*${gdb_prompt} $" { - pass "Local out of scope" - } - -re "ptype Local${eol}type = class Local {${eol} public:${eol} int loc1;${eol}.*${eol} char loc_foo\\(char\\);${eol}}${eol}${gdb_prompt} " { - # GCC emits STABS debugging information in a way that doesn't - # properly preserve the scoping of local classes. I think - # we'd need to start using Sun's extensions to stabs to get - # this right. - kfail gdb/825 "Local out of scope" - } - -re ".*${gdb_prompt} $" { - fail "Local out of scope" - } - timeout { - fail "Local out of scope (timeout)" - } -} - - -# DTS CLLbs14316 and CLLbs17058 -# coulter - I added a clause for HP's aCC compiler. We print out the type -# as xx instead of const unsigned char, but we still have an expected failure -# because of two reasons: -# There is a number at the end of InnerLocal4 which should not be there, -# DTS CLLbs14316 -# The line number for the class -# setup_xfail "hppa*-*-*" CLLbs14316 - -# --- -# Pattern 1: -# PASS -# dwarf-2 -# 2.95.3, 2.96-rh, 3.0.4, 3.1, gcc-3_1-branch, HEAD -# -# Pattern 2: -# PASS -# stabs+ -# 2.95.3, 2.96-rh, 3.0.4, 3.1, gcc-3_1-branch, HEAD -# -# Pattern 3: -# Old hppa pattern. -# -# Pattern 4: -# Old hppa pattern. -# -# chastain 2002-05-27 - -send_gdb "ptype InnerLocal\n" -gdb_expect { - -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]*int il_foo\\((unsigned char const|const unsigned char) *&\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 1)" } - -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]*InnerLocal *& operator *=\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((void|)\\);\[\r\n\t \]*int il_foo\\(unsigned char const *&\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 2)" } - -re "type = class InnerLocal \{\r\n\[\t \]*public:\r\n\[\t \]*char ilc;\r\n\[\t \]*int \\*ip;\r\n\[\t \]*InnerLocal::NestedInnerLocal nest1;\r\n\r\n\[\t \]*.int il_foo\\(unsigned char const &\\);\r\n\[\t \]*\}\[\t \]*\\(Local at.*local\\.cc:36\\).*$gdb_prompt $" { pass "ptype InnerLocal (old HP aCC)" } - -re "type = class InnerLocal \{\r\n\[\t \]*public:\r\n\[\t \]*char ilc;\r\n\[\t \]*int \\*ip;\r\n\[\t \]*class InnerLocal4::NestedInnerLocal nest1;\r\n\r\n\[\t \]*int il_foo\\(unsigned char const &\\);\r\n\[\t \]*\\(Local at.*local\.cc:\[0-9\]+\\)\r\n\}.*$gdb_prompt $" { pass "ptype InnerLocal (old HP aCC)" } - -re ".*$gdb_prompt $" { fail "ptype InnerLocal" } - timeout { fail "(timeout) ptype InnerLocal" } -} - -#--- -# Pattern 1: -# PASS -# dwarf-2 -# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD -# -# Pattern 2: -# PASS -# stabs+ -# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD -# -# chastain 2002-04-08 - -send_gdb "ptype NestedInnerLocal\n" -gdb_expect { - -re "type = class NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype NestedInnerLocal" } - -re "type = class NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*NestedInnerLocal *& *operator *= *\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((void|)\\);\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype NestedInnerLocal" } - -re ".*$gdb_prompt $" { fail "ptype NestedInnerLocal" } - timeout { fail "(timeout) ptype NestedInnerLocal" } -} - -# gdb incorrectly interprets the NestedInnerLocal in -# InnerLocal::NestedInnerLocal as field name instead of a type name; -# See CLLbs14784. - -#--- -# Pattern 3: -# FAIL -# The comment above, about CLLbs14784, is still correct. -# dwarf-2 -# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD -# stabs+ -# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD -# -# chastain 2002-04-08 - -send_gdb "ptype InnerLocal::NestedInnerLocal\n" -gdb_expect { - -re "type = class InnerLocal::NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal::NestedInnerLocal" } - -re "type = class InnerLocal::NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*NestedInnerLocal *& *operator *= *\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((void|)\\);\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal::NestedInnerLocal" } - -re "There is no field named NestedInnerLocal.*$gdb_prompt $" { - setup_kfail "gdb/482" *-*-* - fail "ptype InnerLocal::NestedInnerLocal" - } - -re "No symbol .*NestedInnerLocal.* in current context.*$gdb_prompt $" { fail "ptype InnerLocal::NestedInnerLocal (bogus symbol lookup)" } - -re ".*$gdb_prompt $" { fail "ptype InnerLocal::NestedInnerLocal" } - timeout { fail "(timeout) ptype InnerLocal::NestedInnerLocal" } -} diff --git a/gdb/testsuite/gdb.c++/m-data.cc b/gdb/testsuite/gdb.c++/m-data.cc deleted file mode 100644 index c97e719..0000000 --- a/gdb/testsuite/gdb.c++/m-data.cc +++ /dev/null @@ -1,64 +0,0 @@ -// 2002-05-13 - -enum region { oriental, egyptian, greek, etruscan, roman }; - -// Test one. -class gnu_obj_1 -{ -protected: - typedef region antiquities; - const bool test; - const int key1; - long key2; - - antiquities value; - -public: - gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {} -}; - -// Test two. -template -class gnu_obj_2: public virtual gnu_obj_1 -{ -protected: - antiquities value_derived; - -public: - gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { } -}; - -// Test three. -template -class gnu_obj_3 -{ -protected: - typedef region antiquities; - gnu_obj_2 data; - -public: - gnu_obj_3(antiquities b): data(etruscan) { } -}; - -int shadow = 0; - -class C -{ -public: - C (int x) : shadow (x) {} - void marker () {} -private: - int shadow; -}; - -int main() -{ - gnu_obj_1 test1(egyptian, 4589); - gnu_obj_2 test2(roman); - gnu_obj_3 test3(greek); - - C theC (1); // breakpoint: first-constructs-done - theC.marker (); - - return 0; -} diff --git a/gdb/testsuite/gdb.c++/m-data.exp b/gdb/testsuite/gdb.c++/m-data.exp deleted file mode 100644 index 85adb5e..0000000 --- a/gdb/testsuite/gdb.c++/m-data.exp +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Tests for member data -# 2002-05-13 Benjamin Kosnik - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "m-data" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# First, run to after we've constructed all the gnu_obj_N's: - -gdb_breakpoint [gdb_get_line_number "first-constructs-done"] -gdb_continue_to_breakpoint "end of first constructors" - -# One. - -# simple object, const bool -gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, const bool" - -# simple object, const int -gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, const int" - -# simple object, long -gdb_test "print test1.key2" "\\$\[0-9\]* = 4589" "simple object, long" - -# simple object, enum -gdb_test "print test1.value" "\\$\[0-9\]* = egyptian" "simple object, enum" - -# Two. - -# derived template object, base const bool -gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base const bool" - -# derived template object, base const int -gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base const int" - -# derived template object, base long -gdb_test "print test2.key2" "\\$\[0-9\]* = 7" "derived template object, base long" - -# derived template object, base enum -gdb_test "print test2.value" "\\$\[0-9\]* = oriental" "derived template object, base enum" - -# derived template object, enum -gdb_test "print test2.value_derived" "\\$\[0-9\]* = roman" "derived template object, derived enum" - -# Three. - -# template object, derived template data member's base const bool -gdb_test "print test3.data.test" "\\$\[0-9\]* = true" "template object, const bool" - -# template object, derived template data member's base const int -gdb_test "print test3.data.key1" "\\$\[0-9\]* = 5" "template object, const int" - -# template object, derived template data member's base long -gdb_test "print test3.data.key2" "\\$\[0-9\]* = 7" "template object, long" - -# template object, derived template data member's base enum -gdb_test "print test3.data.value" "\\$\[0-9\]* = oriental" "template object, base enum" - -# template object, derived template data member's enum -gdb_test "print test3.data.value_derived" "\\$\[0-9]\* = etruscan" "template object, derived enum" - -# Now some tests for shadowing (see PR gdb/804): - -gdb_breakpoint "C::marker" -gdb_continue_to_breakpoint "continue to shadow breakpoint" - -gdb_test "print shadow" "\\$\[0-9]\* = 1" "shadowing member" -gdb_test "print ::shadow" "\\$\[0-9]\* = 0" "shadowed global variable" - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/m-static.cc b/gdb/testsuite/gdb.c++/m-static.cc deleted file mode 100644 index 6d08cb0..0000000 --- a/gdb/testsuite/gdb.c++/m-static.cc +++ /dev/null @@ -1,72 +0,0 @@ -// 2002-05-13 - -enum region { oriental, egyptian, greek, etruscan, roman }; - -// Test one. -class gnu_obj_1 -{ -protected: - typedef region antiquities; - static const bool test = true; - static const int key1 = 5; - static long key2; - - static antiquities value; - -public: - gnu_obj_1(antiquities a, long l) {} -}; - -const bool gnu_obj_1::test; -const int gnu_obj_1::key1; -long gnu_obj_1::key2 = 77; -gnu_obj_1::antiquities gnu_obj_1::value = oriental; - - -// Test two. -template -class gnu_obj_2: public virtual gnu_obj_1 -{ -public: - static antiquities value_derived; - -public: - gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7) { } -}; - -template -typename gnu_obj_2::antiquities gnu_obj_2::value_derived = etruscan; - -// Test three. -template -class gnu_obj_3 -{ -public: - typedef region antiquities; - static gnu_obj_2 data; - -public: - gnu_obj_3(antiquities b) { } -}; - -template -gnu_obj_2 gnu_obj_3::data(etruscan); - -// 2002-08-16 -// Test four. -#include "m-static.h" - -// instantiate templates explicitly so their static members will exist -template class gnu_obj_2; -template class gnu_obj_2; -template class gnu_obj_3; - -int main() -{ - gnu_obj_1 test1(egyptian, 4589); - gnu_obj_2 test2(roman); - gnu_obj_3 test3(greek); - gnu_obj_4 test4; - - return 0; // breakpoint: constructs-done -} diff --git a/gdb/testsuite/gdb.c++/m-static.exp b/gdb/testsuite/gdb.c++/m-static.exp deleted file mode 100644 index d291135..0000000 --- a/gdb/testsuite/gdb.c++/m-static.exp +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Tests for member static data -# 2002-05-13 Benjamin Kosnik -# 2002-08-22 David Carlton - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "m-static" -set srcfile ${testfile}.cc -set srcfile1 ${testfile}1.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# First, run to after we've constructed all the objects: - -gdb_breakpoint [gdb_get_line_number "constructs-done"] -gdb_continue_to_breakpoint "end of constructors" - - -# One. - -# simple object, static const bool -gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, static const bool" - -# simple object, static const int -gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, static const int" - -# simple object, static long -gdb_test "print test1.key2" "\\$\[0-9\]* = 77" "simple object, static long" - -# simple object, static enum -gdb_test "print test1.value" "\\$\[0-9\]* = oriental" "simple object, static enum" - -# Two. - -# derived template object, base static const bool -gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base static const bool" - -# derived template object, base static const int -gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base static const int" - -# derived template object, base static long -gdb_test "print test2.key2" "\\$\[0-9\]* = 77" "derived template object, base static long" - -# derived template object, base static enum -gdb_test "print test2.value" "\\$\[0-9\].* = oriental" "derived template object, base static enum" - -# derived template object, static enum -gdb_test "print test2.value_derived" "\\$\[0-9\].* = etruscan" "derived template object, static enum" - -# Three. - -# template object, static derived template data member's base static const bool -gdb_test "print test3.data.test" "\\$\[0-9\].* = true" "template object, static const bool" - -# template object, static derived template data member's base static const int -gdb_test "print test3.data.key1" "\\$\[0-9\].* = 5" "template object, static const int" - -# template object, static derived template data member's base static long -gdb_test "print test3.data.key2" "\\$\[0-9\].* = 77" "template object, static long" - -# template object, static derived template data member's base static enum -gdb_test "print test3.data.value" "\\$\[0-9\].* = oriental" "template object, static enum" - -# template object, static derived template data member's static enum -gdb_test "print test3.data.value_derived" "\\$\[0-9\].* = etruscan" "template object, static derived enum" - -# 2002-08-16 -# Four. - -# static const int initialized in another file. -gdb_test "print test4.elsewhere" "\\$\[0-9\].* = 221" "static const int initialized elsewhere" - -# static const int that nobody initializes. From PR gdb/635. -gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimised out" "static const int initialized nowhere" - -# Perhaps at some point test4 should also include a test for a static -# const int that was initialized in the header file. But I'm not sure -# that GDB's current behavior in such situations is either consistent -# across platforms or optimal, so I'm not including one now. - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/m-static.h b/gdb/testsuite/gdb.c++/m-static.h deleted file mode 100644 index 137d3b7..0000000 --- a/gdb/testsuite/gdb.c++/m-static.h +++ /dev/null @@ -1,11 +0,0 @@ -// 2002-08-16 - -class gnu_obj_4 -{ - public: - static const int elsewhere; - static const int nowhere; - // At some point, perhaps: - // static const int everywhere = 317; -}; - diff --git a/gdb/testsuite/gdb.c++/m-static1.cc b/gdb/testsuite/gdb.c++/m-static1.cc deleted file mode 100644 index 302a5ad..0000000 --- a/gdb/testsuite/gdb.c++/m-static1.cc +++ /dev/null @@ -1,5 +0,0 @@ -// 2002-08-16 - -#include "m-static.h" - -const int gnu_obj_4::elsewhere = 221; diff --git a/gdb/testsuite/gdb.c++/maint.exp b/gdb/testsuite/gdb.c++/maint.exp deleted file mode 100644 index 1042c91..0000000 --- a/gdb/testsuite/gdb.c++/maint.exp +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright 2003 Free Software Foundation Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - - -# This file tests C++-specific maintenance commands and help on those. - -# Currently, no source file is used. - -if $tracelevel then { - strace $tracelevel - } - -# Test the help messages. - -proc test_help {} { - gdb_test "help maintenance cplus" "C\\+\\+ maintenance commands.\r\n\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous." - - gdb_test "help maint cp" "C\\+\\+ maintenance commands.\r\n\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous." - - gdb_test "maint cp" "\"maintenance cplus\" must be followed by the name of a command.\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous." - - gdb_test "help maint cp first_component" "Print the first class/namespace component of NAME." -} - -# This is used when NAME should contain only a single component. Be -# careful to make sure that parentheses get escaped properly. -proc test_single_component {name} { - set matchname [string_to_regexp "$name"] - gdb_test "maint cp first_component $name" "$matchname" -} - -# This is used when NAME is invalid. -proc test_invalid_name {name} { - set matchname [string_to_regexp "$name"] - gdb_test "maint cp first_component $name" \ - "During symbol reading, unexpected demangled name '$matchname'.\r\n$matchname" -} - -proc test_first_component {} { - # The function in question might complain; make sure that we see - # all complaints. - - gdb_test "set complaints -1" "" - - test_single_component "foo" - test_single_component "operator<<" - test_single_component "operator>>" - test_single_component "operator ->" - test_single_component "operator()" - test_single_component "operator>" - test_single_component "operator<" - test_single_component "operator ->" - test_single_component "operator ->" - - test_single_component "foo()" - test_single_component "foo(int)" - test_single_component "foo(X::Y)" - test_single_component "foo(X::Y, A::B)" - test_single_component "foo(std::basic_streambuf >)" - test_single_component "operator>(X::Y)" - - # Operator names can show up in weird places. - - test_single_component "int operator<< ()" - test_single_component "T" - - # NOTE: carlton/2003-04-23: I've only seen the first of these - # produced by the demangler, but I'm including two more just to be - # on the safe side. - test_single_component "int foo<&(operator<<(C, C))>()" - test_single_component "int foo<&operator<<(C, C)>()" - test_single_component "int foo()" - - gdb_test "maint cp first_component foo::bar" "foo" - gdb_test "maint cp first_component foo::bar::baz" "foo" - gdb_test "maint cp first_component C::bar" "C" - gdb_test "maint cp first_component C > >::bar" "C > >" - - # Make sure we behave appropriately on invalid input. - - # NOTE: carlton/2003-06-25: As of today, the demangler can in fact - # produce examples like the third case below: there really should - # be a space between the two <'s. See PR gdb/1245. - - test_invalid_name "foo<" - test_invalid_name "foo(" - test_invalid_name "bool operator<" -} - -gdb_exit -gdb_start - -test_help -test_first_component - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/member-ptr.cc b/gdb/testsuite/gdb.c++/member-ptr.cc deleted file mode 100644 index 4beb926..0000000 --- a/gdb/testsuite/gdb.c++/member-ptr.cc +++ /dev/null @@ -1,106 +0,0 @@ -extern "C" { -#include -} - - -class A { -public: - A(); - int foo (int x); - int bar (int y); - virtual int baz (int z); - char c; - int j; - int jj; - static int s; -}; - -class B { -public: - static int s; -}; - -int A::s = 10; -int B::s = 20; - -A::A() -{ - c = 'x'; - j = 5; -} - -int A::foo (int dummy) -{ - j += 3; - return j + dummy; -} - -int A::bar (int dummy) -{ - int r; - j += 13; - r = this->foo(15); - return r + j + 2 * dummy; -} - -int A::baz (int dummy) -{ - int r; - j += 15; - r = this->foo(15); - return r + j + 12 * dummy; -} - -int fum (int dummy) -{ - return 2 + 13 * dummy; -} - -typedef int (A::*PMF)(int); - -typedef int A::*PMI; - -int main () -{ - A a; - A * a_p; - PMF pmf; - - PMF * pmf_p; - PMI pmi; - - a.j = 121; - a.jj = 1331; - - int k; - - a_p = &a; - - pmi = &A::j; - pmf = &A::bar; - pmf_p = &pmf; - - pmi = NULL; - - k = (a.*pmf)(3); - - pmi = &A::jj; - pmf = &A::foo; - pmf_p = &pmf; - - k = (a.*pmf)(4); - - k = (a.**pmf_p)(5); - - k = a.*pmi; - - - k = a.bar(2); - - k += fum (4); - - B b; - - k += b.s; - -} diff --git a/gdb/testsuite/gdb.c++/member-ptr.exp b/gdb/testsuite/gdb.c++/member-ptr.exp deleted file mode 100644 index f21cd15..0000000 --- a/gdb/testsuite/gdb.c++/member-ptr.exp +++ /dev/null @@ -1,549 +0,0 @@ -# Copyright 1998, 1999 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu -# Tests for pointer-to-member support -# Written by Satish Pai 1997-08-19 - -# This file is part of the gdb testsuite - - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# - -# Start with a fresh gdb -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir - -set prms_id 0 -set bug_id 0 - -set testfile "member-ptr" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -# Create and source the file that provides information about the compiler -# used to compile the test case. - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -# Nearly all of these tests fail when compiled with G++, so just give up -# until GDB gets enhanced. -sts 1999-06-22 - -if {$gcc_compiled} { - continue -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -send_gdb "break 83\n" -gdb_expect { - -re "Breakpoint \[0-9\]*.*line 83\\.\r\n$gdb_prompt $" { - pass "set break at 83" - } - -re ".*$gdb_prompt $" { fail "set break at 83" } - timeout { fail "(timeout) set break at 83" } -} - -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\n\r\nBreakpoint.*at.*member-ptr\\.cc:83\r\n83\[ \t]*pmi = NULL;\r\n$gdb_prompt $" { - pass "continue to 83" - } - -re ".*$gdb_prompt $" { fail "continue to 83" } - timeout { fail "(timeout) continue to 83" } -} - -# ptype on pointer to data member - -send_gdb "ptype pmi\n" -gdb_expect { - -re "type = int \\( A::\\*\\)\r\n$gdb_prompt $" { - pass "ptype pmi" - } - -re ".*$gdb_prompt $" { fail "ptype pmi" } - timeout { fail "(timeout) ptype pmi" } -} - -# print pointer to data member - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\) &A::j\r\n$gdb_prompt $" { - pass "print pmi" - } - -re ".*$gdb_prompt $" { fail "print pmi" } - timeout { fail "(timeout) print pmi" } -} - - -# print dereferenced pointer to data member - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a.*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 121\r\n$gdb_prompt $" { - pass "print a.*pmi" - } - -re ".*$gdb_prompt $" { fail "print a.*pmi" } - timeout { fail "(timeout) print a.*pmi" } -} - -# print dereferenced pointer to data member -# this time, dereferenced through a pointer - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a_p->*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 121\r\n$gdb_prompt $" { - pass "print a->*pmi" - } - -re ".*$gdb_prompt $" { fail "print a->*pmi" } - timeout { fail "(timeout) print a->*pmi" } -} - - -# set the pointer to data member - -send_gdb "set var pmi = &A::jj\n" -gdb_expect { - -re "$gdb_prompt $" { - pass "set var (not really a pass)" - } - timeout { fail "(timeout) " } -} - -# Now print the pointer again - -send_gdb "print pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\) &A::jj\r\n$gdb_prompt $" { - pass "print pmi after setting" - } - -re ".*$gdb_prompt $" { fail "print pmi after setting" } - timeout { fail "(timeout) print pmi after setting" } -} - -# print dereferenced pointer to data member again - -send_gdb "print a.*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 1331\r\n$gdb_prompt $" { - pass "print a.*pmi after setting" - } - -re ".*$gdb_prompt $" { fail "print a.*pmi after setting" } - timeout { fail "(timeout) print a.*pmi after setting" } -} - -# set the pointer to data member back to A::j - -send_gdb "set var pmi = &A::j\n" -gdb_expect { - -re "$gdb_prompt $" { - pass "set var back to A::j (not really a pass)" - } - timeout { fail "(timeout) set var pmi" } -} - -# print dereferenced pointer to data member yet again (extra check, why not) - -send_gdb "print a.*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 121\r\n$gdb_prompt $" { - pass "print a.*pmi after resetting" - } - -re ".*$gdb_prompt $" { fail "print a.*pmi after resetting" } - timeout { fail "(timeout) print a.*pmi after resetting" } -} - -# Set the data member pointed to. - -send_gdb "print a.*pmi = 33\n" -gdb_expect { - -re "\\$\[0-9\]* = 33\r\n$gdb_prompt $" { - pass "print command to set" - } - -re ".*$gdb_prompt $" { fail "print command to set" } - timeout { fail "(timeout) print command to set" } -} - -# Now check that the data really was changed -send_gdb "print a.*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 33\r\n$gdb_prompt $" { - pass "print a.*pmi after setting member pointed to" - } - -re ".*$gdb_prompt $" { fail "print a.*pmi after setting member pointed to" } - timeout { fail "(timeout) print a.*pmi after setting member pointed to" } -} - -# Double-check by printing a. -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a\n" -gdb_expect { - -re "\\$\[0-9\]* = \{c = 120 'x', j = 33, jj = 1331, static s = 10, Virtual table at $hex\}\r\n$gdb_prompt $" { - pass "print a after setting member pointed to by pmi" - } - -re ".*$gdb_prompt $" { fail "print a after setting member pointed to by pmi" } - timeout { fail "(timeout) print a after setting member pointed to by pmi" } -} - - -# Set the data member pointed to, using ->* - -send_gdb "print a_p->*pmi = 44\n" -gdb_expect { - -re "\\$\[0-9\]* = 44\r\n$gdb_prompt $" { - pass "print command to set (->)" - } - -re ".*$gdb_prompt $" { fail "print command to set (->)" } - timeout { fail "(timeout) print command to set (->)" } -} - -# Now check that the data really was changed -send_gdb "print a_p->*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 44\r\n$gdb_prompt $" { - pass "print a_p->*pmi after setting member pointed to" - } - -re ".*$gdb_prompt $" { fail "print a_p->*pmi after setting member pointed to" } - timeout { fail "(timeout) print a_p->*pmi after setting member pointed to" } -} - -# Double-check by printing a. -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a\n" -gdb_expect { - -re "\\$\[0-9\]* = \{c = 120 'x', j = 44, jj = 1331, static s = 10, Virtual table at $hex\}\r\n$gdb_prompt $" { - pass "print a after setting member pointed to by pmi (->) " - } - -re ".*$gdb_prompt $" { fail "print a after setting member pointed to by pmi (->) " } - timeout { fail "(timeout) print a after setting member pointed to by pmi (->) " } -} - - -# Do a ptype on the dereferenced pointer to member -# pai/1997-08-20 Doesn't work - -# send_gdb "ptype a.*pmi\n" -# gdb_expect { -# -re "type = int\r\n$gdb_prompt $" { -# pass "ptype a.*pmi" -# } -# -re ".*$gdb_prompt $" { fail "ptype a.*pmi" } -# timeout { fail "(timeout) ptype a.*pmi" } -#} - -# Try to dereference the pointer to data member without any object - -send_gdb "print *pmi\n" -gdb_expect { - -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { - pass "attempt to print ptr to member without object" - } - -re ".*$gdb_prompt $" { fail "attempt to print ptr to member without object" } - timeout { fail "(timeout) attempt to print ptr to member without object" } -} - -# Try to ptype a dereference of the pointer to data member without any object - -send_gdb "ptype *pmi\n" -gdb_expect { - -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { - pass "attempt to ptype ptr to member without object" - } - -re ".*$gdb_prompt $" { fail "attempt to ptype ptr to member without object" } - timeout { fail "(timeout) attempt to ptype ptr to member without object" } -} - -# Ptype a pointer to a method. - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "ptype pmf\n" -gdb_expect { - -re "type = int \\( A::\\*\\)\\(\\.\\.\\.\\)\r\n$gdb_prompt $" { - pass "ptype pmf" - } - -re ".*$gdb_prompt $" { fail "ptype pmf" } - timeout { fail "(timeout) ptype pmf" } -} - -# print a pointer to a method - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print pmf\n" -gdb_expect { - -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\(\\.\\.\\.\\)\\) \\?\\? \r\n$gdb_prompt $" { - pass "print pmf" - } - -re ".*$gdb_prompt $" { fail "print pmf" } - timeout { fail "(timeout) print pmf" } -} - - -# Ptype a pointer to a pointer to a method - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "ptype pmf_p\n" -gdb_expect { - -re "type = int \\( A::\\*\\*\\)\\(\\.\\.\\.\\)\r\n$gdb_prompt $" { - pass "ptype pmf_p" - } - -re ".*$gdb_prompt $" { fail "ptype pmf_p" } - timeout { fail "(timeout) ptype pmf_p" } -} - -# print a pointer to a pointer to a method - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print pmf_p\n" -gdb_expect { - -re "\\$\[0-9\]* = \\(int \\( A::\\*\\*\\)\\(\\.\\.\\.\\)\\) $hex\r\n$gdb_prompt $" { - pass "print pmf_p" - } - -re ".*$gdb_prompt $" { fail "print pmf_p" } - timeout { fail "(timeout) print pmf_p" } -} - -# print dereferenced pointer to method - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a.*pmf\n" -gdb_expect { - -re "Pointers to methods not supported with HP aCC\r\n$gdb_prompt $" { - pass "print a.*pmf (known aCC limitation)" - } - -re ".*$gdb_prompt $" { fail "print a.*pmf" } - timeout { fail "(timeout) print a.*pmf" } -} - -# print dereferenced pointer to method, using ->* - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a_p->*pmf\n" -gdb_expect { - -re "Pointers to methods not supported with HP aCC\r\n$gdb_prompt $" { - pass "print a_p->*pmf (known aCC limitation)" - } - -re ".*$gdb_prompt $" { fail "print a_p->*pmf" } - timeout { fail "(timeout) print a_p->*pmf" } -} - -# set the pointer to data member - -setup_xfail "hppa*-*-*" -send_gdb "set var pmf = &A::foo\n" -gdb_expect { - -re "Assignment to pointers to methods not implemented with HP aCC\r\n$gdb_prompt $" { - pass "set var pmf (known aCC limitation)" - } - -re ".*$gdb_prompt $" { fail "set var pmf" } - timeout { fail "(timeout) set var pmf" } -} - -# Try to dereference the pointer to method without any object - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print *pmf\n" -gdb_expect { - -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { - pass "attempt to print ptr to method without object" - } - -re ".*$gdb_prompt $" { fail "attempt to print ptr to method without object" } - timeout { fail "(timeout) attempt to print ptr to method without object" } -} - -# Try to ptype a dereference of the pointer to method without any object - -send_gdb "ptype *pmi\n" -gdb_expect { - -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { - pass "attempt to ptype ptr to member without object" - } - -re ".*$gdb_prompt $" { fail "attempt to ptype ptr to member without object" } - timeout { fail "(timeout) attempt to ptype ptr to member without object" } -} - -# Check cast of pointer to member to integer -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print (int) pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 8\r\n$gdb_prompt $" { - pass "casting pmi to int" - } - -re ".*$gdb_prompt $" { fail "casting pmi to int" } - timeout { fail "(timeout) casting pmi to int" } -} - -# Check cast of pointer to method to integer -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print (int) pmf\n" -gdb_expect { - -re "Pointers to methods not supported with HP aCC\r\n$gdb_prompt $" { - pass "casting pmf to int (known aCC limitation)" - } - -re ".*$gdb_prompt $" { fail "casting pmf to int" } - timeout { fail "(timeout) casting pmf to int" } -} - -# Try to invoke a function through a pointer to data member -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print (a.*pmi)(3)\n" -gdb_expect { - -re "Not implemented: function invocation through pointer to method with HP aCC\r\n$gdb_prompt $" { - pass "print (a.*pmi)(3) -- error message should be different" - } - -re ".*$gdb_prompt $" { fail "print (a.*pmi)(3)" } - timeout { fail "(timeout) print (a.*pmi)(3)" } -} - -# Try to invoke a function through a pointer to a method -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print (a.*pmf)(3)\n" -gdb_expect { - -re "Not implemented: function invocation through pointer to method with HP aCC\r\n$gdb_prompt $" { - pass "print (a.*pmi)(3) -- known aCC limitation" - } - -re ".*$gdb_prompt $" { fail "print (a.*pmf)(3)" } - timeout { fail "(timeout) print (a.*pmf)(3)" } -} - - -# Go past assignment of NULL to pmi -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "next\n" -gdb_expect { - -re "\r\n85\[ \t\]*k = \\(a.\\*pmf\\)\\(3\\);\r\n$gdb_prompt $" { - pass "next past 83" - } - -re ".*$gdb_prompt $" { fail "next past 83" } - timeout { fail "(timeout) next past 83" } -} - -#send_gdb "print pmi\n" -#gdb_expect { -# -re "Attempted dereference of null pointer-to-member\r\n$gdb_prompt $" { -# pass "" -# } -# -re ".*$gdb_prompt $" { fail "" } -# timeout { fail "(timeout) " } -#} - -# Dereference the null pointer to member -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a.*pmi\n" -gdb_expect { - -re "Attempted dereference of null pointer-to-member\r\n$gdb_prompt $" { - pass "print a.*NULL" - } - -re ".*$gdb_prompt $" { fail "print a.*NULL" } - timeout { fail "(timeout) print a.*NULL" } -} - - -# Go to another part of the program -send_gdb "break 91\n" -gdb_expect { - -re "Breakpoint \[0-9\]*.*line 91\\.\r\n$gdb_prompt $" { - pass "set break at 91" - } - -re ".*$gdb_prompt $" { fail "set break at 91" } - timeout { fail "(timeout) set break at 91" } -} - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "continue\n" -gdb_expect { - -re "Continuing\\.\r\n\r\nBreakpoint.*at.*member-ptr\\.cc:91\r\n91\[ \t]*k = \\(a.\\*pmf\\)\\(4\\);\r\n$gdb_prompt $" { - pass "continue to 91" - } - -re ".*$gdb_prompt $" { fail "continue to 91" } - timeout { fail "(timeout) continue to 91" } -} - - -# Now check again that pmi works even when not set to -# something that's at the beginning of the object - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\) &A::jj\r\n$gdb_prompt $" { - pass "print pmi (2)" - } - -re ".*$gdb_prompt $" { fail "print pmi (2)" } - timeout { fail "(timeout) print pmi (2)" } -} - - -# print dereferenced pointer to data member - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a.*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 1331\r\n$gdb_prompt $" { - pass "print a.*pmi (2)" - } - -re ".*$gdb_prompt $" { fail "print a.*pmi (2)" } - timeout { fail "(timeout) print a.*pmi (2)" } -} - -# print dereferenced pointer to data member -# this time, dereferenced through a pointer - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "print a_p->*pmi\n" -gdb_expect { - -re "\\$\[0-9\]* = 1331\r\n$gdb_prompt $" { - pass "print a->*pmi" - } - -re ".*$gdb_prompt $" { fail "print a->*pmi (2)" } - timeout { fail "(timeout) print a->*pmi (2)" } -} - - -# p a.*pmf - fail - -# p pmi - -# p a.*pmi - diff --git a/gdb/testsuite/gdb.c++/method.cc b/gdb/testsuite/gdb.c++/method.cc deleted file mode 100644 index 949b027..0000000 --- a/gdb/testsuite/gdb.c++/method.cc +++ /dev/null @@ -1,80 +0,0 @@ -// Class funk has a constructor and an ordinary method -// Test for CHFts23426 - -class funk -{ -public: - funk(); - void getFunky(int a, int b); - int data_; -}; - -funk::funk() - : data_(33) -{ -} - -void funk::getFunky(int a, int b) -{ - int res; - res = a + b - data_; - data_ = res; -} - -// Class A has const and volatile methods - -class A { -public: - int x; - int y; - int foo (int arg); - int bar (int arg) const; - int baz (int arg, char c) volatile; - int qux (int arg, float f) const volatile; -}; - -int A::foo (int arg) -{ - x += arg; - return arg *2; -} - -int A::bar (int arg) const -{ - return arg + 2 * x; -} - -int A::baz (int arg, char c) volatile -{ - return arg - 2 * x + c; -} - -int A::qux (int arg, float f) const volatile -{ - if (f > 0) - return 2 * arg - x; - else - return 2 * arg + x; -} - - -int main() -{ - A a; - int k; - - k = 10; - a.x = k * 2; - - k = a.foo(13); - - k += a.bar(15); - - // Test for CHFts23426 follows - funk f; - f.getFunky(1, 2); - return 0; -} - - - diff --git a/gdb/testsuite/gdb.c++/method.exp b/gdb/testsuite/gdb.c++/method.exp deleted file mode 100644 index a085b14..0000000 --- a/gdb/testsuite/gdb.c++/method.exp +++ /dev/null @@ -1,194 +0,0 @@ -# Copyright 1998, 1999, 2001, 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# tests for misc. C++ method stuff -# Written by Satish Pai 1997-07-08 - -# This file is part of the gdb testsuite - -# This tests: -# 0. method arguments are correct -# 1. access to class data members inside method scopes -# 2. correct param types for methods in ptype. -# 3. const and volatile methods - -# (#0 and #1 above relate to an HP specific problem -- GDB must correctly -# integrate FPARAM symbols in HP debug info into the local var list -# for the function or method's block.) - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "method" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info $binfile "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -# -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -gdb_test "break A::foo" \ - "Breakpoint \[0-9\]* at $hex.*file .*method.cc, line 38\\." - -gdb_test "continue" \ - "Continuing\\.\r\n\r\nBreakpoint \[0-9\]*, A::foo(\\(int\\)|) \\(this=$hex, arg=13\\) at .*method\\.cc:38\r\n38\[\t \]*x \\+= arg;" \ - "continue to A::foo" - -# Check ability to access this-relative stuff. - -gdb_test "print x" \ - "\\$\[0-9\]* = 20" \ - "print x in A::foo" - -# Check access to this pointer - -gdb_test "print this" \ - "\\$\[0-9\]* = \\((class |)A *\\* *(const|)\\) $hex" \ - "print this in A::foo" - -# Now do everything over again for A::bar, because sometimes processing one method -# (the first one) is fine, but the second one's debug info gets munged beyond recognition. - -gdb_test "break A::bar" \ - "Breakpoint \[0-9\]* at $hex.*file .*method.cc, line 44\\." - -gdb_test "continue" \ - "Continuing\\.\r\n\r\nBreakpoint \[0-9\]*, A::bar(\\(int\\) const|) \\(this=$hex, arg=15\\) at .*method\\.cc:44\r\n44\[\t \]*return arg \\+ 2 \\* x;" \ - "continue to A::bar" - -# Check ability to access this-relative stuff. - -gdb_test "print x" \ - "\\$\[0-9\]* = 33" \ - "print x in A::bar" - -# Check access to this pointer - -get_debug_format - -send_gdb "print this\n" -gdb_expect { - -re "\\$\[0-9\]* = \\(const (class |)A *\\* *(const|)\\) $hex\r\n$gdb_prompt $" { - pass "print this in A::bar" - } - -re "\\$\[0-9\]* = \\((class |)A *\\* *(const|)\\) $hex\r\n$gdb_prompt $" { - # gcc versions up to 3.0.4 with -gstabs+ do not emit "const" indicators, - # so the output is "A *". It should be "const A *" or "const A * const". - setup_xfail_format "stabs" - fail "print this in A::bar (missing const)" - } - -re "\\$\[0-9\]* = \\(const (class |)\{\\.\\.\\.\} *\\* *(const|)\\) $hex\r\n$gdb_prompt $" { - # gcc versions gcc-3_1-branch%20020404 and HEAD%20020404 with -gstabs+ - # produce good stabs, but gdb prints "const class {...} *" const. - # This is PR gdb/277. - # setup_kfail "gdb/277" - fail "print this in A::bar (gdb/277)" - } - -re ".*$gdb_prompt $" { fail "print this in A::bar" } - timeout { fail "(timeout) print this in A::bar" } -} - -# Check again with funk::getFunky (this is the original test case -# for CHFts23426); sometimes having a constructor with no arguments -# will nuke the debug info read in for other methods in the class. - -gdb_test "break 21" \ - "Breakpoint \[0-9\]* at $hex.*file .*method.cc, line 21\\." - -gdb_test "continue" \ - "Continuing\\.\r\n\r\nBreakpoint \[0-9\]*, funk::getFunky(\\(int, int\\)|) \\(this=$hex, a=1, b=2\\) at .*method\\.cc:21\r\n21\[\t \]*data_ = res;" \ - "continue to 21" - -# Check ability to access this-relative stuff. - -gdb_test "print data_" \ - "\\$\[0-9\]* = 33" \ - "print data_ in funk::getFunky" - -# Check access to this pointer - -gdb_test "print this" \ - "\\$\[0-9\]* = \\((class |)funk *\\* *(const|)\\) $hex" \ - "print this in funk::getFunky" - -# Check access to local variable - -gdb_test "print res" \ - "\\$\[0-9\]* = -30" \ - "print res in funk::getFunky" - -# Check ptype of class -- should show const/volatile methods - -send_gdb "ptype A\n" -gdb_expect { - -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\) volatile;\r\n\[ \]*int qux\\(int, float\\) (const volatile|volatile const);\r\n\}\r\n$gdb_prompt $" { - pass "ptype A" - } - -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*A & operator=\\(A const ?&\\);\r\n\[ \]*A\\(A const ?&\\);\r\n\[ \]*A\\((void|)\\);\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\) volatile;\r\n\[ \]*int qux\\(int, float\\) (const volatile|volatile const);\r\n\}\r\n$gdb_prompt $" { - pass "ptype A" - } - -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\);\r\n\[ \]*int qux\\(int, float\\) const;\r\n\}\r\n$gdb_prompt $" { - pass "ptype A (HP aCC bug -- volatile not indicated)" - } - -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\) volatile;\r\n\[ \]*int qux\\(int, float\\) const volatile;\r\n\}\r\n$gdb_prompt $" { - pass "ptype A" - } - -re ".*$gdb_prompt $" { fail "ptype A" } - timeout { fail "(timeout) ptype A" } -} - -send_gdb "cont\n" -gdb_expect { - -re "Continuing.\r\n\r\nProgram exited normally.*$gdb_prompt $" { - pass "finish program" - } - -re "Continuing.* EXIT code 0.*Program exited normally.*$gdb_prompt $" { - pass "finish program (exit wrapper)" - } - -re ".*$gdb_prompt $" { fail "finish program" } - default:{ fail "finish program (timeout)" } -} - diff --git a/gdb/testsuite/gdb.c++/misc.cc b/gdb/testsuite/gdb.c++/misc.cc deleted file mode 100644 index 286c02b..0000000 --- a/gdb/testsuite/gdb.c++/misc.cc +++ /dev/null @@ -1,587 +0,0 @@ -// Test various -*- C++ -*- things. - -// ====================== basic C++ types ======================= -bool v_bool; -bool v_bool_array[2]; - -typedef struct fleep fleep; -struct fleep { int a; } s; - -// ====================== simple class structures ======================= - -struct default_public_struct { - // defaults to public: - int a; - int b; -}; - -struct explicit_public_struct { - public: - int a; - int b; -}; - -struct protected_struct { - protected: - int a; - int b; -}; - -struct private_struct { - private: - int a; - int b; -}; - -struct mixed_protection_struct { - public: - int a; - int b; - private: - int c; - int d; - protected: - int e; - int f; - public: - int g; - private: - int h; - protected: - int i; -}; - -class public_class { - public: - int a; - int b; -}; - -class protected_class { - protected: - int a; - int b; -}; - -class default_private_class { - // defaults to private: - int a; - int b; -}; - -class explicit_private_class { - private: - int a; - int b; -}; - -class mixed_protection_class { - public: - int a; - int b; - private: - int c; - int d; - protected: - int e; - int f; - public: - int g; - private: - int h; - protected: - int i; -}; - -class const_vol_method_class { -public: - int a; - int b; - int foo (int &) const; - int bar (int &) volatile; - int baz (int &) const volatile; -}; - -int const_vol_method_class::foo (int & ir) const -{ - return ir + 3; -} -int const_vol_method_class::bar (int & ir) volatile -{ - return ir + 4; -} -int const_vol_method_class::baz (int & ir) const volatile -{ - return ir + 5; -} - -// ========================= simple inheritance ========================== - -class A { - public: - int a; - int x; -}; - -A g_A; - -class B : public A { - public: - int b; - int x; -}; - -B g_B; - -class C : public A { - public: - int c; - int x; -}; - -C g_C; - -class D : public B, public C { - public: - int d; - int x; -}; - -D g_D; - -class E : public D { - public: - int e; - int x; -}; - -E g_E; - -class class_with_anon_union -{ - public: - int one; - union - { - int a; - long b; - }; -}; - -class_with_anon_union g_anon_union; - -void inheritance2 (void) -{ -} - -void inheritance1 (void) -{ - int ival; - int *intp; - - // {A::a, A::x} - - g_A.A::a = 1; - g_A.A::x = 2; - - // {{A::a,A::x},B::b,B::x} - - g_B.A::a = 3; - g_B.A::x = 4; - g_B.B::b = 5; - g_B.B::x = 6; - - // {{A::a,A::x},C::c,C::x} - - g_C.A::a = 7; - g_C.A::x = 8; - g_C.C::c = 9; - g_C.C::x = 10; - - // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x} - - // The following initialization code is non-portable, but allows us - // to initialize all members of g_D until we can fill in the missing - // initialization code with legal C++ code. - - for (intp = (int *) &g_D, ival = 11; - intp < ((int *) &g_D + sizeof (g_D) / sizeof (int)); - intp++, ival++) - { - *intp = ival; - } - - // Overlay the nonportable initialization with legal initialization. - - // ????? = 11; (g_D.A::a = 11; is ambiguous) - // ????? = 12; (g_D.A::x = 12; is ambiguous) -/* djb 6-3-2000 - - This should take care of it. Rather than try to initialize using an ambiguous - construct, use 2 unambiguous ones for each. Since the ambiguous a/x member is - coming from C, and B, initialize D's C::a, and B::a, and D's C::x and B::x. - */ - g_D.C::a = 15; - g_D.C::x = 12; - g_D.B::a = 11; - g_D.B::x = 12; - g_D.B::b = 13; - g_D.B::x = 14; - // ????? = 15; - // ????? = 16; - g_D.C::c = 17; - g_D.C::x = 18; - g_D.D::d = 19; - g_D.D::x = 20; - - - // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x} - - // The following initialization code is non-portable, but allows us - // to initialize all members of g_D until we can fill in the missing - // initialization code with legal C++ code. - - for (intp = (int *) &g_E, ival = 21; - intp < ((int *) &g_E + sizeof (g_E) / sizeof (int)); - intp++, ival++) - { - *intp = ival; - } - - // Overlay the nonportable initialization with legal initialization. - - // ????? = 21; (g_E.A::a = 21; is ambiguous) - // ????? = 22; (g_E.A::x = 22; is ambiguous) - g_E.B::b = 23; - g_E.B::x = 24; - // ????? = 25; - // ????? = 26; - g_E.C::c = 27; - g_E.C::x = 28; - g_E.D::d = 29; - g_E.D::x = 30; - g_E.E::e = 31; - g_E.E::x = 32; - - g_anon_union.one = 1; - g_anon_union.a = 2; - - inheritance2 (); -} - -// ======================== static member functions ===================== - -class Static { -public: - static void ii(int, int); -}; -void Static::ii (int, int) { } - -// ======================== virtual base classes========================= - -class vA { - public: - int va; - int vx; -}; - -vA g_vA; - -class vB : public virtual vA { - public: - int vb; - int vx; -}; - -vB g_vB; - -class vC : public virtual vA { - public: - int vc; - int vx; -}; - -vC g_vC; - -class vD : public virtual vB, public virtual vC { - public: - int vd; - int vx; -}; - -vD g_vD; - -class vE : public virtual vD { - public: - int ve; - int vx; -}; - -vE g_vE; - -void inheritance4 (void) -{ -} - -void inheritance3 (void) -{ - int ival; - int *intp; - - // {vA::va, vA::vx} - - g_vA.vA::va = 1; - g_vA.vA::vx = 2; - - // {{vA::va, vA::vx}, vB::vb, vB::vx} - - g_vB.vA::va = 3; - g_vB.vA::vx = 4; - g_vB.vB::vb = 5; - g_vB.vB::vx = 6; - - // {{vA::va, vA::vx}, vC::vc, vC::vx} - - g_vC.vA::va = 7; - g_vC.vA::vx = 8; - g_vC.vC::vc = 9; - g_vC.vC::vx = 10; - - // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx} - - g_vD.vA::va = 11; - g_vD.vA::vx = 12; - g_vD.vB::vb = 13; - g_vD.vB::vx = 14; - g_vD.vC::vc = 15; - g_vD.vC::vx = 16; - g_vD.vD::vd = 17; - g_vD.vD::vx = 18; - - - // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx} - - g_vD.vA::va = 19; - g_vD.vA::vx = 20; - g_vD.vB::vb = 21; - g_vD.vB::vx = 22; - g_vD.vC::vc = 23; - g_vD.vC::vx = 24; - g_vD.vD::vd = 25; - g_vD.vD::vx = 26; - g_vE.vE::ve = 27; - g_vE.vE::vx = 28; - - inheritance4 (); -} - -// ====================================================================== - -class Base1 { - public: - int x; - Base1(int i) { x = i; } -}; - -class Foo -{ - public: - int x; - int y; - static int st; - Foo (int i, int j) { x = i; y = j; } - int operator! (); - operator int (); - int times (int y); -}; - -class Bar : public Base1, public Foo { - public: - int z; - Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; } -}; - -int Foo::operator! () { return !x; } - -int Foo::times (int y) { return x * y; } - -int Foo::st = 100; - -Foo::operator int() { return x; } - -Foo foo(10, 11); -Bar bar(20, 21, 22); - -class ClassWithEnum { -public: - enum PrivEnum { red, green, blue, yellow = 42 }; - PrivEnum priv_enum; - int x; -}; - -void enums2 (void) -{ -} - -/* classes.exp relies on statement order in this function for testing - enumeration fields. */ - -void enums1 () -{ - ClassWithEnum obj_with_enum; - obj_with_enum.priv_enum = ClassWithEnum::red; - obj_with_enum.x = 0; - enums2 (); - obj_with_enum.priv_enum = ClassWithEnum::green; -} - -class ClassParam { -public: - int Aptr_a (A *a) { return a->a; } - int Aptr_x (A *a) { return a->x; } - int Aref_a (A &a) { return a.a; } - int Aref_x (A &a) { return a.x; } - int Aval_a (A a) { return a.a; } - int Aval_x (A a) { return a.x; } -}; - -ClassParam class_param; - -class Contains_static_instance -{ - public: - int x; - int y; - Contains_static_instance (int i, int j) { x = i; y = j; } - static Contains_static_instance null; -}; - -Contains_static_instance Contains_static_instance::null(0,0); -Contains_static_instance csi(10,20); - -class Contains_nested_static_instance -{ - public: - class Nested - { - public: - Nested(int i) : z(i) {} - int z; - static Contains_nested_static_instance xx; - }; - - Contains_nested_static_instance(int i, int j) : x(i), y(j) {} - - int x; - int y; - - static Contains_nested_static_instance null; - static Nested yy; -}; - -Contains_nested_static_instance Contains_nested_static_instance::null(0, 0); -Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5); -Contains_nested_static_instance - Contains_nested_static_instance::Nested::xx(1,2); -Contains_nested_static_instance cnsi(30,40); - -typedef struct { - int one; - int two; -} tagless_struct; -tagless_struct v_tagless; - -/* Try to get the compiler to allocate a class in a register. */ -class small { - public: - int x; - int method (); -}; - -int -small::method () -{ - return x + 5; -} - -void marker_reg1 () {} - -int -register_class () -{ - /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220 - might put this variable in a register. This is a lose, though, because - it means that GDB can't call any methods for that variable. */ - register small v; - - int i; - - /* Perform a computation sufficiently complicated that optimizing compilers - won't optimized out the variable. If some compiler constant-folds this - whole loop, maybe using a parameter to this function here would help. */ - v.x = 0; - for (i = 0; i < 13; ++i) - v.x += i; - --v.x; /* v.x is now 77 */ - marker_reg1 (); - return v.x + 5; -} - -void dummy() -{ - v_bool = true; - v_bool_array[0] = false; - v_bool_array[1] = v_bool; -} - -void use_methods () -{ - /* Refer to methods so that they don't get optimized away. */ - int i; - i = class_param.Aptr_a (&g_A); - i = class_param.Aptr_x (&g_A); - i = class_param.Aref_a (g_A); - i = class_param.Aref_x (g_A); - i = class_param.Aval_a (g_A); - i = class_param.Aval_x (g_A); -} - - -int -main() -{ -#ifdef usestubs - set_debug_traps(); - breakpoint(); -#endif - dummy(); - inheritance1 (); - inheritance3 (); - enums1 (); - register_class (); - - /* FIXME: pmi gets optimized out. Need to do some more computation with - it or something. (No one notices, because the test is xfail'd anyway, - but that probably won't always be true...). */ - int Foo::* pmi = &Foo::y; - - /* Make sure the AIX linker doesn't remove the variable. */ - v_tagless.one = 5; - - use_methods (); - - return foo.*pmi; -} - -/* Create an instance for some classes, otherwise they get optimized away. */ - -default_public_struct default_public_s; -explicit_public_struct explicit_public_s; -protected_struct protected_s; -private_struct private_s; -mixed_protection_struct mixed_protection_s; -public_class public_c; -protected_class protected_c; -default_private_class default_private_c; -explicit_private_class explicit_private_c; -mixed_protection_class mixed_protection_c; diff --git a/gdb/testsuite/gdb.c++/misc.exp b/gdb/testsuite/gdb.c++/misc.exp deleted file mode 100644 index a2d122f..0000000 --- a/gdb/testsuite/gdb.c++/misc.exp +++ /dev/null @@ -1,159 +0,0 @@ -# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2002 Free Software -# Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -set testfile "misc" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# -# Deduce language of main() -# - -proc deduce_language_of_main {} { - global gdb_prompt - - # See what language gdb thinks main() is, prior to reading full symbols. - # I think this fails for COFF targets. - send_gdb "show language\n" - gdb_expect { - -re ".* source language is \"auto; currently c\[+\]+\".*$gdb_prompt $" { - pass "deduced language is C++, before full symbols" - } - -re ".*$gdb_prompt $" { - fail "source language not correct for C++ (psymtabs only)" - return - } - timeout { - fail "can't show language (timeout)" - return - } - } - - runto_main - - # See if our idea of the language has changed. - - send_gdb "show language\n" - gdb_expect { - -re ".* source language is \"auto; currently c\[+\]+\".*$gdb_prompt $" { - pass "deduced language is C++, after full symbols" - } - -re ".*$gdb_prompt $" { - fail "source language not correct for C++ (full symbols)" - return - } - timeout { - fail "can't show language (timeout)" - return - } - } -} - -proc test_expr { args } { - if { [llength $args] % 2 } { - warning "an even # of arguments should be passed to test_expr" - } - set last_ent [expr [llength $args] - 1]; - set testname [lindex $args $last_ent]; - if [gdb_test [lindex $args 0] "" "$testname (setup)"] { - gdb_suppress_tests; - } - for {set x 1} {$x < $last_ent} {set x [expr $x + 2]} { - if [gdb_test [lindex $args $x] [lindex $args [expr $x + 1]] "$testname ([lindex $args $x])"] { - gdb_suppress_tests; - } - } - gdb_stop_suppressing_tests; -} - -proc do_tests {} { - global prms_id - global bug_id - global subdir - global objdir - global srcdir - global binfile - global gdb_prompt - - set prms_id 0 - set bug_id 0 - - # Start with a fresh gdb. - - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - - deduce_language_of_main - # Check for fixes for PRs 8916 and 8630 - gdb_test "print s.a" ".* = 0" "print s.a for foo struct (known gcc 2.7.2 and earlier bug)" -} - -do_tests - -test_expr "set language c++" \ - "print 1 == 1" "print.*\\$\[0-9\]* = true" \ - "print 1 == 2" "print.*\\$\[0-9\]* = false" \ - "print as bool" - -# Test bool type printing, etc. -# Note: Language is already set to C++ above! -gdb_test "print v_bool" "\\$\[0-9\]* = false" "print a bool var" - -# set a bool variable -test_expr "set variable v_bool = true" \ - "print v_bool" "\\$\[0-9\]* = true" \ - "set a bool var" - -# next print an array of bool -gdb_test "print v_bool_array" "\\$\[0-9\]* = \\{false, false\\}" "print a bool array" - -# set elements of a bool array -test_expr "set variable v_bool_array\[1\] = true" \ - "print v_bool_array" "\\$\[0-9\]* = \\{false, true\\}" \ - "set a bool array elem" - -# bool constants -gdb_test "print true" "\\$\[0-9\]* = true" "print true" -gdb_test "print false" "\\$\[0-9\]* = false" "print false" - -# arithmetic conversions -gdb_test "print 1 + true" "\\$\[0-9\]* = 2" "1 + true" -gdb_test "print 3 + false" "\\$\[0-9\]* = 3" "3 + false" -gdb_test "print 1 < 2 < 3" "\\$\[0-9\]* = true" "1 < 2 < 3" -gdb_test "print 2 < 1 > 4" "\\$\[0-9\]* = false" "2 < 1 > 4" -gdb_test "print (bool)43" "\\$\[0-9\]* = true" "(bool)43" -gdb_test "print (bool)0" "\\$\[0-9\]* = false" "(bool)0" -gdb_test "print (bool)17.93" "\\$\[0-9\]* = true" "(bool)17.93" -gdb_test "print (bool)0.0" "\\$\[0-9\]* = false" "(bool)0.0" -gdb_test "print (int)true" "\\$\[0-9\]* = 1" "(int)true" -gdb_test "print (int)false" "\\$\[0-9\]* = 0" "(int)false" diff --git a/gdb/testsuite/gdb.c++/namespace.cc b/gdb/testsuite/gdb.c++/namespace.cc deleted file mode 100644 index 7b9a173..0000000 --- a/gdb/testsuite/gdb.c++/namespace.cc +++ /dev/null @@ -1,163 +0,0 @@ -namespace AAA { - char c; - int i; - int A_xyzq (int); - char xyzq (char); - class inA { - public: - int xx; - int fum (int); - }; -}; - -int AAA::inA::fum (int i) -{ - return 10 + i; -} - -namespace BBB { - char c; - int i; - int B_xyzq (int); - char xyzq (char); - - namespace CCC { - char xyzq (char); - }; - - class Class { - public: - char xyzq (char); - int dummy; - }; -}; - -int AAA::A_xyzq (int x) -{ - return 2 * x; -} - -char AAA::xyzq (char c) -{ - return 'a'; -} - - -int BBB::B_xyzq (int x) -{ - return 3 * x; -} - -char BBB::xyzq (char c) -{ - return 'b'; -} - -char BBB::CCC::xyzq (char c) -{ - return 'z'; -} - -char BBB::Class::xyzq (char c) -{ - return 'o'; -} - -void marker1(void) -{ - return; -} - -namespace -{ - int X = 9; - - namespace G - { - int Xg = 10; - } -} - -namespace C -{ - int c = 1; - int shadow = 12; - - namespace - { - int cX = 6; - - namespace F - { - int cXf = 7; - } - } - - namespace C - { - int cc = 2; - } - - namespace D - { - int cd = 3; - int shadow = 13; - - namespace E - { - int cde = 5; - } - - void marker2 (void) - { - // NOTE: carlton/2003-04-23: I'm listing the expressions that I - // plan to have GDB try to print out, just to make sure that the - // compiler and I agree which ones should be legal! It's easy - // to screw up when testing the boundaries of namespace stuff. - c; - //cc; - C::cc; - cd; - E::cde; - shadow; - cX; - F::cXf; - X; - G::Xg; - //cXOtherFile; - //XOtherFile; - - return; - } - - } -} - -int main () -{ - using AAA::inA; - char c1; - - using namespace BBB; - - c1 = xyzq ('x'); - c1 = AAA::xyzq ('x'); - c1 = BBB::CCC::xyzq ('m'); - - inA ina; - - ina.xx = 33; - - int y; - - y = AAA::A_xyzq (33); - y += B_xyzq (44); - - BBB::Class cl; - - c1 = cl.xyzq('e'); - - marker1(); - - C::D::marker2 (); -} diff --git a/gdb/testsuite/gdb.c++/namespace.exp b/gdb/testsuite/gdb.c++/namespace.exp deleted file mode 100644 index f4efaf6..0000000 --- a/gdb/testsuite/gdb.c++/namespace.exp +++ /dev/null @@ -1,219 +0,0 @@ -# Copyright 1997, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# tests for namespaces -# Written by Satish Pai 1997-07-23 - -# This file is part of the gdb testsuite - -# Note: These tests are geared to the HP aCC compiler, -# which has an idiosyncratic way of emitting debug info -# for namespaces. -# Note: As of 2000-06-03, these pass under g++ - djb - - -if $tracelevel then { - strace $tracelevel - } - -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "namespace" -set srcfile ${testfile}.cc -set objfile ${objdir}/${subdir}/${testfile}.o -set srcfile1 ${testfile}1.cc -set objfile1 ${objdir}/${subdir}/${testfile}1.o -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile}] { - return -1; -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${objfile1}" object {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${objfile} ${objfile1}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -# -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -if ![runto 'marker1'] then { - perror "couldn't run to marker1" - continue -} - -gdb_test "up" ".*main.*" "up from marker1" - -# Access a data item inside a namespace using colons and -# single quotes :-( - -send_gdb "print 'AAA::c'\n" -gdb_expect { - -re "\\$\[0-9\]* = 0 '\\\\(0|000)'\r\n$gdb_prompt $" { pass "print 'AAA::c'" } - -re ".*$gdb_prompt $" { fail "print 'AAA::c'" } - timeout { fail "(timeout) print 'AAA::c'" } -} - -# An object declared using "using". - -send_gdb "print ina\n" -gdb_expect { - -re "\\$\[0-9\]+ = {xx = 33}.*$gdb_prompt $" { - pass "print ina" - } - -re ".*$gdb_prompt $" { fail "print ina" } - timeout { fail "(timeout) print ina" } -} - -send_gdb "ptype ina\n" -gdb_expect { - -re "type = class (AAA::|)inA \{\r\n\[ \]*public:\r\n\[ \]*int xx;\r\n\[ \]*\r\n\[ \]*.*int fum\\(int\\);\r\n\}\r\n$gdb_prompt $" { - pass "ptype ina" - } - -re ".*$gdb_prompt $" { fail "ptype ina" } - timeout { fail "(timeout) ptype ina" } -} - -# Check all functions are known to GDB - -setup_xfail hppa*-*-*11* CLLbs14869 -send_gdb "info func xyzq\n" -gdb_expect { - -re "All functions.*File.*namespace.cc:\r\nint AAA::A_xyzq\\(int\\);\r\nint BBB::B_xyzq\\(int\\);\r\nchar AAA::xyzq\\(char\\);\r\nchar BBB::xyzq\\(char\\);\r\nchar BBB::CCC::xyzq\\(char\\);\r\nchar BBB::Class::xyzq\\(char\\);\r\n$gdb_prompt $" { - pass "info func xyzq" - } - -re "All functions.*File.*namespace.cc:\r\nint AAA::A_xyzq\\(int\\);\r\nchar AAA::xyzq\\(char\\);\r\nint BBB::B_xyzq\\(int\\);\r\nchar BBB::CCC::xyzq\\(char\\);\r\nchar BBB::Class::xyzq\\(char\\);\r\nchar BBB::xyzq\\(char\\);\r\n$gdb_prompt $" { - pass "info func xyzq" - } - -re ".*$gdb_prompt $" { fail "info func xyzq" } - timeout { fail "(timeout) info func xyzq" } -} - -# Call a function in a namespace - -send_gdb "print 'AAA::xyzq'('x')\n" -gdb_expect { - -re "\\$\[0-9\]* = 97 'a'\r\n$gdb_prompt $" { - pass "print 'AAA::xyzq'('x')" - } - -re ".*$gdb_prompt $" { fail "print 'AAA::xyzq'('x')" } - timeout { fail "(timeout) print 'AAA::xyzq'('x')" } -} - -# Break on a function in a namespace - -send_gdb "break AAA::xyzq\n" -gdb_expect { - -re "Breakpoint.*at $hex: file.*namespace.cc, line 42\\.\r\n$gdb_prompt $" { - pass "break AAA::xyzq" - } - -re ".*$gdb_prompt $" { fail "break AAA::xyzq" } - timeout { fail "(timeout) break AAA::xyzq" } -} - -# Call a function in a nested namespace - -send_gdb "print 'BBB::CCC::xyzq'('x')\n" -gdb_expect { - -re "\\$\[0-9\]* = 122 'z'\r\n$gdb_prompt $" { - pass "print 'BBB::CCC::xyzq'('x')" - } - -re ".*$gdb_prompt $" { fail "print 'BBB::CCC::xyzq'('x')" } - timeout { fail "(timeout) print 'BBB::CCC::xyzq'('x')" } -} - -# Break on a function in a nested namespace - -send_gdb "break BBB::CCC::xyzq\n" -gdb_expect { - -re "Breakpoint.*at $hex: file.*namespace.cc, line 58\\.\r\n$gdb_prompt $" { - pass "break BBB::CCC::xyzq" - } - -re ".*$gdb_prompt $" { fail "break BBB::CCC::xyzq" } - timeout { fail "(timeout) break BBB::CCC::xyzq" } -} - -# Print address of a function in a class in a namespace - -send_gdb "print 'BBB::Class::xyzq'\n" -gdb_expect { - -re "\\$\[0-9\]* = \{char \\((BBB::|)Class \\*( const|), (char|int)\\)\} $hex \r\n$gdb_prompt $" { - pass "print 'BBB::Class::xyzq'" - } - -re ".*$gdb_prompt $" { fail "print 'BBB::Class::xyzq'" } - timeout { fail "(timeout) print 'BBB::Class::xyzq'" } -} - -# Break on a function in a class in a namespace - -send_gdb "break BBB::Class::xyzq\n" -gdb_expect { - -re "Breakpoint.*at $hex: file.*namespace.cc, line 63\\.\r\n$gdb_prompt $" { - pass "break BBB::Class::xyzq" - } - -re ".*$gdb_prompt $" { fail "break BBB::Class::xyzq" } - timeout { fail "(timeout) break BBB::Class::xyzq" } -} - -# Test to see if the appropriate namespaces are in scope when trying -# to print out stuff from within a function defined within a -# namespace. - -if ![runto "C::D::marker2"] then { - perror "couldn't run to marker2" - continue -} - -gdb_test "print c" "\\$\[0-9\].* = 1" -gdb_test "print cc" "No symbol \"cc\" in current context." -gdb_test "print 'C::cc'" "\\$\[0-9\].* = 2" -gdb_test "print cd" "\\$\[0-9\].* = 3" -gdb_test "print 'E::cde'" "\\$\[0-9\].* = 5" -gdb_test "print shadow" "\\$\[0-9\].* = 13" -gdb_test "print cOtherFile" "\\$\[0-9\].* = 316" - -# Some anonymous namespace tests. - -gdb_test "print cX" "\\$\[0-9\].* = 6" -gdb_test "print 'F::cXf'" "\\$\[0-9\].* = 7" -gdb_test "print X" "\\$\[0-9\].* = 9" -gdb_test "print 'G::Xg'" "\\$\[0-9\].* = 10" -gdb_test "print cXOtherFile" "No symbol \"cXOtherFile\" in current context." -gdb_test "print XOtherFile" "No symbol \"XOtherFile\" in current context." diff --git a/gdb/testsuite/gdb.c++/namespace1.cc b/gdb/testsuite/gdb.c++/namespace1.cc deleted file mode 100644 index 4a5900a..0000000 --- a/gdb/testsuite/gdb.c++/namespace1.cc +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright 2003 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Please email any bugs, comments, and/or additions to this file to: - bug-gdb@prep.ai.mit.edu */ - -namespace C -{ - namespace { - int cXOtherFile = 29; - }; - - int cOtherFile = 316; -} - -namespace { - int XOtherFile = 317; -} diff --git a/gdb/testsuite/gdb.c++/overload.cc b/gdb/testsuite/gdb.c++/overload.cc deleted file mode 100644 index 56afc96..0000000 --- a/gdb/testsuite/gdb.c++/overload.cc +++ /dev/null @@ -1,168 +0,0 @@ -#include - -class foo { -public: - foo (int); - foo (int, const char *); - foo (foo&); - ~foo (); - void foofunc (int); - void foofunc (int, signed char *); - int ifoo; - const char *ccpfoo; - -int overload1arg (void); -int overload1arg (char); -int overload1arg (signed char); -int overload1arg (unsigned char); -int overload1arg (short); -int overload1arg (unsigned short); -int overload1arg (int); -int overload1arg (unsigned int); -int overload1arg (long); -int overload1arg (unsigned long); -int overload1arg (float); -int overload1arg (double); - -int overloadfnarg (void); -int overloadfnarg (int); -int overloadfnarg (int, int (*) (int)); - -int overloadargs (int a1); -int overloadargs (int a1, int a2); -int overloadargs (int a1, int a2, int a3); -int overloadargs (int a1, int a2, int a3, int a4); -int overloadargs (int a1, int a2, int a3, int a4, int a5); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10, int a11); - - -}; - -int intToChar (char c) -{ - return 297; -} - -void marker1() -{} - -int main () -{ - char arg2 = 2; - signed char arg3 =3; - unsigned char arg4 =4; - short arg5 =5; - unsigned short arg6 =6; - int arg7 =7; - unsigned int arg8 =8; - long arg9 =9; - unsigned long arg10 =10; - float arg11 =100.0; - double arg12 = 200.0; - - char *str = (char *) "A"; - foo foo_instance1(111); - foo foo_instance2(222, str); - foo foo_instance3(foo_instance2); - - #ifdef usestubs - set_debug_traps(); - breakpoint(); - #endif - - // Verify that intToChar should work: - intToChar(1); - - marker1(); // marker1-returns-here - return 0; // marker1-returns-here -} - -foo::foo (int i) { ifoo = i; ccpfoo = NULL; } -foo::foo (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; } -foo::foo (foo& afoo) { ifoo = afoo.ifoo; ccpfoo = afoo.ccpfoo;} -foo::~foo () {} - - -/* Some functions to test overloading by varying one argument type. */ - -int foo::overload1arg (void) { return 1; } -int foo::overload1arg (char arg) { arg = 0; return 2;} -int foo::overload1arg (signed char arg) { arg = 0; return 3;} -int foo::overload1arg (unsigned char arg) { arg = 0; return 4;} -int foo::overload1arg (short arg) { arg = 0; return 5;} -int foo::overload1arg (unsigned short arg) { arg = 0; return 6;} -int foo::overload1arg (int arg) { arg = 0; return 7;} -int foo::overload1arg (unsigned int arg) { arg = 0; return 8;} -int foo::overload1arg (long arg) { arg = 0; return 9;} -int foo::overload1arg (unsigned long arg) { arg = 0; return 10;} -int foo::overload1arg (float arg) { arg = 0; return 11;} -int foo::overload1arg (double arg) { arg = 0; return 12;} - -/* Test to see that we can explicitly request overloaded functions - with function pointers in the prototype. */ - -int foo::overloadfnarg (void) { return ifoo * 20; } -int foo::overloadfnarg (int arg) { arg = 0; return 13;} -int foo::overloadfnarg (int arg, int (*foo) (int)) { return foo(arg); } - -/* Some functions to test overloading by varying argument count. */ - -int foo::overloadargs (int a1) -{ a1 = 0; -return 1;} - -int foo::overloadargs (int a1, int a2) -{ a1 = a2 = 0; -return 2;} - -int foo::overloadargs (int a1, int a2, int a3) -{ a1 = a2 = a3 = 0; -return 3;} - -int foo::overloadargs (int a1, int a2, int a3, int a4) -{ a1 = a2 = a3 = a4 = 0; -return 4;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5) -{ a1 = a2 = a3 = a4 = a5 = 0; -return 5;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6) -{ a1 = a2 = a3 = a4 = a5 = a6 = 0; -return 6;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7) -{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; -return 7;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8) -{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; -return 8;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9) -{ - a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; - return 9; -} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = - a10 = 0; return 10;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10, int a11) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = - a10 = a11 = 0; return 11;} - - - diff --git a/gdb/testsuite/gdb.c++/overload.exp b/gdb/testsuite/gdb.c++/overload.exp deleted file mode 100644 index 3e14678..0000000 --- a/gdb/testsuite/gdb.c++/overload.exp +++ /dev/null @@ -1,400 +0,0 @@ -# Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# written by Elena Zannoni (ezannoni@cygnus.com) - -# This file is part of the gdb testsuite -# -# tests for overloaded member functions. Command Line calls -# - - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "overload" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -if ![runto 'marker1'] then { - perror "couldn't run to marker1" - continue -} - -gdb_test "up" ".*main.*" "up from marker1" - -send_gdb "print foo_instance1\n" -gdb_expect { - -re ".\[0-9\]* = \{ifoo = 111, ccpfoo = 0x0\}\r\n$gdb_prompt $" { - pass "print foo_instance1" - } - -re ".*$gdb_prompt $" { fail "print foo_instance1" } - timeout { fail "(timeout) print foo_instance1" } - } - - -setup_xfail "hppa*-*-*" CLLbs16901 -send_gdb "ptype foo_instance1\n" -gdb_expect { - -re "type = class foo \{.*public:.*int ifoo;.*const char \\*ccpfoo;.*foo\\(int\\);.*foo\\(int, (const char|char const) \\*\\);.*foo\\(foo &\\);.*~foo\\(void\\);.*void foofunc\\(int\\);.*void foofunc\\(int, signed char \\*\\);.*int overload1arg\\(void\\);.*int overload1arg\\(char\\);.*int overload1arg\\(signed char\\);.*int overload1arg\\(unsigned char\\);.*int overload1arg\\(short\\);.*int overload1arg\\(unsigned short\\);.*int overload1arg\\(int\\);.*int overload1arg\\(unsigned int\\);.*int overload1arg\\(long\\);.*int overload1arg\\(unsigned long\\);.*int overload1arg\\(float\\);.*int overload1arg\\(double\\);.*int overloadargs\\(int\\);.*int overloadargs\\(int, int\\);.*int overloadargs\\(int, int, int\\);.*int overloadargs\\(int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int, int, int, int\\);\r\n\}\r\n$gdb_prompt $" { - pass "ptype foo_instance1 (HP aCC -- known quirk with ~foo parameter list)" - } - -re "type = class foo .*int overloadargs\\(int, int, int, int, int, int, int, int, int, int, int\\);\r\n\}\r\n$gdb_prompt $" { - pass "ptype foo_instance1 (shorter match)" - } - -re ".*$gdb_prompt $" { fail "ptype foo_instance1" } - timeout { fail "(timeout) ptype foo_instance1" } - } - -send_gdb "print foo_instance2\n" -gdb_expect { - -re ".\[0-9\]* = \{ifoo = 222, ccpfoo = $hex \"A\"\}\r\n$gdb_prompt $" { - pass "print foo_instance2" - } - -re ".*$gdb_prompt $" { fail "print foo_instance2" } - timeout { fail "(timeout) print foo_instance2" } - } - -send_gdb "print foo_instance3\n" -gdb_expect { - -re ".\[0-9\]* = \{ifoo = 222, ccpfoo = $hex \"A\"\}\r\n$gdb_prompt $" { - pass "print foo_instance3" - } - -re ".*$gdb_prompt $" { fail "print foo_instance3" } - timeout { fail "(timeout) print foo_instance3" } - } - - -send_gdb "print foo_instance1.overloadargs(1)\n" -gdb_expect { - -re ".\[0-9\]* = 1\r\n$gdb_prompt $" { - pass "print call overloaded func 1 arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 1 arg" } - timeout { fail "(timeout) print call overloaded func 1 arg" } - } - - -# If GDB fails to restore the selected frame properly after the -# inferior function call above (see GDB PR 1155 for an explanation of -# why this might happen), all the subsequent tests will fail. We -# should detect and report that failure, but let the marker call -# finish so that the rest of the tests can run undisturbed. -gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" { - -re "#0 marker1.*$gdb_prompt $" { - setup_kfail "gdb/1155" s390-*-linux-gnu - fail "re-selected 'main' frame after inferior call" - gdb_test "finish" ".*main.*at .*overload.cc:.*// marker1-returns-here.*" \ - "finish call to marker1" - } - -re "#1 ($hex in )?main.*$gdb_prompt $" { - pass "re-selected 'main' frame after inferior call" - } -} - - -send_gdb "print foo_instance1.overloadargs(1, 2)\n" -gdb_expect { - -re ".\[0-9\]* = 2\r\n$gdb_prompt $" { - pass "print call overloaded func 2 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 2 args" } - timeout { fail "(timeout) print call overloaded func 2 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3)\n" -gdb_expect { - -re ".\[0-9\]* = 3\r\n$gdb_prompt $" { - pass "print call overloaded func 3 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 3 args" } - timeout { fail "(timeout) print call overloaded func 3 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4)\n" -gdb_expect { - -re ".\[0-9\]* = 4\r\n$gdb_prompt $" { - pass "print call overloaded func 4 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 4 args" } - timeout { fail "(timeout) print call overloaded func 4 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5)\n" -gdb_expect { - -re ".\[0-9\]* = 5\r\n$gdb_prompt $" { - pass "print call overloaded func 5 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 5 args" } - timeout { fail "(timeout) print call overloaded func 5 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6)\n" -gdb_expect { - -re ".\[0-9\]* = 6\r\n$gdb_prompt $" { - pass "print call overloaded func 6 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 6 args" } - timeout { fail "(timeout) print call overloaded func 6 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7)\n" -gdb_expect { - -re ".\[0-9\]* = 7\r\n$gdb_prompt $" { - pass "print call overloaded func 7 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 7 args" } - timeout { fail "(timeout) print call overloaded func 7 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8)\n" -gdb_expect { - -re ".\[0-9\]* = 8\r\n$gdb_prompt $" { - pass "print call overloaded func 8 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 8 args" } - timeout { fail "(timeout) print call overloaded func 8 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" -gdb_expect { - -re ".\[0-9\]* = 9\r\n$gdb_prompt $" { - pass "print call overloaded func 9 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 9 args" } - timeout { fail "(timeout) print call overloaded func 9 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n" -gdb_expect { - -re ".\[0-9\]* = 10\r\n$gdb_prompt $" { - pass "print call overloaded func 10 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 10 args" } - timeout { fail "(timeout) print call overloaded func 10 args" } - } - - -send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)\n" -gdb_expect { - -re ".\[0-9\]* = 11\r\n$gdb_prompt $" { - pass "print call overloaded func 11 args" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func 11 args" } - timeout { fail "(timeout) print call overloaded func 11 args" } - } - - -send_gdb "print foo_instance1.overload1arg()\n" -gdb_expect { - -re ".\[0-9\]* = 1\r\n$gdb_prompt $" { - pass "print call overloaded func void arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func void arg" } - timeout { fail "(timeout) print call overloaded func void arg" } - } - - -send_gdb "print foo_instance1.overload1arg((char)arg2)\n" -gdb_expect { - -re ".\[0-9\]* = 2\r\n$gdb_prompt $" { - pass "print call overloaded func char arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func char arg" } - timeout { fail "(timeout) print call overloaded func char arg" } - } - - -send_gdb "print foo_instance1.overload1arg((signed char)arg3)\n" -gdb_expect { - -re ".\[0-9\]* = 3\r\n$gdb_prompt $" { - pass "print call overloaded func signed char arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func signed char arg" } - timeout { fail "(timeout) print call overloaded func signed char arg" } - } - - -send_gdb "print foo_instance1.overload1arg((unsigned char)arg4)\n" -gdb_expect { - -re ".\[0-9\]* = 4\r\n$gdb_prompt $" { - pass "print call overloaded func unsigned char arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned char arg" } - timeout { fail "(timeout) print call overloaded func unsigned char arg" } - } - - -send_gdb "print foo_instance1.overload1arg((short)arg5)\n" -gdb_expect { - -re ".\[0-9\]* = 5\r\n$gdb_prompt $" { - pass "print call overloaded func short arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func short arg" } - timeout { fail "(timeout) print call overloaded func short arg" } - } - - -send_gdb "print foo_instance1.overload1arg((unsigned short)arg6)\n" -gdb_expect { - -re ".\[0-9\]* = 6\r\n$gdb_prompt $" { - pass "print call overloaded func unsigned short arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned short arg" } - timeout { fail "(timeout) print call overloaded func unsigned short arg" } - } - - -send_gdb "print foo_instance1.overload1arg((int)arg7)\n" -gdb_expect { - -re ".\[0-9\]* = 7\r\n$gdb_prompt $" { - pass "print call overloaded func int arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func int arg" } - timeout { fail "(timeout) print call overloaded func int arg" } - } - - -send_gdb "print foo_instance1.overload1arg((unsigned int)arg8)\n" -gdb_expect { - -re ".\[0-9\]* = 8\r\n$gdb_prompt $" { - pass "print call overloaded func unsigned int arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned int arg" } - timeout { fail "(timeout) print call overloaded func unsigned int arg" } - } - - -send_gdb "print foo_instance1.overload1arg((long)arg9)\n" -gdb_expect { - -re ".\[0-9\]* = 9\r\n$gdb_prompt $" { - pass "print call overloaded func long arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func long arg" } - timeout { fail "(timeout) print call overloaded func long arg" } - } - - -send_gdb "print foo_instance1.overload1arg((unsigned long)arg10)\n" -gdb_expect { - -re ".\[0-9\]* = 10\r\n$gdb_prompt $" { - pass "print call overloaded func unsigned long arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned long arg" } - timeout { fail "(timeout) print call overloaded func unsigned long arg" } - } - - -send_gdb "print foo_instance1.overload1arg((float)arg11)\n" -gdb_expect { - -re ".\[0-9\]* = 11\r\n$gdb_prompt $" { - pass "print call overloaded func float arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func float arg" } - timeout { fail "(timeout) print call overloaded func float arg" } - } - - -send_gdb "print foo_instance1.overload1arg((double)arg12)\n" -gdb_expect { - -re ".\[0-9\]* = 12\r\n$gdb_prompt $" { - pass "print call overloaded func double arg" - } - -re ".*$gdb_prompt $" { fail "print call overloaded func double arg" } - timeout { fail "(timeout) print call overloaded func double arg" } - } - -# Now some tests to see if we can list overloaded functions properly: - -gdb_test "set listsize 1" "" "" -# send_gdb "set listsize 1\n" -# gdb_expect -re ".*$gdb_prompt $" - -# -# Decide whether to use "()" or "(void)" -# - -send_gdb "info func overloadfnarg\n" -gdb_expect { - -re ".*overloadfnarg\\(void\\).*$gdb_prompt $" { - gdb_test "list foo::overloadfnarg(void)"\ - ".*int foo::overloadfnarg.*\\(void\\).*" \ - "list overloaded function with no args" - } - -re ".*overloadfnarg\\(\\).*$gdb_prompt $" { - gdb_test "list foo::overloadfnarg()"\ - ".*int foo::overloadfnarg.*\\(void\\).*" \ - "list overloaded function with no args" - } - -re ".*$gdb_prompt $" { - fail "list overloaded function with no args (no matching symbol)" - } -} - -gdb_test "list foo::overloadfnarg(int)"\ - "int foo::overloadfnarg.*\\(int arg\\).*" \ - "list overloaded function with int arg" - -gdb_test "list foo::overloadfnarg(int, int (*)(int))" \ - "int foo::overloadfnarg.*\\(int arg, int \\(\\*foo\\) \\(int\\)\\).*" \ - "list overloaded function with function ptr args" - -# This one crashes GDB. Don't know why yet. -gdb_test "list \"foo::overloadfnarg(int, int (*)(int))\"" \ - "int foo::overloadfnarg.*\\(int arg, int \\(\\*foo\\) \\(int\\)\\).*" \ - "list overloaded function with function ptr args - quotes around argument" - -gdb_test "print intToChar(1)" ".\[0-9\]* = 297" diff --git a/gdb/testsuite/gdb.c++/ovldbreak.cc b/gdb/testsuite/gdb.c++/ovldbreak.cc deleted file mode 100644 index 9a5b5cb..0000000 --- a/gdb/testsuite/gdb.c++/ovldbreak.cc +++ /dev/null @@ -1,177 +0,0 @@ -#include - -class foo { -public: - foo (int); - foo (int, const char *); - foo (foo&); - ~foo (); - void foofunc (int); - void foofunc (int, signed char *); - int ifoo; - const char *ccpfoo; - -int overload1arg (void); -int overload1arg (char); -int overload1arg (signed char); -int overload1arg (unsigned char); -int overload1arg (short); -int overload1arg (unsigned short); -int overload1arg (int); -int overload1arg (unsigned int); -int overload1arg (long); -int overload1arg (unsigned long); -int overload1arg (float); -int overload1arg (double); - -int overloadargs (int a1); -int overloadargs (int a1, int a2); -int overloadargs (int a1, int a2, int a3); -int overloadargs (int a1, int a2, int a3, int a4); -int overloadargs (int a1, int a2, int a3, int a4, int a5); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10); -int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10, int a11); - - -}; - -void marker1() -{} - -int main () -{ - char arg2 = 2; - signed char arg3 =3; - unsigned char arg4 =4; - short arg5 =5; - unsigned short arg6 =6; - int arg7 =7; - unsigned int arg8 =8; - long arg9 =9; - unsigned long arg10 =10; - float arg11 =100.0; - double arg12 = 200.0; - - char ch='A'; - foo foo_instance1(111); - foo foo_instance2(222, &ch); - foo foo_instance3(foo_instance2); - - foo_instance1.overload1arg(); - foo_instance1.overload1arg(arg2); - foo_instance1.overload1arg(arg3); - foo_instance1.overload1arg(arg4); - foo_instance1.overload1arg(arg5); - foo_instance1.overload1arg(arg6); - foo_instance1.overload1arg(arg7); - foo_instance1.overload1arg(arg8); - foo_instance1.overload1arg(arg9); - foo_instance1.overload1arg(arg10); - foo_instance1.overload1arg(arg11); - foo_instance1.overload1arg(arg12); - - foo_instance1.overloadargs(1); - foo_instance1.overloadargs(1, 2); - foo_instance1.overloadargs(1, 2, 3); - foo_instance1.overloadargs(1, 2, 3, 4); - foo_instance1.overloadargs(1, 2, 3, 4, 5); - foo_instance1.overloadargs(1, 2, 3, 4, 5, 6); - foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7); - foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8); - foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9); - foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - - - #ifdef usestubs - set_debug_traps(); - breakpoint(); - #endif - - - marker1(); - return 0; -} - -foo::foo (int i) { ifoo = i;} -foo::foo (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; } -foo::foo (foo& afoo) { ifoo = afoo.ifoo; ccpfoo = afoo.ccpfoo;} -foo::~foo () {} - - -/* Some functions to test overloading by varying one argument type. */ - -int foo::overload1arg (void) { return 1; } -int foo::overload1arg (char arg) { arg = 0; return 2;} -int foo::overload1arg (signed char arg) { arg = 0; return 3;} -int foo::overload1arg (unsigned char arg) { arg = 0; return 4;} -int foo::overload1arg (short arg) { arg = 0; return 5;} -int foo::overload1arg (unsigned short arg) { arg = 0; return 6;} -int foo::overload1arg (int arg) { arg = 0; return 7;} -int foo::overload1arg (unsigned int arg) { arg = 0; return 8;} -int foo::overload1arg (long arg) { arg = 0; return 9;} -int foo::overload1arg (unsigned long arg) { arg = 0; return 10;} -int foo::overload1arg (float arg) { arg = 0; return 11;} -int foo::overload1arg (double arg) { arg = 0; return 12;} - - -/* Some functions to test overloading by varying argument count. */ - -int foo::overloadargs (int a1) -{ a1 = 0; -return 1;} - -int foo::overloadargs (int a1, int a2) -{ a1 = a2 = 0; -return 2;} - -int foo::overloadargs (int a1, int a2, int a3) -{ a1 = a2 = a3 = 0; -return 3;} - -int foo::overloadargs (int a1, int a2, int a3, int a4) -{ a1 = a2 = a3 = a4 = 0; -return 4;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5) -{ a1 = a2 = a3 = a4 = a5 = 0; -return 5;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6) -{ a1 = a2 = a3 = a4 = a5 = a6 = 0; -return 6;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7) -{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; -return 7;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8) -{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; -return 8;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9) -{ - a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; - return 9; -} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = - a10 = 0; return 10;} - -int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, - int a8, int a9, int a10, int a11) - { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = - a10 = a11 = 0; return 11;} - - - diff --git a/gdb/testsuite/gdb.c++/ovldbreak.exp b/gdb/testsuite/gdb.c++/ovldbreak.exp deleted file mode 100644 index 043243d..0000000 --- a/gdb/testsuite/gdb.c++/ovldbreak.exp +++ /dev/null @@ -1,360 +0,0 @@ -# Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# written by Elena Zannoni (ezannoni@cygnus.com) -# modified by Michael Chastain (chastain@redhat.com) - -# This file is part of the gdb testsuite -# -# tests for overloaded member functions. Set breakpoints on -# overloaded member functions -# - - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "ovldbreak" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - - - -# When I ask gdb to set a breakpoint on an overloaded function, -# gdb gives me a choice menu. I might get stuck in that choice menu -# (for example, if C++ name mangling is not working properly). -# -# This procedure issues a command that works at either the menu -# prompt or the command prompt to get back to the command prompt. -# -# Note that an empty line won't do it (it means 'repeat the previous command' -# at top level). A line with a single space in it works nicely. - -proc take_gdb_out_of_choice_menu {} { - global gdb_prompt - send_gdb " \n" - gdb_expect { - -re ".*$gdb_prompt $" { - } - timeout { - perror "could not resynchronize to command prompt (timeout)" - continue - } - } -} - - - -# This procedure sets an overloaded breakpoint. -# When I ask for such a breakpoint, gdb gives me a menu of 'cancel' 'all' -# and a bunch of choices. I then choose from that menu by number. - -proc set_bp_overloaded {name expectedmenu mychoice bpnumber linenumber} { - global gdb_prompt hex srcfile - - # Get into the overload menu. - send_gdb "break $name\n" - gdb_expect { - -re "$expectedmenu" { - pass "bp menu for $name choice $mychoice" - - # Choose my choice. - send_gdb "$mychoice\n" - gdb_expect { - -re "Breakpoint $bpnumber at $hex: file.*$srcfile, line $linenumber.\r\n$gdb_prompt $" { - pass "set bp $bpnumber on $name $mychoice line $linenumber" - } - -re ".*$gdb_prompt $" { - fail "set bp $bpnumber on $name $mychoice line $linenumber (bad bp)" - } - timeout { - fail "set bp $bpnumber on $name $mychoice line $linenumber (timeout)" - take_gdb_out_of_choice_menu - } - } - } - -re ".*\r\n> " { - fail "bp menu for $name choice $mychoice (bad menu)" - take_gdb_out_of_choice_menu - } - -re ".*$gdb_prompt $" { - fail "bp menu for $name choice $mychoice (no menu)" - } - timeout { - fail "bp menu for $name choice $mychoice (timeout)" - take_gdb_out_of_choice_menu - } - } -} - -# This is the expected menu for overload1arg. -# Note the arg type variations on lines 6 and 13. -# This accommodates different versions of g++. - -set menu_overload1arg "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n\\\[4\\\] foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r\n\\\[5\\\] foo::overload1arg\\(long\\) at.*$srcfile:118\r\n\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n\\\[8\\\] foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r\n\\\[9\\\] foo::overload1arg\\(short\\) at.*$srcfile:114\r\n\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n> $" - - - -# Set breakpoints on foo::overload1arg, one by one. - -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 12 2 111 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 11 3 112 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 10 4 113 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 9 5 114 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 8 6 115 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 7 7 116 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 6 8 117 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 5 9 118 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 4 10 119 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 3 11 120 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 2 12 121 -set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 13 13 110 - - - -# Verify the breakpoints. - -gdb_test "info break" \ - "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r -\[\t \]+breakpoint already hit 1 time\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ - "breakpoint info (after setting one-by-one)" - - - -# Test choice "cancel". -# This is copy-and-paste from set_bp_overloaded. - -send_gdb "break foo::overload1arg\n" -gdb_expect { - -re "$menu_overload1arg" { - pass "bp menu for foo::overload1arg choice cancel" - # Choose cancel. - send_gdb "0\n" - gdb_expect { - -re "canceled\r\n$gdb_prompt $" { - pass "set bp on overload1arg canceled" - } - -re "cancelled\r\n$gdb_prompt $" { - pass "set bp on overload1arg canceled" - } - -re ".*$gdb_prompt $" { - fail "set bp on overload1arg canceled (bad message)" - } - timeout { - fail "set bp on overload1arg canceled (timeout)" - take_gdb_out_of_choice_menu - } - } - } - -re ".*\r\n> " { - fail "bp menu for foo::overload1arg choice cancel (bad menu)" - take_gdb_out_of_choice_menu - } - -re ".*$gdb_prompt $" { - fail "bp menu for foo::overload1arg choice cancel (no menu)" - } - timeout { - fail "bp menu for foo::overload1arg choice cancel (timeout)" - take_gdb_out_of_choice_menu - } -} - -gdb_test "info break" \ - "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r -\[\t \]+breakpoint already hit 1 time\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ - "breakpoint info (after cancel)" - - - -# Delete these breakpoints. - -send_gdb "delete breakpoints\n" -gdb_expect { - -re "Delete all breakpoints.* $" { - send_gdb "y\n" - gdb_expect { - -re ".*$gdb_prompt $" { - pass "delete all breakpoints" - } - timeout { - fail "delete all breakpoints (timeout)" - } - } - } - timeout { - fail "delete all breakpoints (timeout)" - } -} - -gdb_test "info breakpoints" "No breakpoints or watchpoints." "breakpoint info (after delete)" - - - -# Test choice "all". -# This is copy-and-paste from set_bp_overloaded. - -send_gdb "break foo::overload1arg\n" -gdb_expect { - -re "$menu_overload1arg" { - pass "bp menu for foo::overload1arg choice all" - # Choose all. - send_gdb "1\n" - gdb_expect { - -re "Breakpoint $decimal at $hex: file.*$srcfile, line 121.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 120.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 119.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 118.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 117.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 116.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 115.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 114.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 113.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 112.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 111.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 110.\r\nwarning: Multiple breakpoints were set.\r\nwarning: Use the .delete. command to delete unwanted breakpoints.\r\n$gdb_prompt $" { - pass "set bp on overload1arg all" - } - -re ".*$gdb_prompt $" { - fail "set bp on overload1arg all (bad message)" - } - timeout { - fail "set bp on overload1arg all (timeout)" - take_gdb_out_of_choice_menu - } - } - } - -re ".*\r\n> " { - fail "bp menu for foo::overload1arg choice all (bad menu)" - take_gdb_out_of_choice_menu - } - -re ".*$gdb_prompt $" { - fail "bp menu for foo::overload1arg choice all (no menu)" - } - timeout { - fail "bp menu for foo::overload1arg choice all (timeout)" - take_gdb_out_of_choice_menu - } -} - -gdb_test "info break" \ - "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r -\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ - "breakpoint info (after setting on all)" - - - -# Run through each breakpoint. - -# NOTE: carlton/2003-02-03: I'm seeing failures on some of the tests, -# with the wrong arg being printed out. Michael Chastain sees -# failures at times, too, albeit fewer than I do. - -proc continue_to_bp_overloaded {might_kfail bpnumber argtype actuals} { - global gdb_prompt hex decimal srcfile - - send_gdb "continue\n" - gdb_expect { - -re "Continuing.\r\n\r\nBreakpoint ${bpnumber}, (${hex} in )?foo::overload1arg(\\(${argtype}\\))? \\(this=${hex}(, )?${actuals}\\) at.*${srcfile}:${decimal}\r\n${decimal}\[\t \]+int foo::overload1arg \\(${argtype}( arg)?\\).*\r\n.*$gdb_prompt $" { - pass "continue to bp overloaded : ${argtype}" - } - -re "Continuing.\r\n\r\nBreakpoint ${bpnumber}, (${hex} in )?foo::overload1arg(\\(${argtype}\\))? \\(this=${hex}, arg=.*\\) at.*${srcfile}:${decimal}\r\n${decimal}\[\t \]+int foo::overload1arg \\(${argtype}( arg)?\\).*\r\n.*$gdb_prompt $" { - if $might_kfail { - kfail "gdb/1025" "continue to bp overloaded : ${argtype}" - } else { - fail "continue to bp overloaded : ${argtype}" - } - } - -re ".*$gdb_prompt $" { - fail "continue to bp overloaded : ${argtype}" - } - timeout { - fail "continue to bp overloaded : ${argtype} (timeout)" - } - } -} - -continue_to_bp_overloaded 0 25 "(void|)" "" -continue_to_bp_overloaded 1 24 "char" "arg=2 \\'\\\\002\\'" -continue_to_bp_overloaded 1 23 "signed char" "arg=3 \\'\\\\003\\'" -continue_to_bp_overloaded 1 22 "unsigned char" "arg=4 \\'\\\\004\\'" -continue_to_bp_overloaded 1 21 "short" "arg=5" -continue_to_bp_overloaded 1 20 "unsigned short" "arg=6" -continue_to_bp_overloaded 0 19 "int" "arg=7" -continue_to_bp_overloaded 0 18 "(unsigned|unsigned int)" "arg=8" -continue_to_bp_overloaded 0 17 "long" "arg=9" -continue_to_bp_overloaded 0 16 "unsigned long" "arg=10" -continue_to_bp_overloaded 0 15 "float" "arg=100" -continue_to_bp_overloaded 1 14 "double" "arg=200" - - - -# That's all, folks. - -gdb_continue_to_end "finish program" diff --git a/gdb/testsuite/gdb.c++/pr-1023.cc b/gdb/testsuite/gdb.c++/pr-1023.cc deleted file mode 100644 index 7583084..0000000 --- a/gdb/testsuite/gdb.c++/pr-1023.cc +++ /dev/null @@ -1,20 +0,0 @@ -class myClass -{ - public: - myClass() {}; - ~myClass() {}; - void performUnblocking( short int cell_index ); - void performBlocking( int cell_index ); -}; - -void myClass::performUnblocking( short int cell_index ) {} - -void myClass::performBlocking( int cell_index ) {} - -int main () -{ - myClass mc; - mc.performBlocking (0); - mc.performUnblocking (0); -} - diff --git a/gdb/testsuite/gdb.c++/pr-1023.exp b/gdb/testsuite/gdb.c++/pr-1023.exp deleted file mode 100644 index c8c9802..0000000 --- a/gdb/testsuite/gdb.c++/pr-1023.exp +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Tests for PR gdb/1023. -# 2003-02-03 Michael Chastain - -# This file is part of the gdb testsuite. - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "pr-1023" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -send_gdb "break myClass::performBlocking\n" -gdb_expect { - -re "Breakpoint $decimal at $hex: file .*$srcfile, line 12.*$gdb_prompt $" { - pass "break myClass::performBlocking" - } - -re "the class myClass does not have any method named performBlocking.*$gdb_prompt $" { - # fails with gcc 2.95.3 -gstabs+, native i686-pc-linux-gnu - # -- chastain 2003-02-03 - kfail "gdb/1023" "break myClass::performBlocking" - } - -re ".*$gdb_prompt $" { - fail "break myClass::performBlocking" - } - timeout { - fail "break myClass::performBlocking (timeout)" - } -} - -gdb_test \ - "break myClass::performUnblocking" \ - "Breakpoint $decimal at $hex: file .*$srcfile, line 10.*" - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/pr-1210.cc b/gdb/testsuite/gdb.c++/pr-1210.cc deleted file mode 100644 index 5747e5d..0000000 --- a/gdb/testsuite/gdb.c++/pr-1210.cc +++ /dev/null @@ -1,19 +0,0 @@ -class A -{ -}; - -class B : virtual public A -{ -}; - -class C : public A -{ - protected: - B myB; -}; - -int main() -{ - C *obj = new C(); - return 0; -} diff --git a/gdb/testsuite/gdb.c++/pr-1210.exp b/gdb/testsuite/gdb.c++/pr-1210.exp deleted file mode 100644 index 3ff850d..0000000 --- a/gdb/testsuite/gdb.c++/pr-1210.exp +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Tests for PR gdb/1210. - -# This file is part of the gdb testsuite. - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "pr-1210" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -gdb_test "next" ".*return 0;" "step past initialization" - -gdb_test_multiple "print *obj" "" { - -re "Cannot access memory.*$gdb_prompt $" { - fail "print *obj" - } - -re " = { = {}, myB = { = {}.*}}\r\n$gdb_prompt $" { - pass "print *obj" - } -} - -gdb_test_multiple "print obj->myB" "" { - -re "Cannot access memory.*$gdb_prompt $" { - fail "print obj->myB" - } - -re " = { = {}.*}\r\n$gdb_prompt $" { - pass "print obj->myB" - } -} - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/pr-574.cc b/gdb/testsuite/gdb.c++/pr-574.cc deleted file mode 100644 index eb06b61..0000000 --- a/gdb/testsuite/gdb.c++/pr-574.cc +++ /dev/null @@ -1,22 +0,0 @@ -/* - An attempt to replicate PR gdb/574 with a shorter program. - - Printing out *theB failed if the program was compiled with GCC 2.95. -*/ - -class A { -public: - virtual void foo() {}; // Stick in a virtual function. - int a; // Stick in a data member. -}; - -class B : public A { - static int b; // Stick in a static data member. -}; - -int main() -{ - B *theB = new B; - - return 0; // breakpoint: constructs-done -} diff --git a/gdb/testsuite/gdb.c++/pr-574.exp b/gdb/testsuite/gdb.c++/pr-574.exp deleted file mode 100644 index 5beacd1..0000000 --- a/gdb/testsuite/gdb.c++/pr-574.exp +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Tests for the bug mentioned in PR gdb/574. It's a bit -# idiosyncratic, so I gave it its own file. - -# 2002-08-16 David Carlton - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "pr-574" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# First, run to after we've constructed the object: - -gdb_breakpoint [gdb_get_line_number "constructs-done"] -gdb_continue_to_breakpoint "end of constructors" - -# This failed, as long as the code was compiled with GCC v. 2. - -# Different compilers order the data for differently, so I'm not -# matching the result exactly. - -gdb_test "print *theB" "\\$\[0-9\]* = { = {\[^}\]*}, static b = }" "PR gdb/574" - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/printmethod.cc b/gdb/testsuite/gdb.c++/printmethod.cc deleted file mode 100644 index d32e1b1..0000000 --- a/gdb/testsuite/gdb.c++/printmethod.cc +++ /dev/null @@ -1,14 +0,0 @@ -/* Create some objects, and try to print out their methods. */ - -class A { -public: - virtual void virt() {}; - void nonvirt() {}; -}; - -int main() -{ - A *theA = new A; - - return 0; // breakpoint: constructs-done -} diff --git a/gdb/testsuite/gdb.c++/printmethod.exp b/gdb/testsuite/gdb.c++/printmethod.exp deleted file mode 100644 index a45393f..0000000 --- a/gdb/testsuite/gdb.c++/printmethod.exp +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2002, 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# This tries to print out methods of classes. - -# 2002-08-16 David Carlton - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "printmethod" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# First, run to after we've constructed the object: - -gdb_breakpoint [gdb_get_line_number "constructs-done"] -gdb_continue_to_breakpoint "end of constructors" - -# The first of these is for PR gdb/653. - -gdb_test "print theA->virt" "\\$\[0-9\]* = &A::virt\\((void|)\\)" "print virtual method." -gdb_test "print theA->nonvirt" "Cannot take address of a method" "print nonvirtual method." - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/psmang.exp b/gdb/testsuite/gdb.c++/psmang.exp deleted file mode 100644 index 31dd346..0000000 --- a/gdb/testsuite/gdb.c++/psmang.exp +++ /dev/null @@ -1,226 +0,0 @@ -# Copyright 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file is part of the gdb testsuite - -# Looking up methods by name, in programs with multiple compilation units. - -# ====== PLEASE BE VERY CAREFUL WHEN CHANGING THIS TEST. ===== -# -# The bug we're testing for (circa October 2002) is very sensitive to -# various conditions that are hard to control directly in the test -# suite. If you change the test, please revert this change, and make -# sure the test still fails: -# -# 2002-08-29 Jim Blandy -# -# * symtab.c (lookup_symbol_aux): In the cases where we find a -# minimal symbol of an appropriate name and use its address to -# select a symtab to read and search, use `name' (as passed to us) -# as the demangled name when searching the symtab's global and -# static blocks, not the minsym's name. -# -# The original bug was that you'd try to set a breakpoint on a method -# (e.g., `break s::method1'), and you'd get an error, but if you -# repeated the command, it would work the second time: -# -# (gdb) break s::method1 -# the class s does not have any method named method1 -# Hint: try 's::method1 or 's::method1 -# (Note leading single quote.) -# (gdb) break s::method1 -# Breakpoint 1 at 0x804841b: file psmang1.cc, line 13. -# (gdb) -# -# We observed this bug first using Stabs, and then using Dwarf 2. -# -# The problem was in lookup_symbol_aux: when looking up s::method1, it -# would fail to find it in any symtabs, find the minsym with the -# corresponding mangled name (say, `_ZN1S7method1Ev'), pass the -# minsym's address to find_pc_sect_symtab to look up the symtab -# (causing the compilation unit's full symbols to be read in), and -# then look up the symbol in that symtab's global block. All that is -# correct. However, it would pass the minsym's name as the NAME -# argument to lookup_block_symbol; a minsym's name is mangled, whereas -# lookup_block_symbol's NAME argument should be demangled. -# -# This is a pretty simple bug, but it turns out to be a bear to -# construct a test for. That's why this test case is so delicate. If -# you can see how to make it less so, please contribute a patch. -# -# Here are the twists: -# -# The bug only manifests itself when we call lookup_symbol to look up -# a method name (like "s::method1" or "s::method2"), and that method's -# definition is in a compilation unit for which we have read partial -# symbols, but not full symbols. The partial->full conversion must be -# caused by that specific lookup. (If we already have full symbols -# for the method's compilation unit, we won't need to look up the -# minsym, find the symtab for the minsym's address, and then call -# lookup_block_symbol; it's that last call where things go awry.) -# -# Now, when asked to set a breakpoint at `s::method1', GDB will first -# look up `s' to see if that is, in fact, the name of a class, and -# then look up 's::method1'. So we have to make sure that looking up -# `s' doesn't cause full symbols to be read for the compilation unit -# containing the definition of `s::method1'. -# -# The partial symbol tables for `psmang1.cc' and `psmang2.cc' will -# both have entries for `s'; GDB will read full symbols for whichever -# compilation unit's partial symbol table appears first in the -# objfile's list. The order in which compilation units appear in the -# partial symbol table list depends on how the program is linked, and -# how the debug info reader does the partial symbol scan. Ideally, -# the test shouldn't rely on them appearing in any particular order. -# -# So, since we don't know which compilation unit's full symbols are -# going to get read, we simply try looking up one method from each of -# the two compilation units. One of them has to come after the other -# in the partial symbol table list, so whichever comes later will -# still need its partial symbols read by the time we go to look up -# 's::methodX'. -# -# Second twist: don't move the common definition of `struct s' into a -# header file. If the compiler emits identical stabs for the -# #inclusion of that header file into psmang1.cc and into psmang2.cc, -# then the linker will do stabs compression, and replace one of the -# BINCL/EINCL regions with an EXCL stab, pointing to the other -# BINCL/EINCL region. GDB will read this, and record that the -# compilation unit that got the EXCL depends on the compilation unit -# that kept the BINCL/EINCL. Then, when it decides it needs to read -# full symbols for the former, it'll also read full symbols for the -# latter. Now, if it just so happens that the compilation unit that -# got the EXCL is also the first one with a definition of `s' in the -# partial symbol table list, then that first probe for `s' will cause -# both compilation units' full symbols to be read --- again defeating -# the test. -# -# We could work around this by having three compilation units, or by -# ensuring that the header file produces different stabs each time -# it's #included, but it seems simplest just to avoid compilation unit -# dependencies altogether, drop the header file, and duplicate the -# (pretty trivial) struct definition. -# -# Note that #including any header file at all into both compilation -# units --- say, --- could create this sort of dependency. -# -# This is the aspect of the test which the debug format is most likely -# to affect, I think. The different formats create different kinds of -# inter-CU dependencies, which could mask the bug. It might be -# possible for the test to check that at least one of the partial -# symtabs remains unread, and fail otherwise --- the failure -# indicating that the test itself isn't going to catch the bug it was -# meant to, not that GDB is misbehaving. -# -# Third twist: given the way lookup_block_symbol is written, it's -# possible to find the symbol even when it gets passed a mangled name -# for its NAME parameter. There are three ways lookup_block_symbol -# might search a block, depending on how it was constructed: -# -# linear search. In this case, this bug will never manifest itself, -# since we check every symbol against NAME using SYMBOL_MATCHES_NAME. -# Since that macro checks its second argument (NAME) against both the -# mangled and demangled names of the symbol, this will always find the -# symbol successfully, so, no bug. -# -# hash table. If both the mangled and demangled names hash to the -# same bucket, then you'll again find the symbol "by accident", since -# we search the entire bucket using SYMBOL_SOURCE_NAME. Since GDB -# chooses the number of buckets based on the number of symbols, small -# compilation units may have only one hash bucket; in this case, the -# search always succeeds, even though we hashed on the wrong name. -# This test works around that by having a lot of dummy variables, -# making it less likely that the mangled and demangled names fall in -# the same bucket. -# -# binary search. (GDB 5.2 produced these sorts of blocks, and this -# test tries to detect the bug there, but subsequent versions of GDB -# almost never build them, and they may soon be removed entirely.) In -# this case, the symbols in the block are sorted by their -# SYMBOL_SOURCE_NAME (whose behavior depends on the current demangling -# setting, so that's wrong, but let's try to stay focussed). -# lookup_block_symbol does a binary search comparing NAME with -# SYMBOL_SOURCE_NAME until the range has been narrowed down to only a -# few symbols; then it starts a linear search forward from the lower -# end of that range, until it reaches a symbol whose -# SYMBOL_SOURCE_NAME follows NAME in lexicographic order. This means -# that, if you're doing a binary search for a mangled name in a block -# sorted by SYMBOL_SOURCE_NAME, you might find the symbol `by -# accident' if the mangled and demangled names happen to fall near -# each other in the ordering. The initial version of this patch used -# a class called `S'; all the other symbols in the compilation unit -# started with lower-case letters, so the demangled name `S::method1' -# sorted at the same place as the mangled name `_ZN1S7method1Ev': at -# the very beginning. Using a lower-case 's' as the name ensures that -# the demangled name falls after all the dummy symbols introduced for -# the hash table, as described above. -# -# This is all so tortured, someone will probably come up with still -# other ways this test could fail to do its job. If you need to make -# revisions, please be very careful. - -if $tracelevel then { - strace $tracelevel -} - -# -# test running programs -# - -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "psmang" -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile} "c++"] { - return -1; -} - -if { [gdb_compile "${srcdir}/${subdir}/${testfile}1.cc" "${testfile}1.o" object {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${srcdir}/${subdir}/${testfile}2.cc" "${testfile}2.o" object {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${testfile}1.o ${testfile}2.o" ${binfile} executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -gdb_test "break s::method1" "Breakpoint .* at .*: file .*psmang1.cc.*" - -# We have to exit and restart GDB here, to make sure that all the -# compilation units are psymtabs again. - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -gdb_test "break s::method2" "Breakpoint .* at .*: file .*psmang2.cc.*" diff --git a/gdb/testsuite/gdb.c++/psmang1.cc b/gdb/testsuite/gdb.c++/psmang1.cc deleted file mode 100644 index 19a9283..0000000 --- a/gdb/testsuite/gdb.c++/psmang1.cc +++ /dev/null @@ -1,159 +0,0 @@ -/* Do not move this definition into a header file! See the comments - in psmang.exp. */ -struct s -{ - int value; - void method1 (void); - void method2 (void); -}; - -void -s::method1 () -{ - value = 42; -} - -int -main (int argc, char **argv) -{ - s si; - - si.method1 (); - si.method2 (); -} - - -/* The presence of these variables ensures there will be so many - symbols in psmang1.cc's symtab's global block that it will have a - non-trivial hash table. When there are only a very few symbols, - the block only has one hash bucket, so even if we compute the hash - value for the wrong symbol name, we'll still find a symbol that - matches. */ -int ax; -int bx; -int a1x; -int b1x; -int a2x; -int b2x; -int a12x; -int b12x; -int a3x; -int b3x; -int a13x; -int b13x; -int a23x; -int b23x; -int a123x; -int b123x; -int a4x; -int b4x; -int a14x; -int b14x; -int a24x; -int b24x; -int a124x; -int b124x; -int a34x; -int b34x; -int a134x; -int b134x; -int a234x; -int b234x; -int a1234x; -int b1234x; -int a5x; -int b5x; -int a15x; -int b15x; -int a25x; -int b25x; -int a125x; -int b125x; -int a35x; -int b35x; -int a135x; -int b135x; -int a235x; -int b235x; -int a1235x; -int b1235x; -int a45x; -int b45x; -int a145x; -int b145x; -int a245x; -int b245x; -int a1245x; -int b1245x; -int a345x; -int b345x; -int a1345x; -int b1345x; -int a2345x; -int b2345x; -int a12345x; -int b12345x; -int a6x; -int b6x; -int a16x; -int b16x; -int a26x; -int b26x; -int a126x; -int b126x; -int a36x; -int b36x; -int a136x; -int b136x; -int a236x; -int b236x; -int a1236x; -int b1236x; -int a46x; -int b46x; -int a146x; -int b146x; -int a246x; -int b246x; -int a1246x; -int b1246x; -int a346x; -int b346x; -int a1346x; -int b1346x; -int a2346x; -int b2346x; -int a12346x; -int b12346x; -int a56x; -int b56x; -int a156x; -int b156x; -int a256x; -int b256x; -int a1256x; -int b1256x; -int a356x; -int b356x; -int a1356x; -int b1356x; -int a2356x; -int b2356x; -int a12356x; -int b12356x; -int a456x; -int b456x; -int a1456x; -int b1456x; -int a2456x; -int b2456x; -int a12456x; -int b12456x; -int a3456x; -int b3456x; -int a13456x; -int b13456x; -int a23456x; -int b23456x; -int a123456x; -int b123456x; diff --git a/gdb/testsuite/gdb.c++/psmang2.cc b/gdb/testsuite/gdb.c++/psmang2.cc deleted file mode 100644 index b9b1bb5..0000000 --- a/gdb/testsuite/gdb.c++/psmang2.cc +++ /dev/null @@ -1,152 +0,0 @@ -#include - -/* Do not move this definition into a header file! See the comments - in psmang.exp. */ -struct s -{ - int value; - void method1 (void); - void method2 (void); -}; - -void -s::method2 (void) -{ - printf ("%d\n", value); -} - - -/* The presence of these variables ensures there will be so many - symbols in psmang2.cc's symtab's global block that it will have a - non-trivial hash table. When there are only a very few symbols, - the block only has one hash bucket, so even if we compute the hash - value for the wrong symbol name, we'll still find a symbol that - matches. */ -int a; -int b; -int a1; -int b1; -int a2; -int b2; -int a12; -int b12; -int a3; -int b3; -int a13; -int b13; -int a23; -int b23; -int a123; -int b123; -int a4; -int b4; -int a14; -int b14; -int a24; -int b24; -int a124; -int b124; -int a34; -int b34; -int a134; -int b134; -int a234; -int b234; -int a1234; -int b1234; -int a5; -int b5; -int a15; -int b15; -int a25; -int b25; -int a125; -int b125; -int a35; -int b35; -int a135; -int b135; -int a235; -int b235; -int a1235; -int b1235; -int a45; -int b45; -int a145; -int b145; -int a245; -int b245; -int a1245; -int b1245; -int a345; -int b345; -int a1345; -int b1345; -int a2345; -int b2345; -int a12345; -int b12345; -int a6; -int b6; -int a16; -int b16; -int a26; -int b26; -int a126; -int b126; -int a36; -int b36; -int a136; -int b136; -int a236; -int b236; -int a1236; -int b1236; -int a46; -int b46; -int a146; -int b146; -int a246; -int b246; -int a1246; -int b1246; -int a346; -int b346; -int a1346; -int b1346; -int a2346; -int b2346; -int a12346; -int b12346; -int a56; -int b56; -int a156; -int b156; -int a256; -int b256; -int a1256; -int b1256; -int a356; -int b356; -int a1356; -int b1356; -int a2356; -int b2356; -int a12356; -int b12356; -int a456; -int b456; -int a1456; -int b1456; -int a2456; -int b2456; -int a12456; -int b12456; -int a3456; -int b3456; -int a13456; -int b13456; -int a23456; -int b23456; -int a123456; -int b123456; diff --git a/gdb/testsuite/gdb.c++/ref-types.cc b/gdb/testsuite/gdb.c++/ref-types.cc deleted file mode 100644 index 23cc510..0000000 --- a/gdb/testsuite/gdb.c++/ref-types.cc +++ /dev/null @@ -1,79 +0,0 @@ -int main2(void); - -void marker1 (void) -{ - -} - - - -int main(void) -{ - short s; - short &rs = s; - short *ps; - short *&rps = ps; - short as[4]; - short (&ras)[4] = as; - s = -1; - ps = &s; - as[0] = 0; - as[1] = 1; - as[2] = 2; - as[3] = 3; - - #ifdef usestubs - set_debug_traps(); - breakpoint(); - #endif - marker1(); - - main2(); - - return 0; -} - -int f() -{ - int f1; - f1 = 1; - return f1; -} - -int main2(void) -{ - char C; - unsigned char UC; - short S; - unsigned short US; - int I; - unsigned int UI; - long L; - unsigned long UL; - float F; - double D; - char &rC = C; - unsigned char &rUC = UC; - short &rS = S; - unsigned short &rUS = US; - int &rI = I; - unsigned int &rUI = UI; - long &rL = L; - unsigned long &rUL = UL; - float &rF = F; - double &rD = D; - C = 'A'; - UC = 21; - S = -14; - US = 7; - I = 102; - UI = 1002; - L = -234; - UL = 234; - F = 1.25E10; - D = -1.375E-123; - I = f(); - - return 0; - -} diff --git a/gdb/testsuite/gdb.c++/ref-types.exp b/gdb/testsuite/gdb.c++/ref-types.exp deleted file mode 100644 index dd06f02..0000000 --- a/gdb/testsuite/gdb.c++/ref-types.exp +++ /dev/null @@ -1,663 +0,0 @@ -# Tests for reference types with short type variables in GDB. -# Copyright 1998, 1999, 2000 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# written by Elena Zannoni (ezannoni@cygnus.com) - -if $tracelevel then { - strace $tracelevel - } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -if { [skip_cplus_tests] } { continue } - -set testfile "ref-types" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -# -# set it up at a breakpoint so we can play with the variable values -# -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -if ![runto 'marker1'] then { - perror "couldn't run to marker1" - continue -} - -gdb_test "up" ".*main.*" "up from marker1 1" - -proc gdb_start_again {} { - global srcdir - global subdir - global binfile - global gdb_prompt - global decimal - - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load ${binfile} - - source ${binfile}.ci - - # - # set it up at a breakpoint so we can play with the variable values - # - if ![runto_main] then { - perror "couldn't run to breakpoint" - continue - } - - if ![runto 'marker1'] then { - perror "couldn't run to marker1" - continue - } - - gdb_test "up" ".*main.*" "up from marker1 2" -} - - - -send_gdb "print s\n" -gdb_expect { - -re ".\[0-9\]* = -1.*$gdb_prompt $" { - pass "print value of s" - } - -re ".*$gdb_prompt $" { fail "print value of s" } - timeout { fail "(timeout) print value of s" } - } - - -send_gdb "ptype s\n" -gdb_expect { - -re "type = short.*$gdb_prompt $" { pass "ptype s" } - -re ".*$gdb_prompt $" { fail "ptype s" } - timeout { fail "(timeout) ptype s" } -} - - -send_gdb "print *ps\n" -gdb_expect { - -re ".\[0-9\]* = -1.*$gdb_prompt $" { - pass "print value of ps" - } - -re ".*$gdb_prompt $" { fail "print value of ps" } - timeout { fail "(timeout) print value of ps" } - } - - -send_gdb "ptype ps\n" -gdb_expect { - -re "type = short \*.*$gdb_prompt $" { pass "ptype ps" } - -re ".*$gdb_prompt $" { fail "ptype ps" } - timeout { fail "(timeout) ptype ps" } -} - -send_gdb "print as\[0\]\n" -gdb_expect { - -re ".\[0-9\]* = 0.*$gdb_prompt $" { - pass "print value of as\[0\]" - } - -re ".*$gdb_prompt $" { fail "print value of as\[0\]" } - timeout { fail "(timeout) print value of as\[0\]" } - } - - -send_gdb "ptype as\n" -gdb_expect { - -re "type = short \\\[4\\\].*$gdb_prompt $" { pass "ptype as" } - -re "type = short int \\\[4\\\].*$gdb_prompt $" { pass "ptype as" } - -re ".*$gdb_prompt $" { fail "ptype as" } - timeout { fail "(timeout) ptype as" } -} - -send_gdb "print as\[1\]\n" -gdb_expect { - -re ".\[0-9\]* = 1.*$gdb_prompt $" { - pass "print value of as\[1\]" - } - -re ".*$gdb_prompt $" { fail "print value of as\[1\]" } - timeout { fail "(timeout) print value of as\[1\]" } - } - -send_gdb "print as\[2\]\n" -gdb_expect { - -re ".\[0-9\]* = 2.*$gdb_prompt $" { - pass "print value of as\[2\]" - } - -re ".*$gdb_prompt $" { fail "print value of as\[2\]" } - timeout { fail "(timeout) print value of as\[2\]" } - } - -send_gdb "print as\[3\]\n" -gdb_expect { - -re ".\[0-9\]* = 3.*$gdb_prompt $" { - pass "print value of as\[3\]" - } - -re ".*$gdb_prompt $" { fail "print value of as\[3\]" } - timeout { fail "(timeout) print value of as\[3\]" } - } - -send_gdb "print rs\n" -gdb_expect { - -re ".\[0-9\]* = \\(short &\\) @$hex: -1.*$gdb_prompt $" { - pass "print value of rs" - } - -re ".\[0-9\]* = \\(short int &\\) @$hex: -1.*$gdb_prompt $" { - pass "print value of rs" - } - -re ".*$gdb_prompt $" { fail "print value of rs" } - timeout { fail "(timeout) print value of rs" } - eof { fail "print rs ($GDB dumped core) (FIXME)" ; gdb_start_again ; } - - } - -send_gdb "ptype rs\n" -gdb_expect { - -re "type = short &.*$gdb_prompt $" { pass "ptype rs" } - -re "type = short int &.*$gdb_prompt $" { pass "ptype rs" } - -re ".*$gdb_prompt $" { fail "ptype rs" } - timeout { fail "(timeout) ptype rs" } -} - - -send_gdb "print *rps\n" -gdb_expect { - -re ".\[0-9\]* = -1.*$gdb_prompt $" { - pass "print value of *rps" - } - -re ".*$gdb_prompt $" { fail "print value of *rps" } - timeout { fail "(timeout) print value of *rps" } - } - - -send_gdb "ptype rps\n" -gdb_expect { - -re "type = short \\*&.*$gdb_prompt $" { pass "ptype rps" } - -re "type = short int \\*&.*$gdb_prompt $" { pass "ptype rps" } - -re ".*$gdb_prompt $" { fail "ptype rps" } - timeout { fail "(timeout) ptype rps" } -} - - - -send_gdb "print ras\[0\]\n" -gdb_expect { - -re ".\[0-9\]* = 0.*$gdb_prompt $" { - pass "print value of ras\[0\]" - } - -re ".*$gdb_prompt $" { fail "print value of ras\[0\]" } - timeout { fail "(timeout) print value of ras\[0\]" } - } - - -send_gdb "ptype ras\n" -gdb_expect { - -re "type = short \\\(&\\\)\\\[4\\\].*$gdb_prompt $" { pass "ptype ras" } - -re "type = short int \\\(&\\\)\\\[4\\\].*$gdb_prompt $" { pass "ptype ras" } - -re ".*$gdb_prompt $" { fail "ptype ras" } - timeout { fail "(timeout) ptype ras" } -} - -send_gdb "print ras\[1\]\n" -gdb_expect { - -re ".\[0-9\]* = 1.*$gdb_prompt $" { - pass "print value of ras\[1\]" - } - -re ".*$gdb_prompt $" { fail "print value of ras\[1\]" } - timeout { fail "(timeout) print value of ras\[1\]" } - } - -send_gdb "print ras\[2\]\n" -gdb_expect { - -re ".\[0-9\]* = 2.*$gdb_prompt $" { - pass "print value of ras\[2\]" - } - -re ".*$gdb_prompt $" { fail "print value of ras\[2\]" } - timeout { fail "(timeout) print value of ras\[2\]" } - } - -send_gdb "print ras\[3\]\n" -gdb_expect { - -re ".\[0-9\]* = 3.*$gdb_prompt $" { - pass "print value of ras\[3\]" - } - -re ".*$gdb_prompt $" { fail "print value of ras\[3\]" } - timeout { fail "(timeout) print value of ras\[3\]" } - } - - -if ![runto 'f'] then { - perror "couldn't run to f" - continue -} - -gdb_test "up" ".main2.*" "up from f" - -send_gdb "print C\n" -gdb_expect { - -re ".\[0-9\]* = 65 \'A\'.*$gdb_prompt $" { - pass "print value of C" - } - -re ".*$gdb_prompt $" { fail "print value of C" } - timeout { fail "(timeout) print value of C" } - } - - -send_gdb "ptype C\n" -gdb_expect { - -re "type = char.*$gdb_prompt $" { pass "ptype C" } - -re ".*$gdb_prompt $" { fail "ptype C" } - timeout { fail "(timeout) ptype C" } -} - - -send_gdb "print UC\n" -gdb_expect { - -re ".\[0-9\]* = 21 '\.025'\.*$gdb_prompt $" { - pass "print value of UC" - } - -re ".*$gdb_prompt $" { fail "print value of UC" } - timeout { fail "(timeout) print value of UC" } - } - - -send_gdb "ptype UC\n" -gdb_expect { - -re "type = unsigned char.*$gdb_prompt $" { pass "ptype UC" } - -re ".*$gdb_prompt $" { fail "ptype UC" } - timeout { fail "(timeout) ptype UC" } -} - - -send_gdb "print S\n" -gdb_expect { - -re ".\[0-9\]* = -14.*$gdb_prompt $" { - pass "print value of S" - } - -re ".*$gdb_prompt $" { fail "print value of S" } - timeout { fail "(timeout) print value of S" } - } - - -send_gdb "ptype S\n" -gdb_expect { - -re "type = short.*$gdb_prompt $" { pass "ptype S" } - -re ".*$gdb_prompt $" { fail "ptype S" } - timeout { fail "(timeout) ptype S" } -} - - -send_gdb "print US\n" -gdb_expect { - -re ".\[0-9\]* = 7.*$gdb_prompt $" { - pass "print value of US" - } - -re ".*$gdb_prompt $" { fail "print value of US" } - timeout { fail "(timeout) print value of US" } - } - - -send_gdb "ptype US\n" -gdb_expect { - -re "type = unsigned short.*$gdb_prompt $" { pass "ptype US" } - -re "type = short unsigned.*$gdb_prompt $" { pass "ptype US" } - -re ".*$gdb_prompt $" { fail "ptype US" } - timeout { fail "(timeout) ptype US" } -} - - -send_gdb "print I\n" -gdb_expect { - -re ".\[0-9\]* = 102.*$gdb_prompt $" { - pass "print value of I" - } - -re ".*$gdb_prompt $" { fail "print value of I" } - timeout { fail "(timeout) print value of I" } - } - - -send_gdb "ptype I\n" -gdb_expect { - -re "type = int.*$gdb_prompt $" { pass "ptype I" } - -re ".*$gdb_prompt $" { fail "ptype I" } - timeout { fail "(timeout) ptype I" } -} - - -send_gdb "print UI\n" -gdb_expect { - -re ".\[0-9\]* = 1002.*$gdb_prompt $" { - pass "print value of UI" - } - -re ".*$gdb_prompt $" { fail "print value of UI" } - timeout { fail "(timeout) print value of UI" } - } - - -send_gdb "ptype UI\n" -gdb_expect { - -re "type = unsigned int.*$gdb_prompt $" { pass "ptype UI" } - -re ".*$gdb_prompt $" { fail "ptype UI" } - timeout { fail "(timeout) ptype UI" } -} - - -send_gdb "print L\n" -gdb_expect { - -re ".\[0-9\]* = -234.*$gdb_prompt $" { - pass "print value of L" - } - -re ".*$gdb_prompt $" { fail "print value of L" } - timeout { fail "(timeout) print value of L" } - } - - -send_gdb "ptype L\n" -gdb_expect { - -re "type = long.*$gdb_prompt $" { pass "ptype L" } - -re ".*$gdb_prompt $" { fail "ptype L" } - timeout { fail "(timeout) ptype L" } -} - - -send_gdb "print UL\n" -gdb_expect { - -re ".\[0-9\]* = 234.*$gdb_prompt $" { - pass "print value of UL" - } - -re ".*$gdb_prompt $" { fail "print value of UL" } - timeout { fail "(timeout) print value of UL" } - } - - -send_gdb "ptype UL\n" -gdb_expect { - -re "type = unsigned long.*$gdb_prompt $" { pass "ptype UL" } - -re "type = long unsigned.*$gdb_prompt $" { pass "ptype UL" } - -re ".*$gdb_prompt $" { fail "ptype UL" } - timeout { fail "(timeout) ptype UL" } -} - - -send_gdb "print F\n" -gdb_expect { - -re ".\[0-9\]* = 1.2\[0-9\]*e\\+10.*$gdb_prompt $" { - pass "print value of F" - } - -re ".*$gdb_prompt $" { fail "print value of F" } - timeout { fail "(timeout) print value of F" } - } - - - -send_gdb "ptype F\n" -gdb_expect { - -re "type = float.*$gdb_prompt $" { pass "ptype F" } - -re ".*$gdb_prompt $" { fail "ptype F" } - timeout { fail "(timeout) ptype F" } -} - - -send_gdb "print D\n" -gdb_expect { - -re ".\[0-9\]* = -1.375e-123.*$gdb_prompt $" { - pass "print value of D" - } - -re ".*$gdb_prompt $" { fail "print value of D" } - timeout { fail "(timeout) print value of D" } - } - - -send_gdb "ptype D\n" -gdb_expect { - -re "type = double.*$gdb_prompt $" { pass "ptype D" } - -re ".*$gdb_prompt $" { fail "ptype D" } - timeout { fail "(timeout) ptype D" } -} - - - -# -# test reference types -# - - - - -send_gdb "ptype rC\n" -gdb_expect { - -re "type = char &.*$gdb_prompt $" { pass "ptype rC" } - -re ".*$gdb_prompt $" { fail "ptype rC" } - timeout { fail "(timeout) ptype rC" } -} - - - - -send_gdb "ptype rUC\n" -gdb_expect { - -re "type = unsigned char &.*$gdb_prompt $" { pass "ptype rUC" } - -re ".*$gdb_prompt $" { fail "ptype rUC" } - timeout { fail "(timeout) ptype rUC" } -} - - - -send_gdb "ptype rS\n" -gdb_expect { - -re "type = short &.*$gdb_prompt $" { pass "ptype rS" } - -re "type = short int &.*$gdb_prompt $" { pass "ptype rS" } - -re ".*$gdb_prompt $" { fail "ptype rS" } - timeout { fail "(timeout) ptype rS" } -} - - - -send_gdb "ptype rUS\n" -gdb_expect { - -re "type = unsigned short &.*$gdb_prompt $" { pass "ptype rUS" } - -re "type = short unsigned int &.*$gdb_prompt $" { pass "ptype rUS" } - -re ".*$gdb_prompt $" { fail "ptype rUS" } - timeout { fail "(timeout) ptype rUS" } -} - - -send_gdb "ptype rI\n" -gdb_expect { - -re "type = int &.*$gdb_prompt $" { pass "ptype rI" } - -re ".*$gdb_prompt $" { fail "ptype rI" } - timeout { fail "(timeout) ptype rI" } -} - - - -send_gdb "ptype rUI\n" -gdb_expect { - -re "type = unsigned int &.*$gdb_prompt $" { pass "ptype rUI" } - -re ".*$gdb_prompt $" { fail "ptype rUI" } - timeout { fail "(timeout) ptype rUI" } -} - - - -send_gdb "ptype rL\n" -gdb_expect { - -re "type = long &.*$gdb_prompt $" { pass "ptype rL" } - -re "type = long int &.*$gdb_prompt $" { pass "ptype rL" } - -re ".*$gdb_prompt $" { fail "ptype rL" } - timeout { fail "(timeout) ptype rL" } -} - - -send_gdb "ptype rUL\n" -gdb_expect { - -re "type = unsigned long &.*$gdb_prompt $" { pass "ptype rUL" } - -re "type = long unsigned int &.*$gdb_prompt $" { pass "ptype rUL" } - -re ".*$gdb_prompt $" { fail "ptype rUL" } - timeout { fail "(timeout) ptype rUL" } -} - - -send_gdb "ptype rF\n" -gdb_expect { - -re "type = float &.*$gdb_prompt $" { pass "ptype rF" } - -re ".*$gdb_prompt $" { fail "ptype rF" } - timeout { fail "(timeout) ptype rF" } -} - - -send_gdb "ptype rD\n" -gdb_expect { - -re "type = double &.*$gdb_prompt $" { pass "ptype rD" } - -re ".*$gdb_prompt $" { fail "ptype rD" } - timeout { fail "(timeout) ptype rD" } -} - - -send_gdb "print rC\n" -gdb_expect { - -re ".\[0-9\]* = \\(char &\\) @$hex: 65 \'A\'.*$gdb_prompt $" { - pass "print value of rC" - } - -re ".*$gdb_prompt $" { fail "print value of rC" } - timeout { fail "(timeout) print value of rC" } - } - - -send_gdb "print rUC\n" -gdb_expect { - -re ".\[0-9\]* = \\(unsigned char &\\) @$hex: 21 \'.025\'.*$gdb_prompt $" { - pass "print value of rUC" - } - -re ".*$gdb_prompt $" { fail "print value of rUC" } - timeout { fail "(timeout) print value of rUC" } - } - - -send_gdb "print rS\n" -gdb_expect { - -re ".\[0-9\]* = \\(short &\\) @$hex: -14.*$gdb_prompt $" { - pass "print value of rS" - } - -re ".\[0-9\]* = \\(short int &\\) @$hex: -14.*$gdb_prompt $" { - pass "print value of rS" - } - -re ".*$gdb_prompt $" { fail "print value of rS" } - timeout { fail "(timeout) print value of rS" } - } - - -send_gdb "print rUS\n" -gdb_expect { - -re ".\[0-9\]* = \\(unsigned short &\\) @$hex: 7.*$gdb_prompt $" { - pass "print value of rUS" - } - -re ".\[0-9\]* = \\(short unsigned int &\\) @$hex: 7.*$gdb_prompt $" { - pass "print value of rUS" - } - -re ".*$gdb_prompt $" { fail "print value of rUS" } - timeout { fail "(timeout) print value of rUS" } - } - - -send_gdb "print rI\n" -gdb_expect { - -re ".\[0-9\]* = \\(int &\\) @$hex: 102.*$gdb_prompt $" { - pass "print value of rI" - } - -re ".*$gdb_prompt $" { fail "print value of rI" } - timeout { fail "(timeout) print value of rI" } - } - - -send_gdb "print rUI\n" -gdb_expect { - -re ".\[0-9\]* = \\(unsigned int &\\) @$hex: 1002.*$gdb_prompt $" { - pass "print value of UI" - } - -re ".*$gdb_prompt $" { fail "print value of rUI" } - timeout { fail "(timeout) print value of rUI" } - } - - -send_gdb "print rL\n" -gdb_expect { - -re ".\[0-9\]* = \\(long &\\) @$hex: -234.*$gdb_prompt $" { - pass "print value of rL" - } - -re ".\[0-9\]* = \\(long int &\\) @$hex: -234.*$gdb_prompt $" { - pass "print value of rL" - } - -re ".*$gdb_prompt $" { fail "print value of rL" } - timeout { fail "(timeout) print value of rL" } - } - - - -send_gdb "print rUL\n" -gdb_expect { - -re ".\[0-9\]* = \\(unsigned long &\\) @$hex: 234.*$gdb_prompt $" { - pass "print value of rUL" - } - -re ".\[0-9\]* = \\(long unsigned int &\\) @$hex: 234.*$gdb_prompt $" { - pass "print value of rUL" - } - -re ".*$gdb_prompt $" { fail "print value of rUL" } - timeout { fail "(timeout) print value of rUL" } - } - - -send_gdb "print rF\n" -gdb_expect { - -re ".\[0-9\]* = \\(float &\\) @$hex: 1.2\[0-9\]*e\\+10.*$gdb_prompt $" { - pass "print value of rF" - } - -re ".*$gdb_prompt $" { fail "print value of rF" } - timeout { fail "(timeout) print value of rF" } - } - - -send_gdb "print rD\n" -gdb_expect { - -re ".\[0-9\]* = \\(double &\\) @$hex: -1.375e-123.*$gdb_prompt $" { - pass "print value of rD" - } - -re ".*$gdb_prompt $" { fail "print value of rD" } - timeout { fail "(timeout) print value of rD" } - } - diff --git a/gdb/testsuite/gdb.c++/rtti.exp b/gdb/testsuite/gdb.c++/rtti.exp deleted file mode 100644 index f99637a..0000000 --- a/gdb/testsuite/gdb.c++/rtti.exp +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright 2003 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# This file is part of the gdb testsuite. - -# This contains tests for GDB's use of RTTI information. This stems -# from a bug reported in PR gdb/488 and other places, which leads to -# statements like 'warning: can't find class named 'C::D', as given by -# C++ RTTI'. It arises from GDB not knowing about classes that are -# defined in namespaces. - -# NOTE: carlton/2003-05-16: I suspect it could arise from nested class -# issues, too, and even once we fix that, there might be situations -# (involving templates, in particular) where this problem triggers -# because GDB and GCC have different ideas what a class is called. - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "rtti" -set srcfile1 "${srcdir}/${subdir}/${testfile}1.cc" -set objfile1 "${objdir}/${subdir}/${testfile}1.o" -set srcfile2 "${srcdir}/${subdir}/${testfile}2.cc" -set objfile2 "${objdir}/${subdir}/${testfile}2.o" -set binfile ${objdir}/${subdir}/${testfile} - -# gdb_get_line_number needs this to be called srcfile. -set srcfile "${srcfile1}" - -if { [gdb_compile "${srcfile1}" "${objfile1}" object {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${srcfile2}" "${objfile2}" object {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${objfile1} ${objfile2}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -# First, run to after we've constructed the object: - -gdb_breakpoint [gdb_get_line_number "constructs-done"] -gdb_continue_to_breakpoint "end of constructors" - -gdb_test_multiple "print *e1" "print *e1" { - -re "warning: can't find class named `n1::D1', as given by C\\+\\+ RTTI.*$gdb_prompt $" { - kfail "gdb/488" "print *e1" - } - -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { - pass "print *e1" - } - -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { - # NOTE: carlton/2003-05-16: If code is compiled by GCC2, we - # don't print the warning (for no particular reason), but we - # still call the class via the wrong name; PR gdb/57 is our - # catch-all PR for nested type problems. - kfail "gdb/57" "print *e1" - } -} - -# NOTE: carlton/2003-05-16: This test fails on my branch with an -# "" message because, within rtt1.cc, GDB has no way -# of knowing that the class is called 'n2::D2' instead of just 'D2'. -# This is an artifical test case, though: if we were using these -# classes in a more substantial way, G++ would emit more debug info. -# As is, I don't think there's anything that GDB can do about this -# case until G++ starts emitting DW_TAG_namespace info; when that part -# of the branch gets merged in, then we'll probably want to convert -# that fail branch to an xfail. - -gdb_test_multiple "print *e2" "print *e2" { - -re "warning: can't find class named `n2::D2', as given by C\\+\\+ RTTI.*$gdb_prompt $" { - kfail "gdb/488" "print *e2" - } - -re "\\$\[0-9\]* = \r\n$gdb_prompt $" { - # See above NOTE. - fail "print *e2" - } - -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { - pass "print *e2" - } - -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { - kfail "gdb/57" "print *e2" - } -} - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/rtti.h b/gdb/testsuite/gdb.c++/rtti.h deleted file mode 100644 index 879896d..0000000 --- a/gdb/testsuite/gdb.c++/rtti.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Code to go along with tests in rtti.exp. - - Copyright 2003 Free Software Foundation, Inc. - - Contributed by David Carlton and by Kealia, - Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -namespace n2 { - - class C2; - - class Base2 { - public: - virtual ~Base2() { } - }; - - - class C2: public Base2 { - public: - }; - - class D2 : public C2{ - public: - D2(C2 *, C2 *); - - C2* expr_1_; - C2* expr_2_; - }; - - extern C2 *create2(); -} diff --git a/gdb/testsuite/gdb.c++/rtti1.cc b/gdb/testsuite/gdb.c++/rtti1.cc deleted file mode 100644 index 6e9d862..0000000 --- a/gdb/testsuite/gdb.c++/rtti1.cc +++ /dev/null @@ -1,67 +0,0 @@ -/* Code to go along with tests in rtti.exp. - - Copyright 2003 Free Software Foundation, Inc. - - Contributed by David Carlton and by Kealia, - Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "rtti.h" - -namespace n1 { - - class C1; - - class Base1 { - public: - virtual ~Base1() { } - }; - - - class C1: public Base1 { - public: - }; - - class D1 : public C1{ - public: - D1(C1 *, C1 *); - - C1* expr_1_; - C1* expr_2_; - }; - - D1::D1(C1 *expr_1, C1 *expr_2) - : expr_1_(expr_1), expr_2_(expr_2) { } - - C1 *create1() { - return new D1(0, 0); - } - -} // n1 - -int main() -{ - using namespace n1; - using namespace n2; - - C1 *e1 = create1(); - C2 *e2 = create2(); - - return 0; // constructs-done -} diff --git a/gdb/testsuite/gdb.c++/rtti2.cc b/gdb/testsuite/gdb.c++/rtti2.cc deleted file mode 100644 index 8bb1ed6..0000000 --- a/gdb/testsuite/gdb.c++/rtti2.cc +++ /dev/null @@ -1,36 +0,0 @@ -/* Code to go along with tests in rtti.exp. - - Copyright 2003 Free Software Foundation, Inc. - - Contributed by David Carlton and by Kealia, - Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "rtti.h" - -namespace n2 { - - D2::D2(C2 *expr_1, C2 *expr_2) - : expr_1_(expr_1), expr_2_(expr_2) { } - - C2 *create2() { - return new D2(0, 0); - } - -} diff --git a/gdb/testsuite/gdb.c++/templates.cc b/gdb/testsuite/gdb.c++/templates.cc deleted file mode 100644 index c13f18b..0000000 --- a/gdb/testsuite/gdb.c++/templates.cc +++ /dev/null @@ -1,785 +0,0 @@ -/* This test code is from Wendell Baker (wbaker@comet.berkeley.edu) */ - -#include - -int a_i; -char a_c; -double a_d; - -typedef void *Pix; - -int -f(int i) -{ return 0; } - -int -f(int i, char c) -{ return 0; } - -int -f(int i, char c, double d) -{ return 0; } - -int -f(int i, char c, double d, char *cs) -{ return 0; } - -int -f(int i, char c, double d, char *cs, void (*fig)(int, char)) -{ return 0; } - -int -f(int i, char c, double d, char *cs, void (*fig)(char, int)) -{ return 0; } - -class R { -public: - int i; -}; -class S { -public: - int i; -}; -class T { -public: - int i; -}; - -char g(char, const char, volatile char) -{ return 'c'; } -char g(R, char&, const char&, volatile char&) -{ return 'c'; } -char g(char*, const char*, volatile char*) -{ return 'c'; } -char g(S, char*&, const char*&, volatile char*&) -{ return 'c'; } - -signed char g(T,signed char, const signed char, volatile signed char) -{ return 'c'; } -signed char g(T, R, signed char&, const signed char&, volatile signed char&) -{ return 'c'; } -signed char g(T, signed char*, const signed char*, volatile signed char*) -{ return 'c'; } -signed char g(T, S, signed char*&, const signed char*&, volatile signed char*&) -{ return 'c'; } - -unsigned char g(unsigned char, const unsigned char, volatile unsigned char) -{ return 'c'; } -unsigned char g(R, unsigned char&, const unsigned char&, volatile unsigned char&) -{ return 'c'; } -unsigned char g(unsigned char*, const unsigned char*, volatile unsigned char*) -{ return 'c'; } -unsigned char g(S, unsigned char*&, const unsigned char*&, volatile unsigned char*&) -{ return 'c'; } - -short g(short, const short, volatile short) -{ return 0; } -short g(R, short&, const short&, volatile short&) -{ return 0; } -short g(short*, const short*, volatile short*) -{ return 0; } -short g(S, short*&, const short*&, volatile short*&) -{ return 0; } - -signed short g(T, signed short, const signed short, volatile signed short) -{ return 0; } -signed short g(T, R, signed short&, const signed short&, volatile signed short&) -{ return 0; } -signed short g(T, signed short*, const signed short*, volatile signed short*) -{ return 0; } -signed short g(T, S, double, signed short*&, const signed short*&, volatile signed short*&) -{ return 0; } - -unsigned short g(unsigned short, const unsigned short, volatile unsigned short) -{ return 0; } -unsigned short g(R, unsigned short&, const unsigned short&, volatile unsigned short&) -{ return 0; } -unsigned short g(unsigned short*, const unsigned short*, volatile unsigned short*) -{ return 0; } -unsigned short g(S, unsigned short*&, const unsigned short*&, volatile unsigned short*&) -{ return 0; } - -int g(int, const int, volatile int) -{ return 0; } -int g(R, int&, const int&, volatile int&) -{ return 0; } -int g(int*, const int*, volatile int*) -{ return 0; } -int g(S, int*&, const int*&, volatile int*&) -{ return 0; } - -signed int g(T, signed int, const signed int, volatile signed int) -{ return 0; } -signed int g(T, R, signed int&, const signed int&, volatile signed int&) -{ return 0; } -signed int g(T, signed int*, const signed int*, volatile signed int*) -{ return 0; } -signed int g(T, S, signed int*&, const signed int*&, volatile signed int*&) -{ return 0; } - -unsigned int g(unsigned int, const unsigned int, volatile unsigned int) -{ return 0; } -unsigned int g(R, unsigned int&, const unsigned int&, volatile unsigned int&) -{ return 0; } -unsigned int g(unsigned int*, const unsigned int*, volatile unsigned int*) -{ return 0; } -unsigned int g(S, unsigned int*&, const unsigned int*&, volatile unsigned int*&) -{ return 0; } - -long g(long, const long, volatile long) -{ return 0; } -long g(R, long&, const long&, volatile long&) -{ return 0; } -long g(long*, const long*, volatile long*) -{ return 0; } -long g(S, long*&, const long*&, volatile long*&) -{ return 0; } - -signed long g(T, signed long, const signed long, volatile signed long) -{ return 0; } -signed long g(T, R, signed long&, const signed long&, volatile signed long&) -{ return 0; } -signed long g(T, signed long*, const signed long*, volatile signed long*) -{ return 0; } -signed long g(T, S, signed long*&, const signed long*&, volatile signed long*&) -{ return 0; } - -unsigned long g(unsigned long, const unsigned long, volatile unsigned long) -{ return 0; } -unsigned long g(S, unsigned long&, const unsigned long&, volatile unsigned long&) -{ return 0; } -unsigned long g(unsigned long*, const unsigned long*, volatile unsigned long*) -{ return 0; } -unsigned long g(S, unsigned long*&, const unsigned long*&, volatile unsigned long*&) -{ return 0; } - -#ifdef __GNUC__ -long long g(long long, const long long, volatile long long) -{ return 0; } -long long g(S, long long&, const long long&, volatile long long&) -{ return 0; } -long long g(long long*, const long long*, volatile long long*) -{ return 0; } -long long g(R, long long*&, const long long*&, volatile long long*&) -{ return 0; } - -signed long long g(T, signed long long, const signed long long, volatile signed long long) -{ return 0; } -signed long long g(T, R, signed long long&, const signed long long&, volatile signed long long&) -{ return 0; } -signed long long g(T, signed long long*, const signed long long*, volatile signed long long*) -{ return 0; } -signed long long g(T, S, signed long long*&, const signed long long*&, volatile signed long long*&) -{ return 0; } - -unsigned long long g(unsigned long long, const unsigned long long, volatile unsigned long long) -{ return 0; } -unsigned long long g(R, unsigned long long*, const unsigned long long*, volatile unsigned long long*) -{ return 0; } -unsigned long long g(unsigned long long&, const unsigned long long&, volatile unsigned long long&) -{ return 0; } -unsigned long long g(S, unsigned long long*&, const unsigned long long*&, volatile unsigned long long*&) -{ return 0; } -#endif - -float g(float, const float, volatile float) -{ return 0; } -float g(char, float&, const float&, volatile float&) -{ return 0; } -float g(float*, const float*, volatile float*) -{ return 0; } -float g(char, float*&, const float*&, volatile float*&) -{ return 0; } - -double g(double, const double, volatile double) -{ return 0; } -double g(char, double&, const double&, volatile double&) -{ return 0; } -double g(double*, const double*, volatile double*) -{ return 0; } -double g(char, double*&, const double*&, volatile double*&) -{ return 0; } - -#ifdef __GNUC__ -long double g(long double, const long double, volatile long double) -{ return 0; } -long double g(char, long double&, const long double&, volatile long double&) -{ return 0; } -long double g(long double*, const long double*, volatile long double*) -{ return 0; } -long double g(char, long double*&, const long double*&, volatile long double*&) -{ return 0; } -#endif - -class c { -public: - c(int) {}; - int i; -}; - -class c g(c, const c, volatile c) -{ return 0; } -c g(char, c&, const c&, volatile c&) -{ return 0; } -c g(c*, const c*, volatile c*) -{ return 0; } -c g(char, c*&, const c*&, volatile c*&) -{ return 0; } - -/* -void h(char = 'a') -{ } -void h(char, signed char = 'a') -{ } -void h(unsigned char = 'a') -{ } -*/ -/* -void h(char = (char)'a') -{ } -void h(char, signed char = (signed char)'a') -{ } -void h(unsigned char = (unsigned char)'a') -{ } - - -void h(short = (short)43) -{ } -void h(char, signed short = (signed short)43) -{ } -void h(unsigned short = (unsigned short)43) -{ } - -void h(int = (int)43) -{ } -void h(char, signed int = (signed int)43) -{ } -void h(unsigned int = (unsigned int)43) -{ } - - -void h(long = (long)43) -{ } -void h(char, signed long = (signed long)43) -{ } -void h(unsigned long = (unsigned long)43) -{ } - -#ifdef __GNUC__ -void h(long long = 43) -{ } -void h(char, signed long long = 43) -{ } -void h(unsigned long long = 43) -{ } -#endif - -void h(float = 4.3e-10) -{ } -void h(double = 4.3) -{ } -#ifdef __GNUC__ -void h(long double = 4.33e33) -{ } -#endif -*/ - -/* An unneeded printf() definition - actually, just a stub - used to occupy - this space. It has been removed and replaced with this comment which - exists to occupy some lines so that templates.exp won't need adjustment. */ - -class T1 { -public: - static void* operator new(size_t) throw (); - static void operator delete(void *pointer); - - void operator=(const T1&); - T1& operator=(int); - - int operator==(int) const; - int operator==(const T1&) const; - int operator!=(int) const; - int operator!=(const T1&) const; - - int operator<=(int) const; - int operator<=(const T1&) const; - int operator<(int) const; - int operator<(const T1&) const; - int operator>=(int) const; - int operator>=(const T1&) const; - int operator>(int) const; - int operator>(const T1&) const; - - void operator+(int) const; - T1& operator+(const T1&) const; - void operator+=(int) const; - T1& operator+=(const T1&) const; - - T1& operator++() const; - - void operator-(int) const; - T1& operator-(const T1&) const; - void operator-=(int) const; - T1& operator-=(const T1&) const; - - T1& operator--() const; - - void operator*(int) const; - T1& operator*(const T1&) const; - void operator*=(int) const; - T1& operator*=(const T1&) const; - - void operator/(int) const; - T1& operator/(const T1&) const; - void operator/=(int) const; - T1& operator/=(const T1&) const; - - void operator%(int) const; - T1& operator%(const T1&) const; - void operator%=(int) const; - T1& operator%=(const T1&) const; - - void operator&&(int) const; - T1& operator&&(const T1&) const; - - void operator||(int) const; - T1& operator||(const T1&) const; - - void operator&(int) const; - T1& operator&(const T1&) const; - void operator&=(int) const; - T1& operator&=(const T1&) const; - - void operator|(int) const; - T1& operator|(const T1&) const; - void operator|=(int) const; - T1& operator|=(const T1&) const; - - void operator^(int) const; - T1& operator^(const T1&) const; - void operator^=(int) const; - T1& operator^=(const T1&) const; - - T1& operator!() const; - T1& operator~() const; -}; - -void* -T1::operator new(size_t) throw () -{ return 0; } - -void -T1::operator delete(void *pointer) -{ } - -class T2 { -public: - T2(int i): integer(i) - { } - int integer; -}; - -int operator==(const T2&, const T2&) -{ return 0; } -int operator==(const T2&, char) -{ return 0; } -int operator!=(const T2&, const T2&) -{ return 0; } -int operator!=(const T2&, char) -{ return 0; } - -int operator<=(const T2&, const T2&) -{ return 0; } -int operator<=(const T2&, char) -{ return 0; } -int operator<(const T2&, const T2&) -{ return 0; } -int operator<(const T2&, char) -{ return 0; } -int operator>=(const T2&, const T2&) -{ return 0; } -int operator>=(const T2&, char) -{ return 0; } -int operator>(const T2&, const T2&) -{ return 0; } -int operator>(const T2&, char) -{ return 0; } - -T2 operator+(const T2 t, int i) -{ return t.integer + i; } -T2 operator+(const T2 a, const T2& b) -{ return a.integer + b.integer; } -T2& operator+=(T2& t, int i) -{ t.integer += i; return t; } -T2& operator+=(T2& a, const T2& b) -{ a.integer += b.integer; return a; } - -T2 operator-(const T2 t, int i) -{ return t.integer - i; } -T2 operator-(const T2 a, const T2& b) -{ return a.integer - b.integer; } -T2& operator-=(T2& t, int i) -{ t.integer -= i; return t; } -T2& operator-=(T2& a, const T2& b) -{ a.integer -= b.integer; return a; } - -T2 operator*(const T2 t, int i) -{ return t.integer * i; } -T2 operator*(const T2 a, const T2& b) -{ return a.integer * b.integer; } -T2& operator*=(T2& t, int i) -{ t.integer *= i; return t; } -T2& operator*=(T2& a, const T2& b) -{ a.integer *= b.integer; return a; } - -T2 operator/(const T2 t, int i) -{ return t.integer / i; } -T2 operator/(const T2 a, const T2& b) -{ return a.integer / b.integer; } -T2& operator/=(T2& t, int i) -{ t.integer /= i; return t; } -T2& operator/=(T2& a, const T2& b) -{ a.integer /= b.integer; return a; } - -T2 operator%(const T2 t, int i) -{ return t.integer % i; } -T2 operator%(const T2 a, const T2& b) -{ return a.integer % b.integer; } -T2& operator%=(T2& t, int i) -{ t.integer %= i; return t; } -T2& operator%=(T2& a, const T2& b) -{ a.integer %= b.integer; return a; } - -template -class T5 { -public: - T5(int); - T5(const T5&); - ~T5(); - static void* operator new(size_t) throw (); - static void operator delete(void *pointer); - int value(); - - static T X; - T x; - int val; -}; - -template -T5::T5(int v) -{ val = v; } - -template -T5::T5(const T5&) -{} - -template -T5::~T5() -{} - -template -void* -T5::operator new(size_t) throw () -{ return 0; } - -template -void -T5::operator delete(void *pointer) -{ } - -template -int -T5::value() -{ return val; } - - -#if ! defined(__GNUC__) || defined(GCC_BUG) -template -T T5::X; -#endif - - - - -T5 t5c(1); -T5 t5i(2); -T5 t5fi1(3); -T5 t5fi2(4); - - - - - - -class x { -public: - int (*manage[5])(double, - void *(*malloc)(unsigned size), - void (*free)(void *pointer)); - int (*device[5])(int open(const char *, unsigned mode, unsigned perms, int extra), - int *(*read)(int fd, void *place, unsigned size), - int *(*write)(int fd, void *place, unsigned size), - void (*close)(int fd)); -}; -T5 t5x(5); - -#if !defined(__GNUC__) || (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6) -template class T5; -template class T5; -template class T5; -template class T5; -template class T5; -#endif - -class T7 { -public: - static int get(); - static void put(int); -}; - -int -T7::get() -{ return 1; } - -void -T7::put(int i) -{ - // nothing -} - -// More template kinds. GDB 4.16 didn't handle these, but -// Wildebeest does. Note: Assuming HP aCC is used to compile -// this file; with g++ or HP cfront or other compilers the -// demangling may not get done correctly. - -// Ordinary template, to be instantiated with different types -template -class Foo { -public: - int x; - T t; - T foo (int, T); -}; - - -template T Foo::foo (int i, T tt) -{ - return tt; -} - -// Template with int parameter - -template -class Bar { -public: - int x; - T t; - T bar (int, T); -}; - - -template T Bar::bar (int i, T tt) -{ - if (i < sz) - return tt; - else - return 0; -} - -// function template with int parameter -template int dummy (T tt, int i) -{ - return tt; -} - -// Template with partial specializations -template -class Spec { -public: - int x; - T1 spec (T2); -}; - -template -T1 Spec::spec (T2 t2) -{ - return 0; -} - -template -class Spec { -public: - int x; - T spec (T*); -}; - -template -T Spec::spec (T * tp) -{ - return *tp; -} - -// Template with char parameter -template -class Baz { -public: - int x; - T t; - T baz (int, T); -}; - -template T Baz::baz (int i, T tt) -{ - if (i < sz) - return tt; - else - return 0; -} - -// Template with char * parameter -template -class Qux { -public: - int x; - T t; - T qux (int, T); -}; - -template T Qux::qux (int i, T tt) -{ - if (sz[0] == 'q') - return tt; - else - return 0; -} - -// Template with a function pointer parameter -template -class Qux1 { -public: - int x; - T t; - T qux (int, T); -}; - -template T Qux1::qux (int i, T tt) -{ - if (f != 0) - return tt; - else - return 0; -} - -// Some functions to provide as arguments to template -int gf1 (int a) { - return a * 2 + 13; -} -int gf2 (int a) { - return a * 2 + 26; -} - -char string[3]; - - -// Template for nested instantiations - -template -class Garply { -public: - int x; - T t; - T garply (int, T); -}; - -template T Garply::garply (int i, T tt) -{ - if (i > x) - return tt; - else - { - x += i; - return tt; - } -} - - -int main() -{ - int i; -#ifdef usestubs - set_debug_traps(); - breakpoint(); -#endif - i = i + 1; - - // New tests added here - - Foo fint={0,0}; - Foo fchar={0,0}; - Foo fvpchar = {0, 0}; - - Bar bint; - Bar 3)> bint2; - - Baz bazint; - Baz bazint2; - - Qux quxint2; - Qux quxint; - - Qux1 qux11; - - int x = fint.foo(33, 47); - char c = fchar.foo(33, 'x'); - volatile char * cp = fvpchar.foo(33, 0); - - int y = dummy (400, 600); - - int z = bint.bar(55, 66); - z += bint2.bar(55, 66); - - c = bazint2.baz(4, 'y'); - c = quxint2.qux(4, 'z'); - - y = bazint.baz(4,3); - y = quxint.qux(4, 22); - y += qux11.qux(4, 22); - - y *= gf1(y) - gf2(y); - - Spec sic; - Spec siip; - - sic.spec ('c'); - siip.spec (&x); - - Garply f; - Garply fc; - f.x = 13; - - Garply > nf; - nf.x = 31; - - x = f.garply (3, 4); - - fc = nf.garply (3, fc); - - y = x + fc.x; - - - return 0; - -} - - - - - - - - - - - - - diff --git a/gdb/testsuite/gdb.c++/templates.exp b/gdb/testsuite/gdb.c++/templates.exp deleted file mode 100644 index 0ae8788..0000000 --- a/gdb/testsuite/gdb.c++/templates.exp +++ /dev/null @@ -1,516 +0,0 @@ -# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2002, 2003 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) - -set ws "\[\r\n\t \]+" - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -set testfile "templates" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -# Create and source the file that provides information about the compiler -# used to compile the test case. -if [get_compiler_info ${binfile} "c++"] { - return -1 -} -source ${binfile}.ci - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -# -# Test printing of the types of templates. -# - -proc test_ptype_of_templates {} { - global gdb_prompt - global ws - - send_gdb "ptype T5\n" - gdb_expect { - -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5 & operator=\\(T5 const ?&\\);${ws}T5\\(int\\);${ws}T5\\((T5 const|const T5) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { - pass "ptype T5" - } - -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}${ws}T5 \\(int\\);${ws}T5 \\(const class T5 &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}${ws}$gdb_prompt $" { pass "ptype T5 -- new with unsigned int" } - -re "type = class T5 \\{.*public:.*static int X;.*int x;.*int val;.*T5 \\(int\\);.*T5 \\(const class T5 &\\);.*void ~T5 \\(int\\);.*static void \\* new \\(unsigned long\\);.*static void delete \\(void ?\\*\\);.*int value \\((void|)\\);.*\\}\r\n$gdb_prompt $" { pass "ptype T5 -- new with unsigned long" } - -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5 & operator=\\(T5 const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\((T5 const|const T5) ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" { - pass "ptype T5 (obsolescent gcc or gdb)" - } - -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5 const|const T5) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\(unsigned( long|)\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { - # This also triggers gdb/1113... - kfail "gdb/1111" "ptype T5" - } - -re ".*$gdb_prompt $" { - fail "ptype T5" - } - timeout { - fail "ptype T5 (timeout)" - } - } - - send_gdb "ptype t5i\n" - gdb_expect { - -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5\\(int\\);${ws}T5\\(T5 const ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\\}\r\n$gdb_prompt $" { pass "ptype T5 -- with several fixes from 4.17" } - -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5 &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" { pass "ptype t5i -- new with unsigned int" } - -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5 &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned long\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" { pass "ptype t5i -- new with unsigned long" } - -re "type = class T5 \{.*public:.*static int X;.*int x;.*int val;.*.*T5 \\(int\\);.*.*void ~T5 \\(int\\).*.*.*int value \\((void|)\\);.*\}.*$gdb_prompt $" { - pass "ptype t5i" - } - -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5 & operator=\\(T5 const ?&\\);${ws}T5\\(int\\);${ws}T5\\((T5 const|const T5) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { - pass "ptype t5i" - } - -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5 & operator=\\(T5 const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\(T5 const ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" { - pass "ptype t5i (obsolescent gcc or gdb)" - } - -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5 const|const T5) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\(unsigned( long|)\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { - # This also triggers gdb/1113... - kfail "gdb/1111" "ptype T5" - } - -re ".*$gdb_prompt $" { - fail "ptype t5i" - } - timeout { - fail "ptype t5i (timeout)" - } - } -} - -# -# Test breakpoint setting on template methods. -# - -proc test_template_breakpoints {} { - global gdb_prompt - global testfile - global srcdir - global hp_aCC_compiler - - send_gdb "break T5::T5\n" - gdb_expect { - -re "0. cancel.*\[\r\n\]*.1. all.*\[\r\n\]*.2. T5::T5\\(int\\) at .*\[\r\n\]*.3. T5::T5\\((T5 const|const T5) ?&\\) at .*\[\r\n\]*> $" { - gdb_test "0" \ - "canceled" \ - "constructor breakpoint (obsolete format!)" - } - -re ".0. cancel\[\r\n\]*.1. all\[\r\n\]*.2. T5::T5\\((T5 const|const T5) ?&\\) at .*templates.cc:.*\[\r\n\]*.3. T5::T5\\(int\\) at .*templates.cc:.*\[\r\n\]*> $" { - gdb_test "0" \ - "canceled" \ - "constructor breakpoint" - } - -re "0. cancel.*\[\r\n\]*.1. all.*\[\r\n\]*.2. T5 at .*\[\r\n\]*.3. T5 at .*\[\r\n\]*> $" { - setup_kfail "gdb/1062" "*-*-*" - gdb_test "0" \ - "nonsense intended to insure that this test fails" \ - "constructor breakpoint" - } - -re ".*\n> $" { - gdb_test "0" \ - "nonsense intended to insure that this test fails" \ - "constructor breakpoint (bad menu choices)" - } - -re ".*$gdb_prompt $" { fail "constructor breakpoint" } - default { fail "constructor breakpoint (timeout)" } - } - -# See CLLbs14792 - if {$hp_aCC_compiler} {setup_xfail hppa*-*-* CLLbs14792} - - gdb_test_multiple "break T5::~T5" "destructor_breakpoint" { - -re "Breakpoint.*at.* file .*${testfile}.cc, line.*$gdb_prompt $" - { - pass "destructor breakpoint" - } - -re "the class `T5' does not have destructor defined\r\nHint: try 'T5::~T5 or 'T5::~T5\r\n\\(Note leading single quote.\\)\r\n$gdb_prompt $" - { - kfail "gdb/1112" "destructor breakpoint" - } - } - - gdb_test "break T5::value" \ - "Breakpoint.*at.* file .*${testfile}.cc, line.*" \ - "value method breakpoint" - - delete_breakpoints -} - -# -# Test calling of template methods. -# - -proc test_template_calls {} { - global gdb_prompt - global hp_aCC_compiler - - if [target_info exists gdb,cannot_call_functions] { - setup_xfail "*-*-*" 2416 - fail "This target can not call functions" - return - } - - if {!$hp_aCC_compiler} {setup_xfail hppa*-*-*} - send_gdb "print t5i.value()\n" - gdb_expect { - -re ".* = 2\[\r\n\]*$gdb_prompt $" { pass "print t5i.value()" } - -re "Cannot invoke functions on this machine.*$gdb_prompt $" { - fail "print t5i.value()" - } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - xfail "print t5i.value" - } - -re ".*$gdb_prompt $" { fail "print t5i.value()" } - timeout { fail "print t5i.value() (timeout)" } - } -} - - -proc do_tests {} { - global prms_id - global bug_id - global subdir - global objdir - global srcdir - global binfile - global gdb_prompt - global supports_template_debugging - - set prms_id 0 - set bug_id 0 - - # Start with a fresh gdb. - - gdb_exit - gdb_start - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - - if { !$supports_template_debugging } { - warning "compiler lacks debugging info for templates; tests suppressed." 0 - return - } - - runto_main - - test_ptype_of_templates - test_template_breakpoints - - if [ runto_main] { - test_template_calls - } -} - -do_tests - - -# More tests for different kinds of template parameters, -# templates with partial specializations, nested templates, etc. -# These have been tested only with HP aCC. They probably won't -# work with other compilers because of differences in mangling -# schemes. -# Added by Satish Pai 1997-09-25 -# As of 2000-06-03, C++ support has been improved to the point that g++ can -# pass all of theses, excluding what appears to be one that exposes a stabs bug. - djb - -# I don't know how HP could be passing these tests without this. They -# weren't breakpointing past a point where the below expressions were -# initialized in the actual source. - djb - -send_gdb "b 770\n" -gdb_expect { - -re ".*$gdb_prompt $" -} -send_gdb "c\n" -gdb_expect { - -re ".*$gdb_prompt $" -} -send_gdb "print fint\n" -gdb_expect { - -re "\\$\[0-9\]* = \\{x = 0, t = 0\\}\r\n$gdb_prompt $" { pass "print fint" } - -re "$gdb_prompt $" { fail "print fint" } - timeout { fail "(timeout) print fint" } -} - -send_gdb "print fvpchar\n" -gdb_expect { - -re "\\$\[0-9\]* = \\{x = 0, t = 0x0\\}\r\n$gdb_prompt $" { pass "print fvpchar" } - -re "$gdb_prompt $" { fail "print fvpchar" } - timeout { fail "(timeout) print fvpchar" } -} - -# Template Foo - -# Neither stabs nor DWARF-2 contains type information about templates -# (as opposed to instantiations of templates), so in those -# circumstances we expect GDB to not find a symbol. HP has a debug -# format that contains more info, though, so it's also correct to -# print out template info. (This affects several subsequent tests as -# well.) - -# NOTE: carlton/2003-02-26: However, because of a bug in the way GDB -# handles nested types, we don't get this right in the DWARF-2 case. - -send_gdb "ptype Foo\n" -gdb_expect { - -re "type = template <(class |)T> (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Foo\r\n\[ \t\]*(class |)Foo\r\n\[ \t\]*(class |)Foo\r\n$gdb_prompt $" { pass "ptype Foo" } - -re "type = template <(class |)T> (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Foo" } - -re "type = class Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int foo\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" - { # GCC 3.1, DWARF-2 output. - kfail "gdb/57" "ptype Foo" } - -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" - { # GCC 2.95.3, stabs+ output. - pass "ptype Foo" } - -re "$gdb_prompt $" { fail "ptype Foo" } - timeout { fail "(timeout) ptype Foo" } -} -# -re "type = class Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int foo(int, int);\r\n\\}\r\n$gdb_prompt $" - -# ptype Foo - -send_gdb "ptype fint\n" -gdb_expect { - -re "type = (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int foo\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fint" } - -re "$gdb_prompt $" { fail "ptype fint" } - timeout { fail "(timeout) ptype fint" } -} - -# ptype Foo - -send_gdb "ptype fchar\n" -gdb_expect { - -re "type = (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*.*char foo\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fchar" } - -re "$gdb_prompt $" { fail "ptype fchar" } - timeout { fail "(timeout) ptype fchar" } -} - -# ptype Foo - -send_gdb "ptype fvpchar\n" -gdb_expect { - -re "type = (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*.*char.*\\*t;\r\n\r\n\[ \t\]*.*char \\* foo\\(int,.*char.*\\*\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fvpchar" } - -re "$gdb_prompt $" { fail "ptype fvpchar" } - timeout { fail "(timeout) ptype fvpchar" } -} - -# print a function from Foo - -# This test is sensitive to whitespace matching, so we'll do it twice, -# varying the spacing, because of PR gdb/33. - -send_gdb "print Foo::foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } - -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" - { - # This used to be a kfail gdb/33, but it shouldn't occur any more now. - fail "print Foo::foo" - } - -re "$gdb_prompt $" { fail "print Foo::foo" } - timeout { fail "(timeout) print Foo::foo" } -} - -send_gdb "print Foo::foo\n" -gdb_expect { - -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } - -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" - { - # This used to be a kfail gdb/33, but it shouldn't occur any more now. - fail "print Foo::foo" - } - -re "$gdb_prompt $" { fail "print Foo::foo" } - timeout { fail "(timeout) print Foo::foo" } -} - -# Template Bar - -# same as Foo for g++ -send_gdb "ptype Bar\n" -gdb_expect { - -re "type = template <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Bar\r\n\[ \t\]*(class |)Bar\r\n$gdb_prompt $" { pass "ptype Bar" } - -re "type = <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Bar" } - -re "ptype Bar\r\ntype = class Bar {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int bar\\(int, int\\);\r\n}\r\n$gdb_prompt $" - { # GCC 3.1, DWARF-2 output. - kfail "gdb/57" "ptype Bar" } - -re "No symbol \"Bar\" in current context.\r\n$gdb_prompt $" - { # GCC 2.95.3, stabs+ output. - pass "ptype Bar" } - -re "$gdb_prompt $" { fail "ptype Bar" } - timeout { fail "(timeout) ptype Bar" } -} - - -# ptype Bar - -send_gdb "ptype bint\n" -gdb_expect { - -re "type = (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int bar\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bint" } - -re "$gdb_prompt $" { fail "ptype bint" } - timeout { fail "(timeout) ptype bint" } -} - -# ptype Bar3)> - -send_gdb "ptype bint2\n" -gdb_expect { - -re "type = (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int bar\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bint2" } - -re "$gdb_prompt $" { fail "ptype bint2" } - timeout { fail "(timeout) ptype bint2" } -} - -# Template Baz - -# Same as Foo, for g++ -send_gdb "ptype Baz\n" -gdb_expect { - -re "type = template <(class |)T, (class |)sz> (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Baz\r\n\[ \t\]*(class |)Baz\r\n$gdb_prompt $" { pass "ptype Baz" } - -re "type = <(class |)T, (class |)sz> (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Baz" } - -re "type = class Baz {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int baz\\(int, int\\);\r\n}\r\n$gdb_prompt $" - { # GCC 3.1, DWARF-2 output. - kfail "gdb/57" "ptype Baz" } - -re "No symbol \"Baz\" in current context.\r\n$gdb_prompt $" - { # GCC 2.95.3, stabs+ output. - pass "ptype Baz" } - -re "$gdb_prompt $" { fail "ptype Baz" } - timeout { fail "(timeout) ptype Baz" } -} - - -# ptype Baz - -send_gdb "ptype bazint\n" -gdb_expect { - -re "type = (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int baz\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bazint" } - -re "$gdb_prompt $" { fail "ptype bazint" } - timeout { fail "(timeout) ptype bazint" } -} - -# ptype Baz - -send_gdb "ptype bazint2\n" -gdb_expect { - -re "type = (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*.*char baz\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bazint2" } - -re "$gdb_prompt $" { fail "ptype bazint2" } - timeout { fail "(timeout) ptype bazint2" } -} - -# Template Qux -# Same as Foo for g++ -send_gdb "ptype Qux\n" -gdb_expect { - -re "type = template <(class |)T, (class |)sz> (class |)Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Qux\r\n\[ \t\]*(class |)Qux\r\n$gdb_prompt $" { pass "ptype Qux" } - -re ".*type = template <(class |)T.*, (class |)sz> (class |)Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}.*$gdb_prompt $" { pass "ptype Qux" } - -re "type = class Qux {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*char qux\\(int, char\\);\r\n}\r\n$gdb_prompt $" - { # GCC 3.1, DWARF-2 output. - kfail "gdb/57" "ptype Qux" } - -re "No symbol \"Qux\" in current context.\r\n$gdb_prompt $" - { # GCC 2.95.3, stabs+ output. - pass "ptype Qux" } - -re "$gdb_prompt $" { fail "ptype Qux" } - timeout { fail "(timeout) ptype Qux" } -} - -# pt Qux - -send_gdb "ptype quxint\n" -gdb_expect { - -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int qux\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" } - -re "$gdb_prompt $" { fail "ptype quxint" } - timeout { fail "(timeout) ptype quxint" } -} - -# pt Qux - -# commented out this as quxint2 declaration was commented out in -# templates.exp -- ovidiu -# send_gdb "ptype quxint2\n" -# gdb_expect { -# -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*char qux\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint2" } -# -re "$gdb_prompt $" { fail "ptype quxint2" } -# timeout { fail "(timeout) ptype quxint2" } -# } - -# Template Spec - -# Same as Foo for g++ -send_gdb "ptype Spec\n" -gdb_expect { - -re "type = template <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Spec\r\n\[ \t\]*(class |)Spec\r\n$gdb_prompt $" { pass "ptype Spec" } - -re "type = <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Spec" } - -re "type = class Spec {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*int spec\\(char\\);\r\n}\r\n$gdb_prompt $" - { # GCC 3.1, DWARF-2 output. - kfail "gdb/57" "ptype Spec" } - -re "No symbol \"Spec\" in current context.\r\n$gdb_prompt $" - { # GCC 2.95.3, stabs+ output. - pass "ptype Spec" } - -re "$gdb_prompt $" { fail "ptype Spec" } - timeout { fail "(timeout) ptype Spec" } -} - -# pt Spec - -send_gdb "ptype siip\n" -gdb_expect { - -re "type = class Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*.*int spec\\(int ?\\*\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype siip" } - -re "$gdb_prompt $" { fail "ptype siip" } - timeout { fail "(timeout) ptype siip" } -} - -# pt Garply - -send_gdb "ptype Garply\n" -gdb_expect { - -re "type = class Garply \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int garply\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype Garply" } - -re "$gdb_prompt $" { fail "ptype Garply" } - timeout { fail "(timeout) ptype Garply" } -} - -# ptype of nested template name - -send_gdb "ptype Garply >\n" -gdb_expect { - -re "type = (class |)Garply > \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*.*(class |)Garply t;\r\n\r\n\[ \t\]*.*(class |)Garply garply\\(int, (class |)Garply\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype Garply >" } - -re "$gdb_prompt $" { fail "ptype Garply >" } - timeout { fail "(timeout) ptype Garply >" } -} - -# print out a function from a nested template name - -send_gdb "print Garply >::garply\n" -gdb_expect { - -re "\\$\[0-9\]* = \\{(class |)Garply \\((class |)Garply > \\*(| const), int, (class |)Garply\\)\\} $hex \[ \t\]*>::garply\\(int, (class |)Garply\\)>\r\n$gdb_prompt $" { pass "print Garply >::garply" } - -re ".*$gdb_prompt $" { fail "print Garply >::garply" } - timeout { fail "print Garply >::garply (timeout)" } -} - -# djb - 06-03-2000 -# Now should work fine -send_gdb "break Garply >::garply\n" -gdb_expect { - -re "Breakpoint \[0-9\]* at $hex: file .*templates.cc, line.*\r\n$gdb_prompt $" { pass "break Garply >::garply" } - -re ".*$gdb_prompt $" { fail "break Garply >::garply" } - timeout { fail "break Garply >::garply (timeout)" } -} diff --git a/gdb/testsuite/gdb.c++/try_catch.cc b/gdb/testsuite/gdb.c++/try_catch.cc deleted file mode 100644 index e13dd64..0000000 --- a/gdb/testsuite/gdb.c++/try_catch.cc +++ /dev/null @@ -1,121 +0,0 @@ -// 2002-05-27 - -#include -#include -#include - -enum region { oriental, egyptian, greek, etruscan, roman }; - -// Test one. -class gnu_obj_1 -{ -public: - typedef region antiquities; - const bool test; - const int key1; - long key2; - - antiquities value; - - gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {} -}; - -// Test two. -template -class gnu_obj_2: public virtual gnu_obj_1 -{ -public: - antiquities value_derived; - - gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { } -}; - -// Test three. -template -class gnu_obj_3 -{ -public: - typedef region antiquities; - gnu_obj_2 data; - - gnu_obj_3(antiquities b): data(etruscan) { } -}; - -int main() -{ - bool test = true; - const int i = 5; - int j = i; - gnu_obj_2 test2(roman); - gnu_obj_3 test3(greek); - - // 1 - try - { - ++j; - throw gnu_obj_1(egyptian, 4589); // marker 1-throw - } - catch (gnu_obj_1& obj) - { - ++j; - if (obj.value != egyptian) // marker 1-catch - test &= false; - if (obj.key2 != 4589) - test &= false; - } - catch (...) - { - j = 0; - test &= false; - } - - // 2 - try - { - ++j; // marker 2-start - try - { - ++j; // marker 2-next - try - { - ++j; - throw gnu_obj_1(egyptian, 4589); // marker 2-throw - } - catch (gnu_obj_1& obj) - { - ++j; - if (obj.value != egyptian) // marker 2-catch - test &= false; - if (obj.key2 != 4589) - test &= false; - } - } - catch (gnu_obj_1& obj) - { - ++j; - if (obj.value != egyptian) - test &= false; - if (obj.key2 != 4589) - test &= false; - } - } - catch (...) - { - j = 0; - test &= false; - } - - // 3 use standard library - using namespace std; - try - { - if (j < 100) - throw invalid_argument("gdb.1"); // marker 3-throw - } - catch (exception& obj) - { - if (obj.what() != "gdb.1") // marker 3-catch - test &= false; - } - return 0; -} diff --git a/gdb/testsuite/gdb.c++/try_catch.exp b/gdb/testsuite/gdb.c++/try_catch.exp deleted file mode 100644 index 1473e20..0000000 --- a/gdb/testsuite/gdb.c++/try_catch.exp +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2002 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Tests for member data -# 2002-05-27 Benjamin Kosnik - -# This file is part of the gdb testsuite - -if $tracelevel then { - strace $tracelevel - } - -if { [skip_cplus_tests] } { continue } - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "try_catch" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - - -if ![runto_main] then { - perror "couldn't run to breakpoint" - continue -} - -gdb_breakpoint [gdb_get_line_number "marker 1-throw"] -gdb_continue_to_breakpoint "marker 1-throw" - -gdb_breakpoint [gdb_get_line_number "marker 1-catch"] -gdb_continue_to_breakpoint "marker 1-catch" - -gdb_breakpoint [gdb_get_line_number "marker 2-start"] -gdb_continue_to_breakpoint "marker 2-start" - -gdb_breakpoint [gdb_get_line_number "marker 2-next"] -gdb_continue_to_breakpoint "marker 2-next" - -gdb_breakpoint [gdb_get_line_number "marker 2-throw"] -gdb_continue_to_breakpoint "marker 2-throw" - -gdb_breakpoint [gdb_get_line_number "marker 2-catch"] -gdb_continue_to_breakpoint "marker 2-catch" - -gdb_breakpoint [gdb_get_line_number "marker 3-throw"] -gdb_continue_to_breakpoint "marker 3-throw" - -gdb_breakpoint [gdb_get_line_number "marker 3-catch"] -gdb_continue_to_breakpoint "marker 3-catch" - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/userdef.cc b/gdb/testsuite/gdb.c++/userdef.cc deleted file mode 100644 index 0bb88a2..0000000 --- a/gdb/testsuite/gdb.c++/userdef.cc +++ /dev/null @@ -1,341 +0,0 @@ -#include - -using namespace std; - -void marker1() -{ - return; -} - -class A1 { - int x; - int y; - -friend ostream& operator<<(ostream& outs, A1 one); - -public: - - A1(int a, int b) - { - x=a; - y=b; - } - -A1 operator+=(int value); -A1 operator+(const A1&); -A1 operator-(const A1&); -A1 operator%(const A1&); -int operator==(const A1&); -int operator!=(const A1&); -int operator&&(const A1&); -int operator||(const A1&); -A1 operator<<(int); -A1 operator>>(int); -A1 operator|(const A1&); -A1 operator^(const A1&); -A1 operator&(const A1&); -int operator<(const A1&); -int operator<=(const A1&); -int operator>=(const A1&); -int operator>(const A1&); -A1 operator*(const A1&); -A1 operator/(const A1&); -A1 operator=(const A1&); - -A1 operator~(); -A1 operator-(); -int operator!(); -A1 operator++(); -A1 operator++(int); -A1 operator--(); -A1 operator--(int); - -}; - - -A1 A1::operator+(const A1& second) -{ - A1 sum(0,0); - sum.x = x + second.x; - sum.y = y + second.y; - - return (sum); -} - -A1 A1::operator*(const A1& second) -{ - A1 product(0,0); - product.x = this->x * second.x; - product.y = this->y * second.y; - - return product; -} - -A1 A1::operator-(const A1& second) -{ - A1 diff(0,0); - diff.x = x - second.x; - diff.y = y - second.y; - - return diff; -} - -A1 A1::operator/(const A1& second) -{ - A1 div(0,0); - div.x = x / second.x; - div.y = y / second.y; - - return div; -} - -A1 A1::operator%(const A1& second) -{ - A1 rem(0,0); - rem.x = x % second.x; - rem.y = y % second.y; - - return rem; -} - -int A1::operator==(const A1& second) -{ - int a = (x == second.x); - int b = (y == second.y); - - return (a && b); -} - -int A1::operator!=(const A1& second) -{ - int a = (x != second.x); - int b = (y != second.y); - - return (a || b); -} - -int A1::operator&&(const A1& second) -{ - return ( x && second.x); -} - -int A1::operator||(const A1& second) -{ - return ( x || second.x); -} - -A1 A1::operator<<(int value) -{ - A1 lshft(0,0); - lshft.x = x << value; - lshft.y = y << value; - - return lshft; -} - -A1 A1::operator>>(int value) -{ - A1 rshft(0,0); - rshft.x = x >> value; - rshft.y = y >> value; - - return rshft; -} - -A1 A1::operator|(const A1& second) -{ - A1 abitor(0,0); - abitor.x = x | second.x; - abitor.y = y | second.y; - - return abitor; -} - -A1 A1::operator^(const A1& second) -{ - A1 axor(0,0); - axor.x = x ^ second.x; - axor.y = y ^ second.y; - - return axor; -} - -A1 A1::operator&(const A1& second) -{ - A1 abitand(0,0); - abitand.x = x & second.x; - abitand.y = y & second.y; - - return abitand; -} - -int A1::operator<(const A1& second) -{ - A1 b(0,0); - b.x = 3; - return (x < second.x); -} - -int A1::operator<=(const A1& second) -{ - return (x <= second.x); -} - -int A1::operator>=(const A1& second) -{ - return (x >= second.x); -} - -int A1::operator>(const A1& second) -{ - return (x > second.x); -} - -int A1::operator!(void) -{ - return (!x); -} - -A1 A1::operator-(void) -{ - A1 neg(0,0); - neg.x = -x; - neg.y = -y; - - return (neg); -} - -A1 A1::operator~(void) -{ - A1 acompl(0,0); - acompl.x = ~x; - acompl.y = ~y; - - return (acompl); -} - -A1 A1::operator++() // pre increment -{ - x = x +1; - - return (*this); -} - -A1 A1::operator++(int) // post increment -{ - y = y +1; - - return (*this); -} - -A1 A1::operator--() // pre decrement -{ - x = x -1; - - return (*this); -} - -A1 A1::operator--(int) // post decrement -{ - y = y -1; - - return (*this); -} - - -A1 A1::operator=(const A1& second) -{ - - x = second.x; - y = second.y; - - return (*this); -} - -A1 A1::operator+=(int value) -{ - - x += value; - y += value; - - return (*this); -} - -ostream& operator<<(ostream& outs, A1 one) -{ - return (outs << endl << "x = " << one.x << endl << "y = " << one.y << endl << "-------" << endl); -} - -int main (void) -{ - A1 one(2,3); - A1 two(4,5); - A1 three(0,0); - int val; - - marker1(); // marker1-returns-here - cout << one; // marker1-returns-here - cout << two; - three = one + two; - cout << "+ " << three; - three = one - two; - cout << "- " << three; - three = one * two; - cout <<"* " << three; - three = one / two; - cout << "/ " << three; - three = one % two; - cout << "% " << three; - three = one | two; - cout << "| " <= two; - cout << ">= " << val << endl << "-----"< two; - cout << "> " << val << endl << "-----"<> 2; - cout << "rsh " << three; - - three = one; - cout << " = "<< three; - three += 5; - cout << " += "<< three; - - val = (!one); - cout << "! " << val << endl << "-----"< two" "\\\$\[0-9\]* = 0\[\r\n\]" - -gdb_test "print one >= two" "\\\$\[0-9\]* = 0\[\r\n\]" - -gdb_test "print one == two" "\\\$\[0-9\]* = 0\[\r\n\]" - -gdb_test "print one != two" "\\\$\[0-9\]* = 1\[\r\n\]" - -# Can't really check the output of this one without knowing -# target integer width. Make sure we don't try to call -# the iostreams operator instead, though. -gdb_test "print one << 31" "\\\$\[0-9\]* = {x = -?\[0-9\]*, y = -?\[0-9\]*}" - -# Should be fine even on < 32-bit targets. -gdb_test "print one >> 31" "\\\$\[0-9\]* = {x = 0, y = 0}" - -gdb_test "print !one" "\\\$\[0-9\]* = 0\[\r\n\]" - -# Assumes 2's complement. So does everything... -gdb_test "print ~one" "\\\$\[0-9\]* = {x = -3, y = -4}" - -gdb_test "print -one" "\\\$\[0-9\]* = {x = -2, y = -3}" - -gdb_test "print one++" "\\\$\[0-9\]* = {x = 2, y = 4}" - -gdb_test "print ++one" "\\\$\[0-9\]* = {x = 3, y = 4}" - -gdb_test "print one--" "\\\$\[0-9\]* = {x = 3, y = 3}" - -gdb_test "print --one" "\\\$\[0-9\]* = {x = 2, y = 3}" - -gdb_test "print one += 7" "\\\$\[0-9\]* = {x = 9, y = 10}" - -gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}" - -# Check that GDB tolerates whitespace in operator names. -gdb_test "break A1::'operator+'" ".*Breakpoint $decimal at.*" -gdb_test "break A1::'operator +'" ".*Breakpoint $decimal at.*" - -gdb_exit -return 0 diff --git a/gdb/testsuite/gdb.c++/virtfunc.cc b/gdb/testsuite/gdb.c++/virtfunc.cc deleted file mode 100644 index 005de9d..0000000 --- a/gdb/testsuite/gdb.c++/virtfunc.cc +++ /dev/null @@ -1,201 +0,0 @@ -// Pls try the following program on virtual functions and try to do print on -// most of the code in main(). Almost none of them works ! - -// -// The inheritance structure is: -// -// V : VA VB -// A : (V) -// B : A -// D : AD (V) -// C : (V) -// E : B (V) D C -// - -class VA -{ -public: - int va; -}; - -class VB -{ -public: - int vb; - int fvb(); - virtual int vvb(); -}; - -class V : public VA, public VB -{ -public: - int f(); - virtual int vv(); - int w; -}; - -class A : virtual public V -{ -public: - virtual int f(); -private: - int a; -}; - -class B : public A -{ -public: - int f(); -private: - int b; -}; - -class C : public virtual V -{ -public: - int c; -}; - -class AD -{ -public: - virtual int vg() = 0; -}; - -class D : public AD, virtual public V -{ -public: - static void s(); - virtual int vg(); - virtual int vd(); - int fd(); - int d; -}; - -class E : public B, virtual public V, public D, public C -{ -public: - int f(); - int vg(); - int vv(); - int e; -}; - -D dd; -D* ppd = ⅆ -AD* pAd = ⅆ - -A a; -B b; -C c; -D d; -E e; -V v; -VB vb; - - -A* pAa = &a; -A* pAe = &e; - -B* pBe = &e; - -D* pDd = &d; -D* pDe = &e; - -V* pVa = &a; -V* pVv = &v; -V* pVe = &e; -V* pVd = &d; - -AD* pADe = &e; - -E* pEe = &e; - -VB* pVB = &vb; - -void init() -{ - a.vb = 1; - b.vb = 2; - c.vb = 3; - d.vb = 4; - e.vb = 5; - v.vb = 6; - vb.vb = 7; - - d.d = 1; - e.d = 2; -} - -extern "C" int printf(const char *, ...); - -int all_count = 0; -int failed_count = 0; - -#define TEST(EXPR, EXPECTED) \ - ret = EXPR; \ - if (ret != EXPECTED) {\ - printf("Failed %s is %d, should be %d!\n", #EXPR, ret, EXPECTED); \ - failed_count++; } \ - all_count++; - -int ret; - -void test_calls() -{ - TEST(pAe->f(), 20); - TEST(pAa->f(), 1); - - TEST(pDe->vg(), 202); - TEST(pADe->vg(), 202); - TEST(pDd->vg(), 101); - - TEST(pEe->vvb(), 411); - - TEST(pVB->vvb(), 407); - - TEST(pBe->vvb(), 411); - TEST(pDe->vvb(), 411); - - TEST(pEe->vd(), 282); - TEST(pEe->fvb(), 311); - - TEST(pEe->D::vg(), 102); - printf("Did %d tests, of which %d failed.\n", all_count, failed_count); -} -#ifdef usestubs -extern "C" { - void set_debug_traps(); - void breakpoint(); -}; -#endif - -int main() -{ -#ifdef usestubs - set_debug_traps(); - breakpoint(); -#endif - init(); - - e.w = 7; - e.vb = 11; - - test_calls(); - return 0; - -} - -int A::f() {return 1;} -int B::f() {return 2;} -void D::s() {} -int E::f() {return 20;} -int D::vg() {return 100+d;} -int E::vg() {return 200+d;} -int V::f() {return 600+w;} -int V::vv() {return 400+w;} -int E::vv() {return 450+w;} -int D::fd() {return 250+d;} -int D::vd() {return 280+d;} -int VB::fvb() {return 300+vb;} -int VB::vvb() {return 400+vb;} diff --git a/gdb/testsuite/gdb.c++/virtfunc.exp b/gdb/testsuite/gdb.c++/virtfunc.exp deleted file mode 100644 index dbd575c..0000000 --- a/gdb/testsuite/gdb.c++/virtfunc.exp +++ /dev/null @@ -1,948 +0,0 @@ -# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 -# Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Fred Fish. (fnf@cygnus.com) - -set ws "\[\r\n\t \]+" -set nl "\[\r\n\]+" - -if $tracelevel then { - strace $tracelevel -} - -if { [skip_cplus_tests] } { continue } - -set testfile "virtfunc" -set srcfile ${testfile}.cc -set binfile ${objdir}/${subdir}/${testfile} - -if [get_compiler_info ${binfile} "c++"] { - return -1 -} - -source ${binfile}.ci - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++ debug}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -proc gdb_virtfunc_init {} { - global srcdir subdir binfile - global gdb_prompt - - gdb_reinitialize_dir $srcdir/$subdir - gdb_load $binfile - - send_gdb "set language c++\n" - gdb_expect -re "$gdb_prompt $" - send_gdb "set width 0\n" - gdb_expect -re "$gdb_prompt $" -} - -proc gdb_virtfunc_restart {} { - gdb_exit; - gdb_start; - gdb_virtfunc_init; - runto 'test_calls'; -} - -# -# Test printing of the types of various classes. -# - -proc test_ptype_of_classes {} { - global gdb_prompt - global ws - global nl - - # This used to be a fail if it printed "struct" not "class". But - # since this struct doesn't use any special C++ features, it is - # considered right for GDB to print it as "struct". - send_gdb "ptype VA\n" - gdb_expect { - -re "type = (struct|class) VA \{(${ws}public:|)${ws}int va;${ws}VA & operator=\\(VA const ?&\\);${ws}VA\\((VA const|const VA) ?&\\);${ws}VA\\((void|)\\);${ws}\}.*$gdb_prompt $" { - pass "ptype VA" - } - -re "type = (struct|class) VA \{(${ws}public:|)${ws}int va;((${ws}VA & operator=\\(VA const ?&\\);)|(${ws}VA\\(VA const ?&\\);)|(${ws}VA\\((void|)\\);))*${ws}\}.*$gdb_prompt $" { - pass "ptype VA (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype VA" - } - timeout { - fail "ptype VA (timeout)" - } - } - - send_gdb "ptype VB\n" - gdb_expect { - -re "type = class VB \{${ws}public:${ws}int vb;${ws}VB & operator=\\(VB const ?&\\);${ws}VB\\((VB const|const VB) ?&\\);${ws}VB\\((void|)\\);${ws}int fvb\\((void|)\\);${ws}virtual int vvb\\((void|)\\);${ws}\}.*$gdb_prompt $" { - pass "ptype VB" - } - -re "type = class VB \{${ws}public:${ws}int vb;${ws}int fvb \\((void|)\\);${ws}virtual int vvb \\((void|)\\);${ws}\}.*$gdb_prompt $" { - pass "ptype VB (aCC)" - } - -re "type = class VB \{${ws}public:${ws}int vb;((${ws}VB & operator=\\(VB const ?&\\);)|(${ws}VB\\(VB const ?&\\);)|(${ws}VB\\((void|)\\);)|(${ws}int fvb\\((void|)\\);)|(${ws}virtual int vvb\\((void|)\\);))*${ws}\}.*$gdb_prompt $" { - pass "ptype VB (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype VB" - } - timeout { - fail "ptype VB (timeout)" - } - } - - send_gdb "ptype V\n" - gdb_expect { - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype V" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype V (aCC)" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype V (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype V" - } - timeout { - fail "ptype V (timeout)" - } - } - - # The format of a g++ virtual base pointer. - set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?" - - send_gdb "ptype A\n" - gdb_expect { - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype A" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype A" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype A (aCC)" - } - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype A (obsolescent gcc or gdb)" - } - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}FOO;${ws}int a;${ws}public:${ws}virtual int f.void.;${ws}\}$nl$gdb_prompt $" { - # This happens because the type is defined only after it is - # too late. - fail "ptype A (known failure with gcc cygnus-2.4.5-930417)" - # Many of the rest of these tests have the same problem. - return 0 - } - -re ".*$gdb_prompt $" { - fail "ptype A" - } - timeout { - fail "ptype A (timeout)" - } - } - - send_gdb "ptype B\n" - gdb_expect { - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\(int, B const ?&\\);${ws}B\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype B" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype B" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}virtual int f \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype B (aCC)" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(int, B const ?&\\);)|(${ws}B\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype B (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype B" - } - timeout { - fail "ptype B (timeout)" - } - } - - send_gdb "ptype C\n" - gdb_expect { - -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\(int, C const ?&\\);${ws}C\\(int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype C" - } - -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\((C const|const C) ?&\\);${ws}C\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype C" - } - -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}\}$nl$gdb_prompt $" { - pass "ptype C (aCC)" - } - -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;((${ws}C & operator=\\(C const ?&\\);)|(${ws}C\\(int, C const ?&\\);)|(${ws}C\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype C (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype C" - } - timeout { - fail "ptype C (timeout)" - } - } - - send_gdb "ptype AD\n" - gdb_expect { - -re "type = class AD \{${ws}public:${ws}AD & operator=\\(AD const ?&\\);${ws}AD\\((AD const|const AD) ?&\\);${ws}AD\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype AD" - } - -re "type = class AD \{${ws}public:${ws}virtual int vg \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype AD (aCC)" - } - -re "type = class AD \{${ws}public:((${ws}AD & operator=\\(AD const ?&\\);)|(${ws}AD\\(AD const ?&\\);)|(${ws}AD\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype AD (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype AD" - } - timeout { - fail "ptype AD (timeout)" - } - } - - send_gdb "ptype D\n" - gdb_expect { - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype D" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype D" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype D (aCC)" - } - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype D (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype D" - } - timeout { - fail "ptype D (timeout)" - } - } - - send_gdb "ptype E\n" - gdb_expect { - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\(int, E const ?&\\);${ws}E\\(int\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype E" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype E" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}virtual int f \\((void|)\\);${ws}virtual int vg \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype E (aCC)" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\(int, E const ?&\\);)|(${ws}E\\(int\\);)|(${ws}virtual int f\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype E (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype E" - } - timeout { - fail "ptype E (timeout)" - } - } - - send_gdb "ptype dd\n" - gdb_expect { - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype dd" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype dd" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype dd (aCC)" - } - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype dd (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype dd" - } - timeout { - fail "ptype dd (timeout)" - } - } - - send_gdb "ptype ppd\n" - gdb_expect { - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype ppd" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype ppd" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype ppd (aCC)" - } - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype ppd (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype ppd" - } - timeout { - fail "ptype ppd (timeout)" - } - } - - send_gdb "ptype pAd\n" - gdb_expect { - -re "type = class AD \{${ws}public:${ws}AD & operator=\\(AD const ?&\\);${ws}AD\\((AD const|const AD) ?&\\);${ws}AD\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAd" - } - -re "type = class AD \{${ws}public:${ws}virtual int vg \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAd (aCC)" - } - -re "type = class AD \{${ws}public:((${ws}AD & operator=\\(AD const ?&\\);)|(${ws}AD\\(AD const ?&\\);)|(${ws}AD\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAd (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pAd" - } - timeout { - fail "ptype pAd (timeout)" - } - } - - send_gdb "ptype a\n" - gdb_expect { - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype a" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype a" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype a (aCC)" - } - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype a (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype a" - } - timeout { - fail "ptype a (timeout)" - } - } - - send_gdb "ptype b\n" - gdb_expect { - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\(int, B const ?&\\);${ws}B\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype b" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype b" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}virtual int f \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype b (aCC)" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(int, B const ?&\\);)|(${ws}B\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype b (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype b" - } - timeout { - fail "ptype b (timeout)" - } - } - - send_gdb "ptype c\n" - gdb_expect { - -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\(int, C const ?&\\);${ws}C\\(int\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype c" - } - -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\((C const|const C) ?&\\);${ws}C\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype c" - } - -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}\}$nl$gdb_prompt $" { - pass "ptype c (aCC)" - } - -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;((${ws}C & operator=\\(C const ?&\\);)|(${ws}C\\(int, C const ?&\\);)|(${ws}C\\(int\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype c (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype c" - } - timeout { - fail "ptype c (timeout)" - } - } - - send_gdb "ptype d\n" - gdb_expect { - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype d" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype d" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype d (aCC)" - } - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype d (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype d" - } - timeout { - fail "ptype d (timeout)" - } - } - - send_gdb "ptype e\n" - gdb_expect { - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\(int, E const ?&\\);${ws}E\\(int\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype e" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype e" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}virtual int f \\((void|)\\);${ws}virtual int vg \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype e (aCC)" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\(int, E const ?&\\);)|(${ws}E\\(int\\);)|(${ws}virtual int f\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype e (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype e" - } - timeout { - fail "ptype e (timeout)" - } - } - - send_gdb "ptype v\n" - gdb_expect { - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype v" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype v (aCC)" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype v (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype v" - } - timeout { - fail "ptype v (timeout)" - } - } - - send_gdb "ptype vb\n" - gdb_expect { - -re "type = class VB \{${ws}public:${ws}int vb;${ws}VB & operator=\\(VB const ?&\\);${ws}VB\\((VB const|const VB) ?&\\);${ws}VB\\((void|)\\);${ws}int fvb\\((void|)\\);${ws}virtual int vvb\\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype vb" - } - -re "type = class VB \{${ws}public:${ws}int vb;${ws}int fvb \\((void|)\\);${ws}virtual int vvb \\((void|)\\);${ws}\}$nl$gdb_prompt $" { - pass "ptype vb (aCC)" - } - -re "type = class VB \{${ws}public:${ws}int vb;((${ws}VB & operator=\\(VB const ?&\\);)|(${ws}VB\\(VB const ?&\\);)|(${ws}VB\\((void|)\\);)|(${ws}int fvb\\((void|)\\);)|(${ws}virtual int vvb\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { - pass "ptype vb (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype vb" - } - timeout { - fail "ptype vb (timeout)" - } - } - - send_gdb "ptype pAa\n" - gdb_expect { - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAa" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAa" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAa (aCC)" - } - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAa (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pAa" - } - timeout { - fail "ptype pAa (timeout)" - } - } - - send_gdb "ptype pAe\n" - gdb_expect { - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAe" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAe" - } - -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAe (aCC)" - } - -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pAe (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pAe" - } - timeout { - fail "ptype pAe (timeout)" - } - } - - send_gdb "ptype pBe\n" - gdb_expect { - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\(int, B const ?&\\);${ws}B\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pBe" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pBe" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}virtual int f \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pBe (aCC)" - } - -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(int, B const ?&\\);)|(${ws}B\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pBe (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pBe" - } - timeout { - fail "ptype pBe (timeout)" - } - } - - send_gdb "ptype pDd\n" - gdb_expect { - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDd" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDd" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDd (aCC)" - } - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDd (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pDd" - } - timeout { - fail "ptype pDd (timeout)" - } - } - - send_gdb "ptype pDe\n" - gdb_expect { - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDe" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDe" - } - -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDe (aCC)" - } - -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pDe (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pDe" - } - timeout { - fail "ptype pDe (timeout)" - } - } - - send_gdb "ptype pVa\n" - gdb_expect { - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVa" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVa (aCC)" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVa (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pVa" - } - timeout { - fail "ptype pVa (timeout)" - } - } - - send_gdb "ptype pVv\n" - gdb_expect { - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVv" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVv (aCC)" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVv (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pVv" - } - timeout { - fail "ptype pVv (timeout)" - } - } - - send_gdb "ptype pVe\n" - gdb_expect { - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVe" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVe (aCC)" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVe (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pVe" - } - timeout { - fail "ptype pVe (timeout)" - } - } - - send_gdb "ptype pVd\n" - gdb_expect { - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVd" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVd (aCC)" - } - -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVd (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pVd" - } - timeout { - fail "ptype pVd (timeout)" - } - } - - send_gdb "ptype pADe\n" - gdb_expect { - -re "type = class AD \{${ws}public:${ws}AD & operator=\\(AD const ?&\\);${ws}AD\\((AD const|const AD) ?&\\);${ws}AD\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pADe" - } - -re "type = class AD \{${ws}public:${ws}virtual int vg \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pADe (aCC)" - } - -re "type = class AD \{${ws}public:((${ws}AD & operator=\\(AD const ?&\\);)|(${ws}AD\\(AD const ?&\\);)|(${ws}AD\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pADe (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pADe" - } - timeout { - fail "ptype pADe (timeout)" - } - } - - send_gdb "ptype pEe\n" - gdb_expect { - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\(int, E const ?&\\);${ws}E\\(int\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pEe" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pEe" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}virtual int f \\((void|)\\);${ws}virtual int vg \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pEe (aCC)" - } - -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\(int, E const ?&\\);)|(${ws}E\\(int\\);)|(${ws}virtual int f\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pEe (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pEe" - } - timeout { - fail "ptype pEe (timeout)" - } - } - - send_gdb "ptype pVB\n" - gdb_expect { - -re "type = class VB \{${ws}public:${ws}int vb;${ws}VB & operator=\\(VB const ?&\\);${ws}VB\\((VB const|const VB) ?&\\);${ws}VB\\((void|)\\);${ws}int fvb\\((void|)\\);${ws}virtual int vvb\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVB" - } - -re "type = class VB \{${ws}public:${ws}int vb;${ws}int fvb \\((void|)\\);${ws}virtual int vvb \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVB (aCC)" - } - -re "type = class VB \{${ws}public:${ws}int vb;((${ws}VB & operator=\\(VB const ?&\\);)|(${ws}VB\\(VB const ?&\\);)|(${ws}VB\\((void|)\\);)|(${ws}int fvb\\((void|)\\);)|(${ws}virtual int vvb\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { - pass "ptype pVB (obsolescent gcc or gdb)" - } - -re ".*$gdb_prompt $" { - fail "ptype pVB" - } - timeout { - fail "ptype pVB (timeout)" - } - } -} - -# -# Test calling of virtual functions. -# - -proc test_virtual_calls {} { - global gdb_prompt - global GDB - global nl - global gcc_compiled - - if [target_info exists gdb,cannot_call_functions] { - setup_xfail "*-*-*" 2416 - fail "This target can not call functions" - return 0 - } - - send_gdb "print pAe->f()\n" - gdb_expect { - -re ".* = 20$nl$gdb_prompt $" { pass "print pAe->f()" } - -re "Cannot invoke functions on this machine.*$gdb_prompt $" { - fail "print pAe->f() (cannot invoke functions, skipping virtual calls)" - return 0 - } - -re ".*Cannot access memory at address 0x8.*$gdb_prompt $" { - fail "print pAe->f() \ -(known failure with gcc cygnus-2.4.5-930417, skipping virtual calls)" - return 0 - } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pAe->f()" - } - -re ".*$gdb_prompt $" { fail "print pAe->f()" } - timeout { fail "print pAe->f() (timeout)" } - eof { fail "print pAe->f() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pAa->f()\n" - gdb_expect { - -re ".* = 1$nl$gdb_prompt $" { pass "print pAa->f()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pAa->f()" - } - -re ".*$gdb_prompt $" { fail "print pAa->f()" } - timeout { fail "print pAa->f() (timeout)" } - eof { fail "print pAa->f() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pDe->vg()\n" - gdb_expect { - -re ".* = 202$nl$gdb_prompt $" { pass "print pDe->vg()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pDe->vg()" - } - -re ".*$gdb_prompt $" { fail "print pDe->vg()" } - timeout { fail "print pDe->vg() (timeout)" } - eof { fail "print pDe->vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pADe->vg()\n" - gdb_expect { - -re ".* = 202$nl$gdb_prompt $" { pass "print pADe->vg()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pADe->vg()" - } - -re ".*$gdb_prompt $" { fail "print pADe->vg()" } - timeout { fail "print pADe->vg() (timeout)" } - eof { fail "print pADe->vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pDd->vg()\n" - gdb_expect { - -re ".* = 101$nl$gdb_prompt $" { pass "print pDd->vg()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pDd->vg()" - } - -re ".*$gdb_prompt $" { fail "print pDd->vg()" } - timeout { fail "print pDd->vg() (timeout)" } - eof { fail "print pDd->vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pEe->vvb()\n" - gdb_expect { - -re ".* = 411$nl$gdb_prompt $" { pass "print pEe->vvb()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pEe->vvb()" - } - -re ".*$gdb_prompt $" { fail "print pEe->vvb()" } - timeout { fail "print pEe->vvb() (timeout)" } - eof { fail "print pEe->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pVB->vvb()\n" - gdb_expect { - -re ".* = 407$nl$gdb_prompt $" { pass "print pVB->vvb()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pVB->vvb()" - } - -re ".*$gdb_prompt $" { fail "print pVB->vvb()" } - timeout { fail "print pVB->vvb() (timeout)" } - eof { fail "print pVB->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pBe->vvb()\n" - gdb_expect { - -re ".* = 411$nl$gdb_prompt $" { pass "print pBe->vvb()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pBe->vvb()" - } - -re ".*$gdb_prompt $" { fail "print pBe->vvb()" } - timeout { fail "print pBe->vvb() (timeout)" } - eof { fail "print pBe->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pDe->vvb()\n" - gdb_expect { - -re ".* = 411$nl$gdb_prompt $" { pass "print pDe->vvb()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pDe->vvb()" - } - -re ".*$gdb_prompt $" { fail "print pDe->vvb()" } - timeout { fail "print pDe->vvb() (timeout)" } - eof { fail "print pDe->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pEe->vd()\n" - gdb_expect { - -re ".* = 282$nl$gdb_prompt $" { pass "print pEe->vd()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pEe->vd()" - } - -re ".*$gdb_prompt $" { fail "print pEe->vd()" } - timeout { fail "print pEe->vd() (timeout)" } - eof { fail "print pEe->vd() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - send_gdb "print pEe->fvb()\n" - gdb_expect { - -re ".* = 311$nl$gdb_prompt $" { pass "print pEe->fvb()" } - -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { - setup_xfail hppa*-*-* CLLbs16899 - fail "print pEe->fvb()" - } - -re ".*$gdb_prompt $" { fail "print pEe->fvb()" } - timeout { fail "print pEe->fvb() (timeout)" } - eof { fail "print pEe->fvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } - - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=2.95.3, goption=-gdwarf-2. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=2.95.3, goption=-gstabs+. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=3.0.3, goption=-gdwarf-2. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=3.0.3, goption=-gstabs+. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=3.0.4-20020215, goption=-gdwarf-2. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=3.0.4-20020215, goption=-gstabs+. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=gcc-3_0-branch%2002-02-16, goption=-gdwarf-2. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=gcc-3_0-branch%2002-02-16, goption=-gstabs+. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=HEAD%2002-02-16, goption=-gdwarf-2. - # - # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, - # gdb=HEAD%2002-02-16, gcc=HEAD%2002-02-16, goption=-gstabs+. - # - # -- chastain 2002-02-20 - - send_gdb "print pEe->D::vg()\n" - gdb_expect { - -re ".* = 102$nl$gdb_prompt $" { pass "print pEe->D::vg()" } - -re "Attempt to take address of value not located in memory.\r\n$gdb_prompt $" - { kfail "gdb/1064" "print pEe->D::vg()" } - -re ".*$gdb_prompt $" { fail "print pEe->D::vg()" } - timeout { fail "print pEe->D::vg() (timeout)" } - eof { fail "print pEe->D::vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } - } -} - -proc do_tests {} { - global prms_id - global bug_id - - set prms_id 0 - set bug_id 0 - - gdb_start; - gdb_virtfunc_init; - - runto_main - - test_ptype_of_classes - - if [ runto 'test_calls' ] then { - test_virtual_calls - } -} - -do_tests diff --git a/gdb/testsuite/gdb.cp/Makefile.in b/gdb/testsuite/gdb.cp/Makefile.in new file mode 100644 index 0000000..8f4a90e --- /dev/null +++ b/gdb/testsuite/gdb.cp/Makefile.in @@ -0,0 +1,16 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ + +EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \ + derivation inherit local member-ptr method misc \ + overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace ref-types + +all info install-info dvi install uninstall installcheck check: + @echo "Nothing to be done for $@..." + +clean mostlyclean: + -rm -f *~ *.o *.ci + -rm -f core ${EXECUTABLES} + +distclean maintainer-clean realclean: clean + -rm -f Makefile config.status config.log diff --git a/gdb/testsuite/gdb.cp/ambiguous.cc b/gdb/testsuite/gdb.cp/ambiguous.cc new file mode 100644 index 0000000..6ee7bc1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/ambiguous.cc @@ -0,0 +1,110 @@ + +void marker1() +{ + return; +} + +class A1 { +public: + int x; + int y; +}; + +class A2 { +public: + int x; + int y; +}; + +class A3 { +public: + int x; + int y; +}; + +class X : public A1, public A2 { +public: + int z; +}; + +class L : public A1 { +public: + int z; +}; + +class LV : public virtual A1 { +public: + int z; +}; + +class M : public A2 { +public: + int w; +}; + +class N : public L, public M { +public: + int r; +}; + +class K : public A1 { +public: + int i; +}; + +class KV : public virtual A1 { +public: + int i; +}; + +class J : public K, public L { +public: + int j; +}; + +class JV : public KV, public LV { +public: + int jv; +}; + +class JVA1 : public KV, public LV, public A1 { +public: + int jva1; +}; + +class JVA2 : public KV, public LV, public A2 { +public: + int jva2; +}; + +class JVA1V : public KV, public LV, public virtual A1 { +public: + int jva1v; +}; + +int main() +{ + A1 a1; + A2 a2; + A3 a3; + X x; + L l; + M m; + N n; + K k; + J j; + JV jv; + JVA1 jva1; + JVA2 jva2; + JVA1V jva1v; + + int i; + + i += k.i + m.w + a1.x + a2.x + a3.x + x.z + l.z + n.r + j.j; + + marker1(); + +} + + + diff --git a/gdb/testsuite/gdb.cp/ambiguous.exp b/gdb/testsuite/gdb.cp/ambiguous.exp new file mode 100644 index 0000000..4224b2d --- /dev/null +++ b/gdb/testsuite/gdb.cp/ambiguous.exp @@ -0,0 +1,237 @@ +# Copyright 1998, 1999 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file is part of the gdb testsuite + +# tests relating to ambiguous class members +# Written by Satish Pai 1997-07-28 + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "ambiguous" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +if { $gcc_compiled } then { continue } + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" + send_gdb "cont\n" + gdb_expect { + -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" { pass "up from marker1" } + timeout { fail "up from marker1" } + } + } + -re "$gdb_prompt $" { fail "continue to marker1" } + timeout { fail "(timeout) continue to marker1" } + } + +# print out various class objects' members. The values aren't +# important, just check that the warning is emitted at the +# right times. + +# X is derived from A1 and A2; both A1 and A2 have a member 'x' +send_gdb "print x.x\n" +gdb_expect { + -re "warning: x ambiguous; using X::A2::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print x.x" + } + -re "warning: x ambiguous; using X::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print x.x" + } + -re ".*$gdb_prompt $" { fail "print x.x" } + timeout { fail "(timeout) print x.x" } +} + + +# N is derived from A1 and A2, but not immediately -- two steps +# up in the hierarchy. Both A1 and A2 have a member 'x'. +send_gdb "print n.x\n" +gdb_expect { + -re "warning: x ambiguous; using N::M::A2::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print n.x" + } + -re "warning: x ambiguous; using N::L::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print n.x" + } + -re ".*$gdb_prompt $" { fail "print n.x" } + timeout { fail "(timeout) print n.x" } +} + +# J is derived from A1 twice. A1 has a member x. +send_gdb "print j.x\n" +gdb_expect { + -re "warning: x ambiguous; using J::L::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print j.x" + } + -re "warning: x ambiguous; using J::K::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print j.x" + } + -re ".*$gdb_prompt $" { fail "print j.x" } + timeout { fail "(timeout) print j.x" } +} + +# JV is derived from A1 but A1 is a virtual base. Should not +# report an ambiguity in this case. +send_gdb "print jv.x\n" +gdb_expect { + -re "warning: x ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + fail "print jv.x (ambiguity reported)" + } + -re "\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { pass "print jv.x" } + -re ".*$gdb_prompt $" { fail "print jv.x (??)" } + timeout { fail "(timeout) print jv.x" } +} + +# JVA1 is derived from A1; A1 occurs as a virtual base in two +# ancestors, and as a non-virtual immediate base. Ambiguity must +# be reported. +send_gdb "print jva1.x\n" +gdb_expect { + -re "warning: x ambiguous; using JVA1::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print jva1.x" + } + -re "warning: x ambiguous; using JVA1::KV::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print jva1.x" + } + -re ".*$gdb_prompt $" { fail "print jva1.x" } + timeout { fail "(timeout) print jva1.x" } +} + +# JVA2 is derived from A1 & A2; A1 occurs as a virtual base in two +# ancestors, and A2 is a non-virtual immediate base. Ambiguity must +# be reported as A1 and A2 both have a member 'x'. +send_gdb "print jva2.x\n" +gdb_expect { + -re "warning: x ambiguous; using JVA2::A2::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print jva2.x" + } + -re "warning: x ambiguous; using JVA2::KV::A1::x. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + pass "print jva2.x" + } + -re ".*$gdb_prompt $" { fail "print jva2.x" } + timeout { fail "(timeout) print jva2.x" } +} + +# JVA1V is derived from A1; A1 occurs as a virtual base in two +# ancestors, and also as a virtual immediate base. Ambiguity must +# not be reported. +send_gdb "print jva1v.x\n" +gdb_expect { + -re "warning: x ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { + fail "print jva1v.x (ambiguity reported)" + } + -re "\\$\[0-9\]* = \[-\]*\[0-9\]*\r\n$gdb_prompt $" { pass "print jva1v.x" } + -re ".*$gdb_prompt $" { fail "print jva1v.x (??)" } + timeout { fail "(timeout) print jva1v.x" } +} + +# Now check for ambiguous bases. + +# J is derived from A1 twice; report ambiguity if a J is +# cast to an A1. +send_gdb "print (A1)j\n" +gdb_expect { + -re "warning: A1 ambiguous; using J::L::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { + pass "print (A1)j" + } + -re "warning: A1 ambiguous; using J::K::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { + pass "print (A1)j" + } + -re ".*$gdb_prompt $" { fail "print (A1)j" } + timeout { fail "(timeout) print (A1)j" } +} + +# JV is derived from A1 twice, but A1 is a virtual base; should +# not report ambiguity when a JV is cast to an A1. +send_gdb "print (A1)jv\n" +gdb_expect { + -re "warning: A1 ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { + fail "print (A1)jv (ambiguity reported)" + } + -re "\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { pass "print (A1)jv" } + -re ".*$gdb_prompt $" { fail "print (A1)jv (??)" } + timeout { fail "(timeout) print (A1)jv" } +} + +# JVA1 is derived from A1; A1 is a virtual base and also a +# non-virtual base. Must report ambiguity if a JVA1 is cast to an A1. +send_gdb "print (A1)jva1\n" +gdb_expect { + -re "warning: A1 ambiguous; using JVA1::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { + pass "print (A1)jva1" + } + -re "warning: A1 ambiguous; using JVA1::KV::A1. Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { + pass "print (A1)jva1" + } + -re ".*$gdb_prompt $" { fail "print (A1)jva1" } + timeout { fail "(timeout) print (A1)jva1" } +} + +# JVA1V is derived from A1; A1 is a virtual base indirectly +# and also directly; must not report ambiguity when a JVA1V is cast to an A1. +send_gdb "print (A1)jva1v\n" +gdb_expect { + -re "warning: A1 ambiguous.*Use a cast to disambiguate.\r\n\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { + fail "print (A1)jva1v (ambiguity reported)" + } + -re "\\$\[0-9\]* = \{x = \[-\]*\[0-9\]*, y = \[-\]*\[0-9\]*\}\r\n$gdb_prompt $" { pass "print (A1)jva1v" + } + -re ".*$gdb_prompt $" { fail "print (A1)jva1v (??)" } + timeout { fail "(timeout) print (A1)jva1v" } +} + diff --git a/gdb/testsuite/gdb.cp/annota2.cc b/gdb/testsuite/gdb.cp/annota2.cc new file mode 100644 index 0000000..234752e --- /dev/null +++ b/gdb/testsuite/gdb.cp/annota2.cc @@ -0,0 +1,28 @@ +#include + +class A { +public: + int x; + int y; + int foo (int arg); +}; + + +int A::foo (int arg) +{ + x += arg; + return arg *2; +} + +int main() +{ + A a; + + a.x = 0; + a.x = 1; + a.y = 2; + + printf ("a.x is %d\n", a.x); + return 0; +} + diff --git a/gdb/testsuite/gdb.cp/annota2.exp b/gdb/testsuite/gdb.cp/annota2.exp new file mode 100644 index 0000000..0446eb3 --- /dev/null +++ b/gdb/testsuite/gdb.cp/annota2.exp @@ -0,0 +1,234 @@ +# Copyright 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "annota2" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++ additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# are we on a target board? If so, don't run these tests. +# note: this is necessary because we cannot use runto_main (which would +# work for remote targets too) because of the different prompt we get +# when using annotation level 2. +# +if [is_remote target] then { + return 0 +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +# +# line number where we need to stop in main +# +set main_line 25 + +# The commands we test here produce many lines of output; disable "press +# to continue" prompts. +send_gdb "set height 0\n" +gdb_expect -re "$gdb_prompt $" + +# +# break at main +# +gdb_test "break 25" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint main" + + +# +# NOTE: this prompt is OK only when the annotation level is > 1 +# NOTE: When this prompt is in use the gdb_test procedure cannot be used because +# it assumes that the last char of the gdb_prompt is a white space. This is not +# true with this annotated prompt. So we must use send_gdb and gdb_expect. +# + +set old_gdb_prompt $gdb_prompt +set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n" + +send_gdb "set annotate 2\n" +gdb_expect { + -re "set annotate 2\r\n$gdb_prompt$" { pass "annotation set at level 2" } + -re ".*$gdb_prompt$" { fail "annotation set at level 2" } + timeout { fail "annotation set at level 2 (timeout)" } + } + +send_gdb "run\n" + gdb_expect { + -re "$main_line.*$gdb_prompt$" { pass "run until main breakpoint" } + -re ".*$gdb_prompt$" { fail "run until main breakpoint" } + timeout { fail "run until main breakpoint (timeout)" } + } + +# +# print class 'a' with public fields. +# this will test: +# annotate-field-begin +# annotate-field-name-end +# annotate-field-value +# annotate-field-end +# +send_gdb "print a\n" +gdb_expect { + -re "\r\n\032\032post-prompt\r\n\r\n\032\032value-history-begin 1 -\r\n.*= \r\n\032\032value-history-value\r\n\\{\r\n\032\032field-begin -\r\nx\r\n\032\032field-name-end\r\n = \r\n\032\032field-value\r\n1\r\n\032\032field-end\r\n, \r\n\032\032field-begin -\r\ny\r\n\032\032field-name-end\r\n = \r\n\032\032field-value\r\n2\r\n\032\032field-end\r\n\\}\r\n\r\n\032\032value-history-end\r\n$gdb_prompt$" \ + { pass "print class" } + -re ".*$gdb_prompt$" { fail "print class" } + timeout { fail "print class (timeout)" } +} + +# +# continue until exit +# this will test: +# annotate-exited +# +send_gdb "continue\n" +gdb_expect { + -re "\r\n\032\032post-prompt\r\nContinuing.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\na.x is 1\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032exited 0\r\n\r\nProgram exited normally.\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ + { pass "continue until exit" } + -re ".*$gdb_prompt$" { fail "continue to exit" } + timeout { fail "continue to exit (timeout)" } +} + +# +# delete all breakpoints +# +send_gdb "delete\n" +gdb_expect { + -re ".*Delete all breakpoints. \\(y or n\\) \r\n\032\032query.*$" { + send_gdb "y\n" + gdb_expect { + -re "\r\n\032\032post-query\r\n$gdb_prompt$" { pass "delete bps" } + -re ".*$gdb_prompt$" { fail "delete bps" } + timeout { fail "delete bps (timeout)" } + } + } + -re ".*$gdb_prompt$" { fail "delete bps" } + timeout { fail "delete bps (timeout)" } +} + +# +# break at first line of main. +# +send_gdb "break 22\n" +gdb_expect { + -re "\r\n\032\032post-prompt\r\n\r\n\032\032breakpoints-invalid\r\nBreakpoint.*at $hex: file.*$srcfile, line.*\r\n$gdb_prompt$" \ + { pass "breakpoint at main" } + -re ".*$gdb_prompt$" { fail "break at main" } + timeout { fail "break at main (timeout)" } +} + +# +# change value of main_line +# +set main_line 22 + +# +# run program up to breakpoint. +# + + +send_gdb "run\n" + gdb_expect { + -re "$main_line.*$gdb_prompt$" { pass "run until main breakpoint" } + -re ".*$gdb_prompt$" { fail "run until main breakpoint" } + timeout { fail "run until main breakpoint (timeout)" } + } + +# +# set up a watch point on a.x +# +send_gdb "watch a.x\n" +gdb_expect { + -re "\r\n\032\032post-prompt\r\n\r\n\032\032breakpoints-invalid\r\n.*atchpoint 3: a.x\r\n$gdb_prompt$" \ + { pass "set watch on a.x" } + -re ".*$gdb_prompt$" { fail "set watch on a.x" } + timeout { fail "set watch on a.x (timeout)" } +} + +# +# do a next, so that the watchpoint triggers. This will test: +# annotate-watchpoint +# +send_gdb "next\n" +gdb_expect { + -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032watchpoint 3\r\nWatchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\n\r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*$srcfile\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$decimal\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ + { pass "watch triggered on a.x" } + -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032watchpoint 3\r\n\.*atchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\n\r\n\032\032frame-begin 0 $hex\r\n\r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n.*$srcfile\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n$decimal\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n.*$gdb_prompt$" \ + { pass "watch triggered on a.x" } + -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \ + { kfail "gdb/38" "watch triggered on a.x" } + -re ".*$gdb_prompt$" { fail "watch triggered on a.x" } + timeout { fail "watch triggered on a.x (timeout)" } +} + + +# +# send ^C to gdb, so that the quit() function gets called +# and annotate-quit is tested +# test: +# annotate-quit +# +# This test sometimes fails, but not reproducibly. See gdb/544. +# +send_gdb "\003" +gdb_expect { + -re "\r\n\032\032error-begin\r\nQuit\r\n\r\n\032\032quit\r\n$gdb_prompt$" \ + { pass "annotate-quit" } + -re "$gdb_prompt$" { kfail "gdb/544" "annotate-quit" } + -re ".*$gdb_prompt$" { fail "annotate-quit" } + timeout { fail "annotate-quit (timeout)" } +} + +# +# FIXME: the testsuite does not currently have tests for +# annotate_catchpoints and annotate_function_call +# and a few variants of the annotations that are +# tested (marked by FIXME on the annot?.exp files) +# + +# reinstall the old prompt for the rest of the testsuite. + +set gdb_prompt $old_gdb_prompt + diff --git a/gdb/testsuite/gdb.cp/annota3.cc b/gdb/testsuite/gdb.cp/annota3.cc new file mode 100644 index 0000000..234752e --- /dev/null +++ b/gdb/testsuite/gdb.cp/annota3.cc @@ -0,0 +1,28 @@ +#include + +class A { +public: + int x; + int y; + int foo (int arg); +}; + + +int A::foo (int arg) +{ + x += arg; + return arg *2; +} + +int main() +{ + A a; + + a.x = 0; + a.x = 1; + a.y = 2; + + printf ("a.x is %d\n", a.x); + return 0; +} + diff --git a/gdb/testsuite/gdb.cp/annota3.exp b/gdb/testsuite/gdb.cp/annota3.exp new file mode 100644 index 0000000..431ed4f --- /dev/null +++ b/gdb/testsuite/gdb.cp/annota3.exp @@ -0,0 +1,238 @@ +# Copyright 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Elena Zannoni (ezannoni@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "annota3" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++ additional_flags=-w}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# are we on a target board? If so, don't run these tests. +# note: this is necessary because we cannot use runto_main (which would +# work for remote targets too) because of the different prompt we get +# when using annotation level 2. +# +if [is_remote target] then { + return 0 +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +# +# line number where we need to stop in main +# +set main_line 25 + +# The commands we test here produce many lines of output; disable "press +# to continue" prompts. +send_gdb "set height 0\n" +gdb_expect -re "$gdb_prompt $" + +# +# break at main +# +gdb_test "break 25" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint main" + + +# +# NOTE: this prompt is OK only when the annotation level is > 1 +# NOTE: When this prompt is in use the gdb_test procedure cannot be used because +# it assumes that the last char of the gdb_prompt is a white space. This is not +# true with this annotated prompt. So we must use send_gdb and gdb_expect. +# + +set old_gdb_prompt $gdb_prompt +set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n" + +send_gdb "set annotate 3\n" +gdb_expect_list "annotation set at level 3" "\r\n$gdb_prompt$" { + "set annotate 3" +} + +send_gdb "run\n" +gdb_expect_list "first run until main breakpoint" "$gdb_prompt$" { + "\r\n\032\032post-prompt\r\n" + "Starting program: .*annota3 \r\n" + "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" + "\r\n\032\032starting\r\n" + "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" + "\r\n\032\032breakpoint 1\r\n" + "\r\n" + "Breakpoint 1, main \\(\\) at .*annota3.cc:25\r\n" + "\r\n\032\032source.*annota3.cc:25:.*:beg:0x\[0-9a-z\]+\r\n" + "\r\n\032\032stopped\r\n" +} + +# +# print class 'a' with public fields. +# +send_gdb "print a\n" +gdb_expect_list "print class" "$gdb_prompt$" { + "\r\n\032\032post-prompt\r\n" + ".*= \\{x = 1, y = 2\\}\r\n" +} + +# +# continue until exit +# this will test: +# annotate-exited +# +send_gdb "continue\n" +gdb_expect_list "continue to exit" "$gdb_prompt$" { + "\r\n\032\032post-prompt\r\n" + "Continuing.\r\n" + "\r\n\032\032starting\r\n" + "\r\n\032\032frames-invalid\r\n" + "a.x is 1\r\n" + "\r\n\032\032frames-invalid\r\n" + "\r\n\032\032exited 0\r\n" + "\r\n" + "Program exited normally.\r\n" + "\r\n\032\032frames-invalid\r\n" + "\r\n\032\032stopped\r\n" +} + +# +# delete all breakpoints +# +send_gdb "delete\n" +gdb_expect { + -re ".*Delete all breakpoints. \\(y or n\\) \r\n\032\032query.*$" { + send_gdb "y\n" + gdb_expect { + -re "\r\n\032\032post-query\r\n$gdb_prompt$" { pass "delete bps" } + -re ".*$gdb_prompt$" { fail "delete bps" } + timeout { fail "delete bps (timeout)" } + } + } + -re ".*$gdb_prompt$" { fail "delete bps" } + timeout { fail "delete bps (timeout)" } +} + +# +# break at first line of main. +# +send_gdb "break 22\n" +gdb_expect_list "break at main" "$gdb_prompt$" { + "\r\n\032\032post-prompt\r\n" + "\r\n\032\032breakpoints-invalid\r\n" + "Breakpoint.*at 0x\[a-z0-9\]+: file.*annota3.cc, line 22.\r\n" +} + +# +# run program up to breakpoint. +# + + +send_gdb "run\n" +gdb_expect_list "second run until main breakpoint" "$gdb_prompt$" { + "\r\n\032\032post-prompt\r\n" + "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" + "\r\n\032\032starting\r\n" + "\(\r\n\032\032\(frames-invalid|breakpoints-invalid\)\r\n\)+" + "\r\n\032\032breakpoint 2\r\n" + "\r\n" + "Breakpoint 2, main \\(\\) at .*annota3.cc:22\r\n" + "\r\n\032\032source.*annota3.cc:22:.*:beg:0x\[0-9a-z\]+\r\n" + "\r\n\032\032stopped\r\n" +} + +# +# set up a watch point on a.x +# +send_gdb "watch a.x\n" +gdb_expect_list "set watch on a.x" "$gdb_prompt$" { + "\r\n\032\032post-prompt\r\n" + "\r\n\032\032breakpoints-invalid\r\n" + ".*atchpoint 3: a.x\r\n" \ +} + +# +# do a next, so that the watchpoint triggers. This will test: +# annotate-watchpoint +# +send_gdb "next\n" +gdb_expect { + -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\(\r\n\032\032frames-invalid\r\n\)+\r\n\032\032watchpoint 3\r\nWatchpoint 3: a.x\r\n\r\nOld value = 0\r\nNew value = 1\r\nmain \\(\\) at .*$srcfile:$decimal\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032stopped\r\n.*$gdb_prompt$" { + pass "watch triggered on a.x" + } + -re "\r\n\032\032post-prompt\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032source .*$srcfile.*beg:$hex\r\n\r\n\032\032stopped\r\n$gdb_prompt$" { + kfail "gdb/38" "watch triggered on a.x" + } + -re ".*$gdb_prompt$" { + fail "watch triggered on a.x" + } + timeout { + fail "watch triggered on a.x (timeout)" + } +} + +# +# send ^C to gdb, so that the quit() function gets called +# and annotate-quit is tested +# test: +# annotate-quit +# +# This test sometimes fails, but not reproducibly. See gdb/544. +# +send_gdb "\003" +gdb_expect_list "annotate-quit" "$gdb_prompt$" { + "\r\n\032\032error-begin\r\n" + "Quit\r\n" + "\r\n\032\032quit\r\n" +} + +# +# FIXME: the testsuite does not currently have tests for +# annotate_catchpoints and annotate_function_call +# and a few variants of the annotations that are +# tested (marked by FIXME on the annot?.exp files) +# + +# reinstall the old prompt for the rest of the testsuite. + +set gdb_prompt $old_gdb_prompt + diff --git a/gdb/testsuite/gdb.cp/anon-union.cc b/gdb/testsuite/gdb.cp/anon-union.cc new file mode 100644 index 0000000..0b3fd13 --- /dev/null +++ b/gdb/testsuite/gdb.cp/anon-union.cc @@ -0,0 +1,55 @@ + +struct Foo { + union { + int zero; + unsigned int one; + } num1; + struct X { + int rock; + unsigned int rock2; + }; + union { + int pebble; + X x; + union { + int qux; + unsigned int mux; + }; + unsigned int boulder; + }; + union { + int paper; + unsigned int cloth; + }; + union { + int two; + unsigned int three; + } num2; +}; + +union Bar { + int x; + unsigned int y; +}; + + +int main() +{ + Foo foo = {0, 0}; + + foo.paper = 33; + foo.pebble = 44; + foo.mux = 55; + + Bar bar = {0}; + + union { + int z; + unsigned int w; + }; w = 0; + + bar.x = 33; + + w = 45; + +} diff --git a/gdb/testsuite/gdb.cp/anon-union.exp b/gdb/testsuite/gdb.cp/anon-union.exp new file mode 100644 index 0000000..0d5c777 --- /dev/null +++ b/gdb/testsuite/gdb.cp/anon-union.exp @@ -0,0 +1,348 @@ +# Tests for anonymous union support. +# Copyright 1998, 1999, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# Written by Satish Pai 1997-08-19 + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "anon-union" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + perror "Testcase compile failed" 0 + continue +} + +# Start with a fresh gdb +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "set width 0\n" +gdb_expect -re "$gdb_prompt $" + +#send_gdb "ptype foo\n" +#gdb_expect { +# -re "\r\n$gdb_prompt $" { +# pass "ptype foo" +# } +# -re ".*$gdb_prompt $" { fail "ptype foo" } +# timeout { fail "(timeout) ptype foo" } +#} + +#send_gdb "ptype bar\n" +#gdb_expect { +# -re "\r\n$gdb_prompt $" { +# pass "ptype foo" +# } +# -re ".*$gdb_prompt $" { fail "ptype foo" } +# timeout { fail "(timeout) ptype foo" } +#} + +# NOTE: Add -- ptype foo.x, etc. when things are working + +#Initialize foo +send_gdb "next\n" +gdb_expect { + -re "40\[ \t\]*foo.paper = 33;\r\n$gdb_prompt $" { + pass "next 1" + } + -re ".*$gdb_prompt $" { fail "next 1" } + timeout { fail "(timeout) next 1" } +} + +# Print out the big anon union. +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 0, cloth = 0\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 1" + } + -re ".*$gdb_prompt $" { fail "print foo 1" } + timeout { fail "(timeout) print foo 1" } +} + +# Step over assignment to member + +send_gdb "next\n" +gdb_expect { + -re "41\[ \t\]*foo.pebble = 44;\r\n$gdb_prompt $" { + pass "next 1" + } + -re ".*$gdb_prompt $" { fail "next 1" } + timeout { fail "(timeout) next 1" } +} + +# Now print out anon union again +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 33, cloth = 33\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 2" + } + -re ".*$gdb_prompt $" { fail "print foo 2" } + timeout { fail "(timeout) print foo 2" } +} + +# Modify the member just set +send_gdb "set var foo.cloth = 35\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var foo.cloth" + } + timeout { fail "(timeout) set var foo.cloth" } +} + +# Now print out anon union again to see if the right member was set +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 3" + } + -re ".*$gdb_prompt $" { fail "print foo 3" } + timeout { fail "(timeout) print foo 3" } +} + + +# Step over next assignment to member + +send_gdb "next\n" +gdb_expect { + -re "42\[ \t\]*foo.mux = 55;\r\n$gdb_prompt $" { + pass "next 2" + } + -re ".*$gdb_prompt $" { fail "next 2" } + timeout { fail "(timeout) next 2" } +} + +# Now print out anon union again +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 44, x = \{rock = 44, rock2 = 0\}, \{qux = 44, mux = 44\}, boulder = 44\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 4" + } + -re ".*$gdb_prompt $" { fail "print foo 4" } + timeout { fail "(timeout) print foo 4" } +} + +# Modify the member just set +send_gdb "set var foo.pebble = 45\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var foo.pebble" + } + timeout { fail "(timeout) set var foo.pebble" } +} + +# Now print out anon union again to see if the right member was set +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 45, x = \{rock = 45, rock2 = 0\}, \{qux = 45, mux = 45\}, boulder = 45\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 5" + } + -re ".*$gdb_prompt $" { fail "print foo 5" } + timeout { fail "(timeout) print foo 5" } +} + +# Modify another member at a different level +send_gdb "set var foo.qux = 46\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var foo.qux" + } + timeout { fail "(timeout) set var foo.qux" } +} + +# Now print out anon union again to see if the right member was set +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 46, x = \{rock = 46, rock2 = 0\}, \{qux = 46, mux = 46\}, boulder = 46\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 6" + } + -re ".*$gdb_prompt $" { fail "print foo 6" } + timeout { fail "(timeout) print foo 6" } +} + +# Modify the member at another level, but not the first one in the union +send_gdb "set var foo.mux = 47\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var foo.mux" + } + timeout { fail "(timeout) set var foo.mux" } +} + +# Now print out anon union again to see if things worked +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 47, x = \{rock = 47, rock2 = 0\}, \{qux = 47, mux = 47\}, boulder = 47\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 7" + } + -re ".*$gdb_prompt $" { fail "print foo 7" } + timeout { fail "(timeout) print foo 7" } +} + +# Modify a member of a struct in an anon union +send_gdb "set var foo.x.rock = 48\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var foo.x.rock" + } + timeout { fail "(timeout) set var foo.x.rock" } +} + +# Now print out anon union again to see if things worked +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 48, x = \{rock = 48, rock2 = 0\}, \{qux = 48, mux = 48\}, boulder = 48\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 8" + } + -re ".*$gdb_prompt $" { fail "print foo 8" } + timeout { fail "(timeout) print foo 8" } +} + +# Modify a member of a struct in an anon union, but something +# that doesn't alias to some other union member +send_gdb "set var foo.x.rock2 = 49\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var foo.x.rock2" + } + timeout { fail "(timeout) set var foo.x.rock2" } +} + +# Now print out anon union again to see if things worked +send_gdb "print foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 48, x = \{rock = 48, rock2 = 49\}, \{qux = 48, mux = 48\}, boulder = 48\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" { + pass "print foo 9" + } + -re ".*$gdb_prompt $" { fail "print foo 9" } + timeout { fail "(timeout) print foo 9" } +} + + +# Step over next four assignments +send_gdb "next 4\n" +gdb_expect { + -re "53\[ \t\]*w = 45;\r\n$gdb_prompt $" { + pass "next 3" + } + -re ".*$gdb_prompt $" { fail "next 3" } + timeout { fail "(timeout) next 3" } +} + +# Tests for anon unions that are not members of a class or struct + +send_gdb "print w\n" +gdb_expect { + -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" { + pass "print w 1" + } + -re ".*$gdb_prompt $" { fail "print w 1" } + timeout { fail "(timeout) print w 1" } +} + +send_gdb "print z\n" +gdb_expect { + -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" { + pass "print z 1" + } + -re ".*$gdb_prompt $" { fail "print z 1" } + timeout { fail "(timeout) print z 1" } +} + +# Step over next assignment to w +send_gdb "next\n" +gdb_expect { + -re "55\[ \t\]*\}\r\n$gdb_prompt $" { + pass "next 4" + } + -re ".*$gdb_prompt $" { fail "next 4" } + timeout { fail "(timeout) next 4" } +} + +# See if the change in value is noticed +send_gdb "print w\n" +gdb_expect { + -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" { + pass "print w 2" + } + -re ".*$gdb_prompt $" { fail "print w 2" } + timeout { fail "(timeout) print w 2" } +} + +# See if z shows the same value +send_gdb "print z\n" +gdb_expect { + -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" { + pass "print z 2" + } + -re ".*$gdb_prompt $" { fail "print z 2" } + timeout { fail "(timeout) print z 2" } +} + +# Set the anon union member +send_gdb "set var z = 27\n" +gdb_expect { + -re "\r\n$gdb_prompt $" { + pass "set var z" + } + timeout { fail "(timeout) set var z" } +} + +# See if the change in value is noticed +send_gdb "print w\n" +gdb_expect { + -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" { + pass "print w 3" + } + -re ".*$gdb_prompt $" { fail "print w 3" } + timeout { fail "(timeout) print w 3" } +} + +# See if z shows the same value +send_gdb "print z\n" +gdb_expect { + -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" { + pass "print z 3" + } + -re ".*$gdb_prompt $" { fail "print z 3" } + timeout { fail "(timeout) print z 3" } +} diff --git a/gdb/testsuite/gdb.cp/casts.cc b/gdb/testsuite/gdb.cp/casts.cc new file mode 100644 index 0000000..831add9 --- /dev/null +++ b/gdb/testsuite/gdb.cp/casts.cc @@ -0,0 +1,20 @@ +struct A +{ + int a; + A (int aa): a (aa) {} +}; + +struct B: public A +{ + int b; + B (int aa, int bb): A (aa), b(bb) {} +}; + +int +main (int argc, char **argv) +{ + A *a = new B(42, 1729); + B *b = (B *) a; + + return 0; /* breakpoint spot: casts.exp: 1 */ +} diff --git a/gdb/testsuite/gdb.cp/casts.exp b/gdb/testsuite/gdb.cp/casts.exp new file mode 100644 index 0000000..5b6cabe --- /dev/null +++ b/gdb/testsuite/gdb.cp/casts.exp @@ -0,0 +1,85 @@ +# Copyright 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file is part of the gdb testsuite + +# Test casting, especially between class types or pointer-to-class +# types. + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "casts" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "break [gdb_get_line_number "casts.exp: 1"]" \ + "Breakpoint.*at.* file .*" \ + "" + +gdb_test "continue" "Breakpoint .* at .*casts.cc.*" "" + +# Casting a pointer to a base class to a pointer to a derived class +# should yield the entire derived class. Until August 2002, GDB got +# the enclosing type on `(B *) a' wrong: while the value's static type +# was `B *', as it should be, the enclosing type (which is supposed to +# be the dynamic type) was `A *'. It's senseless to have a static +# type derived from the dynamic type; it should be the other way +# 'round. Dereferencing this oddly typed pointer yielded a value in +# which only the base class's members were initialized, since GDB uses +# the enclosing type to decide how many bytes to read. Members from +# the derived class were garbage, from GDB's address space. +gdb_test "print * (B *) a" ".* = { = {a = 42}, b = 1729}" \ + "cast base class pointer to derived class pointer" + +# Check also that we get the same results from letting the compiler do +# the dereference. +gdb_test "print * b" ".* = { = {a = 42}, b = 1729}" \ + "let compiler cast base class pointer to derived class pointer" diff --git a/gdb/testsuite/gdb.cp/classes.exp b/gdb/testsuite/gdb.cp/classes.exp new file mode 100644 index 0000000..3f398ac --- /dev/null +++ b/gdb/testsuite/gdb.cp/classes.exp @@ -0,0 +1,918 @@ +# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +set ws "\[\r\n\t \]+" +set nl "\[\r\n\]+" + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile "misc" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# +# Test ptype of class objects. +# + +proc test_ptype_class_objects {} { + global gdb_prompt + global ws + global nl + + # Note that struct members are public by default, so we don't print + # "public:" for the public members of structs. + # Accept it if gdb just fails to distinguish between + # class and struct, and everything else is OK. + + send_gdb "ptype struct default_public_struct\n" + gdb_expect { + -re "type = struct default_public_struct \{${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { + pass "ptype struct default_public_struct" + } + -re "type = class default_public_struct \{$nl.*int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct default_public_struct" + } + -re ".*$gdb_prompt $" { fail "ptype struct default_public_struct" } + timeout { fail "ptype struct default_public_struct (timeout)" ; return } + } + + # Note that struct members are public by default, so we don't print + # "public:" for the public members of structs. + # Accept it if gdb just fails to distinguish between + # class and struct, and everything else is OK. + + send_gdb "ptype struct explicit_public_struct\n" + gdb_expect { + -re "type = struct explicit_public_struct \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct explicit_public_struct" + } + -re "type = class explicit_public_struct \{$nl.*int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct explicit_public_struct" + } + -re ".*$gdb_prompt $" { fail "ptype struct explicit_public_struct" } + timeout { fail "ptype struct explicit_public_struct (timeout)" ; return } + } + + # Accept it if gdb just fails to distinguish between + # class and struct, and everything else is OK. + + send_gdb "ptype struct protected_struct\n" + gdb_expect { + -re "type = struct protected_struct \{${ws}protected:${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { + pass "ptype struct protected_struct" + } + -re "type = class protected_struct \{${ws}protected:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct protected_struct" + } + -re ".*$gdb_prompt $" { fail "ptype struct protected_struct" } + timeout { fail "ptype struct protected_struct (timeout)" ; return } + } + + # Accept it if gdb just fails to distinguish between + # class and struct, and everything else is OK. + + send_gdb "ptype struct private_struct\n" + gdb_expect { + -re "type = struct private_struct \{${ws}private:${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { + pass "ptype struct private_struct" + } + -re "type = class private_struct \{${ws}private:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct private_struct" + } + -re ".*$gdb_prompt $" { fail "ptype struct private_struct" } + timeout { fail "ptype struct private_struct (timeout)" ; return } + } + + # Accept it if gdb just fails to distinguish between + # class and struct, and everything else is OK. + + send_gdb "ptype struct mixed_protection_struct\n" + gdb_expect { + -re "type = struct mixed_protection_struct \{${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl\}$nl$gdb_prompt $" { + pass "ptype struct mixed_protection_struct" + } + -re "type = struct mixed_protection_struct \{${ws}public:${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct mixed_protection_struct (extra public)" + } + -re "type = class mixed_protection_struct \{${ws}public:${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl.*\}$nl$gdb_prompt $" { + pass "ptype struct mixed_protection_struct" + } + -re ".*$gdb_prompt $" { fail "ptype struct mixed_protection_struct" } + timeout { fail "ptype struct mixed_protection_struct (timeout)" ; return } + } + + # Accept it if gdb just fails to distinguish between + # class and struct, and everything else is OK. + + send_gdb "ptype class public_class\n" + gdb_expect { + -re "type = class public_class \{${ws}public:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class public_class" + } + -re "type = struct public_class \{${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { + pass "ptype class public_class" + } + -re ".*$gdb_prompt $" { fail "ptype class public_class" } + timeout { fail "ptype class public_class (timeout)" ; return } + } + + send_gdb "ptype class protected_class\n" + gdb_expect { + -re "type = class protected_class \{${ws}protected:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class protected_class" + } + -re "type = struct protected_class \{${ws}int a;${ws}int b;$nl\}$nl$gdb_prompt $" { + fail "ptype class protected_class" + } + -re ".*$gdb_prompt $" { fail "ptype class protected_class" } + timeout { fail "ptype class protected_class (timeout)" ; return } + } + + # Accept it if gdb just emits a superflous "private:" + # attribute, since classes default to private and for consistency with + # structs (where we don't print the "public:" attribute) we don't print + # the "private:" attribute. + + send_gdb "ptype class default_private_class\n" + gdb_expect { + -re "type = class default_private_class \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class default_private_class" + } + -re "type = class default_private_class \{${ws}private:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class default_private_class" + } + -re ".*$gdb_prompt $" { fail "ptype class default_private_class" } + timeout { fail "ptype class default_private_class (timeout)" ; return } + } + + send_gdb "ptype class explicit_private_class\n" + gdb_expect { + -re "type = class explicit_private_class \{${ws}private:${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class explicit_private_class" + } + -re "type = class explicit_private_class \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class explicit_private_class" + } + -re "type = struct explicit_private_class \{${ws}int a;${ws}int b;$nl.*\}$nl$gdb_prompt $" { + fail "ptype class explicit_private_class" + } + -re ".*$gdb_prompt $" { fail "ptype class explicit_private_class" } + timeout { fail "ptype class explicit_private_class (timeout)" ; return } + } + + send_gdb "ptype class mixed_protection_class\n" + gdb_expect { + -re "type = class mixed_protection_class \{${ws}public:${ws}int a;${ws}int b;${ws}private:${ws}int c;${ws}int d;${ws}protected:${ws}int e;${ws}int f;${ws}public:${ws}int g;${ws}private:${ws}int h;${ws}protected:${ws}int i;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class mixed_protection_class" + } + -re "type = struct mixed_protection_class \{${ws}int a;${ws}int b;${ws}int c;${ws}int d;${ws}int e;${ws}int f;${ws}int g;${ws}int h;${ws}int i;$nl.*\}$nl$gdb_prompt $" { + fail "ptype class mixed_protection_class" + } + -re ".*$gdb_prompt $" { fail "ptype class mixed_protection_class" } + timeout { fail "ptype class mixed_protection_class (timeout)" ; return } + } + + # This class does not use any C++-specific features, so it's fine for + # it to print as "struct". + send_gdb "ptype class A\n" + gdb_expect { + -re "type = (class|struct) A \{(${ws}public:|)${ws}int a;${ws}int x;((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\((A const|const A) ?&\\);)|(${ws}A\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class A" + } + -re ".*$gdb_prompt $" { + fail "ptype class A" + } + timeout { + fail "ptype class A (timeout)" + return + } + } + + send_gdb "ptype class B\n" + gdb_expect { + -re "type = class B : public A \{${ws}public:${ws}int b;${ws}int x;${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class B" + } + -re "type = class B : public A \{${ws}public:${ws}int b;${ws}int x;((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(B const ?&\\);)|(${ws}B\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class B (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class B" + } + timeout { + fail "ptype class B (timeout)" + return + } + } + + send_gdb "ptype class C\n" + gdb_expect { + -re "type = class C : public A \{${ws}public:${ws}int c;${ws}int x;${ws}C & operator=\\(C const ?&\\);${ws}C\\((C const|const C) ?&\\);${ws}C\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class C" + } + -re "type = class C : public A \{${ws}public:${ws}int c;${ws}int x;((${ws}C & operator=\\(C const ?&\\);)|(${ws}C\\(C const ?&\\);)|(${ws}C\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class C (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class C" + } + timeout { + fail "ptype class C (timeout)" + return + } + } + + send_gdb "ptype class D\n" + gdb_expect { + -re "type = class D : public B, public C \{${ws}public:${ws}int d;${ws}int x;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class D" + } + -re "type = class D : public B, public C \{${ws}public:${ws}int d;${ws}int x;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(D const ?&\\);)|(${ws}D\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class D (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class D" + } + timeout { + fail "ptype class D (timeout)" + return + } + } + + send_gdb "ptype class E\n" + gdb_expect { + -re "type = class E : public D \{${ws}public:${ws}int e;${ws}int x;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class E" + } + -re "type = class E : public D \{${ws}public:${ws}int e;${ws}int x;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\((E const|const E) ?&\\);)|(${ws}E\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class E" + } + -re ".*$gdb_prompt $" { + fail "ptype class E" + } + timeout { + fail "ptype class E (timeout)" + return + } + } + + # With g++ 2.x and stabs debug info, we misinterpret static methods + # whose name matches their argument mangling. + send_gdb "ptype class Static\n" + gdb_expect { + -re "type = (class|struct) Static \{(${ws}public:|)${ws}Static & operator=\\(Static const ?&\\);${ws}Static\\((Static const|const Static) ?&\\);${ws}Static\\((void|)\\);${ws}static void ii\\(int, int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class Static" + } + -re "type = (class|struct) Static \{(${ws}public:|)${ws}static void ii\\(int, int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class Static" + } + -re ".*$gdb_prompt $" { + fail "ptype class Static" + } + timeout { + fail "ptype class Static (timeout)" + return + } + } + + send_gdb "ptype class vA\n" + gdb_expect { + -re "type = (class|struct) vA \{(${ws}public:|)${ws}int va;${ws}int vx;${ws}\}$nl$gdb_prompt $" { + pass "ptype class vA" + } + -re "type = (class|struct) vA \{(${ws}public:|)${ws}int va;${ws}int vx;${ws}vA & operator=\\(vA const ?&\\);${ws}vA\\((vA const|const vA) ?&\\);${ws}vA\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class vA" + } + -re "type = (class|struct) vA \{(${ws}public:|)${ws}int va;${ws}int vx;((${ws}vA & operator=\\(vA const ?&\\);)|(${ws}vA\\(vA const ?&\\);)|(${ws}vA\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class vA (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class vA" + } + timeout { + fail "ptype class vA (timeout)" + return + } + } + + # Accept the form with embedded GNU style mangled virtual table constructs + # for now, but with a FIXME. At some future point, gdb should use a + # portable representation for the virtual table constructs. + + # The format of a g++ virtual base pointer. + set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?" + + send_gdb "ptype class vB\n" + gdb_expect { + -re "type = class vB : public virtual vA \{${ws}public:${ws}int vb;${ws}int vx;${ws}vB & operator=\\(vB const ?&\\);${ws}vB\\((vB const|const vB) ?&\\);${ws}vB\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class vB" + } + -re "type = class vB : public virtual vA \{${ws}private:${ws}vA \\*${vbptr}vA;${ws}public:${ws}int vb;${ws}int vx;${ws}vB & operator=\\(vB const ?&\\);${ws}vB\\(int, vB const ?&\\);${ws}vB\\(int\\);${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vB (FIXME: non-portable virtual table constructs)" + } + -re "type = class vB : public virtual vA \{${ws}public:${ws}int vb;${ws}int vx;${ws}\}$nl$gdb_prompt $" { + pass "ptype class vB" + } + -re "type = class vB : public virtual vA \{${ws}private:${ws}vA \\*_vb.vA;${ws}public:${ws}int vb;${ws}int vx;((${ws}vB & operator=\\(vB const ?&\\);)|(${ws}vB\\(int, vB const ?&\\);)|(${ws}vB\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vB (FIXME) (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class vB" + } + timeout { + fail "ptype class vB (timeout)" + return + } + } + + # Accept the form with embedded GNU style mangled virtual table constructs + # for now, but with a FIXME. At some future point, gdb should use a + # portable representation for the virtual table constructs. + + send_gdb "ptype class vC\n" + gdb_expect { + -re "type = class vC : public virtual vA \{${ws}public:${ws}int vc;${ws}int vx;${ws}vC & operator=\\(vC const ?&\\);${ws}vC\\((vC const|const vC) ?&\\);${ws}vC\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class vC" + } + -re "type = class vC : public virtual vA \{${ws}private:${ws}vA \\*${vbptr}vA;${ws}public:${ws}int vc;${ws}int vx;${ws}vC & operator=\\(vC const ?&\\);${ws}vC\\(int, vC const ?&\\);${ws}vC\\(int\\);${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vC (FIXME: non-portable virtual table constructs)" + } + -re "type = class vC : public virtual vA \{${ws}public:${ws}int vc;${ws}int vx;${ws}\}$nl$gdb_prompt $" { + pass "ptype class vC" + } + -re "type = class vC : public virtual vA \{${ws}private:${ws}vA \\*_vb.vA;${ws}public:${ws}int vc;${ws}int vx;((${ws}vC & operator=\\(vC const ?&\\);)|(${ws}vC\\(int, vC const ?&\\);)|(${ws}vC\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vC (FIXME) (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class vC" + } + timeout { + fail "ptype class vC (timeout)" + return + } + } + + # Accept the form with embedded GNU style mangled virtual table constructs + # for now, but with a FIXME. At some future point, gdb should use a + # portable representation for the virtual table constructs. + + send_gdb "ptype class vD\n" + gdb_expect { + -re "type = class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;${ws}vD & operator=\\(vD const ?&\\);${ws}vD\\((vD const|const vD) ?&\\);${ws}vD\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class vD" + } + -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;${ws}vD & operator=\\(vD const ?&\\);${ws}vD\\(int, vD const ?&\\);${ws}vD\\(int\\);${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vD (FIXME: non-portable virtual table constructs)" + } + -re "type = class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;${ws}\}$nl$gdb_prompt $" { + pass "ptype class vD" + } + -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*_vb.vC;${ws}vB \\*_vb.vB;${ws}public:${ws}int vd;${ws}int vx;((${ws}vD & operator=\\(vD const ?&\\);)|(${ws}vD\\(int, vD const ?&\\);)|(${ws}vD\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vD (FIXME) (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class vD" + } + timeout { + fail "ptype class vD (timeout)" + return + } + } + + # Accept the form with embedded GNU style mangled virtual table constructs + # for now, but with a FIXME. At some future point, gdb should use a + # portable representation for the virtual table constructs. + + send_gdb "ptype class vE\n" + gdb_expect { + -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;${ws}vE & operator=\\(vE const ?&\\);${ws}vE\\((vE const|const vE) ?&\\);${ws}vE\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class vE" + } + -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;${ws}vE & operator=\\(vE const ?&\\);${ws}vE\\(int, vE const ?&\\);${ws}vE\\(int\\);${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vE (FIXME: non-portable virtual table constructs)" + } + -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;${ws}\}$nl$gdb_prompt $" { + pass "ptype class vE" + } + -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*_vb.vD;${ws}public:${ws}int ve;${ws}int vx;((${ws}vE & operator=\\(vE const ?&\\);)|(${ws}vE\\(int, vE const ?&\\);)|(${ws}vE\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype class vE (FIXME) (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class vE" + } + timeout { + fail "ptype class vE (timeout)" + return + } + } + + send_gdb "ptype class Base1\n" + gdb_expect { + -re "type = class Base1 \{${ws}public:${ws}int x;${ws}Base1 & operator=\\(Base1 const ?&\\);${ws}Base1\\(((Base1 const)|(const Base1)) ?&\\);${ws}Base1\\(int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class Base1" + } + -re "type = class Base1 \{${ws}public:${ws}int x;${ws}Base1\\(int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class Base1" + } + -re "type = class Base1 \{${ws}public:${ws}int x;((${ws}Base1 & operator=\\(Base1 const ?&\\);)|(${ws}Base1\\(Base1 const ?&\\);)|(${ws}Base1\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class Base1 (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class Base1" + } + timeout { + fail "ptype class Base1 (timeout)" + return + } + } + + send_gdb "ptype class Foo\n" + gdb_expect { + -re "type = class Foo \{${ws}public:${ws}int x;${ws}int y;${ws}static int st;\r\n${ws}Foo\\(int, int\\);${ws}int operator!\\((void|)\\);${ws}operator int\\((void|)\\);${ws}int times\\(int\\);$nl\}$nl$gdb_prompt $" { + pass "ptype class Foo" + } + -re "type = class Foo \{${ws}public:${ws}int x;${ws}int y;${ws}static int st;${ws}Foo & operator=\\(Foo const ?&\\);${ws}Foo\\((Foo const|const Foo) ?&\\);${ws}Foo\\(int, int\\);${ws}int operator!\\((void|)\\);${ws}operator int\\((void|)\\);${ws}int times\\(int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class Foo" + } + -re "type = class Foo \{${ws}public:${ws}int x;${ws}int y;${ws}static int st;((${ws}Foo & operator=\\(Foo const ?&\\);)|(${ws}Foo\\(Foo const ?&\\);)|(${ws}Foo\\(int, int\\);)|(${ws}int operator!\\((void|)\\);)|(${ws}int operator int\\((void|)\\);)|(${ws}int times\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class Foo (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class Foo" + } + timeout { + fail "ptype class Foo (timeout)" + return + } + } + + send_gdb "ptype class Bar\n" + gdb_expect { + -re "type = class Bar : public Base1, public Foo \{${ws}public:${ws}int z;${ws}Bar & operator=\\(Bar const ?&\\);${ws}Bar\\((Bar const|const Bar) ?&\\);${ws}Bar\\(int, int, int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype class Bar" + } + -re "type = class Bar : public Base1, public Foo \{${ws}public:${ws}int z;((${ws}Bar & operator=\\(Bar const ?&\\);)|(${ws}Bar\\(Bar const ?&\\);)|(${ws}Bar\\(int, int, int\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype class Bar (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype class Bar" + } + timeout { + fail "ptype class Bar (timeout)" + return + } + } +} + +# +# Test simple access to class members. +# + +proc test_non_inherited_member_access {} { + global gdb_prompt + + # Print non-inherited members of g_A. + + gdb_test "print g_A.a" ".* = 1" "g_A.a incorrect" + + gdb_test "print g_A.x" ".* = 2" "g_A.x incorrect" + + # Print non-inherited members of g_B. + + gdb_test "print g_B.b" ".* = 5" "g_B.b incorrect" + + gdb_test "print g_B.x" ".* = 6" "g_B.x incorrect" + + # Print non-inherited members of g_C. + + gdb_test "print g_C.c" ".* = 9" "g_C.c incorrect" + + gdb_test "print g_C.x" ".* = 10" "g_C.x incorrect" + + # Print non-inherited members of g_D. + + gdb_test "print g_D.d" ".* = 19" "g_D.d incorrect" + + gdb_test "print g_D.x" ".* = 20" "g_D.x incorrect" + + # Print non-inherited members of g_E. + + gdb_test "print g_E.e" ".* = 31" "g_E.e incorrect" + + gdb_test "print g_E.x" ".* = 32" "g_E.x incorrect" +} + +# +# Try access to non-members that are members of another class. +# Should give errors. +# + +proc test_wrong_class_members {} { + global gdb_prompt + + gdb_test "print g_A.b" "There is no member( or method|) named b." "print g_A.b should be error" + + gdb_test "print g_B.c" "There is no member( or method|) named c." "print g_B.c should be error" + + gdb_test "print g_B.d" "There is no member( or method|) named d." "print g_B.d should be error" + + gdb_test "print g_C.b" "There is no member( or method|) named b." "print g_C.b should be error" + + gdb_test "print g_C.d" "There is no member( or method|) named d." "print g_C.d should be error" + + gdb_test "print g_D.e" "There is no member( or method|) named e." "print g_D.e should be error" +} + +# +# Try access to non-members that are not members of any class. +# Should give errors. +# + +proc test_nonexistent_members {} { + global gdb_prompt + + gdb_test "print g_A.y" "There is no member( or method|) named y." "print g_A.y should be error" + + gdb_test "print g_B.z" "There is no member( or method|) named z." "print g_B.z should be error" + + gdb_test "print g_C.q" "There is no member( or method|) named q." "print g_C.q should be error" + + gdb_test "print g_D.p" "There is no member( or method|) named p." "print g_D.p should be error" +} + +# +# Call a method that expects a base class parameter with base, inherited, +# and unrelated class arguments. +# + +proc test_method_param_class {} { + gdb_test "call class_param.Aptr_a (&g_A)" ".* = 1" "base class param->a" + gdb_test "call class_param.Aptr_x (&g_A)" ".* = 2" "base class param->x" + gdb_test "call class_param.Aptr_a (&g_B)" ".* = 3" "inherited class param->a" + gdb_test "call class_param.Aptr_x (&g_B)" ".* = 4" "inherited class param->x" + gdb_test "call class_param.Aref_a (g_A)" ".* = 1" "base class (¶m)->a" + gdb_test "call class_param.Aref_x (g_A)" ".* = 2" "base class (¶m)->x" + gdb_test "call class_param.Aref_a (g_B)" ".* = 3" "inherited class (¶m)->a" + gdb_test "call class_param.Aref_x (g_B)" ".* = 4" "inherited class (¶m)->x" + gdb_test "call class_param.Aval_a (g_A)" ".* = 1" "base class param.a" + gdb_test "call class_param.Aval_x (g_A)" ".* = 2" "base class param.x" + gdb_test "call class_param.Aval_a (g_B)" ".* = 3" "inherited class param.a" + gdb_test "call class_param.Aval_x (g_B)" ".* = 4" "inherited class param.x" + + gdb_test "call class_param.Aptr_a (&foo)" "Cannot resolve .*" "unrelated class *param" + gdb_test "call class_param.Aref_a (foo)" "Cannot resolve .*" "unrelated class ¶m" + gdb_test "call class_param.Aval_a (foo)" "Cannot resolve .*" "unrelated class param" +} + +# +# Examine a class with an enum field. +# + +proc test_enums {} { + global gdb_prompt + global hp_aCC_compiler + + # print the object + send_gdb "print obj_with_enum\n" + gdb_expect { + -re "\\$\[0-9\]* = \\{priv_enum = red, x = 0\\}.*$gdb_prompt $" { pass "print obj_with_enum (1)" } + -re "$gdb_prompt $" { fail "print obj_with_enum (1)" } + timeout { fail "(timeout) print obj_with_enum (1)" } + } + + send_gdb "next\n" + gdb_expect { + -re "$gdb_prompt $" { pass "next" } + timeout { fail "(timeout) next" } + } + + # print the object again + send_gdb "print obj_with_enum\n" + gdb_expect { + -re "\\$\[0-9\]* = \\{priv_enum = green, x = 0\\}.*$gdb_prompt $" { pass "print obj_with_enum (2)" } + -re "$gdb_prompt $" { fail "print obj_with_enum (2)" } + timeout { fail "(timeout) print obj_with_enum (2)" } + } + + # print out the enum member + send_gdb "print obj_with_enum.priv_enum\n" + gdb_expect { + -re "\\$\[0-9\]* = green.*$gdb_prompt $" { pass "print obj_with_enum.priv_enum" } + -re "$gdb_prompt $" { fail "print obj_with_enum.priv_enum" } + timeout { fail "(timeout) print obj_with_enum.priv_enum" } + } + + # ptype on the enum member + # The third success case is a little dubious, but it's not clear what + # ought to be required of a ptype on a private enum... -sts 19990324 + send_gdb "ptype obj_with_enum.priv_enum\n" + gdb_expect { + -re "type = enum ClassWithEnum::PrivEnum \\{red, green, blue, yellow = 42\\}.*$gdb_prompt $" { pass "ptype obj_with_enum.priv_enum" } + -re "type = enum PrivEnum \\{red, green, blue, yellow = 42\\}.*$gdb_prompt $" { pass "ptype obj_with_enum.priv_enum" } + -re "type = enum \\{red, green, blue, yellow = 42\\}.*$gdb_prompt $" { pass "ptype obj_with_enum.priv_enum" } + -re "$gdb_prompt $" { fail "ptype obj_with_enum.priv_enum" } + timeout { fail "(timeout) ptype obj_with_enum.priv_enum" } + } + + # ptype on the object + send_gdb "ptype obj_with_enum\n" + gdb_expect { + -re "type = class ClassWithEnum \\{\r\n\[ \t\]*public:\r\n\[ \t\]*(enum |)ClassWithEnum::PrivEnum priv_enum;\r\n\[ \t\]*int x;\r\n\\}\r\n$gdb_prompt $" { pass "ptype obj_with_enum" } + -re "type = class ClassWithEnum \\{\r\n\[ \t\]*public:\r\n\[ \t\]*(enum |)PrivEnum priv_enum;\r\n\[ \t\]*int x;.*\\}\r\n$gdb_prompt $" + { + # NOTE: carlton/2003-02-28: One could certainly argue that + # this output is acceptable: PrivEnum is a member of + # ClassWithEnum, so there's no need to explicitly qualify + # its name with "ClassWithEnum::". The truth, though, is + # that GDB is simply forgetting that PrivEnum is a member + # of ClassWithEnum, so we do that output for a bad reason + # instead of a good reason. Under stabs, we probably + # can't get this right; under DWARF-2, we can. + kfail "gdb/57" "ptype obj_with_enum" + } + -re "$gdb_prompt $" { fail "ptype obj_with_enum" } + timeout { fail "(timeout) ptype obj_with_enum" } + } + + # We'll do this test twice, because of a parser bug: see + # PR gdb/826. + + send_gdb "print (ClassWithEnum::PrivEnum) 42\n" + gdb_expect { + -re "\\$\[0-9\]* = yellow.*$gdb_prompt $" { pass "print (ClassWithEnum::PrivEnum) 42" } + -re "A parse error in expression, near `42'.\r\n$gdb_prompt $" + { kfail "gdb/826" "print (ClassWithEnum::PrivEnum) 42" } + -re "$gdb_prompt $" { fail "print (ClassWithEnum::PrivEnum) 42" } + timeout { fail "(timeout) print (ClassWithEnum::PrivEnum) 42" } + } + + send_gdb "print ('ClassWithEnum::PrivEnum') 42\n" + gdb_expect { + -re "\\$\[0-9\]* = yellow.*$gdb_prompt $" { pass "print ('ClassWithEnum::PrivEnum') 42" } + -re "No symbol \"ClassWithEnum::PrivEnum\" in current context.\r\n$gdb_prompt $" + { kfail "gdb/57" "print ('ClassWithEnum::PrivEnum') 42" } + -re "$gdb_prompt $" { fail "print ('ClassWithEnum::PrivEnum') 42" } + timeout { fail "(timeout) print ('ClassWithEnum::PrivEnum') 42" } + } +} + +# +# Pointers to class members +# + +proc test_pointers_to_class_members {} { + global gdb_prompt + global decimal + global nl + + gdb_test "print Bar::z" ".* = .int\[ \]*\[( \]*Bar::&\[)\]+\[ \]*Bar::z" "print Bar::z" + + gdb_test "print &Foo::x" ".* = .int\[ \]*\[( \]*Foo::\[*)\]+\[ \]*&Foo::x" "print &Foo::x" + + gdb_test "print (int)&Foo::x" ".* = 0" "print (int)&Foo::x" + + send_gdb "print (int)&Bar::y == 2*sizeof(int)\n" + gdb_expect { + -re ".* = true$nl$gdb_prompt $" { + pass "print (int)&Bar::y == 2*sizeof(int)" + } + -re "There is no field named y.*$gdb_prompt $" { + setup_xfail "*-*-*" + fail "print (int)&Bar::y == 2*sizeof(int)" + } + -re ".*$gdb_prompt $" { fail "print (int)&Bar::y == 2*sizeof(int)" } + timeout { fail "print (int)&Bar::y == 2*sizeof(int) (timeout)" ; return } + } + + send_gdb "next 2\n" + setup_xfail "*-*-*" + gdb_expect { + -re "$decimal\[ \t\]+inheritance3 \[)(\]+;$nl$gdb_prompt $" {} + -re ".*$gdb_prompt $" { fail "next to inheritance3" ; return } + } + clear_xfail "*-*-*" + + gdb_test "print (int)pmi == sizeof(int)" ".* = false" "print (int)pmi == sizeof(int)" +} + +# +# Test static members. +# + +proc test_static_members {} { + global gdb_prompt + global hex + global nl + + send_gdb "print Foo::st\n" + gdb_expect { + -re ".* = 100$nl$gdb_prompt $" { + pass "print Foo::st" + } + -re "There is no field named st.*$gdb_prompt $" { + setup_xfail "*-*-*" + fail "print Foo::st" + } + -re ".*$gdb_prompt $" { fail "print Foo::st" } + timeout { fail "print Foo::st (timeout)" ; return } + } + + send_gdb "set foo.st = 200\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + } + + send_gdb "print bar.st\n" + gdb_expect { + -re ".* = 200$nl$gdb_prompt $" { + pass "print bar.st" + } + -re "There is no member( or method|) named st.*$gdb_prompt $" { + setup_xfail "*-*-*" + fail "print bar.st" + } + -re ".*$gdb_prompt $" { fail "print bar.st" } + timeout { fail "print bar.st (timeout)" ; return } + } + + send_gdb "print &foo.st\n" + gdb_expect { + -re ".* = .int \[*)\]+ $hex$nl$gdb_prompt $" { + pass "print &foo.st" + } + -re "There is no member( or method|) named st.*$gdb_prompt $" { + setup_xfail "*-*-*" + fail "print &foo.st" + } + -re ".*$gdb_prompt $" { fail "print &foo.st" } + timeout { fail "print &foo.st (timeout)" ; return } + } + + set got_bar_st 0 + send_gdb "print &Bar::st\n" + gdb_expect { + -re ".* = .int \[*)\]+ $hex$nl$gdb_prompt $" { + pass "print &Bar::st" + set got_bar_st 1 + } + -re "There is no field named st.*$gdb_prompt $" { + setup_xfail "*-*-*" + fail "print &Bar::st" + } + -re ".*$gdb_prompt $" { fail "print &Bar::st" } + timeout { fail "print &Bar::st (timeout)" ; return } + } + + if $got_bar_st then { + gdb_test "print *\$" ".* = 200" "print *\$" + } + + gdb_test "set print static-members off" "" + gdb_test "print csi" \ + "{x = 10, y = 20}" \ + "print csi without static members" + gdb_test "print cnsi" \ + "{x = 30, y = 40}" \ + "print cnsi without static members" + + gdb_test "set print static-members on" "" + gdb_test "print csi" \ + "{x = 10, y = 20, static null = {x = 0, y = 0, static null = }}" \ + "print csi with static members" + gdb_test "print cnsi" \ + "{x = 30, y = 40, static null = {x = 0, y = 0, static null = , static yy = {z = 5, static xx = {x = 1, y = 2, static null = , static yy = }}}, static yy = }" \ + "print cnsi with static members" +} + +proc do_tests {} { + global prms_id + global bug_id + global subdir + global objdir + global srcdir + global binfile + global gdb_prompt + + set prms_id 0 + set bug_id 0 + + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + + send_gdb "set language c++\n" + gdb_expect -re "$gdb_prompt $" + send_gdb "set width 0\n" + gdb_expect -re "$gdb_prompt $" + + runto_main + test_ptype_class_objects + + if [ runto 'inheritance2' ] then { + test_non_inherited_member_access + test_wrong_class_members + test_nonexistent_members + test_method_param_class + } + + gdb_breakpoint enums2 + if [ gdb_continue "enums2(\\(\\)|)" ]==0 then { + gdb_test "finish" "" "" + test_enums + } + + if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + } + + if [ runto_main ] then { + test_pointers_to_class_members + test_static_members + } + + if [istarget "mips-idt-*"] then { + # Restart because IDT/SIM runs out of file descriptors. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + } + + if [ runto marker_reg1 ] then { + + gdb_test "finish" "Run till exit from.*" "finish from marker_reg1" + + send_gdb "print v.method ()\n" + gdb_expect { + -re "= 82.*$gdb_prompt $" { + pass "calling method for small class" + } + -re "Address requested for identifier .v. which is in register.*$gdb_prompt $" { + setup_xfail "*-*-*" 2972 + fail "calling method for small class" + } + -re ".*$gdb_prompt $" { fail "calling method for small class" } + timeout { fail "calling method for small class (timeout)" } + eof { fail "calling method for small class (eof)" } + } + } + +} + +do_tests + +send_gdb "maint demangle inheritance1__Fv\n" +gdb_expect { + -re "inheritance1\\(void\\).*$gdb_prompt $" { pass "demangle" } + -re ".*$gdb_prompt $" { fail "demangle" } + timeout { fail "(timeout) demangle" } +} diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.cc b/gdb/testsuite/gdb.cp/cplusfuncs.cc new file mode 100644 index 0000000..7f033d6 --- /dev/null +++ b/gdb/testsuite/gdb.cp/cplusfuncs.cc @@ -0,0 +1,196 @@ +#include + +class foo { +public: + foo (int); + foo (int, const char *); + foo (foo&); + ~foo (); + + void operator * (foo&); + void operator % (foo&); + void operator - (foo&); + void operator >> (foo&); + void operator != (foo&); + void operator > (foo&); + void operator >= (foo&); + void operator | (foo&); + void operator && (foo&); + void operator ! (void); + void operator ++ (int); + void operator = (foo&); + void operator += (foo&); + void operator *= (foo&); + void operator %= (foo&); + void operator >>= (foo&); + void operator |= (foo&); + void operator , (foo&); + void operator / (foo&); + void operator + (foo&); + void operator << (foo&); + void operator == (foo&); + void operator < (foo&); + void operator <= (foo&); + void operator & (foo&); + void operator ^ (foo&); + void operator || (foo&); + void operator ~ (void); + void operator -- (int); + foo* operator -> (void); + void operator -= (foo&); + void operator /= (foo&); + void operator <<= (foo&); + void operator &= (foo&); + void operator ^= (foo&); + void operator ->* (foo&); + void operator [] (foo&); + void operator () (foo&); + void* operator new (size_t) throw (); + void operator delete (void *); + /**/ operator int (); + /**/ operator char* (); + + int foofunc (int); // forced to have int return type, which is required + int foofunc (int, signed char *); // forced to have int return type, which is required + int ifoo; + const char *ccpfoo; +}; + +#ifdef usestubs +extern "C" { + void set_debug_traps(); + void breakpoint(); +}; +#endif + +int main () { +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + int z=3; +} + +foo::foo (int i) { ifoo = i;} +foo::foo (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; } +foo::foo (foo& afoo) { afoo.ifoo = 0; } +foo::~foo () {} + +void foo::operator * (foo& afoo) { afoo.ifoo = 0; } +void foo::operator % (foo& afoo) { afoo.ifoo = 0; } +void foo::operator - (foo& afoo) { afoo.ifoo = 0; } +void foo::operator >> (foo& afoo) { afoo.ifoo = 0; } +void foo::operator != (foo& afoo) { afoo.ifoo = 0; } +void foo::operator > (foo& afoo) { afoo.ifoo = 0; } +void foo::operator >= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator | (foo& afoo) { afoo.ifoo = 0; } +void foo::operator && (foo& afoo) { afoo.ifoo = 0; } +void foo::operator ! (void) {} +void foo::operator ++ (int ival) { ival = 0; } +void foo::operator = (foo& afoo) { afoo.ifoo = 0; } +void foo::operator += (foo& afoo) { afoo.ifoo = 0; } +void foo::operator *= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator %= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator >>= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator |= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator , (foo& afoo) { afoo.ifoo = 0; } +void foo::operator / (foo& afoo) { afoo.ifoo = 0; } +void foo::operator + (foo& afoo) { afoo.ifoo = 0; } +void foo::operator << (foo& afoo) { afoo.ifoo = 0; } +void foo::operator == (foo& afoo) { afoo.ifoo = 0; } +void foo::operator < (foo& afoo) { afoo.ifoo = 0; } +void foo::operator <= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator & (foo& afoo) { afoo.ifoo = 0; } +void foo::operator ^ (foo& afoo) { afoo.ifoo = 0; } +void foo::operator || (foo& afoo) { afoo.ifoo = 0; } +void foo::operator ~ (void) {} +void foo::operator -- (int ival) { ival = 0; } +foo* foo::operator -> (void) {return this;} +void foo::operator -= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator /= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator <<= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator &= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator ^= (foo& afoo) { afoo.ifoo = 0; } +void foo::operator ->* (foo& afoo) { afoo.ifoo = 0; } +void foo::operator [] (foo& afoo) { afoo.ifoo = 0; } +void foo::operator () (foo& afoo) { afoo.ifoo = 0; } +void* foo::operator new (size_t ival) throw () { ival = 0; return 0; } +void foo::operator delete (void *ptr) { ptr = 0; } +/**/ foo::operator int () { return 0; } +/**/ foo::operator char* () { return 0; } + +/* Some functions to test overloading by varying one argument type. */ + +void overload1arg (void) { } +void overload1arg (char arg) { arg = 0; } +void overload1arg (signed char arg) { arg = 0; } +void overload1arg (unsigned char arg) { arg = 0; } +void overload1arg (short arg) { arg = 0; } +void overload1arg (unsigned short arg) { arg = 0; } +void overload1arg (int arg) { arg = 0; } +void overload1arg (unsigned int arg) { arg = 0; } +void overload1arg (long arg) { arg = 0; } +void overload1arg (unsigned long arg) { arg = 0; } +void overload1arg (float arg) { arg = 0; } +void overload1arg (double arg) { arg = 0; } + +/* Some functions to test overloading by varying argument count. */ + +void overloadargs (int a1) { a1 = 0; } +void overloadargs (int a1, int a2) { a1 = a2 = 0; } +void overloadargs (int a1, int a2, int a3) { a1 = a2 = a3 = 0; } +void overloadargs (int a1, int a2, int a3, int a4) + { a1 = a2 = a3 = a4 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5) + { a1 = a2 = a3 = a4 = a5 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6) + { a1 = a2 = a3 = a4 = a5 = a6 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = + a10 = 0; } +void overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10, int a11) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = + a10 = a11 == 0; } + +/* Some hairy function definitions. + Use typedefs to help maintain sanity. */ + +typedef int (*PFPc_i)(char *); +typedef short (*PFPl_s)(long *); +typedef short (*PFPc_s)(char *); +typedef int (*PFl_i)(long); +typedef PFl_i (*PFPc_PFl_i)(char *); +typedef PFl_i (*PFPi_PFl_i)(int *); +typedef PFl_i (*PFPFPc_i_PFl_i)(PFPc_i); +typedef PFl_i (*PFs_PFl_i)(short); +typedef int (*PFPFPl_s_i)(PFPl_s); +typedef int (*PFPFPc_s_i)(PFPc_s); + +PFs_PFl_i hairyfunc1 (int arg) { arg = 0; return 0; } +int hairyfunc2 (PFPc_i arg) { arg = 0; return 0; } +int hairyfunc3 (PFPFPl_s_i arg) { arg = 0; return 0; } +int hairyfunc4 (PFPFPc_s_i arg) { arg = 0; return 0; } +int hairyfunc5 (PFPc_PFl_i arg) { arg = 0; return 0; } +int hairyfunc6 (PFPi_PFl_i arg) { arg = 0; return 0; } +int hairyfunc7 (PFPFPc_i_PFl_i arg) { arg = 0; return 0; } + +/* gdb has two demanglers (one for g++ 2.95, one for g++ 3). + These marker functions help me figure out which demangler is in use. */ + +char * dm_type_char_star (char * p) { return p; } +int dm_type_foo_ref (foo & foo) { return foo.ifoo; } +int * dm_type_int_star (int * p) { return p; } +long * dm_type_long_star (long * p) { return p; } +int dm_type_unsigned_int (unsigned int i) { return i; } +int dm_type_void (void) { return 0; } +void * dm_type_void_star (void * p) { return p; } diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.exp b/gdb/testsuite/gdb.cp/cplusfuncs.exp new file mode 100644 index 0000000..0a5e1b3 --- /dev/null +++ b/gdb/testsuite/gdb.cp/cplusfuncs.exp @@ -0,0 +1,564 @@ +# Copyright 1992, 1997, 1999, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) +# Adapted for g++ 3.0 ABI by Michael Chastain. (chastain@redhat.com) + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile "cplusfuncs" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [get_compiler_info $binfile "c++"] } { + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# +# g++ changed its ABI between 2.95 and 3.0. gdb has two demanglers +# for the two different styles. The two demanglers have some subtle +# discrepancies in their output. +# +# old demangler new demangler +# --- --------- --- --------- +# "operator, " "operator," +# "char *" "char*" +# "int *" "int*" +# "long *" "long*" +# "void *" "void*" +# "foo &" "foo&" +# "unsigned int" "unsigned" +# "void" "" +# +# I probe for the forms in use. +# The defaults are for the v3 demangler (as of 2001-02-13). +# + +set dm_operator_comma "," +set dm_type_char_star "char*" +set dm_type_char_star_quoted "char\\*" +set dm_type_foo_ref "foo&" +set dm_type_int_star "int*" +set dm_type_long_star "long*" +set dm_type_unsigned_int "unsigned" +set dm_type_void "" +set dm_type_void_star "void*" + +proc probe_demangler { } { + global gdb_prompt + global dm_operator_comma + global dm_type_char_star + global dm_type_char_star_quoted + global dm_type_foo_ref + global dm_type_int_star + global dm_type_long_star + global dm_type_unsigned_int + global dm_type_void + global dm_type_void_star + + send_gdb "print &'foo::operator,(foo&)'\n" + gdb_expect { + -re ".*foo::operator, \\(.*foo.*&.*\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_operator_comma ", " + pass "detect dm_operator_comma" + } + -re ".*foo::operator,\\(.*foo.*&.*\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_operator_comma" + } + -re ".*$gdb_prompt $" { + fail "detect dm_operator_comma" + } + timeout { + fail "detect dm_operator_comma" + } + } + + send_gdb "print &'dm_type_char_star'\n" + gdb_expect { + -re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_char_star "char *" + set dm_type_char_star_quoted "char \\*" + pass "detect dm_type_char_star" + } + -re ".*dm_type_char_star\\(char\\*\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_char_star" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_char_star" + } + timeout { + fail "detect dm_type_char_star (timeout)" + } + } + + send_gdb "print &'dm_type_foo_ref'\n" + gdb_expect { + -re ".*dm_type_foo_ref\\(foo &\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_foo_ref "foo &" + pass "detect dm_type_foo_ref" + } + -re ".*dm_type_foo_ref\\(foo&\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_foo_ref" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_foo_ref" + } + timeout { + fail "detect dm_type_foo_ref (timeout)" + } + } + + send_gdb "print &'dm_type_int_star'\n" + gdb_expect { + -re ".*dm_type_int_star\\(int \\*\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_int_star "int *" + pass "detect dm_type_int_star" + } + -re ".*dm_type_int_star\\(int\\*\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_int_star" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_int_star" + } + timeout { + fail "detect dm_type_int_star (timeout)" + } + } + + send_gdb "print &'dm_type_long_star'\n" + gdb_expect { + -re ".*dm_type_long_star\\(long \\*\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_long_star "long *" + pass "detect dm_type_long_star" + } + -re ".*dm_type_long_star\\(long\\*\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_long_star" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_long_star" + } + timeout { + fail "detect dm_type_long_star (timeout)" + } + } + + send_gdb "print &'dm_type_unsigned_int'\n" + gdb_expect { + -re ".*dm_type_unsigned_int\\(unsigned int\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_unsigned_int "unsigned int" + pass "detect dm_type_unsigned_int" + } + -re ".*dm_type_unsigned_int\\(unsigned\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_unsigned_int" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_unsigned_int" + } + timeout { + fail "detect dm_unsigned int (timeout)" + } + } + + send_gdb "print &'dm_type_void'\n" + gdb_expect { + -re ".*dm_type_void\\(void\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_void "void" + pass "detect dm_type_void" + } + -re ".*dm_type_void\\(\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_void" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_void" + } + timeout { + fail "detect dm_type_void (timeout)" + } + } + + send_gdb "print &'dm_type_void_star'\n" + gdb_expect { + -re ".*dm_type_void_star\\(void \\*\\).*\r\n$gdb_prompt $" { + # v2 demangler + set dm_type_void_star "void *" + pass "detect dm_type_void_star" + } + -re ".*dm_type_void_star\\(void\\*\\).*\r\n$gdb_prompt $" { + # v3 demangler + pass "detect dm_type_void_star" + } + -re ".*$gdb_prompt $" { + fail "detect dm_type_void_star" + } + timeout { + fail "detect dm_type_void_star (timeout)" + } + } +} + +# +# Lookup a specific C++ function and print the demangled type. +# This form accepts the demangled type as a regexp. +# + +proc info_func_regexp { name demangled } { + global gdb_prompt + + send_gdb "info function $name\n" + gdb_expect { + -re ".*File .*:\r\n(class |)$demangled\r\n.*$gdb_prompt $" { + pass "info function for \"$name\"" + } + -re ".*$gdb_prompt $" { + fail "info function for \"$name\"" + } + timeout { + fail "info function for \"$name\" (timeout)" + } + } +} + +# +# Lookup a specific C++ function and print the demangled type. +# This form accepts the demangled type as a literal string. +# + +proc info_func { name demangled } { + info_func_regexp "$name" [string_to_regexp "$demangled"] +} + +# +# Print the address of a function. +# This checks that I can lookup a fully qualified C++ function. +# This also checks the argument types on the return string. + +# Note: carlton/2003-01-16: If you modify this, make a corresponding +# modification to print_addr_2_kfail. + +proc print_addr_2 { name good } { + global gdb_prompt + global hex + + set good_pattern [string_to_regexp $good] + + send_gdb "print &'$name'\n" + gdb_expect { + -re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" { + pass "print &'$name'" + } + -re ".*$gdb_prompt $" { + fail "print &'$name'" + } + timeout { + fail "print &'$name' (timeout)" + } + } +} + +# NOTE: carlton/2003-01-16: hairyfunc5-6 fail on GCC 3.x (for at least +# x=1 and x=2.1). So I'm modifying print_addr_2 to accept a failure +# condition. FIXME: It would be nice if the failure condition were +# conditional on the compiler version, but I'm not sufficiently +# motivated. I did hardwire in the versions of char * and int *, +# which will give some compiler-specificity to the failure. + +proc print_addr_2_kfail { name good bad bugid } { + global gdb_prompt + global hex + + set good_pattern [string_to_regexp $good] + set bad_pattern [string_to_regexp $bad] + + send_gdb "print &'$name'\n" + gdb_expect { + -re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" { + pass "print &'$name'" + } + -re ".* = .* $hex <$bad_pattern>\r\n$gdb_prompt $" { + kfail $bugid "print &'$name'" + } + -re ".*$gdb_prompt $" { + fail "print &'$name'" + } + timeout { + fail "print &'$name' (timeout)" + } + } +} + +# +# Simple interfaces to print_addr_2. +# + +proc print_addr { name } { + print_addr_2 "$name" "$name" +} + +# +# Test name demangling for operators. +# +# The '(' at the end of each regex input pattern is so that we match only +# the one we are looking for. I.E. "operator&" would match both +# "operator&(foo &)" and "operator&&(foo &)". +# +# gdb-gnats bug gdb/18: +# "gdb can't parse "info func operator*" or "info func operator\*". +# The star in "operator*" is interpreted as a regexp, but the "\*" +# in "operator\*" is not a legal operator. +# + +proc test_lookup_operator_functions {} { + global dm_operator_comma + global dm_type_char_star + global dm_type_char_star_quoted + global dm_type_foo_ref + global dm_type_void + global dm_type_void_star + + # operator* requires quoting so that GDB does not treat it as a regexp. + info_func "operator\\*(" "void foo::operator*($dm_type_foo_ref);" + info_func "operator%(" "void foo::operator%($dm_type_foo_ref);" + info_func "operator-(" "void foo::operator-($dm_type_foo_ref);" + info_func "operator>>(" "void foo::operator>>($dm_type_foo_ref);" + info_func "operator!=(" "void foo::operator!=($dm_type_foo_ref);" + info_func "operator>(" "void foo::operator>($dm_type_foo_ref);" + info_func "operator>=(" "void foo::operator>=($dm_type_foo_ref);" + info_func "operator|(" "void foo::operator|($dm_type_foo_ref);" + info_func "operator&&(" "void foo::operator&&($dm_type_foo_ref);" + info_func "operator!(" "void foo::operator!($dm_type_void);" + info_func "operator++(" "void foo::operator++(int);" + info_func "operator=(" "void foo::operator=($dm_type_foo_ref);" + info_func "operator+=(" "void foo::operator+=($dm_type_foo_ref);" + # operator*= requires quoting so that GDB does not treat it as a regexp. + info_func "operator\\*=(" "void foo::operator*=($dm_type_foo_ref);" + info_func "operator%=(" "void foo::operator%=($dm_type_foo_ref);" + info_func "operator>>=(" "void foo::operator>>=($dm_type_foo_ref);" + info_func "operator|=(" "void foo::operator|=($dm_type_foo_ref);" + info_func "operator$dm_operator_comma\(" \ + "void foo::operator$dm_operator_comma\($dm_type_foo_ref);" + info_func "operator/(" "void foo::operator/($dm_type_foo_ref);" + info_func "operator+(" "void foo::operator+($dm_type_foo_ref);" + info_func "operator<<(" "void foo::operator<<($dm_type_foo_ref);" + info_func "operator==(" "void foo::operator==($dm_type_foo_ref);" + info_func "operator<(" "void foo::operator<($dm_type_foo_ref);" + info_func "operator<=(" "void foo::operator<=($dm_type_foo_ref);" + info_func "operator&(" "void foo::operator&($dm_type_foo_ref);" + info_func "operator^(" "void foo::operator^($dm_type_foo_ref);" + info_func "operator||(" "void foo::operator||($dm_type_foo_ref);" + info_func "operator~(" "void foo::operator~($dm_type_void);" + info_func "operator--(" "void foo::operator--(int);" + info_func "operator->(" "foo *foo::operator->($dm_type_void);" + info_func "operator-=(" "void foo::operator-=($dm_type_foo_ref);" + info_func "operator/=(" "void foo::operator/=($dm_type_foo_ref);" + info_func "operator<<=(" "void foo::operator<<=($dm_type_foo_ref);" + info_func "operator&=(" "void foo::operator&=($dm_type_foo_ref);" + info_func "operator^=(" "void foo::operator^=($dm_type_foo_ref);" + # operator->* requires quoting so that GDB does not treat it as a regexp. + info_func "operator->\\*(" "void foo::operator->*($dm_type_foo_ref);" + + # operator[] needs double backslashes, so that a single backslash + # will be sent to GDB, preventing the square brackets from being + # evaluated as a regular expression. + info_func "operator\\\[\\\](" "void foo::operator\[\]($dm_type_foo_ref);" + + # These are gnarly because they might end with 'static'. + set dm_type_void_star_regexp [string_to_regexp $dm_type_void_star] + info_func_regexp "operator new(" "void \\*foo::operator new\\(.*\\)(| static);" + info_func_regexp "operator delete(" "void foo::operator delete\\($dm_type_void_star_regexp\\)(| static);" + + info_func "operator int(" "int foo::operator int($dm_type_void);" + info_func "operator()(" "void foo::operator()($dm_type_foo_ref);" + info_func "operator $dm_type_char_star_quoted\(" \ + "char *foo::operator $dm_type_char_star\($dm_type_void);" + +} + + +proc test_paddr_operator_functions {} { + global hex + global hp_aCC_compiler + global dm_operator_comma + global dm_type_char_star + global dm_type_foo_ref + global dm_type_long_star + global dm_type_unsigned_int + global dm_type_void + global dm_type_void_star + + print_addr "foo::operator*($dm_type_foo_ref)" + print_addr "foo::operator%($dm_type_foo_ref)" + print_addr "foo::operator-($dm_type_foo_ref)" + print_addr "foo::operator>>($dm_type_foo_ref)" + print_addr "foo::operator!=($dm_type_foo_ref)" + print_addr "foo::operator>($dm_type_foo_ref)" + print_addr "foo::operator>=($dm_type_foo_ref)" + print_addr "foo::operator|($dm_type_foo_ref)" + print_addr "foo::operator&&($dm_type_foo_ref)" + print_addr "foo::operator!($dm_type_void)" + print_addr "foo::operator++(int)" + print_addr "foo::operator=($dm_type_foo_ref)" + print_addr "foo::operator+=($dm_type_foo_ref)" + print_addr "foo::operator*=($dm_type_foo_ref)" + print_addr "foo::operator%=($dm_type_foo_ref)" + print_addr "foo::operator>>=($dm_type_foo_ref)" + print_addr "foo::operator|=($dm_type_foo_ref)" + print_addr "foo::operator$dm_operator_comma\($dm_type_foo_ref)" + print_addr "foo::operator/($dm_type_foo_ref)" + print_addr "foo::operator+($dm_type_foo_ref)" + print_addr "foo::operator<<($dm_type_foo_ref)" + print_addr "foo::operator==($dm_type_foo_ref)" + print_addr "foo::operator<($dm_type_foo_ref)" + print_addr "foo::operator<=($dm_type_foo_ref)" + print_addr "foo::operator&($dm_type_foo_ref)" + print_addr "foo::operator^($dm_type_foo_ref)" + print_addr "foo::operator||($dm_type_foo_ref)" + print_addr "foo::operator~($dm_type_void)" + print_addr "foo::operator--(int)" + print_addr "foo::operator->($dm_type_void)" + print_addr "foo::operator-=($dm_type_foo_ref)" + print_addr "foo::operator/=($dm_type_foo_ref)" + print_addr "foo::operator<<=($dm_type_foo_ref)" + print_addr "foo::operator&=($dm_type_foo_ref)" + print_addr "foo::operator^=($dm_type_foo_ref)" + print_addr "foo::operator->*($dm_type_foo_ref)" + print_addr "foo::operator\[\]($dm_type_foo_ref)" + print_addr "foo::operator()($dm_type_foo_ref)" + + gdb_test "print &'foo::operator new'" \ + " = .* $hex " + if { !$hp_aCC_compiler } { + print_addr "foo::operator delete($dm_type_void_star)" + } else { + gdb_test "print &'foo::operator delete($dm_type_void_star) static'" \ + " = .*(0x\[0-9a-f\]+|) " + } + + print_addr "foo::operator int($dm_type_void)" + print_addr "foo::operator $dm_type_char_star\($dm_type_void)" +} + +# +# Test overloaded functions (1 arg). +# + +proc test_paddr_overloaded_functions {} { + global dm_type_unsigned_int + global dm_type_void + + print_addr "overload1arg($dm_type_void)" + print_addr "overload1arg(char)" + print_addr "overload1arg(signed char)" + print_addr "overload1arg(unsigned char)" + print_addr "overload1arg(short)" + print_addr "overload1arg(unsigned short)" + print_addr "overload1arg(int)" + print_addr "overload1arg($dm_type_unsigned_int)" + print_addr "overload1arg(long)" + print_addr "overload1arg(unsigned long)" + print_addr "overload1arg(float)" + print_addr "overload1arg(double)" + + print_addr "overloadargs(int)" + print_addr "overloadargs(int, int)" + print_addr "overloadargs(int, int, int)" + print_addr "overloadargs(int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int, int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int)" + print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int, int)" +} + +proc test_paddr_hairy_functions {} { + global gdb_prompt + global hex + global dm_type_char_star + global dm_type_int_star + global dm_type_long_star + + print_addr_2 "hairyfunc1" "hairyfunc1(int)" + print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))" + print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))" + print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))" + + # gdb-gnats bug gdb/19: + # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7" + print_addr_2_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19" + print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19" + print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19" +} + +proc do_tests {} { + global prms_id + global bug_id + global subdir + global objdir + global srcdir + global binfile + global gdb_prompt + + set prms_id 0 + set bug_id 0 + + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + + send_gdb "set language c++\n" + gdb_expect -re "$gdb_prompt $" + send_gdb "set width 0\n" + gdb_expect -re "$gdb_prompt $" + + runto_main + + probe_demangler + test_paddr_overloaded_functions + test_paddr_operator_functions + test_paddr_hairy_functions + test_lookup_operator_functions +} + +do_tests diff --git a/gdb/testsuite/gdb.cp/ctti.exp b/gdb/testsuite/gdb.cp/ctti.exp new file mode 100644 index 0000000..96e9fcf --- /dev/null +++ b/gdb/testsuite/gdb.cp/ctti.exp @@ -0,0 +1,269 @@ +# Copyright 1998, 1999, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + + +# This file is part of the gdb testsuite +# file written by Elena Zannoni (ezannoni@cygnus.com) +# +# source files cttiadd.cc, cttiadd1.cc, cttiadd2.cc, cttiadd3.cc +# + + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +# Check to see if we have an executable to test. If not, then either we +# haven't tried to compile one, or the compilation failed for some reason. +# In either case, just notify the user and skip the tests in this file. + +set testfile "cttiadd" +set srcfile ${testfile}.cc +set srcfile1 ${testfile}1.cc +set srcfile2 ${testfile}2.cc +set srcfile3 ${testfile}3.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +if { $gcc_compiled } then { continue } + +#if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1} ${srcdir}/${subdir}/${srcfile2} ${srcdir}/${subdir}/${srcfile3}" "${binfile}" executable {debug c++}] != "" } { +# gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +#} + +set cmdline "$CXX_FOR_TARGET ${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1} ${srcdir}/${subdir}/${srcfile2} ${srcdir}/${subdir}/${srcfile3} -g -o ${binfile}" + +remote_exec build $cmdline + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + + +send_gdb "n\n" +gdb_expect { + -re "$decimal.*i = 2;.*$gdb_prompt $" { + pass "next " + } + -re ".*$gdb_prompt $" { fail "next " } + timeout { fail "next " } + } + + +send_gdb "n\n" +gdb_expect { + -re "$decimal.*f = 4.5;.*$gdb_prompt $" { + pass "next " + } + -re ".*$gdb_prompt $" { fail "next " } + timeout { fail "next " } + } + +send_gdb "n\n" +gdb_expect { + -re "$decimal.*c = add\\(c, c\\);.*$gdb_prompt $" { + pass "next " + } + -re ".*$gdb_prompt $" { fail "next " } + timeout { fail "next " } + } + +send_gdb "n\n" +gdb_expect { + -re "$decimal.*i = add\\(i, i\\);.*$gdb_prompt $" { + pass "next " + } + -re ".*$gdb_prompt $" { fail "next " } + timeout { fail "next " } + } + +send_gdb "n\n" +gdb_expect { + -re "$decimal.*f = add\\(f, f\\);.*$gdb_prompt $" { + pass "next " + } + -re ".*$gdb_prompt $" { fail "next " } + timeout { fail "next " } + } + +send_gdb "n\n" +gdb_expect { + -re "$decimal.*add1\\(\\);.*$gdb_prompt $" { + pass "next " + } + -re ".*$gdb_prompt $" { fail "next " } + timeout { fail "next " } + } + +send_gdb "print c\n" +gdb_expect { + -re ".$decimal = -62.*\r\n$gdb_prompt $" { + pass "print value of c" + } + -re ".*$gdb_prompt $" { fail "print value of c" } + timeout { fail "(timeout) print value of c" } + } + + +send_gdb "print f\n" +gdb_expect { + -re ".$decimal = 9\r\n$gdb_prompt $" { + pass "print value of f" + } + -re ".*$gdb_prompt $" { fail "print value of f" } + timeout { fail "(timeout) print value of f" } + } + + +send_gdb "print i\n" +gdb_expect { + -re ".$decimal = 4\r\n$gdb_prompt $" { + pass "print value of i" + } + -re ".*$gdb_prompt $" { fail "print value of i" } + timeout { fail "(timeout) print value of i" } + } + + + +send_gdb "print add(2,2)\n" +gdb_expect { + -re ".$decimal = 4\r\n$gdb_prompt $" { + pass "print value of add(2,2)" + } + -re ".*$gdb_prompt $" { fail "print value of add(2,2)" } + timeout { fail "(timeout) print value of add(2,2)" } + } + +send_gdb "print add(2.3,2.3)\n" +gdb_expect { + -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { + pass "print value of add(2.3,2.3)" + } + -re ".*$gdb_prompt $" { fail "print value of add(2.3,2.3)" } + timeout { fail "(timeout) print value of add(2.3,2.3)" } + } + +send_gdb "print add('A','A')\n" +gdb_expect { + -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { + pass "print value of add('A','A')" + } + -re ".*$gdb_prompt $" { fail "print value of add('A','A')" } + timeout { fail "(timeout) print value of add('A','A')" } + } + + +send_gdb "print add2(2,2)\n" +gdb_expect { + -re ".$decimal = 4\r\n$gdb_prompt $" { + pass "print value of add2(2,2)" + } + -re ".*$gdb_prompt $" { fail "print value of add2(2,2)" } + timeout { fail "(timeout) print value of add2(2,2)" } + } + +send_gdb "print add2(2.3,2.3)\n" +gdb_expect { + -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { + pass "print value of add2(2.3,2.3)" + } + -re ".*$gdb_prompt $" { fail "print value of add2(2.3,2.3)" } + timeout { fail "(timeout) print value of add2(2.3,2.3)" } + } + +send_gdb "print add2('A','A')\n" +gdb_expect { + -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { + pass "print value of add2('A','A')" + } + -re ".*$gdb_prompt $" { fail "print value of add2('A','A')" } + timeout { fail "(timeout) print value of add2('A','A')" } + } + +send_gdb "print add3(2,2)\n" +gdb_expect { + -re ".$decimal = 4\r\n$gdb_prompt $" { + pass "print value of add3(2,2)" + } + -re ".*$gdb_prompt $" { fail "print value of add3(2,2)" } + timeout { fail "(timeout) print value of add3(2,2)" } + } + +send_gdb "print add3(2.3,2.3)\n" +gdb_expect { + -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { + pass "print value of add3(2.3,2.3)" + } + -re ".*$gdb_prompt $" { fail "print value of add3(2.3,2.3)" } + timeout { fail "(timeout) print value of add3(2.3,2.3)" } + } + +send_gdb "print add3('A','A')\n" +gdb_expect { + -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { + pass "print value of add3('A','A')" + } + -re ".*$gdb_prompt $" { fail "print value of add3('A','A')" } + timeout { fail "(timeout) print value of add3('A','A')" } + } + +send_gdb "print add4(2,2)\n" +gdb_expect { + -re ".$decimal = 4\r\n$gdb_prompt $" { + pass "print value of add4(2,2)" + } + -re ".*$gdb_prompt $" { fail "print value of add4(2,2)" } + timeout { fail "(timeout) print value of add4(2,2)" } + } + +send_gdb "print add4(2.3,2.3)\n" +gdb_expect { + -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" { + pass "print value of add4(2.3,2.3)" + } + -re ".*$gdb_prompt $" { fail "print value of add4(2.3,2.3)" } + timeout { fail "(timeout) print value of add4(2.3,2.3)" } + } + +send_gdb "print add4('A','A')\n" +gdb_expect { + -re ".$decimal = -126.*202.\r\n$gdb_prompt $" { + pass "print value of add4('A','A')" + } + -re ".*$gdb_prompt $" { fail "print value of add4('A','A')" } + timeout { fail "(timeout) print value of add4('A','A')" } + } + + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/cttiadd.cc b/gdb/testsuite/gdb.cp/cttiadd.cc new file mode 100644 index 0000000..1f50fae --- /dev/null +++ b/gdb/testsuite/gdb.cp/cttiadd.cc @@ -0,0 +1,29 @@ +template T add(T v1, T v2) +{ + T v3; + v3 = v1; + v3 += v2; + return v3; + } + +int main() +{ + char c; + int i; + float f; + extern void add1(); + extern void subr2(); + extern void subr3(); + + c = 'a'; + i = 2; + f = 4.5; + + c = add(c, c); + i = add(i, i); + f = add(f, f); + + add1(); + subr2(); + subr3(); +} diff --git a/gdb/testsuite/gdb.cp/cttiadd1.cc b/gdb/testsuite/gdb.cp/cttiadd1.cc new file mode 100644 index 0000000..7113ece --- /dev/null +++ b/gdb/testsuite/gdb.cp/cttiadd1.cc @@ -0,0 +1,16 @@ +template T add(T v1, T v2); + +void add1() +{ + char c; + int i; + float f; + + c = 'b'; + i = 3; + f = 6.5; + + c = add(c, c); + i = add(i, i); + f = add(f, f); +} diff --git a/gdb/testsuite/gdb.cp/cttiadd2.cc b/gdb/testsuite/gdb.cp/cttiadd2.cc new file mode 100644 index 0000000..d0d9891 --- /dev/null +++ b/gdb/testsuite/gdb.cp/cttiadd2.cc @@ -0,0 +1,22 @@ +template T add2(T v1, T v2) +{ + T v3; + v3 = v1; + v3 += v2; + return v3; +} + +void subr2() +{ + char c; + int i; + float f; + + c = 'b'; + i = 3; + f = 6.5; + + c = add2(c, c); + i = add2(i, i); + f = add2(f, f); +} diff --git a/gdb/testsuite/gdb.cp/cttiadd3.cc b/gdb/testsuite/gdb.cp/cttiadd3.cc new file mode 100644 index 0000000..7ba1b01 --- /dev/null +++ b/gdb/testsuite/gdb.cp/cttiadd3.cc @@ -0,0 +1,33 @@ +template T add3(T v1, T v2) +{ + T v3; + v3 = v1; + v3 += v2; + return v3; +} + +template T add4(T v1, T v2) +{ + T v3; + v3 = v1; + v3 += v2; + return v3; +} + +void subr3() +{ + char c; + int i; + float f; + + c = 'b'; + i = 3; + f = 6.5; + + c = add3(c, c); + i = add3(i, i); + f = add3(f, f); + c = add4(c, c); + i = add4(i, i); + f = add4(f, f); +} diff --git a/gdb/testsuite/gdb.cp/demangle.exp b/gdb/testsuite/gdb.cp/demangle.exp new file mode 100644 index 0000000..7bd9fc5 --- /dev/null +++ b/gdb/testsuite/gdb.cp/demangle.exp @@ -0,0 +1,1582 @@ +# Copyright (C) 1992, 1997, 1999, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +### The demangling style we last sent to GDB. +set current_demangling_style none + +### Set GDB's current demangling style to STYLE. Subsequent calls to +### test_demangle will include STYLE in the test name when reporting +### passes and failures. +proc set_demangling_style {style} { + global gdb_prompt + global current_demangling_style + + send_gdb "set demangle-style $style\n" + gdb_expect { + -re "set demangle-style $style\[\r\n\]+$gdb_prompt $" { + pass "$style: set demangle-style" + } + -re ".*$gdb_prompt $" { + fail "$style: set demangle-style" + error "set_demangling_style: set style" + } + timeout { + fail "$style: set demangle-style (timeout)" + error "set_demangling_style: set style" + } + } + + send_gdb "show demangle-style\n" + gdb_expect { + -re "The current C\[+\]+ demangling style is \"$style\".\r\n$gdb_prompt $" { + pass "$style: check demangling style" + } + -re ".*$gdb_prompt $" { + fail "$style: check demangling style" + error "set_demangling_style: check style" + } + timeout { + fail "$style: check demangling style (timeout)" + error "set_demangling_style: check style" + } + } + + set current_demangling_style $style +} + + +### Utility function for test_demangling and test_demangling_exact. +proc test_demangling_core {tester test result} { + global current_demangling_style + + if {! [regexp {^([^ ]+): (.+)$} $test dummy style name]} { + error "bad test name passed to test_demangling" + } + + if {[string compare $style $current_demangling_style]} { + set_demangling_style $style + } + + $tester "maintenance demangle $name" $result $test +} + +### Demangle an identifier, and check that the result matches a pattern. +### +### TEST should be of the form "STYLE: NAME", where STYLE is the name +### of a demangling style (like "gnu" or "arm"), and NAME is a mangled +### identifier to demangle. Pass when the result matches the regular +### expression RESULT. Report passes and fails using TEST as the name +### of the test. +### +### Why don't we just pass the STYLE and NAME as two separate +### arguments, or let the style be a global variable? That would be +### cleaner. However, doing it this way means that: +### +### 1) the name of the test, as recorded in the summary and log, +### appears verbatim in the script, and +### +### 2) that test names are unique, even though we try to demangle the same +### identifiers using several different mangling styles. +### +### This makes it a lot easier for people tracking down failures to +### find the one they care about. + +proc test_demangling {test result} { + test_demangling_core gdb_test $test $result +} + +### Like test_demangling, above, except that RESULT is not a regexp, +### but a string that must match exactly. + +proc test_demangling_exact {test result} { + test_demangling_core gdb_test_exact $test $result +} + + + +# +# Test gnu style name demangling +# + +proc test_gnu_style_demangling {} { + global gdb_prompt + + test_demangling "gnu: Abort__FP6EditoriPCc" \ + "Abort\[(\]+Editor \[*\]+, int, (const char|char const) \[*\]+\[)\]+" + test_demangling_exact "gnu: AddAlignment__9ivTSolverUiP12ivInteractorP7ivTGlue" "ivTSolver::AddAlignment(unsigned int, ivInteractor *, ivTGlue *)" + test_demangling "gnu: Append__15NameChooserViewPCc" \ + "NameChooserView::Append\[(\]+(const char|char const) \[*\]+\[)\]+" + test_demangling_exact "gnu: ArrowheadIntersects__9ArrowLineP9ArrowheadR6BoxObjP7Graphic" "ArrowLine::ArrowheadIntersects(Arrowhead *, BoxObj &, Graphic *)" + test_demangling_exact "gnu: AtEnd__13ivRubberGroup" "ivRubberGroup::AtEnd(void)" + test_demangling_exact "gnu: BgFilter__9ivTSolverP12ivInteractor" "ivTSolver::BgFilter(ivInteractor *)" + test_demangling "gnu: BitPatterntoa__FRC10BitPatternccc" \ + "BitPatterntoa\[(\]+(const BitPattern|BitPattern const) &, char, char, char\[)\]+" + test_demangling_exact "gnu: Check__6UArrayi" "UArray::Check(int)" + test_demangling_exact "gnu: CoreConstDecls__8TextCodeR7ostream" "TextCode::CoreConstDecls(ostream &)" + test_demangling_exact "gnu: Detach__8StateVarP12StateVarView" "StateVar::Detach(StateVarView *)" + test_demangling_exact "gnu: Done__9ComponentG8Iterator" "Component::Done(Iterator)" + test_demangling "gnu: DrawDestinationTransformedImage__FP7_XImageiiT0iiUlUiiiUiUlUlP4_XGCRC13ivTransformeriiii" \ + "DrawDestinationTransformedImage\[(\]+_XImage \[*\]+, int, int, _XImage \[*\]+, int, int, unsigned long, unsigned int, int, int, unsigned int, unsigned long, unsigned long, _XGC \[*\]+, (const ivTransformer|ivTransformer const) &, int, int, int, int\[)\]+" + + test_demangling "gnu: Edit__12StringEditorPCcii" \ + "StringEditor::Edit\[(\]+(const char|char const) \[*\]+, int, int\[)\]+" + test_demangling_exact "gnu: Effect__11RelateManipR7ivEvent" "RelateManip::Effect(ivEvent &)" + test_demangling "gnu: FilterName__FPCc" \ + "FilterName\[(\]+(const char|char const) \[*\]+\[)\]+" + test_demangling "gnu: Filter__6PSTextPCci" \ + "PSText::Filter\[(\]+(const char|char const) \[*\]+, int\[)\]+" + test_demangling "gnu: FindColor__7CatalogPCciii" \ + "Catalog::FindColor\[(\]+(const char|char const) \[*\]+, int, int, int\[)\]+" + test_demangling_exact "gnu: FindFixed__FRP4CNetP4CNet" "FindFixed(CNet *&, CNet *)" + test_demangling "gnu: FindFont__7CatalogPCcN21" \ + "Catalog::FindFont\[(\]+(const char|char const) \[*\]+, (const char|char const) \[*\]+, (const char|char const) \[*\]+\[)\]+" + test_demangling_exact "gnu: Fix48_abort__FR8twolongs" "Fix48_abort(twolongs &)" + test_demangling_exact "gnu: GetBarInfo__15iv2_6_VScrollerP13ivPerspectiveRiT2" "iv2_6_VScroller::GetBarInfo(ivPerspective *, int &, int &)" + test_demangling_exact "gnu: GetBgColor__C9ivPainter" "ivPainter::GetBgColor(void) const" + + test_demangling "gnu: Iisdouble__FPC6IntRep" \ + "Iisdouble\[(\]+(const IntRep|IntRep const) \[*\]+\[)\]+" + test_demangling_exact "gnu: InsertBody__15H_PullrightMenuii" "H_PullrightMenu::InsertBody(int, int)" + test_demangling_exact "gnu: InsertCharacter__9TextManipc" "TextManip::InsertCharacter(char)" + + test_demangling_exact "gnu: InsertToplevel__7ivWorldP12ivInteractorT1" "ivWorld::InsertToplevel(ivInteractor *, ivInteractor *)" + test_demangling_exact "gnu: InsertToplevel__7ivWorldP12ivInteractorT1iiUi" "ivWorld::InsertToplevel(ivInteractor *, ivInteractor *, int, int, unsigned int)" + test_demangling "gnu: IsADirectory__FPCcR4stat" \ + "IsADirectory\[(\]+(const char|char const) \[*\]+, stat &\[)\]+" + test_demangling_exact "gnu: IsAGroup__FP11GraphicViewP11GraphicComp" "IsAGroup(GraphicView *, GraphicComp *)" + test_demangling_exact "gnu: IsA__10ButtonCodeUl" "ButtonCode::IsA(unsigned long)" + + test_demangling_exact "gnu: ReadName__FR7istreamPc" "ReadName(istream &, char *)" + test_demangling_exact "gnu: Redraw__13StringBrowseriiii" "StringBrowser::Redraw(int, int, int, int)" + test_demangling_exact "gnu: Rotate__13ivTransformerf" "ivTransformer::Rotate(float)" + test_demangling_exact "gnu: Rotated__C13ivTransformerf" "ivTransformer::Rotated(float) const" + test_demangling_exact "gnu: Round__Ff" "Round(float)" + + test_demangling_exact "gnu: SetExport__16MemberSharedNameUi" "MemberSharedName::SetExport(unsigned int)" + test_demangling_exact "gnu: Set__14ivControlState13ControlStatusUi" "ivControlState::Set(ControlStatus, unsigned int)" + test_demangling_exact "gnu: Set__5DFacePcii" "DFace::Set(char *, int, int)" + + test_demangling_exact "gnu: VConvert__9ivTSolverP12ivInteractorRP8TElementT2" "ivTSolver::VConvert(ivInteractor *, TElement *&, TElement *&)" + test_demangling_exact "gnu: VConvert__9ivTSolverP7ivTGlueRP8TElement" "ivTSolver::VConvert(ivTGlue *, TElement *&)" + test_demangling_exact "gnu: VOrder__9ivTSolverUiRP12ivInteractorT2" "ivTSolver::VOrder(unsigned int, ivInteractor *&, ivInteractor *&)" + test_demangling "gnu: Valid__7CatalogPCcRP4Tool" \ + "Catalog::Valid\[(\]+(const char|char const) \[*\]+, Tool \[*\]+&\[)\]+" + test_demangling_exact "gnu: _10PageButton\$__both" "PageButton::__both" + test_demangling_exact "gnu: _3RNG\$singleMantissa" "RNG::singleMantissa" + test_demangling_exact "gnu: _5IComp\$_release" "IComp::_release" + test_demangling_exact "gnu: _\$_10BitmapComp" "BitmapComp::~BitmapComp(void)" + + test_demangling_exact "gnu: _\$_9__io_defs" "__io_defs::~__io_defs(void)" + test_demangling_exact "gnu: _\$_Q23foo3bar" "foo::bar::~bar(void)" + test_demangling_exact "gnu: _\$_Q33foo3bar4bell" "foo::bar::bell::~bell(void)" + test_demangling_exact "gnu: __10ivTelltaleiP7ivGlyph" "ivTelltale::ivTelltale(int, ivGlyph *)" + test_demangling_exact "gnu: __10ivViewportiP12ivInteractorUi" "ivViewport::ivViewport(int, ivInteractor *, unsigned int)" + test_demangling_exact "gnu: __10ostrstream" "ostrstream::ostrstream(void)" + test_demangling_exact "gnu: __10ostrstreamPcii" "ostrstream::ostrstream(char *, int, int)" + test_demangling "gnu: __11BasicDialogiPCcP13ivButtonStateN22Ui" \ + "BasicDialog::BasicDialog\[(\]+int, (const char|char const) \[*\]+, ivButtonState \[*\]+, (const char|char const) \[*\]+, (const char|char const) \[*\]+, unsigned int\[)\]+" + test_demangling_exact "gnu: __11BitmapTablei" "BitmapTable::BitmapTable(int)" + test_demangling_exact "gnu: __12ViewportCodeP12ViewportComp" "ViewportCode::ViewportCode(ViewportComp *)" + test_demangling "gnu: __12iv2_6_BorderiPCci" \ + "iv2_6_Border::iv2_6_Border\[(\]+int, (const char|char const) \[*\]+, int\[)\]+" + test_demangling_exact "gnu: __12iv2_6_Borderii" "iv2_6_Border::iv2_6_Border(int, int)" + test_demangling "gnu: __12ivBackgroundiP7ivGlyphPC7ivColor" \ + "ivBackground::ivBackground\[(\]+int, ivGlyph \[*\]+, (const ivColor|ivColor const) \[*\]+\[)\]+" + test_demangling_exact "gnu: __12ivBreak_Listl" "ivBreak_List::ivBreak_List(long)" + test_demangling "gnu: __14TextInteractoriPCcUi" \ + "TextInteractor::TextInteractor\[(\]+int, (const char|char const) \[*\]+, unsigned int\[)\]+" + test_demangling_exact "gnu: __14iv2_6_MenuItemiP12ivInteractor" "iv2_6_MenuItem::iv2_6_MenuItem(int, ivInteractor *)" + test_demangling "gnu: __14iv2_6_MenuItemiPCcP12ivInteractor" \ + "iv2_6_MenuItem::iv2_6_MenuItem\[(\]+int, (const char|char const) \[*\]+, ivInteractor \[*\]+\[)\]+" + + test_demangling_exact "gnu: __20DisplayList_IteratorR11DisplayList" "DisplayList_Iterator::DisplayList_Iterator(DisplayList &)" + test_demangling_exact "gnu: __3fooRT0" "foo::foo(foo &)" + test_demangling_exact "gnu: __3fooiN31" "foo::foo(int, int, int, int)" + test_demangling "gnu: __3fooiPCc" \ + "foo::foo\[(\]+int, (const char|char const) \[*\]+\[)\]+" + test_demangling_exact "gnu: __3fooiRT0iT2iT2" "foo::foo(int, foo &, int, foo &, int, foo &)" + test_demangling "gnu: __6GetOptiPPcPCc" \ + "GetOpt::GetOpt\[(\]+int, char \[*\]+\[*\]+, (const char|char const) \[*\]+\[)\]+" + test_demangling_exact "gnu: __6KeyMapPT0" "KeyMap::KeyMap(KeyMap *)" + test_demangling "gnu: __7ivWorldPCcRiPPcPC12ivOptionDescPC14ivPropertyData" \ + "ivWorld::ivWorld\[(\]+(const char|char const) \[*\]+, int &, char \[*\]+\[*\]+, (const ivOptionDesc|ivOptionDesc const) \[*\]+, (const ivPropertyData|ivPropertyData const) \[*\]+\[)\]+" + test_demangling "gnu: __7procbufPCci" \ + "procbuf::procbuf\[(\]+(const char|char const) \[*\]+, int\[)\]+" + test_demangling_exact "gnu: __8ArrowCmdP6EditorUiUi" "ArrowCmd::ArrowCmd(Editor *, unsigned int, unsigned int)" + + test_demangling_exact "gnu: __9F_EllipseiiiiP7Graphic" "F_Ellipse::F_Ellipse(int, int, int, int, Graphic *)" + test_demangling_exact "gnu: __9FrameDataP9FrameCompi" "FrameData::FrameData(FrameComp *, int)" + test_demangling_exact "gnu: __9HVGraphicP9CanvasVarP7Graphic" "HVGraphic::HVGraphic(CanvasVar *, Graphic *)" + test_demangling_exact "gnu: __Q23foo3bar" "foo::bar::bar(void)" + test_demangling_exact "gnu: __Q33foo3bar4bell" "foo::bar::bell::bell(void)" + test_demangling_exact "gnu: __aa__3fooRT0" "foo::operator&&(foo &)" + test_demangling_exact "gnu: __aad__3fooRT0" "foo::operator&=(foo &)" + test_demangling_exact "gnu: __ad__3fooRT0" "foo::operator&(foo &)" + test_demangling_exact "gnu: __adv__3fooRT0" "foo::operator/=(foo &)" + test_demangling_exact "gnu: __aer__3fooRT0" "foo::operator^=(foo &)" + test_demangling_exact "gnu: __als__3fooRT0" "foo::operator<<=(foo &)" + test_demangling_exact "gnu: __amd__3fooRT0" "foo::operator%=(foo &)" + test_demangling_exact "gnu: __ami__3fooRT0" "foo::operator-=(foo &)" + test_demangling_exact "gnu: __aml__3FixRT0" "Fix::operator*=(Fix &)" + test_demangling_exact "gnu: __aml__5Fix16i" "Fix16::operator*=(int)" + test_demangling_exact "gnu: __aml__5Fix32RT0" "Fix32::operator*=(Fix32 &)" + test_demangling_exact "gnu: __aor__3fooRT0" "foo::operator|=(foo &)" + test_demangling_exact "gnu: __apl__3fooRT0" "foo::operator+=(foo &)" + test_demangling_exact "gnu: __ars__3fooRT0" "foo::operator>>=(foo &)" + + test_demangling_exact "gnu: __as__3fooRT0" "foo::operator=(foo &)" + test_demangling_exact "gnu: __cl__3fooRT0" "foo::operator()(foo &)" + test_demangling_exact "gnu: __cl__6Normal" "Normal::operator()(void)" + test_demangling_exact "gnu: __cl__6Stringii" "String::operator()(int, int)" + test_demangling_exact "gnu: __cm__3fooRT0" "foo::operator, (foo &)" + test_demangling_exact "gnu: __co__3foo" "foo::operator~(void)" + test_demangling_exact "gnu: __dl__3fooPv" "foo::operator delete(void *)" + test_demangling_exact "gnu: __dv__3fooRT0" "foo::operator/(foo &)" + test_demangling_exact "gnu: __eq__3fooRT0" "foo::operator==(foo &)" + test_demangling_exact "gnu: __er__3fooRT0" "foo::operator^(foo &)" + test_demangling_exact "gnu: __ge__3fooRT0" "foo::operator>=(foo &)" + test_demangling_exact "gnu: __gt__3fooRT0" "foo::operator>(foo &)" + test_demangling_exact "gnu: __le__3fooRT0" "foo::operator<=(foo &)" + test_demangling_exact "gnu: __ls__3fooRT0" "foo::operator<<(foo &)" + test_demangling_exact "gnu: __ls__FR7ostreamPFR3ios_R3ios" "operator<<(ostream &, ios &(*)(ios &))" + test_demangling_exact "gnu: __ls__FR7ostreamR3Fix" "operator<<(ostream &, Fix &)" + test_demangling_exact "gnu: __lt__3fooRT0" "foo::operator<(foo &)" + test_demangling_exact "gnu: __md__3fooRT0" "foo::operator%(foo &)" + test_demangling_exact "gnu: __mi__3fooRT0" "foo::operator-(foo &)" + test_demangling_exact "gnu: __ml__3fooRT0" "foo::operator*(foo &)" + test_demangling_exact "gnu: __mm__3fooi" "foo::operator--(int)" + + test_demangling_exact "gnu: __ne__3fooRT0" "foo::operator!=(foo &)" + test_demangling "gnu: __ne__FRC7ComplexT0" \ + "operator!=\[(\]+(const Complex|Complex const) &, (const Complex|Complex const) &\[)\]+" + test_demangling "gnu: __ne__FRC7Complexd" \ + "operator!=\[(\]+(const Complex|Complex const) &, double\[)\]+" + test_demangling "gnu: __ne__FRC9SubStringRC6String" \ + "operator!=\[(\]+(const SubString|SubString const) &, (const String|String const) &\[)\]+" + test_demangling_exact "gnu: __nt__3foo" "foo::operator!(void)" + test_demangling_exact "gnu: __nw__3fooi" "foo::operator new(int)" + test_demangling_exact "gnu: __oo__3fooRT0" "foo::operator||(foo &)" + test_demangling_exact "gnu: __opPc__3foo" "foo::operator char *(void)" + test_demangling_exact "gnu: __opi__3foo" "foo::operator int(void)" + test_demangling_exact "gnu: __or__3fooRT0" "foo::operator|(foo &)" + test_demangling_exact "gnu: __pl__3fooRT0" "foo::operator+(foo &)" + test_demangling_exact "gnu: __pp__3fooi" "foo::operator++(int)" + test_demangling_exact "gnu: __rf__3foo" "foo::operator->(void)" + test_demangling_exact "gnu: __rm__3fooRT0" "foo::operator->*(foo &)" + test_demangling_exact "gnu: __rs__3fooRT0" "foo::operator>>(foo &)" + test_demangling "gnu: __vc__3fooRT0" "foo::operator\\\[\\\]\\(foo &\\)" + test_demangling "gnu: _gsub__6StringRC5RegexPCci" \ + "String::_gsub\[(\]+(const Regex|Regex const) &, (const char|char const) \[*\]+, int\[)\]+" + test_demangling_exact "gnu: _new_Fix__FUs" "_new_Fix(unsigned short)" + + # gcc 2.4.5 (and earlier) style virtual tables. We want to continue to + # correctly demangle these even if newer compilers use a different form. + test_demangling_exact "gnu: _vt.foo" "foo virtual table" + test_demangling_exact "gnu: _vt.foo.bar" "foo::bar virtual table" + test_demangling_exact "gnu: _vt\$foo" "foo virtual table" + test_demangling_exact "gnu: _vt\$foo\$bar" "foo::bar virtual table" + + test_demangling_exact "gnu: append__7ivGlyphPT0" "ivGlyph::append(ivGlyph *)" + test_demangling "gnu: arg__FRC7Complex" \ + "arg\[(\]+(const Complex|Complex const) &\[)\]+" + test_demangling_exact "gnu: clearok__FP7_win_sti" "clearok(_win_st *, int)" + + test_demangling_exact "gnu: complexfunc2__FPFPc_i" "complexfunc2(int (*)(char *))" + test_demangling_exact "gnu: complexfunc3__FPFPFPl_s_i" "complexfunc3(int (*)(short (*)(long *)))" + test_demangling_exact "gnu: complexfunc4__FPFPFPc_s_i" "complexfunc4(int (*)(short (*)(char *)))" + test_demangling_exact "gnu: complexfunc5__FPFPc_PFl_i" "complexfunc5(int (*(*)(char *))(long))" + test_demangling_exact "gnu: complexfunc6__FPFPi_PFl_i" "complexfunc6(int (*(*)(int *))(long))" + test_demangling_exact "gnu: complexfunc7__FPFPFPc_i_PFl_i" "complexfunc7(int (*(*)(int (*)(char *)))(long))" + test_demangling "gnu: contains__C9BitStringRC10BitPattern" \ + "BitString::contains\[(\]+(const BitPattern|BitPattern const) &\[)\]+ const" + test_demangling "gnu: contains__C9BitStringRC12BitSubStringi" \ + "BitString::contains\[(\]+(const BitSubString|BitSubString const) &, int\[)\]+ const" + test_demangling "gnu: contains__C9BitStringRT0" \ + "BitString::contains\[(\]+(const BitString|BitString const) &\[)\]+ const" + test_demangling "gnu: div__FPC6IntRepT0P6IntRep" \ + "div\[(\]+(const IntRep|IntRep const) \[*\]+, (const IntRep|IntRep const) \[*\]+, IntRep \[*\]+\[)\]+" + test_demangling "gnu: div__FPC6IntReplP6IntRep" \ + "div\[(\]+(const IntRep|IntRep const) \[*\]+, long, IntRep \[*\]+\[)\]+" + test_demangling "gnu: div__FRC8RationalT0R8Rational" \ + "div\[(\]+(const Rational|Rational const) &, (const Rational|Rational const) &, Rational &\[)\]+" + test_demangling "gnu: divide__FRC7IntegerT0R7IntegerT2" \ + "divide\[(\]+(const Integer|Integer const) &, (const Integer|Integer const) &, Integer &, Integer &\[)\]+" + test_demangling "gnu: divide__FRC7IntegerlR7IntegerRl" \ + "divide\[(\]+(const Integer|Integer const) &, long, Integer &, long &\[)\]+" + test_demangling "gnu: enable__14DocumentViewerPCcUi" \ + "DocumentViewer::enable\[(\]+(const char|char const) \[*\]+, unsigned int\[)\]+" + + test_demangling_exact "gnu: foo__FiN30" "foo(int, int, int, int)" + test_demangling_exact "gnu: foo__FiR3fooiT1iT1" "foo(int, foo &, int, foo &, int, foo &)" + test_demangling_exact "gnu: foo___3barl" "bar::foo_(long)" + test_demangling_exact "gnu: insert__15ivClippingStacklRP8_XRegion" "ivClippingStack::insert(long, _XRegion *&)" + test_demangling_exact "gnu: insert__16ChooserInfo_ListlR11ChooserInfo" "ChooserInfo_List::insert(long, ChooserInfo &)" + test_demangling_exact "gnu: insert__17FontFamilyRepListlRP15ivFontFamilyRep" "FontFamilyRepList::insert(long, ivFontFamilyRep *&)" + test_demangling_exact "gnu: leaveok__FP7_win_stc" "leaveok(_win_st *, char)" + test_demangling_exact "gnu: left_mover__C7ivMFKitP12ivAdjustableP7ivStyle" "ivMFKit::left_mover(ivAdjustable *, ivStyle *) const" + test_demangling "gnu: matches__C9BitStringRC10BitPatterni" \ + "BitString::matches\[(\]+(const BitPattern|BitPattern const) &, int\[)\]+ const" + test_demangling "gnu: matches__C9SubStringRC5Regex" \ + "SubString::matches\[(\]+(const Regex|Regex const) &\[)\]+ const" + + test_demangling_exact "gnu: overload1arg__FSc" "overload1arg(signed char)" + test_demangling_exact "gnu: overload1arg__FUc" "overload1arg(unsigned char)" + test_demangling_exact "gnu: overload1arg__FUi" "overload1arg(unsigned int)" + test_demangling_exact "gnu: overload1arg__FUl" "overload1arg(unsigned long)" + test_demangling_exact "gnu: overload1arg__FUs" "overload1arg(unsigned short)" + test_demangling_exact "gnu: overload1arg__Fc" "overload1arg(char)" + test_demangling_exact "gnu: overload1arg__Fd" "overload1arg(double)" + test_demangling_exact "gnu: overload1arg__Ff" "overload1arg(float)" + test_demangling_exact "gnu: overload1arg__Fi" "overload1arg(int)" + test_demangling_exact "gnu: overload1arg__Fl" "overload1arg(long)" + test_demangling_exact "gnu: overload1arg__Fs" "overload1arg(short)" + test_demangling_exact "gnu: overload1arg__Fv" "overload1arg(void)" + test_demangling_exact "gnu: overloadargs__Fi" "overloadargs(int)" + test_demangling_exact "gnu: overloadargs__Fii" "overloadargs(int, int)" + test_demangling_exact "gnu: overloadargs__Fiii" "overloadargs(int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiii" "overloadargs(int, int, int, int)" + + test_demangling_exact "gnu: overloadargs__Fiiiii" "overloadargs(int, int, int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiiiii" "overloadargs(int, int, int, int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiiiiii" "overloadargs(int, int, int, int, int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int, int)" + test_demangling_exact "gnu: overloadargs__Fiiiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int, int, int)" + test_demangling "gnu: pick__13ivCompositionP8ivCanvasRC12ivAllocationiR5ivHit" \ + "ivComposition::pick\[(\]+ivCanvas \[*\]+, (const ivAllocation|ivAllocation const) &, int, ivHit &\[)\]+" + test_demangling "gnu: pointer__C11ivHScrollerRC7ivEventRC12ivAllocation" \ + "ivHScroller::pointer\[(\]+(const ivEvent|ivEvent const) &, (const ivAllocation|ivAllocation const) &\[)\]+ const" + test_demangling_exact "gnu: poke__8ivRasterUlUlffff" "ivRaster::poke(unsigned long, unsigned long, float, float, float, float)" + test_demangling_exact "gnu: polar__Fdd" "polar(double, double)" + test_demangling "gnu: read__10osStdInputRPCc" \ + "osStdInput::read\[(\]+(const char|char const) \[*\]+&\[)\]+" + + test_demangling_exact "gnu: scale__13ivTransformerff" "ivTransformer::scale(float, float)" + test_demangling "gnu: scanw__12CursesWindowPCce" \ + "CursesWindow::scanw\[(\]+(const char|char const) \[*\]+,...\[)\]+" + test_demangling "gnu: scmp__FPCcT0" \ + "scmp\[(\]+(const char|char const) \[*\]+, (const char|char const) \[*\]+\[)\]+" + test_demangling_exact "gnu: sgetn__7filebufPci" "filebuf::sgetn(char *, int)" + test_demangling_exact "gnu: shift__FP5_FrepiT0" "shift(_Frep *, int, _Frep *)" + test_demangling_exact "gnu: test__C6BitSeti" "BitSet::test(int) const" + test_demangling_exact "gnu: test__C6BitSetii" "BitSet::test(int, int) const" + test_demangling "gnu: testbit__FRC7Integerl" \ + "testbit\[(\]+(const Integer|Integer const) &, long\[)\]+" + test_demangling_exact "gnu: text_source__8Documentl" "Document::text_source(long)" + test_demangling_exact "gnu: variance__6Erlangd" "Erlang::variance(double)" + test_demangling "gnu: vform__8iostreamPCcPc" \ + "iostream::vform\[(\]+(const char|char const) \[*\]+, char \[*\]+\[)\]+" + test_demangling_exact "gnu: view__14DocumentViewerP8ItemViewP11TabularItem" "DocumentViewer::view(ItemView *, TabularItem *)" + test_demangling_exact "gnu: xy_extents__11ivExtensionffff" "ivExtension::xy_extents(float, float, float, float)" + test_demangling_exact "gnu: zero__8osMemoryPvUi" "osMemory::zero(void *, unsigned int)" + test_demangling_exact "gnu: _2T4\$N" "T4::N" + test_demangling_exact "gnu: _Q22T42t1\$N" "T4::t1::N" + test_demangling_exact "gnu: get__2T1" "T1::get(void)" + test_demangling_exact "gnu: get__Q22T11a" "T1::a::get(void)" + test_demangling_exact "gnu: get__Q32T11a1b" "T1::a::b::get(void)" + test_demangling_exact "gnu: get__Q42T11a1b1c" "T1::a::b::c::get(void)" + test_demangling_exact "gnu: get__Q52T11a1b1c1d" "T1::a::b::c::d::get(void)" + test_demangling_exact "gnu: put__2T1i" "T1::put(int)" + test_demangling_exact "gnu: put__Q22T11ai" "T1::a::put(int)" + test_demangling_exact "gnu: put__Q32T11a1bi" "T1::a::b::put(int)" + test_demangling_exact "gnu: put__Q42T11a1b1ci" "T1::a::b::c::put(int)" + test_demangling_exact "gnu: put__Q52T11a1b1c1di" "T1::a::b::c::d::put(int)" + + test_demangling_exact "gnu: bar__3fooPv" "foo::bar(void *)" + test_demangling "gnu: bar__3fooPCv" \ + "foo::bar\[(\]+(const void|void const) *\[*\]+\[)\]+" + test_demangling_exact "gnu: bar__C3fooPv" "foo::bar(void *) const" + test_demangling "gnu: bar__C3fooPCv" \ + "foo::bar\[(\]+(const void|void const) *\[*\]+\[)\]+ const" + test_demangling_exact "gnu: __eq__3fooRT0" "foo::operator==(foo &)" + test_demangling "gnu: __eq__3fooRC3foo" \ + "foo::operator==\[(\]+(const foo|foo const) &\[)\]+" + test_demangling_exact "gnu: __eq__C3fooR3foo" "foo::operator==(foo &) const" + test_demangling "gnu: __eq__C3fooRT0" \ + "foo::operator==\[(\]+(const foo|foo const) &\[)\]+ const" + + test_demangling_exact "gnu: elem__t6vector1Zdi" "vector::elem(int)" + test_demangling_exact "gnu: elem__t6vector1Zii" "vector::elem(int)" + test_demangling_exact "gnu: __t6vector1Zdi" "vector::vector(int)" + test_demangling_exact "gnu: __t6vector1Zii" "vector::vector(int)" + test_demangling_exact "gnu: _\$_t6vector1Zdi" "vector::~vector(int)" + test_demangling_exact "gnu: _\$_t6vector1Zii" "vector::~vector(int)" + + test_demangling_exact "gnu: __nw__t2T11ZcUi" "T1::operator new(unsigned int)" + test_demangling_exact "gnu: __nw__t2T11Z1tUi" "T1::operator new(unsigned int)" + test_demangling_exact "gnu: __dl__t2T11ZcPv" "T1::operator delete(void *)" + test_demangling_exact "gnu: __dl__t2T11Z1tPv" "T1::operator delete(void *)" + test_demangling_exact "gnu: __t2T11Zci" "T1::T1(int)" + test_demangling_exact "gnu: __t2T11Zc" "T1::T1(void)" + test_demangling_exact "gnu: __t2T11Z1ti" "T1::T1(int)" + test_demangling_exact "gnu: __t2T11Z1t" "T1::T1(void)" + + test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3Pix" \ + "List::Pix::Pix(void)" + + test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3PixPQ2t4List1Z10VHDLEntity7element" \ + "List::Pix::Pix(List::element *)" + + test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3PixRCQ2t4List1Z10VHDLEntity3Pix" \ + "List::Pix::Pix(List::Pix const &)" + + test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity7elementRC10VHDLEntityPT0" \ + "List::element::element(VHDLEntity const &, List::element *)" + + test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity7elementRCQ2t4List1Z10VHDLEntity7element" \ + "List::element::element(List::element const &)" + + test_demangling_exact "gnu: __cl__C11VHDLLibraryGt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ + "VHDLLibrary::operator()(PixX >) const" + + test_demangling_exact "gnu: __cl__Ct4List1Z10VHDLEntityRCQ2t4List1Z10VHDLEntity3Pix" \ + "List::operator()(List::Pix const &) const" + + test_demangling_exact "gnu: __ne__FPvRCQ2t4List1Z10VHDLEntity3Pix" \ + "operator!=(void *, List::Pix const &)" + + test_demangling_exact "gnu: __ne__FPvRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ + "operator!=(void *, PixX > const &)" + + test_demangling_exact "gnu: __t4List1Z10VHDLEntityRCt4List1Z10VHDLEntity" \ + "List::List(List const &)" + + test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ + "PixX >::PixX(void)" + + test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityP14VHDLLibraryRepGQ2t4List1Z10VHDLEntity3Pix" \ + "PixX >::PixX(VHDLLibraryRep *, List::Pix)" + + test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ + "PixX >::PixX(PixX > const &)" + + test_demangling_exact "gnu: nextE__C11VHDLLibraryRt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ + "VHDLLibrary::nextE(PixX > &) const" + + test_demangling_exact "gnu: next__Ct4List1Z10VHDLEntityRQ2t4List1Z10VHDLEntity3Pix" \ + "List::next(List::Pix &) const" + + test_demangling_exact "gnu: _GLOBAL_\$D\$set" "global destructors keyed to set" + + test_demangling_exact "gnu: _GLOBAL_\$I\$set" "global constructors keyed to set" + + test_demangling_exact "gnu: __as__t5ListS1ZUiRCt5ListS1ZUi" \ + "ListS::operator=(ListS const &)" + + test_demangling_exact "gnu: __cl__Ct5ListS1ZUiRCQ2t5ListS1ZUi3Vix" \ + "ListS::operator()(ListS::Vix const &) const" + + test_demangling_exact "gnu: __cl__Ct5SetLS1ZUiRCQ2t5SetLS1ZUi3Vix" \ + "SetLS::operator()(SetLS::Vix const &) const" + + test_demangling_exact "gnu: __t10ListS_link1ZUiRCUiPT0" \ + "ListS_link::ListS_link(unsigned int const &, ListS_link *)" + + test_demangling_exact "gnu: __t10ListS_link1ZUiRCt10ListS_link1ZUi" \ + "ListS_link::ListS_link(ListS_link const &)" + + test_demangling_exact "gnu: __t5ListS1ZUiRCt5ListS1ZUi" \ + "ListS::ListS(ListS const &)" + + test_demangling_exact "gnu: next__Ct5ListS1ZUiRQ2t5ListS1ZUi3Vix" \ + "ListS::next(ListS::Vix &) const" + + test_demangling_exact "gnu: __ne__FPvRCQ2t5SetLS1ZUi3Vix" \ + "operator!=(void *, SetLS::Vix const &)" + test_demangling_exact "gnu: __t8ListElem1Z5LabelRt4List1Z5Label" \ + "ListElem = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, d = 7, dd = 8\}\r\n$gdb_prompt $" { + pass "print value of d_instance" + } + -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, d = 7, dd = 8\}\r\n$gdb_prompt $" { + pass "print value of d_instance" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance" } + timeout { fail "(timeout) print value of d_instance" } + } + + if {$gcc_compiled} then { + send_gdb "ptype d_instance\n" + gdb_expect { + -re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t ]+D & operator=\\(D const ?&\\);\[\r\n\t ]+D\\((D const|const D) ?&\\);\[\r\n\t \]+D\\((void|)\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } + -re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t ]+D & operator=\\(D const ?&\\);\[\r\n\t ]+D\\((D const|const D) ?&\\);\[\r\n\t \]+D\\((void|)\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } + -re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t \]+D\\(void\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } + -re ".*$gdb_prompt $" { fail "ptype d_instance" } + timeout { fail "(timeout) ptype d_instance" } + } + } else { + send_gdb "ptype d_instance\n" + gdb_expect { + -re "type = class D : private A, public B, protected C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t \]+D\\(void\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" } + -re ".*$gdb_prompt $" { fail "ptype d_instance" } + timeout { fail "(timeout) ptype d_instance" } + } + } + + +send_gdb "print e_instance\n" +gdb_expect { + -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, e = 9, ee = 10\}\r\n$gdb_prompt $" { + pass "print value of e_instance" + } + -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, e = 9, ee = 10\}\r\n$gdb_prompt $" { + pass "print value of e_instance" + } + -re ".*$gdb_prompt $" { fail "print value of e_instance" } + timeout { fail "(timeout) print value of e_instance" } + } + + if {$gcc_compiled} { + send_gdb "ptype e_instance\n" + gdb_expect { + -re "type = class E : public A, private B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t ]+E & operator=\\(E const ?&\\);\[\r\n\t ]+E\\((E const|const E) ?&\\);\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" } + -re "type = class E : public A, private B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" } + -re ".*$gdb_prompt $" { fail "ptype e_instance" } + timeout { fail "(timeout) ptype e_instance" } + } + } else { + send_gdb "ptype e_instance\n" + gdb_expect { + -re "type = class E : public A, private B, protected C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" } + -re ".*$gdb_prompt $" { fail "ptype e_instance" } + timeout { fail "(timeout) ptype e_instance" } + } + } + + +send_gdb "print f_instance\n" +gdb_expect { + -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, f = 11, ff = 12\}\r\n$gdb_prompt $" { + pass "print value of f_instance" + } + -re ".\[0-9\]* = \{ = \{a = 1, aa = 2\}, = \{b = 3, bb = 4\}, = \{c = 5, cc = 6\}, f = 11, ff = 12\}\r\n$gdb_prompt $" { + pass "print value of f_instance" + } + -re ".*$gdb_prompt $" { fail "print value of f_instance" } + timeout { fail "(timeout) print value of f_instance" } + } + +send_gdb "ptype f_instance\n" +gdb_expect { + -re "type = class F : private A, public B, private C \{\r\n\[\t \]*public:\r\n\[\t \]*int f;\r\n\[\t \]*int ff;\[\r\n\t ]+F & operator=\\(F const ?&\\);\[\r\n\t ]+F\\((F const|const F) ?&\\);\[\r\n\t \]+F\\((void|)\\);\r\n\[\t \]*int ffoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype f_instance" } + -re "type = class F : private A, public B, private C \{\r\n\[\t \]*public:\r\n\[\t \]*int f;\r\n\[\t \]*int ff;\[\r\n\t \]+F\\((void|)\\);\r\n\[\t \]*int ffoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype f_instance" } + -re ".*$gdb_prompt $" { fail "ptype f_instance" } + timeout { fail "(timeout) ptype f_instance" } +} + + + +send_gdb "print d_instance.a\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of d_instance.a" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.a" } + timeout { fail "(timeout) print value of d_instance.a" } + } + +send_gdb "print d_instance.aa\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of d_instance.aa" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.aa" } + timeout { fail "(timeout) print value of d_instance.aa" } + } + +send_gdb "print d_instance.b\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of d_instance.b" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.b" } + timeout { fail "(timeout) print value of d_instance.b" } + } + +send_gdb "print d_instance.bb\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" { + pass "print value of d_instance.bb" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.bb" } + timeout { fail "(timeout) print value of d_instance.bb" } + } + +send_gdb "print d_instance.c\n" +gdb_expect { + -re ".\[0-9\]* = 5.*$gdb_prompt $" { + pass "print value of d_instance.c" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.c" } + timeout { fail "(timeout) print value of d_instance.c" } + } + +send_gdb "print d_instance.cc\n" +gdb_expect { + -re ".\[0-9\]* = 6.*$gdb_prompt $" { + pass "print value of d_instance.cc" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.cc" } + timeout { fail "(timeout) print value of d_instance.cc" } + } + +send_gdb "print d_instance.d\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of d_instance.d" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.d" } + timeout { fail "(timeout) print value of d_instance.d" } + } + +send_gdb "print d_instance.dd\n" +gdb_expect { + -re ".\[0-9\]* = 8.*$gdb_prompt $" { + pass "print value of d_instance.dd" + } + -re ".*$gdb_prompt $" { fail "print value of d_instance.dd" } + timeout { fail "(timeout) print value of d_instance.dd" } + } + +send_gdb "print g_instance.a\n" +gdb_expect { + -re "warning.*$gdb_prompt $" { + # The compiler doesn't think this is ambiguous. + fail "print value of g_instance.a" + } + -re ".\[0-9\]* = 15.*$gdb_prompt $" { + pass "print value of g_instance.a" + } + -re ".*$gdb_prompt $" { fail "print value of g_instance.a" } + timeout { fail "(timeout) print value of g_instance.a" } + } + +send_gdb "print g_instance.b\n" +gdb_expect { + -re "warning.*$gdb_prompt $" { + # The compiler doesn't think this is ambiguous. + fail "print value of g_instance.b" + } + -re ".\[0-9\]* = 16.*$gdb_prompt $" { + pass "print value of g_instance.b" + } + -re ".*$gdb_prompt $" { fail "print value of g_instance.b" } + timeout { fail "(timeout) print value of g_instance.b" } + } + +send_gdb "print g_instance.c\n" +gdb_expect { + -re "warning.*$gdb_prompt $" { + # The compiler doesn't think this is ambiguous. + fail "print value of g_instance.c" + } + -re ".\[0-9\]* = 17.*$gdb_prompt $" { + pass "print value of g_instance.c" + } + -re ".*$gdb_prompt $" { fail "print value of g_instance.c" } + timeout { fail "(timeout) print value of g_instance.c" } + } + +send_gdb "print g_instance.afoo()\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of g_instance.afoo()" + } + -re ".*$gdb_prompt $" { fail "print value of g_instance.afoo()" } + timeout { fail "(timeout) print value of g_instance.afoo()" } + } + + +# If GDB fails to restore the selected frame properly after the +# inferior function call above (see GDB PR 1155 for an explanation of +# why this might happen), all the subsequent tests will fail. We +# should detect report that failure, but let the marker call finish so +# that the rest of the tests can run undisturbed. +gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" { + -re "#0 marker1.*$gdb_prompt $" { + setup_kfail "gdb/1155" s390-*-linux-gnu + fail "re-selected 'main' frame after inferior call" + gdb_test "finish" ".*main.*at .*derivation.cc:.*// marker1-returns-here.*" \ + "finish call to marker1" + } + -re "#1 ($hex in )?main.*$gdb_prompt $" { + pass "re-selected 'main' frame after inferior call" + } +} + +send_gdb "print g_instance.bfoo()\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of g_instance.bfoo()" + } + -re ".*$gdb_prompt $" { fail "print value of g_instance.bfoo()" } + timeout { fail "(timeout) print value of g_instance.bfoo()" } + } + +send_gdb "print g_instance.cfoo()\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of g_instance.cfoo()" + } + -re ".*$gdb_prompt $" { fail "print value of g_instance.cfoo()" } + timeout { fail "(timeout) print value of g_instance.cfoo()" } + } diff --git a/gdb/testsuite/gdb.cp/hang.H b/gdb/testsuite/gdb.cp/hang.H new file mode 100644 index 0000000..26fec87 --- /dev/null +++ b/gdb/testsuite/gdb.cp/hang.H @@ -0,0 +1,12 @@ +struct A +{ + struct B *b_ptr_in_a; +}; + +struct C +{ + struct B + { + int member_of_B_in_C; + }; +}; diff --git a/gdb/testsuite/gdb.cp/hang.exp b/gdb/testsuite/gdb.cp/hang.exp new file mode 100644 index 0000000..4c117a1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/hang.exp @@ -0,0 +1,128 @@ +# Copyright (C) 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile hang +set binfile ${objdir}/${subdir}/${testfile} + +foreach file {hang1 hang2 hang3} { + if {[gdb_compile "${srcdir}/${subdir}/${file}.C" "${file}.o" object {c++ debug}] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} + +if {[gdb_compile "hang1.o hang2.o hang3.o" ${binfile} executable {c++ debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# As of May 1, 2002, GDB hangs trying to read the debug info for the +# `hang2.o' compilation unit from the executable `hang', when compiled +# by g++ 2.96 with STABS debugging info. Here's what's going on, as +# best as I can tell. +# +# The definition of `struct A' in `hang.H' refers to `struct B' as an +# incomplete type. The stabs declare type number (1,3) to be a cross- +# reference type, `xsB:'. +# +# The definition of `struct C' contains a nested definition for +# `struct B' --- or more properly, `struct C::B'. However, the stabs +# fail to qualify the structure tag: it just looks like a definition +# for `struct B'. I think this is a compiler bug, but perhaps GCC +# doesn't emit qualified names for a reason. +# +# `hang.H' gets #included by both `hang1.C' and `hang2.C'. So the +# stabs for `struct A', the incomplete `struct B', and `struct C' +# appear in both hang1.o's and hang2.o's stabs. +# +# When those two files are linked together, since hang2.o appears +# later in the command line, its #inclusion of `hang.H' gets replaced +# with an N_EXCL stab, referring back to hang1.o's stabs for the +# header file. +# +# When GDB builds psymtabs for the executable hang, it notes that +# hang2.o's stabs contain an N_EXCL referring to a header that appears +# in full in hang1.o's stabs. So hang2.o's psymtab lists a dependency +# on hang1.o's psymtab. +# +# When the user types the command `print var_in_b', GDB scans the +# psymtabs for a symbol by that name, and decides to read full symbols +# for `hang2.o'. +# +# Since `hang2.o''s psymtab lists `hang1.o' as a dependency, GDB first +# reads `hang1.o''s symbols. When GDB sees `(1,3)=xsB:', it creates a +# type object for `struct B', sets its TYPE_FLAG_STUB flag, and +# records it as type number `(1,3)'. +# +# When GDB finds the definition of `struct C::B', since the stabs +# don't indicate that the type is nested within C, it treats it as +# a definition of `struct B'. +# +# When GDB is finished reading `hang1.o''s symbols, it calls +# `cleanup_undefined_types'. This function mistakes the definition of +# `struct C::B' for a definition for `struct B', and overwrites the +# incomplete type object for the real `struct B', using `memcpy'. Now +# stabs type number `(1,3)' refers to this (incorrect) complete type. +# Furthermore, the `memcpy' simply copies the original's `cv_type' +# field to the target, giving the target a corrupt `cv_type' ring: the +# chain does not point back to the target type. +# +# Having satisfied `hang2.o''s psymtab's dependencies, GDB begins to +# read `hang2.o''s symbols. These contain the true definition for +# `struct B', which refers to type number `(1,3)' as the type it's +# defining. GDB looks up type `(1,3)', and finds the (incorrect) +# complete type established by the call to `cleanup_undefined_types' +# above. However, it doesn't notice that the type is already defined, +# and passes it to `read_struct_type', which then writes the new +# definition's size, field list, etc. into the type object which +# already has those fields initialized. Adding insult to injury, +# `read_struct_type' then calls `finish_cv_type'; since the `memcpy' +# in `cleanup_undefined_types' corrupted the target type's `cv_type' +# ring, `finish_cv_type' enters an infinite loop. + +# This checks that GDB recognizes when a structure is about to be +# overwritten, and refuses, with a complaint. +gdb_test "print var_in_b" " = 1729" "doesn't overwrite struct type" + +# This checks that cleanup_undefined_types doesn't create corrupt +# cv_type chains. Note that var_in_hang3 does need to be declared in +# a separate compilation unit, whose psymtab depends on hang1.o's +# psymtab. Otherwise, GDB won't call cleanup_undefined_types (as it +# finishes hang1.o's symbols) before it calls make_cv_type (while +# reading hang3.o's symbols). +# +# The bug only happens when you compile with -gstabs+; Otherwise, GCC +# won't include the `const' qualifier on `const_B_ptr' in `hang3.o''s +# STABS, so GDB won't try to create a const variant of the smashed +# struct type, and get caught by the corrupted cv_type chain. +gdb_test "print var_in_hang3" " = 42" "doesn't corrupt cv_type chain" diff --git a/gdb/testsuite/gdb.cp/hang1.C b/gdb/testsuite/gdb.cp/hang1.C new file mode 100644 index 0000000..4b04d77 --- /dev/null +++ b/gdb/testsuite/gdb.cp/hang1.C @@ -0,0 +1,3 @@ +#include "hang.H" + +int main (int argc, char **argv) { return 0; } diff --git a/gdb/testsuite/gdb.cp/hang2.C b/gdb/testsuite/gdb.cp/hang2.C new file mode 100644 index 0000000..59732f8 --- /dev/null +++ b/gdb/testsuite/gdb.cp/hang2.C @@ -0,0 +1,8 @@ +#include "hang.H" + +struct B +{ + int member_of_B; +}; + +int var_in_b = 1729; diff --git a/gdb/testsuite/gdb.cp/hang3.C b/gdb/testsuite/gdb.cp/hang3.C new file mode 100644 index 0000000..92c82fa --- /dev/null +++ b/gdb/testsuite/gdb.cp/hang3.C @@ -0,0 +1,4 @@ +#include "hang.H" + +const struct B *const_B_ptr; +int var_in_hang3 = 42; diff --git a/gdb/testsuite/gdb.cp/inherit.exp b/gdb/testsuite/gdb.cp/inherit.exp new file mode 100644 index 0000000..993bfb1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/inherit.exp @@ -0,0 +1,1018 @@ +# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +set ws "\[\r\n\t \]+" +set nl "\[\r\n\]+" + +# The format of a g++ virtual base pointer. +set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?" + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +# Note - create separate "inherit" executable from misc.cc + +set testfile "inherit" +set srcfile misc.cc +set binfile ${objdir}/${subdir}/${testfile} + + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# +# Single inheritance, print individual members. +# + +proc test_print_si_members {} { + # Print all members of g_A using fully qualified form. + + gdb_test "print g_A.A::a" ".* = 1" "print g_A.A::a" + + gdb_test "print g_A.A::x" ".* = 2" "print g_A.A::x" + + # Print members of g_A using nonambiguous compact form. + + gdb_test "print g_A.a" ".* = 1" "print g_A.a" + + gdb_test "print g_A.x" ".* = 2" "print g_A.x" + + # Print all members of g_B using fully qualified form. + + gdb_test "print g_B.A::a" ".* = 3" "print g_B.A::a" + + gdb_test "print g_B.A::x" ".* = 4" "print g_B.A::x" + + gdb_test "print g_B.B::b" ".* = 5" "print g_B.B::b" + + gdb_test "print g_B.B::x" ".* = 6" "print g_B.B::x" + + # Print members of g_B using nonambiguous compact form. + + gdb_test "print g_B.a" ".* = 3" "print g_B.a" + + gdb_test "print g_B.b" ".* = 5" "print g_B.b" + + gdb_test "print g_B.x" ".* = 6" "print g_B.x" + + # Print all members of g_C using fully qualified form. + + gdb_test "print g_C.A::a" ".* = 7" "print g_C.A::a" + + gdb_test "print g_C.A::x" ".* = 8" "print g_C.A::x" + + gdb_test "print g_C.C::c" ".* = 9" "print g_C.C::c" + + gdb_test "print g_C.C::x" ".* = 10" "print g_C.C::x" + + # Print members of g_C using nonambiguous compact form. + + gdb_test "print g_C.a" ".* = 7" "print g_C.a" + + gdb_test "print g_C.c" ".* = 9" "print g_C.c" + + gdb_test "print g_C.x" ".* = 10" "print g_C.x" +} + +# +# Single inheritance, print type definitions. +# + +proc test_ptype_si {} { + global gdb_prompt + global ws + global nl + global hp_aCC_compiler + + # Print class A as a type. + + send_gdb "ptype A\n" + gdb_expect { + -re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" { + pass "ptype A (FIXME)" + } + -re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" { + setup_xfail "*-*-*" + fail "ptype A (FIXME)" + } + -re ".*$gdb_prompt $" { fail "ptype A" } + timeout { fail "ptype A (timeout)" ; return } + } + + # Print class A as an explicit class. + + send_gdb "ptype class A\n" + gdb_expect { + -re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" { + pass "ptype class A (FIXME)" + } + -re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" { + if {!$hp_aCC_compiler} {setup_xfail "*-*-*"} + fail "ptype class A (FIXME)" + } + -re ".*$gdb_prompt $" { fail "ptype class A" } + timeout { fail "ptype class A (timeout)" ; return } + } + + # Print type of an object of type A. + + send_gdb "ptype g_A\n" + gdb_expect { + -re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" { + pass "ptype g_A (FIXME)" + } + -re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" { + if {!$hp_aCC_compiler} {setup_xfail "*-*-*"} + fail "ptype g_A (FIXME)" + } + -re ".*$gdb_prompt $" { fail "ptype g_A" } + timeout { fail "ptype g_A (timeout)" ; return } + } + + # Print class B as a type. + + gdb_test "ptype B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype B" + + # Print class B as an explicit class. + + gdb_test "ptype class B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype class B" + + # Print type of an object of type B. + + gdb_test "ptype g_B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype g_B" + + # Print class C as a type. + + gdb_test "ptype C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype C" + + # Print class C as an explicit class. + + gdb_test "ptype class C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype class C" + + # Print type of an object of type g_C. + + gdb_test "ptype g_C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype g_C" + + # gcc cygnus-2.3.3 (Q1) has this bug, but it was fixed as of + # cygnus-2.3.3-930417. PR 2819. + send_gdb "ptype tagless_struct\n" + gdb_expect { + -re "type = class \{${ws}public:${ws}int one;${ws}int two;${ws}tagless_struct & operator=\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype tagless struct" + } + -re "type = class \{${ws}public:${ws}int one;${ws}int two;;${ws}\}$nl$gdb_prompt $" { + pass "ptype tagless struct" + } + -re "type = (struct|class).*\{.*int one;.*int two;.*\}$nl$gdb_prompt $" { + pass "ptype tagless struct (obsolete gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype tagless struct" + } + timeout { + fail "ptype tagless struct (timeout)" + } + } + + send_gdb "ptype v_tagless\n" + gdb_expect { + -re "type = class \{${ws}public:${ws}int one;${ws}int two;${ws}tagless_struct & operator=\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype variable of type tagless struct" + } + -re "type = class \{${ws}public:${ws}int one;${ws}int two;;${ws}\}$nl$gdb_prompt $" { + pass "ptype tagless struct" + } + -re "type = (struct|class).*\{.*int one;.*int two;.*\}$nl$gdb_prompt $" { + pass "ptype variable of type tagless struct (obsolete gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype variable of type tagless struct" + } + timeout { + fail "ptype variable of type tagless struct (timeout)" + } + } +} + +# +# Single inheritance, print complete classes. +# + +proc test_print_si_classes {} { + # Print all members of g_A. + + gdb_test "print g_A" ".* = \{a = 1, x = 2\}" "print g_A" + + # Print all members of g_B. + + gdb_test "print g_B" ".* = \{\<(class |)A\> = \{a = 3, x = 4\}, b = 5, x = 6\}" "print g_B" + + # Print all members of g_C. + + gdb_test "print g_C" ".* = \{\<(class |)A\> = \{a = 7, x = 8\}, c = 9, x = 10\}" "print g_C" +} + +# +# Single inheritance, print anonymous unions. +# GDB versions prior to 4.14 entered an infinite loop when printing +# the type of a class containing an anonymous union, and they were also +# incapable of printing the member of an anonymous union. +# We test the printing of the member first, and perform the other tests +# only if the test succeeds, to avoid the infinite loop. +# + +proc test_print_anon_union {} { + global gdb_prompt + global ws + global nl + + gdb_test "print g_anon_union.a" ".* = 2" "print anonymous union member" + send_gdb "print g_anon_union\n" + gdb_expect { + -re ".* = \{one = 1, ( = |)\{a = 2, b = 2\}\}$nl$gdb_prompt $" { + pass "print variable of type anonymous union" + } + -re ".* = .*\{one = 1, ( = |)\{a = 2, b = .*\}\}$nl$gdb_prompt $" { + pass "print variable of type anonymous union (obsolete gcc or gdb)" + } + -re ".*$nl$gdb_prompt $" { + fail "print variable of type anonymous union" + } + timeout { + fail "print variableof type anonymous union (timeout)" + } + } + send_gdb "ptype g_anon_union\n" + gdb_expect { + -re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}public:${ws}int a;${ws}long int b;${ws}union \{\.\.\.\} & operator=\\(union \{\.\.\.\} &\\);${ws}\\\$_0 \\(union \{\.\.\.\} &\\);${ws}\\\$_0 \\(\\);${ws}\};${ws}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\\);${ws}\}$nl$gdb_prompt $" { + pass "print type of anonymous union" + } + -re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}int a;${ws}long int b;${ws}\};${ws}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|)\\);${ws}\}$nl$gdb_prompt $" { + pass "print type of anonymous union" + } + -re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}int a;${ws}long int b;${ws}\};${ws}\}$nl$gdb_prompt $" { + pass "print type of anonymous union" + } + -re "type = (struct|class).*\{.*int one;.*union \{.*int a;.*(long|long int|int) b;.*\};.*\}$nl$gdb_prompt $" { + pass "print type of anonymous union (obsolete gcc or gdb)" + } + -re ".*$nl$gdb_prompt $" { + fail "print type of anonymous union" + } + timeout { + fail "print type of anonymous union (timeout)" + } + } +} + +# +# Multiple inheritance, print individual members. +# + +proc test_print_mi_members {} { + global gdb_prompt + global nl + global hp_aCC_compiler + + # Print all members of g_A. + + gdb_test "print g_A.A::a" ".* = 1" "print g_A.A::a" + + gdb_test "print g_A.A::x" ".* = 2" "print g_A.A::x" + + # Print all members of g_B. + + gdb_test "print g_B.A::a" ".* = 3" "print g_B.A::a" + + gdb_test "print g_B.A::x" ".* = 4" "print g_B.A::x" + + gdb_test "print g_B.B::b" ".* = 5" "print g_B.B::b" + + gdb_test "print g_B.B::x" ".* = 6" "print g_B.B::x" + + # Print all members of g_C. + + gdb_test "print g_C.A::a" ".* = 7" "print g_C.A::a" + + gdb_test "print g_C.A::x" ".* = 8" "print g_C.A::x" + + gdb_test "print g_C.C::c" ".* = 9" "print g_C.C::c" + + gdb_test "print g_C.C::x" ".* = 10" "print g_C.C::x" + + # Print all members of g_D. + + # The following is ambiguous, and gdb should detect this. + # For now, accept gdb's behavior as an expected failure if it + # simply prints either member correctly. + + send_gdb "print g_D.A::a\n" + gdb_expect { + -re "warning: A ambiguous; using D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 15$nl$gdb_prompt $" { + pass "print g_D.A::a" + } + -re "warning: A ambiguous; using D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 11$nl$gdb_prompt $" { + pass "print g_D.A::a (using B)" + } + -re ".* = 15$nl$gdb_prompt $" { + kfail "gdb/68" "print g_D.A::a" + } + -re ".* = 11$nl$gdb_prompt $" { + kfail "gdb/68" "print g_D.A::a" + } + -re ".*$gdb_prompt $" { fail "print g_D.A::a" } + timeout { fail "print g_D.A::a (timeout)" ; return } + } + + # The following is ambiguous, and gdb should detect this. + # For now, accept gdb's behavior as an expected failure if it + # simply prints either member correctly. + + send_gdb "print g_D.A::x\n" + gdb_expect { + -re "warning: A ambiguous; using D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 16$nl$gdb_prompt $" { + pass "print g_D.A::x" + } + -re "warning: A ambiguous; using D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 12$nl$gdb_prompt $" { + pass "print g_D.A::x (using B)" + } + -re ".* = 16$nl$gdb_prompt $" { + kfail "gdb/68" "print g_D.A::x" + } + -re ".* = 12$nl$gdb_prompt $" { + kfail "gdb/68" "print g_D.A::x" + } + -re ".*$gdb_prompt $" { fail "print g_D.A::x" } + timeout { fail "print g_D.A::x (timeout)" ; return } + } + + gdb_test "print g_D.B::b" ".* = 13" "print g_D.B::b" + + gdb_test "print g_D.B::x" ".* = 14" "print g_D.B::x" + + gdb_test "print g_D.C::c" ".* = 17" "print g_D.C::c" + + gdb_test "print g_D.C::x" ".* = 18" "print g_D.C::x" + + gdb_test "print g_D.D::d" ".* = 19" "print g_D.D::d" + + gdb_test "print g_D.D::x" ".* = 20" "print g_D.D::x" + + # Print all members of g_E. + + # The following is ambiguous, and gdb should detect this. + # For now, accept gdb's behavior as an expected failure if it + # simply prints either member correctly. + + send_gdb "print g_E.A::a\n" + gdb_expect { + -re ".* = 21$nl$gdb_prompt $" { + kfail "gdb/68" "print g_E.A::a" + } + -re ".* = 25$nl$gdb_prompt $" { + kfail "gdb/68" "print g_E.A::a" + } + -re ".*$gdb_prompt $" { fail "print g_E.A::a" } + timeout { fail "print g_E.A::a (timeout)" ; return } + } + + # The following is ambiguous, and gdb should detect this. + # For now, accept gdb's behavior as an expected failure if it + # simply prints either member correctly. + + send_gdb "print g_E.A::x\n" + gdb_expect { + -re "warning: A ambiguous; using E::D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 26$nl$gdb_prompt $" { + pass "print g_E.A::x" + } + -re "warning: A ambiguous; using E::D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 22$nl$gdb_prompt $" { + pass "print g_E.A::x (using B)" + } + -re ".* = 26$nl$gdb_prompt $" { + kfail "gdb/68" "print g_E.A::x" + } + -re ".* = 22$nl$gdb_prompt $" { + kfail "gdb/68" "print g_E.A::x" + } + -re ".*$gdb_prompt $" { fail "print g_E.A::x" } + timeout { fail "print g_E.A::x (timeout)" ; return } + } + + gdb_test "print g_E.B::b" ".* = 23" "print g_E.B::b" + + gdb_test "print g_E.B::x" ".* = 24" "print g_E.B::x" + + gdb_test "print g_E.C::c" ".* = 27" "print g_E.C::c" + + gdb_test "print g_E.C::x" ".* = 28" "print g_E.C::x" + + gdb_test "print g_E.D::d" ".* = 29" "print g_E.D::d" + + gdb_test "print g_E.D::x" ".* = 30" "print g_E.D::x" + + gdb_test "print g_E.E::e" ".* = 31" "print g_E.E::e" + + gdb_test "print g_E.E::x" ".* = 32" "print g_E.E::x" +} + +# +# Multiple inheritance, print type definitions. +# + +proc test_ptype_mi {} { + global nl + + gdb_test "ptype D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype D" + + gdb_test "ptype class D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype class D" + + gdb_test "ptype g_D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype g_D" + + gdb_test "ptype E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype E" + + gdb_test "ptype class E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype class E" + + gdb_test "ptype g_E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype g_E" +} + +# +# Multiple inheritance, print complete classes. +# + +proc test_print_mi_classes {} { + # Print all members of g_D. + + gdb_test "print g_D" ".* = \{\<(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\}" "print g_D" + + # Print all members of g_E. + + gdb_test "print g_E" ".* = \{\<(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\}" "print g_E" +} + +# +# Single virtual inheritance, print individual members. +# + +proc test_print_svi_members {} { + global gdb_prompt + global decimal + global nl + + # Print all members of g_vA. + + gdb_test "print g_vA.vA::va" ".* = 1" "print g_vA.vA::va" + + gdb_test "print g_vA.vA::vx" ".* = 2" "print g_vA.vA::vx" + + # Print members of g_vA using compact form. + + gdb_test "print g_vA.va" ".* = 1" "print g_vA.va" + + gdb_test "print g_vA.vx" ".* = 2" "print g_vA.vx" + + # Print all members of g_vB. + + send_gdb "print g_vB.vA::va\n" + gdb_expect { + -re ".* = 3$nl$gdb_prompt $" { pass "print g_vB.vA::va" } + -re ".*virtual baseclass botch.*$gdb_prompt $" { + # Does not happen with gcc cygnus-2.4.5-930828 + fail "print g_vB.vA::va (known bug with gcc cygnus-2.4.5-930417)" + # Many of the rest of these tests have the same problem. + return 0 + } + -re ".*$gdb_prompt $" { fail "print g_vB.vA::va" } + timeout { fail "print g_vB.vA::va (timeout)" ; return } + } + + gdb_test "print g_vB.vA::vx" ".* = 4" "print g_vB.vA::vx" + + gdb_test "print g_vB.vB::vb" ".* = 5" "print g_vB.vB::vb" + + gdb_test "print g_vB.vB::vx" ".* = 6" "print g_vB.vB::vx" + + # Print members of g_vB using compact form. + + gdb_test "print g_vB.va" ".* = 3" "print g_vB.va" + + gdb_test "print g_vB.vb" ".* = 5" "print g_vB.vb" + + gdb_test "print g_vB.vx" ".* = 6" "print g_vB.vx" + + # Print all members of g_vC. + + gdb_test "print g_vC.vA::va" ".* = 7" "print g_vC.vA::va" + + gdb_test "print g_vC.vA::vx" ".* = 8" "print g_vC.vA::vx" + + gdb_test "print g_vC.vC::vc" ".* = 9" "print g_vC.vC::vc" + + gdb_test "print g_vC.vC::vx" ".* = 10" "print g_vC.vC::vx" + + # Print members of g_vC using compact form. + + gdb_test "print g_vC.va" ".* = 7" "print g_vC.va" + + gdb_test "print g_vC.vc" ".* = 9" "print g_vC.vc" + + gdb_test "print g_vC.vx" ".* = 10" "print g_vC.vx" +} + +# +# Single virtual inheritance, print type definitions. +# + +proc test_ptype_vi {} { + global gdb_prompt + global ws + global nl + global vbptr + + # This class does not use any C++-specific features, so it's fine for + # it to print as "struct". + send_gdb "ptype vA\n" + gdb_expect { + -re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype vA" + } + -re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" { + pass "ptype vA" + } + -re ".*$gdb_prompt $" { fail "ptype vA" } + timeout { fail "ptype vA (timeout)" ; return } + } + + # This class does not use any C++-specific features, so it's fine for + # it to print as "struct". + send_gdb "ptype class vA\n" + gdb_expect { + -re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class vA" + } + -re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" { + pass "ptype class vA" + } + -re ".*$gdb_prompt $" { fail "ptype class vA" } + timeout { fail "ptype class vA (timeout)" ; return } + } + + # This class does not use any C++-specific features, so it's fine for + # it to print as "struct". + send_gdb "ptype g_vA\n" + gdb_expect { + -re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype g_vA" + } + -re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" { + pass "ptype g_vA" + } + -re ".*$gdb_prompt $" { fail "ptype g_vA" } + timeout { fail "ptype g_vA (timeout)" ; return } + } + + send_gdb "ptype vB\n" + gdb_expect { + -re "ptype vB${nl}type = class vB : public virtual vA \{$nl private:${ws}vA \\*${vbptr}vA;$nl public:${ws}int vb;${ws}int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype vB" + } + -re "ptype vB${nl}type = class vB : public virtual vA \{$nl public:${ws}int vb;${ws}int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype vB (aCC)" + } + -re ".*$gdb_prompt $" { fail "ptype vB" } + timeout { fail "ptype vB (timeout)" } + } + + send_gdb "ptype class vB\n" + gdb_expect { + -re "type = class vB : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class vB" + } + -re "type = class vB : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class vB (aCC)" + } + -re ".*$gdb_prompt $" { fail "ptype class vB" } + timeout { fail "ptype class vB (timeout)" } + } + + send_gdb "ptype g_vB\n" + gdb_expect { + -re "type = class vB : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype g_vB" + } + -re "type = class vB : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype g_vB (aCC)" + } + -re ".*$gdb_prompt $" { fail "ptype g_vB" } + timeout { fail "ptype g_vB (timeout)" } + } + + send_gdb "ptype vC\n" + gdb_expect { + -re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype vC" + } + -re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype vC (aCC)" + } + -re ".*$gdb_prompt $" { fail "ptype vC" } + timeout { fail "ptype vC (timeout)" } + } + + send_gdb "ptype class vC\n" + gdb_expect { + -re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class vC" + } + -re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype class vC (aCC)" + } + -re ".*$gdb_prompt $" { fail "ptype class vC" } + timeout { fail "ptype class vC (timeout)" } + } + + send_gdb "ptype g_vC\n" + gdb_expect { + -re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype g_vC" + } + -re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" { + pass "ptype g_vC (aCC)" + } + -re ".*$gdb_prompt $" { fail "ptype g_vC" } + timeout { fail "ptype g_vC (timeout)" } + } +} + +# +# Single virtual inheritance, print complete classes. +# + +proc test_print_svi_classes {} { + global gdb_prompt + global hex + global decimal + global nl + global vbptr + + # Print all members of g_vA. + + gdb_test "print g_vA" ".* = \{va = 1, vx = 2\}" "print g_vA" + + # Print all members of g_vB. + + send_gdb "print g_vB\n" + gdb_expect { + -re ".* = \{\ = \{va = 3, vx = 4\}, vb = 5, vx = 6, Virtual table at $hex\}$nl$gdb_prompt $" { + pass "print g_vB (aCC)" + } + -re ".* = \{\ = \{va = 3, vx = 4\}, vb = 5, vx = 6, __vfp = $hex\}$nl$gdb_prompt $" { + pass "print g_vB (aCC)" + } + -re ".* = \{\ = \{va = 3, vx = 4\}, ${vbptr}vA = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" { + pass "print g_vB" + } + -re ".* = \{\ = \{va = 3, vx = 4\}, _vptr.vB = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" { + pass "print g_vB (FIXME v3 vtbl ptr)" + } + -re ".* = \{\ = \{va = 3, vx = 4\}, _vptr.vB = $hex , vb = 5, vx = 6\}$nl$gdb_prompt $" { + # Happens with gcc 3.3 -gstabs+ + # Does not happen with gcc 3.2.3 -gstabs+. + # Does not happen gcc HEAD%20030624 (pre-3.4) -gstabs+. + # -- chastain 2003-06-29 + pass "print g_vB" + } + + -re ".*invalid address 0x0.*$gdb_prompt $" { + # Does not happen with gcc cygnus-2.4.5-930828 + fail "print g_vB (known bug with gcc cygnus-2.4.5-930417)" + # Many of the rest of these tests have the same problem. + return 0 + } + -re ".*$gdb_prompt $" { fail "print g_vB" } + timeout { fail "print g_vB (timeout)" ; return } + } + + # Print all members of g_vC. + + send_gdb "print g_vC\n" + gdb_expect { + -re ".* = \{\ = \{va = 7, vx = 8\}, vc = 9, vx = 10, Virtual table at $hex\}$nl$gdb_prompt $" { + pass "print g_vC (aCC)" + } + -re ".* = \{\ = \{va = 7, vx = 8\}, vc = 9, vx = 10, __vfp = $hex\}$nl$gdb_prompt $" { + pass "print g_vC (aCC)" + } + -re ".* = \{\ = \{va = 7, vx = 8\}, ${vbptr}vA = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" { + pass "print g_vC" + } + -re ".* = \{\ = \{va = 7, vx = 8\}, _vptr.vC = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" { + pass "print g_vC (FIXME v3 vtbl ptr)" + } + -re ".* = \{\ = \{va = 7, vx = 8\}, _vptr.vC = $hex , vc = 9, vx = 10\}$nl$gdb_prompt $" { + # Happens with gcc 3.3 -gstabs+ + # Does not happen with gcc 3.2.3 -gstabs+. + # Does not happen gcc HEAD%20030624 (pre-3.4) -gstabs+. + # -- chastain 2003-06-29 + pass "print g_vC" + } + -re ".*$gdb_prompt $" { fail "print g_vC" } + timeout { fail "print g_vC (timeout)" } + } +} + +# +# Multiple virtual inheritance, print individual members. +# + +proc test_print_mvi_members {} { + global gdb_prompt + global decimal + global nl + + # Print all members of g_vD. + + send_gdb "print g_vD.vA::va\n" + gdb_expect { + -re ".* = 19$nl$gdb_prompt $" { pass "print g_vD.vA::va" } + -re ".*virtual baseclass botch.*$gdb_prompt $" { + # Does not happen with gcc cygnus-2.4.5-930828 + fail "print g_vD.vA::va (known bug with gcc cygnus-2.4.5-930417)" + # Many of the rest of these tests have the same problem. + return 0 + } + -re ".*$gdb_prompt $" { fail "print g_vD.vA::va" } + timeout { fail "print g_vD.vA::va (timeout)" ; return } + } + + gdb_test "print g_vD.vA::vx" ".* = 20" "print g_vD.vA::vx" + + gdb_test "print g_vD.vB::vb" ".* = 21" "print g_vD.vB::vb" + + gdb_test "print g_vD.vB::vx" ".* = 22" "print g_vD.vB::vx" + + gdb_test "print g_vD.vC::vc" ".* = 23" "print g_vD.vC::vc" + + gdb_test "print g_vD.vC::vx" ".* = 24" "print g_vD.vC::vx" + + gdb_test "print g_vD.vD::vd" ".* = 25" "print g_vD.vD::vd" + + gdb_test "print g_vD.vD::vx" ".* = 26" "print g_vD.vD::vx" + + # Print all members of g_vE. + + gdb_test "print g_vE.vA::va" ".* = 0" "print g_vE.vA::va" + + gdb_test "print g_vE.vA::vx" ".* = 0" "print g_vE.vA::vx" + + gdb_test "print g_vE.vB::vb" ".* = 0" "print g_vE.vB::vb" + + gdb_test "print g_vE.vB::vx" ".* = 0" "print g_vE.vB::vx" + + gdb_test "print g_vE.vC::vc" ".* = 0" "print g_vE.vC::vc" + + gdb_test "print g_vE.vC::vx" ".* = 0" "print g_vE.vC::vx" + + gdb_test "print g_vE.vD::vd" ".* = 0" "print g_vE.vD::vd" + + gdb_test "print g_vE.vD::vx" ".* = 0" "print g_vE.vD::vx" + + gdb_test "print g_vE.vE::ve" ".* = 27" "print g_vE.vE::ve" + + gdb_test "print g_vE.vE::vx" ".* = 28" "print g_vE.vE::vx" +} + +# +# Multiple virtual inheritance, print type definitions. +# + +proc test_ptype_mvi {} { + global gdb_prompt + global ws + global nl + global vbptr + + send_gdb "ptype vD\n" + gdb_expect { + -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" { + pass "ptype vD" + } + -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;.*\}.*$gdb_prompt $" { + pass "ptype vD" + } + -re ".*$gdb_prompt $" { fail "ptype vD" } + timeout { fail "(timeout) ptype vD" } + } + + send_gdb "ptype class vD\n" + gdb_expect { + -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" { + pass "ptype class vD" + } + -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;.*\}.*$gdb_prompt $" { + pass "ptype class vD" + } + -re ".*$gdb_prompt $" { fail "ptype class vD" } + timeout { fail "(timeout) ptype class vD" } + } + + send_gdb "ptype g_vD\n" + gdb_expect { + -re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" { + pass "ptype g_vD" + } + -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { + pass "ptype g_vD" + } + -re ".*$gdb_prompt $" { fail "ptype g_vD" } + timeout { fail "(timeout) ptype g_vD" } + } + + send_gdb "ptype vE\n" + gdb_expect { + -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" { + pass "ptype vE" + } + -re ".*class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { + pass "ptype vE" + } + -re ".*$gdb_prompt $" { fail "ptype vE" } + timeout { fail "(timeout) ptype vE" } + } + + send_gdb "ptype class vE\n" + gdb_expect { + -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" { + pass "ptype class vE" + } + -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { + pass "ptype class vE" + } + -re ".*$gdb_prompt $" { fail "ptype class vE" } + timeout { fail "(timeout) ptype class vE" } + } + + send_gdb "ptype g_vE\n" + gdb_expect { + -re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" { + pass "ptype g_vE" + } + -re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" { + pass "ptype g_vE" + } + -re ".*$gdb_prompt $" { fail "ptype g_vE" } + timeout { fail "(timeout) ptype g_vE" } + } +} + +# +# Multiple virtual inheritance, print complete classes. +# + +proc test_print_mvi_classes {} { + global gdb_prompt + global hex + global decimal + global nl + global vbptr + + # Print all members of g_vD. + + send_gdb "print g_vD\n" + gdb_expect { + -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, vb = 21, vx = 22, Virtual table at $hex\}, \ = \{vc = 23, vx = 24, Virtual table at $hex\}, vd = 25, vx = 26, Virtual table at $hex\}$nl$gdb_prompt $" { + pass "print g_vD (aCC)" + } + -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, vb = 21, vx = 22, __vfp = $hex\}, \ = \{vc = 23, vx = 24, __vfp = $hex\}, vd = 25, vx = 26, __vfp = $hex\}$nl$gdb_prompt $" { + pass "print g_vD (aCC)" + } + -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, ${vbptr}vA = $hex, vb = 21, vx = 22\}, \ = \{${vbptr}vA = $hex, vc = 23, vx = 24\}, ${vbptr}vC = $hex, ${vbptr}vB = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" { + pass "print g_vD" + } + -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, _vptr.vB = $hex, vb = 21, vx = 22\}, \ = \{_vptr.vC = $hex, vc = 23, vx = 24\}, _vptr.vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" { + pass "print g_vD (FIXME v3 vtbl ptr)" + } + -re ".* = \{\ = \{\ = \{va = 19, vx = 20\}, _vptr.vB = $hex, vb = 21, vx = 22\}, \ = \{_vptr.vC = $hex , vc = 23, vx = 24\}, _vptr.vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" { + # Happens with gcc 3.3 -gstabs+ + # Does not happen with gcc 3.2.3 -gstabs+. + # Does not happen gcc HEAD%20030624 (pre-3.4) -gstabs+. + # -- chastain 2003-06-29 + pass "print g_vD" + } + -re ".*invalid address 0x0.*$gdb_prompt $" { + # Does not happen with gcc cygnus-2.4.5-930828 + fail "print g_vD (known bug with gcc cygnus-2.4.5-930417)" + # Many of the rest of these tests have the same problem. + return 0 + } + -re ".*$gdb_prompt $" { fail "print g_vD" } + timeout { fail "print g_vD (timeout)" ; return } + } + + # Print all members of g_vE. + + send_gdb "print g_vE\n" + gdb_expect { + -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, vb = 0, vx = 0, Virtual table at $hex\}, \ = \{vc = 0, vx = 0, Virtual table at $hex\}, vd = 0, vx = 0, Virtual table at $hex\}, ve = 27, vx = 28, Virtual table at $hex\}$nl$gdb_prompt $" { + pass "print g_vE (aCC)" + } + -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, vb = 0, vx = 0, __vfp = $hex\}, \ = \{vc = 0, vx = 0, __vfp = $hex\}, vd = 0, vx = 0, __vfp = $hex\}, ve = 27, vx = 28, __vfp = $hex\}$nl$gdb_prompt $" { + pass "print g_vE (aCC)" + } + -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, ${vbptr}vA = $hex, vb = 0, vx = 0\}, \ = \{${vbptr}vA = $hex, vc = 0, vx = 0\}, ${vbptr}vC = $hex, ${vbptr}vB = $hex, vd = 0, vx = 0\}, ${vbptr}vD = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" { + pass "print g_vE" + } + -re ".* = \{\ = \{\ = \{\ = \{va = 0, vx = 0\}, _vptr.vB = $hex *(\)?, vb = 0, vx = 0\}, \ = \{_vptr.vC = $hex *(\)?, vc = 0, vx = 0\}, _vptr.vD = $hex, vd = 0, vx = 0\}, _vptr.vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" { + pass "print g_vE (FIXME v3 vtbl ptr)" + } + -re ".*$gdb_prompt $" { fail "print g_vE" } + timeout { fail "print g_vE (timeout)" } + } +} + +proc do_tests {} { + global prms_id + global bug_id + global subdir + global objdir + global srcdir + global binfile + + set prms_id 0 + set bug_id 0 + + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + + gdb_test "set language c++" "" + gdb_test "set width 0" "" + + # Get the debug format for the compiled test case. + + if { ![ runto_main] } { + gdb_suppress_tests; + } + + test_ptype_si + test_ptype_mi + test_ptype_vi + test_ptype_mvi + + gdb_stop_suppressing_tests; + + if { ![ runto 'inheritance2' ] } { + gdb_suppress_tests; + } + + test_print_si_members + test_print_si_classes + test_print_mi_members + test_print_mi_classes + test_print_anon_union + + gdb_stop_suppressing_tests; + + if { ![ runto 'inheritance4' ] } { + gdb_suppress_tests; + } + + test_print_svi_members + test_print_svi_classes + test_print_mvi_members + test_print_mvi_classes +} + +do_tests diff --git a/gdb/testsuite/gdb.cp/local.cc b/gdb/testsuite/gdb.cp/local.cc new file mode 100644 index 0000000..85fd6e1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/local.cc @@ -0,0 +1,66 @@ +// Tests for local types + +void marker1 (void) +{ +} + +void marker2 (void) +{ +} + +int foobar (int x) +{ + class Local { + public: + int loc1; + char loc_foo (char c) + { + return c + 3; + } + }; + + Local l; + static Local l1; + char c; + + marker1 (); + + l.loc1 = 23; + + c = l.loc_foo('x'); + return c + 2; +} + +int main() +{ + int c; + + c = foobar (31); + + { // inner block + class InnerLocal { + public: + char ilc; + int * ip; + int il_foo (unsigned const char & uccr) + { + return uccr + 333; + } + class NestedInnerLocal { + public: + int nil; + int nil_foo (int i) + { + return i * 27; + } + }; + NestedInnerLocal nest1; + }; + + InnerLocal il; + + il.ilc = 'b'; + il.ip = &c; + marker2(); + } +} diff --git a/gdb/testsuite/gdb.cp/local.exp b/gdb/testsuite/gdb.cp/local.exp new file mode 100644 index 0000000..21ceb7a --- /dev/null +++ b/gdb/testsuite/gdb.cp/local.exp @@ -0,0 +1,228 @@ +# Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# tests for local variables +# Written by Satish Pai 1997-07-08 +# Cleaned by Michael Chastain 2002-04-08 + + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "local" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info $binfile "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +if ![runto 'marker1'] then { + perror "couldn't run to marker1" + continue +} + +gdb_test "up" ".*foobar.*" "up from marker1" + +# Local classes in g++ get names like "main.1::InnerLocal", just like local +# static variables. Some targets use "___" instead of ".". + +# --- +# Pattern 1: +# PASS +# dwarf-2 +# gcc 2.95.3 +# +# Pattern 2: +# FAIL +# This has a duplicate "char loc_foo" line. This is a bug. +# Historically this has been an XFAIL. +# dwarf-2 +# gcc 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD +# +# Pattern 3: +# PASS +# stabs+ +# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD +# +# Pattern 4: +# This an old pattern from the hppa aCC version of this file. +# I left it alone. +# +# chastain 2002-04-08 + +set sep "(\[.\]|___)\[0-9\]" + +send_gdb "ptype Local\n" +gdb_expect { + -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" } + -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { + kfail "gdb/483" "ptype Local" + } + -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*Local & operator *=\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((void|)\\);\[\r\n\t \]*char loc_foo\\(char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" } + -re "type = class Local \{\r\n\[\t \]*public:\r\n\[\t \]*int loc1;\r\n\r\n\[\t \]*char loc_foo\\(char\\);\r\n\[\t \]*\\(Local at.*local\\.cc:\[0-9\]*\\)\r\n\}.*$gdb_prompt $" { xpass "ptype Local (old aCC)" } + -re ".*$gdb_prompt $" { fail "ptype Local" } + timeout { fail "(timeout) ptype Local" } +} + +gdb_test "break marker2" +gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker2.*" \ + "continuing to marker2" + +gdb_test "up" ".*main.*" "up from marker2" + +# Make sure that `Local' isn't in scope here; it's local to foobar. +# setup_kfail "gdb/825" +send_gdb "ptype Local\n" +set eol "\[\t \]*\[\r\n\]+\[\t \]*" +gdb_expect { + -re "No symbol \"Local\" in current context.*${gdb_prompt} $" { + pass "Local out of scope" + } + -re "ptype Local${eol}type = class Local {${eol} public:${eol} int loc1;${eol}.*${eol} char loc_foo\\(char\\);${eol}}${eol}${gdb_prompt} " { + # GCC emits STABS debugging information in a way that doesn't + # properly preserve the scoping of local classes. I think + # we'd need to start using Sun's extensions to stabs to get + # this right. + kfail gdb/825 "Local out of scope" + } + -re ".*${gdb_prompt} $" { + fail "Local out of scope" + } + timeout { + fail "Local out of scope (timeout)" + } +} + + +# DTS CLLbs14316 and CLLbs17058 +# coulter - I added a clause for HP's aCC compiler. We print out the type +# as xx instead of const unsigned char, but we still have an expected failure +# because of two reasons: +# There is a number at the end of InnerLocal4 which should not be there, +# DTS CLLbs14316 +# The line number for the class +# setup_xfail "hppa*-*-*" CLLbs14316 + +# --- +# Pattern 1: +# PASS +# dwarf-2 +# 2.95.3, 2.96-rh, 3.0.4, 3.1, gcc-3_1-branch, HEAD +# +# Pattern 2: +# PASS +# stabs+ +# 2.95.3, 2.96-rh, 3.0.4, 3.1, gcc-3_1-branch, HEAD +# +# Pattern 3: +# Old hppa pattern. +# +# Pattern 4: +# Old hppa pattern. +# +# chastain 2002-05-27 + +send_gdb "ptype InnerLocal\n" +gdb_expect { + -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]*int il_foo\\((unsigned char const|const unsigned char) *&\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 1)" } + -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]*InnerLocal *& operator *=\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((void|)\\);\[\r\n\t \]*int il_foo\\(unsigned char const *&\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 2)" } + -re "type = class InnerLocal \{\r\n\[\t \]*public:\r\n\[\t \]*char ilc;\r\n\[\t \]*int \\*ip;\r\n\[\t \]*InnerLocal::NestedInnerLocal nest1;\r\n\r\n\[\t \]*.int il_foo\\(unsigned char const &\\);\r\n\[\t \]*\}\[\t \]*\\(Local at.*local\\.cc:36\\).*$gdb_prompt $" { pass "ptype InnerLocal (old HP aCC)" } + -re "type = class InnerLocal \{\r\n\[\t \]*public:\r\n\[\t \]*char ilc;\r\n\[\t \]*int \\*ip;\r\n\[\t \]*class InnerLocal4::NestedInnerLocal nest1;\r\n\r\n\[\t \]*int il_foo\\(unsigned char const &\\);\r\n\[\t \]*\\(Local at.*local\.cc:\[0-9\]+\\)\r\n\}.*$gdb_prompt $" { pass "ptype InnerLocal (old HP aCC)" } + -re ".*$gdb_prompt $" { fail "ptype InnerLocal" } + timeout { fail "(timeout) ptype InnerLocal" } +} + +#--- +# Pattern 1: +# PASS +# dwarf-2 +# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD +# +# Pattern 2: +# PASS +# stabs+ +# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD +# +# chastain 2002-04-08 + +send_gdb "ptype NestedInnerLocal\n" +gdb_expect { + -re "type = class NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype NestedInnerLocal" } + -re "type = class NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*NestedInnerLocal *& *operator *= *\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((void|)\\);\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype NestedInnerLocal" } + -re ".*$gdb_prompt $" { fail "ptype NestedInnerLocal" } + timeout { fail "(timeout) ptype NestedInnerLocal" } +} + +# gdb incorrectly interprets the NestedInnerLocal in +# InnerLocal::NestedInnerLocal as field name instead of a type name; +# See CLLbs14784. + +#--- +# Pattern 3: +# FAIL +# The comment above, about CLLbs14784, is still correct. +# dwarf-2 +# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD +# stabs+ +# gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD +# +# chastain 2002-04-08 + +send_gdb "ptype InnerLocal::NestedInnerLocal\n" +gdb_expect { + -re "type = class InnerLocal::NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal::NestedInnerLocal" } + -re "type = class InnerLocal::NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*NestedInnerLocal *& *operator *= *\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((void|)\\);\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal::NestedInnerLocal" } + -re "There is no field named NestedInnerLocal.*$gdb_prompt $" { + setup_kfail "gdb/482" *-*-* + fail "ptype InnerLocal::NestedInnerLocal" + } + -re "No symbol .*NestedInnerLocal.* in current context.*$gdb_prompt $" { fail "ptype InnerLocal::NestedInnerLocal (bogus symbol lookup)" } + -re ".*$gdb_prompt $" { fail "ptype InnerLocal::NestedInnerLocal" } + timeout { fail "(timeout) ptype InnerLocal::NestedInnerLocal" } +} diff --git a/gdb/testsuite/gdb.cp/m-data.cc b/gdb/testsuite/gdb.cp/m-data.cc new file mode 100644 index 0000000..c97e719 --- /dev/null +++ b/gdb/testsuite/gdb.cp/m-data.cc @@ -0,0 +1,64 @@ +// 2002-05-13 + +enum region { oriental, egyptian, greek, etruscan, roman }; + +// Test one. +class gnu_obj_1 +{ +protected: + typedef region antiquities; + const bool test; + const int key1; + long key2; + + antiquities value; + +public: + gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {} +}; + +// Test two. +template +class gnu_obj_2: public virtual gnu_obj_1 +{ +protected: + antiquities value_derived; + +public: + gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { } +}; + +// Test three. +template +class gnu_obj_3 +{ +protected: + typedef region antiquities; + gnu_obj_2 data; + +public: + gnu_obj_3(antiquities b): data(etruscan) { } +}; + +int shadow = 0; + +class C +{ +public: + C (int x) : shadow (x) {} + void marker () {} +private: + int shadow; +}; + +int main() +{ + gnu_obj_1 test1(egyptian, 4589); + gnu_obj_2 test2(roman); + gnu_obj_3 test3(greek); + + C theC (1); // breakpoint: first-constructs-done + theC.marker (); + + return 0; +} diff --git a/gdb/testsuite/gdb.cp/m-data.exp b/gdb/testsuite/gdb.cp/m-data.exp new file mode 100644 index 0000000..85adb5e --- /dev/null +++ b/gdb/testsuite/gdb.cp/m-data.exp @@ -0,0 +1,119 @@ +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for member data +# 2002-05-13 Benjamin Kosnik + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "m-data" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# First, run to after we've constructed all the gnu_obj_N's: + +gdb_breakpoint [gdb_get_line_number "first-constructs-done"] +gdb_continue_to_breakpoint "end of first constructors" + +# One. + +# simple object, const bool +gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, const bool" + +# simple object, const int +gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, const int" + +# simple object, long +gdb_test "print test1.key2" "\\$\[0-9\]* = 4589" "simple object, long" + +# simple object, enum +gdb_test "print test1.value" "\\$\[0-9\]* = egyptian" "simple object, enum" + +# Two. + +# derived template object, base const bool +gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base const bool" + +# derived template object, base const int +gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base const int" + +# derived template object, base long +gdb_test "print test2.key2" "\\$\[0-9\]* = 7" "derived template object, base long" + +# derived template object, base enum +gdb_test "print test2.value" "\\$\[0-9\]* = oriental" "derived template object, base enum" + +# derived template object, enum +gdb_test "print test2.value_derived" "\\$\[0-9\]* = roman" "derived template object, derived enum" + +# Three. + +# template object, derived template data member's base const bool +gdb_test "print test3.data.test" "\\$\[0-9\]* = true" "template object, const bool" + +# template object, derived template data member's base const int +gdb_test "print test3.data.key1" "\\$\[0-9\]* = 5" "template object, const int" + +# template object, derived template data member's base long +gdb_test "print test3.data.key2" "\\$\[0-9\]* = 7" "template object, long" + +# template object, derived template data member's base enum +gdb_test "print test3.data.value" "\\$\[0-9\]* = oriental" "template object, base enum" + +# template object, derived template data member's enum +gdb_test "print test3.data.value_derived" "\\$\[0-9]\* = etruscan" "template object, derived enum" + +# Now some tests for shadowing (see PR gdb/804): + +gdb_breakpoint "C::marker" +gdb_continue_to_breakpoint "continue to shadow breakpoint" + +gdb_test "print shadow" "\\$\[0-9]\* = 1" "shadowing member" +gdb_test "print ::shadow" "\\$\[0-9]\* = 0" "shadowed global variable" + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/m-static.cc b/gdb/testsuite/gdb.cp/m-static.cc new file mode 100644 index 0000000..6d08cb0 --- /dev/null +++ b/gdb/testsuite/gdb.cp/m-static.cc @@ -0,0 +1,72 @@ +// 2002-05-13 + +enum region { oriental, egyptian, greek, etruscan, roman }; + +// Test one. +class gnu_obj_1 +{ +protected: + typedef region antiquities; + static const bool test = true; + static const int key1 = 5; + static long key2; + + static antiquities value; + +public: + gnu_obj_1(antiquities a, long l) {} +}; + +const bool gnu_obj_1::test; +const int gnu_obj_1::key1; +long gnu_obj_1::key2 = 77; +gnu_obj_1::antiquities gnu_obj_1::value = oriental; + + +// Test two. +template +class gnu_obj_2: public virtual gnu_obj_1 +{ +public: + static antiquities value_derived; + +public: + gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7) { } +}; + +template +typename gnu_obj_2::antiquities gnu_obj_2::value_derived = etruscan; + +// Test three. +template +class gnu_obj_3 +{ +public: + typedef region antiquities; + static gnu_obj_2 data; + +public: + gnu_obj_3(antiquities b) { } +}; + +template +gnu_obj_2 gnu_obj_3::data(etruscan); + +// 2002-08-16 +// Test four. +#include "m-static.h" + +// instantiate templates explicitly so their static members will exist +template class gnu_obj_2; +template class gnu_obj_2; +template class gnu_obj_3; + +int main() +{ + gnu_obj_1 test1(egyptian, 4589); + gnu_obj_2 test2(roman); + gnu_obj_3 test3(greek); + gnu_obj_4 test4; + + return 0; // breakpoint: constructs-done +} diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp new file mode 100644 index 0000000..d291135 --- /dev/null +++ b/gdb/testsuite/gdb.cp/m-static.exp @@ -0,0 +1,128 @@ +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for member static data +# 2002-05-13 Benjamin Kosnik +# 2002-08-22 David Carlton + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "m-static" +set srcfile ${testfile}.cc +set srcfile1 ${testfile}1.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# First, run to after we've constructed all the objects: + +gdb_breakpoint [gdb_get_line_number "constructs-done"] +gdb_continue_to_breakpoint "end of constructors" + + +# One. + +# simple object, static const bool +gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, static const bool" + +# simple object, static const int +gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, static const int" + +# simple object, static long +gdb_test "print test1.key2" "\\$\[0-9\]* = 77" "simple object, static long" + +# simple object, static enum +gdb_test "print test1.value" "\\$\[0-9\]* = oriental" "simple object, static enum" + +# Two. + +# derived template object, base static const bool +gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base static const bool" + +# derived template object, base static const int +gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base static const int" + +# derived template object, base static long +gdb_test "print test2.key2" "\\$\[0-9\]* = 77" "derived template object, base static long" + +# derived template object, base static enum +gdb_test "print test2.value" "\\$\[0-9\].* = oriental" "derived template object, base static enum" + +# derived template object, static enum +gdb_test "print test2.value_derived" "\\$\[0-9\].* = etruscan" "derived template object, static enum" + +# Three. + +# template object, static derived template data member's base static const bool +gdb_test "print test3.data.test" "\\$\[0-9\].* = true" "template object, static const bool" + +# template object, static derived template data member's base static const int +gdb_test "print test3.data.key1" "\\$\[0-9\].* = 5" "template object, static const int" + +# template object, static derived template data member's base static long +gdb_test "print test3.data.key2" "\\$\[0-9\].* = 77" "template object, static long" + +# template object, static derived template data member's base static enum +gdb_test "print test3.data.value" "\\$\[0-9\].* = oriental" "template object, static enum" + +# template object, static derived template data member's static enum +gdb_test "print test3.data.value_derived" "\\$\[0-9\].* = etruscan" "template object, static derived enum" + +# 2002-08-16 +# Four. + +# static const int initialized in another file. +gdb_test "print test4.elsewhere" "\\$\[0-9\].* = 221" "static const int initialized elsewhere" + +# static const int that nobody initializes. From PR gdb/635. +gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimised out" "static const int initialized nowhere" + +# Perhaps at some point test4 should also include a test for a static +# const int that was initialized in the header file. But I'm not sure +# that GDB's current behavior in such situations is either consistent +# across platforms or optimal, so I'm not including one now. + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/m-static.h b/gdb/testsuite/gdb.cp/m-static.h new file mode 100644 index 0000000..137d3b7 --- /dev/null +++ b/gdb/testsuite/gdb.cp/m-static.h @@ -0,0 +1,11 @@ +// 2002-08-16 + +class gnu_obj_4 +{ + public: + static const int elsewhere; + static const int nowhere; + // At some point, perhaps: + // static const int everywhere = 317; +}; + diff --git a/gdb/testsuite/gdb.cp/m-static1.cc b/gdb/testsuite/gdb.cp/m-static1.cc new file mode 100644 index 0000000..302a5ad --- /dev/null +++ b/gdb/testsuite/gdb.cp/m-static1.cc @@ -0,0 +1,5 @@ +// 2002-08-16 + +#include "m-static.h" + +const int gnu_obj_4::elsewhere = 221; diff --git a/gdb/testsuite/gdb.cp/maint.exp b/gdb/testsuite/gdb.cp/maint.exp new file mode 100644 index 0000000..1042c91 --- /dev/null +++ b/gdb/testsuite/gdb.cp/maint.exp @@ -0,0 +1,113 @@ +# Copyright 2003 Free Software Foundation Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + + +# This file tests C++-specific maintenance commands and help on those. + +# Currently, no source file is used. + +if $tracelevel then { + strace $tracelevel + } + +# Test the help messages. + +proc test_help {} { + gdb_test "help maintenance cplus" "C\\+\\+ maintenance commands.\r\n\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous." + + gdb_test "help maint cp" "C\\+\\+ maintenance commands.\r\n\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous." + + gdb_test "maint cp" "\"maintenance cplus\" must be followed by the name of a command.\r\nList of maintenance cplus subcommands:\r\n\r\nmaintenance cplus first_component -- Print the first class/namespace component of NAME\r\n\r\nType \"help maintenance cplus\" followed by maintenance cplus subcommand name for full documentation.\r\nCommand name abbreviations are allowed if unambiguous." + + gdb_test "help maint cp first_component" "Print the first class/namespace component of NAME." +} + +# This is used when NAME should contain only a single component. Be +# careful to make sure that parentheses get escaped properly. +proc test_single_component {name} { + set matchname [string_to_regexp "$name"] + gdb_test "maint cp first_component $name" "$matchname" +} + +# This is used when NAME is invalid. +proc test_invalid_name {name} { + set matchname [string_to_regexp "$name"] + gdb_test "maint cp first_component $name" \ + "During symbol reading, unexpected demangled name '$matchname'.\r\n$matchname" +} + +proc test_first_component {} { + # The function in question might complain; make sure that we see + # all complaints. + + gdb_test "set complaints -1" "" + + test_single_component "foo" + test_single_component "operator<<" + test_single_component "operator>>" + test_single_component "operator ->" + test_single_component "operator()" + test_single_component "operator>" + test_single_component "operator<" + test_single_component "operator ->" + test_single_component "operator ->" + + test_single_component "foo()" + test_single_component "foo(int)" + test_single_component "foo(X::Y)" + test_single_component "foo(X::Y, A::B)" + test_single_component "foo(std::basic_streambuf >)" + test_single_component "operator>(X::Y)" + + # Operator names can show up in weird places. + + test_single_component "int operator<< ()" + test_single_component "T" + + # NOTE: carlton/2003-04-23: I've only seen the first of these + # produced by the demangler, but I'm including two more just to be + # on the safe side. + test_single_component "int foo<&(operator<<(C, C))>()" + test_single_component "int foo<&operator<<(C, C)>()" + test_single_component "int foo()" + + gdb_test "maint cp first_component foo::bar" "foo" + gdb_test "maint cp first_component foo::bar::baz" "foo" + gdb_test "maint cp first_component C::bar" "C" + gdb_test "maint cp first_component C > >::bar" "C > >" + + # Make sure we behave appropriately on invalid input. + + # NOTE: carlton/2003-06-25: As of today, the demangler can in fact + # produce examples like the third case below: there really should + # be a space between the two <'s. See PR gdb/1245. + + test_invalid_name "foo<" + test_invalid_name "foo(" + test_invalid_name "bool operator<" +} + +gdb_exit +gdb_start + +test_help +test_first_component + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/member-ptr.cc b/gdb/testsuite/gdb.cp/member-ptr.cc new file mode 100644 index 0000000..4beb926 --- /dev/null +++ b/gdb/testsuite/gdb.cp/member-ptr.cc @@ -0,0 +1,106 @@ +extern "C" { +#include +} + + +class A { +public: + A(); + int foo (int x); + int bar (int y); + virtual int baz (int z); + char c; + int j; + int jj; + static int s; +}; + +class B { +public: + static int s; +}; + +int A::s = 10; +int B::s = 20; + +A::A() +{ + c = 'x'; + j = 5; +} + +int A::foo (int dummy) +{ + j += 3; + return j + dummy; +} + +int A::bar (int dummy) +{ + int r; + j += 13; + r = this->foo(15); + return r + j + 2 * dummy; +} + +int A::baz (int dummy) +{ + int r; + j += 15; + r = this->foo(15); + return r + j + 12 * dummy; +} + +int fum (int dummy) +{ + return 2 + 13 * dummy; +} + +typedef int (A::*PMF)(int); + +typedef int A::*PMI; + +int main () +{ + A a; + A * a_p; + PMF pmf; + + PMF * pmf_p; + PMI pmi; + + a.j = 121; + a.jj = 1331; + + int k; + + a_p = &a; + + pmi = &A::j; + pmf = &A::bar; + pmf_p = &pmf; + + pmi = NULL; + + k = (a.*pmf)(3); + + pmi = &A::jj; + pmf = &A::foo; + pmf_p = &pmf; + + k = (a.*pmf)(4); + + k = (a.**pmf_p)(5); + + k = a.*pmi; + + + k = a.bar(2); + + k += fum (4); + + B b; + + k += b.s; + +} diff --git a/gdb/testsuite/gdb.cp/member-ptr.exp b/gdb/testsuite/gdb.cp/member-ptr.exp new file mode 100644 index 0000000..f21cd15 --- /dev/null +++ b/gdb/testsuite/gdb.cp/member-ptr.exp @@ -0,0 +1,549 @@ +# Copyright 1998, 1999 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu +# Tests for pointer-to-member support +# Written by Satish Pai 1997-08-19 + +# This file is part of the gdb testsuite + + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# + +# Start with a fresh gdb +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +set prms_id 0 +set bug_id 0 + +set testfile "member-ptr" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +# Nearly all of these tests fail when compiled with G++, so just give up +# until GDB gets enhanced. -sts 1999-06-22 + +if {$gcc_compiled} { + continue +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break 83\n" +gdb_expect { + -re "Breakpoint \[0-9\]*.*line 83\\.\r\n$gdb_prompt $" { + pass "set break at 83" + } + -re ".*$gdb_prompt $" { fail "set break at 83" } + timeout { fail "(timeout) set break at 83" } +} + +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\n\r\nBreakpoint.*at.*member-ptr\\.cc:83\r\n83\[ \t]*pmi = NULL;\r\n$gdb_prompt $" { + pass "continue to 83" + } + -re ".*$gdb_prompt $" { fail "continue to 83" } + timeout { fail "(timeout) continue to 83" } +} + +# ptype on pointer to data member + +send_gdb "ptype pmi\n" +gdb_expect { + -re "type = int \\( A::\\*\\)\r\n$gdb_prompt $" { + pass "ptype pmi" + } + -re ".*$gdb_prompt $" { fail "ptype pmi" } + timeout { fail "(timeout) ptype pmi" } +} + +# print pointer to data member + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\) &A::j\r\n$gdb_prompt $" { + pass "print pmi" + } + -re ".*$gdb_prompt $" { fail "print pmi" } + timeout { fail "(timeout) print pmi" } +} + + +# print dereferenced pointer to data member + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a.*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 121\r\n$gdb_prompt $" { + pass "print a.*pmi" + } + -re ".*$gdb_prompt $" { fail "print a.*pmi" } + timeout { fail "(timeout) print a.*pmi" } +} + +# print dereferenced pointer to data member +# this time, dereferenced through a pointer + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a_p->*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 121\r\n$gdb_prompt $" { + pass "print a->*pmi" + } + -re ".*$gdb_prompt $" { fail "print a->*pmi" } + timeout { fail "(timeout) print a->*pmi" } +} + + +# set the pointer to data member + +send_gdb "set var pmi = &A::jj\n" +gdb_expect { + -re "$gdb_prompt $" { + pass "set var (not really a pass)" + } + timeout { fail "(timeout) " } +} + +# Now print the pointer again + +send_gdb "print pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\) &A::jj\r\n$gdb_prompt $" { + pass "print pmi after setting" + } + -re ".*$gdb_prompt $" { fail "print pmi after setting" } + timeout { fail "(timeout) print pmi after setting" } +} + +# print dereferenced pointer to data member again + +send_gdb "print a.*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 1331\r\n$gdb_prompt $" { + pass "print a.*pmi after setting" + } + -re ".*$gdb_prompt $" { fail "print a.*pmi after setting" } + timeout { fail "(timeout) print a.*pmi after setting" } +} + +# set the pointer to data member back to A::j + +send_gdb "set var pmi = &A::j\n" +gdb_expect { + -re "$gdb_prompt $" { + pass "set var back to A::j (not really a pass)" + } + timeout { fail "(timeout) set var pmi" } +} + +# print dereferenced pointer to data member yet again (extra check, why not) + +send_gdb "print a.*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 121\r\n$gdb_prompt $" { + pass "print a.*pmi after resetting" + } + -re ".*$gdb_prompt $" { fail "print a.*pmi after resetting" } + timeout { fail "(timeout) print a.*pmi after resetting" } +} + +# Set the data member pointed to. + +send_gdb "print a.*pmi = 33\n" +gdb_expect { + -re "\\$\[0-9\]* = 33\r\n$gdb_prompt $" { + pass "print command to set" + } + -re ".*$gdb_prompt $" { fail "print command to set" } + timeout { fail "(timeout) print command to set" } +} + +# Now check that the data really was changed +send_gdb "print a.*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 33\r\n$gdb_prompt $" { + pass "print a.*pmi after setting member pointed to" + } + -re ".*$gdb_prompt $" { fail "print a.*pmi after setting member pointed to" } + timeout { fail "(timeout) print a.*pmi after setting member pointed to" } +} + +# Double-check by printing a. +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a\n" +gdb_expect { + -re "\\$\[0-9\]* = \{c = 120 'x', j = 33, jj = 1331, static s = 10, Virtual table at $hex\}\r\n$gdb_prompt $" { + pass "print a after setting member pointed to by pmi" + } + -re ".*$gdb_prompt $" { fail "print a after setting member pointed to by pmi" } + timeout { fail "(timeout) print a after setting member pointed to by pmi" } +} + + +# Set the data member pointed to, using ->* + +send_gdb "print a_p->*pmi = 44\n" +gdb_expect { + -re "\\$\[0-9\]* = 44\r\n$gdb_prompt $" { + pass "print command to set (->)" + } + -re ".*$gdb_prompt $" { fail "print command to set (->)" } + timeout { fail "(timeout) print command to set (->)" } +} + +# Now check that the data really was changed +send_gdb "print a_p->*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 44\r\n$gdb_prompt $" { + pass "print a_p->*pmi after setting member pointed to" + } + -re ".*$gdb_prompt $" { fail "print a_p->*pmi after setting member pointed to" } + timeout { fail "(timeout) print a_p->*pmi after setting member pointed to" } +} + +# Double-check by printing a. +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a\n" +gdb_expect { + -re "\\$\[0-9\]* = \{c = 120 'x', j = 44, jj = 1331, static s = 10, Virtual table at $hex\}\r\n$gdb_prompt $" { + pass "print a after setting member pointed to by pmi (->) " + } + -re ".*$gdb_prompt $" { fail "print a after setting member pointed to by pmi (->) " } + timeout { fail "(timeout) print a after setting member pointed to by pmi (->) " } +} + + +# Do a ptype on the dereferenced pointer to member +# pai/1997-08-20 Doesn't work + +# send_gdb "ptype a.*pmi\n" +# gdb_expect { +# -re "type = int\r\n$gdb_prompt $" { +# pass "ptype a.*pmi" +# } +# -re ".*$gdb_prompt $" { fail "ptype a.*pmi" } +# timeout { fail "(timeout) ptype a.*pmi" } +#} + +# Try to dereference the pointer to data member without any object + +send_gdb "print *pmi\n" +gdb_expect { + -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { + pass "attempt to print ptr to member without object" + } + -re ".*$gdb_prompt $" { fail "attempt to print ptr to member without object" } + timeout { fail "(timeout) attempt to print ptr to member without object" } +} + +# Try to ptype a dereference of the pointer to data member without any object + +send_gdb "ptype *pmi\n" +gdb_expect { + -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { + pass "attempt to ptype ptr to member without object" + } + -re ".*$gdb_prompt $" { fail "attempt to ptype ptr to member without object" } + timeout { fail "(timeout) attempt to ptype ptr to member without object" } +} + +# Ptype a pointer to a method. + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "ptype pmf\n" +gdb_expect { + -re "type = int \\( A::\\*\\)\\(\\.\\.\\.\\)\r\n$gdb_prompt $" { + pass "ptype pmf" + } + -re ".*$gdb_prompt $" { fail "ptype pmf" } + timeout { fail "(timeout) ptype pmf" } +} + +# print a pointer to a method + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print pmf\n" +gdb_expect { + -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\(\\.\\.\\.\\)\\) \\?\\? \r\n$gdb_prompt $" { + pass "print pmf" + } + -re ".*$gdb_prompt $" { fail "print pmf" } + timeout { fail "(timeout) print pmf" } +} + + +# Ptype a pointer to a pointer to a method + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "ptype pmf_p\n" +gdb_expect { + -re "type = int \\( A::\\*\\*\\)\\(\\.\\.\\.\\)\r\n$gdb_prompt $" { + pass "ptype pmf_p" + } + -re ".*$gdb_prompt $" { fail "ptype pmf_p" } + timeout { fail "(timeout) ptype pmf_p" } +} + +# print a pointer to a pointer to a method + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print pmf_p\n" +gdb_expect { + -re "\\$\[0-9\]* = \\(int \\( A::\\*\\*\\)\\(\\.\\.\\.\\)\\) $hex\r\n$gdb_prompt $" { + pass "print pmf_p" + } + -re ".*$gdb_prompt $" { fail "print pmf_p" } + timeout { fail "(timeout) print pmf_p" } +} + +# print dereferenced pointer to method + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a.*pmf\n" +gdb_expect { + -re "Pointers to methods not supported with HP aCC\r\n$gdb_prompt $" { + pass "print a.*pmf (known aCC limitation)" + } + -re ".*$gdb_prompt $" { fail "print a.*pmf" } + timeout { fail "(timeout) print a.*pmf" } +} + +# print dereferenced pointer to method, using ->* + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a_p->*pmf\n" +gdb_expect { + -re "Pointers to methods not supported with HP aCC\r\n$gdb_prompt $" { + pass "print a_p->*pmf (known aCC limitation)" + } + -re ".*$gdb_prompt $" { fail "print a_p->*pmf" } + timeout { fail "(timeout) print a_p->*pmf" } +} + +# set the pointer to data member + +setup_xfail "hppa*-*-*" +send_gdb "set var pmf = &A::foo\n" +gdb_expect { + -re "Assignment to pointers to methods not implemented with HP aCC\r\n$gdb_prompt $" { + pass "set var pmf (known aCC limitation)" + } + -re ".*$gdb_prompt $" { fail "set var pmf" } + timeout { fail "(timeout) set var pmf" } +} + +# Try to dereference the pointer to method without any object + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print *pmf\n" +gdb_expect { + -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { + pass "attempt to print ptr to method without object" + } + -re ".*$gdb_prompt $" { fail "attempt to print ptr to method without object" } + timeout { fail "(timeout) attempt to print ptr to method without object" } +} + +# Try to ptype a dereference of the pointer to method without any object + +send_gdb "ptype *pmi\n" +gdb_expect { + -re "Attempt to dereference pointer to member without an object\r\n$gdb_prompt $" { + pass "attempt to ptype ptr to member without object" + } + -re ".*$gdb_prompt $" { fail "attempt to ptype ptr to member without object" } + timeout { fail "(timeout) attempt to ptype ptr to member without object" } +} + +# Check cast of pointer to member to integer +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print (int) pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 8\r\n$gdb_prompt $" { + pass "casting pmi to int" + } + -re ".*$gdb_prompt $" { fail "casting pmi to int" } + timeout { fail "(timeout) casting pmi to int" } +} + +# Check cast of pointer to method to integer +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print (int) pmf\n" +gdb_expect { + -re "Pointers to methods not supported with HP aCC\r\n$gdb_prompt $" { + pass "casting pmf to int (known aCC limitation)" + } + -re ".*$gdb_prompt $" { fail "casting pmf to int" } + timeout { fail "(timeout) casting pmf to int" } +} + +# Try to invoke a function through a pointer to data member +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print (a.*pmi)(3)\n" +gdb_expect { + -re "Not implemented: function invocation through pointer to method with HP aCC\r\n$gdb_prompt $" { + pass "print (a.*pmi)(3) -- error message should be different" + } + -re ".*$gdb_prompt $" { fail "print (a.*pmi)(3)" } + timeout { fail "(timeout) print (a.*pmi)(3)" } +} + +# Try to invoke a function through a pointer to a method +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print (a.*pmf)(3)\n" +gdb_expect { + -re "Not implemented: function invocation through pointer to method with HP aCC\r\n$gdb_prompt $" { + pass "print (a.*pmi)(3) -- known aCC limitation" + } + -re ".*$gdb_prompt $" { fail "print (a.*pmf)(3)" } + timeout { fail "(timeout) print (a.*pmf)(3)" } +} + + +# Go past assignment of NULL to pmi +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "next\n" +gdb_expect { + -re "\r\n85\[ \t\]*k = \\(a.\\*pmf\\)\\(3\\);\r\n$gdb_prompt $" { + pass "next past 83" + } + -re ".*$gdb_prompt $" { fail "next past 83" } + timeout { fail "(timeout) next past 83" } +} + +#send_gdb "print pmi\n" +#gdb_expect { +# -re "Attempted dereference of null pointer-to-member\r\n$gdb_prompt $" { +# pass "" +# } +# -re ".*$gdb_prompt $" { fail "" } +# timeout { fail "(timeout) " } +#} + +# Dereference the null pointer to member +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a.*pmi\n" +gdb_expect { + -re "Attempted dereference of null pointer-to-member\r\n$gdb_prompt $" { + pass "print a.*NULL" + } + -re ".*$gdb_prompt $" { fail "print a.*NULL" } + timeout { fail "(timeout) print a.*NULL" } +} + + +# Go to another part of the program +send_gdb "break 91\n" +gdb_expect { + -re "Breakpoint \[0-9\]*.*line 91\\.\r\n$gdb_prompt $" { + pass "set break at 91" + } + -re ".*$gdb_prompt $" { fail "set break at 91" } + timeout { fail "(timeout) set break at 91" } +} + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "continue\n" +gdb_expect { + -re "Continuing\\.\r\n\r\nBreakpoint.*at.*member-ptr\\.cc:91\r\n91\[ \t]*k = \\(a.\\*pmf\\)\\(4\\);\r\n$gdb_prompt $" { + pass "continue to 91" + } + -re ".*$gdb_prompt $" { fail "continue to 91" } + timeout { fail "(timeout) continue to 91" } +} + + +# Now check again that pmi works even when not set to +# something that's at the beginning of the object + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = \\(int \\( A::\\*\\)\\) &A::jj\r\n$gdb_prompt $" { + pass "print pmi (2)" + } + -re ".*$gdb_prompt $" { fail "print pmi (2)" } + timeout { fail "(timeout) print pmi (2)" } +} + + +# print dereferenced pointer to data member + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a.*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 1331\r\n$gdb_prompt $" { + pass "print a.*pmi (2)" + } + -re ".*$gdb_prompt $" { fail "print a.*pmi (2)" } + timeout { fail "(timeout) print a.*pmi (2)" } +} + +# print dereferenced pointer to data member +# this time, dereferenced through a pointer + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "print a_p->*pmi\n" +gdb_expect { + -re "\\$\[0-9\]* = 1331\r\n$gdb_prompt $" { + pass "print a->*pmi" + } + -re ".*$gdb_prompt $" { fail "print a->*pmi (2)" } + timeout { fail "(timeout) print a->*pmi (2)" } +} + + +# p a.*pmf - fail + +# p pmi + +# p a.*pmi + diff --git a/gdb/testsuite/gdb.cp/method.cc b/gdb/testsuite/gdb.cp/method.cc new file mode 100644 index 0000000..949b027 --- /dev/null +++ b/gdb/testsuite/gdb.cp/method.cc @@ -0,0 +1,80 @@ +// Class funk has a constructor and an ordinary method +// Test for CHFts23426 + +class funk +{ +public: + funk(); + void getFunky(int a, int b); + int data_; +}; + +funk::funk() + : data_(33) +{ +} + +void funk::getFunky(int a, int b) +{ + int res; + res = a + b - data_; + data_ = res; +} + +// Class A has const and volatile methods + +class A { +public: + int x; + int y; + int foo (int arg); + int bar (int arg) const; + int baz (int arg, char c) volatile; + int qux (int arg, float f) const volatile; +}; + +int A::foo (int arg) +{ + x += arg; + return arg *2; +} + +int A::bar (int arg) const +{ + return arg + 2 * x; +} + +int A::baz (int arg, char c) volatile +{ + return arg - 2 * x + c; +} + +int A::qux (int arg, float f) const volatile +{ + if (f > 0) + return 2 * arg - x; + else + return 2 * arg + x; +} + + +int main() +{ + A a; + int k; + + k = 10; + a.x = k * 2; + + k = a.foo(13); + + k += a.bar(15); + + // Test for CHFts23426 follows + funk f; + f.getFunky(1, 2); + return 0; +} + + + diff --git a/gdb/testsuite/gdb.cp/method.exp b/gdb/testsuite/gdb.cp/method.exp new file mode 100644 index 0000000..a085b14 --- /dev/null +++ b/gdb/testsuite/gdb.cp/method.exp @@ -0,0 +1,194 @@ +# Copyright 1998, 1999, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# tests for misc. C++ method stuff +# Written by Satish Pai 1997-07-08 + +# This file is part of the gdb testsuite + +# This tests: +# 0. method arguments are correct +# 1. access to class data members inside method scopes +# 2. correct param types for methods in ptype. +# 3. const and volatile methods + +# (#0 and #1 above relate to an HP specific problem -- GDB must correctly +# integrate FPARAM symbols in HP debug info into the local var list +# for the function or method's block.) + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "method" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info $binfile "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "break A::foo" \ + "Breakpoint \[0-9\]* at $hex.*file .*method.cc, line 38\\." + +gdb_test "continue" \ + "Continuing\\.\r\n\r\nBreakpoint \[0-9\]*, A::foo(\\(int\\)|) \\(this=$hex, arg=13\\) at .*method\\.cc:38\r\n38\[\t \]*x \\+= arg;" \ + "continue to A::foo" + +# Check ability to access this-relative stuff. + +gdb_test "print x" \ + "\\$\[0-9\]* = 20" \ + "print x in A::foo" + +# Check access to this pointer + +gdb_test "print this" \ + "\\$\[0-9\]* = \\((class |)A *\\* *(const|)\\) $hex" \ + "print this in A::foo" + +# Now do everything over again for A::bar, because sometimes processing one method +# (the first one) is fine, but the second one's debug info gets munged beyond recognition. + +gdb_test "break A::bar" \ + "Breakpoint \[0-9\]* at $hex.*file .*method.cc, line 44\\." + +gdb_test "continue" \ + "Continuing\\.\r\n\r\nBreakpoint \[0-9\]*, A::bar(\\(int\\) const|) \\(this=$hex, arg=15\\) at .*method\\.cc:44\r\n44\[\t \]*return arg \\+ 2 \\* x;" \ + "continue to A::bar" + +# Check ability to access this-relative stuff. + +gdb_test "print x" \ + "\\$\[0-9\]* = 33" \ + "print x in A::bar" + +# Check access to this pointer + +get_debug_format + +send_gdb "print this\n" +gdb_expect { + -re "\\$\[0-9\]* = \\(const (class |)A *\\* *(const|)\\) $hex\r\n$gdb_prompt $" { + pass "print this in A::bar" + } + -re "\\$\[0-9\]* = \\((class |)A *\\* *(const|)\\) $hex\r\n$gdb_prompt $" { + # gcc versions up to 3.0.4 with -gstabs+ do not emit "const" indicators, + # so the output is "A *". It should be "const A *" or "const A * const". + setup_xfail_format "stabs" + fail "print this in A::bar (missing const)" + } + -re "\\$\[0-9\]* = \\(const (class |)\{\\.\\.\\.\} *\\* *(const|)\\) $hex\r\n$gdb_prompt $" { + # gcc versions gcc-3_1-branch%20020404 and HEAD%20020404 with -gstabs+ + # produce good stabs, but gdb prints "const class {...} *" const. + # This is PR gdb/277. + # setup_kfail "gdb/277" + fail "print this in A::bar (gdb/277)" + } + -re ".*$gdb_prompt $" { fail "print this in A::bar" } + timeout { fail "(timeout) print this in A::bar" } +} + +# Check again with funk::getFunky (this is the original test case +# for CHFts23426); sometimes having a constructor with no arguments +# will nuke the debug info read in for other methods in the class. + +gdb_test "break 21" \ + "Breakpoint \[0-9\]* at $hex.*file .*method.cc, line 21\\." + +gdb_test "continue" \ + "Continuing\\.\r\n\r\nBreakpoint \[0-9\]*, funk::getFunky(\\(int, int\\)|) \\(this=$hex, a=1, b=2\\) at .*method\\.cc:21\r\n21\[\t \]*data_ = res;" \ + "continue to 21" + +# Check ability to access this-relative stuff. + +gdb_test "print data_" \ + "\\$\[0-9\]* = 33" \ + "print data_ in funk::getFunky" + +# Check access to this pointer + +gdb_test "print this" \ + "\\$\[0-9\]* = \\((class |)funk *\\* *(const|)\\) $hex" \ + "print this in funk::getFunky" + +# Check access to local variable + +gdb_test "print res" \ + "\\$\[0-9\]* = -30" \ + "print res in funk::getFunky" + +# Check ptype of class -- should show const/volatile methods + +send_gdb "ptype A\n" +gdb_expect { + -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\) volatile;\r\n\[ \]*int qux\\(int, float\\) (const volatile|volatile const);\r\n\}\r\n$gdb_prompt $" { + pass "ptype A" + } + -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*A & operator=\\(A const ?&\\);\r\n\[ \]*A\\(A const ?&\\);\r\n\[ \]*A\\((void|)\\);\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\) volatile;\r\n\[ \]*int qux\\(int, float\\) (const volatile|volatile const);\r\n\}\r\n$gdb_prompt $" { + pass "ptype A" + } + -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\);\r\n\[ \]*int qux\\(int, float\\) const;\r\n\}\r\n$gdb_prompt $" { + pass "ptype A (HP aCC bug -- volatile not indicated)" + } + -re "type = class A \{\r\n\[ \]*public:\r\n\[ \]*int x;\r\n\[ \]*int y;\r\n\r\n\[ \]*int foo\\(int\\);\r\n\[ \]*int bar\\(int\\) const;\r\n\[ \]*int baz\\(int, char\\) volatile;\r\n\[ \]*int qux\\(int, float\\) const volatile;\r\n\}\r\n$gdb_prompt $" { + pass "ptype A" + } + -re ".*$gdb_prompt $" { fail "ptype A" } + timeout { fail "(timeout) ptype A" } +} + +send_gdb "cont\n" +gdb_expect { + -re "Continuing.\r\n\r\nProgram exited normally.*$gdb_prompt $" { + pass "finish program" + } + -re "Continuing.* EXIT code 0.*Program exited normally.*$gdb_prompt $" { + pass "finish program (exit wrapper)" + } + -re ".*$gdb_prompt $" { fail "finish program" } + default:{ fail "finish program (timeout)" } +} + diff --git a/gdb/testsuite/gdb.cp/misc.cc b/gdb/testsuite/gdb.cp/misc.cc new file mode 100644 index 0000000..286c02b --- /dev/null +++ b/gdb/testsuite/gdb.cp/misc.cc @@ -0,0 +1,587 @@ +// Test various -*- C++ -*- things. + +// ====================== basic C++ types ======================= +bool v_bool; +bool v_bool_array[2]; + +typedef struct fleep fleep; +struct fleep { int a; } s; + +// ====================== simple class structures ======================= + +struct default_public_struct { + // defaults to public: + int a; + int b; +}; + +struct explicit_public_struct { + public: + int a; + int b; +}; + +struct protected_struct { + protected: + int a; + int b; +}; + +struct private_struct { + private: + int a; + int b; +}; + +struct mixed_protection_struct { + public: + int a; + int b; + private: + int c; + int d; + protected: + int e; + int f; + public: + int g; + private: + int h; + protected: + int i; +}; + +class public_class { + public: + int a; + int b; +}; + +class protected_class { + protected: + int a; + int b; +}; + +class default_private_class { + // defaults to private: + int a; + int b; +}; + +class explicit_private_class { + private: + int a; + int b; +}; + +class mixed_protection_class { + public: + int a; + int b; + private: + int c; + int d; + protected: + int e; + int f; + public: + int g; + private: + int h; + protected: + int i; +}; + +class const_vol_method_class { +public: + int a; + int b; + int foo (int &) const; + int bar (int &) volatile; + int baz (int &) const volatile; +}; + +int const_vol_method_class::foo (int & ir) const +{ + return ir + 3; +} +int const_vol_method_class::bar (int & ir) volatile +{ + return ir + 4; +} +int const_vol_method_class::baz (int & ir) const volatile +{ + return ir + 5; +} + +// ========================= simple inheritance ========================== + +class A { + public: + int a; + int x; +}; + +A g_A; + +class B : public A { + public: + int b; + int x; +}; + +B g_B; + +class C : public A { + public: + int c; + int x; +}; + +C g_C; + +class D : public B, public C { + public: + int d; + int x; +}; + +D g_D; + +class E : public D { + public: + int e; + int x; +}; + +E g_E; + +class class_with_anon_union +{ + public: + int one; + union + { + int a; + long b; + }; +}; + +class_with_anon_union g_anon_union; + +void inheritance2 (void) +{ +} + +void inheritance1 (void) +{ + int ival; + int *intp; + + // {A::a, A::x} + + g_A.A::a = 1; + g_A.A::x = 2; + + // {{A::a,A::x},B::b,B::x} + + g_B.A::a = 3; + g_B.A::x = 4; + g_B.B::b = 5; + g_B.B::x = 6; + + // {{A::a,A::x},C::c,C::x} + + g_C.A::a = 7; + g_C.A::x = 8; + g_C.C::c = 9; + g_C.C::x = 10; + + // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x} + + // The following initialization code is non-portable, but allows us + // to initialize all members of g_D until we can fill in the missing + // initialization code with legal C++ code. + + for (intp = (int *) &g_D, ival = 11; + intp < ((int *) &g_D + sizeof (g_D) / sizeof (int)); + intp++, ival++) + { + *intp = ival; + } + + // Overlay the nonportable initialization with legal initialization. + + // ????? = 11; (g_D.A::a = 11; is ambiguous) + // ????? = 12; (g_D.A::x = 12; is ambiguous) +/* djb 6-3-2000 + + This should take care of it. Rather than try to initialize using an ambiguous + construct, use 2 unambiguous ones for each. Since the ambiguous a/x member is + coming from C, and B, initialize D's C::a, and B::a, and D's C::x and B::x. + */ + g_D.C::a = 15; + g_D.C::x = 12; + g_D.B::a = 11; + g_D.B::x = 12; + g_D.B::b = 13; + g_D.B::x = 14; + // ????? = 15; + // ????? = 16; + g_D.C::c = 17; + g_D.C::x = 18; + g_D.D::d = 19; + g_D.D::x = 20; + + + // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x} + + // The following initialization code is non-portable, but allows us + // to initialize all members of g_D until we can fill in the missing + // initialization code with legal C++ code. + + for (intp = (int *) &g_E, ival = 21; + intp < ((int *) &g_E + sizeof (g_E) / sizeof (int)); + intp++, ival++) + { + *intp = ival; + } + + // Overlay the nonportable initialization with legal initialization. + + // ????? = 21; (g_E.A::a = 21; is ambiguous) + // ????? = 22; (g_E.A::x = 22; is ambiguous) + g_E.B::b = 23; + g_E.B::x = 24; + // ????? = 25; + // ????? = 26; + g_E.C::c = 27; + g_E.C::x = 28; + g_E.D::d = 29; + g_E.D::x = 30; + g_E.E::e = 31; + g_E.E::x = 32; + + g_anon_union.one = 1; + g_anon_union.a = 2; + + inheritance2 (); +} + +// ======================== static member functions ===================== + +class Static { +public: + static void ii(int, int); +}; +void Static::ii (int, int) { } + +// ======================== virtual base classes========================= + +class vA { + public: + int va; + int vx; +}; + +vA g_vA; + +class vB : public virtual vA { + public: + int vb; + int vx; +}; + +vB g_vB; + +class vC : public virtual vA { + public: + int vc; + int vx; +}; + +vC g_vC; + +class vD : public virtual vB, public virtual vC { + public: + int vd; + int vx; +}; + +vD g_vD; + +class vE : public virtual vD { + public: + int ve; + int vx; +}; + +vE g_vE; + +void inheritance4 (void) +{ +} + +void inheritance3 (void) +{ + int ival; + int *intp; + + // {vA::va, vA::vx} + + g_vA.vA::va = 1; + g_vA.vA::vx = 2; + + // {{vA::va, vA::vx}, vB::vb, vB::vx} + + g_vB.vA::va = 3; + g_vB.vA::vx = 4; + g_vB.vB::vb = 5; + g_vB.vB::vx = 6; + + // {{vA::va, vA::vx}, vC::vc, vC::vx} + + g_vC.vA::va = 7; + g_vC.vA::vx = 8; + g_vC.vC::vc = 9; + g_vC.vC::vx = 10; + + // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx} + + g_vD.vA::va = 11; + g_vD.vA::vx = 12; + g_vD.vB::vb = 13; + g_vD.vB::vx = 14; + g_vD.vC::vc = 15; + g_vD.vC::vx = 16; + g_vD.vD::vd = 17; + g_vD.vD::vx = 18; + + + // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx} + + g_vD.vA::va = 19; + g_vD.vA::vx = 20; + g_vD.vB::vb = 21; + g_vD.vB::vx = 22; + g_vD.vC::vc = 23; + g_vD.vC::vx = 24; + g_vD.vD::vd = 25; + g_vD.vD::vx = 26; + g_vE.vE::ve = 27; + g_vE.vE::vx = 28; + + inheritance4 (); +} + +// ====================================================================== + +class Base1 { + public: + int x; + Base1(int i) { x = i; } +}; + +class Foo +{ + public: + int x; + int y; + static int st; + Foo (int i, int j) { x = i; y = j; } + int operator! (); + operator int (); + int times (int y); +}; + +class Bar : public Base1, public Foo { + public: + int z; + Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; } +}; + +int Foo::operator! () { return !x; } + +int Foo::times (int y) { return x * y; } + +int Foo::st = 100; + +Foo::operator int() { return x; } + +Foo foo(10, 11); +Bar bar(20, 21, 22); + +class ClassWithEnum { +public: + enum PrivEnum { red, green, blue, yellow = 42 }; + PrivEnum priv_enum; + int x; +}; + +void enums2 (void) +{ +} + +/* classes.exp relies on statement order in this function for testing + enumeration fields. */ + +void enums1 () +{ + ClassWithEnum obj_with_enum; + obj_with_enum.priv_enum = ClassWithEnum::red; + obj_with_enum.x = 0; + enums2 (); + obj_with_enum.priv_enum = ClassWithEnum::green; +} + +class ClassParam { +public: + int Aptr_a (A *a) { return a->a; } + int Aptr_x (A *a) { return a->x; } + int Aref_a (A &a) { return a.a; } + int Aref_x (A &a) { return a.x; } + int Aval_a (A a) { return a.a; } + int Aval_x (A a) { return a.x; } +}; + +ClassParam class_param; + +class Contains_static_instance +{ + public: + int x; + int y; + Contains_static_instance (int i, int j) { x = i; y = j; } + static Contains_static_instance null; +}; + +Contains_static_instance Contains_static_instance::null(0,0); +Contains_static_instance csi(10,20); + +class Contains_nested_static_instance +{ + public: + class Nested + { + public: + Nested(int i) : z(i) {} + int z; + static Contains_nested_static_instance xx; + }; + + Contains_nested_static_instance(int i, int j) : x(i), y(j) {} + + int x; + int y; + + static Contains_nested_static_instance null; + static Nested yy; +}; + +Contains_nested_static_instance Contains_nested_static_instance::null(0, 0); +Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5); +Contains_nested_static_instance + Contains_nested_static_instance::Nested::xx(1,2); +Contains_nested_static_instance cnsi(30,40); + +typedef struct { + int one; + int two; +} tagless_struct; +tagless_struct v_tagless; + +/* Try to get the compiler to allocate a class in a register. */ +class small { + public: + int x; + int method (); +}; + +int +small::method () +{ + return x + 5; +} + +void marker_reg1 () {} + +int +register_class () +{ + /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220 + might put this variable in a register. This is a lose, though, because + it means that GDB can't call any methods for that variable. */ + register small v; + + int i; + + /* Perform a computation sufficiently complicated that optimizing compilers + won't optimized out the variable. If some compiler constant-folds this + whole loop, maybe using a parameter to this function here would help. */ + v.x = 0; + for (i = 0; i < 13; ++i) + v.x += i; + --v.x; /* v.x is now 77 */ + marker_reg1 (); + return v.x + 5; +} + +void dummy() +{ + v_bool = true; + v_bool_array[0] = false; + v_bool_array[1] = v_bool; +} + +void use_methods () +{ + /* Refer to methods so that they don't get optimized away. */ + int i; + i = class_param.Aptr_a (&g_A); + i = class_param.Aptr_x (&g_A); + i = class_param.Aref_a (g_A); + i = class_param.Aref_x (g_A); + i = class_param.Aval_a (g_A); + i = class_param.Aval_x (g_A); +} + + +int +main() +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + dummy(); + inheritance1 (); + inheritance3 (); + enums1 (); + register_class (); + + /* FIXME: pmi gets optimized out. Need to do some more computation with + it or something. (No one notices, because the test is xfail'd anyway, + but that probably won't always be true...). */ + int Foo::* pmi = &Foo::y; + + /* Make sure the AIX linker doesn't remove the variable. */ + v_tagless.one = 5; + + use_methods (); + + return foo.*pmi; +} + +/* Create an instance for some classes, otherwise they get optimized away. */ + +default_public_struct default_public_s; +explicit_public_struct explicit_public_s; +protected_struct protected_s; +private_struct private_s; +mixed_protection_struct mixed_protection_s; +public_class public_c; +protected_class protected_c; +default_private_class default_private_c; +explicit_private_class explicit_private_c; +mixed_protection_class mixed_protection_c; diff --git a/gdb/testsuite/gdb.cp/misc.exp b/gdb/testsuite/gdb.cp/misc.exp new file mode 100644 index 0000000..a2d122f --- /dev/null +++ b/gdb/testsuite/gdb.cp/misc.exp @@ -0,0 +1,159 @@ +# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2002 Free Software +# Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile "misc" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# +# Deduce language of main() +# + +proc deduce_language_of_main {} { + global gdb_prompt + + # See what language gdb thinks main() is, prior to reading full symbols. + # I think this fails for COFF targets. + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"auto; currently c\[+\]+\".*$gdb_prompt $" { + pass "deduced language is C++, before full symbols" + } + -re ".*$gdb_prompt $" { + fail "source language not correct for C++ (psymtabs only)" + return + } + timeout { + fail "can't show language (timeout)" + return + } + } + + runto_main + + # See if our idea of the language has changed. + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"auto; currently c\[+\]+\".*$gdb_prompt $" { + pass "deduced language is C++, after full symbols" + } + -re ".*$gdb_prompt $" { + fail "source language not correct for C++ (full symbols)" + return + } + timeout { + fail "can't show language (timeout)" + return + } + } +} + +proc test_expr { args } { + if { [llength $args] % 2 } { + warning "an even # of arguments should be passed to test_expr" + } + set last_ent [expr [llength $args] - 1]; + set testname [lindex $args $last_ent]; + if [gdb_test [lindex $args 0] "" "$testname (setup)"] { + gdb_suppress_tests; + } + for {set x 1} {$x < $last_ent} {set x [expr $x + 2]} { + if [gdb_test [lindex $args $x] [lindex $args [expr $x + 1]] "$testname ([lindex $args $x])"] { + gdb_suppress_tests; + } + } + gdb_stop_suppressing_tests; +} + +proc do_tests {} { + global prms_id + global bug_id + global subdir + global objdir + global srcdir + global binfile + global gdb_prompt + + set prms_id 0 + set bug_id 0 + + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + + deduce_language_of_main + # Check for fixes for PRs 8916 and 8630 + gdb_test "print s.a" ".* = 0" "print s.a for foo struct (known gcc 2.7.2 and earlier bug)" +} + +do_tests + +test_expr "set language c++" \ + "print 1 == 1" "print.*\\$\[0-9\]* = true" \ + "print 1 == 2" "print.*\\$\[0-9\]* = false" \ + "print as bool" + +# Test bool type printing, etc. +# Note: Language is already set to C++ above! +gdb_test "print v_bool" "\\$\[0-9\]* = false" "print a bool var" + +# set a bool variable +test_expr "set variable v_bool = true" \ + "print v_bool" "\\$\[0-9\]* = true" \ + "set a bool var" + +# next print an array of bool +gdb_test "print v_bool_array" "\\$\[0-9\]* = \\{false, false\\}" "print a bool array" + +# set elements of a bool array +test_expr "set variable v_bool_array\[1\] = true" \ + "print v_bool_array" "\\$\[0-9\]* = \\{false, true\\}" \ + "set a bool array elem" + +# bool constants +gdb_test "print true" "\\$\[0-9\]* = true" "print true" +gdb_test "print false" "\\$\[0-9\]* = false" "print false" + +# arithmetic conversions +gdb_test "print 1 + true" "\\$\[0-9\]* = 2" "1 + true" +gdb_test "print 3 + false" "\\$\[0-9\]* = 3" "3 + false" +gdb_test "print 1 < 2 < 3" "\\$\[0-9\]* = true" "1 < 2 < 3" +gdb_test "print 2 < 1 > 4" "\\$\[0-9\]* = false" "2 < 1 > 4" +gdb_test "print (bool)43" "\\$\[0-9\]* = true" "(bool)43" +gdb_test "print (bool)0" "\\$\[0-9\]* = false" "(bool)0" +gdb_test "print (bool)17.93" "\\$\[0-9\]* = true" "(bool)17.93" +gdb_test "print (bool)0.0" "\\$\[0-9\]* = false" "(bool)0.0" +gdb_test "print (int)true" "\\$\[0-9\]* = 1" "(int)true" +gdb_test "print (int)false" "\\$\[0-9\]* = 0" "(int)false" diff --git a/gdb/testsuite/gdb.cp/namespace.cc b/gdb/testsuite/gdb.cp/namespace.cc new file mode 100644 index 0000000..7b9a173 --- /dev/null +++ b/gdb/testsuite/gdb.cp/namespace.cc @@ -0,0 +1,163 @@ +namespace AAA { + char c; + int i; + int A_xyzq (int); + char xyzq (char); + class inA { + public: + int xx; + int fum (int); + }; +}; + +int AAA::inA::fum (int i) +{ + return 10 + i; +} + +namespace BBB { + char c; + int i; + int B_xyzq (int); + char xyzq (char); + + namespace CCC { + char xyzq (char); + }; + + class Class { + public: + char xyzq (char); + int dummy; + }; +}; + +int AAA::A_xyzq (int x) +{ + return 2 * x; +} + +char AAA::xyzq (char c) +{ + return 'a'; +} + + +int BBB::B_xyzq (int x) +{ + return 3 * x; +} + +char BBB::xyzq (char c) +{ + return 'b'; +} + +char BBB::CCC::xyzq (char c) +{ + return 'z'; +} + +char BBB::Class::xyzq (char c) +{ + return 'o'; +} + +void marker1(void) +{ + return; +} + +namespace +{ + int X = 9; + + namespace G + { + int Xg = 10; + } +} + +namespace C +{ + int c = 1; + int shadow = 12; + + namespace + { + int cX = 6; + + namespace F + { + int cXf = 7; + } + } + + namespace C + { + int cc = 2; + } + + namespace D + { + int cd = 3; + int shadow = 13; + + namespace E + { + int cde = 5; + } + + void marker2 (void) + { + // NOTE: carlton/2003-04-23: I'm listing the expressions that I + // plan to have GDB try to print out, just to make sure that the + // compiler and I agree which ones should be legal! It's easy + // to screw up when testing the boundaries of namespace stuff. + c; + //cc; + C::cc; + cd; + E::cde; + shadow; + cX; + F::cXf; + X; + G::Xg; + //cXOtherFile; + //XOtherFile; + + return; + } + + } +} + +int main () +{ + using AAA::inA; + char c1; + + using namespace BBB; + + c1 = xyzq ('x'); + c1 = AAA::xyzq ('x'); + c1 = BBB::CCC::xyzq ('m'); + + inA ina; + + ina.xx = 33; + + int y; + + y = AAA::A_xyzq (33); + y += B_xyzq (44); + + BBB::Class cl; + + c1 = cl.xyzq('e'); + + marker1(); + + C::D::marker2 (); +} diff --git a/gdb/testsuite/gdb.cp/namespace.exp b/gdb/testsuite/gdb.cp/namespace.exp new file mode 100644 index 0000000..f4efaf6 --- /dev/null +++ b/gdb/testsuite/gdb.cp/namespace.exp @@ -0,0 +1,219 @@ +# Copyright 1997, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# tests for namespaces +# Written by Satish Pai 1997-07-23 + +# This file is part of the gdb testsuite + +# Note: These tests are geared to the HP aCC compiler, +# which has an idiosyncratic way of emitting debug info +# for namespaces. +# Note: As of 2000-06-03, these pass under g++ - djb + + +if $tracelevel then { + strace $tracelevel + } + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "namespace" +set srcfile ${testfile}.cc +set objfile ${objdir}/${subdir}/${testfile}.o +set srcfile1 ${testfile}1.cc +set objfile1 ${objdir}/${subdir}/${testfile}1.o +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile}] { + return -1; +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${objfile1}" object {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${objfile} ${objfile1}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +if ![runto 'marker1'] then { + perror "couldn't run to marker1" + continue +} + +gdb_test "up" ".*main.*" "up from marker1" + +# Access a data item inside a namespace using colons and +# single quotes :-( + +send_gdb "print 'AAA::c'\n" +gdb_expect { + -re "\\$\[0-9\]* = 0 '\\\\(0|000)'\r\n$gdb_prompt $" { pass "print 'AAA::c'" } + -re ".*$gdb_prompt $" { fail "print 'AAA::c'" } + timeout { fail "(timeout) print 'AAA::c'" } +} + +# An object declared using "using". + +send_gdb "print ina\n" +gdb_expect { + -re "\\$\[0-9\]+ = {xx = 33}.*$gdb_prompt $" { + pass "print ina" + } + -re ".*$gdb_prompt $" { fail "print ina" } + timeout { fail "(timeout) print ina" } +} + +send_gdb "ptype ina\n" +gdb_expect { + -re "type = class (AAA::|)inA \{\r\n\[ \]*public:\r\n\[ \]*int xx;\r\n\[ \]*\r\n\[ \]*.*int fum\\(int\\);\r\n\}\r\n$gdb_prompt $" { + pass "ptype ina" + } + -re ".*$gdb_prompt $" { fail "ptype ina" } + timeout { fail "(timeout) ptype ina" } +} + +# Check all functions are known to GDB + +setup_xfail hppa*-*-*11* CLLbs14869 +send_gdb "info func xyzq\n" +gdb_expect { + -re "All functions.*File.*namespace.cc:\r\nint AAA::A_xyzq\\(int\\);\r\nint BBB::B_xyzq\\(int\\);\r\nchar AAA::xyzq\\(char\\);\r\nchar BBB::xyzq\\(char\\);\r\nchar BBB::CCC::xyzq\\(char\\);\r\nchar BBB::Class::xyzq\\(char\\);\r\n$gdb_prompt $" { + pass "info func xyzq" + } + -re "All functions.*File.*namespace.cc:\r\nint AAA::A_xyzq\\(int\\);\r\nchar AAA::xyzq\\(char\\);\r\nint BBB::B_xyzq\\(int\\);\r\nchar BBB::CCC::xyzq\\(char\\);\r\nchar BBB::Class::xyzq\\(char\\);\r\nchar BBB::xyzq\\(char\\);\r\n$gdb_prompt $" { + pass "info func xyzq" + } + -re ".*$gdb_prompt $" { fail "info func xyzq" } + timeout { fail "(timeout) info func xyzq" } +} + +# Call a function in a namespace + +send_gdb "print 'AAA::xyzq'('x')\n" +gdb_expect { + -re "\\$\[0-9\]* = 97 'a'\r\n$gdb_prompt $" { + pass "print 'AAA::xyzq'('x')" + } + -re ".*$gdb_prompt $" { fail "print 'AAA::xyzq'('x')" } + timeout { fail "(timeout) print 'AAA::xyzq'('x')" } +} + +# Break on a function in a namespace + +send_gdb "break AAA::xyzq\n" +gdb_expect { + -re "Breakpoint.*at $hex: file.*namespace.cc, line 42\\.\r\n$gdb_prompt $" { + pass "break AAA::xyzq" + } + -re ".*$gdb_prompt $" { fail "break AAA::xyzq" } + timeout { fail "(timeout) break AAA::xyzq" } +} + +# Call a function in a nested namespace + +send_gdb "print 'BBB::CCC::xyzq'('x')\n" +gdb_expect { + -re "\\$\[0-9\]* = 122 'z'\r\n$gdb_prompt $" { + pass "print 'BBB::CCC::xyzq'('x')" + } + -re ".*$gdb_prompt $" { fail "print 'BBB::CCC::xyzq'('x')" } + timeout { fail "(timeout) print 'BBB::CCC::xyzq'('x')" } +} + +# Break on a function in a nested namespace + +send_gdb "break BBB::CCC::xyzq\n" +gdb_expect { + -re "Breakpoint.*at $hex: file.*namespace.cc, line 58\\.\r\n$gdb_prompt $" { + pass "break BBB::CCC::xyzq" + } + -re ".*$gdb_prompt $" { fail "break BBB::CCC::xyzq" } + timeout { fail "(timeout) break BBB::CCC::xyzq" } +} + +# Print address of a function in a class in a namespace + +send_gdb "print 'BBB::Class::xyzq'\n" +gdb_expect { + -re "\\$\[0-9\]* = \{char \\((BBB::|)Class \\*( const|), (char|int)\\)\} $hex \r\n$gdb_prompt $" { + pass "print 'BBB::Class::xyzq'" + } + -re ".*$gdb_prompt $" { fail "print 'BBB::Class::xyzq'" } + timeout { fail "(timeout) print 'BBB::Class::xyzq'" } +} + +# Break on a function in a class in a namespace + +send_gdb "break BBB::Class::xyzq\n" +gdb_expect { + -re "Breakpoint.*at $hex: file.*namespace.cc, line 63\\.\r\n$gdb_prompt $" { + pass "break BBB::Class::xyzq" + } + -re ".*$gdb_prompt $" { fail "break BBB::Class::xyzq" } + timeout { fail "(timeout) break BBB::Class::xyzq" } +} + +# Test to see if the appropriate namespaces are in scope when trying +# to print out stuff from within a function defined within a +# namespace. + +if ![runto "C::D::marker2"] then { + perror "couldn't run to marker2" + continue +} + +gdb_test "print c" "\\$\[0-9\].* = 1" +gdb_test "print cc" "No symbol \"cc\" in current context." +gdb_test "print 'C::cc'" "\\$\[0-9\].* = 2" +gdb_test "print cd" "\\$\[0-9\].* = 3" +gdb_test "print 'E::cde'" "\\$\[0-9\].* = 5" +gdb_test "print shadow" "\\$\[0-9\].* = 13" +gdb_test "print cOtherFile" "\\$\[0-9\].* = 316" + +# Some anonymous namespace tests. + +gdb_test "print cX" "\\$\[0-9\].* = 6" +gdb_test "print 'F::cXf'" "\\$\[0-9\].* = 7" +gdb_test "print X" "\\$\[0-9\].* = 9" +gdb_test "print 'G::Xg'" "\\$\[0-9\].* = 10" +gdb_test "print cXOtherFile" "No symbol \"cXOtherFile\" in current context." +gdb_test "print XOtherFile" "No symbol \"XOtherFile\" in current context." diff --git a/gdb/testsuite/gdb.cp/namespace1.cc b/gdb/testsuite/gdb.cp/namespace1.cc new file mode 100644 index 0000000..4a5900a --- /dev/null +++ b/gdb/testsuite/gdb.cp/namespace1.cc @@ -0,0 +1,31 @@ +/* Copyright 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Please email any bugs, comments, and/or additions to this file to: + bug-gdb@prep.ai.mit.edu */ + +namespace C +{ + namespace { + int cXOtherFile = 29; + }; + + int cOtherFile = 316; +} + +namespace { + int XOtherFile = 317; +} diff --git a/gdb/testsuite/gdb.cp/overload.cc b/gdb/testsuite/gdb.cp/overload.cc new file mode 100644 index 0000000..56afc96 --- /dev/null +++ b/gdb/testsuite/gdb.cp/overload.cc @@ -0,0 +1,168 @@ +#include + +class foo { +public: + foo (int); + foo (int, const char *); + foo (foo&); + ~foo (); + void foofunc (int); + void foofunc (int, signed char *); + int ifoo; + const char *ccpfoo; + +int overload1arg (void); +int overload1arg (char); +int overload1arg (signed char); +int overload1arg (unsigned char); +int overload1arg (short); +int overload1arg (unsigned short); +int overload1arg (int); +int overload1arg (unsigned int); +int overload1arg (long); +int overload1arg (unsigned long); +int overload1arg (float); +int overload1arg (double); + +int overloadfnarg (void); +int overloadfnarg (int); +int overloadfnarg (int, int (*) (int)); + +int overloadargs (int a1); +int overloadargs (int a1, int a2); +int overloadargs (int a1, int a2, int a3); +int overloadargs (int a1, int a2, int a3, int a4); +int overloadargs (int a1, int a2, int a3, int a4, int a5); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10, int a11); + + +}; + +int intToChar (char c) +{ + return 297; +} + +void marker1() +{} + +int main () +{ + char arg2 = 2; + signed char arg3 =3; + unsigned char arg4 =4; + short arg5 =5; + unsigned short arg6 =6; + int arg7 =7; + unsigned int arg8 =8; + long arg9 =9; + unsigned long arg10 =10; + float arg11 =100.0; + double arg12 = 200.0; + + char *str = (char *) "A"; + foo foo_instance1(111); + foo foo_instance2(222, str); + foo foo_instance3(foo_instance2); + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + + // Verify that intToChar should work: + intToChar(1); + + marker1(); // marker1-returns-here + return 0; // marker1-returns-here +} + +foo::foo (int i) { ifoo = i; ccpfoo = NULL; } +foo::foo (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; } +foo::foo (foo& afoo) { ifoo = afoo.ifoo; ccpfoo = afoo.ccpfoo;} +foo::~foo () {} + + +/* Some functions to test overloading by varying one argument type. */ + +int foo::overload1arg (void) { return 1; } +int foo::overload1arg (char arg) { arg = 0; return 2;} +int foo::overload1arg (signed char arg) { arg = 0; return 3;} +int foo::overload1arg (unsigned char arg) { arg = 0; return 4;} +int foo::overload1arg (short arg) { arg = 0; return 5;} +int foo::overload1arg (unsigned short arg) { arg = 0; return 6;} +int foo::overload1arg (int arg) { arg = 0; return 7;} +int foo::overload1arg (unsigned int arg) { arg = 0; return 8;} +int foo::overload1arg (long arg) { arg = 0; return 9;} +int foo::overload1arg (unsigned long arg) { arg = 0; return 10;} +int foo::overload1arg (float arg) { arg = 0; return 11;} +int foo::overload1arg (double arg) { arg = 0; return 12;} + +/* Test to see that we can explicitly request overloaded functions + with function pointers in the prototype. */ + +int foo::overloadfnarg (void) { return ifoo * 20; } +int foo::overloadfnarg (int arg) { arg = 0; return 13;} +int foo::overloadfnarg (int arg, int (*foo) (int)) { return foo(arg); } + +/* Some functions to test overloading by varying argument count. */ + +int foo::overloadargs (int a1) +{ a1 = 0; +return 1;} + +int foo::overloadargs (int a1, int a2) +{ a1 = a2 = 0; +return 2;} + +int foo::overloadargs (int a1, int a2, int a3) +{ a1 = a2 = a3 = 0; +return 3;} + +int foo::overloadargs (int a1, int a2, int a3, int a4) +{ a1 = a2 = a3 = a4 = 0; +return 4;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5) +{ a1 = a2 = a3 = a4 = a5 = 0; +return 5;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6) +{ a1 = a2 = a3 = a4 = a5 = a6 = 0; +return 6;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7) +{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; +return 7;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8) +{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; +return 8;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9) +{ + a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; + return 9; +} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = + a10 = 0; return 10;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10, int a11) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = + a10 = a11 = 0; return 11;} + + + diff --git a/gdb/testsuite/gdb.cp/overload.exp b/gdb/testsuite/gdb.cp/overload.exp new file mode 100644 index 0000000..3e14678 --- /dev/null +++ b/gdb/testsuite/gdb.cp/overload.exp @@ -0,0 +1,400 @@ +# Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# written by Elena Zannoni (ezannoni@cygnus.com) + +# This file is part of the gdb testsuite +# +# tests for overloaded member functions. Command Line calls +# + + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "overload" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +if ![runto 'marker1'] then { + perror "couldn't run to marker1" + continue +} + +gdb_test "up" ".*main.*" "up from marker1" + +send_gdb "print foo_instance1\n" +gdb_expect { + -re ".\[0-9\]* = \{ifoo = 111, ccpfoo = 0x0\}\r\n$gdb_prompt $" { + pass "print foo_instance1" + } + -re ".*$gdb_prompt $" { fail "print foo_instance1" } + timeout { fail "(timeout) print foo_instance1" } + } + + +setup_xfail "hppa*-*-*" CLLbs16901 +send_gdb "ptype foo_instance1\n" +gdb_expect { + -re "type = class foo \{.*public:.*int ifoo;.*const char \\*ccpfoo;.*foo\\(int\\);.*foo\\(int, (const char|char const) \\*\\);.*foo\\(foo &\\);.*~foo\\(void\\);.*void foofunc\\(int\\);.*void foofunc\\(int, signed char \\*\\);.*int overload1arg\\(void\\);.*int overload1arg\\(char\\);.*int overload1arg\\(signed char\\);.*int overload1arg\\(unsigned char\\);.*int overload1arg\\(short\\);.*int overload1arg\\(unsigned short\\);.*int overload1arg\\(int\\);.*int overload1arg\\(unsigned int\\);.*int overload1arg\\(long\\);.*int overload1arg\\(unsigned long\\);.*int overload1arg\\(float\\);.*int overload1arg\\(double\\);.*int overloadargs\\(int\\);.*int overloadargs\\(int, int\\);.*int overloadargs\\(int, int, int\\);.*int overloadargs\\(int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int, int, int\\);.*int overloadargs\\(int, int, int, int, int, int, int, int, int, int, int\\);\r\n\}\r\n$gdb_prompt $" { + pass "ptype foo_instance1 (HP aCC -- known quirk with ~foo parameter list)" + } + -re "type = class foo .*int overloadargs\\(int, int, int, int, int, int, int, int, int, int, int\\);\r\n\}\r\n$gdb_prompt $" { + pass "ptype foo_instance1 (shorter match)" + } + -re ".*$gdb_prompt $" { fail "ptype foo_instance1" } + timeout { fail "(timeout) ptype foo_instance1" } + } + +send_gdb "print foo_instance2\n" +gdb_expect { + -re ".\[0-9\]* = \{ifoo = 222, ccpfoo = $hex \"A\"\}\r\n$gdb_prompt $" { + pass "print foo_instance2" + } + -re ".*$gdb_prompt $" { fail "print foo_instance2" } + timeout { fail "(timeout) print foo_instance2" } + } + +send_gdb "print foo_instance3\n" +gdb_expect { + -re ".\[0-9\]* = \{ifoo = 222, ccpfoo = $hex \"A\"\}\r\n$gdb_prompt $" { + pass "print foo_instance3" + } + -re ".*$gdb_prompt $" { fail "print foo_instance3" } + timeout { fail "(timeout) print foo_instance3" } + } + + +send_gdb "print foo_instance1.overloadargs(1)\n" +gdb_expect { + -re ".\[0-9\]* = 1\r\n$gdb_prompt $" { + pass "print call overloaded func 1 arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 1 arg" } + timeout { fail "(timeout) print call overloaded func 1 arg" } + } + + +# If GDB fails to restore the selected frame properly after the +# inferior function call above (see GDB PR 1155 for an explanation of +# why this might happen), all the subsequent tests will fail. We +# should detect and report that failure, but let the marker call +# finish so that the rest of the tests can run undisturbed. +gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" { + -re "#0 marker1.*$gdb_prompt $" { + setup_kfail "gdb/1155" s390-*-linux-gnu + fail "re-selected 'main' frame after inferior call" + gdb_test "finish" ".*main.*at .*overload.cc:.*// marker1-returns-here.*" \ + "finish call to marker1" + } + -re "#1 ($hex in )?main.*$gdb_prompt $" { + pass "re-selected 'main' frame after inferior call" + } +} + + +send_gdb "print foo_instance1.overloadargs(1, 2)\n" +gdb_expect { + -re ".\[0-9\]* = 2\r\n$gdb_prompt $" { + pass "print call overloaded func 2 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 2 args" } + timeout { fail "(timeout) print call overloaded func 2 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3)\n" +gdb_expect { + -re ".\[0-9\]* = 3\r\n$gdb_prompt $" { + pass "print call overloaded func 3 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 3 args" } + timeout { fail "(timeout) print call overloaded func 3 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4)\n" +gdb_expect { + -re ".\[0-9\]* = 4\r\n$gdb_prompt $" { + pass "print call overloaded func 4 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 4 args" } + timeout { fail "(timeout) print call overloaded func 4 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5)\n" +gdb_expect { + -re ".\[0-9\]* = 5\r\n$gdb_prompt $" { + pass "print call overloaded func 5 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 5 args" } + timeout { fail "(timeout) print call overloaded func 5 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6)\n" +gdb_expect { + -re ".\[0-9\]* = 6\r\n$gdb_prompt $" { + pass "print call overloaded func 6 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 6 args" } + timeout { fail "(timeout) print call overloaded func 6 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7)\n" +gdb_expect { + -re ".\[0-9\]* = 7\r\n$gdb_prompt $" { + pass "print call overloaded func 7 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 7 args" } + timeout { fail "(timeout) print call overloaded func 7 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8)\n" +gdb_expect { + -re ".\[0-9\]* = 8\r\n$gdb_prompt $" { + pass "print call overloaded func 8 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 8 args" } + timeout { fail "(timeout) print call overloaded func 8 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9)\n" +gdb_expect { + -re ".\[0-9\]* = 9\r\n$gdb_prompt $" { + pass "print call overloaded func 9 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 9 args" } + timeout { fail "(timeout) print call overloaded func 9 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n" +gdb_expect { + -re ".\[0-9\]* = 10\r\n$gdb_prompt $" { + pass "print call overloaded func 10 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 10 args" } + timeout { fail "(timeout) print call overloaded func 10 args" } + } + + +send_gdb "print foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)\n" +gdb_expect { + -re ".\[0-9\]* = 11\r\n$gdb_prompt $" { + pass "print call overloaded func 11 args" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func 11 args" } + timeout { fail "(timeout) print call overloaded func 11 args" } + } + + +send_gdb "print foo_instance1.overload1arg()\n" +gdb_expect { + -re ".\[0-9\]* = 1\r\n$gdb_prompt $" { + pass "print call overloaded func void arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func void arg" } + timeout { fail "(timeout) print call overloaded func void arg" } + } + + +send_gdb "print foo_instance1.overload1arg((char)arg2)\n" +gdb_expect { + -re ".\[0-9\]* = 2\r\n$gdb_prompt $" { + pass "print call overloaded func char arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func char arg" } + timeout { fail "(timeout) print call overloaded func char arg" } + } + + +send_gdb "print foo_instance1.overload1arg((signed char)arg3)\n" +gdb_expect { + -re ".\[0-9\]* = 3\r\n$gdb_prompt $" { + pass "print call overloaded func signed char arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func signed char arg" } + timeout { fail "(timeout) print call overloaded func signed char arg" } + } + + +send_gdb "print foo_instance1.overload1arg((unsigned char)arg4)\n" +gdb_expect { + -re ".\[0-9\]* = 4\r\n$gdb_prompt $" { + pass "print call overloaded func unsigned char arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned char arg" } + timeout { fail "(timeout) print call overloaded func unsigned char arg" } + } + + +send_gdb "print foo_instance1.overload1arg((short)arg5)\n" +gdb_expect { + -re ".\[0-9\]* = 5\r\n$gdb_prompt $" { + pass "print call overloaded func short arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func short arg" } + timeout { fail "(timeout) print call overloaded func short arg" } + } + + +send_gdb "print foo_instance1.overload1arg((unsigned short)arg6)\n" +gdb_expect { + -re ".\[0-9\]* = 6\r\n$gdb_prompt $" { + pass "print call overloaded func unsigned short arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned short arg" } + timeout { fail "(timeout) print call overloaded func unsigned short arg" } + } + + +send_gdb "print foo_instance1.overload1arg((int)arg7)\n" +gdb_expect { + -re ".\[0-9\]* = 7\r\n$gdb_prompt $" { + pass "print call overloaded func int arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func int arg" } + timeout { fail "(timeout) print call overloaded func int arg" } + } + + +send_gdb "print foo_instance1.overload1arg((unsigned int)arg8)\n" +gdb_expect { + -re ".\[0-9\]* = 8\r\n$gdb_prompt $" { + pass "print call overloaded func unsigned int arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned int arg" } + timeout { fail "(timeout) print call overloaded func unsigned int arg" } + } + + +send_gdb "print foo_instance1.overload1arg((long)arg9)\n" +gdb_expect { + -re ".\[0-9\]* = 9\r\n$gdb_prompt $" { + pass "print call overloaded func long arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func long arg" } + timeout { fail "(timeout) print call overloaded func long arg" } + } + + +send_gdb "print foo_instance1.overload1arg((unsigned long)arg10)\n" +gdb_expect { + -re ".\[0-9\]* = 10\r\n$gdb_prompt $" { + pass "print call overloaded func unsigned long arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func unsigned long arg" } + timeout { fail "(timeout) print call overloaded func unsigned long arg" } + } + + +send_gdb "print foo_instance1.overload1arg((float)arg11)\n" +gdb_expect { + -re ".\[0-9\]* = 11\r\n$gdb_prompt $" { + pass "print call overloaded func float arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func float arg" } + timeout { fail "(timeout) print call overloaded func float arg" } + } + + +send_gdb "print foo_instance1.overload1arg((double)arg12)\n" +gdb_expect { + -re ".\[0-9\]* = 12\r\n$gdb_prompt $" { + pass "print call overloaded func double arg" + } + -re ".*$gdb_prompt $" { fail "print call overloaded func double arg" } + timeout { fail "(timeout) print call overloaded func double arg" } + } + +# Now some tests to see if we can list overloaded functions properly: + +gdb_test "set listsize 1" "" "" +# send_gdb "set listsize 1\n" +# gdb_expect -re ".*$gdb_prompt $" + +# +# Decide whether to use "()" or "(void)" +# + +send_gdb "info func overloadfnarg\n" +gdb_expect { + -re ".*overloadfnarg\\(void\\).*$gdb_prompt $" { + gdb_test "list foo::overloadfnarg(void)"\ + ".*int foo::overloadfnarg.*\\(void\\).*" \ + "list overloaded function with no args" + } + -re ".*overloadfnarg\\(\\).*$gdb_prompt $" { + gdb_test "list foo::overloadfnarg()"\ + ".*int foo::overloadfnarg.*\\(void\\).*" \ + "list overloaded function with no args" + } + -re ".*$gdb_prompt $" { + fail "list overloaded function with no args (no matching symbol)" + } +} + +gdb_test "list foo::overloadfnarg(int)"\ + "int foo::overloadfnarg.*\\(int arg\\).*" \ + "list overloaded function with int arg" + +gdb_test "list foo::overloadfnarg(int, int (*)(int))" \ + "int foo::overloadfnarg.*\\(int arg, int \\(\\*foo\\) \\(int\\)\\).*" \ + "list overloaded function with function ptr args" + +# This one crashes GDB. Don't know why yet. +gdb_test "list \"foo::overloadfnarg(int, int (*)(int))\"" \ + "int foo::overloadfnarg.*\\(int arg, int \\(\\*foo\\) \\(int\\)\\).*" \ + "list overloaded function with function ptr args - quotes around argument" + +gdb_test "print intToChar(1)" ".\[0-9\]* = 297" diff --git a/gdb/testsuite/gdb.cp/ovldbreak.cc b/gdb/testsuite/gdb.cp/ovldbreak.cc new file mode 100644 index 0000000..9a5b5cb --- /dev/null +++ b/gdb/testsuite/gdb.cp/ovldbreak.cc @@ -0,0 +1,177 @@ +#include + +class foo { +public: + foo (int); + foo (int, const char *); + foo (foo&); + ~foo (); + void foofunc (int); + void foofunc (int, signed char *); + int ifoo; + const char *ccpfoo; + +int overload1arg (void); +int overload1arg (char); +int overload1arg (signed char); +int overload1arg (unsigned char); +int overload1arg (short); +int overload1arg (unsigned short); +int overload1arg (int); +int overload1arg (unsigned int); +int overload1arg (long); +int overload1arg (unsigned long); +int overload1arg (float); +int overload1arg (double); + +int overloadargs (int a1); +int overloadargs (int a1, int a2); +int overloadargs (int a1, int a2, int a3); +int overloadargs (int a1, int a2, int a3, int a4); +int overloadargs (int a1, int a2, int a3, int a4, int a5); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10); +int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10, int a11); + + +}; + +void marker1() +{} + +int main () +{ + char arg2 = 2; + signed char arg3 =3; + unsigned char arg4 =4; + short arg5 =5; + unsigned short arg6 =6; + int arg7 =7; + unsigned int arg8 =8; + long arg9 =9; + unsigned long arg10 =10; + float arg11 =100.0; + double arg12 = 200.0; + + char ch='A'; + foo foo_instance1(111); + foo foo_instance2(222, &ch); + foo foo_instance3(foo_instance2); + + foo_instance1.overload1arg(); + foo_instance1.overload1arg(arg2); + foo_instance1.overload1arg(arg3); + foo_instance1.overload1arg(arg4); + foo_instance1.overload1arg(arg5); + foo_instance1.overload1arg(arg6); + foo_instance1.overload1arg(arg7); + foo_instance1.overload1arg(arg8); + foo_instance1.overload1arg(arg9); + foo_instance1.overload1arg(arg10); + foo_instance1.overload1arg(arg11); + foo_instance1.overload1arg(arg12); + + foo_instance1.overloadargs(1); + foo_instance1.overloadargs(1, 2); + foo_instance1.overloadargs(1, 2, 3); + foo_instance1.overloadargs(1, 2, 3, 4); + foo_instance1.overloadargs(1, 2, 3, 4, 5); + foo_instance1.overloadargs(1, 2, 3, 4, 5, 6); + foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7); + foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8); + foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9); + foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + + + marker1(); + return 0; +} + +foo::foo (int i) { ifoo = i;} +foo::foo (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; } +foo::foo (foo& afoo) { ifoo = afoo.ifoo; ccpfoo = afoo.ccpfoo;} +foo::~foo () {} + + +/* Some functions to test overloading by varying one argument type. */ + +int foo::overload1arg (void) { return 1; } +int foo::overload1arg (char arg) { arg = 0; return 2;} +int foo::overload1arg (signed char arg) { arg = 0; return 3;} +int foo::overload1arg (unsigned char arg) { arg = 0; return 4;} +int foo::overload1arg (short arg) { arg = 0; return 5;} +int foo::overload1arg (unsigned short arg) { arg = 0; return 6;} +int foo::overload1arg (int arg) { arg = 0; return 7;} +int foo::overload1arg (unsigned int arg) { arg = 0; return 8;} +int foo::overload1arg (long arg) { arg = 0; return 9;} +int foo::overload1arg (unsigned long arg) { arg = 0; return 10;} +int foo::overload1arg (float arg) { arg = 0; return 11;} +int foo::overload1arg (double arg) { arg = 0; return 12;} + + +/* Some functions to test overloading by varying argument count. */ + +int foo::overloadargs (int a1) +{ a1 = 0; +return 1;} + +int foo::overloadargs (int a1, int a2) +{ a1 = a2 = 0; +return 2;} + +int foo::overloadargs (int a1, int a2, int a3) +{ a1 = a2 = a3 = 0; +return 3;} + +int foo::overloadargs (int a1, int a2, int a3, int a4) +{ a1 = a2 = a3 = a4 = 0; +return 4;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5) +{ a1 = a2 = a3 = a4 = a5 = 0; +return 5;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6) +{ a1 = a2 = a3 = a4 = a5 = a6 = 0; +return 6;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7) +{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; +return 7;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8) +{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; +return 8;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9) +{ + a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; + return 9; +} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = + a10 = 0; return 10;} + +int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, + int a8, int a9, int a10, int a11) + { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = + a10 = a11 = 0; return 11;} + + + diff --git a/gdb/testsuite/gdb.cp/ovldbreak.exp b/gdb/testsuite/gdb.cp/ovldbreak.exp new file mode 100644 index 0000000..043243d --- /dev/null +++ b/gdb/testsuite/gdb.cp/ovldbreak.exp @@ -0,0 +1,360 @@ +# Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# written by Elena Zannoni (ezannoni@cygnus.com) +# modified by Michael Chastain (chastain@redhat.com) + +# This file is part of the gdb testsuite +# +# tests for overloaded member functions. Set breakpoints on +# overloaded member functions +# + + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "ovldbreak" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + + + +# When I ask gdb to set a breakpoint on an overloaded function, +# gdb gives me a choice menu. I might get stuck in that choice menu +# (for example, if C++ name mangling is not working properly). +# +# This procedure issues a command that works at either the menu +# prompt or the command prompt to get back to the command prompt. +# +# Note that an empty line won't do it (it means 'repeat the previous command' +# at top level). A line with a single space in it works nicely. + +proc take_gdb_out_of_choice_menu {} { + global gdb_prompt + send_gdb " \n" + gdb_expect { + -re ".*$gdb_prompt $" { + } + timeout { + perror "could not resynchronize to command prompt (timeout)" + continue + } + } +} + + + +# This procedure sets an overloaded breakpoint. +# When I ask for such a breakpoint, gdb gives me a menu of 'cancel' 'all' +# and a bunch of choices. I then choose from that menu by number. + +proc set_bp_overloaded {name expectedmenu mychoice bpnumber linenumber} { + global gdb_prompt hex srcfile + + # Get into the overload menu. + send_gdb "break $name\n" + gdb_expect { + -re "$expectedmenu" { + pass "bp menu for $name choice $mychoice" + + # Choose my choice. + send_gdb "$mychoice\n" + gdb_expect { + -re "Breakpoint $bpnumber at $hex: file.*$srcfile, line $linenumber.\r\n$gdb_prompt $" { + pass "set bp $bpnumber on $name $mychoice line $linenumber" + } + -re ".*$gdb_prompt $" { + fail "set bp $bpnumber on $name $mychoice line $linenumber (bad bp)" + } + timeout { + fail "set bp $bpnumber on $name $mychoice line $linenumber (timeout)" + take_gdb_out_of_choice_menu + } + } + } + -re ".*\r\n> " { + fail "bp menu for $name choice $mychoice (bad menu)" + take_gdb_out_of_choice_menu + } + -re ".*$gdb_prompt $" { + fail "bp menu for $name choice $mychoice (no menu)" + } + timeout { + fail "bp menu for $name choice $mychoice (timeout)" + take_gdb_out_of_choice_menu + } + } +} + +# This is the expected menu for overload1arg. +# Note the arg type variations on lines 6 and 13. +# This accommodates different versions of g++. + +set menu_overload1arg "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] foo::overload1arg\\(double\\) at.*$srcfile:121\r\n\\\[3\\\] foo::overload1arg\\(float\\) at.*$srcfile:120\r\n\\\[4\\\] foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r\n\\\[5\\\] foo::overload1arg\\(long\\) at.*$srcfile:118\r\n\\\[6\\\] foo::overload1arg\\((unsigned int|unsigned)\\) at.*$srcfile:117\r\n\\\[7\\\] foo::overload1arg\\(int\\) at.*$srcfile:116\r\n\\\[8\\\] foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r\n\\\[9\\\] foo::overload1arg\\(short\\) at.*$srcfile:114\r\n\\\[10\\\] foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r\n\\\[11\\\] foo::overload1arg\\(signed char\\) at.*$srcfile:112\r\n\\\[12\\\] foo::overload1arg\\(char\\) at.*$srcfile:111\r\n\\\[13\\\] foo::overload1arg\\((void|)\\) at.*$srcfile:110\r\n> $" + + + +# Set breakpoints on foo::overload1arg, one by one. + +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 12 2 111 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 11 3 112 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 10 4 113 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 9 5 114 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 8 6 115 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 7 7 116 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 6 8 117 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 5 9 118 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 4 10 119 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 3 11 120 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 2 12 121 +set_bp_overloaded "foo::overload1arg" "$menu_overload1arg" 13 13 110 + + + +# Verify the breakpoints. + +gdb_test "info break" \ + "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r +\[\t \]+breakpoint already hit 1 time\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ + "breakpoint info (after setting one-by-one)" + + + +# Test choice "cancel". +# This is copy-and-paste from set_bp_overloaded. + +send_gdb "break foo::overload1arg\n" +gdb_expect { + -re "$menu_overload1arg" { + pass "bp menu for foo::overload1arg choice cancel" + # Choose cancel. + send_gdb "0\n" + gdb_expect { + -re "canceled\r\n$gdb_prompt $" { + pass "set bp on overload1arg canceled" + } + -re "cancelled\r\n$gdb_prompt $" { + pass "set bp on overload1arg canceled" + } + -re ".*$gdb_prompt $" { + fail "set bp on overload1arg canceled (bad message)" + } + timeout { + fail "set bp on overload1arg canceled (timeout)" + take_gdb_out_of_choice_menu + } + } + } + -re ".*\r\n> " { + fail "bp menu for foo::overload1arg choice cancel (bad menu)" + take_gdb_out_of_choice_menu + } + -re ".*$gdb_prompt $" { + fail "bp menu for foo::overload1arg choice cancel (no menu)" + } + timeout { + fail "bp menu for foo::overload1arg choice cancel (timeout)" + take_gdb_out_of_choice_menu + } +} + +gdb_test "info break" \ + "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in main at.*$srcfile:49\r +\[\t \]+breakpoint already hit 1 time\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ + "breakpoint info (after cancel)" + + + +# Delete these breakpoints. + +send_gdb "delete breakpoints\n" +gdb_expect { + -re "Delete all breakpoints.* $" { + send_gdb "y\n" + gdb_expect { + -re ".*$gdb_prompt $" { + pass "delete all breakpoints" + } + timeout { + fail "delete all breakpoints (timeout)" + } + } + } + timeout { + fail "delete all breakpoints (timeout)" + } +} + +gdb_test "info breakpoints" "No breakpoints or watchpoints." "breakpoint info (after delete)" + + + +# Test choice "all". +# This is copy-and-paste from set_bp_overloaded. + +send_gdb "break foo::overload1arg\n" +gdb_expect { + -re "$menu_overload1arg" { + pass "bp menu for foo::overload1arg choice all" + # Choose all. + send_gdb "1\n" + gdb_expect { + -re "Breakpoint $decimal at $hex: file.*$srcfile, line 121.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 120.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 119.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 118.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 117.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 116.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 115.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 114.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 113.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 112.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 111.\r\nBreakpoint $decimal at $hex: file.*$srcfile, line 110.\r\nwarning: Multiple breakpoints were set.\r\nwarning: Use the .delete. command to delete unwanted breakpoints.\r\n$gdb_prompt $" { + pass "set bp on overload1arg all" + } + -re ".*$gdb_prompt $" { + fail "set bp on overload1arg all (bad message)" + } + timeout { + fail "set bp on overload1arg all (timeout)" + take_gdb_out_of_choice_menu + } + } + } + -re ".*\r\n> " { + fail "bp menu for foo::overload1arg choice all (bad menu)" + take_gdb_out_of_choice_menu + } + -re ".*$gdb_prompt $" { + fail "bp menu for foo::overload1arg choice all (no menu)" + } + timeout { + fail "bp menu for foo::overload1arg choice all (timeout)" + take_gdb_out_of_choice_menu + } +} + +gdb_test "info break" \ + "Num Type\[\t \]+Disp Enb Address\[\t \]+What.* +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:121\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:120\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned long\\) at.*$srcfile:119\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long\\) at.*$srcfile:118\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:117\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:116\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned short\\) at.*$srcfile:115\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short\\) at.*$srcfile:114\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:113\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:112\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:111\r +\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:110" \ + "breakpoint info (after setting on all)" + + + +# Run through each breakpoint. + +# NOTE: carlton/2003-02-03: I'm seeing failures on some of the tests, +# with the wrong arg being printed out. Michael Chastain sees +# failures at times, too, albeit fewer than I do. + +proc continue_to_bp_overloaded {might_kfail bpnumber argtype actuals} { + global gdb_prompt hex decimal srcfile + + send_gdb "continue\n" + gdb_expect { + -re "Continuing.\r\n\r\nBreakpoint ${bpnumber}, (${hex} in )?foo::overload1arg(\\(${argtype}\\))? \\(this=${hex}(, )?${actuals}\\) at.*${srcfile}:${decimal}\r\n${decimal}\[\t \]+int foo::overload1arg \\(${argtype}( arg)?\\).*\r\n.*$gdb_prompt $" { + pass "continue to bp overloaded : ${argtype}" + } + -re "Continuing.\r\n\r\nBreakpoint ${bpnumber}, (${hex} in )?foo::overload1arg(\\(${argtype}\\))? \\(this=${hex}, arg=.*\\) at.*${srcfile}:${decimal}\r\n${decimal}\[\t \]+int foo::overload1arg \\(${argtype}( arg)?\\).*\r\n.*$gdb_prompt $" { + if $might_kfail { + kfail "gdb/1025" "continue to bp overloaded : ${argtype}" + } else { + fail "continue to bp overloaded : ${argtype}" + } + } + -re ".*$gdb_prompt $" { + fail "continue to bp overloaded : ${argtype}" + } + timeout { + fail "continue to bp overloaded : ${argtype} (timeout)" + } + } +} + +continue_to_bp_overloaded 0 25 "(void|)" "" +continue_to_bp_overloaded 1 24 "char" "arg=2 \\'\\\\002\\'" +continue_to_bp_overloaded 1 23 "signed char" "arg=3 \\'\\\\003\\'" +continue_to_bp_overloaded 1 22 "unsigned char" "arg=4 \\'\\\\004\\'" +continue_to_bp_overloaded 1 21 "short" "arg=5" +continue_to_bp_overloaded 1 20 "unsigned short" "arg=6" +continue_to_bp_overloaded 0 19 "int" "arg=7" +continue_to_bp_overloaded 0 18 "(unsigned|unsigned int)" "arg=8" +continue_to_bp_overloaded 0 17 "long" "arg=9" +continue_to_bp_overloaded 0 16 "unsigned long" "arg=10" +continue_to_bp_overloaded 0 15 "float" "arg=100" +continue_to_bp_overloaded 1 14 "double" "arg=200" + + + +# That's all, folks. + +gdb_continue_to_end "finish program" diff --git a/gdb/testsuite/gdb.cp/pr-1023.cc b/gdb/testsuite/gdb.cp/pr-1023.cc new file mode 100644 index 0000000..7583084 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr-1023.cc @@ -0,0 +1,20 @@ +class myClass +{ + public: + myClass() {}; + ~myClass() {}; + void performUnblocking( short int cell_index ); + void performBlocking( int cell_index ); +}; + +void myClass::performUnblocking( short int cell_index ) {} + +void myClass::performBlocking( int cell_index ) {} + +int main () +{ + myClass mc; + mc.performBlocking (0); + mc.performUnblocking (0); +} + diff --git a/gdb/testsuite/gdb.cp/pr-1023.exp b/gdb/testsuite/gdb.cp/pr-1023.exp new file mode 100644 index 0000000..c8c9802 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr-1023.exp @@ -0,0 +1,79 @@ +# Copyright 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for PR gdb/1023. +# 2003-02-03 Michael Chastain + +# This file is part of the gdb testsuite. + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "pr-1023" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break myClass::performBlocking\n" +gdb_expect { + -re "Breakpoint $decimal at $hex: file .*$srcfile, line 12.*$gdb_prompt $" { + pass "break myClass::performBlocking" + } + -re "the class myClass does not have any method named performBlocking.*$gdb_prompt $" { + # fails with gcc 2.95.3 -gstabs+, native i686-pc-linux-gnu + # -- chastain 2003-02-03 + kfail "gdb/1023" "break myClass::performBlocking" + } + -re ".*$gdb_prompt $" { + fail "break myClass::performBlocking" + } + timeout { + fail "break myClass::performBlocking (timeout)" + } +} + +gdb_test \ + "break myClass::performUnblocking" \ + "Breakpoint $decimal at $hex: file .*$srcfile, line 10.*" + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/pr-1210.cc b/gdb/testsuite/gdb.cp/pr-1210.cc new file mode 100644 index 0000000..5747e5d --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr-1210.cc @@ -0,0 +1,19 @@ +class A +{ +}; + +class B : virtual public A +{ +}; + +class C : public A +{ + protected: + B myB; +}; + +int main() +{ + C *obj = new C(); + return 0; +} diff --git a/gdb/testsuite/gdb.cp/pr-1210.exp b/gdb/testsuite/gdb.cp/pr-1210.exp new file mode 100644 index 0000000..3ff850d --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr-1210.exp @@ -0,0 +1,76 @@ +# Copyright 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for PR gdb/1210. + +# This file is part of the gdb testsuite. + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "pr-1210" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_test "next" ".*return 0;" "step past initialization" + +gdb_test_multiple "print *obj" "" { + -re "Cannot access memory.*$gdb_prompt $" { + fail "print *obj" + } + -re " = { = {}, myB = { = {}.*}}\r\n$gdb_prompt $" { + pass "print *obj" + } +} + +gdb_test_multiple "print obj->myB" "" { + -re "Cannot access memory.*$gdb_prompt $" { + fail "print obj->myB" + } + -re " = { = {}.*}\r\n$gdb_prompt $" { + pass "print obj->myB" + } +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/pr-574.cc b/gdb/testsuite/gdb.cp/pr-574.cc new file mode 100644 index 0000000..eb06b61 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr-574.cc @@ -0,0 +1,22 @@ +/* + An attempt to replicate PR gdb/574 with a shorter program. + + Printing out *theB failed if the program was compiled with GCC 2.95. +*/ + +class A { +public: + virtual void foo() {}; // Stick in a virtual function. + int a; // Stick in a data member. +}; + +class B : public A { + static int b; // Stick in a static data member. +}; + +int main() +{ + B *theB = new B; + + return 0; // breakpoint: constructs-done +} diff --git a/gdb/testsuite/gdb.cp/pr-574.exp b/gdb/testsuite/gdb.cp/pr-574.exp new file mode 100644 index 0000000..5beacd1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr-574.exp @@ -0,0 +1,72 @@ +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for the bug mentioned in PR gdb/574. It's a bit +# idiosyncratic, so I gave it its own file. + +# 2002-08-16 David Carlton + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "pr-574" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# First, run to after we've constructed the object: + +gdb_breakpoint [gdb_get_line_number "constructs-done"] +gdb_continue_to_breakpoint "end of constructors" + +# This failed, as long as the code was compiled with GCC v. 2. + +# Different compilers order the data for differently, so I'm not +# matching the result exactly. + +gdb_test "print *theB" "\\$\[0-9\]* = { = {\[^}\]*}, static b = }" "PR gdb/574" + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/printmethod.cc b/gdb/testsuite/gdb.cp/printmethod.cc new file mode 100644 index 0000000..d32e1b1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/printmethod.cc @@ -0,0 +1,14 @@ +/* Create some objects, and try to print out their methods. */ + +class A { +public: + virtual void virt() {}; + void nonvirt() {}; +}; + +int main() +{ + A *theA = new A; + + return 0; // breakpoint: constructs-done +} diff --git a/gdb/testsuite/gdb.cp/printmethod.exp b/gdb/testsuite/gdb.cp/printmethod.exp new file mode 100644 index 0000000..a45393f --- /dev/null +++ b/gdb/testsuite/gdb.cp/printmethod.exp @@ -0,0 +1,69 @@ +# Copyright 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# This tries to print out methods of classes. + +# 2002-08-16 David Carlton + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "printmethod" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# First, run to after we've constructed the object: + +gdb_breakpoint [gdb_get_line_number "constructs-done"] +gdb_continue_to_breakpoint "end of constructors" + +# The first of these is for PR gdb/653. + +gdb_test "print theA->virt" "\\$\[0-9\]* = &A::virt\\((void|)\\)" "print virtual method." +gdb_test "print theA->nonvirt" "Cannot take address of a method" "print nonvirtual method." + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/psmang.exp b/gdb/testsuite/gdb.cp/psmang.exp new file mode 100644 index 0000000..31dd346 --- /dev/null +++ b/gdb/testsuite/gdb.cp/psmang.exp @@ -0,0 +1,226 @@ +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file is part of the gdb testsuite + +# Looking up methods by name, in programs with multiple compilation units. + +# ====== PLEASE BE VERY CAREFUL WHEN CHANGING THIS TEST. ===== +# +# The bug we're testing for (circa October 2002) is very sensitive to +# various conditions that are hard to control directly in the test +# suite. If you change the test, please revert this change, and make +# sure the test still fails: +# +# 2002-08-29 Jim Blandy +# +# * symtab.c (lookup_symbol_aux): In the cases where we find a +# minimal symbol of an appropriate name and use its address to +# select a symtab to read and search, use `name' (as passed to us) +# as the demangled name when searching the symtab's global and +# static blocks, not the minsym's name. +# +# The original bug was that you'd try to set a breakpoint on a method +# (e.g., `break s::method1'), and you'd get an error, but if you +# repeated the command, it would work the second time: +# +# (gdb) break s::method1 +# the class s does not have any method named method1 +# Hint: try 's::method1 or 's::method1 +# (Note leading single quote.) +# (gdb) break s::method1 +# Breakpoint 1 at 0x804841b: file psmang1.cc, line 13. +# (gdb) +# +# We observed this bug first using Stabs, and then using Dwarf 2. +# +# The problem was in lookup_symbol_aux: when looking up s::method1, it +# would fail to find it in any symtabs, find the minsym with the +# corresponding mangled name (say, `_ZN1S7method1Ev'), pass the +# minsym's address to find_pc_sect_symtab to look up the symtab +# (causing the compilation unit's full symbols to be read in), and +# then look up the symbol in that symtab's global block. All that is +# correct. However, it would pass the minsym's name as the NAME +# argument to lookup_block_symbol; a minsym's name is mangled, whereas +# lookup_block_symbol's NAME argument should be demangled. +# +# This is a pretty simple bug, but it turns out to be a bear to +# construct a test for. That's why this test case is so delicate. If +# you can see how to make it less so, please contribute a patch. +# +# Here are the twists: +# +# The bug only manifests itself when we call lookup_symbol to look up +# a method name (like "s::method1" or "s::method2"), and that method's +# definition is in a compilation unit for which we have read partial +# symbols, but not full symbols. The partial->full conversion must be +# caused by that specific lookup. (If we already have full symbols +# for the method's compilation unit, we won't need to look up the +# minsym, find the symtab for the minsym's address, and then call +# lookup_block_symbol; it's that last call where things go awry.) +# +# Now, when asked to set a breakpoint at `s::method1', GDB will first +# look up `s' to see if that is, in fact, the name of a class, and +# then look up 's::method1'. So we have to make sure that looking up +# `s' doesn't cause full symbols to be read for the compilation unit +# containing the definition of `s::method1'. +# +# The partial symbol tables for `psmang1.cc' and `psmang2.cc' will +# both have entries for `s'; GDB will read full symbols for whichever +# compilation unit's partial symbol table appears first in the +# objfile's list. The order in which compilation units appear in the +# partial symbol table list depends on how the program is linked, and +# how the debug info reader does the partial symbol scan. Ideally, +# the test shouldn't rely on them appearing in any particular order. +# +# So, since we don't know which compilation unit's full symbols are +# going to get read, we simply try looking up one method from each of +# the two compilation units. One of them has to come after the other +# in the partial symbol table list, so whichever comes later will +# still need its partial symbols read by the time we go to look up +# 's::methodX'. +# +# Second twist: don't move the common definition of `struct s' into a +# header file. If the compiler emits identical stabs for the +# #inclusion of that header file into psmang1.cc and into psmang2.cc, +# then the linker will do stabs compression, and replace one of the +# BINCL/EINCL regions with an EXCL stab, pointing to the other +# BINCL/EINCL region. GDB will read this, and record that the +# compilation unit that got the EXCL depends on the compilation unit +# that kept the BINCL/EINCL. Then, when it decides it needs to read +# full symbols for the former, it'll also read full symbols for the +# latter. Now, if it just so happens that the compilation unit that +# got the EXCL is also the first one with a definition of `s' in the +# partial symbol table list, then that first probe for `s' will cause +# both compilation units' full symbols to be read --- again defeating +# the test. +# +# We could work around this by having three compilation units, or by +# ensuring that the header file produces different stabs each time +# it's #included, but it seems simplest just to avoid compilation unit +# dependencies altogether, drop the header file, and duplicate the +# (pretty trivial) struct definition. +# +# Note that #including any header file at all into both compilation +# units --- say, --- could create this sort of dependency. +# +# This is the aspect of the test which the debug format is most likely +# to affect, I think. The different formats create different kinds of +# inter-CU dependencies, which could mask the bug. It might be +# possible for the test to check that at least one of the partial +# symtabs remains unread, and fail otherwise --- the failure +# indicating that the test itself isn't going to catch the bug it was +# meant to, not that GDB is misbehaving. +# +# Third twist: given the way lookup_block_symbol is written, it's +# possible to find the symbol even when it gets passed a mangled name +# for its NAME parameter. There are three ways lookup_block_symbol +# might search a block, depending on how it was constructed: +# +# linear search. In this case, this bug will never manifest itself, +# since we check every symbol against NAME using SYMBOL_MATCHES_NAME. +# Since that macro checks its second argument (NAME) against both the +# mangled and demangled names of the symbol, this will always find the +# symbol successfully, so, no bug. +# +# hash table. If both the mangled and demangled names hash to the +# same bucket, then you'll again find the symbol "by accident", since +# we search the entire bucket using SYMBOL_SOURCE_NAME. Since GDB +# chooses the number of buckets based on the number of symbols, small +# compilation units may have only one hash bucket; in this case, the +# search always succeeds, even though we hashed on the wrong name. +# This test works around that by having a lot of dummy variables, +# making it less likely that the mangled and demangled names fall in +# the same bucket. +# +# binary search. (GDB 5.2 produced these sorts of blocks, and this +# test tries to detect the bug there, but subsequent versions of GDB +# almost never build them, and they may soon be removed entirely.) In +# this case, the symbols in the block are sorted by their +# SYMBOL_SOURCE_NAME (whose behavior depends on the current demangling +# setting, so that's wrong, but let's try to stay focussed). +# lookup_block_symbol does a binary search comparing NAME with +# SYMBOL_SOURCE_NAME until the range has been narrowed down to only a +# few symbols; then it starts a linear search forward from the lower +# end of that range, until it reaches a symbol whose +# SYMBOL_SOURCE_NAME follows NAME in lexicographic order. This means +# that, if you're doing a binary search for a mangled name in a block +# sorted by SYMBOL_SOURCE_NAME, you might find the symbol `by +# accident' if the mangled and demangled names happen to fall near +# each other in the ordering. The initial version of this patch used +# a class called `S'; all the other symbols in the compilation unit +# started with lower-case letters, so the demangled name `S::method1' +# sorted at the same place as the mangled name `_ZN1S7method1Ev': at +# the very beginning. Using a lower-case 's' as the name ensures that +# the demangled name falls after all the dummy symbols introduced for +# the hash table, as described above. +# +# This is all so tortured, someone will probably come up with still +# other ways this test could fail to do its job. If you need to make +# revisions, please be very careful. + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# + +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "psmang" +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +if { [gdb_compile "${srcdir}/${subdir}/${testfile}1.cc" "${testfile}1.o" object {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcdir}/${subdir}/${testfile}2.cc" "${testfile}2.o" object {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${testfile}1.o ${testfile}2.o" ${binfile} executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "break s::method1" "Breakpoint .* at .*: file .*psmang1.cc.*" + +# We have to exit and restart GDB here, to make sure that all the +# compilation units are psymtabs again. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "break s::method2" "Breakpoint .* at .*: file .*psmang2.cc.*" diff --git a/gdb/testsuite/gdb.cp/psmang1.cc b/gdb/testsuite/gdb.cp/psmang1.cc new file mode 100644 index 0000000..19a9283 --- /dev/null +++ b/gdb/testsuite/gdb.cp/psmang1.cc @@ -0,0 +1,159 @@ +/* Do not move this definition into a header file! See the comments + in psmang.exp. */ +struct s +{ + int value; + void method1 (void); + void method2 (void); +}; + +void +s::method1 () +{ + value = 42; +} + +int +main (int argc, char **argv) +{ + s si; + + si.method1 (); + si.method2 (); +} + + +/* The presence of these variables ensures there will be so many + symbols in psmang1.cc's symtab's global block that it will have a + non-trivial hash table. When there are only a very few symbols, + the block only has one hash bucket, so even if we compute the hash + value for the wrong symbol name, we'll still find a symbol that + matches. */ +int ax; +int bx; +int a1x; +int b1x; +int a2x; +int b2x; +int a12x; +int b12x; +int a3x; +int b3x; +int a13x; +int b13x; +int a23x; +int b23x; +int a123x; +int b123x; +int a4x; +int b4x; +int a14x; +int b14x; +int a24x; +int b24x; +int a124x; +int b124x; +int a34x; +int b34x; +int a134x; +int b134x; +int a234x; +int b234x; +int a1234x; +int b1234x; +int a5x; +int b5x; +int a15x; +int b15x; +int a25x; +int b25x; +int a125x; +int b125x; +int a35x; +int b35x; +int a135x; +int b135x; +int a235x; +int b235x; +int a1235x; +int b1235x; +int a45x; +int b45x; +int a145x; +int b145x; +int a245x; +int b245x; +int a1245x; +int b1245x; +int a345x; +int b345x; +int a1345x; +int b1345x; +int a2345x; +int b2345x; +int a12345x; +int b12345x; +int a6x; +int b6x; +int a16x; +int b16x; +int a26x; +int b26x; +int a126x; +int b126x; +int a36x; +int b36x; +int a136x; +int b136x; +int a236x; +int b236x; +int a1236x; +int b1236x; +int a46x; +int b46x; +int a146x; +int b146x; +int a246x; +int b246x; +int a1246x; +int b1246x; +int a346x; +int b346x; +int a1346x; +int b1346x; +int a2346x; +int b2346x; +int a12346x; +int b12346x; +int a56x; +int b56x; +int a156x; +int b156x; +int a256x; +int b256x; +int a1256x; +int b1256x; +int a356x; +int b356x; +int a1356x; +int b1356x; +int a2356x; +int b2356x; +int a12356x; +int b12356x; +int a456x; +int b456x; +int a1456x; +int b1456x; +int a2456x; +int b2456x; +int a12456x; +int b12456x; +int a3456x; +int b3456x; +int a13456x; +int b13456x; +int a23456x; +int b23456x; +int a123456x; +int b123456x; diff --git a/gdb/testsuite/gdb.cp/psmang2.cc b/gdb/testsuite/gdb.cp/psmang2.cc new file mode 100644 index 0000000..b9b1bb5 --- /dev/null +++ b/gdb/testsuite/gdb.cp/psmang2.cc @@ -0,0 +1,152 @@ +#include + +/* Do not move this definition into a header file! See the comments + in psmang.exp. */ +struct s +{ + int value; + void method1 (void); + void method2 (void); +}; + +void +s::method2 (void) +{ + printf ("%d\n", value); +} + + +/* The presence of these variables ensures there will be so many + symbols in psmang2.cc's symtab's global block that it will have a + non-trivial hash table. When there are only a very few symbols, + the block only has one hash bucket, so even if we compute the hash + value for the wrong symbol name, we'll still find a symbol that + matches. */ +int a; +int b; +int a1; +int b1; +int a2; +int b2; +int a12; +int b12; +int a3; +int b3; +int a13; +int b13; +int a23; +int b23; +int a123; +int b123; +int a4; +int b4; +int a14; +int b14; +int a24; +int b24; +int a124; +int b124; +int a34; +int b34; +int a134; +int b134; +int a234; +int b234; +int a1234; +int b1234; +int a5; +int b5; +int a15; +int b15; +int a25; +int b25; +int a125; +int b125; +int a35; +int b35; +int a135; +int b135; +int a235; +int b235; +int a1235; +int b1235; +int a45; +int b45; +int a145; +int b145; +int a245; +int b245; +int a1245; +int b1245; +int a345; +int b345; +int a1345; +int b1345; +int a2345; +int b2345; +int a12345; +int b12345; +int a6; +int b6; +int a16; +int b16; +int a26; +int b26; +int a126; +int b126; +int a36; +int b36; +int a136; +int b136; +int a236; +int b236; +int a1236; +int b1236; +int a46; +int b46; +int a146; +int b146; +int a246; +int b246; +int a1246; +int b1246; +int a346; +int b346; +int a1346; +int b1346; +int a2346; +int b2346; +int a12346; +int b12346; +int a56; +int b56; +int a156; +int b156; +int a256; +int b256; +int a1256; +int b1256; +int a356; +int b356; +int a1356; +int b1356; +int a2356; +int b2356; +int a12356; +int b12356; +int a456; +int b456; +int a1456; +int b1456; +int a2456; +int b2456; +int a12456; +int b12456; +int a3456; +int b3456; +int a13456; +int b13456; +int a23456; +int b23456; +int a123456; +int b123456; diff --git a/gdb/testsuite/gdb.cp/ref-types.cc b/gdb/testsuite/gdb.cp/ref-types.cc new file mode 100644 index 0000000..23cc510 --- /dev/null +++ b/gdb/testsuite/gdb.cp/ref-types.cc @@ -0,0 +1,79 @@ +int main2(void); + +void marker1 (void) +{ + +} + + + +int main(void) +{ + short s; + short &rs = s; + short *ps; + short *&rps = ps; + short as[4]; + short (&ras)[4] = as; + s = -1; + ps = &s; + as[0] = 0; + as[1] = 1; + as[2] = 2; + as[3] = 3; + + #ifdef usestubs + set_debug_traps(); + breakpoint(); + #endif + marker1(); + + main2(); + + return 0; +} + +int f() +{ + int f1; + f1 = 1; + return f1; +} + +int main2(void) +{ + char C; + unsigned char UC; + short S; + unsigned short US; + int I; + unsigned int UI; + long L; + unsigned long UL; + float F; + double D; + char &rC = C; + unsigned char &rUC = UC; + short &rS = S; + unsigned short &rUS = US; + int &rI = I; + unsigned int &rUI = UI; + long &rL = L; + unsigned long &rUL = UL; + float &rF = F; + double &rD = D; + C = 'A'; + UC = 21; + S = -14; + US = 7; + I = 102; + UI = 1002; + L = -234; + UL = 234; + F = 1.25E10; + D = -1.375E-123; + I = f(); + + return 0; + +} diff --git a/gdb/testsuite/gdb.cp/ref-types.exp b/gdb/testsuite/gdb.cp/ref-types.exp new file mode 100644 index 0000000..dd06f02 --- /dev/null +++ b/gdb/testsuite/gdb.cp/ref-types.exp @@ -0,0 +1,663 @@ +# Tests for reference types with short type variables in GDB. +# Copyright 1998, 1999, 2000 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# written by Elena Zannoni (ezannoni@cygnus.com) + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if { [skip_cplus_tests] } { continue } + +set testfile "ref-types" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +if ![runto 'marker1'] then { + perror "couldn't run to marker1" + continue +} + +gdb_test "up" ".*main.*" "up from marker1 1" + +proc gdb_start_again {} { + global srcdir + global subdir + global binfile + global gdb_prompt + global decimal + + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + + source ${binfile}.ci + + # + # set it up at a breakpoint so we can play with the variable values + # + if ![runto_main] then { + perror "couldn't run to breakpoint" + continue + } + + if ![runto 'marker1'] then { + perror "couldn't run to marker1" + continue + } + + gdb_test "up" ".*main.*" "up from marker1 2" +} + + + +send_gdb "print s\n" +gdb_expect { + -re ".\[0-9\]* = -1.*$gdb_prompt $" { + pass "print value of s" + } + -re ".*$gdb_prompt $" { fail "print value of s" } + timeout { fail "(timeout) print value of s" } + } + + +send_gdb "ptype s\n" +gdb_expect { + -re "type = short.*$gdb_prompt $" { pass "ptype s" } + -re ".*$gdb_prompt $" { fail "ptype s" } + timeout { fail "(timeout) ptype s" } +} + + +send_gdb "print *ps\n" +gdb_expect { + -re ".\[0-9\]* = -1.*$gdb_prompt $" { + pass "print value of ps" + } + -re ".*$gdb_prompt $" { fail "print value of ps" } + timeout { fail "(timeout) print value of ps" } + } + + +send_gdb "ptype ps\n" +gdb_expect { + -re "type = short \*.*$gdb_prompt $" { pass "ptype ps" } + -re ".*$gdb_prompt $" { fail "ptype ps" } + timeout { fail "(timeout) ptype ps" } +} + +send_gdb "print as\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of as\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of as\[0\]" } + timeout { fail "(timeout) print value of as\[0\]" } + } + + +send_gdb "ptype as\n" +gdb_expect { + -re "type = short \\\[4\\\].*$gdb_prompt $" { pass "ptype as" } + -re "type = short int \\\[4\\\].*$gdb_prompt $" { pass "ptype as" } + -re ".*$gdb_prompt $" { fail "ptype as" } + timeout { fail "(timeout) ptype as" } +} + +send_gdb "print as\[1\]\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of as\[1\]" + } + -re ".*$gdb_prompt $" { fail "print value of as\[1\]" } + timeout { fail "(timeout) print value of as\[1\]" } + } + +send_gdb "print as\[2\]\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of as\[2\]" + } + -re ".*$gdb_prompt $" { fail "print value of as\[2\]" } + timeout { fail "(timeout) print value of as\[2\]" } + } + +send_gdb "print as\[3\]\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of as\[3\]" + } + -re ".*$gdb_prompt $" { fail "print value of as\[3\]" } + timeout { fail "(timeout) print value of as\[3\]" } + } + +send_gdb "print rs\n" +gdb_expect { + -re ".\[0-9\]* = \\(short &\\) @$hex: -1.*$gdb_prompt $" { + pass "print value of rs" + } + -re ".\[0-9\]* = \\(short int &\\) @$hex: -1.*$gdb_prompt $" { + pass "print value of rs" + } + -re ".*$gdb_prompt $" { fail "print value of rs" } + timeout { fail "(timeout) print value of rs" } + eof { fail "print rs ($GDB dumped core) (FIXME)" ; gdb_start_again ; } + + } + +send_gdb "ptype rs\n" +gdb_expect { + -re "type = short &.*$gdb_prompt $" { pass "ptype rs" } + -re "type = short int &.*$gdb_prompt $" { pass "ptype rs" } + -re ".*$gdb_prompt $" { fail "ptype rs" } + timeout { fail "(timeout) ptype rs" } +} + + +send_gdb "print *rps\n" +gdb_expect { + -re ".\[0-9\]* = -1.*$gdb_prompt $" { + pass "print value of *rps" + } + -re ".*$gdb_prompt $" { fail "print value of *rps" } + timeout { fail "(timeout) print value of *rps" } + } + + +send_gdb "ptype rps\n" +gdb_expect { + -re "type = short \\*&.*$gdb_prompt $" { pass "ptype rps" } + -re "type = short int \\*&.*$gdb_prompt $" { pass "ptype rps" } + -re ".*$gdb_prompt $" { fail "ptype rps" } + timeout { fail "(timeout) ptype rps" } +} + + + +send_gdb "print ras\[0\]\n" +gdb_expect { + -re ".\[0-9\]* = 0.*$gdb_prompt $" { + pass "print value of ras\[0\]" + } + -re ".*$gdb_prompt $" { fail "print value of ras\[0\]" } + timeout { fail "(timeout) print value of ras\[0\]" } + } + + +send_gdb "ptype ras\n" +gdb_expect { + -re "type = short \\\(&\\\)\\\[4\\\].*$gdb_prompt $" { pass "ptype ras" } + -re "type = short int \\\(&\\\)\\\[4\\\].*$gdb_prompt $" { pass "ptype ras" } + -re ".*$gdb_prompt $" { fail "ptype ras" } + timeout { fail "(timeout) ptype ras" } +} + +send_gdb "print ras\[1\]\n" +gdb_expect { + -re ".\[0-9\]* = 1.*$gdb_prompt $" { + pass "print value of ras\[1\]" + } + -re ".*$gdb_prompt $" { fail "print value of ras\[1\]" } + timeout { fail "(timeout) print value of ras\[1\]" } + } + +send_gdb "print ras\[2\]\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of ras\[2\]" + } + -re ".*$gdb_prompt $" { fail "print value of ras\[2\]" } + timeout { fail "(timeout) print value of ras\[2\]" } + } + +send_gdb "print ras\[3\]\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of ras\[3\]" + } + -re ".*$gdb_prompt $" { fail "print value of ras\[3\]" } + timeout { fail "(timeout) print value of ras\[3\]" } + } + + +if ![runto 'f'] then { + perror "couldn't run to f" + continue +} + +gdb_test "up" ".main2.*" "up from f" + +send_gdb "print C\n" +gdb_expect { + -re ".\[0-9\]* = 65 \'A\'.*$gdb_prompt $" { + pass "print value of C" + } + -re ".*$gdb_prompt $" { fail "print value of C" } + timeout { fail "(timeout) print value of C" } + } + + +send_gdb "ptype C\n" +gdb_expect { + -re "type = char.*$gdb_prompt $" { pass "ptype C" } + -re ".*$gdb_prompt $" { fail "ptype C" } + timeout { fail "(timeout) ptype C" } +} + + +send_gdb "print UC\n" +gdb_expect { + -re ".\[0-9\]* = 21 '\.025'\.*$gdb_prompt $" { + pass "print value of UC" + } + -re ".*$gdb_prompt $" { fail "print value of UC" } + timeout { fail "(timeout) print value of UC" } + } + + +send_gdb "ptype UC\n" +gdb_expect { + -re "type = unsigned char.*$gdb_prompt $" { pass "ptype UC" } + -re ".*$gdb_prompt $" { fail "ptype UC" } + timeout { fail "(timeout) ptype UC" } +} + + +send_gdb "print S\n" +gdb_expect { + -re ".\[0-9\]* = -14.*$gdb_prompt $" { + pass "print value of S" + } + -re ".*$gdb_prompt $" { fail "print value of S" } + timeout { fail "(timeout) print value of S" } + } + + +send_gdb "ptype S\n" +gdb_expect { + -re "type = short.*$gdb_prompt $" { pass "ptype S" } + -re ".*$gdb_prompt $" { fail "ptype S" } + timeout { fail "(timeout) ptype S" } +} + + +send_gdb "print US\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of US" + } + -re ".*$gdb_prompt $" { fail "print value of US" } + timeout { fail "(timeout) print value of US" } + } + + +send_gdb "ptype US\n" +gdb_expect { + -re "type = unsigned short.*$gdb_prompt $" { pass "ptype US" } + -re "type = short unsigned.*$gdb_prompt $" { pass "ptype US" } + -re ".*$gdb_prompt $" { fail "ptype US" } + timeout { fail "(timeout) ptype US" } +} + + +send_gdb "print I\n" +gdb_expect { + -re ".\[0-9\]* = 102.*$gdb_prompt $" { + pass "print value of I" + } + -re ".*$gdb_prompt $" { fail "print value of I" } + timeout { fail "(timeout) print value of I" } + } + + +send_gdb "ptype I\n" +gdb_expect { + -re "type = int.*$gdb_prompt $" { pass "ptype I" } + -re ".*$gdb_prompt $" { fail "ptype I" } + timeout { fail "(timeout) ptype I" } +} + + +send_gdb "print UI\n" +gdb_expect { + -re ".\[0-9\]* = 1002.*$gdb_prompt $" { + pass "print value of UI" + } + -re ".*$gdb_prompt $" { fail "print value of UI" } + timeout { fail "(timeout) print value of UI" } + } + + +send_gdb "ptype UI\n" +gdb_expect { + -re "type = unsigned int.*$gdb_prompt $" { pass "ptype UI" } + -re ".*$gdb_prompt $" { fail "ptype UI" } + timeout { fail "(timeout) ptype UI" } +} + + +send_gdb "print L\n" +gdb_expect { + -re ".\[0-9\]* = -234.*$gdb_prompt $" { + pass "print value of L" + } + -re ".*$gdb_prompt $" { fail "print value of L" } + timeout { fail "(timeout) print value of L" } + } + + +send_gdb "ptype L\n" +gdb_expect { + -re "type = long.*$gdb_prompt $" { pass "ptype L" } + -re ".*$gdb_prompt $" { fail "ptype L" } + timeout { fail "(timeout) ptype L" } +} + + +send_gdb "print UL\n" +gdb_expect { + -re ".\[0-9\]* = 234.*$gdb_prompt $" { + pass "print value of UL" + } + -re ".*$gdb_prompt $" { fail "print value of UL" } + timeout { fail "(timeout) print value of UL" } + } + + +send_gdb "ptype UL\n" +gdb_expect { + -re "type = unsigned long.*$gdb_prompt $" { pass "ptype UL" } + -re "type = long unsigned.*$gdb_prompt $" { pass "ptype UL" } + -re ".*$gdb_prompt $" { fail "ptype UL" } + timeout { fail "(timeout) ptype UL" } +} + + +send_gdb "print F\n" +gdb_expect { + -re ".\[0-9\]* = 1.2\[0-9\]*e\\+10.*$gdb_prompt $" { + pass "print value of F" + } + -re ".*$gdb_prompt $" { fail "print value of F" } + timeout { fail "(timeout) print value of F" } + } + + + +send_gdb "ptype F\n" +gdb_expect { + -re "type = float.*$gdb_prompt $" { pass "ptype F" } + -re ".*$gdb_prompt $" { fail "ptype F" } + timeout { fail "(timeout) ptype F" } +} + + +send_gdb "print D\n" +gdb_expect { + -re ".\[0-9\]* = -1.375e-123.*$gdb_prompt $" { + pass "print value of D" + } + -re ".*$gdb_prompt $" { fail "print value of D" } + timeout { fail "(timeout) print value of D" } + } + + +send_gdb "ptype D\n" +gdb_expect { + -re "type = double.*$gdb_prompt $" { pass "ptype D" } + -re ".*$gdb_prompt $" { fail "ptype D" } + timeout { fail "(timeout) ptype D" } +} + + + +# +# test reference types +# + + + + +send_gdb "ptype rC\n" +gdb_expect { + -re "type = char &.*$gdb_prompt $" { pass "ptype rC" } + -re ".*$gdb_prompt $" { fail "ptype rC" } + timeout { fail "(timeout) ptype rC" } +} + + + + +send_gdb "ptype rUC\n" +gdb_expect { + -re "type = unsigned char &.*$gdb_prompt $" { pass "ptype rUC" } + -re ".*$gdb_prompt $" { fail "ptype rUC" } + timeout { fail "(timeout) ptype rUC" } +} + + + +send_gdb "ptype rS\n" +gdb_expect { + -re "type = short &.*$gdb_prompt $" { pass "ptype rS" } + -re "type = short int &.*$gdb_prompt $" { pass "ptype rS" } + -re ".*$gdb_prompt $" { fail "ptype rS" } + timeout { fail "(timeout) ptype rS" } +} + + + +send_gdb "ptype rUS\n" +gdb_expect { + -re "type = unsigned short &.*$gdb_prompt $" { pass "ptype rUS" } + -re "type = short unsigned int &.*$gdb_prompt $" { pass "ptype rUS" } + -re ".*$gdb_prompt $" { fail "ptype rUS" } + timeout { fail "(timeout) ptype rUS" } +} + + +send_gdb "ptype rI\n" +gdb_expect { + -re "type = int &.*$gdb_prompt $" { pass "ptype rI" } + -re ".*$gdb_prompt $" { fail "ptype rI" } + timeout { fail "(timeout) ptype rI" } +} + + + +send_gdb "ptype rUI\n" +gdb_expect { + -re "type = unsigned int &.*$gdb_prompt $" { pass "ptype rUI" } + -re ".*$gdb_prompt $" { fail "ptype rUI" } + timeout { fail "(timeout) ptype rUI" } +} + + + +send_gdb "ptype rL\n" +gdb_expect { + -re "type = long &.*$gdb_prompt $" { pass "ptype rL" } + -re "type = long int &.*$gdb_prompt $" { pass "ptype rL" } + -re ".*$gdb_prompt $" { fail "ptype rL" } + timeout { fail "(timeout) ptype rL" } +} + + +send_gdb "ptype rUL\n" +gdb_expect { + -re "type = unsigned long &.*$gdb_prompt $" { pass "ptype rUL" } + -re "type = long unsigned int &.*$gdb_prompt $" { pass "ptype rUL" } + -re ".*$gdb_prompt $" { fail "ptype rUL" } + timeout { fail "(timeout) ptype rUL" } +} + + +send_gdb "ptype rF\n" +gdb_expect { + -re "type = float &.*$gdb_prompt $" { pass "ptype rF" } + -re ".*$gdb_prompt $" { fail "ptype rF" } + timeout { fail "(timeout) ptype rF" } +} + + +send_gdb "ptype rD\n" +gdb_expect { + -re "type = double &.*$gdb_prompt $" { pass "ptype rD" } + -re ".*$gdb_prompt $" { fail "ptype rD" } + timeout { fail "(timeout) ptype rD" } +} + + +send_gdb "print rC\n" +gdb_expect { + -re ".\[0-9\]* = \\(char &\\) @$hex: 65 \'A\'.*$gdb_prompt $" { + pass "print value of rC" + } + -re ".*$gdb_prompt $" { fail "print value of rC" } + timeout { fail "(timeout) print value of rC" } + } + + +send_gdb "print rUC\n" +gdb_expect { + -re ".\[0-9\]* = \\(unsigned char &\\) @$hex: 21 \'.025\'.*$gdb_prompt $" { + pass "print value of rUC" + } + -re ".*$gdb_prompt $" { fail "print value of rUC" } + timeout { fail "(timeout) print value of rUC" } + } + + +send_gdb "print rS\n" +gdb_expect { + -re ".\[0-9\]* = \\(short &\\) @$hex: -14.*$gdb_prompt $" { + pass "print value of rS" + } + -re ".\[0-9\]* = \\(short int &\\) @$hex: -14.*$gdb_prompt $" { + pass "print value of rS" + } + -re ".*$gdb_prompt $" { fail "print value of rS" } + timeout { fail "(timeout) print value of rS" } + } + + +send_gdb "print rUS\n" +gdb_expect { + -re ".\[0-9\]* = \\(unsigned short &\\) @$hex: 7.*$gdb_prompt $" { + pass "print value of rUS" + } + -re ".\[0-9\]* = \\(short unsigned int &\\) @$hex: 7.*$gdb_prompt $" { + pass "print value of rUS" + } + -re ".*$gdb_prompt $" { fail "print value of rUS" } + timeout { fail "(timeout) print value of rUS" } + } + + +send_gdb "print rI\n" +gdb_expect { + -re ".\[0-9\]* = \\(int &\\) @$hex: 102.*$gdb_prompt $" { + pass "print value of rI" + } + -re ".*$gdb_prompt $" { fail "print value of rI" } + timeout { fail "(timeout) print value of rI" } + } + + +send_gdb "print rUI\n" +gdb_expect { + -re ".\[0-9\]* = \\(unsigned int &\\) @$hex: 1002.*$gdb_prompt $" { + pass "print value of UI" + } + -re ".*$gdb_prompt $" { fail "print value of rUI" } + timeout { fail "(timeout) print value of rUI" } + } + + +send_gdb "print rL\n" +gdb_expect { + -re ".\[0-9\]* = \\(long &\\) @$hex: -234.*$gdb_prompt $" { + pass "print value of rL" + } + -re ".\[0-9\]* = \\(long int &\\) @$hex: -234.*$gdb_prompt $" { + pass "print value of rL" + } + -re ".*$gdb_prompt $" { fail "print value of rL" } + timeout { fail "(timeout) print value of rL" } + } + + + +send_gdb "print rUL\n" +gdb_expect { + -re ".\[0-9\]* = \\(unsigned long &\\) @$hex: 234.*$gdb_prompt $" { + pass "print value of rUL" + } + -re ".\[0-9\]* = \\(long unsigned int &\\) @$hex: 234.*$gdb_prompt $" { + pass "print value of rUL" + } + -re ".*$gdb_prompt $" { fail "print value of rUL" } + timeout { fail "(timeout) print value of rUL" } + } + + +send_gdb "print rF\n" +gdb_expect { + -re ".\[0-9\]* = \\(float &\\) @$hex: 1.2\[0-9\]*e\\+10.*$gdb_prompt $" { + pass "print value of rF" + } + -re ".*$gdb_prompt $" { fail "print value of rF" } + timeout { fail "(timeout) print value of rF" } + } + + +send_gdb "print rD\n" +gdb_expect { + -re ".\[0-9\]* = \\(double &\\) @$hex: -1.375e-123.*$gdb_prompt $" { + pass "print value of rD" + } + -re ".*$gdb_prompt $" { fail "print value of rD" } + timeout { fail "(timeout) print value of rD" } + } + diff --git a/gdb/testsuite/gdb.cp/rtti.exp b/gdb/testsuite/gdb.cp/rtti.exp new file mode 100644 index 0000000..f99637a --- /dev/null +++ b/gdb/testsuite/gdb.cp/rtti.exp @@ -0,0 +1,127 @@ +# Copyright 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# This file is part of the gdb testsuite. + +# This contains tests for GDB's use of RTTI information. This stems +# from a bug reported in PR gdb/488 and other places, which leads to +# statements like 'warning: can't find class named 'C::D', as given by +# C++ RTTI'. It arises from GDB not knowing about classes that are +# defined in namespaces. + +# NOTE: carlton/2003-05-16: I suspect it could arise from nested class +# issues, too, and even once we fix that, there might be situations +# (involving templates, in particular) where this problem triggers +# because GDB and GCC have different ideas what a class is called. + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "rtti" +set srcfile1 "${srcdir}/${subdir}/${testfile}1.cc" +set objfile1 "${objdir}/${subdir}/${testfile}1.o" +set srcfile2 "${srcdir}/${subdir}/${testfile}2.cc" +set objfile2 "${objdir}/${subdir}/${testfile}2.o" +set binfile ${objdir}/${subdir}/${testfile} + +# gdb_get_line_number needs this to be called srcfile. +set srcfile "${srcfile1}" + +if { [gdb_compile "${srcfile1}" "${objfile1}" object {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${srcfile2}" "${objfile2}" object {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if { [gdb_compile "${objfile1} ${objfile2}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +# First, run to after we've constructed the object: + +gdb_breakpoint [gdb_get_line_number "constructs-done"] +gdb_continue_to_breakpoint "end of constructors" + +gdb_test_multiple "print *e1" "print *e1" { + -re "warning: can't find class named `n1::D1', as given by C\\+\\+ RTTI.*$gdb_prompt $" { + kfail "gdb/488" "print *e1" + } + -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { + pass "print *e1" + } + -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { + # NOTE: carlton/2003-05-16: If code is compiled by GCC2, we + # don't print the warning (for no particular reason), but we + # still call the class via the wrong name; PR gdb/57 is our + # catch-all PR for nested type problems. + kfail "gdb/57" "print *e1" + } +} + +# NOTE: carlton/2003-05-16: This test fails on my branch with an +# "" message because, within rtt1.cc, GDB has no way +# of knowing that the class is called 'n2::D2' instead of just 'D2'. +# This is an artifical test case, though: if we were using these +# classes in a more substantial way, G++ would emit more debug info. +# As is, I don't think there's anything that GDB can do about this +# case until G++ starts emitting DW_TAG_namespace info; when that part +# of the branch gets merged in, then we'll probably want to convert +# that fail branch to an xfail. + +gdb_test_multiple "print *e2" "print *e2" { + -re "warning: can't find class named `n2::D2', as given by C\\+\\+ RTTI.*$gdb_prompt $" { + kfail "gdb/488" "print *e2" + } + -re "\\$\[0-9\]* = \r\n$gdb_prompt $" { + # See above NOTE. + fail "print *e2" + } + -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { + pass "print *e2" + } + -re "\\$\[0-9\]* = { = .*}\r\n$gdb_prompt $" { + kfail "gdb/57" "print *e2" + } +} + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/rtti.h b/gdb/testsuite/gdb.cp/rtti.h new file mode 100644 index 0000000..879896d --- /dev/null +++ b/gdb/testsuite/gdb.cp/rtti.h @@ -0,0 +1,48 @@ +/* Code to go along with tests in rtti.exp. + + Copyright 2003 Free Software Foundation, Inc. + + Contributed by David Carlton and by Kealia, + Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +namespace n2 { + + class C2; + + class Base2 { + public: + virtual ~Base2() { } + }; + + + class C2: public Base2 { + public: + }; + + class D2 : public C2{ + public: + D2(C2 *, C2 *); + + C2* expr_1_; + C2* expr_2_; + }; + + extern C2 *create2(); +} diff --git a/gdb/testsuite/gdb.cp/rtti1.cc b/gdb/testsuite/gdb.cp/rtti1.cc new file mode 100644 index 0000000..6e9d862 --- /dev/null +++ b/gdb/testsuite/gdb.cp/rtti1.cc @@ -0,0 +1,67 @@ +/* Code to go along with tests in rtti.exp. + + Copyright 2003 Free Software Foundation, Inc. + + Contributed by David Carlton and by Kealia, + Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "rtti.h" + +namespace n1 { + + class C1; + + class Base1 { + public: + virtual ~Base1() { } + }; + + + class C1: public Base1 { + public: + }; + + class D1 : public C1{ + public: + D1(C1 *, C1 *); + + C1* expr_1_; + C1* expr_2_; + }; + + D1::D1(C1 *expr_1, C1 *expr_2) + : expr_1_(expr_1), expr_2_(expr_2) { } + + C1 *create1() { + return new D1(0, 0); + } + +} // n1 + +int main() +{ + using namespace n1; + using namespace n2; + + C1 *e1 = create1(); + C2 *e2 = create2(); + + return 0; // constructs-done +} diff --git a/gdb/testsuite/gdb.cp/rtti2.cc b/gdb/testsuite/gdb.cp/rtti2.cc new file mode 100644 index 0000000..8bb1ed6 --- /dev/null +++ b/gdb/testsuite/gdb.cp/rtti2.cc @@ -0,0 +1,36 @@ +/* Code to go along with tests in rtti.exp. + + Copyright 2003 Free Software Foundation, Inc. + + Contributed by David Carlton and by Kealia, + Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "rtti.h" + +namespace n2 { + + D2::D2(C2 *expr_1, C2 *expr_2) + : expr_1_(expr_1), expr_2_(expr_2) { } + + C2 *create2() { + return new D2(0, 0); + } + +} diff --git a/gdb/testsuite/gdb.cp/templates.cc b/gdb/testsuite/gdb.cp/templates.cc new file mode 100644 index 0000000..c13f18b --- /dev/null +++ b/gdb/testsuite/gdb.cp/templates.cc @@ -0,0 +1,785 @@ +/* This test code is from Wendell Baker (wbaker@comet.berkeley.edu) */ + +#include + +int a_i; +char a_c; +double a_d; + +typedef void *Pix; + +int +f(int i) +{ return 0; } + +int +f(int i, char c) +{ return 0; } + +int +f(int i, char c, double d) +{ return 0; } + +int +f(int i, char c, double d, char *cs) +{ return 0; } + +int +f(int i, char c, double d, char *cs, void (*fig)(int, char)) +{ return 0; } + +int +f(int i, char c, double d, char *cs, void (*fig)(char, int)) +{ return 0; } + +class R { +public: + int i; +}; +class S { +public: + int i; +}; +class T { +public: + int i; +}; + +char g(char, const char, volatile char) +{ return 'c'; } +char g(R, char&, const char&, volatile char&) +{ return 'c'; } +char g(char*, const char*, volatile char*) +{ return 'c'; } +char g(S, char*&, const char*&, volatile char*&) +{ return 'c'; } + +signed char g(T,signed char, const signed char, volatile signed char) +{ return 'c'; } +signed char g(T, R, signed char&, const signed char&, volatile signed char&) +{ return 'c'; } +signed char g(T, signed char*, const signed char*, volatile signed char*) +{ return 'c'; } +signed char g(T, S, signed char*&, const signed char*&, volatile signed char*&) +{ return 'c'; } + +unsigned char g(unsigned char, const unsigned char, volatile unsigned char) +{ return 'c'; } +unsigned char g(R, unsigned char&, const unsigned char&, volatile unsigned char&) +{ return 'c'; } +unsigned char g(unsigned char*, const unsigned char*, volatile unsigned char*) +{ return 'c'; } +unsigned char g(S, unsigned char*&, const unsigned char*&, volatile unsigned char*&) +{ return 'c'; } + +short g(short, const short, volatile short) +{ return 0; } +short g(R, short&, const short&, volatile short&) +{ return 0; } +short g(short*, const short*, volatile short*) +{ return 0; } +short g(S, short*&, const short*&, volatile short*&) +{ return 0; } + +signed short g(T, signed short, const signed short, volatile signed short) +{ return 0; } +signed short g(T, R, signed short&, const signed short&, volatile signed short&) +{ return 0; } +signed short g(T, signed short*, const signed short*, volatile signed short*) +{ return 0; } +signed short g(T, S, double, signed short*&, const signed short*&, volatile signed short*&) +{ return 0; } + +unsigned short g(unsigned short, const unsigned short, volatile unsigned short) +{ return 0; } +unsigned short g(R, unsigned short&, const unsigned short&, volatile unsigned short&) +{ return 0; } +unsigned short g(unsigned short*, const unsigned short*, volatile unsigned short*) +{ return 0; } +unsigned short g(S, unsigned short*&, const unsigned short*&, volatile unsigned short*&) +{ return 0; } + +int g(int, const int, volatile int) +{ return 0; } +int g(R, int&, const int&, volatile int&) +{ return 0; } +int g(int*, const int*, volatile int*) +{ return 0; } +int g(S, int*&, const int*&, volatile int*&) +{ return 0; } + +signed int g(T, signed int, const signed int, volatile signed int) +{ return 0; } +signed int g(T, R, signed int&, const signed int&, volatile signed int&) +{ return 0; } +signed int g(T, signed int*, const signed int*, volatile signed int*) +{ return 0; } +signed int g(T, S, signed int*&, const signed int*&, volatile signed int*&) +{ return 0; } + +unsigned int g(unsigned int, const unsigned int, volatile unsigned int) +{ return 0; } +unsigned int g(R, unsigned int&, const unsigned int&, volatile unsigned int&) +{ return 0; } +unsigned int g(unsigned int*, const unsigned int*, volatile unsigned int*) +{ return 0; } +unsigned int g(S, unsigned int*&, const unsigned int*&, volatile unsigned int*&) +{ return 0; } + +long g(long, const long, volatile long) +{ return 0; } +long g(R, long&, const long&, volatile long&) +{ return 0; } +long g(long*, const long*, volatile long*) +{ return 0; } +long g(S, long*&, const long*&, volatile long*&) +{ return 0; } + +signed long g(T, signed long, const signed long, volatile signed long) +{ return 0; } +signed long g(T, R, signed long&, const signed long&, volatile signed long&) +{ return 0; } +signed long g(T, signed long*, const signed long*, volatile signed long*) +{ return 0; } +signed long g(T, S, signed long*&, const signed long*&, volatile signed long*&) +{ return 0; } + +unsigned long g(unsigned long, const unsigned long, volatile unsigned long) +{ return 0; } +unsigned long g(S, unsigned long&, const unsigned long&, volatile unsigned long&) +{ return 0; } +unsigned long g(unsigned long*, const unsigned long*, volatile unsigned long*) +{ return 0; } +unsigned long g(S, unsigned long*&, const unsigned long*&, volatile unsigned long*&) +{ return 0; } + +#ifdef __GNUC__ +long long g(long long, const long long, volatile long long) +{ return 0; } +long long g(S, long long&, const long long&, volatile long long&) +{ return 0; } +long long g(long long*, const long long*, volatile long long*) +{ return 0; } +long long g(R, long long*&, const long long*&, volatile long long*&) +{ return 0; } + +signed long long g(T, signed long long, const signed long long, volatile signed long long) +{ return 0; } +signed long long g(T, R, signed long long&, const signed long long&, volatile signed long long&) +{ return 0; } +signed long long g(T, signed long long*, const signed long long*, volatile signed long long*) +{ return 0; } +signed long long g(T, S, signed long long*&, const signed long long*&, volatile signed long long*&) +{ return 0; } + +unsigned long long g(unsigned long long, const unsigned long long, volatile unsigned long long) +{ return 0; } +unsigned long long g(R, unsigned long long*, const unsigned long long*, volatile unsigned long long*) +{ return 0; } +unsigned long long g(unsigned long long&, const unsigned long long&, volatile unsigned long long&) +{ return 0; } +unsigned long long g(S, unsigned long long*&, const unsigned long long*&, volatile unsigned long long*&) +{ return 0; } +#endif + +float g(float, const float, volatile float) +{ return 0; } +float g(char, float&, const float&, volatile float&) +{ return 0; } +float g(float*, const float*, volatile float*) +{ return 0; } +float g(char, float*&, const float*&, volatile float*&) +{ return 0; } + +double g(double, const double, volatile double) +{ return 0; } +double g(char, double&, const double&, volatile double&) +{ return 0; } +double g(double*, const double*, volatile double*) +{ return 0; } +double g(char, double*&, const double*&, volatile double*&) +{ return 0; } + +#ifdef __GNUC__ +long double g(long double, const long double, volatile long double) +{ return 0; } +long double g(char, long double&, const long double&, volatile long double&) +{ return 0; } +long double g(long double*, const long double*, volatile long double*) +{ return 0; } +long double g(char, long double*&, const long double*&, volatile long double*&) +{ return 0; } +#endif + +class c { +public: + c(int) {}; + int i; +}; + +class c g(c, const c, volatile c) +{ return 0; } +c g(char, c&, const c&, volatile c&) +{ return 0; } +c g(c*, const c*, volatile c*) +{ return 0; } +c g(char, c*&, const c*&, volatile c*&) +{ return 0; } + +/* +void h(char = 'a') +{ } +void h(char, signed char = 'a') +{ } +void h(unsigned char = 'a') +{ } +*/ +/* +void h(char = (char)'a') +{ } +void h(char, signed char = (signed char)'a') +{ } +void h(unsigned char = (unsigned char)'a') +{ } + + +void h(short = (short)43) +{ } +void h(char, signed short = (signed short)43) +{ } +void h(unsigned short = (unsigned short)43) +{ } + +void h(int = (int)43) +{ } +void h(char, signed int = (signed int)43) +{ } +void h(unsigned int = (unsigned int)43) +{ } + + +void h(long = (long)43) +{ } +void h(char, signed long = (signed long)43) +{ } +void h(unsigned long = (unsigned long)43) +{ } + +#ifdef __GNUC__ +void h(long long = 43) +{ } +void h(char, signed long long = 43) +{ } +void h(unsigned long long = 43) +{ } +#endif + +void h(float = 4.3e-10) +{ } +void h(double = 4.3) +{ } +#ifdef __GNUC__ +void h(long double = 4.33e33) +{ } +#endif +*/ + +/* An unneeded printf() definition - actually, just a stub - used to occupy + this space. It has been removed and replaced with this comment which + exists to occupy some lines so that templates.exp won't need adjustment. */ + +class T1 { +public: + static void* operator new(size_t) throw (); + static void operator delete(void *pointer); + + void operator=(const T1&); + T1& operator=(int); + + int operator==(int) const; + int operator==(const T1&) const; + int operator!=(int) const; + int operator!=(const T1&) const; + + int operator<=(int) const; + int operator<=(const T1&) const; + int operator<(int) const; + int operator<(const T1&) const; + int operator>=(int) const; + int operator>=(const T1&) const; + int operator>(int) const; + int operator>(const T1&) const; + + void operator+(int) const; + T1& operator+(const T1&) const; + void operator+=(int) const; + T1& operator+=(const T1&) const; + + T1& operator++() const; + + void operator-(int) const; + T1& operator-(const T1&) const; + void operator-=(int) const; + T1& operator-=(const T1&) const; + + T1& operator--() const; + + void operator*(int) const; + T1& operator*(const T1&) const; + void operator*=(int) const; + T1& operator*=(const T1&) const; + + void operator/(int) const; + T1& operator/(const T1&) const; + void operator/=(int) const; + T1& operator/=(const T1&) const; + + void operator%(int) const; + T1& operator%(const T1&) const; + void operator%=(int) const; + T1& operator%=(const T1&) const; + + void operator&&(int) const; + T1& operator&&(const T1&) const; + + void operator||(int) const; + T1& operator||(const T1&) const; + + void operator&(int) const; + T1& operator&(const T1&) const; + void operator&=(int) const; + T1& operator&=(const T1&) const; + + void operator|(int) const; + T1& operator|(const T1&) const; + void operator|=(int) const; + T1& operator|=(const T1&) const; + + void operator^(int) const; + T1& operator^(const T1&) const; + void operator^=(int) const; + T1& operator^=(const T1&) const; + + T1& operator!() const; + T1& operator~() const; +}; + +void* +T1::operator new(size_t) throw () +{ return 0; } + +void +T1::operator delete(void *pointer) +{ } + +class T2 { +public: + T2(int i): integer(i) + { } + int integer; +}; + +int operator==(const T2&, const T2&) +{ return 0; } +int operator==(const T2&, char) +{ return 0; } +int operator!=(const T2&, const T2&) +{ return 0; } +int operator!=(const T2&, char) +{ return 0; } + +int operator<=(const T2&, const T2&) +{ return 0; } +int operator<=(const T2&, char) +{ return 0; } +int operator<(const T2&, const T2&) +{ return 0; } +int operator<(const T2&, char) +{ return 0; } +int operator>=(const T2&, const T2&) +{ return 0; } +int operator>=(const T2&, char) +{ return 0; } +int operator>(const T2&, const T2&) +{ return 0; } +int operator>(const T2&, char) +{ return 0; } + +T2 operator+(const T2 t, int i) +{ return t.integer + i; } +T2 operator+(const T2 a, const T2& b) +{ return a.integer + b.integer; } +T2& operator+=(T2& t, int i) +{ t.integer += i; return t; } +T2& operator+=(T2& a, const T2& b) +{ a.integer += b.integer; return a; } + +T2 operator-(const T2 t, int i) +{ return t.integer - i; } +T2 operator-(const T2 a, const T2& b) +{ return a.integer - b.integer; } +T2& operator-=(T2& t, int i) +{ t.integer -= i; return t; } +T2& operator-=(T2& a, const T2& b) +{ a.integer -= b.integer; return a; } + +T2 operator*(const T2 t, int i) +{ return t.integer * i; } +T2 operator*(const T2 a, const T2& b) +{ return a.integer * b.integer; } +T2& operator*=(T2& t, int i) +{ t.integer *= i; return t; } +T2& operator*=(T2& a, const T2& b) +{ a.integer *= b.integer; return a; } + +T2 operator/(const T2 t, int i) +{ return t.integer / i; } +T2 operator/(const T2 a, const T2& b) +{ return a.integer / b.integer; } +T2& operator/=(T2& t, int i) +{ t.integer /= i; return t; } +T2& operator/=(T2& a, const T2& b) +{ a.integer /= b.integer; return a; } + +T2 operator%(const T2 t, int i) +{ return t.integer % i; } +T2 operator%(const T2 a, const T2& b) +{ return a.integer % b.integer; } +T2& operator%=(T2& t, int i) +{ t.integer %= i; return t; } +T2& operator%=(T2& a, const T2& b) +{ a.integer %= b.integer; return a; } + +template +class T5 { +public: + T5(int); + T5(const T5&); + ~T5(); + static void* operator new(size_t) throw (); + static void operator delete(void *pointer); + int value(); + + static T X; + T x; + int val; +}; + +template +T5::T5(int v) +{ val = v; } + +template +T5::T5(const T5&) +{} + +template +T5::~T5() +{} + +template +void* +T5::operator new(size_t) throw () +{ return 0; } + +template +void +T5::operator delete(void *pointer) +{ } + +template +int +T5::value() +{ return val; } + + +#if ! defined(__GNUC__) || defined(GCC_BUG) +template +T T5::X; +#endif + + + + +T5 t5c(1); +T5 t5i(2); +T5 t5fi1(3); +T5 t5fi2(4); + + + + + + +class x { +public: + int (*manage[5])(double, + void *(*malloc)(unsigned size), + void (*free)(void *pointer)); + int (*device[5])(int open(const char *, unsigned mode, unsigned perms, int extra), + int *(*read)(int fd, void *place, unsigned size), + int *(*write)(int fd, void *place, unsigned size), + void (*close)(int fd)); +}; +T5 t5x(5); + +#if !defined(__GNUC__) || (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6) +template class T5; +template class T5; +template class T5; +template class T5; +template class T5; +#endif + +class T7 { +public: + static int get(); + static void put(int); +}; + +int +T7::get() +{ return 1; } + +void +T7::put(int i) +{ + // nothing +} + +// More template kinds. GDB 4.16 didn't handle these, but +// Wildebeest does. Note: Assuming HP aCC is used to compile +// this file; with g++ or HP cfront or other compilers the +// demangling may not get done correctly. + +// Ordinary template, to be instantiated with different types +template +class Foo { +public: + int x; + T t; + T foo (int, T); +}; + + +template T Foo::foo (int i, T tt) +{ + return tt; +} + +// Template with int parameter + +template +class Bar { +public: + int x; + T t; + T bar (int, T); +}; + + +template T Bar::bar (int i, T tt) +{ + if (i < sz) + return tt; + else + return 0; +} + +// function template with int parameter +template int dummy (T tt, int i) +{ + return tt; +} + +// Template with partial specializations +template +class Spec { +public: + int x; + T1 spec (T2); +}; + +template +T1 Spec::spec (T2 t2) +{ + return 0; +} + +template +class Spec { +public: + int x; + T spec (T*); +}; + +template +T Spec::spec (T * tp) +{ + return *tp; +} + +// Template with char parameter +template +class Baz { +public: + int x; + T t; + T baz (int, T); +}; + +template T Baz::baz (int i, T tt) +{ + if (i < sz) + return tt; + else + return 0; +} + +// Template with char * parameter +template +class Qux { +public: + int x; + T t; + T qux (int, T); +}; + +template T Qux::qux (int i, T tt) +{ + if (sz[0] == 'q') + return tt; + else + return 0; +} + +// Template with a function pointer parameter +template +class Qux1 { +public: + int x; + T t; + T qux (int, T); +}; + +template T Qux1::qux (int i, T tt) +{ + if (f != 0) + return tt; + else + return 0; +} + +// Some functions to provide as arguments to template +int gf1 (int a) { + return a * 2 + 13; +} +int gf2 (int a) { + return a * 2 + 26; +} + +char string[3]; + + +// Template for nested instantiations + +template +class Garply { +public: + int x; + T t; + T garply (int, T); +}; + +template T Garply::garply (int i, T tt) +{ + if (i > x) + return tt; + else + { + x += i; + return tt; + } +} + + +int main() +{ + int i; +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + i = i + 1; + + // New tests added here + + Foo fint={0,0}; + Foo fchar={0,0}; + Foo fvpchar = {0, 0}; + + Bar bint; + Bar 3)> bint2; + + Baz bazint; + Baz bazint2; + + Qux quxint2; + Qux quxint; + + Qux1 qux11; + + int x = fint.foo(33, 47); + char c = fchar.foo(33, 'x'); + volatile char * cp = fvpchar.foo(33, 0); + + int y = dummy (400, 600); + + int z = bint.bar(55, 66); + z += bint2.bar(55, 66); + + c = bazint2.baz(4, 'y'); + c = quxint2.qux(4, 'z'); + + y = bazint.baz(4,3); + y = quxint.qux(4, 22); + y += qux11.qux(4, 22); + + y *= gf1(y) - gf2(y); + + Spec sic; + Spec siip; + + sic.spec ('c'); + siip.spec (&x); + + Garply f; + Garply fc; + f.x = 13; + + Garply > nf; + nf.x = 31; + + x = f.garply (3, 4); + + fc = nf.garply (3, fc); + + y = x + fc.x; + + + return 0; + +} + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.cp/templates.exp b/gdb/testsuite/gdb.cp/templates.exp new file mode 100644 index 0000000..0ae8788 --- /dev/null +++ b/gdb/testsuite/gdb.cp/templates.exp @@ -0,0 +1,516 @@ +# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +set ws "\[\r\n\t \]+" + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile "templates" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +# Create and source the file that provides information about the compiler +# used to compile the test case. +if [get_compiler_info ${binfile} "c++"] { + return -1 +} +source ${binfile}.ci + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# +# Test printing of the types of templates. +# + +proc test_ptype_of_templates {} { + global gdb_prompt + global ws + + send_gdb "ptype T5\n" + gdb_expect { + -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5 & operator=\\(T5 const ?&\\);${ws}T5\\(int\\);${ws}T5\\((T5 const|const T5) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { + pass "ptype T5" + } + -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}${ws}T5 \\(int\\);${ws}T5 \\(const class T5 &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}${ws}$gdb_prompt $" { pass "ptype T5 -- new with unsigned int" } + -re "type = class T5 \\{.*public:.*static int X;.*int x;.*int val;.*T5 \\(int\\);.*T5 \\(const class T5 &\\);.*void ~T5 \\(int\\);.*static void \\* new \\(unsigned long\\);.*static void delete \\(void ?\\*\\);.*int value \\((void|)\\);.*\\}\r\n$gdb_prompt $" { pass "ptype T5 -- new with unsigned long" } + -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5 & operator=\\(T5 const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\((T5 const|const T5) ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" { + pass "ptype T5 (obsolescent gcc or gdb)" + } + -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5 const|const T5) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\(unsigned( long|)\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { + # This also triggers gdb/1113... + kfail "gdb/1111" "ptype T5" + } + -re ".*$gdb_prompt $" { + fail "ptype T5" + } + timeout { + fail "ptype T5 (timeout)" + } + } + + send_gdb "ptype t5i\n" + gdb_expect { + -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5\\(int\\);${ws}T5\\(T5 const ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\\}\r\n$gdb_prompt $" { pass "ptype T5 -- with several fixes from 4.17" } + -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5 &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned int\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" { pass "ptype t5i -- new with unsigned int" } + -re "type = class T5 \\{${ws}public:${ws}static int X;${ws}int x;${ws}int val;\r\n${ws}T5 \\(int\\);${ws}T5 \\(const class T5 &\\);${ws}void ~T5 \\(int\\);${ws}static void \\* new \\(unsigned long\\);${ws}static void delete \\(void ?\\*\\);${ws}int value \\((void|)\\);${ws}\\}\r\n$gdb_prompt $" { pass "ptype t5i -- new with unsigned long" } + -re "type = class T5 \{.*public:.*static int X;.*int x;.*int val;.*.*T5 \\(int\\);.*.*void ~T5 \\(int\\).*.*.*int value \\((void|)\\);.*\}.*$gdb_prompt $" { + pass "ptype t5i" + } + -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}T5 & operator=\\(T5 const ?&\\);${ws}T5\\(int\\);${ws}T5\\((T5 const|const T5) ?&\\);${ws}~T5\\((void|)\\);${ws}static void \\* operator new\\(unsigned( int| long)?\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { + pass "ptype t5i" + } + -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;((${ws}T5 & operator=\\(T5 const ?&\\);)|(${ws}T5\\(int\\);)|(${ws}T5\\(T5 const ?&\\);)|(${ws}~T5\\((void|)\\);)|(${ws}static void \\* operator new\\(unsigned( int| long)?\\);)|(${ws}static void operator delete\\(void ?\\*\\);)|(${ws}int value\\((void|)\\);))*${ws}\}\r\n$gdb_prompt $" { + pass "ptype t5i (obsolescent gcc or gdb)" + } + -re "type = class T5 \{${ws}public:${ws}static int X;${ws}int x;${ws}int val;${ws}void T5\\(int\\);${ws}void T5\\((T5 const|const T5) ?&\\);${ws}~T5\\(int\\);${ws}static void \\* operator new\\(unsigned( long|)\\);${ws}static void operator delete\\(void ?\\*\\);${ws}int value\\((void|)\\);${ws}\}\r\n$gdb_prompt $" { + # This also triggers gdb/1113... + kfail "gdb/1111" "ptype T5" + } + -re ".*$gdb_prompt $" { + fail "ptype t5i" + } + timeout { + fail "ptype t5i (timeout)" + } + } +} + +# +# Test breakpoint setting on template methods. +# + +proc test_template_breakpoints {} { + global gdb_prompt + global testfile + global srcdir + global hp_aCC_compiler + + send_gdb "break T5::T5\n" + gdb_expect { + -re "0. cancel.*\[\r\n\]*.1. all.*\[\r\n\]*.2. T5::T5\\(int\\) at .*\[\r\n\]*.3. T5::T5\\((T5 const|const T5) ?&\\) at .*\[\r\n\]*> $" { + gdb_test "0" \ + "canceled" \ + "constructor breakpoint (obsolete format!)" + } + -re ".0. cancel\[\r\n\]*.1. all\[\r\n\]*.2. T5::T5\\((T5 const|const T5) ?&\\) at .*templates.cc:.*\[\r\n\]*.3. T5::T5\\(int\\) at .*templates.cc:.*\[\r\n\]*> $" { + gdb_test "0" \ + "canceled" \ + "constructor breakpoint" + } + -re "0. cancel.*\[\r\n\]*.1. all.*\[\r\n\]*.2. T5 at .*\[\r\n\]*.3. T5 at .*\[\r\n\]*> $" { + setup_kfail "gdb/1062" "*-*-*" + gdb_test "0" \ + "nonsense intended to insure that this test fails" \ + "constructor breakpoint" + } + -re ".*\n> $" { + gdb_test "0" \ + "nonsense intended to insure that this test fails" \ + "constructor breakpoint (bad menu choices)" + } + -re ".*$gdb_prompt $" { fail "constructor breakpoint" } + default { fail "constructor breakpoint (timeout)" } + } + +# See CLLbs14792 + if {$hp_aCC_compiler} {setup_xfail hppa*-*-* CLLbs14792} + + gdb_test_multiple "break T5::~T5" "destructor_breakpoint" { + -re "Breakpoint.*at.* file .*${testfile}.cc, line.*$gdb_prompt $" + { + pass "destructor breakpoint" + } + -re "the class `T5' does not have destructor defined\r\nHint: try 'T5::~T5 or 'T5::~T5\r\n\\(Note leading single quote.\\)\r\n$gdb_prompt $" + { + kfail "gdb/1112" "destructor breakpoint" + } + } + + gdb_test "break T5::value" \ + "Breakpoint.*at.* file .*${testfile}.cc, line.*" \ + "value method breakpoint" + + delete_breakpoints +} + +# +# Test calling of template methods. +# + +proc test_template_calls {} { + global gdb_prompt + global hp_aCC_compiler + + if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + return + } + + if {!$hp_aCC_compiler} {setup_xfail hppa*-*-*} + send_gdb "print t5i.value()\n" + gdb_expect { + -re ".* = 2\[\r\n\]*$gdb_prompt $" { pass "print t5i.value()" } + -re "Cannot invoke functions on this machine.*$gdb_prompt $" { + fail "print t5i.value()" + } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + xfail "print t5i.value" + } + -re ".*$gdb_prompt $" { fail "print t5i.value()" } + timeout { fail "print t5i.value() (timeout)" } + } +} + + +proc do_tests {} { + global prms_id + global bug_id + global subdir + global objdir + global srcdir + global binfile + global gdb_prompt + global supports_template_debugging + + set prms_id 0 + set bug_id 0 + + # Start with a fresh gdb. + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + + if { !$supports_template_debugging } { + warning "compiler lacks debugging info for templates; tests suppressed." 0 + return + } + + runto_main + + test_ptype_of_templates + test_template_breakpoints + + if [ runto_main] { + test_template_calls + } +} + +do_tests + + +# More tests for different kinds of template parameters, +# templates with partial specializations, nested templates, etc. +# These have been tested only with HP aCC. They probably won't +# work with other compilers because of differences in mangling +# schemes. +# Added by Satish Pai 1997-09-25 +# As of 2000-06-03, C++ support has been improved to the point that g++ can +# pass all of theses, excluding what appears to be one that exposes a stabs bug. - djb + +# I don't know how HP could be passing these tests without this. They +# weren't breakpointing past a point where the below expressions were +# initialized in the actual source. - djb + +send_gdb "b 770\n" +gdb_expect { + -re ".*$gdb_prompt $" +} +send_gdb "c\n" +gdb_expect { + -re ".*$gdb_prompt $" +} +send_gdb "print fint\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{x = 0, t = 0\\}\r\n$gdb_prompt $" { pass "print fint" } + -re "$gdb_prompt $" { fail "print fint" } + timeout { fail "(timeout) print fint" } +} + +send_gdb "print fvpchar\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{x = 0, t = 0x0\\}\r\n$gdb_prompt $" { pass "print fvpchar" } + -re "$gdb_prompt $" { fail "print fvpchar" } + timeout { fail "(timeout) print fvpchar" } +} + +# Template Foo + +# Neither stabs nor DWARF-2 contains type information about templates +# (as opposed to instantiations of templates), so in those +# circumstances we expect GDB to not find a symbol. HP has a debug +# format that contains more info, though, so it's also correct to +# print out template info. (This affects several subsequent tests as +# well.) + +# NOTE: carlton/2003-02-26: However, because of a bug in the way GDB +# handles nested types, we don't get this right in the DWARF-2 case. + +send_gdb "ptype Foo\n" +gdb_expect { + -re "type = template <(class |)T> (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Foo\r\n\[ \t\]*(class |)Foo\r\n\[ \t\]*(class |)Foo\r\n$gdb_prompt $" { pass "ptype Foo" } + -re "type = template <(class |)T> (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Foo" } + -re "type = class Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int foo\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" + { # GCC 3.1, DWARF-2 output. + kfail "gdb/57" "ptype Foo" } + -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" + { # GCC 2.95.3, stabs+ output. + pass "ptype Foo" } + -re "$gdb_prompt $" { fail "ptype Foo" } + timeout { fail "(timeout) ptype Foo" } +} +# -re "type = class Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int foo(int, int);\r\n\\}\r\n$gdb_prompt $" + +# ptype Foo + +send_gdb "ptype fint\n" +gdb_expect { + -re "type = (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int foo\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fint" } + -re "$gdb_prompt $" { fail "ptype fint" } + timeout { fail "(timeout) ptype fint" } +} + +# ptype Foo + +send_gdb "ptype fchar\n" +gdb_expect { + -re "type = (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*.*char foo\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fchar" } + -re "$gdb_prompt $" { fail "ptype fchar" } + timeout { fail "(timeout) ptype fchar" } +} + +# ptype Foo + +send_gdb "ptype fvpchar\n" +gdb_expect { + -re "type = (class |)Foo \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*.*char.*\\*t;\r\n\r\n\[ \t\]*.*char \\* foo\\(int,.*char.*\\*\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype fvpchar" } + -re "$gdb_prompt $" { fail "ptype fvpchar" } + timeout { fail "(timeout) ptype fvpchar" } +} + +# print a function from Foo + +# This test is sensitive to whitespace matching, so we'll do it twice, +# varying the spacing, because of PR gdb/33. + +send_gdb "print Foo::foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } + -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" + { + # This used to be a kfail gdb/33, but it shouldn't occur any more now. + fail "print Foo::foo" + } + -re "$gdb_prompt $" { fail "print Foo::foo" } + timeout { fail "(timeout) print Foo::foo" } +} + +send_gdb "print Foo::foo\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{.*char \\*\\((class |)Foo \\*(| const), int, .*char \\*\\)\\} $hex ::foo\\(int, .*char.*\\*\\)>\r\n$gdb_prompt $" { pass "print Foo::foo" } + -re "No symbol \"Foo\" in current context.\r\n$gdb_prompt $" + { + # This used to be a kfail gdb/33, but it shouldn't occur any more now. + fail "print Foo::foo" + } + -re "$gdb_prompt $" { fail "print Foo::foo" } + timeout { fail "(timeout) print Foo::foo" } +} + +# Template Bar + +# same as Foo for g++ +send_gdb "ptype Bar\n" +gdb_expect { + -re "type = template <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Bar\r\n\[ \t\]*(class |)Bar\r\n$gdb_prompt $" { pass "ptype Bar" } + -re "type = <(class |)T, (class |)sz> (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Bar" } + -re "ptype Bar\r\ntype = class Bar {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int bar\\(int, int\\);\r\n}\r\n$gdb_prompt $" + { # GCC 3.1, DWARF-2 output. + kfail "gdb/57" "ptype Bar" } + -re "No symbol \"Bar\" in current context.\r\n$gdb_prompt $" + { # GCC 2.95.3, stabs+ output. + pass "ptype Bar" } + -re "$gdb_prompt $" { fail "ptype Bar" } + timeout { fail "(timeout) ptype Bar" } +} + + +# ptype Bar + +send_gdb "ptype bint\n" +gdb_expect { + -re "type = (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int bar\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bint" } + -re "$gdb_prompt $" { fail "ptype bint" } + timeout { fail "(timeout) ptype bint" } +} + +# ptype Bar3)> + +send_gdb "ptype bint2\n" +gdb_expect { + -re "type = (class |)Bar \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int bar\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bint2" } + -re "$gdb_prompt $" { fail "ptype bint2" } + timeout { fail "(timeout) ptype bint2" } +} + +# Template Baz + +# Same as Foo, for g++ +send_gdb "ptype Baz\n" +gdb_expect { + -re "type = template <(class |)T, (class |)sz> (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Baz\r\n\[ \t\]*(class |)Baz\r\n$gdb_prompt $" { pass "ptype Baz" } + -re "type = <(class |)T, (class |)sz> (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Baz" } + -re "type = class Baz {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int baz\\(int, int\\);\r\n}\r\n$gdb_prompt $" + { # GCC 3.1, DWARF-2 output. + kfail "gdb/57" "ptype Baz" } + -re "No symbol \"Baz\" in current context.\r\n$gdb_prompt $" + { # GCC 2.95.3, stabs+ output. + pass "ptype Baz" } + -re "$gdb_prompt $" { fail "ptype Baz" } + timeout { fail "(timeout) ptype Baz" } +} + + +# ptype Baz + +send_gdb "ptype bazint\n" +gdb_expect { + -re "type = (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int baz\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bazint" } + -re "$gdb_prompt $" { fail "ptype bazint" } + timeout { fail "(timeout) ptype bazint" } +} + +# ptype Baz + +send_gdb "ptype bazint2\n" +gdb_expect { + -re "type = (class |)Baz \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*.*char baz\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype bazint2" } + -re "$gdb_prompt $" { fail "ptype bazint2" } + timeout { fail "(timeout) ptype bazint2" } +} + +# Template Qux +# Same as Foo for g++ +send_gdb "ptype Qux\n" +gdb_expect { + -re "type = template <(class |)T, (class |)sz> (class |)Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Qux\r\n\[ \t\]*(class |)Qux\r\n$gdb_prompt $" { pass "ptype Qux" } + -re ".*type = template <(class |)T.*, (class |)sz> (class |)Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*T t;\r\n\\}.*$gdb_prompt $" { pass "ptype Qux" } + -re "type = class Qux {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*char qux\\(int, char\\);\r\n}\r\n$gdb_prompt $" + { # GCC 3.1, DWARF-2 output. + kfail "gdb/57" "ptype Qux" } + -re "No symbol \"Qux\" in current context.\r\n$gdb_prompt $" + { # GCC 2.95.3, stabs+ output. + pass "ptype Qux" } + -re "$gdb_prompt $" { fail "ptype Qux" } + timeout { fail "(timeout) ptype Qux" } +} + +# pt Qux + +send_gdb "ptype quxint\n" +gdb_expect { + -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int qux\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint" } + -re "$gdb_prompt $" { fail "ptype quxint" } + timeout { fail "(timeout) ptype quxint" } +} + +# pt Qux + +# commented out this as quxint2 declaration was commented out in +# templates.exp -- ovidiu +# send_gdb "ptype quxint2\n" +# gdb_expect { +# -re "type = class Qux \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*char t;\r\n\r\n\[ \t\]*char qux\\(int, char\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype quxint2" } +# -re "$gdb_prompt $" { fail "ptype quxint2" } +# timeout { fail "(timeout) ptype quxint2" } +# } + +# Template Spec + +# Same as Foo for g++ +send_gdb "ptype Spec\n" +gdb_expect { + -re "type = template <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\ntemplate instantiations:\r\n\[ \t\]*(class |)Spec\r\n\[ \t\]*(class |)Spec\r\n$gdb_prompt $" { pass "ptype Spec" } + -re "type = <(class |)T1, (class |)T2> (class |)Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\\}\r\n$gdb_prompt $" { xfail "ptype Spec" } + -re "type = class Spec {\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*int spec\\(char\\);\r\n}\r\n$gdb_prompt $" + { # GCC 3.1, DWARF-2 output. + kfail "gdb/57" "ptype Spec" } + -re "No symbol \"Spec\" in current context.\r\n$gdb_prompt $" + { # GCC 2.95.3, stabs+ output. + pass "ptype Spec" } + -re "$gdb_prompt $" { fail "ptype Spec" } + timeout { fail "(timeout) ptype Spec" } +} + +# pt Spec + +send_gdb "ptype siip\n" +gdb_expect { + -re "type = class Spec \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\r\n\[ \t\]*.*int spec\\(int ?\\*\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype siip" } + -re "$gdb_prompt $" { fail "ptype siip" } + timeout { fail "(timeout) ptype siip" } +} + +# pt Garply + +send_gdb "ptype Garply\n" +gdb_expect { + -re "type = class Garply \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*.*int garply\\(int, int\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype Garply" } + -re "$gdb_prompt $" { fail "ptype Garply" } + timeout { fail "(timeout) ptype Garply" } +} + +# ptype of nested template name + +send_gdb "ptype Garply >\n" +gdb_expect { + -re "type = (class |)Garply > \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*.*(class |)Garply t;\r\n\r\n\[ \t\]*.*(class |)Garply garply\\(int, (class |)Garply\\);\r\n\\}\r\n$gdb_prompt $" { pass "ptype Garply >" } + -re "$gdb_prompt $" { fail "ptype Garply >" } + timeout { fail "(timeout) ptype Garply >" } +} + +# print out a function from a nested template name + +send_gdb "print Garply >::garply\n" +gdb_expect { + -re "\\$\[0-9\]* = \\{(class |)Garply \\((class |)Garply > \\*(| const), int, (class |)Garply\\)\\} $hex \[ \t\]*>::garply\\(int, (class |)Garply\\)>\r\n$gdb_prompt $" { pass "print Garply >::garply" } + -re ".*$gdb_prompt $" { fail "print Garply >::garply" } + timeout { fail "print Garply >::garply (timeout)" } +} + +# djb - 06-03-2000 +# Now should work fine +send_gdb "break Garply >::garply\n" +gdb_expect { + -re "Breakpoint \[0-9\]* at $hex: file .*templates.cc, line.*\r\n$gdb_prompt $" { pass "break Garply >::garply" } + -re ".*$gdb_prompt $" { fail "break Garply >::garply" } + timeout { fail "break Garply >::garply (timeout)" } +} diff --git a/gdb/testsuite/gdb.cp/try_catch.cc b/gdb/testsuite/gdb.cp/try_catch.cc new file mode 100644 index 0000000..e13dd64 --- /dev/null +++ b/gdb/testsuite/gdb.cp/try_catch.cc @@ -0,0 +1,121 @@ +// 2002-05-27 + +#include +#include +#include + +enum region { oriental, egyptian, greek, etruscan, roman }; + +// Test one. +class gnu_obj_1 +{ +public: + typedef region antiquities; + const bool test; + const int key1; + long key2; + + antiquities value; + + gnu_obj_1(antiquities a, long l): test(true), key1(5), key2(l), value(a) {} +}; + +// Test two. +template +class gnu_obj_2: public virtual gnu_obj_1 +{ +public: + antiquities value_derived; + + gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7), value_derived(b) { } +}; + +// Test three. +template +class gnu_obj_3 +{ +public: + typedef region antiquities; + gnu_obj_2 data; + + gnu_obj_3(antiquities b): data(etruscan) { } +}; + +int main() +{ + bool test = true; + const int i = 5; + int j = i; + gnu_obj_2 test2(roman); + gnu_obj_3 test3(greek); + + // 1 + try + { + ++j; + throw gnu_obj_1(egyptian, 4589); // marker 1-throw + } + catch (gnu_obj_1& obj) + { + ++j; + if (obj.value != egyptian) // marker 1-catch + test &= false; + if (obj.key2 != 4589) + test &= false; + } + catch (...) + { + j = 0; + test &= false; + } + + // 2 + try + { + ++j; // marker 2-start + try + { + ++j; // marker 2-next + try + { + ++j; + throw gnu_obj_1(egyptian, 4589); // marker 2-throw + } + catch (gnu_obj_1& obj) + { + ++j; + if (obj.value != egyptian) // marker 2-catch + test &= false; + if (obj.key2 != 4589) + test &= false; + } + } + catch (gnu_obj_1& obj) + { + ++j; + if (obj.value != egyptian) + test &= false; + if (obj.key2 != 4589) + test &= false; + } + } + catch (...) + { + j = 0; + test &= false; + } + + // 3 use standard library + using namespace std; + try + { + if (j < 100) + throw invalid_argument("gdb.1"); // marker 3-throw + } + catch (exception& obj) + { + if (obj.what() != "gdb.1") // marker 3-catch + test &= false; + } + return 0; +} diff --git a/gdb/testsuite/gdb.cp/try_catch.exp b/gdb/testsuite/gdb.cp/try_catch.exp new file mode 100644 index 0000000..1473e20 --- /dev/null +++ b/gdb/testsuite/gdb.cp/try_catch.exp @@ -0,0 +1,82 @@ +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Tests for member data +# 2002-05-27 Benjamin Kosnik + +# This file is part of the gdb testsuite + +if $tracelevel then { + strace $tracelevel + } + +if { [skip_cplus_tests] } { continue } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "try_catch" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +gdb_breakpoint [gdb_get_line_number "marker 1-throw"] +gdb_continue_to_breakpoint "marker 1-throw" + +gdb_breakpoint [gdb_get_line_number "marker 1-catch"] +gdb_continue_to_breakpoint "marker 1-catch" + +gdb_breakpoint [gdb_get_line_number "marker 2-start"] +gdb_continue_to_breakpoint "marker 2-start" + +gdb_breakpoint [gdb_get_line_number "marker 2-next"] +gdb_continue_to_breakpoint "marker 2-next" + +gdb_breakpoint [gdb_get_line_number "marker 2-throw"] +gdb_continue_to_breakpoint "marker 2-throw" + +gdb_breakpoint [gdb_get_line_number "marker 2-catch"] +gdb_continue_to_breakpoint "marker 2-catch" + +gdb_breakpoint [gdb_get_line_number "marker 3-throw"] +gdb_continue_to_breakpoint "marker 3-throw" + +gdb_breakpoint [gdb_get_line_number "marker 3-catch"] +gdb_continue_to_breakpoint "marker 3-catch" + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/userdef.cc b/gdb/testsuite/gdb.cp/userdef.cc new file mode 100644 index 0000000..0bb88a2 --- /dev/null +++ b/gdb/testsuite/gdb.cp/userdef.cc @@ -0,0 +1,341 @@ +#include + +using namespace std; + +void marker1() +{ + return; +} + +class A1 { + int x; + int y; + +friend ostream& operator<<(ostream& outs, A1 one); + +public: + + A1(int a, int b) + { + x=a; + y=b; + } + +A1 operator+=(int value); +A1 operator+(const A1&); +A1 operator-(const A1&); +A1 operator%(const A1&); +int operator==(const A1&); +int operator!=(const A1&); +int operator&&(const A1&); +int operator||(const A1&); +A1 operator<<(int); +A1 operator>>(int); +A1 operator|(const A1&); +A1 operator^(const A1&); +A1 operator&(const A1&); +int operator<(const A1&); +int operator<=(const A1&); +int operator>=(const A1&); +int operator>(const A1&); +A1 operator*(const A1&); +A1 operator/(const A1&); +A1 operator=(const A1&); + +A1 operator~(); +A1 operator-(); +int operator!(); +A1 operator++(); +A1 operator++(int); +A1 operator--(); +A1 operator--(int); + +}; + + +A1 A1::operator+(const A1& second) +{ + A1 sum(0,0); + sum.x = x + second.x; + sum.y = y + second.y; + + return (sum); +} + +A1 A1::operator*(const A1& second) +{ + A1 product(0,0); + product.x = this->x * second.x; + product.y = this->y * second.y; + + return product; +} + +A1 A1::operator-(const A1& second) +{ + A1 diff(0,0); + diff.x = x - second.x; + diff.y = y - second.y; + + return diff; +} + +A1 A1::operator/(const A1& second) +{ + A1 div(0,0); + div.x = x / second.x; + div.y = y / second.y; + + return div; +} + +A1 A1::operator%(const A1& second) +{ + A1 rem(0,0); + rem.x = x % second.x; + rem.y = y % second.y; + + return rem; +} + +int A1::operator==(const A1& second) +{ + int a = (x == second.x); + int b = (y == second.y); + + return (a && b); +} + +int A1::operator!=(const A1& second) +{ + int a = (x != second.x); + int b = (y != second.y); + + return (a || b); +} + +int A1::operator&&(const A1& second) +{ + return ( x && second.x); +} + +int A1::operator||(const A1& second) +{ + return ( x || second.x); +} + +A1 A1::operator<<(int value) +{ + A1 lshft(0,0); + lshft.x = x << value; + lshft.y = y << value; + + return lshft; +} + +A1 A1::operator>>(int value) +{ + A1 rshft(0,0); + rshft.x = x >> value; + rshft.y = y >> value; + + return rshft; +} + +A1 A1::operator|(const A1& second) +{ + A1 abitor(0,0); + abitor.x = x | second.x; + abitor.y = y | second.y; + + return abitor; +} + +A1 A1::operator^(const A1& second) +{ + A1 axor(0,0); + axor.x = x ^ second.x; + axor.y = y ^ second.y; + + return axor; +} + +A1 A1::operator&(const A1& second) +{ + A1 abitand(0,0); + abitand.x = x & second.x; + abitand.y = y & second.y; + + return abitand; +} + +int A1::operator<(const A1& second) +{ + A1 b(0,0); + b.x = 3; + return (x < second.x); +} + +int A1::operator<=(const A1& second) +{ + return (x <= second.x); +} + +int A1::operator>=(const A1& second) +{ + return (x >= second.x); +} + +int A1::operator>(const A1& second) +{ + return (x > second.x); +} + +int A1::operator!(void) +{ + return (!x); +} + +A1 A1::operator-(void) +{ + A1 neg(0,0); + neg.x = -x; + neg.y = -y; + + return (neg); +} + +A1 A1::operator~(void) +{ + A1 acompl(0,0); + acompl.x = ~x; + acompl.y = ~y; + + return (acompl); +} + +A1 A1::operator++() // pre increment +{ + x = x +1; + + return (*this); +} + +A1 A1::operator++(int) // post increment +{ + y = y +1; + + return (*this); +} + +A1 A1::operator--() // pre decrement +{ + x = x -1; + + return (*this); +} + +A1 A1::operator--(int) // post decrement +{ + y = y -1; + + return (*this); +} + + +A1 A1::operator=(const A1& second) +{ + + x = second.x; + y = second.y; + + return (*this); +} + +A1 A1::operator+=(int value) +{ + + x += value; + y += value; + + return (*this); +} + +ostream& operator<<(ostream& outs, A1 one) +{ + return (outs << endl << "x = " << one.x << endl << "y = " << one.y << endl << "-------" << endl); +} + +int main (void) +{ + A1 one(2,3); + A1 two(4,5); + A1 three(0,0); + int val; + + marker1(); // marker1-returns-here + cout << one; // marker1-returns-here + cout << two; + three = one + two; + cout << "+ " << three; + three = one - two; + cout << "- " << three; + three = one * two; + cout <<"* " << three; + three = one / two; + cout << "/ " << three; + three = one % two; + cout << "% " << three; + three = one | two; + cout << "| " <= two; + cout << ">= " << val << endl << "-----"< two; + cout << "> " << val << endl << "-----"<> 2; + cout << "rsh " << three; + + three = one; + cout << " = "<< three; + three += 5; + cout << " += "<< three; + + val = (!one); + cout << "! " << val << endl << "-----"< two" "\\\$\[0-9\]* = 0\[\r\n\]" + +gdb_test "print one >= two" "\\\$\[0-9\]* = 0\[\r\n\]" + +gdb_test "print one == two" "\\\$\[0-9\]* = 0\[\r\n\]" + +gdb_test "print one != two" "\\\$\[0-9\]* = 1\[\r\n\]" + +# Can't really check the output of this one without knowing +# target integer width. Make sure we don't try to call +# the iostreams operator instead, though. +gdb_test "print one << 31" "\\\$\[0-9\]* = {x = -?\[0-9\]*, y = -?\[0-9\]*}" + +# Should be fine even on < 32-bit targets. +gdb_test "print one >> 31" "\\\$\[0-9\]* = {x = 0, y = 0}" + +gdb_test "print !one" "\\\$\[0-9\]* = 0\[\r\n\]" + +# Assumes 2's complement. So does everything... +gdb_test "print ~one" "\\\$\[0-9\]* = {x = -3, y = -4}" + +gdb_test "print -one" "\\\$\[0-9\]* = {x = -2, y = -3}" + +gdb_test "print one++" "\\\$\[0-9\]* = {x = 2, y = 4}" + +gdb_test "print ++one" "\\\$\[0-9\]* = {x = 3, y = 4}" + +gdb_test "print one--" "\\\$\[0-9\]* = {x = 3, y = 3}" + +gdb_test "print --one" "\\\$\[0-9\]* = {x = 2, y = 3}" + +gdb_test "print one += 7" "\\\$\[0-9\]* = {x = 9, y = 10}" + +gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}" + +# Check that GDB tolerates whitespace in operator names. +gdb_test "break A1::'operator+'" ".*Breakpoint $decimal at.*" +gdb_test "break A1::'operator +'" ".*Breakpoint $decimal at.*" + +gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.cp/virtfunc.cc b/gdb/testsuite/gdb.cp/virtfunc.cc new file mode 100644 index 0000000..005de9d --- /dev/null +++ b/gdb/testsuite/gdb.cp/virtfunc.cc @@ -0,0 +1,201 @@ +// Pls try the following program on virtual functions and try to do print on +// most of the code in main(). Almost none of them works ! + +// +// The inheritance structure is: +// +// V : VA VB +// A : (V) +// B : A +// D : AD (V) +// C : (V) +// E : B (V) D C +// + +class VA +{ +public: + int va; +}; + +class VB +{ +public: + int vb; + int fvb(); + virtual int vvb(); +}; + +class V : public VA, public VB +{ +public: + int f(); + virtual int vv(); + int w; +}; + +class A : virtual public V +{ +public: + virtual int f(); +private: + int a; +}; + +class B : public A +{ +public: + int f(); +private: + int b; +}; + +class C : public virtual V +{ +public: + int c; +}; + +class AD +{ +public: + virtual int vg() = 0; +}; + +class D : public AD, virtual public V +{ +public: + static void s(); + virtual int vg(); + virtual int vd(); + int fd(); + int d; +}; + +class E : public B, virtual public V, public D, public C +{ +public: + int f(); + int vg(); + int vv(); + int e; +}; + +D dd; +D* ppd = ⅆ +AD* pAd = ⅆ + +A a; +B b; +C c; +D d; +E e; +V v; +VB vb; + + +A* pAa = &a; +A* pAe = &e; + +B* pBe = &e; + +D* pDd = &d; +D* pDe = &e; + +V* pVa = &a; +V* pVv = &v; +V* pVe = &e; +V* pVd = &d; + +AD* pADe = &e; + +E* pEe = &e; + +VB* pVB = &vb; + +void init() +{ + a.vb = 1; + b.vb = 2; + c.vb = 3; + d.vb = 4; + e.vb = 5; + v.vb = 6; + vb.vb = 7; + + d.d = 1; + e.d = 2; +} + +extern "C" int printf(const char *, ...); + +int all_count = 0; +int failed_count = 0; + +#define TEST(EXPR, EXPECTED) \ + ret = EXPR; \ + if (ret != EXPECTED) {\ + printf("Failed %s is %d, should be %d!\n", #EXPR, ret, EXPECTED); \ + failed_count++; } \ + all_count++; + +int ret; + +void test_calls() +{ + TEST(pAe->f(), 20); + TEST(pAa->f(), 1); + + TEST(pDe->vg(), 202); + TEST(pADe->vg(), 202); + TEST(pDd->vg(), 101); + + TEST(pEe->vvb(), 411); + + TEST(pVB->vvb(), 407); + + TEST(pBe->vvb(), 411); + TEST(pDe->vvb(), 411); + + TEST(pEe->vd(), 282); + TEST(pEe->fvb(), 311); + + TEST(pEe->D::vg(), 102); + printf("Did %d tests, of which %d failed.\n", all_count, failed_count); +} +#ifdef usestubs +extern "C" { + void set_debug_traps(); + void breakpoint(); +}; +#endif + +int main() +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + init(); + + e.w = 7; + e.vb = 11; + + test_calls(); + return 0; + +} + +int A::f() {return 1;} +int B::f() {return 2;} +void D::s() {} +int E::f() {return 20;} +int D::vg() {return 100+d;} +int E::vg() {return 200+d;} +int V::f() {return 600+w;} +int V::vv() {return 400+w;} +int E::vv() {return 450+w;} +int D::fd() {return 250+d;} +int D::vd() {return 280+d;} +int VB::fvb() {return 300+vb;} +int VB::vvb() {return 400+vb;} diff --git a/gdb/testsuite/gdb.cp/virtfunc.exp b/gdb/testsuite/gdb.cp/virtfunc.exp new file mode 100644 index 0000000..dbd575c --- /dev/null +++ b/gdb/testsuite/gdb.cp/virtfunc.exp @@ -0,0 +1,948 @@ +# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +set ws "\[\r\n\t \]+" +set nl "\[\r\n\]+" + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile "virtfunc" +set srcfile ${testfile}.cc +set binfile ${objdir}/${subdir}/${testfile} + +if [get_compiler_info ${binfile} "c++"] { + return -1 +} + +source ${binfile}.ci + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++ debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +proc gdb_virtfunc_init {} { + global srcdir subdir binfile + global gdb_prompt + + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $binfile + + send_gdb "set language c++\n" + gdb_expect -re "$gdb_prompt $" + send_gdb "set width 0\n" + gdb_expect -re "$gdb_prompt $" +} + +proc gdb_virtfunc_restart {} { + gdb_exit; + gdb_start; + gdb_virtfunc_init; + runto 'test_calls'; +} + +# +# Test printing of the types of various classes. +# + +proc test_ptype_of_classes {} { + global gdb_prompt + global ws + global nl + + # This used to be a fail if it printed "struct" not "class". But + # since this struct doesn't use any special C++ features, it is + # considered right for GDB to print it as "struct". + send_gdb "ptype VA\n" + gdb_expect { + -re "type = (struct|class) VA \{(${ws}public:|)${ws}int va;${ws}VA & operator=\\(VA const ?&\\);${ws}VA\\((VA const|const VA) ?&\\);${ws}VA\\((void|)\\);${ws}\}.*$gdb_prompt $" { + pass "ptype VA" + } + -re "type = (struct|class) VA \{(${ws}public:|)${ws}int va;((${ws}VA & operator=\\(VA const ?&\\);)|(${ws}VA\\(VA const ?&\\);)|(${ws}VA\\((void|)\\);))*${ws}\}.*$gdb_prompt $" { + pass "ptype VA (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype VA" + } + timeout { + fail "ptype VA (timeout)" + } + } + + send_gdb "ptype VB\n" + gdb_expect { + -re "type = class VB \{${ws}public:${ws}int vb;${ws}VB & operator=\\(VB const ?&\\);${ws}VB\\((VB const|const VB) ?&\\);${ws}VB\\((void|)\\);${ws}int fvb\\((void|)\\);${ws}virtual int vvb\\((void|)\\);${ws}\}.*$gdb_prompt $" { + pass "ptype VB" + } + -re "type = class VB \{${ws}public:${ws}int vb;${ws}int fvb \\((void|)\\);${ws}virtual int vvb \\((void|)\\);${ws}\}.*$gdb_prompt $" { + pass "ptype VB (aCC)" + } + -re "type = class VB \{${ws}public:${ws}int vb;((${ws}VB & operator=\\(VB const ?&\\);)|(${ws}VB\\(VB const ?&\\);)|(${ws}VB\\((void|)\\);)|(${ws}int fvb\\((void|)\\);)|(${ws}virtual int vvb\\((void|)\\);))*${ws}\}.*$gdb_prompt $" { + pass "ptype VB (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype VB" + } + timeout { + fail "ptype VB (timeout)" + } + } + + send_gdb "ptype V\n" + gdb_expect { + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype V" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype V (aCC)" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype V (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype V" + } + timeout { + fail "ptype V (timeout)" + } + } + + # The format of a g++ virtual base pointer. + set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?" + + send_gdb "ptype A\n" + gdb_expect { + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype A" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype A" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype A (aCC)" + } + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype A (obsolescent gcc or gdb)" + } + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}FOO;${ws}int a;${ws}public:${ws}virtual int f.void.;${ws}\}$nl$gdb_prompt $" { + # This happens because the type is defined only after it is + # too late. + fail "ptype A (known failure with gcc cygnus-2.4.5-930417)" + # Many of the rest of these tests have the same problem. + return 0 + } + -re ".*$gdb_prompt $" { + fail "ptype A" + } + timeout { + fail "ptype A (timeout)" + } + } + + send_gdb "ptype B\n" + gdb_expect { + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\(int, B const ?&\\);${ws}B\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype B" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype B" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}virtual int f \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype B (aCC)" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(int, B const ?&\\);)|(${ws}B\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype B (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype B" + } + timeout { + fail "ptype B (timeout)" + } + } + + send_gdb "ptype C\n" + gdb_expect { + -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\(int, C const ?&\\);${ws}C\\(int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype C" + } + -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\((C const|const C) ?&\\);${ws}C\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype C" + } + -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}\}$nl$gdb_prompt $" { + pass "ptype C (aCC)" + } + -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;((${ws}C & operator=\\(C const ?&\\);)|(${ws}C\\(int, C const ?&\\);)|(${ws}C\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype C (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype C" + } + timeout { + fail "ptype C (timeout)" + } + } + + send_gdb "ptype AD\n" + gdb_expect { + -re "type = class AD \{${ws}public:${ws}AD & operator=\\(AD const ?&\\);${ws}AD\\((AD const|const AD) ?&\\);${ws}AD\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype AD" + } + -re "type = class AD \{${ws}public:${ws}virtual int vg \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype AD (aCC)" + } + -re "type = class AD \{${ws}public:((${ws}AD & operator=\\(AD const ?&\\);)|(${ws}AD\\(AD const ?&\\);)|(${ws}AD\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype AD (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype AD" + } + timeout { + fail "ptype AD (timeout)" + } + } + + send_gdb "ptype D\n" + gdb_expect { + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype D" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype D" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype D (aCC)" + } + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype D (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype D" + } + timeout { + fail "ptype D (timeout)" + } + } + + send_gdb "ptype E\n" + gdb_expect { + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\(int, E const ?&\\);${ws}E\\(int\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype E" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype E" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}virtual int f \\((void|)\\);${ws}virtual int vg \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype E (aCC)" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\(int, E const ?&\\);)|(${ws}E\\(int\\);)|(${ws}virtual int f\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype E (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype E" + } + timeout { + fail "ptype E (timeout)" + } + } + + send_gdb "ptype dd\n" + gdb_expect { + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype dd" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype dd" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype dd (aCC)" + } + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype dd (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype dd" + } + timeout { + fail "ptype dd (timeout)" + } + } + + send_gdb "ptype ppd\n" + gdb_expect { + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype ppd" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype ppd" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype ppd (aCC)" + } + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype ppd (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype ppd" + } + timeout { + fail "ptype ppd (timeout)" + } + } + + send_gdb "ptype pAd\n" + gdb_expect { + -re "type = class AD \{${ws}public:${ws}AD & operator=\\(AD const ?&\\);${ws}AD\\((AD const|const AD) ?&\\);${ws}AD\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAd" + } + -re "type = class AD \{${ws}public:${ws}virtual int vg \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAd (aCC)" + } + -re "type = class AD \{${ws}public:((${ws}AD & operator=\\(AD const ?&\\);)|(${ws}AD\\(AD const ?&\\);)|(${ws}AD\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAd (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pAd" + } + timeout { + fail "ptype pAd (timeout)" + } + } + + send_gdb "ptype a\n" + gdb_expect { + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype a" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype a" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype a (aCC)" + } + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype a (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype a" + } + timeout { + fail "ptype a (timeout)" + } + } + + send_gdb "ptype b\n" + gdb_expect { + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\(int, B const ?&\\);${ws}B\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype b" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype b" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}virtual int f \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype b (aCC)" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(int, B const ?&\\);)|(${ws}B\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype b (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype b" + } + timeout { + fail "ptype b (timeout)" + } + } + + send_gdb "ptype c\n" + gdb_expect { + -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\(int, C const ?&\\);${ws}C\\(int\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype c" + } + -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}C & operator=\\(C const ?&\\);${ws}C\\((C const|const C) ?&\\);${ws}C\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype c" + } + -re "type = class C : public virtual V \{${ws}public:${ws}int c;${ws}\}$nl$gdb_prompt $" { + pass "ptype c (aCC)" + } + -re "type = class C : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int c;((${ws}C & operator=\\(C const ?&\\);)|(${ws}C\\(int, C const ?&\\);)|(${ws}C\\(int\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype c (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype c" + } + timeout { + fail "ptype c (timeout)" + } + } + + send_gdb "ptype d\n" + gdb_expect { + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype d" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype d" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype d (aCC)" + } + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype d (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype d" + } + timeout { + fail "ptype d (timeout)" + } + } + + send_gdb "ptype e\n" + gdb_expect { + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\(int, E const ?&\\);${ws}E\\(int\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype e" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype e" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}virtual int f \\((void|)\\);${ws}virtual int vg \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype e (aCC)" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\(int, E const ?&\\);)|(${ws}E\\(int\\);)|(${ws}virtual int f\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype e (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype e" + } + timeout { + fail "ptype e (timeout)" + } + } + + send_gdb "ptype v\n" + gdb_expect { + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype v" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype v (aCC)" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype v (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype v" + } + timeout { + fail "ptype v (timeout)" + } + } + + send_gdb "ptype vb\n" + gdb_expect { + -re "type = class VB \{${ws}public:${ws}int vb;${ws}VB & operator=\\(VB const ?&\\);${ws}VB\\((VB const|const VB) ?&\\);${ws}VB\\((void|)\\);${ws}int fvb\\((void|)\\);${ws}virtual int vvb\\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype vb" + } + -re "type = class VB \{${ws}public:${ws}int vb;${ws}int fvb \\((void|)\\);${ws}virtual int vvb \\((void|)\\);${ws}\}$nl$gdb_prompt $" { + pass "ptype vb (aCC)" + } + -re "type = class VB \{${ws}public:${ws}int vb;((${ws}VB & operator=\\(VB const ?&\\);)|(${ws}VB\\(VB const ?&\\);)|(${ws}VB\\((void|)\\);)|(${ws}int fvb\\((void|)\\);)|(${ws}virtual int vvb\\((void|)\\);))*${ws}\}$nl$gdb_prompt $" { + pass "ptype vb (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype vb" + } + timeout { + fail "ptype vb (timeout)" + } + } + + send_gdb "ptype pAa\n" + gdb_expect { + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAa" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAa" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAa (aCC)" + } + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAa (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pAa" + } + timeout { + fail "ptype pAa (timeout)" + } + } + + send_gdb "ptype pAe\n" + gdb_expect { + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\(int, A const ?&\\);${ws}A\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAe" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}A & operator=\\(A const ?&\\);${ws}A\\((A const|const A) ?&\\);${ws}A\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAe" + } + -re "type = class A : public virtual V \{${ws}private:${ws}int a;${ws}public:${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAe (aCC)" + } + -re "type = class A : public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}int a;${ws}public:((${ws}A & operator=\\(A const ?&\\);)|(${ws}A\\(int, A const ?&\\);)|(${ws}A\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pAe (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pAe" + } + timeout { + fail "ptype pAe (timeout)" + } + } + + send_gdb "ptype pBe\n" + gdb_expect { + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\(int, B const ?&\\);${ws}B\\(int\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pBe" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}B & operator=\\(B const ?&\\);${ws}B\\((B const|const B) ?&\\);${ws}B\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pBe" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:${ws}virtual int f \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pBe (aCC)" + } + -re "type = class B : public A \{${ws}private:${ws}int b;${ws}public:((${ws}B & operator=\\(B const ?&\\);)|(${ws}B\\(int, B const ?&\\);)|(${ws}B\\(int\\);)|(${ws}virtual int f\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pBe (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pBe" + } + timeout { + fail "ptype pBe (timeout)" + } + } + + send_gdb "ptype pDd\n" + gdb_expect { + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDd" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDd" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDd (aCC)" + } + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDd (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pDd" + } + timeout { + fail "ptype pDd (timeout)" + } + } + + send_gdb "ptype pDe\n" + gdb_expect { + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\(int, D const ?&\\);${ws}D\\(int\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDe" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}D & operator=\\(D const ?&\\);${ws}D\\((D const|const D) ?&\\);${ws}D\\((void|)\\);${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDe" + } + -re "type = class D : public AD, public virtual V \{${ws}public:${ws}int d;${ws}static void s\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vd\\((void|)\\);${ws}int fd\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDe (aCC)" + } + -re "type = class D : public AD, public virtual V \{${ws}private:${ws}V \\*${vbptr}V;${ws}public:${ws}int d;((${ws}D & operator=\\(D const ?&\\);)|(${ws}D\\(int, D const ?&\\);)|(${ws}D\\(int\\);)|(${ws}static void s\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vd\\((void|)\\);)|(${ws}int fd\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pDe (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pDe" + } + timeout { + fail "ptype pDe (timeout)" + } + } + + send_gdb "ptype pVa\n" + gdb_expect { + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVa" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVa (aCC)" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVa (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pVa" + } + timeout { + fail "ptype pVa (timeout)" + } + } + + send_gdb "ptype pVv\n" + gdb_expect { + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVv" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVv (aCC)" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVv (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pVv" + } + timeout { + fail "ptype pVv (timeout)" + } + } + + send_gdb "ptype pVe\n" + gdb_expect { + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVe" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVe (aCC)" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVe (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pVe" + } + timeout { + fail "ptype pVe (timeout)" + } + } + + send_gdb "ptype pVd\n" + gdb_expect { + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}V & operator=\\(V const ?&\\);${ws}V\\((V const|const V) ?&\\);${ws}V\\((void|)\\);${ws}int f\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVd" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;${ws}int f \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVd (aCC)" + } + -re "type = class V : public VA, public VB \{${ws}public:${ws}int w;((${ws}V & operator=\\(V const ?&\\);)|(${ws}V\\(V const ?&\\);)|(${ws}V\\((void|)\\);)|(${ws}int f\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVd (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pVd" + } + timeout { + fail "ptype pVd (timeout)" + } + } + + send_gdb "ptype pADe\n" + gdb_expect { + -re "type = class AD \{${ws}public:${ws}AD & operator=\\(AD const ?&\\);${ws}AD\\((AD const|const AD) ?&\\);${ws}AD\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pADe" + } + -re "type = class AD \{${ws}public:${ws}virtual int vg \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pADe (aCC)" + } + -re "type = class AD \{${ws}public:((${ws}AD & operator=\\(AD const ?&\\);)|(${ws}AD\\(AD const ?&\\);)|(${ws}AD\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pADe (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pADe" + } + timeout { + fail "ptype pADe (timeout)" + } + } + + send_gdb "ptype pEe\n" + gdb_expect { + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\(int, E const ?&\\);${ws}E\\(int\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pEe" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}E & operator=\\(E const ?&\\);${ws}E\\((E const|const E) ?&\\);${ws}E\\((void|)\\);${ws}virtual int f\\((void|)\\);${ws}virtual int vg\\((void|)\\);${ws}virtual int vv\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pEe" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;${ws}virtual int f \\((void|)\\);${ws}virtual int vg \\((void|)\\);${ws}virtual int vv \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pEe (aCC)" + } + -re "type = class E : public B, public virtual V, public D, public C \{${ws}public:${ws}int e;((${ws}E & operator=\\(E const ?&\\);)|(${ws}E\\(int, E const ?&\\);)|(${ws}E\\(int\\);)|(${ws}virtual int f\\((void|)\\);)|(${ws}virtual int vg\\((void|)\\);)|(${ws}virtual int vv\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pEe (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pEe" + } + timeout { + fail "ptype pEe (timeout)" + } + } + + send_gdb "ptype pVB\n" + gdb_expect { + -re "type = class VB \{${ws}public:${ws}int vb;${ws}VB & operator=\\(VB const ?&\\);${ws}VB\\((VB const|const VB) ?&\\);${ws}VB\\((void|)\\);${ws}int fvb\\((void|)\\);${ws}virtual int vvb\\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVB" + } + -re "type = class VB \{${ws}public:${ws}int vb;${ws}int fvb \\((void|)\\);${ws}virtual int vvb \\((void|)\\);${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVB (aCC)" + } + -re "type = class VB \{${ws}public:${ws}int vb;((${ws}VB & operator=\\(VB const ?&\\);)|(${ws}VB\\(VB const ?&\\);)|(${ws}VB\\((void|)\\);)|(${ws}int fvb\\((void|)\\);)|(${ws}virtual int vvb\\((void|)\\);))*${ws}\} \[*\]+$nl$gdb_prompt $" { + pass "ptype pVB (obsolescent gcc or gdb)" + } + -re ".*$gdb_prompt $" { + fail "ptype pVB" + } + timeout { + fail "ptype pVB (timeout)" + } + } +} + +# +# Test calling of virtual functions. +# + +proc test_virtual_calls {} { + global gdb_prompt + global GDB + global nl + global gcc_compiled + + if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + return 0 + } + + send_gdb "print pAe->f()\n" + gdb_expect { + -re ".* = 20$nl$gdb_prompt $" { pass "print pAe->f()" } + -re "Cannot invoke functions on this machine.*$gdb_prompt $" { + fail "print pAe->f() (cannot invoke functions, skipping virtual calls)" + return 0 + } + -re ".*Cannot access memory at address 0x8.*$gdb_prompt $" { + fail "print pAe->f() \ +(known failure with gcc cygnus-2.4.5-930417, skipping virtual calls)" + return 0 + } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pAe->f()" + } + -re ".*$gdb_prompt $" { fail "print pAe->f()" } + timeout { fail "print pAe->f() (timeout)" } + eof { fail "print pAe->f() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pAa->f()\n" + gdb_expect { + -re ".* = 1$nl$gdb_prompt $" { pass "print pAa->f()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pAa->f()" + } + -re ".*$gdb_prompt $" { fail "print pAa->f()" } + timeout { fail "print pAa->f() (timeout)" } + eof { fail "print pAa->f() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pDe->vg()\n" + gdb_expect { + -re ".* = 202$nl$gdb_prompt $" { pass "print pDe->vg()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pDe->vg()" + } + -re ".*$gdb_prompt $" { fail "print pDe->vg()" } + timeout { fail "print pDe->vg() (timeout)" } + eof { fail "print pDe->vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pADe->vg()\n" + gdb_expect { + -re ".* = 202$nl$gdb_prompt $" { pass "print pADe->vg()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pADe->vg()" + } + -re ".*$gdb_prompt $" { fail "print pADe->vg()" } + timeout { fail "print pADe->vg() (timeout)" } + eof { fail "print pADe->vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pDd->vg()\n" + gdb_expect { + -re ".* = 101$nl$gdb_prompt $" { pass "print pDd->vg()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pDd->vg()" + } + -re ".*$gdb_prompt $" { fail "print pDd->vg()" } + timeout { fail "print pDd->vg() (timeout)" } + eof { fail "print pDd->vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pEe->vvb()\n" + gdb_expect { + -re ".* = 411$nl$gdb_prompt $" { pass "print pEe->vvb()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pEe->vvb()" + } + -re ".*$gdb_prompt $" { fail "print pEe->vvb()" } + timeout { fail "print pEe->vvb() (timeout)" } + eof { fail "print pEe->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pVB->vvb()\n" + gdb_expect { + -re ".* = 407$nl$gdb_prompt $" { pass "print pVB->vvb()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pVB->vvb()" + } + -re ".*$gdb_prompt $" { fail "print pVB->vvb()" } + timeout { fail "print pVB->vvb() (timeout)" } + eof { fail "print pVB->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pBe->vvb()\n" + gdb_expect { + -re ".* = 411$nl$gdb_prompt $" { pass "print pBe->vvb()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pBe->vvb()" + } + -re ".*$gdb_prompt $" { fail "print pBe->vvb()" } + timeout { fail "print pBe->vvb() (timeout)" } + eof { fail "print pBe->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pDe->vvb()\n" + gdb_expect { + -re ".* = 411$nl$gdb_prompt $" { pass "print pDe->vvb()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pDe->vvb()" + } + -re ".*$gdb_prompt $" { fail "print pDe->vvb()" } + timeout { fail "print pDe->vvb() (timeout)" } + eof { fail "print pDe->vvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pEe->vd()\n" + gdb_expect { + -re ".* = 282$nl$gdb_prompt $" { pass "print pEe->vd()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pEe->vd()" + } + -re ".*$gdb_prompt $" { fail "print pEe->vd()" } + timeout { fail "print pEe->vd() (timeout)" } + eof { fail "print pEe->vd() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + send_gdb "print pEe->fvb()\n" + gdb_expect { + -re ".* = 311$nl$gdb_prompt $" { pass "print pEe->fvb()" } + -re "Cannot resolve .* to any overloaded instance.*$gdb_prompt $" { + setup_xfail hppa*-*-* CLLbs16899 + fail "print pEe->fvb()" + } + -re ".*$gdb_prompt $" { fail "print pEe->fvb()" } + timeout { fail "print pEe->fvb() (timeout)" } + eof { fail "print pEe->fvb() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } + + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=2.95.3, goption=-gdwarf-2. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=2.95.3, goption=-gstabs+. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=3.0.3, goption=-gdwarf-2. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=3.0.3, goption=-gstabs+. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=3.0.4-20020215, goption=-gdwarf-2. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=3.0.4-20020215, goption=-gstabs+. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=gcc-3_0-branch%2002-02-16, goption=-gdwarf-2. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=gcc-3_0-branch%2002-02-16, goption=-gstabs+. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=HEAD%2002-02-16, goption=-gdwarf-2. + # + # fails on target=native, host=i686-pc-linux-gnu%rh-7.2, + # gdb=HEAD%2002-02-16, gcc=HEAD%2002-02-16, goption=-gstabs+. + # + # -- chastain 2002-02-20 + + send_gdb "print pEe->D::vg()\n" + gdb_expect { + -re ".* = 102$nl$gdb_prompt $" { pass "print pEe->D::vg()" } + -re "Attempt to take address of value not located in memory.\r\n$gdb_prompt $" + { kfail "gdb/1064" "print pEe->D::vg()" } + -re ".*$gdb_prompt $" { fail "print pEe->D::vg()" } + timeout { fail "print pEe->D::vg() (timeout)" } + eof { fail "print pEe->D::vg() ($GDB dumped core) (FIXME)" ; gdb_virtfunc_restart; return } + } +} + +proc do_tests {} { + global prms_id + global bug_id + + set prms_id 0 + set bug_id 0 + + gdb_start; + gdb_virtfunc_init; + + runto_main + + test_ptype_of_classes + + if [ runto 'test_calls' ] then { + test_virtual_calls + } +} + +do_tests -- cgit v1.1