mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
added check for events and stat variables
This commit is contained in:
parent
011d95e7e3
commit
e3ea90e997
13
AST.cpp
13
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)
|
||||
|
@ -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);
|
||||
|
3
Types.h
3
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:
|
||||
|
Loading…
Reference in New Issue
Block a user