aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-03-16 23:06:40 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2018-03-29 16:57:11 +0800
commit5c8a6aac698f6d084a22c6ec9f282b3f26ddb8bb (patch)
tree16232775c6f6c4b9257f0f1fde8cbbf9054a152c /libsolidity/analysis
parentc2ae33f8067c2ed2a70a86f9e29cce06e23af28a (diff)
downloaddexon-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.cpp11
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(