aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsolidity/analysis/TypeChecker.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 4cdfcc0c..ee5865f7 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -2100,9 +2100,20 @@ bool TypeChecker::visit(MemberAccess const& _memberAccess)
{
if (magicType->kind() == MagicType::Kind::ABI)
annotation.isPure = true;
- else if (magicType->kind() == MagicType::Kind::MetaType)
- if (memberName == "creationCode" || memberName == "runtimeCode")
- annotation.isPure = true;
+ else if (magicType->kind() == MagicType::Kind::MetaType && (
+ memberName == "creationCode" || memberName == "runtimeCode"
+ ))
+ {
+ annotation.isPure = true;
+ m_scope->annotation().contractDependencies.insert(
+ &dynamic_cast<ContractType const&>(*magicType->typeArgument()).contractDefinition()
+ );
+ if (contractDependenciesAreCyclic(*m_scope))
+ m_errorReporter.typeError(
+ _memberAccess.location(),
+ "Circular reference for contract code access."
+ );
+ }
}
return false;