aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.cp/derivation.cc
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2012-11-16 20:54:30 +0000
committerKeith Seitz <keiths@redhat.com>2012-11-16 20:54:30 +0000
commit8dea366bbed7986295681c101dcfbd35aeb6dfc4 (patch)
tree93ea9e7541e15d6a5701533e7854dc346863854e /gdb/testsuite/gdb.cp/derivation.cc
parente64e03922ca4da2d3da887a467076eda615c62bd (diff)
downloadfsf-binutils-gdb-8dea366bbed7986295681c101dcfbd35aeb6dfc4.zip
fsf-binutils-gdb-8dea366bbed7986295681c101dcfbd35aeb6dfc4.tar.gz
fsf-binutils-gdb-8dea366bbed7986295681c101dcfbd35aeb6dfc4.tar.bz2
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/gdb.cp/derivation.cc')
-rw-r--r--gdb/testsuite/gdb.cp/derivation.cc127
1 files changed, 89 insertions, 38 deletions
diff --git a/gdb/testsuite/gdb.cp/derivation.cc b/gdb/testsuite/gdb.cp/derivation.cc
index fcd57ce..da9f64d 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;
}