diff options
author | Jason Merrill <jason@redhat.com> | 2016-04-19 14:49:54 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-04-19 14:49:54 -0400 |
commit | f937929e9b6273bf9e9ec3168b8615fc180f5e1f (patch) | |
tree | 964059415e120010e9641eff256f12b9121bd000 /gcc | |
parent | 29ca91f72e23c34d0fd856825bda4d88e174fc5b (diff) | |
download | gcc-f937929e9b6273bf9e9ec3168b8615fc180f5e1f.zip gcc-f937929e9b6273bf9e9ec3168b8615fc180f5e1f.tar.gz gcc-f937929e9b6273bf9e9ec3168b8615fc180f5e1f.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-loop5.C | 19 |
3 files changed, 35 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 344cad0..5fb1654 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2016-04-19 Jason Merrill <jason@redhat.com> + 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 ae0c973..d508660 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 0000000..02f372d --- /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<typename> +constexpr int count() +{ + auto item = thing {}; + for(; (item.foo(), false);); // { dg-error "foo" } + return 0; +} + +int main() +{ + static_assert( count<int>() == 0, "" ); // { dg-error "" } +} |