summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-05-06 17:57:49 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-05-06 17:57:49 -0400
commit9e33e3210a0bf2cc04f409423bc9210de5e31729 (patch)
tree3146f151678ec1c497060f154a6f58336c8958ac
parentc80e3e0267b3b415090d49a73747486f3313138b (diff)
downloadgcc-9e33e3210a0bf2cc04f409423bc9210de5e31729.tar.gz
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c17
-rw-r--r--gcc/testsuite/ChangeLog2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C18
4 files changed, 33 insertions, 9 deletions
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 <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.
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 <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>
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);
+}