aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C1
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C1
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C14
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C1
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C21
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C33
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C19
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C27
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C9
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C17
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C7
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C17
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C15
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C16
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C23
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C18
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C21
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C21
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/using1.C23
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
+}