aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp1y
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp1y')
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/constexpr-instantiate.C21
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr5.C24
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/nsdmi-union1.C33
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr70001.C49
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/var-templ50.C11
7 files changed, 142 insertions, 4 deletions
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-instantiate.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-instantiate.C
new file mode 100644
index 00000000000..ab2021b91bd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-instantiate.C
@@ -0,0 +1,21 @@
+// PR c++/58281 - Problem with explicitly instantiated constexpr template
+// functions
+// { dg-do compile { target c++11 } }
+// { dg-options "-fdump-tree-optimized" }
+
+
+template <typename T>
+constexpr bool f (T a)
+{
+ return a == 3;
+}
+
+extern template bool f<int>(int);
+
+bool g (int x) { return f (x); }
+
+template bool f<int>(int);
+
+// Verify that the defintions of both f() and g() are emitted.
+// { dg-final { scan-tree-dump-times "\nconstexpr bool f\\\(" 1 "optimized" } }
+// { dg-final { scan-tree-dump-times "\nbool g\\\(" 1 "optimized" } }
diff --git a/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C b/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
index 67f75a72548..397b9a89957 100644
--- a/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
+++ b/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C
@@ -55,8 +55,8 @@
#ifndef __cpp_range_based_for
# error "__cpp_range_based_for"
-#elif __cpp_range_based_for != 200907
-# error "__cpp_range_based_for != 200907"
+#elif __cpp_range_based_for < 200907
+# error "__cpp_range_based_for < 200907"
#endif
#ifndef __cpp_static_assert
diff --git a/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C b/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
index d9dbf6283a2..fa59f90fa89 100644
--- a/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
+++ b/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C
@@ -48,8 +48,8 @@
#ifndef __cpp_range_based_for
# error "__cpp_range_based_for"
-#elif __cpp_range_based_for != 200907
-# error "__cpp_range_based_for != 200907"
+#elif __cpp_range_based_for < 200907
+# error "__cpp_range_based_for < 200907"
#endif
#ifndef __cpp_static_assert
diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr5.C b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr5.C
new file mode 100644
index 00000000000..fe377c399c8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr5.C
@@ -0,0 +1,24 @@
+// PR c++/70332
+// { dg-do run { target c++14 } }
+
+template <class T>
+struct C
+{
+ T m;
+ T *n = &m;
+};
+
+C<int> c { };
+
+int
+main ()
+{
+ *c.n = 5;
+ if (c.m != 5)
+ __builtin_abort ();
+
+ C<int> d { 10 };
+ *d.n = *d.n + 1;
+ if (d.m != 11)
+ __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-union1.C b/gcc/testsuite/g++.dg/cpp1y/nsdmi-union1.C
new file mode 100644
index 00000000000..d9dd0bfcc91
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-union1.C
@@ -0,0 +1,33 @@
+// PR c++/70347
+// { dg-do run { target c++14 } }
+
+union A {
+ char a;
+ long b = -42;
+};
+
+struct B {
+ union {
+ char a = 10;
+ long b;
+ };
+};
+
+A c1{};
+A c2{4};
+B c3{};
+B c4{{9}};
+
+int main() {
+ if (c1.b != -42)
+ __builtin_abort ();
+
+ if (c2.a != 4)
+ __builtin_abort ();
+
+ if (c3.a != 10)
+ __builtin_abort ();
+
+ if (c4.a != 9)
+ __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr70001.C b/gcc/testsuite/g++.dg/cpp1y/pr70001.C
new file mode 100644
index 00000000000..adbb13251e6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr70001.C
@@ -0,0 +1,49 @@
+// PR c++/70001
+// { dg-do compile { target c++14 } }
+
+struct B
+{
+ int a;
+ constexpr B () : a (0) { }
+ constexpr B (int x) : a (x) { }
+};
+struct C
+{
+ B c;
+ constexpr C () : c (0) { }
+};
+struct A
+{
+ B b[1 << 4];
+};
+struct D
+{
+ C d[1 << 4];
+};
+
+constexpr int
+foo (int a, int b)
+{
+ A c;
+ c.b[a].a += b;
+ c.b[b].a += a;
+ return c.b[0].a + c.b[a].a + c.b[b].a;
+}
+
+constexpr int
+bar (int a, int b)
+{
+ D c;
+ c.d[a].c.a += b;
+ c.d[b].c.a += a;
+ return c.d[0].c.a + c.d[a].c.a + c.d[b].c.a;
+}
+
+constexpr int d = foo (1, 2);
+constexpr int e = foo (0, 3);
+constexpr int f = foo (2, 4);
+constexpr int g = bar (1, 2);
+constexpr int h = bar (0, 3);
+constexpr int i = bar (2, 4);
+static_assert (d == 3 && e == 6 && f == 6, "");
+static_assert (g == 3 && h == 6 && i == 6, "");
diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ50.C b/gcc/testsuite/g++.dg/cpp1y/var-templ50.C
new file mode 100644
index 00000000000..138a3997122
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/var-templ50.C
@@ -0,0 +1,11 @@
+// PR c++/70095
+// { dg-do link { target c++14 } }
+
+template <typename T> struct Foo;
+template <typename T> int variable_template = 0;
+template <typename T> int variable_template<Foo<T>> = 0;
+template <typename T> int get_variable_template() { return variable_template<T>; }
+
+int main() {
+ get_variable_template<Foo<int>>();
+}