aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AST.cpp13
-rw-r--r--Types.cpp8
-rw-r--r--Types.h3
3 files changed, 14 insertions, 10 deletions
diff --git a/AST.cpp b/AST.cpp
index 0827f794..63f3d772 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -346,8 +346,11 @@ void VariableDeclaration::checkTypeRequirements()
if (!m_value)
return;
if (m_type)
+ {
m_value->expectType(*m_type);
- else
+ if (m_isStateVariable && !m_type->externalType() && getVisibility() >= Visibility::Public)
+ BOOST_THROW_EXCEPTION(createTypeError("Internal type is not allowed for state variables."));
+ } else
{
// no type declared and no previous assignment, infer the type
m_value->checkTypeRequirements();
@@ -426,6 +429,8 @@ void EventDefinition::checkTypeRequirements()
numIndexed++;
if (!var->getType()->canLiveOutsideStorage())
BOOST_THROW_EXCEPTION(var->createTypeError("Type is required to live outside storage."));
+ if (!var->getType()->externalType() && getVisibility() >= Visibility::Public)
+ BOOST_THROW_EXCEPTION(var->createTypeError("Internal type is not allowed for Events"));
}
if (numIndexed > 3)
BOOST_THROW_EXCEPTION(createTypeError("More than 3 indexed arguments for event."));
@@ -657,9 +662,9 @@ void MemberAccess::checkTypeRequirements()
if (!m_type)
BOOST_THROW_EXCEPTION(createTypeError("Member \"" + *m_memberName + "\" not found or not "
"visible in " + type.toString()));
- //todo check for visibility
-// else if (!m_type->externalType())
-// BOOST_THROW_EXCEPTION(createTypeError("Internal type not allowed for function with external visibility"));
+// if (auto f = dynamic_cast<FunctionType const*>(m_expression->getType().get()))
+// if (f->getLocation() == FunctionType::Location::External && !m_type->externalType())
+// BOOST_THROW_EXCEPTION(createTypeError(*m_memberName + " member has an internal type."));
// This should probably move somewhere else.
if (type.getCategory() == Type::Category::Struct)
diff --git a/Types.cpp b/Types.cpp
index 82c28a39..7b4d1de2 100644
--- a/Types.cpp
+++ b/Types.cpp
@@ -748,14 +748,12 @@ TypePointer ArrayType::externalType() const
return TypePointer();
if (m_isByteArray)
return shared_from_this();
- if (!(m_baseType->externalType()))
- {
+ if (!m_baseType->externalType())
return TypePointer();
- }
- if (dynamic_cast<ArrayType const*>(m_baseType.get()) && m_baseType->isDynamicallySized())
+ if (m_baseType->getCategory() == Category::Array && m_baseType->isDynamicallySized())
return TypePointer();
- if (m_baseType->isDynamicallySized())
+ if (isDynamicallySized())
return std::make_shared<ArrayType>(Location::CallData, m_baseType->externalType());
else
return std::make_shared<ArrayType>(Location::CallData, m_baseType->externalType(), m_length);
diff --git a/Types.h b/Types.h
index 5941646a..17264dc5 100644
--- a/Types.h
+++ b/Types.h
@@ -187,7 +187,8 @@ public:
"for type without literals."));
}
- /// Returns address of type for ABI interface
+ /// @returns a type suitable for outside of Solidity, i.e. for contract types it returns address.
+ /// If there is no such type, returns an empty shared pointer.
virtual TypePointer externalType() const { return TypePointer(); }
protected: