On Wed, May 23, 2018 at 02:49:09PM -0400, Marek Polacek wrote:
> > Could you please add some testcases that would test the handling of
> > structured bindings in these new forms of range for, like:
> > for (int i = 0; auto [ x, y ] : z)
> > but perhaps for completeness also in the init-stmt and perhaps both spots
> > too?
> 
> Sure.
> 
> Tested on x86_64-linux, ok for trunk?
> 
> 2018-05-23  Marek Polacek  <pola...@redhat.com>
> 
>       * g++.dg/cpp2a/range-for8.C: New test.
>       * g++.dg/cpp2a/range-for9.C: New test.
>       * g++.dg/cpp2a/range-for10.C: New test.

LGTM, thanks.

> diff --git gcc/testsuite/g++.dg/cpp2a/range-for10.C 
> gcc/testsuite/g++.dg/cpp2a/range-for10.C
> index e69de29bb2d..a0d0e6d085e 100644
> --- gcc/testsuite/g++.dg/cpp2a/range-for10.C
> +++ gcc/testsuite/g++.dg/cpp2a/range-for10.C
> @@ -0,0 +1,24 @@
> +// P0614R1
> +// { dg-do run }
> +// { dg-options "-std=c++2a" }
> +
> +struct A { int i; long long j; } a[64];
> +
> +int
> +main ()
> +{
> +  A b = { 1, 2 };
> +  for (auto & [ u, v ] : a)
> +    {
> +      u = 2;
> +      v = 3;
> +    }
> +
> +  for (auto [x, y] = b; auto [ u, v ] : a)
> +    if (y + u != x + v)
> +      __builtin_abort ();
> +
> +  for (auto [x, y] = b; auto & [ u, v ] : a)
> +    if (y + u != x + v)
> +      __builtin_abort ();
> +}
> diff --git gcc/testsuite/g++.dg/cpp2a/range-for8.C 
> gcc/testsuite/g++.dg/cpp2a/range-for8.C
> index e69de29bb2d..204a63204ca 100644
> --- gcc/testsuite/g++.dg/cpp2a/range-for8.C
> +++ gcc/testsuite/g++.dg/cpp2a/range-for8.C
> @@ -0,0 +1,37 @@
> +// P0614R1
> +// { dg-do run }
> +// { dg-options "-std=c++2a" }
> +
> +struct A { int i; long long j; } a[64];
> +
> +int
> +main ()
> +{
> +  for (int i = 0; auto &x : a)
> +    {
> +      x.i = i;
> +      x.j = 2 * i++;
> +    }
> +  for (auto & [ x, y ] : a)
> +    {
> +      x += 2;
> +      y += 3;
> +    }
> +  for (int i = 0; const auto [ u, v ] : a)
> +    {
> +      if (u != i + 2 || v != 2 * i++ + 3)
> +        __builtin_abort ();
> +    }
> +  for (int i = 0; auto [ x, y ] : a)
> +    {
> +      x += 4;
> +      y += 5;
> +      if (x != i + 6 || y != 2 * i++ + 8)
> +        __builtin_abort ();
> +    }
> +  for (int i = 0; const auto x : a)
> +    {
> +      if (x.i != i + 2 || x.j != 2 * i++ + 3)
> +        __builtin_abort ();
> +    }
> +}
> diff --git gcc/testsuite/g++.dg/cpp2a/range-for9.C 
> gcc/testsuite/g++.dg/cpp2a/range-for9.C
> index e69de29bb2d..74d71b67213 100644
> --- gcc/testsuite/g++.dg/cpp2a/range-for9.C
> +++ gcc/testsuite/g++.dg/cpp2a/range-for9.C
> @@ -0,0 +1,30 @@
> +// P0614R1
> +// { dg-do run }
> +// { dg-options "-std=c++2a" }
> +
> +struct A { int i, j; };
> +
> +int
> +main ()
> +{
> +  A a = { .i = 2, .j = 3 };
> +  int arr[] = { 1, 1, 1 };
> +
> +  for (auto & [ x, y ] = a; auto z : arr)
> +    if (x + z != 3 || y + z != 4)
> +      __builtin_abort ();
> +
> +  for (int d = 1; auto &z : arr)
> +    z += d;
> +
> +  for (const auto [ x, y ] = a; auto z : arr)
> +    if (x + z != 4 || y + z != 5)
> +      __builtin_abort ();
> +
> +  for (int d = 1; auto &z : arr)
> +    z += d;
> +
> +  for (auto [ x, y ] = a; auto z : arr)
> +    if (x + z != 5 || y + z != 6)
> +      __builtin_abort ();
> +}

        Jakub

Reply via email to