From 9e33e3210a0bf2cc04f409423bc9210de5e31729 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 6 May 2011 17:57:49 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/semantics.c | 17 ++++++++--------- gcc/testsuite/ChangeLog | 2 ++ .../g++.dg/cpp0x/constexpr-condition2.C | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3bc6a14680f..af5e6d05544 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-05-06 Jason Merrill + 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. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index ca069f57700..d33f9fe16a9 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a59b4722b20..ea142c2e956 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-05-06 Jason Merrill + * g++.dg/cpp0x/constexpr-condition2.C: New. + * g++.dg/cpp0x/constexpr-missing.C: New. 2011-05-06 Tobias Burnus diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C new file mode 100644 index 00000000000..243409669bf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C @@ -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); +} -- 2.30.2