diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp1y')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-instantiate.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr5.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/nsdmi-union1.C | 33 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr70001.C | 49 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/var-templ50.C | 11 |
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>>(); +} |