diff options
author | Leonardo Alt <leo@ethereum.org> | 2018-11-28 20:16:35 +0800 |
---|---|---|
committer | Leonardo Alt <leo@ethereum.org> | 2018-11-30 17:41:15 +0800 |
commit | 2f6de12e8ca98c92ee708081c3a3be05c2c30c6c (patch) | |
tree | fe4a39b9452400af37ad4e1715e595223ec88f87 /libsolidity/formal | |
parent | 6aa9ce2d4348aa5ee0d64854942db4adb0c8b9d2 (diff) | |
download | dexon-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.h | 22 |
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; |