PR c++/83273 - constexpr if allows non-constant condition
* semantics.c (finish_if_stmt_cond): Use require_constant_expression rather than is_constant_expression. * constexpr.c (potential_constant_expression_1) [LAMBDA_EXPR]: Allow in C++17. From-SVN: r255390
This commit is contained in:
parent
f3abed16a0
commit
899ac3b800
5 changed files with 28 additions and 2 deletions
|
@ -1,3 +1,11 @@
|
|||
2017-12-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/83273 - constexpr if allows non-constant condition
|
||||
* semantics.c (finish_if_stmt_cond): Use require_constant_expression
|
||||
rather than is_constant_expression.
|
||||
* constexpr.c (potential_constant_expression_1) [LAMBDA_EXPR]: Allow
|
||||
in C++17.
|
||||
|
||||
2017-12-01 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Give #include hints for <complex>.
|
||||
|
|
|
@ -5524,6 +5524,14 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
|
|||
return RECUR (STMT_EXPR_STMT (t), rval);
|
||||
|
||||
case LAMBDA_EXPR:
|
||||
if (cxx_dialect >= cxx17)
|
||||
/* In C++17 lambdas can be constexpr, don't give up yet. */
|
||||
return true;
|
||||
else if (flags & tf_error)
|
||||
error_at (loc, "lambda-expression is not a constant expression "
|
||||
"before C++17");
|
||||
return false;
|
||||
|
||||
case DYNAMIC_CAST_EXPR:
|
||||
case PSEUDO_DTOR_EXPR:
|
||||
case NEW_EXPR:
|
||||
|
|
|
@ -731,7 +731,7 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
|
|||
{
|
||||
cond = maybe_convert_cond (cond);
|
||||
if (IF_STMT_CONSTEXPR_P (if_stmt)
|
||||
&& is_constant_expression (cond)
|
||||
&& require_constant_expression (cond)
|
||||
&& !value_dependent_expression_p (cond))
|
||||
{
|
||||
cond = instantiate_non_dependent_expr (cond);
|
||||
|
|
|
@ -7,7 +7,7 @@ struct T {
|
|||
|
||||
template <class MustBeTemplate>
|
||||
constexpr auto bf(T t) {
|
||||
if constexpr(t.foo()) {
|
||||
if constexpr(t.foo()) { // { dg-error "constant expression" }
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
10
gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C
Normal file
10
gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C
Normal file
|
@ -0,0 +1,10 @@
|
|||
// PR c++/83273
|
||||
// { dg-options -std=c++17 }
|
||||
|
||||
int main()
|
||||
{
|
||||
auto d = 42;
|
||||
if constexpr (d > 0) { // { dg-error "constant expression" }
|
||||
return d;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue