diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2018-08-07 20:17:56 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2018-08-07 20:18:54 +0800 |
commit | 05cc7e79e1bf484c71ce93510fbfbf2c3e415cc6 (patch) | |
tree | 795453abee9aa819951ee8a532de623d8719a648 | |
parent | eb7b3862ac5089615710d07c9a56b8edc0472394 (diff) | |
download | dexon-solidity-05cc7e79e1bf484c71ce93510fbfbf2c3e415cc6.tar.gz dexon-solidity-05cc7e79e1bf484c71ce93510fbfbf2c3e415cc6.tar.zst dexon-solidity-05cc7e79e1bf484c71ce93510fbfbf2c3e415cc6.zip |
More precise error message if using non-variables with _slot/_offset
-rw-r--r-- | libsolidity/analysis/ReferencesResolver.cpp | 2 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 8 | ||||
-rw-r--r-- | test/libsolidity/syntaxTests/inlineAssembly/storage_reference_on_function.sol | 2 |
3 files changed, 8 insertions, 4 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index b888ecd6..5458c1b0 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -262,8 +262,6 @@ bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly) return size_t(-1); } declarations = m_resolver.nameFromCurrentScope(realName); - if (!dynamic_cast<VariableDeclaration const*>(declarations.front())) - return size_t(-1); } if (declarations.size() != 1) return size_t(-1); diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 7cec7c43..d98d6af1 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -867,6 +867,7 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly) return size_t(-1); Declaration const* declaration = ref->second.declaration; solAssert(!!declaration, ""); + bool requiresStorage = ref->second.isSlot || ref->second.isOffset; if (auto var = dynamic_cast<VariableDeclaration const*>(declaration)) { if (var->isConstant()) @@ -874,7 +875,7 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly) m_errorReporter.typeError(_identifier.location, "Constant variables not supported by inline assembly."); return size_t(-1); } - else if (ref->second.isSlot || ref->second.isOffset) + else if (requiresStorage) { if (!var->isStateVariable() && !var->type()->dataStoredIn(DataLocation::Storage)) { @@ -906,6 +907,11 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly) return size_t(-1); } } + else if (requiresStorage) + { + m_errorReporter.typeError(_identifier.location, "The suffixes _offset and _slot can only be used on storage variables."); + return size_t(-1); + } else if (_context == julia::IdentifierContext::LValue) { m_errorReporter.typeError(_identifier.location, "Only local variables can be assigned to in inline assembly."); diff --git a/test/libsolidity/syntaxTests/inlineAssembly/storage_reference_on_function.sol b/test/libsolidity/syntaxTests/inlineAssembly/storage_reference_on_function.sol index 6838e7a4..9165654f 100644 --- a/test/libsolidity/syntaxTests/inlineAssembly/storage_reference_on_function.sol +++ b/test/libsolidity/syntaxTests/inlineAssembly/storage_reference_on_function.sol @@ -6,4 +6,4 @@ contract C { } } // ---- -// DeclarationError: (84-90): Identifier not found. +// TypeError: (84-90): The suffixes _offset and _slot can only be used on storage variables. |