summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2007-06-06 13:56:00 +0000
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>2007-06-06 13:56:00 +0000
commitbdc68addfd00b2d8343bbd5e6da3e76da1035ba0 (patch)
treea22559350750655bb42ab1c2f1645ea134ffff68 /gcc
parent5ccaabd9545b27dfd8bd2388295bcf1f9ccc1275 (diff)
downloadppe42-gcc-bdc68addfd00b2d8343bbd5e6da3e76da1035ba0.tar.gz
ppe42-gcc-bdc68addfd00b2d8343bbd5e6da3e76da1035ba0.zip
./:
* fold-const.c (merge_ranges): If range_successor or range_predecessor fail, just return 0. testsuite/: * g++.dg/conversion/enum1.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125486 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c22
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/conversion/enum1.C10
4 files changed, 38 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5fa424d81d5..5e775c31d16 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-06 Ian Lance Taylor <iant@google.com>
+
+ * fold-const.c (merge_ranges): If range_successor or
+ range_predecessor fail, just return 0.
+
2007-06-06 Uros Bizjak <ubizjak@gmail.com>
PR tree-optimization/32216
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index af48916601c..bc6d6022415 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -4549,13 +4549,24 @@ merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
{
low = range_successor (high1);
high = high0;
- in_p = (low != 0);
+ in_p = 1;
+ if (low == 0)
+ {
+ /* We are in the weird situation where high0 > high1 but
+ high1 has no successor. Punt. */
+ return 0;
+ }
}
else if (! subset || highequal)
{
low = low0;
high = range_predecessor (low1);
- in_p = (high != 0);
+ in_p = 1;
+ if (high == 0)
+ {
+ /* low0 < low1 but low1 has no predecessor. Punt. */
+ return 0;
+ }
}
else
return 0;
@@ -4575,7 +4586,12 @@ merge_ranges (int *pin_p, tree *plow, tree *phigh, int in0_p, tree low0,
{
low = range_successor (high0);
high = high1;
- in_p = (low != 0);
+ in_p = 1;
+ if (low == 0)
+ {
+ /* high1 > high0 but high0 has no successor. Punt. */
+ return 0;
+ }
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 766369d5754..3917a8051eb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-06-06 Ian Lance Taylor <iant@google.com>
+
+ * g++.dg/conversion/enum1.C: New test.
+
2007-06-06 Uros Bizjak <ubizjak@gmail.com>
PR tree-optimization/32216
diff --git a/gcc/testsuite/g++.dg/conversion/enum1.C b/gcc/testsuite/g++.dg/conversion/enum1.C
new file mode 100644
index 00000000000..6ea8cadb642
--- /dev/null
+++ b/gcc/testsuite/g++.dg/conversion/enum1.C
@@ -0,0 +1,10 @@
+// { dg-do run }
+// { dg-options "-O2 -finline-functions" }
+
+enum E { V = 1 };
+static const E E_MIN = V;
+static const E E_MAX = V;
+
+bool valid(E v) { return v >= E_MIN && v <= E_MAX; }
+
+int main() { return valid(E(2)); }
OpenPOWER on IntegriCloud