aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-01-22 13:08:26 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2020-01-31 17:24:42 -0500
commit09bea5845a50189b093e7fa8d5b840da702197d4 (patch)
tree5e817797f3851e12dda366f127f2884d57473964
parent2a07345c4f8dabc286fc470e76c53473e5bc3eb7 (diff)
downloadgcc-09bea5845a50189b093e7fa8d5b840da702197d4.zip
gcc-09bea5845a50189b093e7fa8d5b840da702197d4.tar.gz
gcc-09bea5845a50189b093e7fa8d5b840da702197d4.tar.bz2
analyzer: fix ICE handling void-type (PR 93373)
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.
-rw-r--r--gcc/analyzer/ChangeLog9
-rw-r--r--gcc/analyzer/region-model.cc12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/analyzer/torture/pr93373.c3
4 files changed, 25 insertions, 4 deletions
diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog
index fa791f7..416fc92 100644
--- a/gcc/analyzer/ChangeLog
+++ b/gcc/analyzer/ChangeLog
@@ -1,5 +1,14 @@
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
* region-model.cc (region_model::update_for_return_superedge):
Move check for null result so that it also guards setting the
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index d43aef3..eb6d8f3 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 556e5fb..d13768a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..c205ee1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/torture/pr93373.c
@@ -0,0 +1,3 @@
+/* { dg-do compile }
+ { dg-require-effective-target alloca } */
+#include "../../Warray-bounds-41.c"