Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/assembly.rst
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR needs a changelog entry.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps we should also add a note/warning about the new keywords under Reserved Keywords in the docs.

Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ Solidity language without a compiler change.
pragma solidity >=0.4.16 <0.9.0;

library GetCode {
// This will report a warning - at you will be promoted to reserved keyword
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// This will report a warning - at you will be promoted to reserved keyword
// This will report a warning - `at` will be promoted to a reserved keyword

function at(address addr) public view returns (bytes memory code) {
assembly {
// retrieve the size of the code, this needs assembly
Expand Down
31 changes: 31 additions & 0 deletions libsolidity/analysis/SyntaxChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,9 @@ bool SyntaxChecker::visit(ContractDefinition const& _contract)
"Functions are not allowed to have the same name as the contract. "
"If you intend this to be a constructor, use \"constructor(...) { ... }\" to define it."
);

checkFutureKeyword(_contract);

return true;
}

Expand Down Expand Up @@ -477,6 +480,8 @@ bool SyntaxChecker::visit(FunctionDefinition const& _function)
else if (!_function.isImplemented() && !_function.modifiers().empty())
m_errorReporter.syntaxError(2668_error, _function.location(), "Functions without implementation cannot have modifiers.");

checkFutureKeyword(_function);

return true;
}

Expand Down Expand Up @@ -508,5 +513,31 @@ bool SyntaxChecker::visitNode(ASTNode const& _node)
solAssert(m_sourceUnit);
solAssert(m_sourceUnit->experimentalSolidity());
}
auto const* declaration = dynamic_cast<Declaration const*>(&_node);
if (declaration)
checkFutureKeyword(*declaration);
return ASTConstVisitor::visitNode(_node);
}


void SyntaxChecker::checkFutureKeyword(Declaration const& _declaration)
{
std::set<ASTString> const futureKeywords = {
"transient",
"layout",
"at",
"error",
"super",
"this"
};
Comment on lines +525 to +532
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should put the list in a more general location. Token.h seems like the most appropriate one. We already have isYulKeyword() there. We can add isFutureSolidityKeyword() and isFutureYulKeyword().

if (futureKeywords.count(_declaration.name()))
m_errorReporter.warning(
Comment on lines +533 to +534
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if is indented too much.

Suggested change
if (futureKeywords.count(_declaration.name()))
m_errorReporter.warning(
if (futureKeywords.contains(_declaration.name()))
m_errorReporter.warning(

6335_error,
_declaration.location(),
fmt::format(
"\"{}\" will be promoted to reserved keyword in the next breaking version"
" and will not be allowed as an identifier anymore.",
Comment on lines +538 to +539
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not necessarily something to change here, but just wanted to note that our terminology is all over the place: "keyword" vs "reserved keyword" vs "reserved identifier". We should get that straight at some point, because these are not synonyms.

_declaration.name()
)
);
}
4 changes: 4 additions & 0 deletions libsolidity/analysis/SyntaxChecker.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ class SyntaxChecker: private ASTConstVisitor
/// without a block.
void checkSingleStatementVariableDeclaration(ASTNode const& _statement);

/// Reports a warning if the declaration name is scheduled to be
/// promoted to a keyword in the near future.
void checkFutureKeyword(Declaration const& _declaration);

bool visit(IfStatement const& _ifStatement) override;
bool visit(WhileStatement const& _whileStatement) override;
void endVisit(WhileStatement const& _whileStatement) override;
Expand Down
29 changes: 29 additions & 0 deletions libyul/AsmAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ void AsmAnalyzer::operator()(VariableDeclaration const& _varDecl)
for (auto const& variable: _varDecl.variables)
{
expectValidIdentifier(variable.name, nativeLocationOf(variable));
checkFutureReservedKeyword(variable.name, nativeLocationOf(variable));
}

if (_varDecl.value)
Expand Down Expand Up @@ -326,6 +327,7 @@ void AsmAnalyzer::operator()(FunctionDefinition const& _funDef)
{
yulAssert(!_funDef.name.empty());
expectValidIdentifier(_funDef.name, nativeLocationOf(_funDef));
checkFutureReservedKeyword(_funDef.name, nativeLocationOf(_funDef));
Block const* virtualBlock = m_info.virtualBlocks.at(&_funDef).get();
yulAssert(virtualBlock, "");
Scope& varScope = scope(virtualBlock);
Expand Down Expand Up @@ -953,3 +955,30 @@ void AsmAnalyzer::validateObjectStructure(langutil::SourceLocation const& _astRo
}
}
}

void AsmAnalyzer::checkFutureReservedKeyword(YulName _identifier, langutil::SourceLocation const& _location)
{
std::set<std::string> futureReservedKeywords{"leave"};
if (m_evmVersion < langutil::EVMVersion::london())
futureReservedKeywords.insert("basefee");
if (m_evmVersion < langutil::EVMVersion::paris())
futureReservedKeywords.insert("prevrandao");
if (m_evmVersion < langutil::EVMVersion::cancun())
{
Comment on lines +962 to +967
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This warning should not be EVM-version dependent. When we make these into keywords, they will be disallowed regardless of EVM version.

futureReservedKeywords.insert("blobbasefee");
futureReservedKeywords.insert("blobhash");
futureReservedKeywords.insert("mcopy");
futureReservedKeywords.insert("tstore");
futureReservedKeywords.insert("tload");
}
if (futureReservedKeywords.count(_identifier.str()))
m_errorReporter.warning(
5470_error,
_location,
fmt::format(
"\"{}\" will be promoted to reserved keyword in the next breaking version "
"and will not be allowed anymore as an identifier.",
_identifier.str()
)
);
}
2 changes: 2 additions & 0 deletions libyul/AsmAnalysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ class AsmAnalyzer

void validateObjectStructure(langutil::SourceLocation const& _astRootLocation);

void checkFutureReservedKeyword(YulName _identifier, langutil::SourceLocation const& _location);

yul::ExternalIdentifierAccess::Resolver m_resolver;
Scope* m_currentScope = nullptr;
/// Variables that are active at the current point in assembly (as opposed to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ contract C {
int constant public transient = 0;
}
// ----
// Warning 6335: (17-50): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ library L {

// ----
// Warning 6162: (251-267): Naming function type parameters is deprecated.
// Warning 6335: (251-267): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (159-173): Data location must be "memory" or "calldata" for parameter in function, but "storage" was given.
// TypeError 6651: (251-267): Data location must be "memory" or "calldata" for parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract test {
function f(bytes transient) external;
}
// ----
// Warning 6335: (31-46): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (31-46): Data location must be "memory" or "calldata" for parameter in external function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract test {
function f(bytes transient) internal {}
}
// ----
// Warning 6335: (31-46): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (31-46): Data location must be "storage", "memory" or "calldata" for parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ library L {
function i2() external pure returns (uint[] transient) { }
}
// ----
// Warning 6335: (28-44): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (103-119): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (141-157): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (218-234): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (256-272): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (329-345): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (367-383): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (444-460): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (28-44): Data location must be "storage", "memory" or "calldata" for parameter in function, but none was given.
// TypeError 6651: (103-119): Data location must be "storage", "memory" or "calldata" for return parameter in function, but none was given.
// TypeError 6651: (141-157): Data location must be "storage", "memory" or "calldata" for parameter in function, but none was given.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ library test {
function f(bytes transient) external {}
}
// ----
// Warning 6335: (30-45): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (30-45): Data location must be "storage", "memory" or "calldata" for parameter in external function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ library test {
function f(bytes transient) internal pure {}
}
// ----
// Warning 6335: (30-45): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (30-45): Data location must be "storage", "memory" or "calldata" for parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract C {
function f(uint[] transient) private pure {}
}
// ----
// Warning 6335: (28-44): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (28-44): Data location must be "storage", "memory" or "calldata" for parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract C {
function f() private pure returns (uint[] transient) {}
}
// ----
// Warning 6335: (52-68): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (52-68): Data location must be "storage", "memory" or "calldata" for return parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract test {
function f(bytes transient) public;
}
// ----
// Warning 6335: (31-46): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (31-46): Data location must be "memory" or "calldata" for parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract C {
function h() public pure returns(uint[] transient) {}
}
// ----
// Warning 6335: (50-66): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (50-66): Data location must be "memory" or "calldata" for return parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ contract C {
}
// ----
// Warning 6162: (27-41): Naming function type parameters is deprecated.
// Warning 6335: (27-41): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ contract C {
}
}
// ----
// Warning 6335: (61-88): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (90-118): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 2319: (61-88): This declaration shadows a builtin symbol.
// Warning 2319: (90-118): This declaration shadows a builtin symbol.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ contract C {
}
}
// ----
// Warning 6335: (84-117): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (123-155): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (17-78): The name "_" is reserved.
// DeclarationError 3726: (84-117): The name "super" is reserved.
// DeclarationError 3726: (123-155): The name "this" is reserved.
Expand Down
4 changes: 4 additions & 0 deletions test/libsolidity/syntaxTests/enums/illegal_names.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ contract C {
E e;
}
// ----
// Warning 6335: (0-19): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (20-40): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (72-76): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (82-87): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (0-19): The name "this" is reserved.
// DeclarationError 3726: (20-40): The name "super" is reserved.
// DeclarationError 3726: (41-57): The name "_" is reserved.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@ contract C {
event _();
}
// ----
// Warning 6335: (80-93): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (95-109): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 2319: (80-93): This declaration shadows a builtin symbol.
// Warning 2319: (95-109): This declaration shadows a builtin symbol.
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@
event this();
event super();
event _();
// ----
// Warning 6335: (66-79): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (80-94): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
2 changes: 2 additions & 0 deletions test/libsolidity/syntaxTests/freeFunctions/illegal_names.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ contract C {
}
}
// ----
// Warning 6335: (0-18): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (19-38): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (0-18): The name "this" is reserved.
// DeclarationError 3726: (19-38): The name "super" is reserved.
// DeclarationError 3726: (39-54): The name "_" is reserved.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,7 @@ contract C {
}
// ----
// Warning 6162: (27-41): Naming function type parameters is deprecated.
// Warning 6335: (27-41): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6162: (69-85): Naming function type parameters is deprecated.
// Warning 6335: (69-85): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (69-85): Data location must be "memory" or "calldata" for parameter in function, but none was given.
2 changes: 2 additions & 0 deletions test/libsolidity/syntaxTests/immutable/illegal_names.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ contract C {
uint immutable this;
}
// ----
// Warning 6335: (17-37): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (65-84): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (17-37): The name "super" is reserved.
// DeclarationError 3726: (43-59): The name "_" is reserved.
// DeclarationError 3726: (65-84): The name "this" is reserved.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ contract C {
address public immutable transient;
}
// ----
// Warning 6335: (17-51): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,5 @@ contract C {
// ====
// EVMVersion: <=shanghai
// ----
// Warning 5470: (98-106): "blobhash" will be promoted to reserved keyword in the next breaking version and will not be allowed anymore as an identifier.
// Warning 5470: (237-303): "blobhash" will be promoted to reserved keyword in the next breaking version and will not be allowed anymore as an identifier.
Copy link
Collaborator

@cameel cameel Nov 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd add a few more tests:

  • That the future keywords trigger the warning when used as:
    • module name (import ... as X or import * as X from ...)
    • alias name (import {... as X} from ...)
    • UDVT name
    • struct/enum field name
    • Yul variable/function name
  • That the future Yul keywords (i.e. leave) do trigger the warning outside of Yul.
    • It's actually up for discussion whether these should be reserved at Solidity level, but so far that has been the case with all other Yul keywords (including switch and let, which have no functionality in Solidity).
  • That the future Yul reserved identifiers (e.g. blobhash) do not trigger the warning outside of Yul.

Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,5 @@ contract C {
// ====
// EVMVersion: <paris
// ----
// Warning 5470: (101-111): "prevrandao" will be promoted to reserved keyword in the next breaking version and will not be allowed anymore as an identifier.
// Warning 5470: (255-323): "prevrandao" will be promoted to reserved keyword in the next breaking version and will not be allowed anymore as an identifier.
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ contract A {
modifier mod2(uint[] transient) { _; }
}
// ----
// Warning 6335: (31-47): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6651: (31-47): Data location must be "storage", "memory" or "calldata" for parameter in function, but none was given.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ contract C {
}
}
// ----
// Warning 6335: (28-38): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (70-79): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (167-177): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (238-247): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (28-38): The name "super" is reserved.
// DeclarationError 3726: (70-79): The name "this" is reserved.
// DeclarationError 3726: (111-117): The name "_" is reserved.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ contract C {
using _ for int;
}
// ----
// Warning 6335: (0-49): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (51-99): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (0-49): The name "super" is reserved.
// DeclarationError 3726: (51-99): The name "this" is reserved.
// DeclarationError 3726: (100-145): The name "_" is reserved.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ contract C {
}
}
// ----
// Warning 6335: (52-62): "super" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (76-85): "this" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// DeclarationError 3726: (52-62): The name "super" is reserved.
// DeclarationError 3726: (76-85): The name "this" is reserved.
// Warning 2319: (52-62): This declaration shadows a builtin symbol.
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
contract transient {}
// ----
// Warning 6335: (0-21): "transient" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
contract at layout at 0x1234ABC { }
// ----
// Warning 6335: (0-35): "at" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
contract layout layout at 0x1234ABC { }
// ----
// Warning 6335: (0-39): "layout" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ contract C layout at 0x1234 {
function at() public pure { }
}
// ----
// Warning 6335: (34-45): "layout" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// Warning 6335: (51-80): "at" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
contract at layout at uint40(bytes5(hex"0011223344")) { }
// ----
// Warning 6335: (0-57): "at" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6396: (22-53): The base slot of the storage layout must evaluate to a rational number.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
contract at layout at uint(42) { }
// ----
// Warning 6335: (0-34): "at" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6396: (22-30): The base slot of the storage layout must evaluate to a rational number.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
contract at layout at type(uint).max { }
Copy link
Collaborator

@cameel cameel Nov 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rename the contract here and in other similar tests to something other than at or layout. The name is not the point of the test and we already have it covered by contract_named_at.sol and contract_named_layout.sol.

// ----
// Warning 6335: (0-40): "at" will be promoted to reserved keyword in the next breaking version and will not be allowed as an identifier anymore.
// TypeError 6396: (22-36): The base slot of the storage layout must evaluate to a rational number.
Loading