aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-12-04 17:52:07 -0500
committerJason Merrill <jason@gcc.gnu.org>2017-12-04 17:52:07 -0500
commit899ac3b80040d7879082b5df11675cea88a43756 (patch)
tree5044a11213ef3456a0847e4bfbb8801ef4d9b571 /gcc
parentf3abed16a01153c7a72d5795076c392cdb19c9dd (diff)
downloadgcc-899ac3b80040d7879082b5df11675cea88a43756.zip
gcc-899ac3b80040d7879082b5df11675cea88a43756.tar.gz
gcc-899ac3b80040d7879082b5df11675cea88a43756.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/constexpr.c8
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C10
5 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5495dc1..8760a70 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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>.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index f0370cc..6dfecfc 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -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:
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index e2daab4..c672632 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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);
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C
index 4e887f3..db984a6 100644
--- a/gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C
@@ -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
index 0000000..55dbfd9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if13.C
@@ -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;
+ }
+}