From: Jason Merrill Date: Tue, 19 Apr 2016 18:49:54 +0000 (-0400) Subject: PR c++/68206 - Fix constexpr diagnostics with loops. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f937929e9b6273bf9e9ec3168b8615fc180f5e1f;p=gcc.git PR c++/68206 - Fix constexpr diagnostics with loops. PR c++/68530 * constexpr.c (potential_constant_expression_1): Handle LOOP_EXPR and GOTO_EXPR. From-SVN: r235217 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 344cad023f7..5fb16543192 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2016-04-19 Jason Merrill + PR c++/68206 + PR c++/68530 + * constexpr.c (potential_constant_expression_1): Handle LOOP_EXPR + and GOTO_EXPR. + * pt.c (tsubst_expr): Remove shadowing declaration. (tsubst_pack_expansion): Add assert. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index ae0c9739d8d..d50866094d1 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -4924,6 +4924,8 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, case NON_DEPENDENT_EXPR: /* For convenience. */ case RETURN_EXPR: + case LOOP_EXPR: + case EXIT_EXPR: return RECUR (TREE_OPERAND (t, 0), want_rval); case TRY_FINALLY_EXPR: @@ -5135,6 +5137,15 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, case EMPTY_CLASS_EXPR: return false; + case GOTO_EXPR: + { + tree *target = &TREE_OPERAND (t, 0); + /* Gotos representing break and continue are OK; we should have + rejected other gotos in parsing. */ + gcc_assert (breaks (target) || continues (target)); + return true; + } + default: if (objc_is_property_ref (t)) return false; diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-loop5.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-loop5.C new file mode 100644 index 00000000000..02f372d9888 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-loop5.C @@ -0,0 +1,19 @@ +// PR c++/68530 +// { dg-do compile { target c++14 } } + +struct thing { + void foo() {} +}; + +template +constexpr int count() +{ + auto item = thing {}; + for(; (item.foo(), false);); // { dg-error "foo" } + return 0; +} + +int main() +{ + static_assert( count() == 0, "" ); // { dg-error "" } +}