Index: gdb/testsuite/gdb.cp/impl-this.cc |
diff --git a/gdb/testsuite/gdb.cp/impl-this.cc b/gdb/testsuite/gdb.cp/impl-this.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6be0ddfb35f3e68443d18a16136c1aba81073673 |
--- /dev/null |
+++ b/gdb/testsuite/gdb.cp/impl-this.cc |
@@ -0,0 +1,135 @@ |
+/* This testcase is part of GDB, the GNU debugger. |
+ |
+ Copyright 2013 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/>. */ |
+ |
+#ifdef DEBUG |
+#include <stdio.h> |
+#endif |
+ |
+template <typename T> |
+class A |
+{ |
+public: |
+ T i; |
+ T z; |
+ A () : i (1), z (10) {} |
+}; |
+ |
+template <typename T> |
+class B : public virtual A<T> |
+{ |
+public: |
+ T i; |
+ T common; |
+ B () : i (2), common (200) {} |
+}; |
+ |
+typedef B<int> Bint; |
+ |
+class C : public virtual A<int> |
+{ |
+public: |
+ int i; |
+ int c; |
+ int common; |
+ C () : i (3), c (30), common (300) {} |
+}; |
+ |
+class BB : public A<int> |
+{ |
+public: |
+ int i; |
+ BB () : i (20) {} |
+}; |
+ |
+class CC : public A<int> |
+{ |
+public: |
+ int i; |
+ CC () : i (30) {} |
+}; |
+ |
+class Ambig : public BB, public CC |
+{ |
+public: |
+ int i; |
+ Ambig () : i (1000) {} |
+}; |
+ |
+class D : public Bint, public C |
+{ |
+public: |
+ int i; |
+ int x; |
+ Ambig am; |
+ D () : i (4), x (40) {} |
+ |
+#ifdef DEBUG |
+#define SUM(X) \ |
+ do \ |
+ { \ |
+ sum += (X); \ |
+ printf ("" #X " = %d\n", (X)); \ |
+ } \ |
+ while (0) |
+#else |
+#define SUM(X) sum += (X) |
+#endif |
+ |
+int |
+f (void) |
+ { |
+ int sum = 0; |
+ |
+ SUM (i); |
+ SUM (D::i); |
+ SUM (D::B<int>::i); |
+ SUM (B<int>::i); |
+ SUM (D::C::i); |
+ SUM (C::i); |
+ SUM (D::B<int>::A<int>::i); |
+ SUM (B<int>::A<int>::i); |
+ SUM (A<int>::i); |
+ SUM (D::C::A<int>::i); |
+ SUM (C::A<int>::i); |
+ SUM (D::x); |
+ SUM (x); |
+ SUM (D::C::c); |
+ SUM (C::c); |
+ SUM (c); |
+ SUM (D::A<int>::i); |
+ SUM (Bint::i); |
+ //SUM (D::Bint::i); |
+ //SUM (D::Bint::A<int>::i); |
+ SUM (Bint::A<int>::i); |
+ // ambiguous: SUM (common); |
+ SUM (B<int>::common); |
+ SUM (C::common); |
+ SUM (am.i); |
+ // ambiguous: SUM (am.A<int>::i); |
+ |
+ return sum; |
+ } |
+}; |
+ |
+int |
+main (void) |
+{ |
+ Bint b; |
+ D d; |
+ |
+ return d.f () + b.i; |
+} |