re PR c++/48909 ([C++0x] ICE in cxx_eval_conditional_expression, at cp/semantics.c:6213)
PR c++/48909 * semantics.c (cxx_eval_conditional_expression): Check integer_zerop/onep instead. From-SVN: r173511
This commit is contained in:
parent
c80e3e0267
commit
9e33e3210a
4 changed files with 33 additions and 9 deletions
|
@ -1,5 +1,10 @@
|
|||
2011-05-06 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48909
|
||||
* semantics.c (cxx_eval_conditional_expression): Check
|
||||
integer_zerop instead.
|
||||
(potential_constant_expression_1): Likewise.
|
||||
|
||||
PR c++/48911
|
||||
* semantics.c (cxx_eval_array_reference): Handle implicit
|
||||
initializers.
|
||||
|
|
|
@ -6298,13 +6298,12 @@ cxx_eval_conditional_expression (const constexpr_call *call, tree t,
|
|||
allow_non_constant, addr,
|
||||
non_constant_p);
|
||||
VERIFY_CONSTANT (val);
|
||||
if (val == boolean_true_node)
|
||||
return cxx_eval_constant_expression (call, TREE_OPERAND (t, 1),
|
||||
/* Don't VERIFY_CONSTANT the other operands. */
|
||||
if (integer_zerop (val))
|
||||
return cxx_eval_constant_expression (call, TREE_OPERAND (t, 2),
|
||||
allow_non_constant, addr,
|
||||
non_constant_p);
|
||||
gcc_assert (val == boolean_false_node);
|
||||
/* Don't VERIFY_CONSTANT here. */
|
||||
return cxx_eval_constant_expression (call, TREE_OPERAND (t, 2),
|
||||
return cxx_eval_constant_expression (call, TREE_OPERAND (t, 1),
|
||||
allow_non_constant, addr,
|
||||
non_constant_p);
|
||||
}
|
||||
|
@ -7871,12 +7870,12 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags)
|
|||
tmp = TREE_OPERAND (t, 0);
|
||||
if (!potential_constant_expression_1 (tmp, rval, flags))
|
||||
return false;
|
||||
else if (tmp == boolean_true_node)
|
||||
return potential_constant_expression_1 (TREE_OPERAND (t, 1),
|
||||
want_rval, flags);
|
||||
else if (tmp == boolean_false_node)
|
||||
else if (integer_zerop (tmp))
|
||||
return potential_constant_expression_1 (TREE_OPERAND (t, 2),
|
||||
want_rval, flags);
|
||||
else if (TREE_CODE (tmp) == INTEGER_CST)
|
||||
return potential_constant_expression_1 (TREE_OPERAND (t, 1),
|
||||
want_rval, flags);
|
||||
for (i = 1; i < 3; ++i)
|
||||
if (potential_constant_expression_1 (TREE_OPERAND (t, i),
|
||||
want_rval, tf_none))
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
2011-05-06 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/cpp0x/constexpr-condition2.C: New.
|
||||
|
||||
* g++.dg/cpp0x/constexpr-missing.C: New.
|
||||
|
||||
2011-05-06 Tobias Burnus <burnus@net-b.de>
|
||||
|
|
18
gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C
Normal file
18
gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C
Normal file
|
@ -0,0 +1,18 @@
|
|||
// PR c++/48909
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
#define SA(X) static_assert((X),#X)
|
||||
|
||||
constexpr int const * is_sorted_until(int const * first, int const * last)
|
||||
{
|
||||
return first == last || first + 1 == last ? last
|
||||
: (*(first + 1) < *first) != false ? first + 1
|
||||
: is_sorted_until(first + 1, last);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
static constexpr int array[2] = {0, 1};
|
||||
constexpr int const * last = is_sorted_until(array, array + 2);
|
||||
SA(last==array+2);
|
||||
}
|
Loading…
Add table
Reference in a new issue