Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to master as r11-3051-gaf656c401e97f9de2a8478f18278e8efb2a6cf23.

gcc/analyzer/ChangeLog:
        PR analyzer/96950
        * store.cc (binding_map::apply_ctor_to_region): Handle RANGE_EXPR
        where min_index == max_index.
        (binding_map::apply_ctor_val_to_range): Replace assertion that we
        don't have a CONSTRUCTOR value with error-handling.
---
 gcc/analyzer/store.cc | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/gcc/analyzer/store.cc b/gcc/analyzer/store.cc
index 7f15aa92492..94bcbecce88 100644
--- a/gcc/analyzer/store.cc
+++ b/gcc/analyzer/store.cc
@@ -425,9 +425,18 @@ binding_map::apply_ctor_to_region (const region 
*parent_reg, tree ctor,
        {
          tree min_index = TREE_OPERAND (index, 0);
          tree max_index = TREE_OPERAND (index, 1);
-         if (!apply_ctor_val_to_range (parent_reg, mgr,
-                                       min_index, max_index, val))
-           return false;
+         if (min_index == max_index)
+           {
+             if (!apply_ctor_pair_to_child_region (parent_reg, mgr,
+                                                   min_index, val))
+               return false;
+           }
+         else
+           {
+             if (!apply_ctor_val_to_range (parent_reg, mgr,
+                                           min_index, max_index, val))
+               return false;
+           }
          continue;
        }
       if (!apply_ctor_pair_to_child_region (parent_reg, mgr, index, val))
@@ -472,7 +481,8 @@ binding_map::apply_ctor_val_to_range (const region 
*parent_reg,
   gcc_assert (range_key->concrete_p ());
 
   /* Get the value.  */
-  gcc_assert (TREE_CODE (val) != CONSTRUCTOR);
+  if (TREE_CODE (val) == CONSTRUCTOR)
+    return false;
   const svalue *sval = get_svalue_for_ctor_val (val, mgr);
 
   /* Bind the value to the range.  */
-- 
2.26.2

Reply via email to