diff mbox series

[committed] analyzer: fix ICE on RANGE_EXPR with CONSTRUCTOR value [PR96950]

Message ID 20200908145501.27418-1-dmalcolm@redhat.com
State New
Headers show
Series [committed] analyzer: fix ICE on RANGE_EXPR with CONSTRUCTOR value [PR96950] | expand

Commit Message

David Malcolm Sept. 8, 2020, 2:55 p.m. UTC
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 mbox series

Patch

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.  */