aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-11-27 02:47:32 +0800
committerGitHub <noreply@github.com>2018-11-27 02:47:32 +0800
commit240ad0e34ee0e9a28d0ebe8d1c94b9a08b33844e (patch)
treee11a2e0458eb8bd7ff7e29bb52ae3185b4a4c38b /libsolidity
parent2f0088f620e88c06387b69d00a2f91f5303cfe1f (diff)
parent30e6f8d3fb9a16dc1e07367c9010aabe3577e2f1 (diff)
downloaddexon-solidity-240ad0e34ee0e9a28d0ebe8d1c94b9a08b33844e.tar.gz
dexon-solidity-240ad0e34ee0e9a28d0ebe8d1c94b9a08b33844e.tar.zst
dexon-solidity-240ad0e34ee0e9a28d0ebe8d1c94b9a08b33844e.zip
Merge pull request #5382 from ethereum/libraryMappingPublic
Allow mapping arguments for public and external library functions.
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp28
-rw-r--r--libsolidity/codegen/ExpressionCompiler.cpp2
2 files changed, 17 insertions, 13 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 1a3844ad..9d536a3a 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -697,20 +697,22 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
}
for (ASTPointer<VariableDeclaration> const& var: _function.parameters() + _function.returnParameters())
{
+ if (type(*var)->category() == Type::Category::Mapping)
+ {
+ if (!type(*var)->dataStoredIn(DataLocation::Storage))
+ m_errorReporter.typeError(var->location(), "Mapping types can only have a data location of \"storage\"." );
+ else if (!isLibraryFunction && _function.isPublic())
+ m_errorReporter.typeError(var->location(), "Mapping types for parameters or return variables can only be used in internal or library functions.");
+ }
+ else
+ {
+ if (!type(*var)->canLiveOutsideStorage() && _function.isPublic())
+ m_errorReporter.typeError(var->location(), "Type is required to live outside storage.");
+ if (_function.isPublic() && !(type(*var)->interfaceType(isLibraryFunction)))
+ m_errorReporter.fatalTypeError(var->location(), "Internal or recursive type is not allowed for public or external functions.");
+ }
if (
- type(*var)->category() == Type::Category::Mapping &&
- !type(*var)->dataStoredIn(DataLocation::Storage)
- )
- m_errorReporter.typeError(var->location(), "Mapping types can only have a data location of \"storage\".");
- else if (
- !type(*var)->canLiveOutsideStorage() &&
- _function.visibility() > FunctionDefinition::Visibility::Internal
- )
- m_errorReporter.typeError(var->location(), "Type is required to live outside storage.");
- if (_function.visibility() >= FunctionDefinition::Visibility::Public && !(type(*var)->interfaceType(isLibraryFunction)))
- m_errorReporter.fatalTypeError(var->location(), "Internal or recursive type is not allowed for public or external functions.");
- if (
- _function.visibility() > FunctionDefinition::Visibility::Internal &&
+ _function.isPublic() &&
!_function.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::ABIEncoderV2) &&
!typeSupportedByOldABIEncoder(*type(*var))
)
diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp
index b0d17286..c9a1e076 100644
--- a/libsolidity/codegen/ExpressionCompiler.cpp
+++ b/libsolidity/codegen/ExpressionCompiler.cpp
@@ -1873,6 +1873,8 @@ void ExpressionCompiler::appendExternalFunctionCall(
retSize = 0;
break;
}
+ else if (retType->decodingType())
+ retSize += retType->decodingType()->calldataEncodedSize();
else
retSize += retType->calldataEncodedSize();
}