The discriminator in vrange cannot change after construction, similarly the number of allocated ranges in an irange. It's best to make them constant to avoid invalid changes.
gcc/ChangeLog: * value-range.h (class vrange): Make m_discriminator const. (class irange): Make m_max_ranges const. Adjust constructors accordingly. (class unsupported_range): Construct vrange appropriately. (class frange): Same. --- gcc/value-range.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/gcc/value-range.h b/gcc/value-range.h index 969b2b68418..e9439bb7d3c 100644 --- a/gcc/value-range.h +++ b/gcc/value-range.h @@ -104,8 +104,9 @@ public: enum value_range_kind kind () const; // DEPRECATED protected: + vrange (enum value_range_discriminator d) : m_discriminator (d) { } ENUM_BITFIELD(value_range_kind) m_kind : 8; - ENUM_BITFIELD(value_range_discriminator) m_discriminator : 4; + const ENUM_BITFIELD(value_range_discriminator) m_discriminator : 4; }; // An integer range without any storage. @@ -214,7 +215,7 @@ private: bool intersect (const wide_int& lb, const wide_int& ub); unsigned char m_num_ranges; - unsigned char m_max_ranges; + const unsigned char m_max_ranges; tree m_nonzero_mask; tree *m_base; }; @@ -257,8 +258,8 @@ class unsupported_range : public vrange { public: unsupported_range () + : vrange (VR_UNKNOWN) { - m_discriminator = VR_UNKNOWN; set_undefined (); } virtual void set_undefined () final override @@ -873,10 +874,10 @@ gt_pch_nx (int_range<N> *x, gt_pointer_operator op, void *cookie) inline irange::irange (tree *base, unsigned nranges) + : vrange (VR_IRANGE), + m_max_ranges (nranges) { - m_discriminator = VR_IRANGE; m_base = base; - m_max_ranges = nranges; set_undefined (); } @@ -1112,22 +1113,22 @@ vrp_val_min (const_tree type) inline frange::frange () + : vrange (VR_FRANGE) { - m_discriminator = VR_FRANGE; set_undefined (); } inline frange::frange (const frange &src) + : vrange (VR_FRANGE) { - m_discriminator = VR_FRANGE; *this = src; } inline frange::frange (tree type) + : vrange (VR_FRANGE) { - m_discriminator = VR_FRANGE; set_varying (type); } @@ -1137,8 +1138,8 @@ inline frange::frange (tree type, const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max, value_range_kind kind) + : vrange (VR_FRANGE) { - m_discriminator = VR_FRANGE; set (type, min, max, kind); } @@ -1146,8 +1147,8 @@ frange::frange (tree type, inline frange::frange (tree min, tree max, value_range_kind kind) + : vrange (VR_FRANGE) { - m_discriminator = VR_FRANGE; set (min, max, kind); } -- 2.39.2