aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/ReferencesResolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/analysis/ReferencesResolver.cpp')
-rw-r--r--libsolidity/analysis/ReferencesResolver.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp
index ca002f58..d7542bf3 100644
--- a/libsolidity/analysis/ReferencesResolver.cpp
+++ b/libsolidity/analysis/ReferencesResolver.cpp
@@ -25,6 +25,8 @@
#include <libsolidity/analysis/NameAndTypeResolver.h>
#include <libsolidity/interface/Exceptions.h>
#include <libsolidity/analysis/ConstantEvaluator.h>
+#include <libsolidity/inlineasm/AsmCodeGen.h>
+#include <libsolidity/inlineasm/AsmData.h>
using namespace std;
using namespace dev;
@@ -112,6 +114,26 @@ void ReferencesResolver::endVisit(ArrayTypeName const& _typeName)
_typeName.annotation().type = make_shared<ArrayType>(DataLocation::Storage, baseType);
}
+bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly)
+{
+ // We need to perform a full code generation pass here as inline assembly does not distinguish
+ // reference resolution and code generation.
+ // Errors created in this stage are completely ignored because we do not yet know
+ // the type and size of external identifiers, which would result in false errors.
+ ErrorList errorsIgnored;
+ assembly::CodeGenerator codeGen(_inlineAssembly.operations(), errorsIgnored);
+ codeGen.typeCheck([&](assembly::Identifier const& _identifier, eth::Assembly&, assembly::CodeGenerator::IdentifierContext) {
+ auto declarations = m_resolver.nameFromCurrentScope(_identifier.name);
+ if (declarations.size() != 1)
+ return false;
+ _inlineAssembly.annotation().externalReferences[&_identifier] = declarations.front();
+ // At this stage we neither know the code to generate nor the stack size of the identifier,
+ // so we do not modify assembly.
+ return true;
+ });
+ return false;
+}
+
bool ReferencesResolver::visit(Return const& _return)
{
_return.annotation().functionReturnParameters = m_returnParameters;