aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python/py-xmethods.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/testsuite/gdb.python/py-xmethods.cc')
-rw-r--r--gdb/testsuite/gdb.python/py-xmethods.cc170
1 files changed, 170 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.python/py-xmethods.cc b/gdb/testsuite/gdb.python/py-xmethods.cc
new file mode 100644
index 0000000..96637d8
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-xmethods.cc
@@ -0,0 +1,170 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2014 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/>. */
+
+#include <iostream>
+
+using namespace std;
+
+namespace dop
+{
+
+class A
+{
+public:
+ int a;
+ int array [10];
+ virtual ~A ();
+ int operator+ (const A &obj);
+ int operator- (const A &obj);
+ virtual int geta (void);
+};
+
+A::~A () { }
+
+int
+A::operator+ (const A &obj)
+{
+ cout << "From CC <A_plus_A>:" << endl;
+ return a + obj.a;
+}
+
+int
+A::operator- (const A &obj)
+{
+ cout << "From CC <A_minus_A>:" << endl;
+ return a - obj.a;
+}
+
+int
+A::geta (void)
+{
+ cout << "From CC A::geta:" << endl;
+ return a;
+}
+
+class B : public A
+{
+public:
+ virtual int geta (void);
+};
+
+int
+B::geta (void)
+{
+ cout << "From CC B::geta:" << endl;
+ return 2 * a;
+}
+
+typedef B Bt;
+
+typedef Bt Btt;
+
+class E : public A
+{
+public:
+ /* This class has a member named 'a', while the base class also has a
+ member named 'a'. When one invokes A::geta(), A::a should be
+ returned and not E::a as the 'geta' method is defined on class 'A'.
+ This class tests this aspect of debug methods. */
+ int a;
+};
+
+template <typename T>
+class G
+{
+ public:
+ template <typename T1>
+ int size_diff ();
+
+ template <int M>
+ int size_mul ();
+
+ template <typename T1>
+ T mul(const T1 t1);
+
+ public:
+ T t;
+};
+
+template <typename T>
+template <typename T1>
+int
+G<T>::size_diff ()
+{
+ cout << "From CC G<>::size_diff:" << endl;
+ return sizeof (T1) - sizeof (T);
+}
+
+template <typename T>
+template <int M>
+int
+G<T>::size_mul ()
+{
+ cout << "From CC G<>::size_mul:" << endl;
+ return M * sizeof (T);
+}
+
+template <typename T>
+template <typename T1>
+T
+G<T>::mul (const T1 t1)
+{
+ cout << "From CC G<>::mul:" << endl;
+ return t1 * t;
+}
+
+} // namespaxe dop
+
+using namespace dop;
+
+int main(void)
+{
+ A a1, a2;
+ a1.a = 5;
+ a2.a = 10;
+
+ B b1;
+ b1.a = 30;
+ A *a_ptr = &b1;
+
+ Bt bt;
+ bt.a = 40;
+
+ Btt btt;
+ btt.a = -5;
+
+ G<int> g, *g_ptr;
+ g.t = 5;
+ g_ptr = &g;
+
+ E e;
+ E &e_ref = e;
+ E *e_ptr = &e;
+ e.a = 1000;
+ e.A::a = 100;
+
+ int diff = g.size_diff<float> ();
+ int smul = g.size_mul<2> ();
+ int mul = g.mul (1.0);
+
+ for (int i = 0; i < 10; i++)
+ {
+ a1.array[i] = a2.array[i] = i;
+ }
+
+ return 0; /* Break here. */
+}