aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-08-14 22:30:22 +0800
committerGitHub <noreply@github.com>2018-08-14 22:30:22 +0800
commit029e217ed24c2d7584d9bbebb18920a77713afc6 (patch)
treea790170f0fdf7042707d875be7aa284c4a4a4875 /libsolidity
parent8f0c2a46db787de166f7bcaed2180fcab9248d12 (diff)
parent81faafe7f233f185b5efd9340ccb0185baf226e4 (diff)
downloaddexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.tar
dexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.tar.gz
dexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.tar.bz2
dexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.tar.lz
dexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.tar.xz
dexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.tar.zst
dexon-solidity-029e217ed24c2d7584d9bbebb18920a77713afc6.zip
Merge pull request #4796 from ethereum/structs-in-interfaces
[BREAKING] Adds support for structs in interfaces.
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/analysis/TypeChecker.cpp10
-rw-r--r--libsolidity/analysis/TypeChecker.h3
2 files changed, 9 insertions, 4 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 0ffe6636..601a5e7c 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -580,9 +580,6 @@ void TypeChecker::endVisit(UsingForDirective const& _usingFor)
bool TypeChecker::visit(StructDefinition const& _struct)
{
- if (m_scope->contractKind() == ContractDefinition::ContractKind::Interface)
- m_errorReporter.typeError(_struct.location(), "Structs cannot be defined in interfaces.");
-
for (ASTPointer<VariableDeclaration> const& member: _struct.members())
if (!type(*member)->canBeStored())
m_errorReporter.typeError(member->location(), "Type cannot be used in struct.");
@@ -610,7 +607,10 @@ bool TypeChecker::visit(StructDefinition const& _struct)
if (CycleDetector<StructDefinition>(visitor).run(_struct) != nullptr)
m_errorReporter.fatalTypeError(_struct.location(), "Recursive struct definition.");
+ bool insideStruct = true;
+ swap(insideStruct, m_insideStruct);
ASTNode::listAccept(_struct.members(), *this);
+ m_insideStruct = insideStruct;
return false;
}
@@ -693,10 +693,12 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
bool TypeChecker::visit(VariableDeclaration const& _variable)
{
// Forbid any variable declarations inside interfaces unless they are part of
- // a function's input/output parameters.
+ // * a function's input/output parameters,
+ // * or inside of a struct definition.
if (
m_scope->contractKind() == ContractDefinition::ContractKind::Interface
&& !_variable.isCallableParameter()
+ && !m_insideStruct
)
m_errorReporter.typeError(_variable.location(), "Variables cannot be declared in interfaces.");
diff --git a/libsolidity/analysis/TypeChecker.h b/libsolidity/analysis/TypeChecker.h
index b696de85..ed316f9c 100644
--- a/libsolidity/analysis/TypeChecker.h
+++ b/libsolidity/analysis/TypeChecker.h
@@ -149,6 +149,9 @@ private:
/// Flag indicating whether we are currently inside an EmitStatement.
bool m_insideEmitStatement = false;
+ /// Flag indicating whether we are currently inside a StructDefinition.
+ bool m_insideStruct = false;
+
ErrorReporter& m_errorReporter;
};