mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #3550 from ethereum/offsetconstantsasm
Properly warn when using ``_offset`` and ``_slot`` for constants in inline assembly.
This commit is contained in:
commit
a6b52fdc34
@ -8,6 +8,7 @@ Features:
|
|||||||
Bugfixes:
|
Bugfixes:
|
||||||
* JSON-AST: Add "documentation" property to function, event and modifier definition.
|
* JSON-AST: Add "documentation" property to function, event and modifier definition.
|
||||||
* Standard JSON: catch errors properly when invalid "sources" are passed
|
* Standard JSON: catch errors properly when invalid "sources" are passed
|
||||||
|
* Type Checker: Properly warn when using ``_offset`` and ``_slot`` for constants in inline assembly.
|
||||||
|
|
||||||
### 0.4.20 (2018-02-14)
|
### 0.4.20 (2018-02-14)
|
||||||
|
|
||||||
|
@ -804,7 +804,12 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
solAssert(!!declaration, "");
|
solAssert(!!declaration, "");
|
||||||
if (auto var = dynamic_cast<VariableDeclaration const*>(declaration))
|
if (auto var = dynamic_cast<VariableDeclaration const*>(declaration))
|
||||||
{
|
{
|
||||||
if (ref->second.isSlot || ref->second.isOffset)
|
if (var->isConstant())
|
||||||
|
{
|
||||||
|
m_errorReporter.typeError(_identifier.location, "Constant variables not supported by inline assembly.");
|
||||||
|
return size_t(-1);
|
||||||
|
}
|
||||||
|
else if (ref->second.isSlot || ref->second.isOffset)
|
||||||
{
|
{
|
||||||
if (!var->isStateVariable() && !var->type()->dataStoredIn(DataLocation::Storage))
|
if (!var->isStateVariable() && !var->type()->dataStoredIn(DataLocation::Storage))
|
||||||
{
|
{
|
||||||
@ -817,11 +822,6 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
return size_t(-1);
|
return size_t(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (var->isConstant())
|
|
||||||
{
|
|
||||||
m_errorReporter.typeError(_identifier.location, "Constant variables not supported by inline assembly.");
|
|
||||||
return size_t(-1);
|
|
||||||
}
|
|
||||||
else if (!var->isLocalVariable())
|
else if (!var->isLocalVariable())
|
||||||
{
|
{
|
||||||
m_errorReporter.typeError(_identifier.location, "Only local variables are supported. To access storage variables, use the _slot and _offset suffixes.");
|
m_errorReporter.typeError(_identifier.location, "Only local variables are supported. To access storage variables, use the _slot and _offset suffixes.");
|
||||||
|
@ -5776,6 +5776,21 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage_variable_access_out_of_functions)
|
|||||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(inline_assembly_constant_variable_via_offset)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract test {
|
||||||
|
uint constant x = 2;
|
||||||
|
function f() pure public {
|
||||||
|
assembly {
|
||||||
|
let r := x_offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_ERROR(text, TypeError, "Constant variables not supported by inline assembly.");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(inline_assembly_calldata_variables)
|
BOOST_AUTO_TEST_CASE(inline_assembly_calldata_variables)
|
||||||
{
|
{
|
||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
|
Loading…
Reference in New Issue
Block a user