Commit 899ac3b8 by Jason Merrill Committed by Jason Merrill

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
parent f3abed16
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> 2017-12-01 Jason Merrill <jason@redhat.com>
Give #include hints for <complex>. Give #include hints for <complex>.
......
...@@ -5524,6 +5524,14 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now, ...@@ -5524,6 +5524,14 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
return RECUR (STMT_EXPR_STMT (t), rval); return RECUR (STMT_EXPR_STMT (t), rval);
case LAMBDA_EXPR: 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 DYNAMIC_CAST_EXPR:
case PSEUDO_DTOR_EXPR: case PSEUDO_DTOR_EXPR:
case NEW_EXPR: case NEW_EXPR:
......
...@@ -731,7 +731,7 @@ finish_if_stmt_cond (tree cond, tree if_stmt) ...@@ -731,7 +731,7 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
{ {
cond = maybe_convert_cond (cond); cond = maybe_convert_cond (cond);
if (IF_STMT_CONSTEXPR_P (if_stmt) if (IF_STMT_CONSTEXPR_P (if_stmt)
&& is_constant_expression (cond) && require_constant_expression (cond)
&& !value_dependent_expression_p (cond)) && !value_dependent_expression_p (cond))
{ {
cond = instantiate_non_dependent_expr (cond); cond = instantiate_non_dependent_expr (cond);
......
...@@ -7,7 +7,7 @@ struct T { ...@@ -7,7 +7,7 @@ struct T {
template <class MustBeTemplate> template <class MustBeTemplate>
constexpr auto bf(T t) { constexpr auto bf(T t) {
if constexpr(t.foo()) { if constexpr(t.foo()) { // { dg-error "constant expression" }
return false; return false;
} }
return true; return true;
......
// PR c++/83273
// { dg-options -std=c++17 }
int main()
{
auto d = 42;
if constexpr (d > 0) { // { dg-error "constant expression" }
return d;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment