diff options
Diffstat (limited to 'gcc/range-op-ptr.cc')
-rw-r--r-- | gcc/range-op-ptr.cc | 12 |
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; } |