diff options
| author | chriseth <chris@ethereum.org> | 2018-03-16 23:06:40 +0800 |
|---|---|---|
| committer | Alex Beregszaszi <alex@rtfs.hu> | 2018-03-29 16:57:11 +0800 |
| commit | 5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb (patch) | |
| tree | 16232775c6f6c4b9257f0f1fde8cbbf9054a152c /libsolidity/analysis | |
| parent | c2ae33f8067c2ed2a70a86f9e29cce06e23af28a (diff) | |
| download | dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.gz dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.bz2 dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.lz dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.xz dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.tar.zst dexon-solidity-5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb.zip | |
Prevent encoding of weird types and support packed encoding of external function types.
Diffstat (limited to 'libsolidity/analysis')
| -rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 6e287f83..620dfca4 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -1644,9 +1644,20 @@ bool TypeChecker::visit(FunctionCall const& _functionCall) auto const& argType = type(*arguments[i]); if (functionType->takesArbitraryParameters()) { + bool errored = false; if (auto t = dynamic_cast<RationalNumberType const*>(argType.get())) if (!t->mobileType()) + { m_errorReporter.typeError(arguments[i]->location(), "Invalid rational number (too large or division by zero)."); + errored = true; + } + if (!errored && !( + argType->mobileType() && + argType->mobileType()->interfaceType(false) && + argType->mobileType()->interfaceType(false)->encodingType() && + !(dynamic_cast<StructType const*>(argType->mobileType()->interfaceType(false)->encodingType().get())) + )) + m_errorReporter.typeError(arguments[i]->location(), "This type cannot be encoded."); } else if (!type(*arguments[i])->isImplicitlyConvertibleTo(*parameterTypes[i])) m_errorReporter.typeError( |
