]> gcc.gnu.org Git - gcc.git/commitdiff
analyzer: fix ICE on RANGE_EXPR with CONSTRUCTOR value [PR96950]
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 7 Sep 2020 21:43:02 +0000 (17:43 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Tue, 8 Sep 2020 14:50:12 +0000 (10:50 -0400)
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

index 7f15aa92492977e957d5747dcaaf7e8661f76e52..94bcbecce888355687ff466466a9eab95ccbb3d4 100644 (file)
@@ -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.  */
This page took 0.057891 seconds and 5 git commands to generate.