aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-08-17 18:18:00 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-08-17 20:46:49 -0400
commit2242b975c08e150dd712d8e64341cae8457788ef (patch)
tree0cc506818c3f7d93c61c4d5aae8f0280faa05541 /gcc
parent1b0be822208349b2795381deace2352e998c1ad0 (diff)
downloadgcc-2242b975c08e150dd712d8e64341cae8457788ef.zip
gcc-2242b975c08e150dd712d8e64341cae8457788ef.tar.gz
gcc-2242b975c08e150dd712d8e64341cae8457788ef.tar.bz2
analyzer: fix ICE on unhandled tree codes in get_rvalue_1 [PR96641]
The old implementation of region_model::get_rvalue_1 gracefully handled tree codes it didn't understand, returning "UNKNOWN", whereas the new implementation (r11-2694-g808f4dfeb3a95f50f15e71148e5c1067f90a126d) had an assertion left over from development, leading to ICEs. This patch restores the old behavior for these cases. gcc/analyzer/ChangeLog: PR analyzer/96641 * region-model.cc (region_model::get_rvalue_1): Handle unrecognized tree codes by returning "UNKNOWN. gcc/testsuite/ChangeLog: PR analyzer/96641 * g++.dg/analyzer/pr96641.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/analyzer/region-model.cc2
-rw-r--r--gcc/testsuite/g++.dg/analyzer/pr96641.C18
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index cd74c0f..305e964 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -1097,7 +1097,7 @@ region_model::get_rvalue_1 (path_var pv, region_model_context *ctxt)
switch (TREE_CODE (pv.m_tree))
{
default:
- gcc_unreachable ();
+ return m_mgr->get_or_create_unknown_svalue (TREE_TYPE (pv.m_tree));
case ADDR_EXPR:
{
diff --git a/gcc/testsuite/g++.dg/analyzer/pr96641.C b/gcc/testsuite/g++.dg/analyzer/pr96641.C
new file mode 100644
index 0000000..eb11c85
--- /dev/null
+++ b/gcc/testsuite/g++.dg/analyzer/pr96641.C
@@ -0,0 +1,18 @@
+struct uh {
+ virtual void
+ sx ();
+};
+
+struct iz : uh {
+ virtual void
+ sx ()
+ {
+ sx ();
+ }
+};
+
+void
+a2 ()
+{
+ iz ().sx ();
+}