mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Output error when forward referencing constants in inline assembly
This commit is contained in:
parent
79f4a2b476
commit
bdc2c63327
@ -22,6 +22,7 @@ Bugfixes:
|
|||||||
* Type Checker: Fix internal compiler error when accessing members of array slices.
|
* Type Checker: Fix internal compiler error when accessing members of array slices.
|
||||||
* Type Checker: Fix internal compiler error when trying to decode too large static arrays.
|
* Type Checker: Fix internal compiler error when trying to decode too large static arrays.
|
||||||
* Type Checker: Fix wrong compiler error when referencing an overridden function without calling it.
|
* Type Checker: Fix wrong compiler error when referencing an overridden function without calling it.
|
||||||
|
* Type Checker: Fix internal compiler error when forward referencing non-literal constants from inline assembly.
|
||||||
* NatSpec: DocString block is terminated when encountering an empty line.
|
* NatSpec: DocString block is terminated when encountering an empty line.
|
||||||
* Scanner: Fix bug when two empty NatSpec comments lead to scanning past EOL.
|
* Scanner: Fix bug when two empty NatSpec comments lead to scanning past EOL.
|
||||||
* Code Generator: Trigger proper unimplemented errors on certain array copy operations.
|
* Code Generator: Trigger proper unimplemented errors on certain array copy operations.
|
||||||
|
@ -691,14 +691,6 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
m_errorReporter.typeError(3224_error, _identifier.location, "Constant has no value.");
|
m_errorReporter.typeError(3224_error, _identifier.location, "Constant has no value.");
|
||||||
return size_t(-1);
|
return size_t(-1);
|
||||||
}
|
}
|
||||||
else if (!var || !type(*var)->isValueType() || (
|
|
||||||
dynamic_cast<Literal const*>(var->value().get()) == nullptr &&
|
|
||||||
type(*var->value())->category() != Type::Category::RationalNumber
|
|
||||||
))
|
|
||||||
{
|
|
||||||
m_errorReporter.typeError(7615_error, _identifier.location, "Only direct number constants and references to such constants are supported by inline assembly.");
|
|
||||||
return size_t(-1);
|
|
||||||
}
|
|
||||||
else if (_context == yul::IdentifierContext::LValue)
|
else if (_context == yul::IdentifierContext::LValue)
|
||||||
{
|
{
|
||||||
m_errorReporter.typeError(6252_error, _identifier.location, "Constant variables cannot be assigned to.");
|
m_errorReporter.typeError(6252_error, _identifier.location, "Constant variables cannot be assigned to.");
|
||||||
@ -709,6 +701,23 @@ bool TypeChecker::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
m_errorReporter.typeError(6617_error, _identifier.location, "The suffixes _offset and _slot can only be used on non-constant storage variables.");
|
m_errorReporter.typeError(6617_error, _identifier.location, "The suffixes _offset and _slot can only be used on non-constant storage variables.");
|
||||||
return size_t(-1);
|
return size_t(-1);
|
||||||
}
|
}
|
||||||
|
else if (var && var->value() && !var->value()->annotation().type && !dynamic_cast<Literal const*>(var->value().get()))
|
||||||
|
{
|
||||||
|
m_errorReporter.typeError(
|
||||||
|
2249_error,
|
||||||
|
_identifier.location,
|
||||||
|
"Constant variables with non-literal values cannot be forward referenced from inline assembly."
|
||||||
|
);
|
||||||
|
return size_t(-1);
|
||||||
|
}
|
||||||
|
else if (!var || !type(*var)->isValueType() || (
|
||||||
|
!dynamic_cast<Literal const*>(var->value().get()) &&
|
||||||
|
type(*var->value())->category() != Type::Category::RationalNumber
|
||||||
|
))
|
||||||
|
{
|
||||||
|
m_errorReporter.typeError(7615_error, _identifier.location, "Only direct number constants and references to such constants are supported by inline assembly.");
|
||||||
|
return size_t(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requiresStorage)
|
if (requiresStorage)
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
contract C {
|
||||||
|
function f() public pure {
|
||||||
|
assembly {
|
||||||
|
pop(add(add(1, 2), c))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int constant c = 1;
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
contract C {
|
||||||
|
function f() {
|
||||||
|
assembly {
|
||||||
|
c := add(add(1, 2), c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int constant c = 0 + 1;
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// SyntaxError: (15-83): No visibility specified. Did you intend to add "public"?
|
||||||
|
// TypeError: (71-72): Constant variables with non-literal values cannot be forward referenced from inline assembly.
|
||||||
|
// TypeError: (51-52): Constant variables cannot be assigned to.
|
Loading…
Reference in New Issue
Block a user