aboutsummaryrefslogtreecommitdiff
path: root/gcc/range-op-ptr.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/range-op-ptr.cc')
-rw-r--r--gcc/range-op-ptr.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc
index 36e9dfc..e0e21ad 100644
--- a/gcc/range-op-ptr.cc
+++ b/gcc/range-op-ptr.cc
@@ -315,7 +315,7 @@ public:
virtual relation_kind lhs_op1_relation (const prange &lhs,
const prange &op1,
const irange &op2,
- relation_kind) const;
+ relation_kind) const final override;
void update_bitmask (prange &r, const prange &lh, const irange &rh) const
{ update_known_bitmask (r, POINTER_PLUS_EXPR, lh, rh); }
} op_pointer_plus;
@@ -602,8 +602,14 @@ operator_cast::fold_range (prange &r, tree type,
int_range<2> tmp = inner;
tree pointer_uint_type = make_unsigned_type (TYPE_PRECISION (type));
range_cast (tmp, pointer_uint_type);
- r.set (type, tmp.lower_bound (), tmp.upper_bound ());
- r.update_bitmask (tmp.get_bitmask ());
+ // Casts may cause ranges to become UNDEFINED based on bitmasks.
+ if (tmp.undefined_p ())
+ r.set_varying (type);
+ else
+ {
+ r.set (type, tmp.lower_bound (), tmp.upper_bound ());
+ r.update_bitmask (tmp.get_bitmask ());
+ }
return true;
}