https://gcc.gnu.org/g:6a4da727020b24b02b062f4bff718c9a5699629c

commit r16-1397-g6a4da727020b24b02b062f4bff718c9a5699629c
Author: Andrew MacLeod <amacl...@redhat.com>
Date:   Tue Jun 10 12:11:18 2025 -0400

    Check if constant is a member before returning it.
    
    set_range_from_bitmask checks the new bitmask, and if it is a constant,
    simply returns the constant.  It never checks if that constant is
    actually within the range.  If it is not, the result should be UNDEFINED.
    
            * value-range.cc (irange::set_range_from_bitmask): When the bitmask
            result is a singleton, check if it is contained in the range.

Diff:
---
 gcc/value-range.cc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index ed3760fa6ff6..e2d75f59c2e0 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -2268,7 +2268,11 @@ irange::set_range_from_bitmask ()
   // If all the bits are known, this is a singleton.
   if (m_bitmask.mask () == 0)
     {
-      set (m_type, m_bitmask.value (), m_bitmask.value ());
+      // Make sure the singleton is within the range.
+      if (contains_p (m_bitmask.value ()))
+       set (m_type, m_bitmask.value (), m_bitmask.value ());
+      else
+       set_undefined ();
       return true;
     }

Reply via email to