Commit 9e33e321 by Jason Merrill Committed by Jason Merrill

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
parent c80e3e02
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))
......
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>
......
// 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment