C++ PATCH to add test to cover case RANGE_FOR_STMT
Recently it came up that no test in the testsuite triggers the RANGE_FOR_STMT case in potential_constant_expression_1. I came up with this valid test that tickles that codepath. I can't use ({ }) instead of a lambda because the constexpr machinery doesn't handle statement expressions; see default: in cxx_eval_constant_expression. Tested on x86_64-linux, ok for trunk? 2018-10-11 Marek Polacek * g++.dg/cpp1z/constexpr-lambda22.C: New test, diff --git gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C index e69de29bb2d..8bb473431a5 100644 --- gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C +++ gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-options -std=c++17 } + +#define SA(X) static_assert((X),#X) + +template +constexpr int +foo () +{ + constexpr int a[] = { 1, 2, 3, 4, 5 }; + int i = 0; + auto j = [&] { +for (auto x : a) + i++; +return i; + }(); + return j; +} + +SA (foo() == 5);
Re: C++ PATCH to add test to cover case RANGE_FOR_STMT
Ping. On Thu, Oct 11, 2018 at 09:28:38PM -0400, Marek Polacek wrote: > Recently it came up that no test in the testsuite triggers the RANGE_FOR_STMT > case in potential_constant_expression_1. I came up with this valid test that > tickles that codepath. > > I can't use ({ }) instead of a lambda because the constexpr machinery doesn't > handle statement expressions; see default: in cxx_eval_constant_expression. > > Tested on x86_64-linux, ok for trunk? > > 2018-10-11 Marek Polacek > > * g++.dg/cpp1z/constexpr-lambda22.C: New test, > > diff --git gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C > gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C > index e69de29bb2d..8bb473431a5 100644 > --- gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C > +++ gcc/testsuite/g++.dg/cpp1z/constexpr-lambda22.C > @@ -0,0 +1,20 @@ > +// { dg-do compile } > +// { dg-options -std=c++17 } > + > +#define SA(X) static_assert((X),#X) > + > +template > +constexpr int > +foo () > +{ > + constexpr int a[] = { 1, 2, 3, 4, 5 }; > + int i = 0; > + auto j = [&] { > +for (auto x : a) > + i++; > +return i; > + }(); > + return j; > +} > + > +SA (foo() == 5); Marek
Re: C++ PATCH to add test to cover case RANGE_FOR_STMT
On 11/1/18 2:06 PM, Marek Polacek wrote: Ping. On Thu, Oct 11, 2018 at 09:28:38PM -0400, Marek Polacek wrote: Recently it came up that no test in the testsuite triggers the RANGE_FOR_STMT case in potential_constant_expression_1. I came up with this valid test that tickles that codepath. I can't use ({ }) instead of a lambda because the constexpr machinery doesn't handle statement expressions; see default: in cxx_eval_constant_expression. Tested on x86_64-linux, ok for trunk? 2018-10-11 Marek Polacek * g++.dg/cpp1z/constexpr-lambda22.C: New test, OK, thanks. Jason