in include/HashedAbstractEnvironment.h [341:365]
AbstractValueKind join_like_operation(
const MapValue& other,
std::function<void(Domain*, const Domain&)> operation) {
for (auto it = m_map.begin(); it != m_map.end();) {
auto other_binding = other.m_map.find(it->first);
if (other_binding == other.m_map.end()) {
// The other value is Top, we just erase the binding. We need to use a
// different iterator, because all iterators to an erased binding are
// invalidated.
auto to_erase = it++;
m_map.erase(to_erase);
} else {
// We compute the join-like combination of the values.
operation(&it->second, other_binding->second);
if (it->second.is_top()) {
// If the result is Top, we erase the binding.
auto to_erase = it++;
m_map.erase(to_erase);
} else {
++it;
}
}
}
return kind();
}