diff options
author | Keith Seitz <keiths@redhat.com> | 2012-11-16 20:54:30 +0000 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2012-11-16 20:54:30 +0000 |
commit | 8dea366bbed7986295681c101dcfbd35aeb6dfc4 (patch) | |
tree | 93ea9e7541e15d6a5701533e7854dc346863854e /gdb/testsuite | |
parent | e64e03922ca4da2d3da887a467076eda615c62bd (diff) | |
download | binutils-gdb-8dea366bbed7986295681c101dcfbd35aeb6dfc4.tar.gz |
PR c++/13615
* cp-namespace.c (cp_lookup_symbol_in_namespace): Add SEARCH
parameter and pass it to lookup_symbol_file.
(cp_lookup_symbol_imports): Tell cp_lookup_symbol_in_namespace
to search base classes.
(cp_lookup_symbol_namespace): Likewise.
(lookup_namespace_scope): Likewise.
(lookup_symbol_file): Add SEARCH parameter.
If SEARCH is non-zero and no symbol is found, lookup the class
and call cp_lookup_nested_symbol.
(find_symbol_in_baseclass): New function.
(cp_lookup_nested_symbol): Do not let
cp_lookup_symbol_in_namespace search through base classes.
Do that later when there is no global symbol match.
PR c++/13615
* gdb.cp/baseenum.cc: New file.
* gdb.cp/baseenum.exp: New file.
* gdb.cp/derivation.cc (A): Add copyright.
Add a typedef.
(B): Use A::value_type instead of int. Change all references.
(D): Use value_type instead of int. Change all references.
(E): Likewise.
(F); Likewise.
(Z): New class.
(ZZ): New class.
(N, Base, Derived): New namespace and classes.
(main): Add instances of Z and ZZ.
Make sure all symbols from N are kept.
* gdb.cp/derivation.exp: Update typedef changes in tests.
Add tests for class typedefs both before and after starting
the inferior.
Add tests for searching for a typedef while stopped in a
method.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 22 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/baseenum.cc | 81 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/baseenum.exp | 36 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/derivation.cc | 127 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/derivation.exp | 87 |
5 files changed, 299 insertions, 54 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e804ba8c7f2..805b055bfe9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,25 @@ +2012-11-16 Keith Seitz <keiths@redhat.com> + + PR c++/13615 + * gdb.cp/baseenum.cc: New file. + * gdb.cp/baseenum.exp: New file. + * gdb.cp/derivation.cc (A): Add copyright. + Add a typedef. + (B): Use A::value_type instead of int. Change all references. + (D): Use value_type instead of int. Change all references. + (E): Likewise. + (F); Likewise. + (Z): New class. + (ZZ): New class. + (N, Base, Derived): New namespace and classes. + (main): Add instances of Z and ZZ. + Make sure all symbols from N are kept. + * gdb.cp/derivation.exp: Update typedef changes in tests. + Add tests for class typedefs both before and after starting + the inferior. + Add tests for searching for a typedef while stopped in a + method. + 2012-11-14 Luis Machado <lgustavo@codesourcery.com> * gdb.mi/mi-var-create-rtti.c: New file. diff --git a/gdb/testsuite/gdb.cp/baseenum.cc b/gdb/testsuite/gdb.cp/baseenum.cc new file mode 100644 index 00000000000..a9e713fe9d2 --- /dev/null +++ b/gdb/testsuite/gdb.cp/baseenum.cc @@ -0,0 +1,81 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2003-2004, 2007-2012 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +class A +{ +public: + enum E {X,Y,Z}; +}; + +class B1 : public A +{ +}; + +class B2 : public A +{ +}; + +class C : public B1, public B2 +{ +public: + void test(E e); +}; + +void C::test(E e) +{ + if (e == X) // breakpoint 1 + { + } +} + +namespace N +{ + class A + { + public: + enum E {X, Y, Z}; + }; + + class B1 {}; + class B2 : public A {}; + + class C : public B1, public B2 + { + public: + void test (E e); + }; + + void + C::test (E e) + { + if (e == X) // breakpoint 2 + { + } + } +} + +int main() +{ + C c; + c.test(A::X); + + N::C nc; + nc.test (N::A::X); + return 0; +} + diff --git a/gdb/testsuite/gdb.cp/baseenum.exp b/gdb/testsuite/gdb.cp/baseenum.exp new file mode 100644 index 00000000000..826b4aab958 --- /dev/null +++ b/gdb/testsuite/gdb.cp/baseenum.exp @@ -0,0 +1,36 @@ +# Copyright 2012 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 3 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, see <http://www.gnu.org/licenses/>. + +# Test searching enum constant symbols derived from base classes. + +standard_testfile .cc + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +if {![runto_main]} { + untested "could not run to main" + return -1 +} + +gdb_breakpoint [gdb_get_line_number "breakpoint 1" $srcfile] +gdb_continue_to_breakpoint "breakpoint 1" +gdb_test "print X" "= A::X" "Print enum constant X of class A" + +gdb_breakpoint [gdb_get_line_number "breakpoint 2" $srcfile] +gdb_continue_to_breakpoint "breakpoint 2" +gdb_test "print X" "= N::A::X" \ + "Print enum constant X of class A in namespace N" diff --git a/gdb/testsuite/gdb.cp/derivation.cc b/gdb/testsuite/gdb.cp/derivation.cc index fcd57ce22ba..da9f64d2a39 100644 --- a/gdb/testsuite/gdb.cp/derivation.cc +++ b/gdb/testsuite/gdb.cp/derivation.cc @@ -1,32 +1,63 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2003-2004, 2007-2012 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 3 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, see <http://www.gnu.org/licenses/>. + */ + +namespace N { + typedef double value_type; + struct Base { typedef int value_type; }; + struct Derived : public Base { + void doit (void) const { + int i = 3; + + while (i > 0) + --i; + } + }; +} + class A { public: - int a; - int aa; + typedef int value_type; + value_type a; + value_type aa; A() { a=1; aa=2; } - int afoo(); - int foo(); - + value_type afoo(); + value_type foo(); }; class B { public: - int b; - int bb; + A::value_type b; + A::value_type bb; B() { b=3; bb=4; } - int bfoo(); - int foo(); + A::value_type bfoo(); + A::value_type foo(); }; @@ -51,48 +82,48 @@ public: class D : private A, public B, protected C { public: - int d; - int dd; + value_type d; + value_type dd; D() { d =7; dd=8; } - int dfoo(); - int foo(); + value_type dfoo(); + value_type foo(); }; class E : public A, B, protected C { public: - int e; - int ee; + value_type e; + value_type ee; E() { e =9; ee=10; } - int efoo(); - int foo(); + value_type efoo(); + value_type foo(); }; class F : A, public B, C { public: - int f; - int ff; + value_type f; + value_type ff; F() { f =11; ff=12; } - int ffoo(); - int foo(); + value_type ffoo(); + value_type foo(); }; @@ -118,6 +149,19 @@ public: }; +class Z : public A +{ +public: + typedef float value_type; + value_type z; +}; + +class ZZ : public Z +{ +public: + value_type zz; +}; + class V_base { public: @@ -150,27 +194,27 @@ public: V_derived vderived; -int A::afoo() { +A::value_type A::afoo() { return 1; } -int B::bfoo() { +A::value_type B::bfoo() { return 2; } -int C::cfoo() { +A::value_type C::cfoo() { return 3; } -int D::dfoo() { +D::value_type D::dfoo() { return 4; } -int E::efoo() { +E::value_type E::efoo() { return 5; } -int F::ffoo() { +F::value_type F::ffoo() { return 6; } @@ -178,37 +222,37 @@ int G::gfoo() { return 77; } -int A::foo() +A::value_type A::foo() { return 7; } -int B::foo() +A::value_type B::foo() { return 8; } -int C::foo() +A::value_type C::foo() { return 9; } -int D::foo() +D::value_type D::foo() { return 10; } -int E::foo() +E::value_type E::foo() { return 11; } -int F::foo() +F::value_type F::foo() { return 12; @@ -236,7 +280,9 @@ int main(void) E e_instance; F f_instance; G g_instance; - + Z z_instance; + ZZ zz_instance; + marker1(); // marker1-returns-here a_instance.a = 20; // marker1-returns-here @@ -251,10 +297,15 @@ int main(void) e_instance.ee =29; f_instance.f =30; f_instance.ff =31; - - - - + g_instance.g = 32; + g_instance.gg = 33; + z_instance.z = 34.0; + zz_instance.zz = 35.0; + + N::Derived dobj; + N::Derived::value_type d = 1; + N::value_type n = 3.0; + dobj.doit (); return 0; } diff --git a/gdb/testsuite/gdb.cp/derivation.exp b/gdb/testsuite/gdb.cp/derivation.exp index 68eff4b9758..594ef1dd0af 100644 --- a/gdb/testsuite/gdb.cp/derivation.exp +++ b/gdb/testsuite/gdb.cp/derivation.exp @@ -38,6 +38,18 @@ if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { return -1 } +# Check inheritance of typedefs. +foreach klass {"A" "D" "E" "F"} { + gdb_test "ptype ${klass}::value_type" "type = int" + gdb_test "whatis ${klass}::value_type" "type = int" + gdb_test "p (${klass}::value_type) 0" " = 0" +} +foreach klass {"Z" "ZZ"} { + gdb_test "ptype ${klass}::value_type" "type = float" + gdb_test "whatis ${klass}::value_type" "type = float" + gdb_test "p (${klass}::value_type) 0" " = 0" +} + # Set it up at a breakpoint so we can play with the variable values. if ![runto 'marker1'] then { @@ -56,11 +68,12 @@ gdb_test "print a_instance" "\\$\[0-9\]+ = \{a = 1, aa = 2\}" "print value of a_ cp_test_ptype_class \ "a_instance" "" "class" "A" \ { - { field public "int a;" } - { field public "int aa;" } + { field public "A::value_type a;" } + { field public "A::value_type aa;" } { method public "A();" } - { method public "int afoo();" } - { method public "int foo();" } + { method public "A::value_type afoo();" } + { method public "A::value_type foo();" } + { typedef public "typedef int value_type;" } } # class D @@ -77,11 +90,11 @@ cp_test_ptype_class \ { base "private A" } { base "public B" } { base "protected C" } - { field public "int d;" } - { field public "int dd;" } + { field public "A::value_type d;" } + { field public "A::value_type dd;" } { method public "D();" } - { method public "int dfoo();" } - { method public "int foo();" } + { method public "A::value_type dfoo();" } + { method public "A::value_type foo();" } } \ "" \ { @@ -102,11 +115,11 @@ cp_test_ptype_class \ { base "public A" } { base "private B" } { base "protected C" } - { field public "int e;" } - { field public "int ee;" } + { field public "A::value_type e;" } + { field public "A::value_type ee;" } { method public "E();" } - { method public "int efoo();" } - { method public "int foo();" } + { method public "A::value_type efoo();" } + { method public "A::value_type foo();" } } \ "" \ { @@ -127,11 +140,11 @@ cp_test_ptype_class \ { base "private A" } { base "public B" } { base "private C" } - { field public "int f;" } - { field public "int ff;" } + { field public "A::value_type f;" } + { field public "A::value_type ff;" } { method public "F();" } - { method public "int ffoo();" } - { method public "int foo();" } + { method public "A::value_type ffoo();" } + { method public "A::value_type foo();" } } # class G @@ -193,6 +206,35 @@ gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" { gdb_test "print g_instance.bfoo()" "\\$\[0-9\]+ = 2" "print value of g_instance.bfoo()" gdb_test "print g_instance.cfoo()" "\\$\[0-9\]+ = 3" "print value of g_instance.cfoo()" +# Check typedefs of fields +foreach Klass {"C" "G"} { + set klass [string tolower $Klass] + set instance "${klass}_instance" + set var "${instance}.$klass" + gdb_test "whatis $var" "int" + gdb_test "ptype $var" "int" +} + +foreach Klass {"A" "B" "D" "E" "F"} { + set klass [string tolower $Klass] + set instance "${klass}_instance" + set var "${instance}.$klass" + gdb_test "whatis $var" "A::value_type" + gdb_test "ptype $var" "int" + if {![string equal $Klass "B"]} { + gdb_test "p (${Klass}::value_type) 0" " = 0" + } +} + +foreach Klass {"Z" "ZZ"} { + set klass [string tolower $Klass] + set instance "${klass}_instance" + set var "${instance}.$klass" + gdb_test "whatis $var" "Z::value_type" + gdb_test "ptype $var" "float" + gdb_test "p (${Klass}::value_type) 0" " = 0" +} + # This is a regression test for a bug that caused a crash when trying # to print the vtbl pointer. We don't care about the output so much # here (it is tested elsewhere), just that gdb doesn't crash. We test @@ -200,3 +242,16 @@ gdb_test "print g_instance.cfoo()" "\\$\[0-9\]+ = 3" "print value of g_instance. # path calling get_vptr_fieldno. gdb_test "ptype vderived" "type = .*" gdb_test "print vderived" " = {.* inter = 0.*x = 0}" + +# Test whether inheritance of typedefs is properly +# reported when stopped. +gdb_test "ptype N::value_type" "type = double" +gdb_test "ptype N::Derived::value_type" "type = int" + +# Now run to N::Derived::doit and get the type of "value_type" +if {![runto "N::Derived::doit"]} { + perrro "couldn't run to N::Derived::doit" + continue +} + +gdb_test "ptype value_type" "type = int" |