From 1bc5aee63eb72b341f506ad058502cd0361f0d10 Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Tue, 25 Mar 2014 22:37:19 -0700 Subject: Initial checkin of GCC 4.9.0 from trunk (r208799). Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba --- gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C | 19 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C | 19 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C | 8 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C | 4 ++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C | 15 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C | 15 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C | 25 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C | 22 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C | 12 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C | 8 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C | 10 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C | 23 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C | 22 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C | 31 +++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C | 33 ++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C | 22 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C | 29 +++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C | 18 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C | 25 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C | 20 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C | 18 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C | 17 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C | 43 ++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C | 41 ++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C | 70 ++++++++++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C | 10 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C | 17 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C | 70 ++++++++++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C | 76 ++++++++++++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C | 27 ++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C | 27 ++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C | 51 +++++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C | 34 ++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C | 32 +++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C | 6 ++ gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C | 6 ++ gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C | 11 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C | 10 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C | 10 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C | 16 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C | 11 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C | 10 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C | 14 ++++ .../testsuite/g++.dg/inherit/implicit-trivial1.C | 23 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C | 10 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C | 16 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C | 20 ++++++ .../testsuite/g++.dg/inherit/namespace-as-base.C | 9 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C | 15 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C | 34 ++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C | 22 +++++++ .../testsuite/g++.dg/inherit/override-attribs.C | 23 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C | 20 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C | 11 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C | 4 ++ gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C | 9 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C | 21 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C | 25 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C | 17 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C | 19 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C | 17 +++++ .../testsuite/g++.dg/inherit/template-as-base.C | 9 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C | 41 ++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C | 60 +++++++++++++++++ .../gcc/testsuite/g++.dg/inherit/thunk11-aux.cc | 4 ++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C | 11 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h | 16 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C | 19 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C | 12 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C | 23 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C | 22 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C | 16 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C | 55 ++++++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C | 26 ++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C | 8 +++ gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C | 18 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C | 34 ++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C | 25 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C | 19 ++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C | 14 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C | 17 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C | 15 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C | 12 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C | 12 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C | 11 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C | 17 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C | 13 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C | 13 ++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C | 24 +++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C | 29 +++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C | 15 +++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C | 27 ++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C | 48 ++++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C | 44 +++++++++++++ gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C | 14 ++++ 101 files changed, 2149 insertions(+) create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access5.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access6.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access7.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/access8.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/ambig1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/base1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/base2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/base3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/cond1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/conv1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/conv2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/conv3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant10.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant11.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant12.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant13.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant14.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant15.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant16.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant17.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant18.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant19.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant20.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant21.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant5.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant6.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant7.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant8.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/covariant9.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/crash1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/crash2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/crash3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/crash4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/error1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/error2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/error3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/error4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/error5.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/local1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/local2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/local3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/multiple1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/namespace-as-base.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/null1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/operator1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/operator2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/override-attribs.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/override1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/pr30297.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/pr48798.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/pr57942.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/ptrmem3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/pure1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/sizeof1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/template-as-base.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk10.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk11.h create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk5.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk6.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk7.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk8.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/thunk9.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/typedef1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/typeinfo1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/union1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using5.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using6.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/using7.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual1.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual10.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual11.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual2.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual3.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual4.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual5.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual6.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual7.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual8.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/virtual9.C create mode 100644 gcc-4.9/gcc/testsuite/g++.dg/inherit/volatile1.C (limited to 'gcc-4.9/gcc/testsuite/g++.dg/inherit') 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 __debug_alloc : public _Alloc { +public: + static void allocate(); +}; + +template +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 +struct D : private B { + void g() { + f(); + } +}; + +void h() { + D 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 + +// 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 + +// Origin: Wolfgang Bangerth +// 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 struct A : T {}; // { dg-error "struct or class type" } + +struct B; + +A 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 +// 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 +// 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 + +// 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 + +// 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 + +// PR 22604 +// Origin: Volker Reichelt + +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 + +// 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 + +// 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 + +// 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 + +// 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 + +// 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 + +// 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 + +// 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 +// 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 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 + +// { dg-do compile } + +template 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 TypedIfc +{ +public: + virtual ~TypedIfc() { } + virtual operator const T&() const = 0; + virtual const T& operator= (const T& t) = 0; +}; + +template +class NullIfc : public TypedIfc +{ +public: + const Tnative& operator= (const Tnative& t) { return t; } + operator const Tnative&() const { return *(Tnative *)0; } +}; + +typedef TypedIfc INT_TYPEDEFIfc; + +NullIfc 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 struct S { typename T::error type; }; +struct X {}; +void f(S*); +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_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 + +// 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 +// { 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 +// Distilled from PR C++/3656 + +namespace N +{ + template 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 + +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 + +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 + +// 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 (&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 + +// PR 20613:uninformative diagnostic +// Origin: Wolfgang Bangerth + +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 + +// PR 19496: Missing error during parsing. +// Origin: Volker Reichelt + +template 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 + +struct A +{ + operator int (); +}; + +template struct TPL : A +{ + using A::operator T; // { dg-error "operator float" } +}; + +TPL i; +TPL 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 +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(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 +struct C: virtual A { + C() {} + template C(const C&) {} + C func(const class C&) const; + operator bool() const; +}; + +template +struct D: C { + void func2() { + Ca; + a.func(a); + } +}; + +void func3() { + Ca; + 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(*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 +struct A +{ + int a; +}; + +template +struct B : public A +{ +}; + +class D : public B +{ + 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 +#include +#include + +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 + +// { dg-do compile } + +struct V +{ + virtual void foo() = 0; +}; + +void bar(V volatile* p) +{ + p->V::~V(); +} -- cgit v1.2.3