aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AST.cpp19
-rw-r--r--AST.h2
-rw-r--r--NameAndTypeResolver.cpp8
3 files changed, 12 insertions, 17 deletions
diff --git a/AST.cpp b/AST.cpp
index c6d8f5c5..761427db 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -274,15 +274,6 @@ TypePointer FunctionDefinition::getType(ContractDefinition const*) const
void FunctionDefinition::checkTypeRequirements()
{
- // change all byte arrays parameters to point to calldata
- if (getVisibility() == Visibility::External)
- for (ASTPointer<VariableDeclaration> const& var: getParameters())
- {
- auto const& type = var->getType();
- solAssert(!!type, "");
- if (auto const* byteArrayType = dynamic_cast<ByteArrayType const*>(type.get()))
- var->setType(byteArrayType->copyForLocation(ByteArrayType::Location::CallData));
- }
for (ASTPointer<VariableDeclaration> const& var: getParameters() + getReturnParameters())
if (!var->getType()->canLiveOutsideStorage())
BOOST_THROW_EXCEPTION(var->createTypeError("Type is required to live outside storage."));
@@ -299,16 +290,14 @@ string FunctionDefinition::getCanonicalSignature() const
bool VariableDeclaration::isLValue() const
{
- if (auto const* function = dynamic_cast<FunctionDefinition const*>(getScope()))
- if (function->getVisibility() == Declaration::Visibility::External && isFunctionParameter())
- return false;
- return true;
+ // External function parameters are Read-Only
+ return !isExternalFunctionParameter();
}
-bool VariableDeclaration::isFunctionParameter() const
+bool VariableDeclaration::isExternalFunctionParameter() const
{
auto const* function = dynamic_cast<FunctionDefinition const*>(getScope());
- if (!function)
+ if (!function || function->getVisibility() != Declaration::Visibility::External)
return false;
for (auto const& variable: function->getParameters())
if (variable.get() == this)
diff --git a/AST.h b/AST.h
index 62855bc7..64dac594 100644
--- a/AST.h
+++ b/AST.h
@@ -448,7 +448,7 @@ public:
virtual bool isLValue() const override;
bool isLocalVariable() const { return !!dynamic_cast<FunctionDefinition const*>(getScope()); }
- bool isFunctionParameter() const;
+ bool isExternalFunctionParameter() const;
bool isStateVariable() const { return m_isStateVariable; }
bool isIndexed() const { return m_isIndexed; }
diff --git a/NameAndTypeResolver.cpp b/NameAndTypeResolver.cpp
index ea70b65b..e19b0bf9 100644
--- a/NameAndTypeResolver.cpp
+++ b/NameAndTypeResolver.cpp
@@ -333,7 +333,13 @@ void ReferencesResolver::endVisit(VariableDeclaration& _variable)
// or mapping
if (_variable.getTypeName())
{
- _variable.setType(_variable.getTypeName()->toType());
+ TypePointer type = _variable.getTypeName()->toType();
+ // All byte array parameter types should point to call data
+ if (_variable.isExternalFunctionParameter())
+ if (auto const* byteArrayType = dynamic_cast<ByteArrayType const*>(type.get()))
+ type = byteArrayType->copyForLocation(ByteArrayType::Location::CallData);
+ _variable.setType(type);
+
if (!_variable.getType())
BOOST_THROW_EXCEPTION(_variable.getTypeName()->createTypeError("Invalid type name"));
}