aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/inherit
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.dg/inherit
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/inherit')
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C31
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C33
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C43
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C70
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C76
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C51
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C32
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C6
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C10
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C20
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C21
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C9
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C41
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C60
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc4
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C23
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C22
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C16
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C55
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C26
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C8
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C18
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C34
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C25
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C19
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C14
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C12
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C11
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C17
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C13
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C24
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C29
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C15
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C27
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C48
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C44
-rw-r--r--gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C14
101 files changed, 2149 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C
new file mode 100644
index 000000000..7f2ec6892
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C
@@ -0,0 +1,19 @@
+// Test that we can access a member from an inaccessible base if it has
+// been promoted with a using-declaration.
+
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+struct B: private A
+{
+ using A::i;
+};
+
+struct C: public B
+{
+ void f () { B::i = 0; }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C
new file mode 100644
index 000000000..247799450
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C
@@ -0,0 +1,14 @@
+// Test that a base doesn't get special rights to convert to itself.
+
+struct A {
+ void f ();
+};
+
+struct B: private A { };
+
+B b;
+
+void A::f ()
+{
+ A* ap = &b; // { dg-error "base|inherit" "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C
new file mode 100644
index 000000000..1862bfc34
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+
+class __new_alloc {
+public:
+ static void allocate() {}
+};
+
+template <class _Alloc>
+class __debug_alloc : public _Alloc {
+public:
+ static void allocate();
+};
+
+template <class _Alloc>
+void __debug_alloc<_Alloc>::allocate() {
+ _Alloc::allocate();
+}
+
+template class __debug_alloc<__new_alloc>;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C
new file mode 100644
index 000000000..33f991b66
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C
@@ -0,0 +1,8 @@
+struct Container { int Count(); };
+struct List : private Container {
+ using Container::Count;
+};
+struct INetContentTypeParameterList : private List { void Clear(); };
+void INetContentTypeParameterList::Clear() {
+ Count();//Calling non static but in a non-static method.
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C
new file mode 100644
index 000000000..715a4a3b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C
@@ -0,0 +1,4 @@
+struct S { ~S(); };
+struct T : virtual private S {};
+struct U : private T {};
+U u;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C
new file mode 100644
index 000000000..7645c2d5e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C
@@ -0,0 +1,15 @@
+// PR c++/28588
+
+class Foo {
+ static void f(); // { dg-error "private" }
+ static void f(int);
+ static void g(); // { dg-error "private" }
+};
+
+void h()
+{
+ Foo foo;
+ void (*f)();
+ f = foo.f; // { dg-error "context" }
+ f = foo.g; // { dg-error "context" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C
new file mode 100644
index 000000000..4e2db1479
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C
@@ -0,0 +1,15 @@
+struct B {
+ static void f();
+};
+
+template <typename T>
+struct D : private B {
+ void g() {
+ f();
+ }
+};
+
+void h() {
+ D<int> d;
+ d.g();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C
new file mode 100644
index 000000000..310b7a01a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C
@@ -0,0 +1,25 @@
+// PR c++/29138
+
+class A
+{
+public:
+ int i;
+ class A1
+ {
+ int j;
+ };
+};
+
+class B : private A
+{
+public:
+ A::i; // { dg-warning "deprecated" }
+ A::A1; // { dg-warning "deprecated" }
+};
+
+void
+f ()
+{
+ B b;
+ B::A1 a1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C
new file mode 100644
index 000000000..3596bb598
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C
@@ -0,0 +1,14 @@
+// PR c++/51614
+
+struct A
+{
+ void foo();
+};
+
+struct B : A {};
+struct C : A {};
+
+struct D : B, C
+{
+ D() { A::foo(); } // { dg-error "ambiguous" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C
new file mode 100644
index 000000000..952c6d20f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+// { dg-options "-pedantic-errors -w" }
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Nov 2001 <nathan@nathan@codesourcery.com>
+
+// PR 164
+// Although a direct base can be inaccessible due to ambiguity, that
+// should not blow up synthesized methods.
+
+struct A {int m;};
+struct B : A {int m;};
+struct C : virtual A, B {int m;};
+struct D : B, C {int m;};
+
+void foo2 ()
+{
+ D d;
+ D e (d);
+
+ e = d;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C
new file mode 100644
index 000000000..5c7d812c7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Sep 2004 <nathan@codesourcery.com>
+
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+// Bug 17620. Bogus duplicate base error.
+
+struct S {};
+
+typedef S B;
+
+struct D1 : B {};
+struct D2 : B {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C
new file mode 100644
index 000000000..313d04242
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C
@@ -0,0 +1,8 @@
+// PR c++/35985
+// { dg-do compile }
+
+template<typename T> struct A : T {}; // { dg-error "struct or class type" }
+
+struct B;
+
+A<void (B::*)()> a; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C
new file mode 100644
index 000000000..843c72ca3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C
@@ -0,0 +1,10 @@
+// Origin: jason@redhat.com
+// { dg-do compile }
+
+struct A { A(); A(const A&); int i; };
+struct B: public A { };
+
+int f (bool b, A& ar, B& br)
+{
+ return (b?ar:br).i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C
new file mode 100644
index 000000000..e16c489a2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C
@@ -0,0 +1,23 @@
+typedef struct _A A;
+typedef struct _A B;
+
+void some_function(B *b);
+
+class AClass {
+
+public:
+ operator A*() { return 0;}
+
+};
+
+class BClass :public AClass {
+
+public:
+ operator B*() { return 0;}
+
+};
+
+int main(int argc, char **argv) {
+ BClass b;
+ some_function(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C
new file mode 100644
index 000000000..fd0083825
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C
@@ -0,0 +1,22 @@
+// PR c++/25895
+// { dg-do run }
+
+class base {
+public:
+ base() {}
+private:
+ int val_;
+};
+
+class derived : public base {
+public:
+ derived() {}
+};
+
+static bool x = true ? (derived*)0 : (base*)0;
+
+int main ()
+{
+ if (x)
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C
new file mode 100644
index 000000000..73d8c20f1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C
@@ -0,0 +1,31 @@
+// PR 31074
+// Bug: The reference cast wasn't finding the desired static_cast followed by
+// const_cast interpretation.
+
+struct Shape
+{
+ Shape() {}
+ virtual ~Shape() {}
+};
+
+struct Loop
+{
+ Loop() {}
+ virtual ~Loop() {}
+ virtual void func() {}
+};
+
+struct Rect :
+ public Shape,
+ public Loop
+{
+ Rect() {}
+ virtual ~Rect() {}
+};
+
+int main ()
+{
+ const Rect* rect = new Rect();
+ Loop &l = ((Loop&)(*rect));
+ return (&l != (const Loop *)rect);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C
new file mode 100644
index 000000000..978c3e825
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C
@@ -0,0 +1,33 @@
+// PR c++/5607
+
+// { dg-do run }
+
+class A {
+public:
+ virtual A* getThis() { return this; }
+};
+
+class B {
+int a;
+public:
+ virtual B* getThis() { return this; }
+};
+
+class AB : public A, public B {
+public:
+ virtual AB* getThis() { return this; }
+};
+
+int main ()
+{
+ AB* ab = new AB();
+
+ A* a = ab;
+ B* b = ab;
+
+ if (a->getThis() != a
+ || b->getThis() != b)
+ return 1;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C
new file mode 100644
index 000000000..fe5d03c27
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+// PR c++/12699 ICE with covariancy
+
+struct c1 {
+ virtual void f1() const {}
+};
+
+struct c5 {};
+
+struct c6 : virtual c1 {
+ virtual c5* f33() const {}
+};
+
+struct c13 : virtual c5 { };
+
+struct c17 : virtual c6
+{
+ virtual c13* f33() const {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C
new file mode 100644
index 000000000..acba965f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C
@@ -0,0 +1,29 @@
+// { dg-do compile }
+
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+// PR c++/12700 ICE with covariancy
+
+struct c2 { int i; };
+
+struct c1 {
+ virtual c2& f8() {}
+};
+
+struct c3 : c1, c2 {
+ virtual c2& f8() {}
+};
+
+struct c11 : public c1 {
+ virtual c3& f8() {}
+};
+
+struct c15 : virtual c3 {
+ virtual c2& f8() {}
+};
+
+struct c18 : virtual c11 {
+ virtual c15& f8();
+};
+
+c15& c18::f8() { throw 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C
new file mode 100644
index 000000000..434082abb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Feb 2005<nathan@codesourcery.com>
+
+// PR 20232: ICE on invalid
+
+struct T { };
+
+struct S;
+
+struct B
+{
+ virtual T *Foo (); // { dg-error "overriding" "" }
+};
+
+struct D : B
+{
+ virtual S *Foo (); // { dg-error "invalid covariant" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C
new file mode 100644
index 000000000..af60840c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 May 2005<nathan@codesourcery.com>
+
+// Origin:Andrew Pinski: pinskia@gcc.gnu.org
+// PR 21427: ICE on valid
+
+struct B1 {
+ public:
+ virtual void foo();
+};
+
+struct B2 {
+ public:
+ virtual B2 & bar() = 0;
+};
+
+struct I : public B1, B2 {
+ public:
+ virtual ~I();
+ virtual I & bar();
+};
+
+struct D : public I {
+ virtual ~D();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C
new file mode 100644
index 000000000..13ca877b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com>
+
+// PR 22604
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+struct A;
+
+struct B
+{
+ virtual A* foo(); // { dg-error "overriding" "" }
+};
+
+namespace N
+{
+ struct A : B
+ {
+ virtual A* foo(); // { dg-error "invalid covariant" "" }
+ };
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C
new file mode 100644
index 000000000..4696cc633
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C
@@ -0,0 +1,18 @@
+/* This used to ICE (PR c++/27492) */
+/* { dg-do "compile" } */
+
+struct A {};
+
+class B : A
+{
+ virtual A* foo(); /* { dg-error "overriding" } */
+};
+
+struct C : virtual B
+{
+ virtual C* foo(); /* { dg-error "invalid covariant return type" } */
+};
+
+C* C::foo() { return 0; }
+
+struct D : C {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C
new file mode 100644
index 000000000..de9307e89
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C
@@ -0,0 +1,17 @@
+/* PR c++/28253 This used to ICE. */
+/* { dg-do compile } */
+
+struct A
+{
+ virtual A* foo();
+};
+
+struct B : virtual A
+{
+ virtual B* foo(); /* { dg-error "overriding" } */
+};
+
+struct C : B
+{
+ virtual C& foo(); /* { dg-error "conflicting return type" } */
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C
new file mode 100644
index 000000000..b2de15f7e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C
@@ -0,0 +1,43 @@
+// PR c++/43120
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct A {
+ int a;
+
+ A(int a_) : a(a_) {}
+
+ A(const A &other) { }
+
+ virtual void dummy() {}
+};
+
+struct B {
+ virtual B *clone() const = 0;
+};
+
+struct C : public virtual B {
+ virtual C *clone() const = 0;
+};
+
+struct E* ep;
+struct E : public A, public C {
+ E(int a_) : A(a_) { ep = this; }
+
+ virtual E *clone() const {
+ if (this != ep)
+ abort();
+ return 0;
+ }
+};
+
+int main() {
+ E *a = new E(123);
+ C *c = a;
+ B *b = a;
+ c->clone();
+ b->clone();
+ delete a;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C
new file mode 100644
index 000000000..31e62165e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C
@@ -0,0 +1,41 @@
+// PR c++/47873
+// { dg-do run }
+
+struct Base
+{
+ virtual ~Base(){}
+
+ virtual Base& This() { return *this; }
+};
+
+
+struct Ent : virtual Base
+{
+ void *m_Body;
+
+ Ent& This() { return *this; }
+
+ virtual Ent& body()
+ {
+ return This();
+ }
+
+};
+
+
+struct Msg : virtual Ent
+{
+ Msg()
+ {
+ body();
+ }
+
+ Msg& This() { return *this; }
+};
+
+int main()
+{
+ Msg m;
+
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C
new file mode 100644
index 000000000..22c2b0eb6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C
@@ -0,0 +1,14 @@
+// PR c++/46220
+// According to the letter of the standard this is invalid,
+// but that seems like a bug.
+
+class Baz;
+class Foo {
+public:
+ virtual const Baz* getBaz() = 0;
+};
+class Bar : public Foo {
+public:
+ Baz* getBaz();
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C
new file mode 100644
index 000000000..b6d93d6b5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C
@@ -0,0 +1,70 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>
+
+// covariant returns. Fixed offset.
+
+struct B1;
+struct B2;
+struct D;
+
+struct B1
+{
+ virtual B1 *foo1 () {return this;}
+ virtual B2 *foo2 (D *);
+};
+struct B2
+{
+ virtual B2 *baz1 () {return this;}
+ virtual B1 *baz2 (D *);
+};
+
+struct D : B1, B2
+{
+ virtual D *foo1 () {return this;}
+ virtual D *foo2 (D *d) {return d;}
+ virtual D *baz1 () {return this;}
+ virtual D *baz2 (D *d) {return d;}
+};
+
+B2 *B1::foo2 (D *d) {return d;}
+B1 *B2::baz2 (D *d) {return d;}
+
+int test (B1 *b1, B2 *b2, D *d)
+{
+ if (b1->foo1 () != b1)
+ return 1;
+ if (b2->baz1 () != b2)
+ return 2;
+ if (b1->foo2 (d) != b2)
+ return 3;
+ if (b2->baz2 (d) != b1)
+ return 4;
+ return 0;
+}
+
+int test (D *d)
+{
+ if (d->foo2 (d) != d)
+ return 11;
+ if (d->baz2 (d) != d)
+ return 12;
+ if (d->foo1 () != d)
+ return 13;
+ if (d->baz1 () != d)
+ return 14;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r;
+
+ if ((r = test (&d, &d, &d)))
+ return r;
+ if ((r = test (&d)))
+ return r;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C
new file mode 100644
index 000000000..cf7e196fe
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C
@@ -0,0 +1,10 @@
+// PR c++/51812
+// { dg-do link }
+
+class Object {
+ virtual Object* clone() const;
+};
+class DNA: virtual public Object {
+ virtual DNA* clone() const {return new DNA(*this);}
+};
+int main() { }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C
new file mode 100644
index 000000000..42cdf8700
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C
@@ -0,0 +1,17 @@
+// PR c++/59645
+
+struct A { virtual ~A(); };
+struct B { virtual ~B(); };
+struct C : A, B {};
+
+struct X
+{
+ virtual B* foo(volatile int);
+};
+
+struct Y : X
+{
+ virtual C* foo(volatile int);
+};
+
+C* Y::foo(volatile int) { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C
new file mode 100644
index 000000000..b7024c455
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C
@@ -0,0 +1,70 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>
+
+// covariant returns. Virtual offset.
+
+struct B1;
+struct B2;
+struct D;
+
+struct B1
+{
+ virtual B1 *foo1 () {return this;}
+ virtual B2 *foo2 (D *);
+};
+struct B2
+{
+ virtual B2 *baz1 () {return this;}
+ virtual B1 *baz2 (D *);
+};
+
+struct D : virtual B1, virtual B2
+{
+ virtual D *foo1 () {return this;}
+ virtual D *foo2 (D *d) {return d;}
+ virtual D *baz1 () {return this;}
+ virtual D *baz2 (D *d) {return d;}
+};
+
+B2 *B1::foo2 (D *d) {return d;}
+B1 *B2::baz2 (D *d) {return d;}
+
+int test (B1 *b1, B2 *b2, D *d)
+{
+ if (b1->foo1 () != b1)
+ return 1;
+ if (b2->baz1 () != b2)
+ return 2;
+ if (b1->foo2 (d) != b2)
+ return 3;
+ if (b2->baz2 (d) != b1)
+ return 4;
+ return 0;
+}
+
+int test (D *d)
+{
+ if (d->foo2 (d) != d)
+ return 11;
+ if (d->baz2 (d) != d)
+ return 12;
+ if (d->foo1 () != d)
+ return 13;
+ if (d->baz1 () != d)
+ return 14;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r;
+
+ if ((r = test (&d, &d, &d)))
+ return r;
+ if ((r = test (&d)))
+ return r;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C
new file mode 100644
index 000000000..8f6101b3f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C
@@ -0,0 +1,76 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>
+
+// covariant returns. Fixed & virtual offset.
+
+struct B1;
+struct B2;
+struct D;
+
+struct B1
+{
+ virtual B1 *foo1 () {return this;}
+ virtual B2 *foo2 (D *);
+};
+
+struct B2
+{
+ virtual B2 *baz1 () {return this;}
+ virtual B1 *baz2 (D *);
+};
+
+struct Pad1 { virtual ~Pad1 (){}};
+struct Pad2 { virtual ~Pad2 (){}};
+struct Proxy1 : Pad1, B1 {};
+struct Proxy2 : Pad2, B2 {};
+
+struct D : virtual Proxy1, virtual Proxy2
+{
+ virtual D *foo1 () {return this;}
+ virtual D *foo2 (D *d) {return d;}
+ virtual D *baz1 () {return this;}
+ virtual D *baz2 (D *d) {return d;}
+};
+
+B2 *B1::foo2 (D *d) {return d;}
+B1 *B2::baz2 (D *d) {return d;}
+
+int test (B1 *b1, B2 *b2, D *d)
+{
+ if (b1->foo1 () != b1)
+ return 1;
+ if (b2->baz1 () != b2)
+ return 2;
+ if (b1->foo2 (d) != b2)
+ return 3;
+ if (b2->baz2 (d) != b1)
+ return 4;
+ return 0;
+}
+
+int test (D *d)
+{
+ if (d->foo2 (d) != d)
+ return 11;
+ if (d->baz2 (d) != d)
+ return 12;
+ if (d->foo1 () != d)
+ return 13;
+ if (d->baz1 () != d)
+ return 14;
+ return 0;
+}
+
+int main ()
+{
+ D d;
+ int r;
+
+ if ((r = test (&d, &d, &d)))
+ return r;
+ if ((r = test (&d)))
+ return r;
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C
new file mode 100644
index 000000000..a46b1bf20
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com>
+
+// We ICE'd
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2();
+};
+
+struct c3 : c1
+{
+ virtual c1 &f2();
+};
+
+c1 &c3::f2()
+{
+ throw 0;
+}
+
+struct c4 : virtual c3
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C
new file mode 100644
index 000000000..dc5597153
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C
@@ -0,0 +1,27 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com>
+
+// We ICE'd
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2();
+};
+
+struct c3 : virtual c1
+{
+ virtual c1 &f2();
+};
+
+c1 &c3::f2()
+{
+ throw 0;
+}
+
+struct c4 : virtual c3
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C
new file mode 100644
index 000000000..4f0c7f7dd
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C
@@ -0,0 +1,51 @@
+// { dg-do compile }
+// { dg-prune-output "direct base" }
+// { dg-options "-fdump-class-hierarchy" }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com>
+
+// We ICE'd
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2() volatile;
+};
+
+struct c2
+{
+ int m;
+};
+
+struct c3 : virtual c0, virtual c1, c2
+{
+ virtual c1 &f2() volatile;
+};
+
+struct c4 : virtual c3, virtual c0, virtual c1
+{
+ int m;
+};
+
+struct c6 : c0, c3, c4
+{
+ virtual c1 &f2() volatile;
+};
+
+// f2 appears four times in the c6 vtables:
+// once in c1-in-c3-in-c6 - covariant, virtual base, uses c1 vcall offset and c0 vbase offset
+// { dg-final { scan-tree-dump "24 .*c6::_ZTcv0_n16_v0_n12_NV2c62f2Ev" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "48 .*c6::_ZTcv0_n32_v0_n24_NV2c62f2Ev" "class" { target lp64 } } }
+// once in c3-in-c6 - non-covariant, non-virtual base, calls f2 directly
+// { dg-final { scan-tree-dump "28 .*c6::f2" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "56 .*c6::f2" "class" { target lp64 } } }
+// once in c1-in-c3-in-c4-in-c6 - lost primary
+// { dg-final { scan-tree-dump "80 .*0u" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "160 .*0u" "class" { target lp64 } } }
+// once in c3-in-c4-in-c6 - c3 vcall offset
+// { dg-final { scan-tree-dump "84 .*c6::_ZTv0_n16_NV2c62f2Ev" "class" { target ilp32 } } }
+// { dg-final { scan-tree-dump "168 .*c6::_ZTv0_n32_NV2c62f2Ev" "class" { target lp64 } } }
+
+// { dg-final { cleanup-tree-dump "class" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C
new file mode 100644
index 000000000..33dc43106
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 Dec 2002 <nathan@codesourcery.com>
+
+// ICE with covariant thunks.
+
+struct c0 {};
+
+struct c1 : virtual c0
+{
+ virtual c0 &f2 ();
+};
+
+struct c2
+{
+ int m;
+};
+
+struct c3 : virtual c0, virtual c1, c2
+{
+ virtual c1 &f2 ();
+};
+
+c1 &c3::f2 ()
+{
+ throw 0;
+}
+
+struct c4 : virtual c3, virtual c0, virtual c1 {};
+
+struct c8 : virtual c2, virtual c0 {};
+
+struct c12 : virtual c4, virtual c3, virtual c8 {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C
new file mode 100644
index 000000000..62c3a2202
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C
@@ -0,0 +1,32 @@
+// { dg-do link }
+// { dg-options "-w -ansi -pedantic" }
+
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+// Origin: grigory@stl.sarov.ru
+// PR c++/12698. Duplicate covariant thunks emitted.
+
+struct c1 {};
+
+struct c0 {
+ int i;
+ virtual c1& f10() {}
+};
+
+struct c2 : virtual c1, c0 { };
+
+struct c6 : virtual c2, c0 {
+ virtual c2& f10() {}
+};
+
+struct c14 : virtual c2 { };
+
+struct c19 : virtual ::c6 {
+ virtual class ::c14& f10() {}
+};
+
+int main ()
+{
+ c19 obj;
+}
+
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C
new file mode 100644
index 000000000..d5eb7c26a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C
@@ -0,0 +1,6 @@
+// PR c++/30298
+
+union A {};
+
+struct B : A {}; // { dg-error "fails to be a struct or class type" }
+struct B : A {}; // { dg-error "redefinition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C
new file mode 100644
index 000000000..0d82f773e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C
@@ -0,0 +1,6 @@
+// PR c++/30298
+
+struct A {};
+
+struct B : A, A {}; // { dg-error "duplicate base type" }
+struct B : A, A {}; // { dg-error "redefinition" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C
new file mode 100644
index 000000000..e6094b04a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C
@@ -0,0 +1,11 @@
+// PR c++/51326
+
+struct A
+{
+ virtual int& foo(); // { dg-error "overriding" }
+};
+
+struct B : A
+{
+ B& foo(); // { dg-error "conflicting return type" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C
new file mode 100644
index 000000000..b5b02f101
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C
@@ -0,0 +1,10 @@
+// PR c++/59082
+
+struct A {};
+
+struct B : virtual A, A {}; // { dg-error "duplicate base type" }
+
+A foo(const B &b)
+{
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C
new file mode 100644
index 000000000..1570bf11e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C
@@ -0,0 +1,10 @@
+// PR 12486
+
+struct A { int ma; };
+struct B { };
+
+void foo()
+{
+ B *b;
+ b->A::ma=0; // { dg-error "" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C
new file mode 100644
index 000000000..7d5e2e5d6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C
@@ -0,0 +1,16 @@
+// PR c++/28259
+// { dg-do compile }
+
+struct A
+{
+ virtual A* foo(); // { dg-error "overriding" }
+};
+
+struct B : virtual A; // { dg-error "before" }
+
+struct C : A
+{
+ virtual B* foo(); // { dg-error "invalid covariant" }
+};
+
+B* C::foo() { return 0; }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C
new file mode 100644
index 000000000..0b75b9dfb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C
@@ -0,0 +1,11 @@
+//PR c++/27316
+
+struct A {};
+
+struct B : A
+! // { dg-error "token" }
+{};
+
+struct B : A
+! // { dg-error "token" }
+{};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C
new file mode 100644
index 000000000..4f6866ed8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C
@@ -0,0 +1,10 @@
+//PR c++/28740
+
+struct A { virtual ~A(); };
+
+struct B : A A {}; // { dg-error "expected|initializer|invalid" }
+
+A foo(const B &b) // { dg-error "" }
+{
+ return b;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C
new file mode 100644
index 000000000..e38e106b1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C
@@ -0,0 +1,14 @@
+// PR c++/48489
+
+struct Base{ };
+
+struct Concrete : Base
+{
+ void setValue();
+};
+
+int main()
+{
+ Concrete d;
+ d.Base::setValue(); // { dg-error "struct Base" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C
new file mode 100644
index 000000000..e63bd3435
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C
@@ -0,0 +1,23 @@
+// PR c++/46807
+// { dg-options -std=c++98 }
+// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial,
+// even though doing overload resolution would mean calling the template
+// constructor. In C++0x, we do overload resolution to determine triviality.
+
+struct A
+{
+ A() {}
+private:
+ template <class T> A(T&);
+};
+
+struct B
+{
+ mutable A a;
+};
+
+int main()
+{
+ B b;
+ B b2(b);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C
new file mode 100644
index 000000000..3cb196c38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C
@@ -0,0 +1,10 @@
+// PR c++/17121
+
+struct A {
+ virtual ~A() {}
+};
+
+void tsk_tsk()
+{
+ struct B : public A {};
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C
new file mode 100644
index 000000000..82d812ca2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C
@@ -0,0 +1,16 @@
+// PR c++/17155
+// { dg-do link }
+
+struct A {
+ virtual ~A() {}
+};
+
+
+void tsk_tsk(void)
+{
+ struct B : public A {
+ B(int) {}
+ };
+}
+
+int main () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C
new file mode 100644
index 000000000..b11646422
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C
@@ -0,0 +1,14 @@
+// PR c++/13744 (ice-on-valid-code)
+// Origin: Thom Harp <thomharp@charter.net>
+
+// { dg-do compile }
+
+template<int> void foo()
+{
+ struct A
+ {
+ virtual void bar() { A a(*this); }
+ } a;
+}
+
+template void foo<0>();
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C
new file mode 100644
index 000000000..3eb9fe763
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C
@@ -0,0 +1,20 @@
+// { dg-options "-w" }
+
+struct Base {
+ int b;
+
+ Base(int b) : b(b) { }
+};
+
+struct Derived : public Base {
+ Derived(int d) : Base(d) { }
+};
+
+struct Final : public Derived, public Base {
+ Final(int f) : Derived(f), Base(f-1) { }
+};
+
+int main()
+{
+ Final f(5);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C
new file mode 100644
index 000000000..041c18abc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+namespace Out {
+ namespace In {
+ }
+}
+
+class Klasse : public Out::In { // { dg-error ".*" "" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C
new file mode 100644
index 000000000..0908a01b9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C
@@ -0,0 +1,15 @@
+// PR c++/5453: Test that we don't assume that the pointer target of a
+// reference is non-null just because we know the reference isn't.
+
+// { dg-do run }
+
+struct V { };
+struct A: virtual public V { };
+
+A* ap;
+A*& apr (ap);
+
+int main ()
+{
+ V* vp = apr;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C
new file mode 100644
index 000000000..6ef669c21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C
@@ -0,0 +1,34 @@
+// Test that conversions to base classes happen when calling
+// operators.
+
+// { dg-do run }
+
+extern "C" void abort ();
+
+struct B1;
+struct B2;
+
+B2* p;
+B1* p2;
+
+struct B1 {
+ virtual void f () {}
+};
+
+struct B2 {
+ int i;
+ bool operator!() { if (this != p) abort (); return true; }
+ operator void*() { if (this != p) abort (); return this; }
+};
+
+struct B3 : public B1, public B2 {
+};
+
+int main () {
+ B3 b;
+ p = (B2*) &b;
+ p2 = (B1*) &b;
+ bool b1 = b;
+ bool b2 = !b;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C
new file mode 100644
index 000000000..09407e1b4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C
@@ -0,0 +1,22 @@
+typedef int INT_TYPEDEF;
+
+template<class T>
+class TypedIfc
+{
+public:
+ virtual ~TypedIfc() { }
+ virtual operator const T&() const = 0;
+ virtual const T& operator= (const T& t) = 0;
+};
+
+template<class Tnative>
+class NullIfc : public TypedIfc<Tnative>
+{
+public:
+ const Tnative& operator= (const Tnative& t) { return t; }
+ operator const Tnative&() const { return *(Tnative *)0; }
+};
+
+typedef TypedIfc<INT_TYPEDEF> INT_TYPEDEFIfc;
+
+NullIfc<int> i32;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C
new file mode 100644
index 000000000..6f5c9288e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C
@@ -0,0 +1,23 @@
+// PR c++/14688
+// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+
+class one
+{
+public:
+ virtual void
+ test(void* value); // { dg-error "overriding" }
+};
+
+class two : public one
+{
+public:
+ void __attribute__((regparm(2)))
+ test(void* value); // { dg-error "conflicting type attributes" }
+};
+
+class three : public one
+{
+public:
+ void __attribute__ ((cdecl))
+ test(void* value); // OK
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C
new file mode 100644
index 000000000..8f8004641
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C
@@ -0,0 +1,20 @@
+// { dg-options "-w" }
+
+struct c0 { virtual void f (); };
+struct c1 : public c0 {};
+struct c2 : public c0 {};
+struct c3 : virtual public c0, public c1, public c2 {};
+struct c5 {};
+struct c7 : virtual public c3 {};
+struct c8 : virtual public c1 { virtual void f (); };
+struct c9 {};
+struct c10 : virtual public c8, virtual public c7 {};
+struct c11 : virtual public c5 {};
+struct c12 : virtual public c8, public c7 {};
+struct c13 : public c9, public c3, virtual public c2 {};
+struct c14 : virtual public c1, virtual public c5, virtual public c0,
+ public c2 {};
+struct c15 : public c14, public c12, virtual public c3 {};
+struct c16 : public c12, public c10, public c2 { virtual void f (); };
+struct c17 : virtual public c13, public c15, virtual public c0,
+ virtual public c16 {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C
new file mode 100644
index 000000000..a8edf8485
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C
@@ -0,0 +1,11 @@
+// Regression test for ICE from PR c++/30297.
+
+struct A
+{
+ int i;
+};
+
+extern "C" struct B : A
+{
+ A::i; // { dg-warning "deprecated" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C
new file mode 100644
index 000000000..cc9921e69
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C
@@ -0,0 +1,4 @@
+// PR c++/48798
+
+typedef struct A {} const t;
+struct B : t {};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C
new file mode 100644
index 000000000..580e9ecd2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C
@@ -0,0 +1,9 @@
+// PR c++/57942
+
+template<typename T> struct S { typename T::error type; };
+struct X {};
+void f(S<int>*);
+void f(...);
+void g() { f((X*)0); }
+struct Y;
+void h() { f((Y*)0); }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C
new file mode 100644
index 000000000..375efc811
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C
@@ -0,0 +1,21 @@
+// PR c++/14803
+// { dg-options "-Werror" }
+
+struct sc_module { int member; };
+
+struct sc_signal_in_if { bool state; };
+
+typedef void (sc_module::*SC_ENTRY_FUNC)();
+
+class sc_clock : public sc_signal_in_if, public sc_module
+{
+public:
+ sc_clock();
+ void posedge_action();
+ SC_ENTRY_FUNC fptr;
+};
+
+sc_clock::sc_clock()
+{
+ fptr = static_cast<SC_ENTRY_FUNC>(&sc_clock::posedge_action);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C
new file mode 100644
index 000000000..a13705576
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C
@@ -0,0 +1,25 @@
+// PR c++/16810
+
+struct C {
+ virtual void f() {}
+};
+
+struct B {virtual ~B() {} };
+
+class D : public B, public C
+{
+public:
+ virtual void f() {}
+};
+
+typedef void ( C::*FP)();
+typedef void ( D::*D_f)();
+
+int main() {
+ D *d = new D();
+ C *c = d;
+
+ const FP fptr = (FP) &D::f;;
+ (d->* (D_f)fptr)();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C
new file mode 100644
index 000000000..0c06c65df
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 May 2005 <nathan@codesourcery.com>
+
+// Origin:Andrew Pinski pinskia@gcc.gnu.org
+// PR 21455 bogus error with pointer to member of incomplete
+
+class XMLFile;
+
+typedef bool (XMLFile::*ParserFunctionPtr)();
+
+struct ParserElement
+{
+ ParserFunctionPtr getPreFunc() const { return preFunc; }
+ ParserFunctionPtr getPostFunc() const { return postFunc; }
+ ParserFunctionPtr preFunc;
+ ParserFunctionPtr postFunc;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C
new file mode 100644
index 000000000..ddd3cb332
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C
@@ -0,0 +1,19 @@
+// PR c++/23266
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+// { dg-do compile }
+
+void foo0() = 0; // { dg-error "like a variable" }
+virtual void foo1() = 0; // { dg-error "outside class|variable" }
+
+struct A
+{
+ void foo2() = 0; // { dg-error "non-virtual" }
+ static void foo3() = 0; // { dg-error "static member" }
+ virtual static void foo4() = 0; // { dg-error "both virtual and static" }
+ virtual void foo5() = 0; // { dg-error "base class" }
+};
+
+struct B : A
+{
+ static void foo5() = 0; // { dg-error "static member|declared" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C
new file mode 100644
index 000000000..06d5c9993
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C
@@ -0,0 +1,17 @@
+// PR c++/35007
+
+struct AffEntry
+{
+ union {
+ char base[256];
+ } conds;
+};
+
+struct PfxEntry
+: public AffEntry
+{
+ PfxEntry()
+ {
+ sizeof(conds.base[0]);
+ }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C
new file mode 100644
index 000000000..5d34b15d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C
@@ -0,0 +1,9 @@
+// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
+// Distilled from PR C++/3656
+
+namespace N
+{
+ template<typename> struct X { };
+}
+
+struct A : N::X { }; // { dg-error "expected class-name" "" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C
new file mode 100644
index 000000000..3bbd05069
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C
@@ -0,0 +1,41 @@
+// { dg-do run { target i?86-*-* x86_64-*-* s390*-*-* alpha*-*-* ia64-*-* sparc*-*-* } }
+
+#include <stdarg.h>
+
+extern "C" void abort ();
+
+struct A {
+ virtual void f (int, ...) {}
+ int i;
+};
+
+struct B : virtual public A {
+};
+
+struct C : public B {
+ C ();
+ virtual void f (int, ...);
+};
+
+extern C* cp;
+
+C::C () { cp = this; }
+
+void C::f (int i, ...) {
+ if (this != cp)
+ abort ();
+ va_list ap;
+ if (i != 3)
+ abort ();
+ va_start (ap, i);
+ if (va_arg (ap, int) != 7)
+ abort ();
+ va_end (ap);
+}
+
+C* cp = new C;
+
+int main ()
+{
+ cp->f (3, 7);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C
new file mode 100644
index 000000000..702067749
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C
@@ -0,0 +1,60 @@
+/* { dg-options "-mthumb" { target arm*-*-* } } */
+/* { dg-do run } */
+/* { dg-timeout 100 } */
+
+/* PR middle-end/39378 */
+/* Check if the thunk target function is emitted correctly. */
+class B1
+{
+public:
+ virtual int foo1(void);
+ int b1;
+};
+
+class B2
+{
+public:
+ virtual int foo2 (void);
+ int b2;
+};
+
+class D : public B1, public B2
+{
+ int foo1(void);
+ int foo2(void);
+ int d;
+};
+
+int B1::foo1(void)
+{
+ return 3;
+}
+
+int B2::foo2(void)
+{
+ return 4;
+}
+
+int D::foo1(void)
+{
+ return 1;
+}
+
+int D::foo2(void)
+{
+ return 2;
+}
+
+__attribute__((noinline)) int test(B2* bp)
+{
+ return bp->foo2();
+}
+
+int main()
+{
+ B2 *bp = new D();
+ if (test(bp) == 2)
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
new file mode 100644
index 000000000..7009d6c50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc
@@ -0,0 +1,4 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C
new file mode 100644
index 000000000..6e3bc329c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C
@@ -0,0 +1,11 @@
+// PR c++/42256
+// { dg-do link }
+// { dg-additional-sources "thunk11-aux.cc" }
+// { dg-options "-O2" }
+
+#include "thunk11.h"
+
+int
+main ()
+{
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h
new file mode 100644
index 000000000..641f40e4e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h
@@ -0,0 +1,16 @@
+struct A
+{
+ A () {}
+ virtual ~A () {}
+};
+struct B
+{
+ B () {}
+ virtual ~B () {}
+};
+struct C : public A, public B
+{
+ virtual void foo ();
+ virtual ~C () {};
+};
+inline void C::foo () {}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C
new file mode 100644
index 000000000..094891c7a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C
@@ -0,0 +1,19 @@
+// PR c++/14108
+
+class ClassC {
+public:
+ ~ClassC();
+};
+
+class ClassA {
+ virtual ClassC f();
+};
+
+class ClassB : public virtual ClassA {
+ virtual ClassC f();
+};
+
+ClassC ClassB::f() {
+ return ClassC();
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C
new file mode 100644
index 000000000..9787aa9c6
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C
@@ -0,0 +1,12 @@
+// PR c++/18492
+
+struct X{ ~X(); };
+struct B
+{
+ virtual void a( X ) = 0;
+};
+struct D : public virtual B
+{
+ void a( X );
+};
+void D::a( X ){}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C
new file mode 100644
index 000000000..a6e913e59
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C
@@ -0,0 +1,23 @@
+// PR c++/21123
+
+struct A
+{
+ A( const A &a);
+ const A& operator=( const A& a);
+};
+
+struct B
+{
+ virtual A f();
+};
+
+struct C : virtual B
+{
+ virtual A f();
+ A a;
+};
+
+A C::f()
+{
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C
new file mode 100644
index 000000000..05dba3638
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C
@@ -0,0 +1,22 @@
+// PR c++/21123
+
+struct A
+{
+ A(const A &a);
+ const A& operator=(const A& a);
+};
+
+struct B
+{
+ virtual A f(A);
+};
+
+struct C : virtual B
+{
+ virtual A f(A);
+};
+
+A C::f(A a)
+{
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C
new file mode 100644
index 000000000..b8e316d08
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C
@@ -0,0 +1,16 @@
+// PR c++/26957
+
+struct LongDouble {
+ char ld[16];
+};
+
+struct DynAny {
+ virtual void insert_longdouble(LongDouble value) = 0;
+};
+
+struct TAO_DynCommon : public virtual DynAny {
+ virtual void insert_longdouble (LongDouble value);
+};
+
+void TAO_DynCommon::insert_longdouble (LongDouble value) { }
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C
new file mode 100644
index 000000000..0e16d8954
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C
@@ -0,0 +1,55 @@
+// { dg-do run }
+
+#include <stdlib.h>
+
+class A
+{
+ int a, b;
+public:
+ virtual void foo (int a, int b, int c, int d);
+};
+
+class B
+{
+ int c, d;
+public:
+ virtual void bar (int a, int b, int c, int d);
+};
+
+class D : public virtual A, public virtual B
+{
+ int e, f;
+};
+
+void A::foo(int a, int b, int c, int d)
+{
+ if (a != 1 || b != 2 || c != 3 || d != 4)
+ abort ();
+}
+
+void B::bar (int a, int b, int c, int d)
+{
+ if (a != 5 || b != 6 || c != 7 || d != 8)
+ abort ();
+}
+
+class C: private D, public virtual A, public virtual B
+{
+public:
+ virtual void foo (int a, int b, int c, int d) { A::foo (a, b, c, d); D::A::foo (a, b, c, d); }
+ virtual void bar (int a, int b, int c, int d) { B::bar (a, b, c, d); D::B::bar (a, b, c, d); }
+};
+
+C c1;
+C *c2 = &c1;
+A *c3 = &c1;
+B *c4 = &c1;
+
+int main()
+{
+ c2->foo (1, 2, 3, 4);
+ c2->bar (5, 6, 7, 8);
+ c3->foo (1, 2, 3, 4);
+ c4->bar (5, 6, 7, 8);
+ return 0;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C
new file mode 100644
index 000000000..ef6453568
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C
@@ -0,0 +1,26 @@
+/* PR target/27387
+ We used to generate a non-PIC thunk on thumb even with -fPIC.
+ Make sure that won't happen anymore. */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_thumb1_ok } */
+/* { dg-options "-mthumb -fPIC" } */
+
+struct A {
+ virtual void f ();
+};
+
+struct B {
+ virtual void g ();
+};
+
+struct C : public A, public B {
+ virtual void g();
+};
+
+void
+C::g()
+{
+}
+
+/* { dg-final { scan-assembler "LTHUNKPC" } } */
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C
new file mode 100644
index 000000000..9eb9999f3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/37095
+// { dg-options "-O" }
+
+struct A
+{
+ virtual A *foo ();
+};
+
+struct B : virtual A
+{
+ virtual B *foo () { return 0; }
+};
+
+B b;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C
new file mode 100644
index 000000000..20da08b2c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C
@@ -0,0 +1,8 @@
+namespace NS {
+class X {};
+typedef X Y;
+}
+
+struct Base : virtual public NS::Y {
+ Base() : NS::Y() {}
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C
new file mode 100644
index 000000000..794776ecb
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C
@@ -0,0 +1,18 @@
+typedef struct {
+ virtual const char *blah() {
+ return "Heya::blah";
+ }
+} Heya;
+
+struct Grok : public Heya {
+ virtual const char *blah() {
+ return "Grok::blah";
+ }
+};
+
+int main() {
+ Grok *g = new Grok();
+ delete g;
+ return 0;
+}
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C
new file mode 100644
index 000000000..da46096c8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C
@@ -0,0 +1,14 @@
+// PR c++/15507
+
+struct A {
+ // empty
+};
+
+struct B : A {
+ int b;
+};
+
+union U {
+ A a;
+ B b;
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C
new file mode 100644
index 000000000..03c9144e5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C
@@ -0,0 +1,34 @@
+// Test that overloading on 'this' quals works with class using-declarations.
+
+// { dg-do link }
+
+struct A {
+ void f() const;
+ void f() {}
+ void g() const {}
+ void g();
+ void h() const;
+ void h();
+ void i() const;
+ void i() {}
+};
+
+struct B: private A {
+ using A::f;
+ using A::g;
+ void h () const {}
+ using A::h;
+ void i () const {}
+ using A::i;
+};
+
+int main()
+{
+ B b1;
+ const B b2 = B();
+
+ b1.f ();
+ b2.g ();
+ b2.h ();
+ b1.i ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C
new file mode 100644
index 000000000..19f06e9cc
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C
@@ -0,0 +1,25 @@
+// { dg-do run }
+
+// Copyright (C) 2002 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 15 Sep 2002 <nathan@codesourcery.com>
+
+// PR 7919. Methods found via using decls didn't have their this
+// pointers converted to the final base type.
+
+struct Base {
+ int m;
+ protected:
+ void *Return () { return this; }
+};
+
+struct Derived : Base {
+ using Base::Return;
+ virtual ~Derived () {}
+};
+
+int main ()
+{
+ Derived d;
+
+ return static_cast <Base *> (&d) != d.Return ();
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C
new file mode 100644
index 000000000..d2acf8009
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C
@@ -0,0 +1,19 @@
+class A
+{
+public:
+ typedef int T;
+ int a;
+};
+
+class B : virtual private A
+{
+};
+
+class C : virtual private A, public B
+{
+public:
+ using A::a;
+ using A::T;
+};
+
+C::T x;
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C
new file mode 100644
index 000000000..4b7a28f0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com>
+
+// PR 20613:uninformative diagnostic
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+struct B {
+ void f();
+};
+
+struct D : B {
+ using B::f; // { dg-message "previous declaration" }
+ using B::f; // { dg-error "redeclaration" }
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C
new file mode 100644
index 000000000..b8e51078f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com>
+
+// PR 19496: Missing error during parsing.
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<int> struct A
+{
+ A::A; // { dg-error "constructor|not a base" }
+};
+
+struct B
+{
+ void f ();
+ using B::f; // { dg-error "not a base" }
+};
+
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C
new file mode 100644
index 000000000..1877d671a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com>
+
+struct A
+{
+ operator int ();
+};
+
+template <typename T> struct TPL : A
+{
+ using A::operator T; // { dg-error "operator float" }
+};
+
+TPL<int> i;
+TPL<float> j; // { dg-message "required" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C
new file mode 100644
index 000000000..de177c91d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C
@@ -0,0 +1,12 @@
+// PR c++/51889
+
+struct A {
+ void f();
+};
+
+template <class T>
+struct B: A
+{
+ using A::f;
+ void f();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C
new file mode 100644
index 000000000..08bcbb143
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C
@@ -0,0 +1,12 @@
+//PR c++/27952
+
+struct A
+{
+ virtual ~A() {}
+};
+
+struct B : A, virtual A {}; // { dg-error "duplicate base|forward declaration" }
+
+struct C : A, B {}; // { dg-error "duplicate base|invalid use" }
+
+C c; // { dg-error "aggregate" }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C
new file mode 100644
index 000000000..4cb858b92
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C
@@ -0,0 +1,11 @@
+// PR c++/14263
+
+struct A { };
+
+struct B : virtual A { };
+
+int main()
+{
+ A* p = new B;
+ B* q = static_cast<B*>(p); // { dg-error "cannot convert from pointer to base class 'A' to pointer to derived class 'B' because the base is virtual" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C
new file mode 100644
index 000000000..04c241293
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C
@@ -0,0 +1,17 @@
+// PR c++/59031
+// { dg-do compile }
+// { dg-options "-fdump-tree-gimple " }
+class B {
+ public:
+ virtual int add (int a, int b) {return a+ b;}
+};
+
+class D : public B {
+};
+
+int foo (int a, int b) {
+ D d;
+ return d.add(a, b);
+}
+// { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C
new file mode 100644
index 000000000..9769d4ab7
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C
@@ -0,0 +1,13 @@
+//PR c++/29022
+
+struct A
+{
+ operator int();
+};
+
+struct B : virtual A, A<0> {}; // { dg-error "token" }
+
+int foo(B &b)
+{
+ return b; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C
new file mode 100644
index 000000000..65ae76c0b
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C
@@ -0,0 +1,13 @@
+//PR c++/29022
+
+struct A
+{
+ operator int();
+};
+
+struct B : virtual A; // { dg-error "token" }
+
+int foo(B &b)
+{
+ return b; // { dg-error "cannot convert" }
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C
new file mode 100644
index 000000000..5415fdb3c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C
@@ -0,0 +1,24 @@
+// PR c++/31027
+
+struct A {};
+
+template<typename T>
+struct C: virtual A {
+ C() {}
+ template<typename T_OTHER> C(const C<T_OTHER>&) {}
+ C func(const class C<long>&) const;
+ operator bool() const;
+};
+
+template<typename T>
+struct D: C<T> {
+ void func2() {
+ C<int>a;
+ a.func(a);
+ }
+};
+
+void func3() {
+ C<int>a;
+ a.func(a);
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C
new file mode 100644
index 000000000..bed0ef3a0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C
@@ -0,0 +1,29 @@
+// Test that a synthesized op= can override one from a base.
+// { dg-do run }
+
+struct B;
+
+struct A
+{
+ virtual B& operator=(const B&);
+};
+
+struct B: A
+{
+ B(int i): i(i) { }
+ int i;
+ // implicitly-declared op=
+};
+
+B& A::operator=(const B& b) { return static_cast<B&>(*this); }
+
+int main()
+{
+ B b1 (123);
+ B b2 (0);
+
+ A& ar = b1;
+ ar = b2;
+
+ return b1.i;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C
new file mode 100644
index 000000000..f03696993
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C
@@ -0,0 +1,15 @@
+// PR c++/45473
+
+struct A
+{
+ virtual void B ();
+};
+
+struct B : A
+{
+ B ();
+};
+
+struct C : B
+{
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C
new file mode 100644
index 000000000..61f17fe63
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C
@@ -0,0 +1,27 @@
+// Origin: PR c++/47666
+// { dg-do compile }
+
+template <typename T>
+struct A
+{
+ int a;
+};
+
+template <typename T>
+struct B : public A <T>
+{
+};
+
+class D : public B <D *>
+{
+ virtual D & operator= (const D &);
+};
+
+class E : virtual public D
+{
+};
+
+class F : public E
+{
+ virtual void foo ();
+};
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C
new file mode 100644
index 000000000..4f6a119b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C
@@ -0,0 +1,48 @@
+// PR c++/48035
+// { dg-do run }
+
+#include <new>
+#include <cstring>
+#include <cstdlib>
+
+struct A
+{
+ virtual void foo (void) {}
+ virtual ~A () {}
+};
+
+struct B : public A
+{
+ virtual ~B () {}
+};
+
+struct C
+{
+ virtual ~C () {}
+ int c;
+};
+
+struct D : public virtual B, public C
+{
+ virtual ~D () {}
+};
+
+struct E : public virtual D
+{
+ virtual ~E () {}
+};
+
+int
+main ()
+{
+ char *v = new char[sizeof (E) + 16];
+ memset (v, 0x55, sizeof (E) + 16);
+ E *e = new (v) E ();
+ e->~E ();
+
+ for (unsigned i = sizeof (E); i < sizeof (E) + 16; ++i)
+ if (v[i] != 0x55)
+ abort ();
+
+ delete[] v;
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C
new file mode 100644
index 000000000..03342646f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C
@@ -0,0 +1,44 @@
+// { dg-do run }
+// PR c++/11750
+
+struct A
+{
+ virtual void f() const { __builtin_abort(); }
+ virtual void g() {}
+};
+
+struct B : virtual A
+{
+ virtual void f() const {}
+ virtual void g() { __builtin_abort(); }
+};
+
+struct C : B, virtual A
+{
+ using A::f;
+ using A::g;
+};
+
+int main()
+{
+ C c;
+ c.f(); // call B::f
+
+ C c2;
+ c2.C::g(); // call A::g
+
+ C* c3 = &c;
+ c3->f(); // call B::f
+
+ C& c4 = c;
+ c4.f(); // call B::f
+
+ C const* c5 = &c;
+ c5->f(); // call B::f
+
+ C** c6 = &c3;
+ (*c6)->f(); // call B::f
+
+ C const& c7 = c;
+ c7.f(); // call B::f
+}
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C b/gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C
new file mode 100644
index 000000000..48df50ada
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C
@@ -0,0 +1,14 @@
+// PR c++/19299
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+
+// { dg-do compile }
+
+struct V
+{
+ virtual void foo() = 0;
+};
+
+void bar(V volatile* p)
+{
+ p->V::~V();
+}