PR c++/83273 - constexpr if allows non-constant condition
authorJason Merrill <jason@redhat.com>
Mon, 4 Dec 2017 22:52:07 +0000 (17:52 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 4 Dec 2017 22:52:07 +0000 (17:52 -0500)
* 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

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C
gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C [new file with mode: 0644]

index 5495dc13c69dbf110a19eeac1b957bade073b388..8760a701677790e199de57d74834d026a6012abf 100644 (file)
@@ -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>.
index f0370cc2afff07ca6fa9a43e02b23670330b7d00..6dfecfc1b144dfbd50782073a74a57b52972d8a8 100644 (file)
@@ -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:
index e2daab4339ea1d29a438608a46857866426ce1cf..c6726324ae6205a155a3c49bfac81209f494c464 100644 (file)
@@ -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);
index 4e887f3b9394f6332ed68d21256d153b43a84a93..db984a6467774faf0d2349f79a8372bedc2a2823 100644 (file)
@@ -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;
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C
new file mode 100644 (file)
index 0000000..55dbfd9
--- /dev/null
@@ -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;
+  }
+}