aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-09-17 21:13:52 +0800
committerGitHub <noreply@github.com>2018-09-17 21:13:52 +0800
commitd46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428 (patch)
treeb571e164bed958810e0dd4d79790b406b4c834bf /libsolidity
parentf4ed315197c94580daa4e28dab16cb4a6c6dc11a (diff)
parentf3cbdadec7a38626e5dd64c0faa981161b99bd80 (diff)
downloaddexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.tar
dexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.tar.gz
dexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.tar.bz2
dexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.tar.lz
dexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.tar.xz
dexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.tar.zst
dexon-solidity-d46d3feb415d88f49cf1a6ec4f6ba0c52b1b5428.zip
Merge pull request #4904 from liangdzou/type_conversion
type conversion checker for array should be stronger
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 13294476..3056561b 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -1733,8 +1733,23 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
DataLocation dataLoc = DataLocation::Memory;
if (auto argRefType = dynamic_cast<ReferenceType const*>(argType.get()))
dataLoc = argRefType->location();
- resultType = ReferenceType::copyForLocationIfReference(dataLoc, resultType);
- if (!argType->isExplicitlyConvertibleTo(*resultType))
+ if (auto type = dynamic_cast<ReferenceType const*>(resultType.get()))
+ resultType = type->copyForLocation(dataLoc, type->isPointer());
+ if (argType->isExplicitlyConvertibleTo(*resultType))
+ {
+ if (auto argArrayType = dynamic_cast<ArrayType const*>(argType.get()))
+ {
+ auto resultArrayType = dynamic_cast<ArrayType const*>(resultType.get());
+ solAssert(!!resultArrayType, "");
+ solAssert(
+ argArrayType->location() != DataLocation::Storage ||
+ ((resultArrayType->isPointer() || (argArrayType->isByteArray() && resultArrayType->isByteArray())) &&
+ resultArrayType->location() == DataLocation::Storage),
+ "Invalid explicit conversion to storage type."
+ );
+ }
+ }
+ else
{
if (resultType->category() == Type::Category::Contract && argType->category() == Type::Category::Address)
{