diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-08-17 18:18:00 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-08-17 20:46:49 -0400 |
commit | 2242b975c08e150dd712d8e64341cae8457788ef (patch) | |
tree | 0cc506818c3f7d93c61c4d5aae8f0280faa05541 /gcc | |
parent | 1b0be822208349b2795381deace2352e998c1ad0 (diff) | |
download | gcc-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.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/analyzer/pr96641.C | 18 |
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 (); +} |