aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/formal
diff options
context:
space:
mode:
authorLeonardo Alt <leo@ethereum.org>2018-11-28 20:16:35 +0800
committerLeonardo Alt <leo@ethereum.org>2018-11-30 17:41:15 +0800
commit2f6de12e8ca98c92ee708081c3a3be05c2c30c6c (patch)
treefe4a39b9452400af37ad4e1715e595223ec88f87 /libsolidity/formal
parent6aa9ce2d4348aa5ee0d64854942db4adb0c8b9d2 (diff)
downloaddexon-solidity-2f6de12e8ca98c92ee708081c3a3be05c2c30c6c.tar.gz
dexon-solidity-2f6de12e8ca98c92ee708081c3a3be05c2c30c6c.tar.zst
dexon-solidity-2f6de12e8ca98c92ee708081c3a3be05c2c30c6c.zip
[SMTChecker] Make smt::Sort::operator== virtual
Diffstat (limited to 'libsolidity/formal')
-rw-r--r--libsolidity/formal/SolverInterface.h22
1 files changed, 16 insertions, 6 deletions
diff --git a/libsolidity/formal/SolverInterface.h b/libsolidity/formal/SolverInterface.h
index 7f20876e..4a4b3fb1 100644
--- a/libsolidity/formal/SolverInterface.h
+++ b/libsolidity/formal/SolverInterface.h
@@ -55,7 +55,7 @@ struct Sort
Sort(Kind _kind):
kind(_kind) {}
virtual ~Sort() = default;
- bool operator==(Sort const& _other) const { return kind == _other.kind; }
+ virtual bool operator==(Sort const& _other) const { return kind == _other.kind; }
Kind const kind;
};
@@ -65,16 +65,22 @@ struct FunctionSort: public Sort
{
FunctionSort(std::vector<SortPointer> _domain, SortPointer _codomain):
Sort(Kind::Function), domain(std::move(_domain)), codomain(std::move(_codomain)) {}
- bool operator==(FunctionSort const& _other) const
+ bool operator==(Sort const& _other) const override
{
+ if (!Sort::operator==(_other))
+ return false;
+ auto _otherFunction = dynamic_cast<FunctionSort const*>(&_other);
+ solAssert(_otherFunction, "");
+ if (domain.size() != _otherFunction->domain.size())
+ return false;
if (!std::equal(
domain.begin(),
domain.end(),
- _other.domain.begin(),
+ _otherFunction->domain.begin(),
[&](SortPointer _a, SortPointer _b) { return *_a == *_b; }
))
return false;
- return Sort::operator==(_other) && *codomain == *_other.codomain;
+ return *codomain == *_otherFunction->codomain;
}
std::vector<SortPointer> domain;
@@ -87,9 +93,13 @@ struct ArraySort: public Sort
/// _range is the sort of the values
ArraySort(SortPointer _domain, SortPointer _range):
Sort(Kind::Array), domain(std::move(_domain)), range(std::move(_range)) {}
- bool operator==(ArraySort const& _other) const
+ bool operator==(Sort const& _other) const override
{
- return Sort::operator==(_other) && *domain == *_other.domain && *range == *_other.range;
+ if (!Sort::operator==(_other))
+ return false;
+ auto _otherArray = dynamic_cast<ArraySort const*>(&_other);
+ solAssert(_otherArray, "");
+ return *domain == *_otherArray->domain && *range == *_otherArray->range;
}
SortPointer domain;