aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp1z/decomp47.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp1z/decomp47.C')
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/decomp47.C32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp47.C b/gcc/testsuite/g++.dg/cpp1z/decomp47.C
new file mode 100644
index 00000000000..f0d202d696a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/decomp47.C
@@ -0,0 +1,32 @@
+// PR c++/87122
+// { dg-do run { target c++14 } }
+// { dg-options "" }
+
+extern "C" void abort ();
+struct S { int a, b; };
+int c;
+
+template <int N>
+void
+foo ()
+{
+ S x[4] = { { N, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
+ auto f = [](auto & y) {
+ for (auto & [ u, v ] : y) // { dg-warning "structured bindings only available with" "" { target c++14_down } }
+ {
+ if ((u & 1) != 1 || v != u + 1 || u < N || u > 7 || (c & (1 << u))
+ || &u != &y[v / 2 - 1].a || &v != &y[v / 2 - 1].b)
+ abort ();
+ c |= 1 << u;
+ }
+ };
+ f (x);
+}
+
+int
+main ()
+{
+ foo<1> ();
+ if (c != 0xaa)
+ abort ();
+}