From: jason Date: Mon, 4 Dec 2017 22:52:07 +0000 (+0000) Subject: PR c++/83273 - constexpr if allows non-constant condition X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=27db1f50e3571b928081b1c54169c8ec0cd3449d;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@255390 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5495dc13c69d..8760a7016777 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2017-12-04 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. + 2017-12-01 Jason Merrill Give #include hints for . diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index f0370cc2afff..6dfecfc1b144 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 e2daab4339ea..c6726324ae62 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 4e887f3b9394..db984a646777 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 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 000000000000..55dbfd902eea --- /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; + } +}