Correct wrong error message referencing .slot and .offset when .length was used

This commit is contained in:
Marenz 2021-09-21 18:02:20 +02:00
parent 0f326ada5c
commit 7a51acc5fe
3 changed files with 13 additions and 2 deletions

View File

@ -29,6 +29,7 @@ Bugfixes:
* SMTChecker: Fix false positive in external calls from constructors. * SMTChecker: Fix false positive in external calls from constructors.
* SMTChecker: Fix internal error on some multi-source uses of ``abi.*``, cryptographic functions and constants. * SMTChecker: Fix internal error on some multi-source uses of ``abi.*``, cryptographic functions and constants.
* Standard JSON: Fix non-fatal errors in Yul mode being discarded if followed by a fatal error. * Standard JSON: Fix non-fatal errors in Yul mode being discarded if followed by a fatal error.
* Type Checker: Correct wrong error message in inline assembly complaining about ``.slot`` or ``.offset` not valid when actually ``.length`` was used.
* Type Checker: Disallow modifier declarations and definitions in interfaces. * Type Checker: Disallow modifier declarations and definitions in interfaces.
* Yul Optimizer: Fix a crash in LoadResolver, when ``keccak256`` has particular non-identifier arguments. * Yul Optimizer: Fix a crash in LoadResolver, when ``keccak256`` has particular non-identifier arguments.

View File

@ -799,7 +799,7 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
m_errorReporter.typeError(6252_error, _identifier.debugData->location, "Constant variables cannot be assigned to."); m_errorReporter.typeError(6252_error, _identifier.debugData->location, "Constant variables cannot be assigned to.");
return false; return false;
} }
else if (!identifierInfo.suffix.empty()) else if (identifierInfo.suffix == "slot" || identifierInfo.suffix == "offset")
{ {
m_errorReporter.typeError(6617_error, _identifier.debugData->location, "The suffixes .offset and .slot can only be used on non-constant storage variables."); m_errorReporter.typeError(6617_error, _identifier.debugData->location, "The suffixes .offset and .slot can only be used on non-constant storage variables.");
return false; return false;
@ -829,7 +829,7 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
{ {
string const& suffix = identifierInfo.suffix; string const& suffix = identifierInfo.suffix;
solAssert((set<string>{"offset", "slot", "length"}).count(suffix), ""); solAssert((set<string>{"offset", "slot", "length"}).count(suffix), "");
if (var->isStateVariable() || var->type()->dataStoredIn(DataLocation::Storage)) if (!var->isConstant() && (var->isStateVariable() || var->type()->dataStoredIn(DataLocation::Storage)))
{ {
if (suffix != "slot" && suffix != "offset") if (suffix != "slot" && suffix != "offset")
{ {

View File

@ -0,0 +1,10 @@
contract Test {
uint constant x = 2;
function f() public pure {
assembly {
let y := x.length
}
}
}
// ----
// TypeError 3622: (91-99): The suffix ".length" is not supported by this variable or type.