@@ -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;
new file mode 100644
@@ -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;
+ }
+}