Flesh out unsupported_range.
It's cleaner to have the unsupported_range fully fleshed out, instead
of trapping on every operation. It can also serve as the basis for
the default vrange methods that frange and prange will inherit.
This patch implements most methods, including union and intersect, to
handle an UNDEFINED and a VARYING range.
Since this can serve as the basis for other classes, I have moved
everything into the vrange class, making the unsupported_range
trivial.
Note that vrange is still an abstract class, as I have purposely left
the dump() method abstract.
Also, I have made the unsupported range in the temporary class
(Value_Range) a method field, instead of a static member. This way
the temporary can set UNDEFINED and VARYING as needed.
Tested on x86-64 Linux.
gcc/ChangeLog:
* value-range.cc (vrange::contains_p): Implement.
(vrange::type): Return void.
(vrange::supports_type_p): Implement.
(irange::fits_p): Same.
(vrange::set_undefined): Same.
(irange::set_nonnegative): Same.
(vrange::set_varying): Same.
(vrange::union_): Same.
(unsupported_range::set): Move to vrange.
(unsupported_range::type): Move to vrange.
(vrange::intersect): Implement for varying and undefined.
(vrange::zero_p): Implement.
(unsupported_range::supports_type_p): Move to vrange.
(vrange::nonzero_p): Implement.
(unsupported_range::set_undefined): Move to vrange.
(unsupported_range::set_varying): Same.
(unsupported_range::dump): Same.
(unsupported_range::union_): Same. Implement for varying and
undefined.
(unsupported_range::intersect): Move to vrange.
(unsupported_range::zero_p): Same.
(unsupported_range::nonzero_p): Same.
(unsupported_range::set_nonzero): Same.
(unsupported_range::set_zero): Same.
(unsupported_range::set_nonnegative): Same.
(unsupported_range::fits_p): Same.
* value-range.h (class vrange): Remove abstract markers for most
methods.
(class unsupported_range): Remove most methods as they will now be
inherited from vrange.