diff options
Diffstat (limited to 'gcc/testsuite')
26 files changed, 358 insertions, 4 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C index ee8757f4dcf..98691101e86 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C @@ -9,7 +9,7 @@ struct A struct B : A { - using A::A; // { dg-error "A::i" } + using A::A; // { dg-prune-output "A::i" } }; -constexpr B b(0); // { dg-error "B::B" } +constexpr B b(0); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C index 228e8ec6609..4fc67a4a56a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C @@ -1,4 +1,5 @@ // { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } struct A { diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C new file mode 100644 index 00000000000..61b251eb0ba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A +{ + A(int, ...); +}; + +struct B: A +{ + using A::A; +}; + +B b1(42); +B b2(42, 1.0); // { dg-bogus "ellipsis" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C index c2d33bff4ff..a0b518c19d3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C @@ -2,6 +2,7 @@ // constructors was a deliberate choice. // { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } struct A { A(int); }; struct B: public A diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C new file mode 100644 index 00000000000..a9abb8428a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C @@ -0,0 +1,14 @@ +// P0136 caused us to start inheriting base copy constructors. +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A { A(int); }; +struct B: public A +{ + using A::A; +}; + +A a (42); + +B b1 (24); // inherited +B b2 (a); // also inherited now diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C index e8dc84d32ec..8cbeed66047 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C @@ -1,4 +1,5 @@ // { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } struct B1 { B1(int); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C new file mode 100644 index 00000000000..c9b4ea11412 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct B1 { + B1(int); +}; +struct B2 { + B2(int); +}; +struct D1 : B1, B2 { + using B1::B1; + using B2::B2; +}; // ambiguous +struct D2 : B1, B2 { + using B1::B1; + using B2::B2; + D2(int); // OK: user declaration supersedes both implicit declarations +}; + +D2 d2(42); +D1 d1(42); // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C index 8c79c833a32..d0038c16a14 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C @@ -15,7 +15,7 @@ void test() { D1 e; // { dg-error "deleted" } D1 has no default constructor } struct D2 : B2 { - using B2::B2; // { dg-error "no match" } implicitly declares D2(double) + using B2::B2; // { dg-error "B1::B1" } B1 b; }; D2 f(1.0); // { dg-error "deleted" } B1 has no default constructor diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C index 676605db9e9..5bfdd499d46 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C @@ -9,7 +9,7 @@ protected: struct B: A { - using A::A; // { dg-message "protected" } + using A::A; }; B b(42); // { dg-error "this context" } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C new file mode 100644 index 00000000000..bf9df415c05 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +struct A { }; +struct B: A { }; +struct C: B { using A::A; }; // { dg-error "direct" } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C new file mode 100644 index 00000000000..02ec58a3e8e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C @@ -0,0 +1,33 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } + +struct B1 { + template <class... Ts> + B1(int, Ts...) { } +}; + +struct B2 { + B2(double) { } +}; + +int get(); + +struct D1 : B1 { // { dg-message "B1::B1" } + using B1::B1; // inherits B1(int, ...) + int x; + int y = get(); +}; + +void test() { + D1 d(2, 3, 4); // OK: B1 is initialized by calling B1(2, 3, 4), + // then d.x is default-initialized (no initialization is performed), + // then d.y is initialized by calling get() + D1 e; // { dg-error "" } D1 has a deleted default constructor +} + +struct D2 : B2 { + using B2::B2; // { dg-message "B1::B1" } + B1 b; +}; + +D2 f(1.0); // { dg-error "" } B1 has no default constructor diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C new file mode 100644 index 00000000000..0c862f7573f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C @@ -0,0 +1,19 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } +// { dg-options "-fnew-inheriting-ctors -fdump-tree-gimple" } + +struct W { W(int); }; +struct V: W { using W::W; }; +struct X : virtual V { using V::V; X() = delete; }; +struct Y : X { using X::X; }; +struct Z : Y, virtual V { using Y::Y; }; +Z z(0); // OK: initialization of Y does not invoke default constructor of X + +// Check that we're passing this and __vtt along to the Y inheriting +// constructor, but not the int parameter. +// { dg-final { scan-assembler "_ZN1YCI21WEi" } } +// { dg-final { scan-tree-dump "Y::Y ._2, _3.;" "gimple" } } + +// And that we *are* passing the int along to V::V. +// { dg-final { scan-assembler "_ZN1VCI21WEi" } } +// { dg-final { scan-tree-dump "V::V .this, _1.;" "gimple" } } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C new file mode 100644 index 00000000000..21450196da0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C @@ -0,0 +1,27 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A { A(int); }; +struct B : A { using A::A; }; + +struct C1 : B { using B::B; }; +struct C2 : B { using B::B; }; + +struct D1 : C1, C2 { + using C1::C1; + using C2::C2; +}; + +struct V1 : virtual B { using B::B; }; +struct V2 : virtual B { using B::B; }; + +struct D2 : V1, V2 { + using V1::V1; + using V2::V2; +}; + +D1 d1(0); // { dg-error "" } ambiguous +D2 d2(0); // OK: initializes virtual B base class, which initializes the A base + // class then initializes the V1 and V2 base classes as if by a + // defaulted default constructor diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C new file mode 100644 index 00000000000..66cd2dabb0d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C @@ -0,0 +1,9 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } + +struct M { M(); M(int); }; +struct N : M { using M::M; }; +struct O : M {}; +struct P : N, O { using N::N; using O::O; }; +P p(0); // OK: use M(0) to initialize N's base class, + // use M() to initialize O's base class diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C new file mode 100644 index 00000000000..28dc33227a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C @@ -0,0 +1,17 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A { + template<typename T> A(T, typename T::type = 0); + A(int); +}; +struct B : A { + using A::A; + B(int); +}; +B b(42L); // now calls B(int), used to call B<long>(long), + // which called A(int) due to substitution failure + // in A<long>(long). + +// { dg-final { scan-assembler "_ZN1BC1Ei" } } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C new file mode 100644 index 00000000000..97f26346b78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(int = 0); +}; + +struct B: A +{ + B(); + using A::A; +}; + +B b1(1); +B b; diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C new file mode 100644 index 00000000000..55e1d8c943f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct V { V(int); }; +struct W : virtual V { using V::V; }; +struct X : virtual W, virtual V { using W::W; }; +X x(0); diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C new file mode 100644 index 00000000000..97f26346b78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(int = 0); +}; + +struct B: A +{ + B(); + using A::A; +}; + +B b1(1); +B b; diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C new file mode 100644 index 00000000000..494dd91bb80 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(double); +}; + +struct B: A +{ + B(short); + using A::A; +}; + +int main() +{ + B b(1); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C new file mode 100644 index 00000000000..3ce080d115b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct B; +struct A +{ + A(const B&, int = 0); +}; + +struct B: A +{ + using A::A; +}; + +extern B b; +B b2{b}; diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C new file mode 100644 index 00000000000..7ce85b0af2e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +struct B; +struct A +{ + A(const B&, int = 0); +}; + +struct B: A +{ + using A::A; + B(B&); +}; + +extern const B b; +B b2{b}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C new file mode 100644 index 00000000000..0e8520745a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C @@ -0,0 +1,23 @@ +// { dg-do link { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A +{ + A() { } + A(const A&); // should never be called +}; + +struct B +{ + B(A) { } +}; + +struct C: B +{ + using B::B; +}; + +int main() +{ + C c{A()}; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C new file mode 100644 index 00000000000..f47b2a4dc2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +class A +{ + A(int); + friend void f(); +}; + +struct B: A +{ + using A::A; +}; + +void f() +{ + B b(42); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C new file mode 100644 index 00000000000..87f4452c666 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C @@ -0,0 +1,21 @@ +// Core 1715 +// { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } + +template<class T> struct S { +private: + typedef int X; + friend struct B; +}; + +struct B { + template<class T> B(T, typename T::X); +}; + +struct D: B { + using B::B; // { dg-prune-output "private" } +}; + +S<int> s; +B b(s, 2); // Okay, thanks to friendship. +D d(s, 2); // { dg-error "" } was an error before P0136 diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C new file mode 100644 index 00000000000..47f69de41b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C @@ -0,0 +1,21 @@ +// Core 1715 +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +template<class T> struct S { +private: + typedef int X; + friend struct B; +}; + +struct B { + template<class T> B(T, typename T::X); +}; + +struct D: B { + using B::B; +}; + +S<int> s; +B b(s, 2); // Okay, thanks to friendship. +D d(s, 2); // Now OK as well. diff --git a/gcc/testsuite/g++.dg/cpp1z/using1.C b/gcc/testsuite/g++.dg/cpp1z/using1.C new file mode 100644 index 00000000000..1ed939d45fd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/using1.C @@ -0,0 +1,23 @@ +// Test for hiding of used base functions when all the conversion sequences are +// equivalent, needed to avoid a regression on inherited default ctors. + +struct A +{ + void f(short,int=0); + void g(char,int=0); +}; + +struct B:A +{ + using A::f; + void f(short); + using A::g; + void g(short); +}; + +int main() +{ + B().f(1); // OK, derived f hides base f for single arg + B().f(1,2); // OK, base f can still be called with two args + B().g(1); // { dg-error "" } signatures differ, ambiguous +} |