aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp0x/inh-ctor39.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/inh-ctor39.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor39.C55
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor39.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor39.C
new file mode 100644
index 0000000..89c0d8d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor39.C
@@ -0,0 +1,55 @@
+// PR c++/114784
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-O2" }
+
+template <typename T>
+struct A {
+ [[gnu::always_inline]] A (int t) { foo ().bar (t, {}); }
+ [[gnu::always_inline]] A (long long t) { foo ().bar (t, {}); }
+ T foo ();
+};
+
+struct B : A<B> {
+ using A<B>::A;
+ [[gnu::always_inline]] B (long long v) : A (v) {}
+ template <typename T>
+ void bar (T &&, int);
+ char b;
+};
+
+struct C {
+ C (int v) : a(v) { }
+ C (long long v) : a(v) { }
+ B a;
+};
+
+static C
+baz ()
+{
+ C x(0);
+ C y(0LL);
+ return 0;
+}
+
+[[gnu::cold]] int
+qux ()
+{
+ baz ();
+ return 0;
+}
+
+template <typename>
+struct D {
+ template <typename T>
+ [[gnu::always_inline]] D (T) { d = sizeof (T); }
+ D();
+ int d;
+};
+template <typename T>
+struct E : D<T> {
+ using D<T>::D;
+};
+
+E<char> c = {};
+E<char> d = 1;
+E<char> e = 1.0;