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>
|
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.
|
* pt.c (tsubst_expr): Remove shadowing declaration.
|
||||||
(tsubst_pack_expansion): Add assert.
|
(tsubst_pack_expansion): Add assert.
|
||||||
|
|
||||||
|
@ -4924,6 +4924,8 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
|
|||||||
case NON_DEPENDENT_EXPR:
|
case NON_DEPENDENT_EXPR:
|
||||||
/* For convenience. */
|
/* For convenience. */
|
||||||
case RETURN_EXPR:
|
case RETURN_EXPR:
|
||||||
|
case LOOP_EXPR:
|
||||||
|
case EXIT_EXPR:
|
||||||
return RECUR (TREE_OPERAND (t, 0), want_rval);
|
return RECUR (TREE_OPERAND (t, 0), want_rval);
|
||||||
|
|
||||||
case TRY_FINALLY_EXPR:
|
case TRY_FINALLY_EXPR:
|
||||||
@ -5135,6 +5137,15 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
|
|||||||
case EMPTY_CLASS_EXPR:
|
case EMPTY_CLASS_EXPR:
|
||||||
return false;
|
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:
|
default:
|
||||||
if (objc_is_property_ref (t))
|
if (objc_is_property_ref (t))
|
||||||
return false;
|
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…
x
Reference in New Issue
Block a user