From e8f5a29c31be8a15ee92a2b13c4b9d40be7d0f15 Mon Sep 17 00:00:00 2001
From: Nikolaj Bjorner <nbjorner@microsoft.com>
Date: Mon, 22 Nov 2021 19:37:10 +0100
Subject: [PATCH] fix #5679

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
---
 src/ast/for_each_expr.cpp | 4 ++--
 src/smt/seq_eq_solver.cpp | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/ast/for_each_expr.cpp b/src/ast/for_each_expr.cpp
index 2762fda38..54e176fc5 100644
--- a/src/ast/for_each_expr.cpp
+++ b/src/ast/for_each_expr.cpp
@@ -65,7 +65,7 @@ bool has_skolem_functions(expr * n) {
 }
 
 subterms::subterms(expr_ref_vector const& es, bool include_bound): m_include_bound(include_bound), m_es(es) {}
-subterms::subterms(expr_ref const& e, bool include_bound) : m_include_bound(include_bound), m_es(e.m()) { m_es.push_back(e); }
+subterms::subterms(expr_ref const& e, bool include_bound) : m_include_bound(include_bound), m_es(e.m()) {if (e)  m_es.push_back(e); }
 subterms::iterator subterms::begin() { return iterator(*this, true); }
 subterms::iterator subterms::end() { return iterator(*this, false); }
 subterms::iterator::iterator(subterms& f, bool start): m_include_bound(f.m_include_bound), m_es(f.m_es) {
@@ -112,7 +112,7 @@ bool subterms::iterator::operator!=(iterator const& other) const {
 
 
 subterms_postorder::subterms_postorder(expr_ref_vector const& es): m_es(es) {}
-subterms_postorder::subterms_postorder(expr_ref const& e) : m_es(e.m()) { m_es.push_back(e); }
+subterms_postorder::subterms_postorder(expr_ref const& e) : m_es(e.m()) { if (e) m_es.push_back(e); }
 subterms_postorder::iterator subterms_postorder::begin() { return iterator(*this, true); }
 subterms_postorder::iterator subterms_postorder::end() { return iterator(*this, false); }
 subterms_postorder::iterator::iterator(subterms_postorder& f, bool start): m_es(f.m_es) {
diff --git a/src/smt/seq_eq_solver.cpp b/src/smt/seq_eq_solver.cpp
index 9203c35bd..a54ebdac9 100644
--- a/src/smt/seq_eq_solver.cpp
+++ b/src/smt/seq_eq_solver.cpp
@@ -1120,9 +1120,9 @@ struct remove_obj_pair_map : public trail {
     remove_obj_pair_map(ast_manager& m, obj_pair_hashtable<expr, expr> & map, expr* a, expr* b):
         m(m), m_map(map), a(a), b(b) {}
     void undo() override {
+        m_map.erase(std::make_pair(a, b));
         m.dec_ref(a);
         m.dec_ref(b);
-        m_map.erase(std::make_pair(a, b));
     }
 };