From 7f1a2be0fee99531b5e9c0eca7dc1c70b9ffcaa0 Mon Sep 17 00:00:00 2001 From: hrkrshnn Date: Mon, 9 Aug 2021 12:40:14 +0200 Subject: [PATCH] Allow basefee as Yul identifier for EVMVersion < london This was done to prevent basefee from being a breaking change. This change will be removed in 0.9.0. TODO revert this commit in breaking. --- libyul/backends/evm/EVMDialect.cpp | 14 +++++++++++--- scripts/error_codes.py | 3 ++- .../types/magic_block_basefee_error.sol | 8 +------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libyul/backends/evm/EVMDialect.cpp b/libyul/backends/evm/EVMDialect.cpp index f4176c1b2418..86202e378828 100644 --- a/libyul/backends/evm/EVMDialect.cpp +++ b/libyul/backends/evm/EVMDialect.cpp @@ -112,14 +112,22 @@ pair createFunction( return {name, f}; } -set createReservedIdentifiers() +set createReservedIdentifiers(langutil::EVMVersion _evmVersion) { + // TODO remove this in 0.9.0. We allow creating functions or identifiers in Yul with the name + // basefee for VMs before london. + auto baseFeeException = [&](evmasm::Instruction _instr) -> bool + { + return _instr == evmasm::Instruction::BASEFEE && _evmVersion < langutil::EVMVersion::london(); + }; + set reserved; for (auto const& instr: evmasm::c_instructions) { string name = instr.first; transform(name.begin(), name.end(), name.begin(), [](unsigned char _c) { return tolower(_c); }); - reserved.emplace(name); + if (!baseFeeException(instr.second)) + reserved.emplace(name); } reserved += vector{ "linkersymbol"_yulstring, @@ -300,7 +308,7 @@ EVMDialect::EVMDialect(langutil::EVMVersion _evmVersion, bool _objectAccess): m_objectAccess(_objectAccess), m_evmVersion(_evmVersion), m_functions(createBuiltins(_evmVersion, _objectAccess)), - m_reserved(createReservedIdentifiers()) + m_reserved(createReservedIdentifiers(_evmVersion)) { } diff --git a/scripts/error_codes.py b/scripts/error_codes.py index 18179b4bc604..320074ff1876 100755 --- a/scripts/error_codes.py +++ b/scripts/error_codes.py @@ -198,7 +198,8 @@ def examine_id_coverage(top_dir, source_id_to_file_names, new_ids_only=False): # The warning may or may not exist in a compiler build. "4591", # "There are more than 256 warnings. Ignoring the rest." # Due to 3805, the warning lists look different for different compiler builds. - "1834" # Unimplemented feature error, as we do not test it anymore via cmdLineTests + "1834", # Unimplemented feature error, as we do not test it anymore via cmdLineTests + "5430" # basefee being used in inline assembly for EVMVersion < london } assert len(test_ids & white_ids) == 0, "The sets are not supposed to intersect" test_ids |= white_ids diff --git a/test/libsolidity/syntaxTests/types/magic_block_basefee_error.sol b/test/libsolidity/syntaxTests/types/magic_block_basefee_error.sol index 706fa3183a32..b723d0aeeb2b 100644 --- a/test/libsolidity/syntaxTests/types/magic_block_basefee_error.sol +++ b/test/libsolidity/syntaxTests/types/magic_block_basefee_error.sol @@ -2,14 +2,8 @@ contract C { function f() public view returns (uint) { return block.basefee; } - function g() public view returns (uint ret) { - assembly { - ret := basefee() - } - } } // ==== -// EVMVersion: =berlin +// EVMVersion: <=berlin // ---- // TypeError 5921: (74-87): "basefee" is not supported by the VM version. -// TypeError 5430: (183-190): The "basefee" instruction is only available for London-compatible VMs (you are currently compiling for "berlin").