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.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to master as r11-2729-g2242b975c08e150dd712d8e64341cae8457788ef.

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.
---
 gcc/analyzer/region-model.cc            |  2 +-
 gcc/testsuite/g++.dg/analyzer/pr96641.C | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/analyzer/pr96641.C

diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index cd74c0f6195..305e9648c79 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 00000000000..eb11c8584b6
--- /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 ();
+}
-- 
2.26.2

Reply via email to