diff --git a/Changelog.md b/Changelog.md index 0f8460919..b1f48f630 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,7 @@ Bugfixes: * ABIEncoderV2: Fix internal error related to bare delegatecall. * ABIEncoderV2: Fix internal error related to ecrecover. * ABIEncoderV2: Fix internal error related to mappings as library parameters. + * Inline Assembly: Proper error message for missing variables. * SMTChecker: Fixed crash when used with fixed-sized arrays. * Yul: Properly detect name clashes with functions before their declaration. diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index 26890b569..b73cb9114 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -298,11 +298,13 @@ bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly) } declarations = m_resolver.nameFromCurrentScope(realName); } - if (declarations.size() != 1) + if (declarations.size() > 1) { declarationError(_identifier.location, "Multiple matching identifiers. Resolving overloaded identifiers is not supported."); return size_t(-1); } + else if (declarations.size() == 0) + return size_t(-1); if (auto var = dynamic_cast(declarations.front())) if (var->isLocalVariable() && _crossesFunctionBoundary) { diff --git a/test/libsolidity/syntaxTests/inlineAssembly/invalid/jump_invalid_label.sol b/test/libsolidity/syntaxTests/inlineAssembly/invalid/jump_invalid_label.sol new file mode 100644 index 000000000..1ad803869 --- /dev/null +++ b/test/libsolidity/syntaxTests/inlineAssembly/invalid/jump_invalid_label.sol @@ -0,0 +1,10 @@ +contract C { + function f() public pure { + assembly { + jump(xy) + } + } +} +// ---- +// DeclarationError: (68-70): Identifier not found. +// SyntaxError: (63-71): Jump instructions and labels are low-level EVM features that can lead to incorrect stack access. Because of that they are discouraged. Please consider using "switch", "if" or "for" statements instead. diff --git a/test/libsolidity/syntaxTests/inlineAssembly/invalid/missing_variable.sol b/test/libsolidity/syntaxTests/inlineAssembly/invalid/missing_variable.sol new file mode 100644 index 000000000..0c9128df9 --- /dev/null +++ b/test/libsolidity/syntaxTests/inlineAssembly/invalid/missing_variable.sol @@ -0,0 +1,9 @@ +contract C { + function f() public pure { + assembly { + x := 1 + } + } +} +// ---- +// DeclarationError: (63-64): Variable not found or variable not lvalue.