analyzer: fix ICE handling void-type (PR 93373)
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 22 Jan 2020 18:08:26 +0000 (13:08 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Fri, 31 Jan 2020 22:24:42 +0000 (17:24 -0500)
gcc/analyzer/ChangeLog:
PR analyzer/93373
* region-model.cc (ASSERT_COMPAT_TYPES): Convert to...
(assert_compat_types): ...this, and bail when either type is NULL,
or when VOID_TYPE_P (dst_type).
(region_model::get_lvalue): Update for above conversion.
(region_model::get_rvalue): Likewise.

gcc/testsuite/ChangeLog:
PR analyzer/93373
* gcc.dg/analyzer/torture/pr93373.c: New test.

gcc/analyzer/ChangeLog
gcc/analyzer/region-model.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/analyzer/torture/pr93373.c [new file with mode: 0644]

index fa791f70d34de112bcbf87c1ebb358d2f6de2ca1..416fc9201d33ab6bbdb5b7f5ca259ea5a0ee5dec 100644 (file)
@@ -1,3 +1,12 @@
+2020-01-31  David Malcolm  <dmalcolm@redhat.com>
+
+       PR analyzer/93373
+       * region-model.cc (ASSERT_COMPAT_TYPES): Convert to...
+       (assert_compat_types): ...this, and bail when either type is NULL,
+       or when VOID_TYPE_P (dst_type).
+       (region_model::get_lvalue): Update for above conversion.
+       (region_model::get_rvalue): Likewise.
+
 2020-01-31  David Malcolm  <dmalcolm@redhat.com>
 
        PR analyzer/93379
index d43aef3a4d79e07f75d97b5f4852ec3d2d0d46ec..eb6d8f3cf3a31def603646374b4c70e8c72828ce 100644 (file)
@@ -4701,8 +4701,12 @@ region_model::get_lvalue_1 (path_var pv, region_model_context *ctxt)
 
 /* Assert that SRC_TYPE can be converted to DST_TYPE as a no-op.  */
 
-#define ASSERT_COMPAT_TYPES(SRC_TYPE, DST_TYPE) \
-  gcc_checking_assert (useless_type_conversion_p ((SRC_TYPE), (DST_TYPE)))
+static void
+assert_compat_types (tree src_type, tree dst_type)
+{
+  if (src_type && dst_type && !VOID_TYPE_P (dst_type))
+    gcc_checking_assert (useless_type_conversion_p (src_type, dst_type));
+}
 
 /* Get the id of the region for PV within this region_model,
    emitting any diagnostics to CTXT.  */
@@ -4714,7 +4718,7 @@ region_model::get_lvalue (path_var pv, region_model_context *ctxt)
     return region_id::null ();
 
   region_id result_rid = get_lvalue_1 (pv, ctxt);
-  ASSERT_COMPAT_TYPES (get_region (result_rid)->get_type (),
+  assert_compat_types (get_region (result_rid)->get_type (),
                       TREE_TYPE (pv.m_tree));
   return result_rid;
 }
@@ -4795,7 +4799,7 @@ region_model::get_rvalue (path_var pv, region_model_context *ctxt)
     return svalue_id::null ();
   svalue_id result_sid = get_rvalue_1 (pv, ctxt);
 
-  ASSERT_COMPAT_TYPES (get_svalue (result_sid)->get_type (),
+  assert_compat_types (get_svalue (result_sid)->get_type (),
                       TREE_TYPE (pv.m_tree));
 
   return result_sid;
index 556e5fb55da725933cdd975a285c4c932e6a82b8..d13768a16f2796cb15f1b083fc60a167ad746e7c 100644 (file)
@@ -1,3 +1,8 @@
+2020-01-31  David Malcolm  <dmalcolm@redhat.com>
+
+       PR analyzer/93373
+       * gcc.dg/analyzer/torture/pr93373.c: New test.
+
 2020-01-31  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/91333
diff --git a/gcc/testsuite/gcc.dg/analyzer/torture/pr93373.c b/gcc/testsuite/gcc.dg/analyzer/torture/pr93373.c
new file mode 100644 (file)
index 0000000..c205ee1
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-do compile }
+   { dg-require-effective-target alloca } */
+#include "../../Warray-bounds-41.c"