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
This commit is contained in:
parent
29ca91f72e
commit
f937929e9b
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
19
gcc/testsuite/g++.dg/cpp1y/constexpr-loop5.C
Normal file
19
gcc/testsuite/g++.dg/cpp1y/constexpr-loop5.C
Normal file
@ -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 "" }
|
||||
}
|
Loading…
Reference in New Issue
Block a user