mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #4729 from ethereum/slot-on-non-storage
Properly handle invalid references used together with _slot and _offset.
This commit is contained in:
commit
4158a310bd
@ -83,6 +83,7 @@ Bugfixes:
|
|||||||
* Fix NatSpec json output for `@notice` and `@dev` tags on contract definitions.
|
* Fix NatSpec json output for `@notice` and `@dev` tags on contract definitions.
|
||||||
* References Resolver: Do not crash on using ``_slot`` and ``_offset`` suffixes on their own.
|
* References Resolver: Do not crash on using ``_slot`` and ``_offset`` suffixes on their own.
|
||||||
* References Resolver: Enforce ``storage`` as data location for mappings.
|
* References Resolver: Enforce ``storage`` as data location for mappings.
|
||||||
|
* References Resolver: Properly handle invalid references used together with ``_slot`` and ``_offset``.
|
||||||
* References Resolver: Report error instead of assertion fail when FunctionType has an undeclared type as parameter.
|
* References Resolver: Report error instead of assertion fail when FunctionType has an undeclared type as parameter.
|
||||||
* Type Checker: Disallow assignments to mappings within tuple assignments as well.
|
* Type Checker: Disallow assignments to mappings within tuple assignments as well.
|
||||||
* Type Checker: Allow assignments to local variables of mapping types.
|
* Type Checker: Allow assignments to local variables of mapping types.
|
||||||
|
@ -867,6 +867,7 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
return size_t(-1);
|
return size_t(-1);
|
||||||
Declaration const* declaration = ref->second.declaration;
|
Declaration const* declaration = ref->second.declaration;
|
||||||
solAssert(!!declaration, "");
|
solAssert(!!declaration, "");
|
||||||
|
bool requiresStorage = ref->second.isSlot || ref->second.isOffset;
|
||||||
if (auto var = dynamic_cast<VariableDeclaration const*>(declaration))
|
if (auto var = dynamic_cast<VariableDeclaration const*>(declaration))
|
||||||
{
|
{
|
||||||
if (var->isConstant())
|
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.");
|
m_errorReporter.typeError(_identifier.location, "Constant variables not supported by inline assembly.");
|
||||||
return size_t(-1);
|
return size_t(-1);
|
||||||
}
|
}
|
||||||
else if (ref->second.isSlot || ref->second.isOffset)
|
else if (requiresStorage)
|
||||||
{
|
{
|
||||||
if (!var->isStateVariable() && !var->type()->dataStoredIn(DataLocation::Storage))
|
if (!var->isStateVariable() && !var->type()->dataStoredIn(DataLocation::Storage))
|
||||||
{
|
{
|
||||||
@ -906,6 +907,11 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
return size_t(-1);
|
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)
|
else if (_context == julia::IdentifierContext::LValue)
|
||||||
{
|
{
|
||||||
m_errorReporter.typeError(_identifier.location, "Only local variables can be assigned to in inline assembly.");
|
m_errorReporter.typeError(_identifier.location, "Only local variables can be assigned to in inline assembly.");
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
contract C {
|
||||||
|
function f() pure public {
|
||||||
|
assembly {
|
||||||
|
let x := f_slot
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError: (84-90): The suffixes _offset and _slot can only be used on storage variables.
|
Loading…
Reference in New Issue
Block a user