]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
analyzer: fix another ICE in constructor-handling [PR96949]
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 7 Sep 2020 22:31:28 +0000 (18:31 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Tue, 8 Sep 2020 14:51:22 +0000 (10:51 -0400)
PR analyzer/96949 reports an ICE with
--param analyzer-max-svalue-depth=0, where the param value leads
to INTEGER_CST values in a RANGE_EXPR being treated as unknown
symbolic values.

This patch replaces implicit assumptions that these values are
concrete (and thus have concrete bit offsets), adding
error-handling for symbolic cases instead of assertions.

gcc/analyzer/ChangeLog:
PR analyzer/96949
* store.cc (binding_map::apply_ctor_val_to_range): Add
error-handling for the cases where we have symbolic offsets.

gcc/testsuite/ChangeLog:
PR analyzer/96949
* gfortran.dg/analyzer/pr96949.f90: New test.

gcc/analyzer/store.cc
gcc/testsuite/gfortran.dg/analyzer/pr96949.f90 [new file with mode: 0644]

index 94bcbecce888355687ff466466a9eab95ccbb3d4..1348895e5c7557ecfceed7c9385859a4612902fb 100644 (file)
@@ -466,11 +466,14 @@ binding_map::apply_ctor_val_to_range (const region *parent_reg,
   const region *max_element
     = get_subregion_within_ctor (parent_reg, max_index, mgr);
   region_offset min_offset = min_element->get_offset ();
+  if (min_offset.symbolic_p ())
+    return false;
   bit_offset_t start_bit_offset = min_offset.get_bit_offset ();
   store_manager *smgr = mgr->get_store_manager ();
   const binding_key *max_element_key
     = binding_key::make (smgr, max_element, BK_direct);
-  gcc_assert (max_element_key->concrete_p ());
+  if (max_element_key->symbolic_p ())
+    return false;
   const concrete_binding *max_element_ckey
     = max_element_key->dyn_cast_concrete_binding ();
   bit_size_t range_size_in_bits
@@ -478,7 +481,8 @@ binding_map::apply_ctor_val_to_range (const region *parent_reg,
   const concrete_binding *range_key
     = smgr->get_concrete_binding (start_bit_offset, range_size_in_bits,
                                  BK_direct);
-  gcc_assert (range_key->concrete_p ());
+  if (range_key->symbolic_p ())
+    return false;
 
   /* Get the value.  */
   if (TREE_CODE (val) == CONSTRUCTOR)
diff --git a/gcc/testsuite/gfortran.dg/analyzer/pr96949.f90 b/gcc/testsuite/gfortran.dg/analyzer/pr96949.f90
new file mode 100644 (file)
index 0000000..4af96bb
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do compile }
+! { dg-additional-options "-Wno-analyzer-too-complex --param analyzer-max-svalue-depth=0" }
+
+program n6
+  integer :: ck(2,2)
+  integer :: ac
+
+  data ck /4 * 1/
+
+  call x9()
+
+contains
+  subroutine x9()
+    if (ck(2, 1) == 1) then
+       ac = 1
+    else
+       ac = 0
+    end if
+  end subroutine x9
+end program n6