From 4b67dea8e262c603bb8bad0e76a9d5b0bf3f4181 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 10 May 2023 17:53:58 +0200 Subject: [PATCH 001/138] Set version to 0.8.21. --- CMakeLists.txt | 2 +- Changelog.md | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4345fac9428a..c9a7a1876140 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ include(EthPolicy) eth_policy() # project name and version should be set after cmake_policy CMP0048 -set(PROJECT_VERSION "0.8.20") +set(PROJECT_VERSION "0.8.21") # OSX target needed in order to support std::visit set(CMAKE_OSX_DEPLOYMENT_TARGET "10.14") project(solidity VERSION ${PROJECT_VERSION} LANGUAGES C CXX) diff --git a/Changelog.md b/Changelog.md index 87239a84d402..164d998c29f7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,14 @@ +### 0.8.21 (unreleased) + +Language Features: + + +Compiler Features: + + +Bugfixes: + + ### 0.8.20 (2023-05-10) Compiler Features: From edc5512b757acfeb23ef4c22cc8cbf3b9228cb14 Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 10 May 2023 17:15:30 +0200 Subject: [PATCH 002/138] Add readthedocs configuration --- .readthedocs.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .readthedocs.yml diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 000000000000..c0c139b7e8f0 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,18 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.11" + +sphinx: + builder: html + configuration: docs/conf.py + +formats: + - pdf + - epub + +python: + install: + - requirements: docs/requirements.txt From c3a8b9cebb97e62753e351a441e10de5b48df289 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Thu, 11 May 2023 11:26:56 +0200 Subject: [PATCH 003/138] Minor post-release adjustments. --- ReleaseChecklist.md | 1 + scripts/deps-ppa/static_z3.sh | 2 +- scripts/release_ppa.sh | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ReleaseChecklist.md b/ReleaseChecklist.md index a7d6a4dc7826..179a20d4fbad 100644 --- a/ReleaseChecklist.md +++ b/ReleaseChecklist.md @@ -16,6 +16,7 @@ At least a day before the release: - [ ] Run ``make linkcheck`` from within ``docs/`` and fix any broken links it finds. Ignore false positives caused by ``href`` anchors and dummy links not meant to work. + - [ ] Double-check that [the most recent docs builds at readthedocs](https://readthedocs.org/projects/solidity/builds/) succeeded. - [ ] Make sure that all merged PRs that should have changelog entries do have them. - [ ] Rerun CI on the top commits of main branches in all repositories that do not have daily activity by creating a test branch or PR: - [ ] ``solc-js`` diff --git a/scripts/deps-ppa/static_z3.sh b/scripts/deps-ppa/static_z3.sh index ca1543783701..5ee6623a6922 100755 --- a/scripts/deps-ppa/static_z3.sh +++ b/scripts/deps-ppa/static_z3.sh @@ -41,7 +41,7 @@ sourcePPAConfig # Sanity check checkDputEntries "\[cpp-build-deps\]" -DISTRIBUTIONS="focal jammy kinetic" +DISTRIBUTIONS="focal jammy kinetic lunar" for distribution in $DISTRIBUTIONS do diff --git a/scripts/release_ppa.sh b/scripts/release_ppa.sh index aff2e7c2547b..bd98865d6ebc 100755 --- a/scripts/release_ppa.sh +++ b/scripts/release_ppa.sh @@ -68,7 +68,7 @@ packagename=solc # This needs to be a still active release static_build_distribution=focal -DISTRIBUTIONS="focal jammy kinetic" +DISTRIBUTIONS="focal jammy kinetic lunar" if is_release then From 33bb833949c9e05d7ef1e2fdb91f1e77b3b36a95 Mon Sep 17 00:00:00 2001 From: Alexander Arlt Date: Thu, 11 May 2023 09:14:16 -0500 Subject: [PATCH 004/138] Add *.orig to .gitignore. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 773f09be6e5e..8ca5f86e7e43 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ __pycache__ *.a *.lib +# ignore git mergetool backup files +*.orig + # Executables *.exe *.out From 678461e828842bcadd9e6cbca76409faba84b20f Mon Sep 17 00:00:00 2001 From: Leo Alt Date: Thu, 11 May 2023 16:43:12 +0200 Subject: [PATCH 005/138] Fix encoding of side-effects inside if and conditional statements in the BMC engine --- Changelog.md | 1 + libsolidity/formal/BMC.cpp | 4 +++ .../control_flow/side_effects_inside_if_1.sol | 15 +++++++++ .../control_flow/side_effects_inside_if_2.sol | 26 ++++++++++++++++ .../control_flow/side_effects_inside_if_3.sol | 30 ++++++++++++++++++ .../control_flow/side_effects_inside_if_4.sol | 15 +++++++++ .../side_effects_inside_ternary_1.sol | 16 ++++++++++ .../side_effects_inside_ternary_2.sol | 27 ++++++++++++++++ .../side_effects_inside_ternary_3.sol | 31 +++++++++++++++++++ .../side_effects_inside_ternary_4.sol | 16 ++++++++++ 10 files changed, 181 insertions(+) create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_1.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_2.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_3.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_4.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_1.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_2.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_3.sol create mode 100644 test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_4.sol diff --git a/Changelog.md b/Changelog.md index 164d998c29f7..36bf4dcfa786 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ Compiler Features: Bugfixes: + * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. ### 0.8.20 (2023-05-10) diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index e0a5f312b4be..b72e8451a3b3 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -237,6 +237,7 @@ void BMC::endVisit(FunctionDefinition const& _function) bool BMC::visit(IfStatement const& _node) { + auto indicesBeforePush = copyVariableIndices(); // This check needs to be done in its own context otherwise // constraints from the If body might influence it. m_context.pushSolver(); @@ -251,6 +252,7 @@ bool BMC::visit(IfStatement const& _node) &_node.condition() ); m_context.popSolver(); + resetVariableIndices(std::move(indicesBeforePush)); _node.condition().accept(*this); auto conditionExpr = expr(_node.condition()); @@ -274,6 +276,7 @@ bool BMC::visit(IfStatement const& _node) bool BMC::visit(Conditional const& _op) { + auto indicesBeforePush = copyVariableIndices(); m_context.pushSolver(); _op.condition().accept(*this); @@ -284,6 +287,7 @@ bool BMC::visit(Conditional const& _op) &_op.condition() ); m_context.popSolver(); + resetVariableIndices(std::move(indicesBeforePush)); SMTEncoder::visit(_op); diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_1.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_1.sol new file mode 100644 index 000000000000..9bea0383ad1d --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_1.sol @@ -0,0 +1,15 @@ +contract C { + function f() public pure { + uint x; + if (++x < 3) {} + + assert(x == 1); // should hold + assert(x != 1); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 6838: (72-79): BMC: Condition is always true. +// Warning 4661: (132-146): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_2.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_2.sol new file mode 100644 index 000000000000..1780a7e20b16 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_2.sol @@ -0,0 +1,26 @@ +contract C { + uint x; + + function inc() internal returns (uint) { + // BMC inlines function calls and also looks at functions in isolation, + // therefore it says once that this is safe, when called by `f`, + // but also that it is unsafe just looking at this function (false positive). + ++x; + return x; + } + + function f() public { + require(x < 1000); + uint y = x; + if (inc() < 3) {} + + assert(x == y + 1); // should hold + assert(x != y + 1); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 2661: (318-321): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Warning 4661: (499-517): BMC: Assertion violation happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_3.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_3.sol new file mode 100644 index 000000000000..2e415a7b08cb --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_3.sol @@ -0,0 +1,30 @@ +contract C { + uint x; + + function inc() internal returns (uint) { + // BMC inlines function calls and also looks at functions in isolation, + // therefore it says once that this is safe, when called by `f`, + // but also that it is unsafe just looking at this function (false positive). + ++x; + return x; + } + + function inc2() internal returns (uint) { + return inc(); + } + + function f() public { + require(x < 1000); + uint y = x; + if (inc2() < 3) {} + + assert(x == y + 1); // should hold + assert(x != y + 1); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 2661: (318-321): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Warning 4661: (575-593): BMC: Assertion violation happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_4.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_4.sol new file mode 100644 index 000000000000..6e624184e11e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_if_4.sol @@ -0,0 +1,15 @@ +contract C { + function f() public pure { + uint x = 2; + if (--x < 3) {} + + assert(x == 1); // should hold + assert(x != 1); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 6838: (76-83): BMC: Condition is always true. +// Warning 4661: (136-150): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_1.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_1.sol new file mode 100644 index 000000000000..9801b99b5667 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_1.sol @@ -0,0 +1,16 @@ +contract C { + function f() public pure { + uint x; + uint y = (++x < 3) ? ++x : --x; + + assert(y == x); // should hold; + assert(x == 2); // should hold + assert(x != 2); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 6838: (77-86): BMC: Condition is always true. +// Warning 4661: (188-202): BMC: Assertion violation happens here. +// Info 6002: BMC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_2.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_2.sol new file mode 100644 index 000000000000..54d72960b942 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_2.sol @@ -0,0 +1,27 @@ +contract C { + uint x; + + function inc() internal returns (uint) { + // BMC inlines function calls and also looks at functions in isolation, + // therefore it says once that this is safe, when called by `f`, + // but also that it is unsafe just looking at this function (false positive). + ++x; + return x; + } + + function f() public { + require(x < 1000); + uint z = x; + uint y = (inc() < 3) ? inc() : inc(); + + assert(y == x); + assert(x == z + 2); // should hold + assert(x != z + 2); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 2661: (318-321): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Warning 4661: (543-561): BMC: Assertion violation happens here. +// Info 6002: BMC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_3.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_3.sol new file mode 100644 index 000000000000..18e36c8fd22f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_3.sol @@ -0,0 +1,31 @@ +contract C { + uint x; + + function inc() internal returns (uint) { + // BMC inlines function calls and also looks at functions in isolation, + // therefore it says once that this is safe, when called by `f`, + // but also that it is unsafe just looking at this function (false positive). + ++x; + return x; + } + + function inc2() internal returns (uint) { + return inc(); + } + + function f() public { + require(x < 1000); + uint z = x; + uint y = (inc2() < 3) ? inc2() : inc2(); + + assert(y == x); // should hold + assert(x == z + 2); // should hold + assert(x != z + 2); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 2661: (318-321): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Warning 4661: (636-654): BMC: Assertion violation happens here. +// Info 6002: BMC: 5 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_4.sol b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_4.sol new file mode 100644 index 000000000000..e24cdf297d63 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/control_flow/side_effects_inside_ternary_4.sol @@ -0,0 +1,16 @@ +contract C { + function f() public pure { + uint x = 2; + uint y = (--x < 3) ? --x : 0; + + assert(y == x); // should hold + assert(x == 0); // should hold + assert(x != 0); // should fail + } +} +// ==== +// SMTEngine: bmc +// ---- +// Warning 6838: (81-90): BMC: Condition is always true. +// Warning 4661: (189-203): BMC: Assertion violation happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. From c5673278a772b8fb0e087d69edf700f5316f4562 Mon Sep 17 00:00:00 2001 From: Alexander Arlt Date: Wed, 22 Feb 2023 10:32:29 -0500 Subject: [PATCH 006/138] Remove EWASM backend. --- Changelog.md | 1 + cmake/templates/ewasm_polyfill.in | 13 - docs/contributing.rst | 11 +- docs/using-the-compiler.rst | 13 +- docs/yul.rst | 3 +- libsolidity/interface/CompilerStack.cpp | 57 +- libsolidity/interface/CompilerStack.h | 16 - libsolidity/interface/StandardCompiler.cpp | 31 +- libyul/CMakeLists.txt | 30 - libyul/YulStack.cpp | 38 +- libyul/YulStack.h | 13 +- libyul/backends/wasm/BinaryTransform.cpp | 722 ------------------ libyul/backends/wasm/BinaryTransform.h | 124 --- libyul/backends/wasm/EVMToEwasmTranslator.cpp | 159 ---- libyul/backends/wasm/EVMToEwasmTranslator.h | 55 -- libyul/backends/wasm/TextTransform.cpp | 246 ------ libyul/backends/wasm/TextTransform.h | 71 -- libyul/backends/wasm/WasmAST.h | 117 --- libyul/backends/wasm/WasmCodeTransform.cpp | 449 ----------- libyul/backends/wasm/WasmCodeTransform.h | 115 --- libyul/backends/wasm/WasmDialect.cpp | 284 ------- libyul/backends/wasm/WasmDialect.h | 71 -- libyul/backends/wasm/WasmObjectCompiler.cpp | 60 -- libyul/backends/wasm/WasmObjectCompiler.h | 53 -- libyul/backends/wasm/WordSizeTransform.cpp | 433 ----------- libyul/backends/wasm/WordSizeTransform.h | 108 --- libyul/backends/wasm/polyfill/Arithmetic.yul | 396 ---------- libyul/backends/wasm/polyfill/Bitwise.yul | 222 ------ libyul/backends/wasm/polyfill/Comparison.yul | 168 ---- libyul/backends/wasm/polyfill/Conversion.yul | 79 -- libyul/backends/wasm/polyfill/Interface.yul | 413 ---------- libyul/backends/wasm/polyfill/Keccak.yul | 24 - libyul/backends/wasm/polyfill/Logical.yul | 31 - libyul/backends/wasm/polyfill/Memory.yul | 109 --- libyul/optimiser/Suite.cpp | 8 - solc/CommandLineInterface.cpp | 50 +- solc/CommandLineInterface.h | 1 - solc/CommandLineParser.cpp | 41 +- solc/CommandLineParser.h | 4 - test/CMakeLists.txt | 2 - test/Common.cpp | 24 +- test/Common.h | 8 - test/EVMHost.cpp | 16 +- test/EVMHost.h | 9 +- test/ExecutionFramework.cpp | 5 - test/ExecutionFramework.h | 1 - test/InteractiveTests.h | 2 - test/TestCase.h | 1 - test/cmdlineTests.sh | 2 - test/cmdlineTests/evm_to_wasm/args | 1 - test/cmdlineTests/evm_to_wasm/input.yul | 3 - test/cmdlineTests/evm_to_wasm/output | 96 --- test/cmdlineTests/evm_to_wasm_break/args | 1 - test/cmdlineTests/evm_to_wasm_break/input.yul | 8 - test/cmdlineTests/evm_to_wasm_break/output | 583 -------------- .../args | 1 - .../input.yul | 4 - .../output | 2 - .../args | 1 - .../input.yul | 4 - .../output | 34 - .../args | 1 - .../input.yul | 4 - .../output | 54 -- .../evm_to_wasm_unsupported_translation/args | 1 - .../evm_to_wasm_unsupported_translation/err | 1 - .../evm_to_wasm_unsupported_translation/exit | 1 - .../input.yul | 3 - .../output | 1 - .../linker_mode_output_selection_invalid/args | 2 +- .../linker_mode_output_selection_invalid/err | 2 +- .../output_selection_ewasm_ir_only/args | 1 - .../output_selection_ewasm_ir_only/err | 1 - .../output_selection_ewasm_ir_only/exit | 1 - .../output_selection_ewasm_ir_only/input.sol | 4 - .../args | 2 +- .../standard_cli_output_selection_invalid/err | 2 +- .../standard_ewasm_requested/input.json | 22 - .../standard_ewasm_requested/output.json | 176 ----- .../input.json | 22 - .../output.json | 23 - .../strict_asm_options_in_non_asm_mode/args | 2 +- .../args | 1 - .../input.yul | 4 - .../output | 2 - .../args | 1 - .../input.yul | 4 - .../output | 2 - .../strict_asm_output_selection_invalid/args | 2 +- .../args | 1 - .../input.yul | 17 - .../output | 73 -- .../args | 1 - .../input.yul | 8 - .../output | 27 - .../yul_to_wasm_source_location_crash/args | 1 - .../input.yul | 4 - .../yul_to_wasm_source_location_crash/output | 34 - .../libsolidity/ASTJSON/abstract_contract.sol | 1 - test/libsolidity/ASTJSON/address_payable.sol | 1 - test/libsolidity/ASTJSON/assembly/call.sol | 1 - .../ASTJSON/assembly/empty_block.sol | 1 - .../libsolidity/ASTJSON/assembly/function.sol | 1 - test/libsolidity/ASTJSON/assembly/leave.sol | 1 - test/libsolidity/ASTJSON/assembly/loop.sol | 1 - .../ASTJSON/assembly/nested_functions.sol | 1 - .../ASTJSON/assembly/slot_offset.sol | 1 - .../ASTJSON/assembly/stringlit.sol | 1 - test/libsolidity/ASTJSON/assembly/switch.sol | 1 - .../ASTJSON/assembly/switch_default.sol | 1 - .../ASTJSON/assembly/var_access.sol | 1 - test/libsolidity/ASTJSON/constructor.sol | 1 - test/libsolidity/ASTJSON/documentation.sol | 1 - .../ASTJSON/documentation_local_variable.sol | 1 - .../ASTJSON/documentation_on_statements.sol | 1 - .../ASTJSON/documentation_triple.sol | 1 - ...event_with_variables_of_internal_types.sol | 1 - .../ASTJSON/fail_after_parsing.sol | 1 - test/libsolidity/ASTJSON/fallback.sol | 1 - .../ASTJSON/fallback_and_receive_ether.sol | 1 - test/libsolidity/ASTJSON/fallback_payable.sol | 1 - test/libsolidity/ASTJSON/mappings.sol | 1 - test/libsolidity/ASTJSON/mutability.sol | 1 - .../ASTJSON/not_existing_import.sol | 1 - test/libsolidity/ASTJSON/override.sol | 1 - test/libsolidity/ASTJSON/receive_ether.sol | 1 - .../ASTJSON/two_base_functions.sol | 1 - test/libsolidity/ASTJSON/used_errors.sol | 1 - .../ASTJSON/userDefinedValueType.sol | 1 - .../ASTJSON/user_defined_operator.sol | 1 - test/libsolidity/ASTJSON/yul_hex_literal.sol | 1 - test/libsolidity/SemanticTest.cpp | 95 +-- test/libsolidity/SemanticTest.h | 7 +- test/libsolidity/SolidityEndToEndTest.cpp | 81 -- .../SolidityExecutionFramework.cpp | 68 +- test/libsolidity/SolidityExecutionFramework.h | 1 - .../errorRecoveryTests/contract_recovery.sol | 1 - .../errorRecoveryTests/error_to_eos.sol | 1 - test/libsolidity/lsp/rename/function.sol | 1 - .../lsp/rename/import_directive.sol | 1 - test/libsolidity/lsp/rename/variable.sol | 1 - test/libsolidity/lsp/semanticTokens/enums.sol | 1 - .../lsp/semanticTokens/functions.sol | 1 - .../abiEncoderV1/abi_decode_dynamic_array.sol | 1 - .../abiEncoderV1/abi_decode_static_array.sol | 1 - .../abi_decode_static_array_v2.sol | 1 - .../abiEncoderV1/abi_decode_trivial.sol | 1 - .../abiEncoderV1/abi_decode_v2.sol | 1 - .../abiEncoderV1/abi_decode_v2_calldata.sol | 1 - .../abiEncoderV1/abi_decode_v2_storage.sol | 1 - .../semanticTests/abiEncoderV1/abi_encode.sol | 3 - .../abiEncoderV1/abi_encode_call.sol | 1 - .../abiEncoderV1/abi_encode_decode_simple.sol | 3 - .../abiEncoderV1/abi_encode_empty_string.sol | 1 - .../abiEncoderV1/abi_encode_rational.sol | 3 - .../calldata_arrays_too_large.sol | 2 - .../abiEncoderV1/decode_slice.sol | 3 - .../abiEncoderV1/dynamic_memory_copy.sol | 1 - ...emory_dynamic_array_and_calldata_bytes.sol | 1 - .../abi_encode_empty_string_v2.sol | 3 - .../abiEncoderV2/abi_encode_rational_v2.sol | 3 - .../abiEncoderV2/abi_encode_v2.sol | 1 - .../abiEncoderV2/bool_out_of_bounds.sol | 2 - ...data_array_dynamic_static_short_decode.sol | 2 - .../calldata_dynamic_array_to_memory.sol | 1 - .../calldata_overlapped_dynamic_arrays.sol | 1 - ...ldata_overlapped_nested_dynamic_arrays.sol | 1 - .../calldata_struct_array_reencode.sol | 1 - ...dimensional_dynamic_array_index_access.sol | 1 - .../abiEncoderV2/calldata_with_garbage.sol | 1 - .../abiEncoderV2/cleanup/cleanup.sol | 2 - .../semanticTests/abiEncoderV2/enums.sol | 2 - ...emory_dynamic_array_and_calldata_bytes.sol | 1 - ...ynamic_array_and_calldata_static_array.sol | 1 - .../abiEncoderV2/struct/struct_short.sol | 2 - .../abiEncoderV2/struct/struct_simple.sol | 2 - .../abiEncoderV2/struct/struct_validation.sol | 2 - ...validation_function_type_inside_struct.sol | 2 - .../abiencodedecode/abi_decode_calldata.sol | 1 - .../abiencodedecode/abi_decode_simple.sol | 1 - .../abi_decode_simple_storage.sol | 1 - .../abiencodedecode/abi_encode_call.sol | 1 - .../abi_encode_call_declaration.sol | 1 - .../abi_encode_call_memory.sol | 1 - .../abi_encode_with_selector.sol | 2 - .../abi_encode_with_selectorv2.sol | 2 - .../offset_overflow_in_array_decoding.sol | 2 - .../offset_overflow_in_array_decoding_2.sol | 2 - .../offset_overflow_in_array_decoding_3.sol | 2 - .../accessor_for_const_state_variable.sol | 2 - .../accessor/accessor_for_state_variable.sol | 3 - .../arithmetics/addmod_mulmod.sol | 3 - .../arithmetics/addmod_mulmod_zero.sol | 3 - .../arithmetics/block_inside_unchecked.sol | 2 - .../checked_called_by_unchecked.sol | 2 - .../checked_modifier_called_by_unchecked.sol | 2 - .../arithmetics/divisiod_by_zero.sol | 2 - .../arithmetics/exp_associativity.sol | 1 - .../semanticTests/arithmetics/signed_mod.sol | 3 - .../unchecked_called_by_checked.sol | 2 - .../arithmetics/unchecked_div_by_zero.sol | 2 - .../semanticTests/array/calldata_array.sol | 2 - ...ta_array_as_argument_internal_function.sol | 2 - .../array/calldata_array_dynamic_invalid.sol | 2 - .../array/calldata_array_of_struct.sol | 3 - .../array/calldata_slice_access.sol | 2 - .../bytes_concat_empty_argument_list.sol | 2 - .../concat/bytes_concat_empty_strings.sol | 2 - .../array/constant_var_as_array_length.sol | 1 - .../copying/array_copy_different_packing.sol | 1 - .../array/copying/array_copy_nested_array.sol | 1 - .../copying/array_copy_storage_abi_signed.sol | 1 - ..._storage_storage_different_base_nested.sol | 2 - ...y_copy_storage_storage_dynamic_dynamic.sol | 1 - ...ay_copy_storage_storage_static_dynamic.sol | 1 - ...ray_copy_storage_storage_static_simple.sol | 2 - ...ray_copy_storage_storage_static_static.sol | 3 - .../copying/array_copy_target_leftover.sol | 2 - .../copying/array_copy_target_leftover2.sol | 2 - .../copying/array_copy_target_simple.sol | 3 - .../copying/array_copy_target_simple_2.sol | 3 - .../copying/array_elements_to_mapping.sol | 1 - .../array_nested_storage_to_memory.sol | 1 - .../array_storage_multi_items_per_slot.sol | 2 - .../array/copying/array_to_mapping.sol | 1 - .../array/copying/bytes_memory_to_storage.sol | 2 - .../array/copying/bytes_storage_to_memory.sol | 2 - .../calldata_array_of_struct_to_memory.sol | 1 - .../calldata_array_static_to_memory.sol | 2 - .../copying/calldata_array_to_mapping.sol | 1 - .../copying/calldata_bytes_to_storage.sol | 2 - .../calldata_dynamic_array_to_memory.sol | 1 - .../copy_function_internal_storage_array.sol | 1 - ...opy_internal_function_array_to_storage.sol | 3 - .../copying/copying_bytes_multiassign.sol | 2 - .../dirty_memory_bytes_to_storage_copy_ir.sol | 1 - ...d_array_of_structs_calldata_to_storage.sol | 2 - ...ted_array_of_structs_memory_to_storage.sol | 2 - ...ested_array_element_calldata_to_memory.sol | 1 - ...sted_array_element_calldata_to_storage.sol | 1 - .../nested_array_element_memory_to_memory.sol | 1 - ...nested_array_element_memory_to_storage.sol | 1 - ...nested_array_element_storage_to_memory.sol | 1 - ...ested_array_element_storage_to_storage.sol | 1 - ...ed_array_of_structs_calldata_to_memory.sol | 1 - ...d_array_of_structs_calldata_to_storage.sol | 2 - ...sted_array_of_structs_memory_to_memory.sol | 1 - ...ted_array_of_structs_memory_to_storage.sol | 2 - ...ed_array_of_structs_storage_to_storage.sol | 1 - ...th_nested_array_from_storage_to_memory.sol | 1 - ...amic_array_element_calldata_to_storage.sol | 1 - .../array/copying/storage_memory_packed.sol | 2 - .../create_dynamic_array_with_zero_length.sol | 2 - .../array/create_memory_array_too_large.sol | 2 - .../array/create_multiple_dynamic_arrays.sol | 2 - .../array/delete/delete_bytes_array.sol | 1 - .../array/delete/delete_memory_array.sol | 1 - .../delete/delete_on_array_of_structs.sol | 1 - .../array/delete/delete_storage_array.sol | 1 - .../array/dynamic_arrays_in_storage.sol | 1 - .../dynamic_out_of_bounds_array_access.sol | 1 - .../array/external_array_args.sol | 2 - .../array/fixed_array_cleanup.sol | 2 - .../array/fixed_arrays_as_return_type.sol | 1 - .../array/fixed_arrays_in_storage.sol | 2 - .../array/fixed_bytes_length_access.sol | 2 - .../fixed_out_of_bounds_array_access.sol | 3 - .../array/function_array_cross_calls.sol | 1 - .../array/function_memory_array.sol | 2 - .../array/indexAccess/index_access.sol | 2 - .../inline_array_index_access_ints.sol | 3 - .../inline_array_index_access_strings.sol | 3 - .../memory_arrays_index_access_write.sol | 2 - .../array/inline_array_return.sol | 3 - .../array/inline_array_singleton.sol | 2 - ...rray_storage_to_memory_conversion_ints.sol | 3 - ...y_storage_to_memory_conversion_strings.sol | 3 - .../inline_array_strings_from_document.sol | 3 - .../semanticTests/array/memory.sol | 1 - .../array/pop/array_pop_empty_exception.sol | 2 - .../array/pop/array_pop_isolated.sol | 2 - .../array/pop/byte_array_pop.sol | 2 - .../array/pop/byte_array_pop_copy_long.sol | 1 - .../pop/byte_array_pop_empty_exception.sol | 2 - .../array/pop/byte_array_pop_isolated.sol | 2 - .../array/pop/byte_array_pop_masking_long.sol | 1 - .../pop/byte_array_pop_storage_empty.sol | 2 - .../array/push/array_push_packed_array.sol | 1 - .../array/push/byte_array_push.sol | 2 - .../array/short_fixed_array_cleanup.sol | 2 - .../slices/array_calldata_assignment.sol | 2 - .../semanticTests/array/storage_array_ref.sol | 1 - .../array/string_allocation_bug.sol | 2 - .../semanticTests/array/strings_in_struct.sol | 2 - .../asmForLoop/for_loop_break.sol | 2 - .../asmForLoop/for_loop_continue.sol | 2 - .../asmForLoop/for_loop_nested.sol | 2 - ...signment_to_const_var_involving_keccak.sol | 2 - .../builtinFunctions/blockhash.sol | 2 - .../blockhash_shadow_resolution.sol | 2 - .../builtinFunctions/function_types_sig.sol | 2 - .../builtinFunctions/keccak256_empty.sol | 3 - .../builtinFunctions/keccak256_with_bytes.sol | 1 - .../builtinFunctions/msg_sig.sol | 2 - .../msg_sig_after_internal_call_is_same.sol | 2 - .../builtinFunctions/ripemd160_empty.sol | 1 - .../semanticTests/c99_scoping_activation.sol | 2 - .../calldata_array_index_range_access.sol | 2 - .../calldata_array_three_dimensional.sol | 2 - .../calldata/calldata_attached_to_bytes.sol | 1 - ...ata_attached_to_dynamic_array_or_slice.sol | 1 - .../calldata_attached_to_static_array.sol | 1 - .../calldata/calldata_struct_cleaning.sol | 2 - .../copy_from_calldata_removes_bytes_data.sol | 1 - .../cleanup/bool_conversion_v2.sol | 2 - .../cleanup_address_types_shortening.sol | 3 - .../cleanup/cleanup_address_types_v2.sol | 2 - ...anup_bytes_types_shortening_newCodeGen.sol | 1 - .../cleanup/cleanup_bytes_types_v2.sol | 2 - .../cleanup/cleanup_in_compound_assign.sol | 2 - .../semanticTests/cleanup/exp_cleanup.sol | 3 - .../cleanup/exp_cleanup_direct.sol | 3 - .../cleanup/exp_cleanup_nonzero_base.sol | 3 - .../cleanup/exp_cleanup_smaller_base.sol | 2 - .../negative_fractional_mod.sol | 2 - .../constantEvaluator/rounding.sol | 2 - .../asm_address_constant_regression.sol | 3 - .../constants/asm_constant_file_level.sol | 2 - .../constants/constant_string.sol | 3 - .../constant_string_at_file_level.sol | 3 - .../constants/constant_variables.sol | 3 - .../constants_at_file_level_referencing.sol | 3 - .../constants/consteval_array_length.sol | 1 - .../constants/function_unreferenced.sol | 2 - .../same_constants_different_files.sol | 3 - .../simple_constant_variables_test.sol | 3 - .../base_constructor_arguments.sol | 1 - .../constructor_arguments_internal.sol | 1 - .../constructor_static_array_argument.sol | 1 - ...vm_exceptions_in_constructor_call_fail.sol | 1 - ...unction_usage_in_constructor_arguments.sol | 1 - .../functions_called_by_constructor.sol | 3 - ...called_by_constructor_through_dispatch.sol | 3 - ...r_init_inheritence_without_constructor.sol | 2 - .../constructor/payable_constructor.sol | 3 - .../store_function_in_constructor.sol | 3 - .../store_function_in_constructor_packed.sol | 3 - ...nternal_unused_function_in_constructor.sol | 3 - ...unused_library_function_in_constructor.sol | 1 - .../constructor_inheritance_init_order.sol | 1 - .../constructor_inheritance_init_order_2.sol | 2 - .../subassembly_deduplication.sol | 1 - .../semanticTests/dirty_calldata_bytes.sol | 2 - .../semanticTests/empty_contract.sol | 1 - .../semanticTests/empty_for_loop.sol | 2 - .../enums/constructing_enums_from_ints.sol | 3 - .../enums/enum_explicit_overflow.sol | 2 - .../enum_explicit_overflow_homestead.sol | 1 - .../semanticTests/enums/enum_referencing.sol | 2 - .../semanticTests/enums/minmax.sol | 1 - ...ract_enums_with_explicit_contract_name.sol | 3 - .../semanticTests/enums/using_enums.sol | 3 - .../enums/using_inherited_enum.sol | 2 - .../using_inherited_enum_excplicitly.sol | 2 - .../semanticTests/errors/named_error_args.sol | 2 - .../named_parameters_shadowing_types.sol | 2 - .../semanticTests/errors/panic_via_import.sol | 2 - .../semanticTests/errors/simple.sol | 2 - .../semanticTests/errors/using_structs.sol | 2 - .../errors/via_contract_type.sol | 2 - .../semanticTests/errors/via_import.sol | 2 - .../semanticTests/errors/weird_name.sol | 2 - .../exponentiation/literal_base.sol | 2 - .../exponentiation/signed_base.sol | 2 - .../exponentiation/small_exp.sol | 2 - .../expressions/bit_operators.sol | 2 - .../expressions/bytes_comparison.sol | 2 - ...conditional_expression_different_types.sol | 2 - .../conditional_expression_false_literal.sol | 2 - .../conditional_expression_functions.sol | 2 - .../conditional_expression_multiple.sol | 2 - ...onditional_expression_storage_memory_1.sol | 2 - .../conditional_expression_true_literal.sol | 2 - .../conditional_expression_tuples.sol | 2 - ...ditional_expression_with_return_values.sol | 2 - .../expressions/exp_operator_const.sol | 2 - .../expressions/exp_operator_const_signed.sol | 2 - .../expressions/exp_zero_literal.sol | 2 - .../expressions/inc_dec_operators.sol | 2 - .../uncalled_address_transfer_send.sol | 2 - .../fallback/call_forward_bytes.sol | 1 - .../semanticTests/fallback/falback_return.sol | 2 - .../fallback/fallback_or_receive.sol | 2 - .../semanticTests/fallback/inherited.sol | 2 - .../fallback/short_data_calls_fallback.sol | 2 - .../semanticTests/freeFunctions/easy.sol | 2 - .../free_namesake_contract_function.sol | 2 - .../semanticTests/freeFunctions/import.sol | 2 - .../semanticTests/freeFunctions/overloads.sol | 2 - .../semanticTests/freeFunctions/recursion.sol | 2 - .../array_multiple_local_vars.sol | 2 - ..._attached_library_function_on_function.sol | 2 - ...d_library_function_on_storage_variable.sol | 2 - ...ll_attached_library_function_on_string.sol | 2 - .../call_function_returning_function.sol | 3 - ...function_returning_nothing_via_pointer.sol | 3 - .../call_internal_function_via_expression.sol | 2 - .../calling_nonexisting_contract_throws.sol | 3 - .../functionCall/calling_other_functions.sol | 2 - .../calling_uninitialized_function.sol | 2 - ...lling_uninitialized_function_in_detail.sol | 3 - ...g_uninitialized_function_through_array.sol | 2 - .../conditional_with_arguments.sol | 2 - .../functionCall/disordered_named_args.sol | 2 - .../functionCall/external_call.sol | 1 - .../external_call_at_construction_time.sol | 1 - .../external_call_dynamic_returndata.sol | 1 - .../external_call_to_nonexisting.sol | 1 - ...ernal_call_to_nonexisting_debugstrings.sol | 1 - .../functionCall/external_call_value.sol | 1 - .../functionCall/external_function.sol | 3 - .../functionCall/external_public_override.sol | 3 - .../file_level_call_via_module.sol | 2 - .../functionCall/gas_and_value_basic.sol | 1 - .../gas_and_value_brace_syntax.sol | 1 - .../inheritance/base_base_overload.sol | 2 - .../inheritance/base_overload.sol | 2 - .../functionCall/inheritance/call_base.sol | 2 - .../inheritance/call_base_base.sol | 2 - .../inheritance/call_base_base_explicit.sol | 2 - .../inheritance/call_base_explicit.sol | 2 - .../inheritance/call_unimplemented_base.sol | 2 - ...kip_unimplemented_in_abstract_contract.sol | 2 - .../super_skip_unimplemented_in_interface.sol | 2 - .../functionCall/member_accessors.sol | 1 - .../functionCall/multiple_functions.sol | 1 - .../functionCall/multiple_return_values.sol | 2 - .../semanticTests/functionCall/named_args.sol | 2 - .../functionCall/named_args_overload.sol | 2 - .../functionCall/send_zero_ether.sol | 3 - .../functionCall/transaction_status.sol | 2 - .../semanticTests/functionCall/value_test.sol | 2 - .../function_selector_via_contract_name.sol | 2 - .../functionTypes/address_member.sol | 2 - .../functionTypes/function_delete_stack.sol | 3 - .../functionTypes/function_delete_storage.sol | 3 - .../function_type_library_internal.sol | 1 - .../functionTypes/mapping_of_functions.sol | 1 - .../pass_function_types_externally.sol | 1 - .../pass_function_types_internally.sol | 2 - ...e_function_in_construction_and_runtime.sol | 2 - ...onstruction_and_runtime_equality_check.sol | 3 - .../functionTypes/selector_1.sol | 1 - .../functionTypes/selector_2.sol | 1 - .../functionTypes/store_function.sol | 1 - .../struct_with_external_function.sol | 1 - .../functionTypes/struct_with_functions.sol | 3 - ...ialized_internal_storage_function_call.sol | 3 - .../semanticTests/getters/bytes.sol | 2 - .../getters/string_and_bytes.sol | 2 - .../semanticTests/getters/value_types.sol | 2 - .../inheritance/access_base_storage.sol | 3 - .../address_overload_resolution.sol | 1 - ...base_access_to_function_type_variables.sol | 3 - .../derived_overload_base_function_direct.sol | 3 - ...erived_overload_base_function_indirect.sol | 3 - .../inheritance/explicit_base_class.sol | 2 - .../inherited_constant_state_var.sol | 3 - .../inheritance/inherited_function.sol | 2 - ...d_function_calldata_calldata_interface.sol | 1 - ...ted_function_calldata_memory_interface.sol | 1 - .../inherited_function_from_a_library.sol | 1 - .../inherited_function_through_dispatch.sol | 2 - .../inheritance/member_notation_ctor.sol | 1 - ...rloaded_function_call_resolve_to_first.sol | 3 - ...loaded_function_call_resolve_to_second.sol | 3 - .../overloaded_function_call_with_if_else.sol | 3 - .../inheritance/super_in_constructor.sol | 2 - .../super_in_constructor_assignment.sol | 2 - .../inheritance/super_overload.sol | 3 - .../inheritance/value_for_constructor.sol | 1 - .../inlineAssembly/calldata_array_read.sol | 2 - .../inlineAssembly/calldata_length_read.sol | 2 - .../inlineAssembly/calldata_offset_read.sol | 2 - .../calldata_offset_read_write.sol | 3 - .../inlineAssembly/constant_access.sol | 2 - .../constant_access_referencing.sol | 2 - .../inlineAssembly/difficulty.sol | 1 - ...inline_assembly_embedded_function_call.sol | 3 - .../inlineAssembly/inline_assembly_for.sol | 3 - .../inlineAssembly/inline_assembly_for2.sol | 3 - .../inline_assembly_function_call.sol | 3 - .../inline_assembly_function_call2.sol | 3 - ...line_assembly_function_call_assignment.sol | 3 - .../inlineAssembly/inline_assembly_if.sol | 3 - .../inline_assembly_in_modifiers.sol | 3 - .../inline_assembly_memory_access.sol | 3 - .../inline_assembly_read_and_write_stack.sol | 3 - .../inline_assembly_recursion.sol | 3 - .../inline_assembly_storage_access.sol | 2 - ...ssembly_storage_access_inside_function.sol | 2 - ...line_assembly_storage_access_local_var.sol | 2 - ...ne_assembly_storage_access_via_pointer.sol | 3 - .../inlineAssembly/inline_assembly_switch.sol | 3 - .../inline_assembly_write_to_stack.sol | 3 - .../inlineAssembly/inlineasm_empty_let.sol | 3 - .../inlineAssembly/keccak256_assembly.sol | 1 - .../semanticTests/inlineAssembly/leave.sol | 2 - .../inlineAssembly/prevrandao.sol | 1 - .../shadowing_local_function_opcode.sol | 2 - .../slot_access_via_mapping_pointer.sol | 1 - .../inlineAssembly/truefalse.sol | 2 - .../semanticTests/integer/basic.sol | 2 - .../libsolidity/semanticTests/integer/int.sol | 2 - .../integer/many_local_variables.sol | 2 - .../integer/small_signed_types.sol | 2 - .../semanticTests/integer/uint.sol | 2 - .../semanticTests/interfaceID/homer.sol | 3 - .../interfaceID/homer_interfaceId.sol | 3 - .../interfaceID/interfaceId_events.sol | 3 - .../semanticTests/interfaceID/interfaces.sol | 3 - .../semanticTests/interfaceID/lisa.sol | 1 - .../interfaceID/lisa_interfaceId.sol | 1 - .../interface_inheritance_conversions.sol | 1 - .../semanticTests/isoltestFormatting.sol | 2 - ...nternal_call_attached_with_parentheses.sol | 1 - ...ernal_call_unattached_with_parentheses.sol | 1 - .../libraries/internal_library_function.sol | 1 - ..._library_function_attached_to_contract.sol | 1 - ...ion_attached_to_external_function_type.sol | 1 - ...library_function_attached_to_interface.sol | 1 - ...ion_attached_to_internal_function_type.sol | 1 - ..._internal_function_type_named_selector.sol | 1 - ...al_library_function_attached_to_struct.sol | 1 - ...ernal_library_function_calling_private.sol | 1 - ...ernal_library_function_return_var_size.sol | 1 - .../libraries/internal_types_in_library.sol | 2 - .../libraries/library_call_in_homestead.sol | 1 - .../library_enum_as_an_expression.sol | 1 - .../libraries/library_references_preserve.sol | 1 - .../libraries/library_stray_values.sol | 2 - .../library_struct_as_an_expression.sol | 1 - .../mapping_arguments_in_library.sol | 2 - .../libraries/mapping_returns_in_library.sol | 2 - .../mapping_returns_in_library_named.sol | 2 - .../payable_function_calls_library.sol | 2 - .../libraries/using_for_by_name.sol | 2 - .../libraries/using_for_overload.sol | 2 - .../using_library_mappings_public.sol | 2 - .../using_library_mappings_return.sol | 2 - .../libraries/using_library_structs.sol | 2 - .../semanticTests/literals/denominations.sol | 2 - .../semanticTests/literals/escape.sol | 2 - .../semanticTests/literals/ether.sol | 2 - .../semanticTests/literals/gwei.sol | 2 - ...x_string_with_non_printable_characters.sol | 2 - .../literals/hex_string_with_underscore.sol | 2 - .../literals/scientific_notation.sol | 3 - .../semanticTests/literals/wei.sol | 2 - .../memoryManagement/assembly_access.sol | 2 - .../memoryManagement/struct_allocation.sol | 2 - .../metaTypes/name_other_contract.sol | 2 - .../access_through_contract_name.sol | 2 - .../modifiers/access_through_module_name.sol | 2 - .../modifiers/break_in_modifier.sol | 2 - .../modifiers/continue_in_modifier.sol | 3 - .../modifiers/function_modifier.sol | 3 - ..._calling_functions_in_creation_context.sol | 3 - .../modifiers/function_modifier_empty.sol | 3 - .../function_modifier_for_constructor.sol | 2 - .../modifiers/function_modifier_library.sol | 1 - .../function_modifier_library_inheritance.sol | 1 - .../function_modifier_local_variables.sol | 3 - .../function_modifier_loop_viair.sol | 1 - ...nction_modifier_multi_invocation_viair.sol | 1 - .../function_modifier_multiple_times.sol | 3 - ...ion_modifier_multiple_times_local_vars.sol | 3 - .../function_modifier_overriding.sol | 3 - .../modifiers/function_return_parameter.sol | 2 - .../function_return_parameter_complex.sol | 2 - .../modifiers/modifer_recursive.sol | 3 - .../modifiers/modifier_in_constructor_ice.sol | 2 - .../modifiers/modifier_init_return.sol | 3 - .../modifiers_in_construction_context.sol | 2 - .../return_does_not_skip_modifier.sol | 3 - .../modifiers/return_in_modifier.sol | 3 - .../stacked_return_with_modifiers.sol | 2 - .../multiSource/circular_import.sol | 2 - .../multiSource/circular_import_2.sol | 2 - .../multiSource/circular_reimport.sol | 2 - .../multiSource/circular_reimport_2.sol | 2 - .../free_different_interger_types.sol | 2 - ...free_function_resolution_base_contract.sol | 2 - ...e_function_resolution_override_virtual.sol | 2 - ...tion_resolution_override_virtual_super.sol | 2 - ...resolution_override_virtual_transitive.sol | 2 - .../free_function_transitive_import.sol | 3 - .../semanticTests/multiSource/import.sol | 2 - .../imported_free_function_via_alias.sol | 2 - ...ed_free_function_via_alias_direct_call.sol | 2 - .../reimport_imported_function.sol | 2 - .../operators/compound_assign.sol | 2 - .../shifts/shift_bytes_cleanup_viaYul.sol | 1 - .../operators/shifts/shift_cleanup.sol | 3 - .../shifts/shift_cleanup_garbled.sol | 3 - .../operators/shifts/shift_constant_left.sol | 2 - .../shifts/shift_constant_left_assignment.sol | 3 - .../operators/shifts/shift_constant_right.sol | 2 - .../shift_constant_right_assignment.sol | 3 - .../operators/shifts/shift_left.sol | 3 - .../shifts/shift_left_assignment.sol | 3 - .../shift_left_assignment_different_type.sol | 3 - .../shifts/shift_left_larger_type.sol | 2 - .../operators/shifts/shift_left_uint32.sol | 3 - .../operators/shifts/shift_left_uint8.sol | 3 - .../shifts/shift_negative_constant_left.sol | 2 - .../shifts/shift_negative_constant_right.sol | 2 - .../operators/shifts/shift_overflow.sol | 3 - .../operators/shifts/shift_right.sol | 3 - .../shifts/shift_right_assignment.sol | 3 - .../shifts/shift_right_garbled_signed_v2.sol | 2 - .../shifts/shift_right_garbled_v2.sol | 2 - .../shifts/shift_right_negative_literal.sol | 3 - .../shifts/shift_right_negative_lvalue.sol | 3 - ...shift_right_negative_lvalue_assignment.sol | 3 - .../shift_right_negative_lvalue_int16.sol | 3 - .../shift_right_negative_lvalue_int32.sol | 3 - .../shift_right_negative_lvalue_int8.sol | 3 - ...ht_negative_lvalue_signextend_int16_v2.sol | 2 - ...ht_negative_lvalue_signextend_int32_v2.sol | 2 - ...ght_negative_lvalue_signextend_int8_v2.sol | 2 - .../operators/shifts/shift_right_uint32.sol | 3 - .../operators/shifts/shift_right_uint8.sol | 3 - .../shift_underflow_negative_rvalue.sol | 3 - .../userDefined/unchecked_operators.sol | 1 - .../semanticTests/optimizer/shift_bytes.sol | 2 - ...o_nonpayable_circumvention_by_modifier.sol | 2 - .../receive/empty_calldata_calls_receive.sol | 2 - .../semanticTests/receive/ether_and_data.sol | 2 - .../semanticTests/receive/inherited.sol | 2 - .../semanticTests/reverts/assert_require.sol | 3 - .../semanticTests/reverts/error_struct.sol | 2 - .../reverts/invalid_enum_as_external_arg.sol | 1 - .../reverts/invalid_enum_as_external_ret.sol | 2 - .../reverts/invalid_enum_compared.sol | 1 - .../reverts/invalid_enum_stored.sol | 1 - .../reverts/invalid_instruction.sol | 3 - .../semanticTests/reverts/revert.sol | 3 - .../reverts/revert_return_area.sol | 1 - .../semanticTests/reverts/simple_throw.sol | 3 - .../libsolidity/semanticTests/smoke/basic.sol | 2 - .../semanticTests/smoke/failure.sol | 1 - .../semanticTests/smoke/fallback.sol | 2 - .../semanticTests/smoke/multiline.sol | 1 - .../smoke/multiline_comments.sol | 2 - .../semanticTests/smoke/structs.sol | 2 - .../abi_encode_with_signature_from_string.sol | 2 - .../abi_functions_member_access.sol | 2 - .../semanticTests/state/block_coinbase.sol | 2 - .../semanticTests/state/block_difficulty.sol | 1 - .../state/block_difficulty_post_paris.sol | 1 - .../semanticTests/state/block_gaslimit.sol | 2 - .../semanticTests/state/block_number.sol | 2 - .../semanticTests/state/block_prevrandao.sol | 1 - .../state/block_prevrandao_pre_paris.sol | 1 - .../semanticTests/state/block_timestamp.sol | 2 - .../semanticTests/state/gasleft.sol | 2 - .../semanticTests/state/msg_sender.sol | 2 - .../semanticTests/state/msg_sig.sol | 2 - .../semanticTests/state/msg_value.sol | 2 - .../semanticTests/state/tx_gasprice.sol | 2 - .../semanticTests/state/tx_origin.sol | 2 - .../state/uncalled_blockhash.sol | 2 - .../state_var_initialization.sol | 2 - .../state_variables_init_order.sol | 2 - .../state_variables_init_order_2.sol | 2 - .../statements/do_while_loop_continue.sol | 2 - .../storage/packed_functions.sol | 1 - .../storage/packed_storage_overflow.sol | 2 - .../storage/packed_storage_signed.sol | 3 - .../storage/packed_storage_structs_bytes.sol | 3 - .../storage/packed_storage_structs_enum.sol | 3 - .../storage/packed_storage_structs_uint.sol | 3 - .../semanticTests/storage/simple_accessor.sol | 2 - .../storage/state_smoke_test.sol | 2 - .../string_concat_empty_argument_list.sol | 2 - .../concat/string_concat_empty_strings.sol | 2 - .../semanticTests/strings/empty_string.sol | 2 - .../semanticTests/strings/return_string.sol | 2 - .../semanticTests/strings/string_escapes.sol | 2 - .../semanticTests/strings/unicode_escapes.sol | 2 - .../semanticTests/strings/unicode_string.sol | 2 - .../structs/array_of_recursive_struct.sol | 2 - .../structs/calldata/calldata_struct.sol | 3 - .../calldata/calldata_struct_and_ints.sol | 1 - .../calldata_struct_array_member_dynamic.sol | 2 - .../calldata/calldata_struct_to_memory.sol | 3 - .../calldata/calldata_struct_to_storage.sol | 3 - .../calldata_struct_with_array_to_memory.sol | 1 - .../calldata_struct_with_bytes_to_memory.sol | 1 - .../structs/calldata/calldata_structs.sol | 3 - .../structs/calldata/dynamic_nested.sol | 2 - .../structs/calldata/dynamically_encoded.sol | 2 - .../structs/copy_from_mapping.sol | 1 - ...h_nested_array_from_calldata_to_memory.sol | 1 - ..._nested_array_from_calldata_to_storage.sol | 1 - ...ith_nested_array_from_memory_to_memory.sol | 1 - ...h_nested_array_from_storage_to_storage.sol | 1 - .../copy_substructures_from_mapping.sol | 1 - .../structs/copy_substructures_to_mapping.sol | 1 - .../semanticTests/structs/copy_to_mapping.sol | 1 - .../semanticTests/structs/global.sol | 2 - .../structs/lone_struct_array_type.sol | 3 - .../memory_struct_named_constructor.sol | 3 - .../memory_structs_as_function_args.sol | 3 - .../structs/memory_structs_nested.sol | 3 - .../structs/memory_structs_nested_load.sol | 2 - .../structs/memory_structs_read_write.sol | 3 - .../structs/multislot_struct_allocation.sol | 3 - .../structs/nested_struct_allocation.sol | 2 - .../structs/recursive_structs.sol | 3 - .../structs/simple_struct_allocation.sol | 2 - .../struct_assign_reference_to_struct.sol | 3 - .../semanticTests/structs/struct_copy.sol | 1 - .../structs/struct_copy_via_local.sol | 3 - .../structs/struct_delete_member.sol | 3 - .../structs/struct_delete_storage.sol | 2 - .../structs/struct_delete_storage_small.sol | 1 - .../struct_delete_struct_in_mapping.sol | 1 - .../structs/struct_memory_to_storage.sol | 3 - .../struct_memory_to_storage_function_ptr.sol | 3 - .../structs/struct_named_constructor.sol | 3 - .../structs/struct_referencing.sol | 2 - .../structs/struct_storage_to_memory.sol | 3 - .../struct_storage_to_memory_function_ptr.sol | 3 - .../structs/using_for_function_on_struct.sol | 2 - .../types/assign_calldata_value_type.sol | 2 - ...ixed_bytes_to_fixed_bytes_greater_size.sol | 2 - ...t_fixed_bytes_to_fixed_bytes_same_size.sol | 2 - ...ixed_bytes_to_fixed_bytes_smaller_size.sol | 2 - ...nvert_fixed_bytes_to_uint_greater_size.sol | 2 - ...vert_fixed_bytes_to_uint_same_min_size.sol | 2 - .../convert_fixed_bytes_to_uint_same_type.sol | 2 - ...nvert_fixed_bytes_to_uint_smaller_size.sol | 2 - ...nvert_uint_to_fixed_bytes_greater_size.sol | 2 - ...vert_uint_to_fixed_bytes_same_min_size.sol | 2 - .../convert_uint_to_fixed_bytes_same_size.sol | 2 - ...nvert_uint_to_fixed_bytes_smaller_size.sol | 2 - .../types/external_function_to_address.sol | 2 - .../mapping/copy_from_mapping_to_mapping.sol | 1 - ...copy_struct_to_array_stored_in_mapping.sol | 1 - .../user_defined_types_mapping_storage.sol | 1 - .../semanticTests/types/nested_tuples.sol | 2 - .../types/packing_signed_types.sol | 2 - .../types/packing_unpacking_types.sol | 2 - .../semanticTests/types/strings.sol | 3 - .../types/tuple_assign_multi_slot_grow.sol | 2 - .../types/type_conversion_cleanup.sol | 2 - .../semanticTests/underscore/as_function.sol | 2 - .../invalidInConstructor.sol | 2 - .../invalidStoredInConstructor.sol | 2 - .../uninitializedFunctionPointer/store2.sol | 2 - .../storeInConstructor.sol | 2 - ...ized_internal_storage_function_via_yul.sol | 1 - .../userDefinedValueType/cleanup.sol | 1 - .../cleanup_abicoderv1.sol | 1 - .../userDefinedValueType/conversion.sol | 1 - .../conversion_abicoderv1.sol | 1 - .../storage_layout_struct.sol | 1 - ...cost_abstraction_comparison_elementary.sol | 1 - ...ost_abstraction_comparison_userdefined.sol | 1 - .../using/free_function_multi.sol | 1 - .../using/free_functions_individual.sol | 2 - .../using/using_global_for_global.sol | 1 - .../semanticTests/variables/delete_local.sol | 2 - .../semanticTests/variables/delete_locals.sol | 2 - .../variables/public_state_overridding.sol | 2 - ...ublic_state_overridding_dynamic_struct.sol | 4 - ..._overridding_mapping_to_dynamic_struct.sol | 2 - .../semanticTests/various/address_code.sol | 2 - ...ment_to_const_var_involving_expression.sol | 3 - .../semanticTests/various/balance.sol | 3 - .../various/byte_optimization_bug.sol | 3 - .../various/code_access_create.sol | 1 - .../various/code_access_runtime.sol | 1 - .../semanticTests/various/code_length.sol | 2 - .../various/code_length_contract_member.sol | 2 - .../various/codebalance_assembly.sol | 1 - .../semanticTests/various/codehash.sol | 1 - .../various/codehash_assembly.sol | 1 - .../various/contract_binary_dependencies.sol | 3 - .../crazy_elementary_typenames_on_stack.sol | 3 - .../various/cross_contract_types.sol | 3 - .../semanticTests/various/decayed_tuple.sol | 2 - .../various/destructuring_assignment.sol | 1 - .../various/empty_name_return_parameter.sol | 3 - .../various/external_types_in_calls.sol | 1 - .../various/flipping_sign_tests.sol | 3 - .../various/gasleft_decrease.sol | 3 - .../various/gasleft_shadow_resolution.sol | 3 - .../various/inline_member_init.sol | 2 - .../inline_member_init_inheritence.sol | 2 - .../inline_tuple_with_rational_numbers.sol | 3 - .../various/iszero_bnot_correct.sol | 3 - .../various/literal_empty_string.sol | 1 - .../various/memory_overwrite.sol | 3 - .../semanticTests/various/multi_modifiers.sol | 2 - .../various/multi_variable_declaration.sol | 2 - .../various/nested_calldata_struct.sol | 3 - .../nested_calldata_struct_to_memory.sol | 1 - .../various/positive_integers_to_signed.sol | 2 - .../semanticTests/various/senders_balance.sol | 1 - .../single_copy_with_multiple_inheritance.sol | 3 - .../skip_dynamic_types_for_structs.sol | 1 - .../state_variable_local_variable_mixture.sol | 2 - .../state_variable_under_contract_name.sol | 2 - .../semanticTests/various/string_tuples.sol | 2 - .../semanticTests/various/super.sol | 3 - .../semanticTests/various/super_alone.sol | 3 - .../various/super_parentheses.sol | 3 - .../various/swap_in_storage_overwrite.sol | 3 - .../various/test_underscore_in_hex.sol | 2 - .../typed_multi_variable_declaration.sol | 3 - .../semanticTests/various/value_complex.sol | 1 - .../semanticTests/various/value_insane.sol | 1 - .../various/write_storage_external.sol | 1 - .../semanticTests/viaYul/assert.sol | 2 - .../viaYul/assert_and_require.sol | 2 - .../assign_tuple_from_function_call.sol | 2 - .../viaYul/cleanup/checked_arithmetic.sol | 1 - .../viaYul/cleanup/comparison.sol | 2 - .../semanticTests/viaYul/comparison.sol | 2 - .../viaYul/comparison_functions.sol | 2 - .../conditional/conditional_multiple.sol | 2 - .../conditional_true_false_literal.sol | 2 - .../viaYul/conditional/conditional_tuple.sol | 2 - .../conditional_with_assignment.sol | 2 - .../conditional_with_variables.sol | 2 - .../conversion/explicit_cast_assignment.sol | 2 - .../explicit_cast_function_call.sol | 2 - .../explicit_cast_local_assignment.sol | 2 - .../conversion/implicit_cast_assignment.sol | 2 - .../implicit_cast_function_call.sol | 2 - .../implicit_cast_local_assignment.sol | 2 - .../define_tuple_from_function_call.sol | 2 - .../semanticTests/viaYul/delete.sol | 2 - .../viaYul/detect_add_overflow.sol | 2 - .../viaYul/detect_add_overflow_signed.sol | 2 - .../viaYul/detect_div_overflow.sol | 2 - .../semanticTests/viaYul/detect_mod_zero.sol | 2 - .../viaYul/detect_mod_zero_signed.sol | 2 - .../viaYul/detect_mul_overflow.sol | 2 - .../viaYul/detect_mul_overflow_signed.sol | 2 - .../viaYul/detect_sub_overflow.sol | 2 - .../viaYul/detect_sub_overflow_signed.sol | 2 - .../viaYul/dirty_memory_dynamic_array.sol | 1 - .../viaYul/dirty_memory_int32.sol | 1 - .../viaYul/dirty_memory_static_array.sol | 1 - .../viaYul/dirty_memory_struct.sol | 1 - .../viaYul/dirty_memory_uint32.sol | 1 - test/libsolidity/semanticTests/viaYul/exp.sol | 2 - .../semanticTests/viaYul/exp_literals.sol | 1 - .../viaYul/exp_literals_success.sol | 2 - .../semanticTests/viaYul/exp_neg.sol | 2 - .../semanticTests/viaYul/exp_neg_overflow.sol | 2 - .../semanticTests/viaYul/exp_overflow.sol | 2 - .../semanticTests/viaYul/exp_various.sol | 2 - .../semanticTests/viaYul/function_address.sol | 2 - .../viaYul/function_entry_checks.sol | 2 - .../viaYul/function_pointers.sol | 2 - .../viaYul/function_selector.sol | 2 - test/libsolidity/semanticTests/viaYul/if.sol | 2 - .../viaYul/local_address_assignment.sol | 2 - .../semanticTests/viaYul/local_assignment.sol | 2 - .../viaYul/local_bool_assignment.sol | 2 - .../viaYul/local_tuple_assignment.sol | 2 - .../viaYul/local_variable_without_init.sol | 2 - .../semanticTests/viaYul/loops/break.sol | 2 - .../semanticTests/viaYul/loops/continue.sol | 2 - .../semanticTests/viaYul/loops/return.sol | 2 - .../semanticTests/viaYul/loops/simple.sol | 2 - .../viaYul/memory_struct_allow.sol | 2 - .../semanticTests/viaYul/msg_sender.sol | 2 - .../semanticTests/viaYul/require.sol | 1 - .../semanticTests/viaYul/return.sol | 2 - .../viaYul/return_and_convert.sol | 2 - .../viaYul/return_storage_pointers.sol | 2 - .../semanticTests/viaYul/short_circuit.sol | 2 - .../viaYul/simple_assignment.sol | 2 - .../viaYul/simple_inline_asm.sol | 2 - .../semanticTests/viaYul/smoke_test.sol | 1 - .../viaYul/storage/dirty_storage_bytes.sol | 2 - .../storage/dirty_storage_static_array.sol | 2 - .../viaYul/storage/packed_storage.sol | 2 - .../viaYul/storage/simple_storage.sol | 2 - .../semanticTests/viaYul/string_format.sol | 2 - .../semanticTests/viaYul/string_literals.sol | 2 - .../viaYul/tuple_evaluation_order.sol | 2 - .../semanticTests/viaYul/unary_fixedbytes.sol | 2 - .../semanticTests/viaYul/unary_operations.sol | 1 - .../viaYul/various_inline_asm.sol | 2 - .../viaYul/virtual_functions.sol | 2 - .../internal_virtual_function_calls.sol | 3 - ...irtual_function_calls_through_dispatch.sol | 3 - .../virtual_function_calls.sol | 3 - ...unction_usage_in_constructor_arguments.sol | 1 - .../array_members/push_overflow_2_safe.sol | 1 - .../array_members/push_struct_member_1.sol | 1 - .../array_members/push_struct_member_2.sol | 1 - .../smtCheckerTests/complex/MerkleProof.sol | 1 - .../function_selector/homer.sol | 2 - .../functions/functions_identity_1.sol | 1 - .../functions/functions_identity_1_fail.sol | 1 - .../functions/functions_identity_2.sol | 1 - .../functions/functions_identity_2_fail.sol | 1 - .../functions/functions_identity_as_tuple.sol | 1 - .../functions_identity_as_tuple_fail.sol | 1 - .../functions/functions_recursive.sol | 1 - .../functions/functions_storage_var_1.sol | 1 - .../functions_storage_var_1_fail.sol | 1 - .../functions/functions_storage_var_2.sol | 1 - .../functions_storage_var_2_fail.sol | 1 - .../functions/library_after_contract.sol | 1 - ...nment_contract_member_variable_array_2.sol | 1 - .../special/msg_value_inheritance_3.sol | 1 - .../smtCheckerTests/special/range_check.sol | 1 - .../try_catch/try_inside_if.sol | 1 - .../types/static_array_implicit_push_3.sol | 1 - .../types/static_array_implicit_push_4.sol | 1 - .../unchecked_double_with_modifier.sol | 2 - test/libyul/Common.cpp | 6 - test/libyul/EwasmTranslationTest.cpp | 127 --- test/libyul/EwasmTranslationTest.h | 54 -- test/libyul/ObjectCompilerTest.cpp | 42 +- test/libyul/ObjectCompilerTest.h | 1 - test/libyul/YulOptimizerTestCommon.cpp | 7 - test/libyul/ewasmTranslationTests/address.yul | 9 - .../ewasmTranslationTests/arithmetic_add.yul | 35 - .../arithmetic_addmod.yul | 25 - .../ewasmTranslationTests/arithmetic_div.yul | 34 - .../ewasmTranslationTests/arithmetic_exp.yul | 40 - .../ewasmTranslationTests/arithmetic_mod.yul | 29 - .../ewasmTranslationTests/arithmetic_mul.yul | 36 - .../arithmetic_mulmod.yul | 27 - .../ewasmTranslationTests/arithmetic_sdiv.yul | 33 - .../ewasmTranslationTests/arithmetic_smod.yul | 33 - .../ewasmTranslationTests/arithmetic_sub.yul | 36 - test/libyul/ewasmTranslationTests/balance.yul | 12 - .../ewasmTranslationTests/bitwise_and.yul | 24 - .../ewasmTranslationTests/bitwise_not.yul | 25 - .../ewasmTranslationTests/bitwise_or.yul | 26 - .../ewasmTranslationTests/bitwise_xor.yul | 27 - .../ewasmTranslationTests/blockhash.yul | 9 - .../ewasmTranslationTests/calldatacopy.yul | 8 - .../ewasmTranslationTests/calldataload.yul | 7 - .../ewasmTranslationTests/calldatasize.yul | 7 - test/libyul/ewasmTranslationTests/caller.yul | 9 - .../ewasmTranslationTests/callvalue.yul | 9 - test/libyul/ewasmTranslationTests/chainid.yul | 10 - .../libyul/ewasmTranslationTests/codecopy.yul | 11 - .../libyul/ewasmTranslationTests/codesize.yul | 9 - .../libyul/ewasmTranslationTests/coinbase.yul | 9 - .../ewasmTranslationTests/comparison_eq.yul | 28 - .../ewasmTranslationTests/comparison_gt.yul | 36 - .../ewasmTranslationTests/comparison_lt.yul | 36 - .../ewasmTranslationTests/comparison_sgt.yul | 54 -- .../ewasmTranslationTests/comparison_slt.yul | 55 -- .../libyul/ewasmTranslationTests/datacopy.yul | 20 - .../ewasmTranslationTests/dataoffset.yul | 16 - .../libyul/ewasmTranslationTests/datasize.yul | 16 - .../ewasmTranslationTests/difficulty.yul | 11 - .../ewasmTranslationTests/extcodecopy.yul | 11 - .../ewasmTranslationTests/extcodehash.yul | 11 - .../ewasmTranslationTests/extcodesize.yul | 9 - test/libyul/ewasmTranslationTests/gas.yul | 9 - .../libyul/ewasmTranslationTests/gaslimit.yul | 9 - .../libyul/ewasmTranslationTests/gasprice.yul | 9 - test/libyul/ewasmTranslationTests/invalid.yul | 14 - test/libyul/ewasmTranslationTests/iszero.yul | 14 - .../ewasmTranslationTests/keccak256.yul | 9 - test/libyul/ewasmTranslationTests/log0.yul | 8 - test/libyul/ewasmTranslationTests/log1.yul | 8 - test/libyul/ewasmTranslationTests/log2.yul | 8 - test/libyul/ewasmTranslationTests/log3.yul | 8 - test/libyul/ewasmTranslationTests/log4.yul | 8 - .../ewasmTranslationTests/loop_break.yul | 13 - .../ewasmTranslationTests/loop_continue.yul | 22 - .../ewasmTranslationTests/memoryguard.yul | 12 - test/libyul/ewasmTranslationTests/msize.yul | 12 - test/libyul/ewasmTranslationTests/mstore8.yul | 15 - .../ewasmTranslationTests/mstore_mload.yul | 14 - test/libyul/ewasmTranslationTests/number.yul | 9 - test/libyul/ewasmTranslationTests/origin.yul | 9 - test/libyul/ewasmTranslationTests/return.yul | 11 - .../ewasmTranslationTests/returndatacopy.yul | 10 - .../ewasmTranslationTests/returndatasize.yul | 9 - test/libyul/ewasmTranslationTests/revert.yul | 13 - .../ewasmTranslationTests/selfbalance.yul | 10 - .../ewasmTranslationTests/selfdestruct.yul | 10 - test/libyul/ewasmTranslationTests/shifts.yul | 23 - .../ewasmTranslationTests/signextend.yul | 16 - .../ewasmTranslationTests/simple_mstore.yul | 8 - .../ewasmTranslationTests/simple_sload.yul | 16 - .../ewasmTranslationTests/simple_sstore.yul | 12 - test/libyul/ewasmTranslationTests/smoke.yul | 5 - .../ewasmTranslationTests/smoke_call.yul | 10 - .../ewasmTranslationTests/smoke_callcode.yul | 10 - .../ewasmTranslationTests/smoke_create.yul | 11 - .../ewasmTranslationTests/smoke_create2.yul | 13 - .../smoke_delegatecall.yul | 10 - .../smoke_staticcall.yul | 12 - .../ewasmTranslationTests/timestamp.yul | 9 - .../objectCompiler/wasm/no_main_function.yul | 22 - test/libyul/objectCompiler/wasm/simple.yul | 23 - test/libyul/objectCompiler/wasm/subObject.yul | 22 - .../objectCompiler/wasm/subObjectAccess.yul | 79 -- .../add_correct_type_wasm.yul | 19 - .../expressionSplitter/typed.yul | 43 -- .../wordSizeTransform/constant_assignment.yul | 18 - .../wordSizeTransform/function_call.yul | 43 -- .../functional_instruction.yul | 17 - .../wordSizeTransform/if.yul | 49 -- .../wordSizeTransform/or_bool_renamed.yul | 25 - .../wordSizeTransform/switch_1.yul | 71 -- .../wordSizeTransform/switch_2.yul | 77 -- .../wordSizeTransform/switch_3.yul | 89 --- .../wordSizeTransform/switch_4.yul | 97 --- .../wordSizeTransform/switch_5.yul | 29 - .../for_loop_condition_fail_ewasm.yul | 8 - .../yulSyntaxTests/linkersymbol_ewasm.yul | 7 - .../yulSyntaxTests/type_check_cases.yul | 8 - .../yulSyntaxTests/type_check_cases_fail.yul | 10 - .../type_check_if_condition.yul | 7 - .../type_check_if_condition_fail.yul | 8 - test/solc/CommandLineParser.cpp | 21 +- test/soltest.cpp | 4 - test/tools/CMakeLists.txt | 1 - test/tools/isoltest.cpp | 1 - test/tools/yulInterpreter/CMakeLists.txt | 2 - .../EwasmBuiltinInterpreter.cpp | 617 --------------- .../yulInterpreter/EwasmBuiltinInterpreter.h | 138 ---- test/tools/yulInterpreter/Interpreter.cpp | 9 - 1042 files changed, 97 insertions(+), 10946 deletions(-) delete mode 100644 cmake/templates/ewasm_polyfill.in delete mode 100644 libyul/backends/wasm/BinaryTransform.cpp delete mode 100644 libyul/backends/wasm/BinaryTransform.h delete mode 100644 libyul/backends/wasm/EVMToEwasmTranslator.cpp delete mode 100644 libyul/backends/wasm/EVMToEwasmTranslator.h delete mode 100644 libyul/backends/wasm/TextTransform.cpp delete mode 100644 libyul/backends/wasm/TextTransform.h delete mode 100644 libyul/backends/wasm/WasmAST.h delete mode 100644 libyul/backends/wasm/WasmCodeTransform.cpp delete mode 100644 libyul/backends/wasm/WasmCodeTransform.h delete mode 100644 libyul/backends/wasm/WasmDialect.cpp delete mode 100644 libyul/backends/wasm/WasmDialect.h delete mode 100644 libyul/backends/wasm/WasmObjectCompiler.cpp delete mode 100644 libyul/backends/wasm/WasmObjectCompiler.h delete mode 100644 libyul/backends/wasm/WordSizeTransform.cpp delete mode 100644 libyul/backends/wasm/WordSizeTransform.h delete mode 100644 libyul/backends/wasm/polyfill/Arithmetic.yul delete mode 100644 libyul/backends/wasm/polyfill/Bitwise.yul delete mode 100644 libyul/backends/wasm/polyfill/Comparison.yul delete mode 100644 libyul/backends/wasm/polyfill/Conversion.yul delete mode 100644 libyul/backends/wasm/polyfill/Interface.yul delete mode 100644 libyul/backends/wasm/polyfill/Keccak.yul delete mode 100644 libyul/backends/wasm/polyfill/Logical.yul delete mode 100644 libyul/backends/wasm/polyfill/Memory.yul delete mode 100644 test/cmdlineTests/evm_to_wasm/args delete mode 100644 test/cmdlineTests/evm_to_wasm/input.yul delete mode 100644 test/cmdlineTests/evm_to_wasm/output delete mode 100644 test/cmdlineTests/evm_to_wasm_break/args delete mode 100644 test/cmdlineTests/evm_to_wasm_break/input.yul delete mode 100644 test/cmdlineTests/evm_to_wasm_break/output delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_asm_only/args delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_asm_only/input.yul delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_asm_only/output delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/args delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/input.yul delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/output delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/args delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/input.yul delete mode 100644 test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/output delete mode 100644 test/cmdlineTests/evm_to_wasm_unsupported_translation/args delete mode 100644 test/cmdlineTests/evm_to_wasm_unsupported_translation/err delete mode 100644 test/cmdlineTests/evm_to_wasm_unsupported_translation/exit delete mode 100644 test/cmdlineTests/evm_to_wasm_unsupported_translation/input.yul delete mode 100644 test/cmdlineTests/evm_to_wasm_unsupported_translation/output delete mode 100644 test/cmdlineTests/output_selection_ewasm_ir_only/args delete mode 100644 test/cmdlineTests/output_selection_ewasm_ir_only/err delete mode 100644 test/cmdlineTests/output_selection_ewasm_ir_only/exit delete mode 100644 test/cmdlineTests/output_selection_ewasm_ir_only/input.sol delete mode 100644 test/cmdlineTests/standard_ewasm_requested/input.json delete mode 100644 test/cmdlineTests/standard_ewasm_requested/output.json delete mode 100644 test/cmdlineTests/standard_ewasm_requested_abstract/input.json delete mode 100644 test/cmdlineTests/standard_ewasm_requested_abstract/output.json delete mode 100644 test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/args delete mode 100644 test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/input.yul delete mode 100644 test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/output delete mode 100644 test/cmdlineTests/strict_asm_output_selection_ewasm_only/args delete mode 100644 test/cmdlineTests/strict_asm_output_selection_ewasm_only/input.yul delete mode 100644 test/cmdlineTests/strict_asm_output_selection_ewasm_only/output delete mode 100644 test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/args delete mode 100644 test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/input.yul delete mode 100644 test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/output delete mode 100644 test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/args delete mode 100644 test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/input.yul delete mode 100644 test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/output delete mode 100644 test/cmdlineTests/yul_to_wasm_source_location_crash/args delete mode 100644 test/cmdlineTests/yul_to_wasm_source_location_crash/input.yul delete mode 100644 test/cmdlineTests/yul_to_wasm_source_location_crash/output delete mode 100644 test/libyul/EwasmTranslationTest.cpp delete mode 100644 test/libyul/EwasmTranslationTest.h delete mode 100644 test/libyul/ewasmTranslationTests/address.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_add.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_addmod.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_div.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_exp.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_mod.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_mul.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_mulmod.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_sdiv.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_smod.yul delete mode 100644 test/libyul/ewasmTranslationTests/arithmetic_sub.yul delete mode 100644 test/libyul/ewasmTranslationTests/balance.yul delete mode 100644 test/libyul/ewasmTranslationTests/bitwise_and.yul delete mode 100644 test/libyul/ewasmTranslationTests/bitwise_not.yul delete mode 100644 test/libyul/ewasmTranslationTests/bitwise_or.yul delete mode 100644 test/libyul/ewasmTranslationTests/bitwise_xor.yul delete mode 100644 test/libyul/ewasmTranslationTests/blockhash.yul delete mode 100644 test/libyul/ewasmTranslationTests/calldatacopy.yul delete mode 100644 test/libyul/ewasmTranslationTests/calldataload.yul delete mode 100644 test/libyul/ewasmTranslationTests/calldatasize.yul delete mode 100644 test/libyul/ewasmTranslationTests/caller.yul delete mode 100644 test/libyul/ewasmTranslationTests/callvalue.yul delete mode 100644 test/libyul/ewasmTranslationTests/chainid.yul delete mode 100644 test/libyul/ewasmTranslationTests/codecopy.yul delete mode 100644 test/libyul/ewasmTranslationTests/codesize.yul delete mode 100644 test/libyul/ewasmTranslationTests/coinbase.yul delete mode 100644 test/libyul/ewasmTranslationTests/comparison_eq.yul delete mode 100644 test/libyul/ewasmTranslationTests/comparison_gt.yul delete mode 100644 test/libyul/ewasmTranslationTests/comparison_lt.yul delete mode 100644 test/libyul/ewasmTranslationTests/comparison_sgt.yul delete mode 100644 test/libyul/ewasmTranslationTests/comparison_slt.yul delete mode 100644 test/libyul/ewasmTranslationTests/datacopy.yul delete mode 100644 test/libyul/ewasmTranslationTests/dataoffset.yul delete mode 100644 test/libyul/ewasmTranslationTests/datasize.yul delete mode 100644 test/libyul/ewasmTranslationTests/difficulty.yul delete mode 100644 test/libyul/ewasmTranslationTests/extcodecopy.yul delete mode 100644 test/libyul/ewasmTranslationTests/extcodehash.yul delete mode 100644 test/libyul/ewasmTranslationTests/extcodesize.yul delete mode 100644 test/libyul/ewasmTranslationTests/gas.yul delete mode 100644 test/libyul/ewasmTranslationTests/gaslimit.yul delete mode 100644 test/libyul/ewasmTranslationTests/gasprice.yul delete mode 100644 test/libyul/ewasmTranslationTests/invalid.yul delete mode 100644 test/libyul/ewasmTranslationTests/iszero.yul delete mode 100644 test/libyul/ewasmTranslationTests/keccak256.yul delete mode 100644 test/libyul/ewasmTranslationTests/log0.yul delete mode 100644 test/libyul/ewasmTranslationTests/log1.yul delete mode 100644 test/libyul/ewasmTranslationTests/log2.yul delete mode 100644 test/libyul/ewasmTranslationTests/log3.yul delete mode 100644 test/libyul/ewasmTranslationTests/log4.yul delete mode 100644 test/libyul/ewasmTranslationTests/loop_break.yul delete mode 100644 test/libyul/ewasmTranslationTests/loop_continue.yul delete mode 100644 test/libyul/ewasmTranslationTests/memoryguard.yul delete mode 100644 test/libyul/ewasmTranslationTests/msize.yul delete mode 100644 test/libyul/ewasmTranslationTests/mstore8.yul delete mode 100644 test/libyul/ewasmTranslationTests/mstore_mload.yul delete mode 100644 test/libyul/ewasmTranslationTests/number.yul delete mode 100644 test/libyul/ewasmTranslationTests/origin.yul delete mode 100644 test/libyul/ewasmTranslationTests/return.yul delete mode 100644 test/libyul/ewasmTranslationTests/returndatacopy.yul delete mode 100644 test/libyul/ewasmTranslationTests/returndatasize.yul delete mode 100644 test/libyul/ewasmTranslationTests/revert.yul delete mode 100644 test/libyul/ewasmTranslationTests/selfbalance.yul delete mode 100644 test/libyul/ewasmTranslationTests/selfdestruct.yul delete mode 100644 test/libyul/ewasmTranslationTests/shifts.yul delete mode 100644 test/libyul/ewasmTranslationTests/signextend.yul delete mode 100644 test/libyul/ewasmTranslationTests/simple_mstore.yul delete mode 100644 test/libyul/ewasmTranslationTests/simple_sload.yul delete mode 100644 test/libyul/ewasmTranslationTests/simple_sstore.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke_call.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke_callcode.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke_create.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke_create2.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke_delegatecall.yul delete mode 100644 test/libyul/ewasmTranslationTests/smoke_staticcall.yul delete mode 100644 test/libyul/ewasmTranslationTests/timestamp.yul delete mode 100644 test/libyul/objectCompiler/wasm/no_main_function.yul delete mode 100644 test/libyul/objectCompiler/wasm/simple.yul delete mode 100644 test/libyul/objectCompiler/wasm/subObject.yul delete mode 100644 test/libyul/objectCompiler/wasm/subObjectAccess.yul delete mode 100644 test/libyul/yulOptimizerTests/conditionalSimplifier/add_correct_type_wasm.yul delete mode 100644 test/libyul/yulOptimizerTests/expressionSplitter/typed.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/constant_assignment.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/function_call.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/functional_instruction.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/if.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/or_bool_renamed.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/switch_1.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/switch_2.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul delete mode 100644 test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul delete mode 100644 test/libyul/yulSyntaxTests/for_loop_condition_fail_ewasm.yul delete mode 100644 test/libyul/yulSyntaxTests/linkersymbol_ewasm.yul delete mode 100644 test/libyul/yulSyntaxTests/type_check_cases.yul delete mode 100644 test/libyul/yulSyntaxTests/type_check_cases_fail.yul delete mode 100644 test/libyul/yulSyntaxTests/type_check_if_condition.yul delete mode 100644 test/libyul/yulSyntaxTests/type_check_if_condition_fail.yul delete mode 100644 test/tools/yulInterpreter/EwasmBuiltinInterpreter.cpp delete mode 100644 test/tools/yulInterpreter/EwasmBuiltinInterpreter.h diff --git a/Changelog.md b/Changelog.md index 164d998c29f7..c0f773908f69 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ Language Features: Compiler Features: + * EWasm: Remove EWasm backend. Bugfixes: diff --git a/cmake/templates/ewasm_polyfill.in b/cmake/templates/ewasm_polyfill.in deleted file mode 100644 index 8ac364280d76..000000000000 --- a/cmake/templates/ewasm_polyfill.in +++ /dev/null @@ -1,13 +0,0 @@ -// The generation of this file is defined in libyul/CMakeLists.txt. -// This file was generated by using the content of libyul/backends/wasm/polyfill/@EWASM_POLYFILL_NAME@.yul. - -#pragma once - -namespace solidity::yul::wasm::polyfill -{ - -static char const @EWASM_POLYFILL_NAME@[] = { - @EWASM_POLYFILL_CONTENT@, 0 -}; - -} // namespace solidity::yul::wasm::polyfill diff --git a/docs/contributing.rst b/docs/contributing.rst index d74612417b57..52a99ec4f542 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -93,8 +93,7 @@ Prerequisites For running all compiler tests you may want to optionally install a few dependencies (`evmone `_, -`libz3 `_, and -`libhera `_). +`libz3 `_). On macOS systems, some of the testing scripts expect GNU coreutils to be installed. This can be easiest accomplished using Homebrew: ``brew install coreutils``. @@ -129,13 +128,7 @@ for the ``evmone`` shared object can be specified via the ``ETH_EVMONE`` environ If you do not have it installed, you can skip these tests by passing the ``--no-semantic-tests`` flag to ``scripts/soltest.sh``. -Running Ewasm tests is disabled by default and can be explicitly enabled -via ``./scripts/soltest.sh --ewasm`` and requires `hera `_ -to be found by ``soltest``. -The mechanism for locating the ``hera`` library is the same as for ``evmone``, except that the -variable for specifying an explicit location is called ``ETH_HERA``. - -The ``evmone`` and ``hera`` libraries should both end with the file name +The ``evmone`` library should both end with the file name extension ``.so`` on Linux, ``.dll`` on Windows systems and ``.dylib`` on macOS. For running SMT tests, the ``libz3`` library must be installed and locatable diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index fa1a4ec32291..57f0fab6cfb2 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -404,10 +404,8 @@ Input Description // evm.deployedBytecode.immutableReferences - Map from AST ids to bytecode ranges that reference immutables // evm.methodIdentifiers - The list of function hashes // evm.gasEstimates - Function gas estimates - // ewasm.wast - Ewasm in WebAssembly S-expressions format - // ewasm.wasm - Ewasm in WebAssembly binary format // - // Note that using a using `evm`, `evm.bytecode`, `ewasm`, etc. will select every + // Note that using a using `evm`, `evm.bytecode`, etc. will select every // target part of that output. Additionally, `*` can be used as a wildcard to request everything. // "outputSelection": { @@ -501,7 +499,7 @@ Output Description // Mandatory: Error type, such as "TypeError", "InternalCompilerError", "Exception", etc. // See below for complete list of types. "type": "TypeError", - // Mandatory: Component where the error originated, such as "general", "ewasm", etc. + // Mandatory: Component where the error originated, such as "general" etc. "component": "general", // Mandatory ("error", "warning" or "info", but please note that this may be extended in the future) "severity": "error", @@ -617,13 +615,6 @@ Output Description "heavyLifting()": "infinite" } } - }, - // Ewasm related outputs - "ewasm": { - // S-expressions format - "wast": "", - // Binary format (hex string) - "wasm": "" } } } diff --git a/docs/yul.rst b/docs/yul.rst index 2cea0260b947..8a500c6145dc 100644 --- a/docs/yul.rst +++ b/docs/yul.rst @@ -1194,8 +1194,7 @@ An example Yul Object is shown below: // executing code is the constructor code) size := datasize("Contract1_deployed") offset := allocate(size) - // This will turn into a memory->memory copy for Ewasm and - // a codecopy for EVM + // This will turn into a codecopy for EVM datacopy(offset, dataoffset("Contract1_deployed"), size) return(offset, size) } diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index fa1e8ab3ea94..b18834a971f1 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -315,7 +315,6 @@ void CompilerStack::reset(bool _keepSettings) m_evmVersion = langutil::EVMVersion(); m_modelCheckerSettings = ModelCheckerSettings{}; m_generateIR = false; - m_generateEwasm = false; m_revertStrings = RevertStrings::Default; m_optimiserSettings = OptimiserSettings::minimal(); m_metadataLiteralSources = false; @@ -681,7 +680,7 @@ bool CompilerStack::compile(State _stopAfter) { try { - if (m_viaIR || m_generateIR || m_generateEwasm) + if (m_viaIR || m_generateIR) generateIR(*contract); if (m_generateEvmBytecode) { @@ -690,8 +689,6 @@ bool CompilerStack::compile(State _stopAfter) else compileContract(*contract, otherCompilers); } - if (m_generateEwasm) - generateEwasm(*contract); } catch (Error const& _error) { @@ -892,22 +889,6 @@ string const& CompilerStack::yulIROptimized(string const& _contractName) const return contract(_contractName).yulIROptimized; } -string const& CompilerStack::ewasm(string const& _contractName) const -{ - if (m_stackState != CompilationSuccessful) - solThrow(CompilerError, "Compilation was not successful."); - - return contract(_contractName).ewasm; -} - -evmasm::LinkerObject const& CompilerStack::ewasmObject(string const& _contractName) const -{ - if (m_stackState != CompilationSuccessful) - solThrow(CompilerError, "Compilation was not successful."); - - return contract(_contractName).ewasmObject; -} - evmasm::LinkerObject const& CompilerStack::object(string const& _contractName) const { if (m_stackState != CompilationSuccessful) @@ -1479,42 +1460,6 @@ void CompilerStack::generateEVMFromIR(ContractDefinition const& _contract) assembleYul(_contract, compiledContract.evmAssembly, compiledContract.evmRuntimeAssembly); } -void CompilerStack::generateEwasm(ContractDefinition const& _contract) -{ - solAssert(m_stackState >= AnalysisPerformed, ""); - if (m_hasError) - solThrow(CompilerError, "Called generateEwasm with errors."); - - if (!_contract.canBeDeployed()) - return; - - Contract& compiledContract = m_contracts.at(_contract.fullyQualifiedName()); - solAssert(!compiledContract.yulIROptimized.empty(), ""); - if (!compiledContract.ewasm.empty()) - return; - - // Re-parse the Yul IR in EVM dialect - yul::YulStack stack( - m_evmVersion, - m_eofVersion, - yul::YulStack::Language::StrictAssembly, - m_optimiserSettings, - m_debugInfoSelection - ); - stack.parseAndAnalyze("", compiledContract.yulIROptimized); - - stack.optimize(); - stack.translate(yul::YulStack::Language::Ewasm); - stack.optimize(); - - //cout << yul::AsmPrinter{}(*stack.parserResult()->code) << endl; - - // Turn into Ewasm text representation. - auto result = stack.assemble(yul::YulStack::Machine::Ewasm); - compiledContract.ewasm = std::move(result.assembly); - compiledContract.ewasmObject = std::move(*result.bytecode); -} - CompilerStack::Contract const& CompilerStack::contract(string const& _contractName) const { solAssert(m_stackState >= AnalysisPerformed, ""); diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index 36e462330b0e..ae11e233bd18 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -203,9 +203,6 @@ class CompilerStack: public langutil::CharStreamProvider /// Enable generation of Yul IR code. void enableIRGeneration(bool _enable = true) { m_generateIR = _enable; } - /// Enable experimental generation of Ewasm code. If enabled, IR is also generated. - void enableEwasmGeneration(bool _enable = true) { m_generateEwasm = _enable; } - /// @arg _metadataLiteralSources When true, store sources as literals in the contract metadata. /// Must be set before parsing. void useMetadataLiteralSources(bool _metadataLiteralSources); @@ -282,12 +279,6 @@ class CompilerStack: public langutil::CharStreamProvider /// @returns the optimized IR representation of a contract. std::string const& yulIROptimized(std::string const& _contractName) const; - /// @returns the Ewasm text representation of a contract. - std::string const& ewasm(std::string const& _contractName) const; - - /// @returns the Ewasm representation of a contract. - evmasm::LinkerObject const& ewasmObject(std::string const& _contractName) const; - /// @returns the assembled object for a contract. evmasm::LinkerObject const& object(std::string const& _contractName) const; @@ -389,8 +380,6 @@ class CompilerStack: public langutil::CharStreamProvider evmasm::LinkerObject runtimeObject; ///< Runtime object. std::string yulIR; ///< Yul IR code. std::string yulIROptimized; ///< Optimized Yul IR code. - std::string ewasm; ///< Experimental Ewasm text representation - evmasm::LinkerObject ewasmObject; ///< Experimental Ewasm code util::LazyInit metadata; ///< The metadata json that will be hashed into the chain. util::LazyInit abi; util::LazyInit storageLayout; @@ -448,10 +437,6 @@ class CompilerStack: public langutil::CharStreamProvider /// Depends on output generated by generateIR. void generateEVMFromIR(ContractDefinition const& _contract); - /// Generate Ewasm representation for a single contract. - /// Depends on output generated by generateIR. - void generateEwasm(ContractDefinition const& _contract); - /// Links all the known library addresses in the available objects. Any unknown /// library will still be kept as an unlinked placeholder in the objects. void link(); @@ -510,7 +495,6 @@ class CompilerStack: public langutil::CharStreamProvider std::map> m_requestedContractNames; bool m_generateEvmBytecode = true; bool m_generateIR = false; - bool m_generateEwasm = false; std::map m_libraries; ImportRemapper m_importRemapper; std::map m_sources; diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index dbcbe798aaed..28a564a4c927 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -179,7 +179,7 @@ bool hashMatchesContent(string const& _hash, string const& _content) bool isArtifactRequested(Json::Value const& _outputSelection, string const& _artifact, bool _wildcardMatchesExperimental) { - static set experimental{"ir", "irOptimized", "wast", "ewasm", "ewasm.wast"}; + static set experimental{"ir", "irOptimized"}; for (auto const& selectedArtifactJson: _outputSelection) { string const& selectedArtifact = selectedArtifactJson.asString(); @@ -190,7 +190,7 @@ bool isArtifactRequested(Json::Value const& _outputSelection, string const& _art return true; else if (selectedArtifact == "*") { - // "ir", "irOptimized", "wast" and "ewasm.wast" can only be matched by "*" if activated. + // "ir", "irOptimized" can only be matched by "*" if activated. if (experimental.count(_artifact) == 0 || _wildcardMatchesExperimental) return true; } @@ -264,7 +264,6 @@ bool isBinaryRequested(Json::Value const& _outputSelection) static vector const outputsThatRequireBinaries = vector{ "*", "ir", "irOptimized", - "wast", "wasm", "ewasm.wast", "ewasm.wasm", "evm.gasEstimates", "evm.legacyAssembly", "evm.assembly" } + evmObjectComponents("bytecode") + evmObjectComponents("deployedBytecode"); @@ -295,29 +294,10 @@ bool isEvmBytecodeRequested(Json::Value const& _outputSelection) return false; } -/// @returns true if any Ewasm code was requested. Note that as an exception, '*' does not -/// yet match "ewasm.wast" or "ewasm" -bool isEwasmRequested(Json::Value const& _outputSelection) -{ - if (!_outputSelection.isObject()) - return false; - - for (auto const& fileRequests: _outputSelection) - for (auto const& requests: fileRequests) - for (auto const& request: requests) - if (request == "ewasm" || request == "ewasm.wast") - return true; - - return false; -} - /// @returns true if any Yul IR was requested. Note that as an exception, '*' does not /// yet match "ir" or "irOptimized" bool isIRRequested(Json::Value const& _outputSelection) { - if (isEwasmRequested(_outputSelection)) - return true; - if (!_outputSelection.isObject()) return false; @@ -1175,7 +1155,6 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting compilerStack.enableEvmBytecodeGeneration(isEvmBytecodeRequested(_inputsAndSettings.outputSelection)); compilerStack.enableIRGeneration(isIRRequested(_inputsAndSettings.outputSelection)); - compilerStack.enableEwasmGeneration(isEwasmRequested(_inputsAndSettings.outputSelection)); Json::Value errors = std::move(_inputsAndSettings.errors); @@ -1374,12 +1353,6 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "irOptimized", wildcardMatchesExperimental)) contractData["irOptimized"] = compilerStack.yulIROptimized(contractName); - // Ewasm - if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "ewasm.wast", wildcardMatchesExperimental)) - contractData["ewasm"]["wast"] = compilerStack.ewasm(contractName); - if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "ewasm.wasm", wildcardMatchesExperimental)) - contractData["ewasm"]["wasm"] = compilerStack.ewasmObject(contractName).toHex(); - // EVM Json::Value evmData(Json::objectValue); if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "evm.assembly", wildcardMatchesExperimental)) diff --git a/libyul/CMakeLists.txt b/libyul/CMakeLists.txt index cc7033a0b833..2cf02f8383f7 100644 --- a/libyul/CMakeLists.txt +++ b/libyul/CMakeLists.txt @@ -1,19 +1,3 @@ -# This will re-generate the polyfill headers, if any file within libyul/backends/wasm/polyfill/ was modified. -set_directory_properties(PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/libyul/backends/wasm/polyfill/) - -set(POLYFILLS Arithmetic Bitwise Comparison Conversion Interface Keccak Logical Memory) -set(GENERATED_POLYFILL_HEADERS) -foreach(polyfill IN LISTS POLYFILLS) - set(POLYFILL_FILE ${CMAKE_SOURCE_DIR}/libyul/backends/wasm/polyfill/${polyfill}.yul) - file(READ ${POLYFILL_FILE} EWASM_POLYFILL_CONTENT HEX) - string(REGEX MATCHALL ".." EWASM_POLYFILL_CONTENT "${EWASM_POLYFILL_CONTENT}") - string(REGEX REPLACE ";" ",\n\t0x" EWASM_POLYFILL_CONTENT "${EWASM_POLYFILL_CONTENT}") - set(EWASM_POLYFILL_CONTENT "0x${EWASM_POLYFILL_CONTENT}") - set(EWASM_POLYFILL_NAME ${polyfill}) - configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/ewasm_polyfill.in" ${CMAKE_BINARY_DIR}/include/ewasmPolyfills/${polyfill}.h @ONLY) - list(APPEND GENERATED_POLYFILL_HEADERS ${CMAKE_BINARY_DIR}/include/ewasmPolyfills/${polyfill}.h) -endforeach() - add_library(yul ${GENERATED_POLYFILL_HEADERS} @@ -80,20 +64,6 @@ add_library(yul backends/evm/StackLayoutGenerator.h backends/evm/VariableReferenceCounter.h backends/evm/VariableReferenceCounter.cpp - backends/wasm/EVMToEwasmTranslator.cpp - backends/wasm/EVMToEwasmTranslator.h - backends/wasm/BinaryTransform.cpp - backends/wasm/BinaryTransform.h - backends/wasm/TextTransform.cpp - backends/wasm/TextTransform.h - backends/wasm/WasmCodeTransform.cpp - backends/wasm/WasmCodeTransform.h - backends/wasm/WasmDialect.cpp - backends/wasm/WasmDialect.h - backends/wasm/WasmObjectCompiler.cpp - backends/wasm/WasmObjectCompiler.h - backends/wasm/WordSizeTransform.cpp - backends/wasm/WordSizeTransform.h optimiser/ASTCopier.cpp optimiser/ASTCopier.h optimiser/ASTWalker.cpp diff --git a/libyul/YulStack.cpp b/libyul/YulStack.cpp index f258de6a84c7..9ac90c3959f6 100644 --- a/libyul/YulStack.cpp +++ b/libyul/YulStack.cpp @@ -16,8 +16,7 @@ */ // SPDX-License-Identifier: GPL-3.0 /** - * Full assembly stack that can support EVM-assembly and Yul as input and EVM, EVM1.5 and - * Ewasm as output. + * Full assembly stack that can support EVM-assembly and Yul as input and EVM, EVM1.5 */ @@ -30,9 +29,6 @@ #include #include #include -#include -#include -#include #include #include @@ -57,8 +53,6 @@ Dialect const& languageToDialect(YulStack::Language _language, EVMVersion _versi return EVMDialect::strictAssemblyForEVMObjects(_version); case YulStack::Language::Yul: return EVMDialectTyped::instance(_version); - case YulStack::Language::Ewasm: - return WasmDialect::instance(); } yulAssert(false, ""); return Dialect::yulDeprecated(); @@ -102,24 +96,6 @@ void YulStack::optimize() yulAssert(analyzeParsed(), "Invalid source code after optimization."); } -void YulStack::translate(YulStack::Language _targetLanguage) -{ - if (m_language == _targetLanguage) - return; - - yulAssert( - m_language == Language::StrictAssembly && _targetLanguage == Language::Ewasm, - "Invalid language combination" - ); - - *m_parserResult = EVMToEwasmTranslator( - languageToDialect(m_language, m_evmVersion), - *this - ).run(*parserResult()); - - m_language = _targetLanguage; -} - bool YulStack::analyzeParsed() { yulAssert(m_parserResult, ""); @@ -205,18 +181,6 @@ MachineAssemblyObject YulStack::assemble(Machine _machine) const { case Machine::EVM: return assembleWithDeployed().first; - case Machine::Ewasm: - { - yulAssert(m_language == Language::Ewasm, ""); - Dialect const& dialect = languageToDialect(m_language, EVMVersion{}); - - MachineAssemblyObject object; - auto result = WasmObjectCompiler::compile(*m_parserResult, dialect); - object.assembly = std::move(result.first); - object.bytecode = make_shared(); - object.bytecode->bytecode = std::move(result.second); - return object; - } } // unreachable return MachineAssemblyObject(); diff --git a/libyul/YulStack.h b/libyul/YulStack.h index 5c57b56fa58d..bd38cd6024f8 100644 --- a/libyul/YulStack.h +++ b/libyul/YulStack.h @@ -16,8 +16,7 @@ */ // SPDX-License-Identifier: GPL-3.0 /** - * Full assembly stack that can support EVM-assembly and Yul as input and EVM, EVM1.5 and - * Ewasm as output. + * Full assembly stack that can support EVM-assembly and Yul as input and EVM. */ #pragma once @@ -60,14 +59,13 @@ struct MachineAssemblyObject }; /* - * Full assembly stack that can support EVM-assembly and Yul as input and EVM, EVM1.5 and - * Ewasm as output. + * Full assembly stack that can support EVM-assembly and Yul as input and EVM as output. */ class YulStack: public langutil::CharStreamProvider { public: - enum class Language { Yul, Assembly, StrictAssembly, Ewasm }; - enum class Machine { EVM, Ewasm }; + enum class Language { Yul, Assembly, StrictAssembly }; + enum class Machine { EVM }; YulStack(): YulStack( @@ -105,9 +103,6 @@ class YulStack: public langutil::CharStreamProvider /// If the settings (see constructor) disabled the optimizer, nothing is done here. void optimize(); - /// Translate the source to a different language / dialect. - void translate(Language _targetLanguage); - /// Run the assembly step (should only be called after parseAndAnalyze). MachineAssemblyObject assemble(Machine _machine) const; diff --git a/libyul/backends/wasm/BinaryTransform.cpp b/libyul/backends/wasm/BinaryTransform.cpp deleted file mode 100644 index 03f385d805ca..000000000000 --- a/libyul/backends/wasm/BinaryTransform.cpp +++ /dev/null @@ -1,722 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Component that transforms internal Wasm representation to binary. - */ - -#include - -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace solidity; -using namespace solidity::yul; -using namespace solidity::yul::wasm; -using namespace solidity::util; - -namespace -{ - -bytes toBytes(uint8_t _b) -{ - return bytes(1, _b); -} - -enum class LimitsKind: uint8_t -{ - Min = 0x00, - MinMax = 0x01, -}; - -enum class Mutability: uint8_t -{ - Const = 0x00, - Var = 0x01, -}; - -enum class Section: uint8_t -{ - CUSTOM = 0x00, - TYPE = 0x01, - IMPORT = 0x02, - FUNCTION = 0x03, - MEMORY = 0x05, - GLOBAL = 0x06, - EXPORT = 0x07, - CODE = 0x0a -}; - -bytes toBytes(Section _s) -{ - return toBytes(uint8_t(_s)); -} - -enum class ValueType: uint8_t -{ - Void = 0x40, - Function = 0x60, - I64 = 0x7e, - I32 = 0x7f -}; - -bytes toBytes(ValueType _vt) -{ - return toBytes(uint8_t(_vt)); -} - -ValueType toValueType(wasm::Type _type) -{ - if (_type == wasm::Type::i32) - return ValueType::I32; - else if (_type == wasm::Type::i64) - return ValueType::I64; - else - yulAssert(false, "Invalid wasm variable type"); -} - -enum class Export: uint8_t -{ - Function = 0x0, - Memory = 0x2 -}; - -bytes toBytes(Export _export) -{ - return toBytes(uint8_t(_export)); -} - -// NOTE: This is a subset of WebAssembly opcodes. -// Those available as a builtin are listed further down. -enum class Opcode: uint8_t -{ - Block = 0x02, - Loop = 0x03, - If = 0x04, - Else = 0x05, - End = 0x0b, - Br = 0x0c, - BrIf = 0x0d, - BrTable = 0x0e, // Not used yet. - Return = 0x0f, - Call = 0x10, - CallIndirect = 0x11, // Not used yet. - LocalGet = 0x20, - LocalSet = 0x21, - LocalTee = 0x22, // Not used yet. - GlobalGet = 0x23, - GlobalSet = 0x24, - I32Const = 0x41, - I64Const = 0x42, -}; - -bytes toBytes(Opcode _o) -{ - return toBytes(uint8_t(_o)); -} - -Opcode constOpcodeFor(ValueType _type) -{ - if (_type == ValueType::I32) - return Opcode::I32Const; - else if (_type == ValueType::I64) - return Opcode::I64Const; - else - yulAssert(false, "Values of this type cannot be used with const opcode"); -} - -static map const builtins = { - {"unreachable", 0x00}, - {"nop", 0x01}, - {"i32.drop", 0x1a}, - {"i64.drop", 0x1a}, - {"i32.select", 0x1b}, - {"i64.select", 0x1b}, - {"i32.load", 0x28}, - {"i64.load", 0x29}, - {"i32.load8_s", 0x2c}, - {"i32.load8_u", 0x2d}, - {"i32.load16_s", 0x2e}, - {"i32.load16_u", 0x2f}, - {"i64.load8_s", 0x30}, - {"i64.load8_u", 0x31}, - {"i64.load16_s", 0x32}, - {"i64.load16_u", 0x33}, - {"i64.load32_s", 0x34}, - {"i64.load32_u", 0x35}, - {"i32.store", 0x36}, - {"i64.store", 0x37}, - {"i32.store8", 0x3a}, - {"i32.store16", 0x3b}, - {"i64.store8", 0x3c}, - {"i64.store16", 0x3d}, - {"i64.store32", 0x3e}, - {"memory.size", 0x3f}, - {"memory.grow", 0x40}, - {"i32.eqz", 0x45}, - {"i32.eq", 0x46}, - {"i32.ne", 0x47}, - {"i32.lt_s", 0x48}, - {"i32.lt_u", 0x49}, - {"i32.gt_s", 0x4a}, - {"i32.gt_u", 0x4b}, - {"i32.le_s", 0x4c}, - {"i32.le_u", 0x4d}, - {"i32.ge_s", 0x4e}, - {"i32.ge_u", 0x4f}, - {"i64.eqz", 0x50}, - {"i64.eq", 0x51}, - {"i64.ne", 0x52}, - {"i64.lt_s", 0x53}, - {"i64.lt_u", 0x54}, - {"i64.gt_s", 0x55}, - {"i64.gt_u", 0x56}, - {"i64.le_s", 0x57}, - {"i64.le_u", 0x58}, - {"i64.ge_s", 0x59}, - {"i64.ge_u", 0x5a}, - {"i32.clz", 0x67}, - {"i32.ctz", 0x68}, - {"i32.popcnt", 0x69}, - {"i32.add", 0x6a}, - {"i32.sub", 0x6b}, - {"i32.mul", 0x6c}, - {"i32.div_s", 0x6d}, - {"i32.div_u", 0x6e}, - {"i32.rem_s", 0x6f}, - {"i32.rem_u", 0x70}, - {"i32.and", 0x71}, - {"i32.or", 0x72}, - {"i32.xor", 0x73}, - {"i32.shl", 0x74}, - {"i32.shr_s", 0x75}, - {"i32.shr_u", 0x76}, - {"i32.rotl", 0x77}, - {"i32.rotr", 0x78}, - {"i64.clz", 0x79}, - {"i64.ctz", 0x7a}, - {"i64.popcnt", 0x7b}, - {"i64.add", 0x7c}, - {"i64.sub", 0x7d}, - {"i64.mul", 0x7e}, - {"i64.div_s", 0x7f}, - {"i64.div_u", 0x80}, - {"i64.rem_s", 0x81}, - {"i64.rem_u", 0x82}, - {"i64.and", 0x83}, - {"i64.or", 0x84}, - {"i64.xor", 0x85}, - {"i64.shl", 0x86}, - {"i64.shr_s", 0x87}, - {"i64.shr_u", 0x88}, - {"i64.rotl", 0x89}, - {"i64.rotr", 0x8a}, - {"i32.wrap_i64", 0xa7}, - {"i64.extend_i32_s", 0xac}, - {"i64.extend_i32_u", 0xad}, -}; - -bytes prefixSize(bytes _data) -{ - size_t size = _data.size(); - return lebEncode(size) + std::move(_data); -} - -bytes makeSection(Section _section, bytes _data) -{ - return toBytes(_section) + prefixSize(std::move(_data)); -} - -/// This is a kind of run-length-encoding of local types. -vector> groupLocalVariables(vector _localVariables) -{ - vector> localEntries; - - size_t entrySize = 0; - ValueType entryType = ValueType::I32; // Any type would work here - for (VariableDeclaration const& localVariable: _localVariables) - { - ValueType variableType = toValueType(localVariable.type); - - if (variableType != entryType) - { - if (entrySize > 0) - localEntries.emplace_back(entrySize, entryType); - - entryType = variableType; - entrySize = 0; - } - - ++entrySize; - } - if (entrySize > 0) - localEntries.emplace_back(entrySize, entryType); - - return localEntries; -} - -} - -bytes BinaryTransform::run(Module const& _module) -{ - map> const types = typeToFunctionMap(_module.imports, _module.functions); - - map const globalIDs = enumerateGlobals(_module); - map const functionIDs = enumerateFunctions(_module); - map const functionTypes = enumerateFunctionTypes(types); - - yulAssert(globalIDs.size() == _module.globals.size(), ""); - yulAssert(functionIDs.size() == _module.imports.size() + _module.functions.size(), ""); - yulAssert(functionTypes.size() == functionIDs.size(), ""); - yulAssert(functionTypes.size() >= types.size(), ""); - - bytes ret{0, 'a', 's', 'm'}; - // version - ret += bytes{1, 0, 0, 0}; - ret += typeSection(types); - ret += importSection(_module.imports, functionTypes); - ret += functionSection(_module.functions, functionTypes); - ret += memorySection(); - ret += globalSection(_module.globals); - ret += exportSection(functionIDs); - - map> subModulePosAndSize; - for (auto const& [name, module]: _module.subModules) - { - // TODO should we prefix and / or shorten the name? - bytes data = BinaryTransform::run(module); - size_t const length = data.size(); - ret += customSection(name, std::move(data)); - // Skip all the previous sections and the size field of this current custom section. - size_t const offset = ret.size() - length; - subModulePosAndSize[name] = {offset, length}; - } - for (auto const& [name, data]: _module.customSections) - { - size_t const length = data.size(); - ret += customSection(name, data); - // Skip all the previous sections and the size field of this current custom section. - size_t const offset = ret.size() - length; - subModulePosAndSize[name] = {offset, length}; - } - - BinaryTransform bt( - std::move(globalIDs), - std::move(functionIDs), - std::move(functionTypes), - std::move(subModulePosAndSize) - ); - - ret += bt.codeSection(_module.functions); - return ret; -} - -bytes BinaryTransform::operator()(Literal const& _literal) -{ - return std::visit(GenericVisitor{ - [&](uint32_t _value) -> bytes { return toBytes(Opcode::I32Const) + lebEncodeSigned(static_cast(_value)); }, - [&](uint64_t _value) -> bytes { return toBytes(Opcode::I64Const) + lebEncodeSigned(static_cast(_value)); }, - }, _literal.value); -} - -bytes BinaryTransform::operator()(StringLiteral const&) -{ - // StringLiteral is a special AST element used for certain builtins. - // It is not mapped to actual WebAssembly, and should be processed in visit(BuiltinCall). - yulAssert(false, ""); -} - -bytes BinaryTransform::operator()(LocalVariable const& _variable) -{ - return toBytes(Opcode::LocalGet) + lebEncode(m_locals.at(_variable.name)); -} - -bytes BinaryTransform::operator()(GlobalVariable const& _variable) -{ - return toBytes(Opcode::GlobalGet) + lebEncode(m_globalIDs.at(_variable.name)); -} - -bytes BinaryTransform::operator()(BuiltinCall const& _call) -{ - // We need to avoid visiting the arguments of `dataoffset` and `datasize` because - // they are references to object names that should not end up in the code. - if (_call.functionName == "dataoffset") - { - string name = get(_call.arguments.at(0)).value; - // TODO: support the case where name refers to the current object - yulAssert(m_subModulePosAndSize.count(name), ""); - return toBytes(Opcode::I64Const) + lebEncodeSigned(static_cast(m_subModulePosAndSize.at(name).first)); - } - else if (_call.functionName == "datasize") - { - string name = get(_call.arguments.at(0)).value; - // TODO: support the case where name refers to the current object - yulAssert(m_subModulePosAndSize.count(name), ""); - return toBytes(Opcode::I64Const) + lebEncodeSigned(static_cast(m_subModulePosAndSize.at(name).second)); - } - - yulAssert(builtins.count(_call.functionName), "Builtin " + _call.functionName + " not found"); - // NOTE: the dialect ensures we have the right amount of arguments - bytes args = visit(_call.arguments); - bytes ret = std::move(args) + toBytes(builtins.at(_call.functionName)); - if ( - _call.functionName.find(".load") != string::npos || - _call.functionName.find(".store") != string::npos - ) - // Alignment hint and offset. Interpreters ignore the alignment. JITs/AOTs can take it - // into account to generate more efficient code but if the hint is invalid it could - // actually be more expensive. It's best to hint at 1-byte alignment if we don't plan - // to control the memory layout accordingly. - ret += bytes{{0, 0}}; // 2^0 == 1-byte alignment - - return ret; -} - -bytes BinaryTransform::operator()(FunctionCall const& _call) -{ - return visit(_call.arguments) + toBytes(Opcode::Call) + lebEncode(m_functionIDs.at(_call.functionName)); -} - -bytes BinaryTransform::operator()(LocalAssignment const& _assignment) -{ - return - std::visit(*this, *_assignment.value) + - toBytes(Opcode::LocalSet) + - lebEncode(m_locals.at(_assignment.variableName)); -} - -bytes BinaryTransform::operator()(GlobalAssignment const& _assignment) -{ - return - std::visit(*this, *_assignment.value) + - toBytes(Opcode::GlobalSet) + - lebEncode(m_globalIDs.at(_assignment.variableName)); -} - -bytes BinaryTransform::operator()(If const& _if) -{ - bytes result = - std::visit(*this, *_if.condition) + - toBytes(Opcode::If) + - toBytes(ValueType::Void); - - m_labels.emplace_back(); - - result += visit(_if.statements); - if (_if.elseStatements) - result += toBytes(Opcode::Else) + visit(*_if.elseStatements); - - m_labels.pop_back(); - - result += toBytes(Opcode::End); - return result; -} - -bytes BinaryTransform::operator()(Loop const& _loop) -{ - bytes result = toBytes(Opcode::Loop) + toBytes(ValueType::Void); - - m_labels.emplace_back(_loop.labelName); - result += visit(_loop.statements); - m_labels.pop_back(); - - result += toBytes(Opcode::End); - return result; -} - -bytes BinaryTransform::operator()(Branch const& _branch) -{ - return toBytes(Opcode::Br) + encodeLabelIdx(_branch.label.name); -} - -bytes BinaryTransform::operator()(BranchIf const& _branchIf) -{ - bytes result = std::visit(*this, *_branchIf.condition); - result += toBytes(Opcode::BrIf) + encodeLabelIdx(_branchIf.label.name); - return result; -} - -bytes BinaryTransform::operator()(Return const&) -{ - // Note that this does not work if the function returns a value. - return toBytes(Opcode::Return); -} - -bytes BinaryTransform::operator()(Block const& _block) -{ - m_labels.emplace_back(_block.labelName); - bytes result = - toBytes(Opcode::Block) + - toBytes(ValueType::Void) + - visit(_block.statements) + - toBytes(Opcode::End); - m_labels.pop_back(); - return result; -} - -bytes BinaryTransform::operator()(FunctionDefinition const& _function) -{ - bytes ret; - - vector> localEntries = groupLocalVariables(_function.locals); - ret += lebEncode(localEntries.size()); - for (pair const& entry: localEntries) - { - ret += lebEncode(entry.first); - ret += toBytes(entry.second); - } - - m_locals.clear(); - size_t varIdx = 0; - for (size_t i = 0; i < _function.parameters.size(); ++i) - m_locals[_function.parameters[i].name] = varIdx++; - for (size_t i = 0; i < _function.locals.size(); ++i) - m_locals[_function.locals[i].variableName] = varIdx++; - - yulAssert(m_labels.empty(), "Stray labels."); - - ret += visit(_function.body); - ret += toBytes(Opcode::End); - - yulAssert(m_labels.empty(), "Stray labels."); - - return prefixSize(std::move(ret)); -} - -BinaryTransform::Type BinaryTransform::typeOf(FunctionImport const& _import) -{ - return { - encodeTypes(_import.paramTypes), - encodeTypes(_import.returnType ? vector(1, *_import.returnType) : vector()) - }; -} - -BinaryTransform::Type BinaryTransform::typeOf(FunctionDefinition const& _funDef) -{ - return { - encodeTypes(_funDef.parameters), - encodeTypes(_funDef.returnType ? vector(1, *_funDef.returnType) : vector()) - }; -} - -uint8_t BinaryTransform::encodeType(wasm::Type _type) -{ - return uint8_t(toValueType(_type)); -} - -vector BinaryTransform::encodeTypes(vector const& _types) -{ - vector result; - for (wasm::Type t: _types) - result.emplace_back(encodeType(t)); - return result; -} - -vector BinaryTransform::encodeTypes(wasm::TypedNameList const& _typedNameList) -{ - vector result; - for (TypedName const& typedName: _typedNameList) - result.emplace_back(encodeType(typedName.type)); - return result; -} - -map> BinaryTransform::typeToFunctionMap( - vector const& _imports, - vector const& _functions -) -{ - map> types; - for (auto const& import: _imports) - types[typeOf(import)].emplace_back(import.internalName); - for (auto const& fun: _functions) - types[typeOf(fun)].emplace_back(fun.name); - - return types; -} - -map BinaryTransform::enumerateGlobals(Module const& _module) -{ - map globals; - for (size_t i = 0; i < _module.globals.size(); ++i) - globals[_module.globals[i].variableName] = i; - - return globals; -} - -map BinaryTransform::enumerateFunctions(Module const& _module) -{ - map functions; - size_t funID = 0; - for (FunctionImport const& fun: _module.imports) - functions[fun.internalName] = funID++; - for (FunctionDefinition const& fun: _module.functions) - functions[fun.name] = funID++; - - return functions; -} - -map BinaryTransform::enumerateFunctionTypes(map> const& _typeToFunctionMap) -{ - map functionTypes; - size_t typeID = 0; - for (vector const& funNames: _typeToFunctionMap | ranges::views::values) - { - for (string const& name: funNames) - functionTypes[name] = typeID; - ++typeID; - } - - return functionTypes; -} - -bytes BinaryTransform::typeSection(map> const& _typeToFunctionMap) -{ - bytes result; - size_t index = 0; - for (Type const& type: _typeToFunctionMap | ranges::views::keys) - { - result += toBytes(ValueType::Function); - result += lebEncode(type.first.size()) + type.first; - result += lebEncode(type.second.size()) + type.second; - - index++; - } - - return makeSection(Section::TYPE, lebEncode(index) + std::move(result)); -} - -bytes BinaryTransform::importSection( - vector const& _imports, - map const& _functionTypes -) -{ - bytes result = lebEncode(_imports.size()); - for (FunctionImport const& import: _imports) - { - uint8_t importKind = 0; // function - result += - encodeName(import.module) + - encodeName(import.externalName) + - toBytes(importKind) + - lebEncode(_functionTypes.at(import.internalName)); - } - return makeSection(Section::IMPORT, std::move(result)); -} - -bytes BinaryTransform::functionSection( - vector const& _functions, - map const& _functionTypes -) -{ - bytes result = lebEncode(_functions.size()); - for (auto const& fun: _functions) - result += lebEncode(_functionTypes.at(fun.name)); - return makeSection(Section::FUNCTION, std::move(result)); -} - -bytes BinaryTransform::memorySection() -{ - bytes result = lebEncode(1); - result.push_back(static_cast(LimitsKind::Min)); - result.push_back(1); // initial length - return makeSection(Section::MEMORY, std::move(result)); -} - -bytes BinaryTransform::globalSection(vector const& _globals) -{ - bytes result = lebEncode(_globals.size()); - for (wasm::GlobalVariableDeclaration const& global: _globals) - { - ValueType globalType = toValueType(global.type); - result += - toBytes(globalType) + - lebEncode(static_cast(Mutability::Var)) + - toBytes(constOpcodeFor(globalType)) + - lebEncodeSigned(0) + - toBytes(Opcode::End); - } - - return makeSection(Section::GLOBAL, std::move(result)); -} - -bytes BinaryTransform::exportSection(map const& _functionIDs) -{ - bool hasMain = _functionIDs.count("main"); - bytes result = lebEncode(hasMain ? 2 : 1); - result += encodeName("memory") + toBytes(Export::Memory) + lebEncode(0); - if (hasMain) - result += encodeName("main") + toBytes(Export::Function) + lebEncode(_functionIDs.at("main")); - return makeSection(Section::EXPORT, std::move(result)); -} - -bytes BinaryTransform::customSection(string const& _name, bytes _data) -{ - bytes result = encodeName(_name) + std::move(_data); - return makeSection(Section::CUSTOM, std::move(result)); -} - -bytes BinaryTransform::codeSection(vector const& _functions) -{ - bytes result = lebEncode(_functions.size()); - for (FunctionDefinition const& fun: _functions) - result += (*this)(fun); - return makeSection(Section::CODE, std::move(result)); -} - -bytes BinaryTransform::visit(vector const& _expressions) -{ - bytes result; - for (auto const& expr: _expressions) - result += std::visit(*this, expr); - return result; -} - -bytes BinaryTransform::visitReversed(vector const& _expressions) -{ - bytes result; - for (auto const& expr: _expressions | ranges::views::reverse) - result += std::visit(*this, expr); - return result; -} - -bytes BinaryTransform::encodeLabelIdx(string const& _label) const -{ - yulAssert(!_label.empty(), "Empty label."); - size_t depth = 0; - for (string const& label: m_labels | ranges::views::reverse) - if (label == _label) - return lebEncode(depth); - else - ++depth; - yulAssert(false, "Label not found."); -} - -bytes BinaryTransform::encodeName(string const& _name) -{ - // UTF-8 is allowed here by the Wasm spec, but since all names here should stem from - // Solidity or Yul identifiers or similar, non-ascii characters ending up here - // is a very bad sign. - for (char c: _name) - yulAssert(uint8_t(c) <= 0x7f, "Non-ascii character found."); - return lebEncode(_name.size()) + asBytes(_name); -} diff --git a/libyul/backends/wasm/BinaryTransform.h b/libyul/backends/wasm/BinaryTransform.h deleted file mode 100644 index d164c11bf694..000000000000 --- a/libyul/backends/wasm/BinaryTransform.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Component that transforms internal Wasm representation to binary. - */ - -#pragma once - -#include - -#include - -#include -#include - -namespace solidity::yul::wasm -{ - -/** - * Web assembly to binary transform. - */ -class BinaryTransform -{ -public: - static bytes run(Module const& _module); - - bytes operator()(wasm::Literal const& _literal); - bytes operator()(wasm::StringLiteral const& _literal); - bytes operator()(wasm::LocalVariable const& _identifier); - bytes operator()(wasm::GlobalVariable const& _identifier); - bytes operator()(wasm::BuiltinCall const& _builinCall); - bytes operator()(wasm::FunctionCall const& _functionCall); - bytes operator()(wasm::LocalAssignment const& _assignment); - bytes operator()(wasm::GlobalAssignment const& _assignment); - bytes operator()(wasm::If const& _if); - bytes operator()(wasm::Loop const& _loop); - bytes operator()(wasm::Branch const& _branch); - bytes operator()(wasm::BranchIf const& _branchIf); - bytes operator()(wasm::Return const& _return); - bytes operator()(wasm::Block const& _block); - bytes operator()(wasm::FunctionDefinition const& _function); - -private: - BinaryTransform( - std::map _globalIDs, - std::map _functionIDs, - std::map _functionTypes, - std::map> _subModulePosAndSize - ): - m_globalIDs(std::move(_globalIDs)), - m_functionIDs(std::move(_functionIDs)), - m_functionTypes(std::move(_functionTypes)), - m_subModulePosAndSize(std::move(_subModulePosAndSize)) - {} - - using Type = std::pair, std::vector>; - static Type typeOf(wasm::FunctionImport const& _import); - static Type typeOf(wasm::FunctionDefinition const& _funDef); - - static uint8_t encodeType(wasm::Type _type); - static std::vector encodeTypes(std::vector const& _types); - static std::vector encodeTypes(wasm::TypedNameList const& _typedNameList); - - static std::map> typeToFunctionMap( - std::vector const& _imports, - std::vector const& _functions - ); - - static std::map enumerateGlobals(Module const& _module); - static std::map enumerateFunctions(Module const& _module); - static std::map enumerateFunctionTypes( - std::map> const& _typeToFunctionMap - ); - - static bytes typeSection(std::map> const& _typeToFunctionMap); - static bytes importSection( - std::vector const& _imports, - std::map const& _functionTypes - ); - static bytes functionSection( - std::vector const& _functions, - std::map const& _functionTypes - ); - static bytes memorySection(); - static bytes globalSection(std::vector const& _globals); - static bytes exportSection(std::map const& _functionIDs); - static bytes customSection(std::string const& _name, bytes _data); - bytes codeSection(std::vector const& _functions); - - bytes visit(std::vector const& _expressions); - bytes visitReversed(std::vector const& _expressions); - - bytes encodeLabelIdx(std::string const& _label) const; - - static bytes encodeName(std::string const& _name); - - std::map const m_globalIDs; - std::map const m_functionIDs; - std::map const m_functionTypes; - /// The map of submodules, where the pair refers to the [offset, length]. The offset is - /// an absolute offset within the resulting assembled bytecode. - std::map> const m_subModulePosAndSize; - - std::map m_locals; - std::vector m_labels; -}; - -} - diff --git a/libyul/backends/wasm/EVMToEwasmTranslator.cpp b/libyul/backends/wasm/EVMToEwasmTranslator.cpp deleted file mode 100644 index d36b1cda3995..000000000000 --- a/libyul/backends/wasm/EVMToEwasmTranslator.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Translates Yul code from EVM dialect to Ewasm dialect. - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -// The following headers are generated from the -// yul files placed in libyul/backends/wasm/polyfill. - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace solidity; -using namespace solidity::yul; -using namespace solidity::util; -using namespace solidity::langutil; - -Object EVMToEwasmTranslator::run(Object const& _object) -{ - if (!m_polyfill) - parsePolyfill(); - - Block ast = std::get(Disambiguator(m_dialect, *_object.analysisInfo)(*_object.code)); - set reservedIdentifiers; - NameDispenser nameDispenser{m_dialect, ast, reservedIdentifiers}; - // expectedExecutionsPerDeployment is currently unused. - OptimiserStepContext context{ - m_dialect, - nameDispenser, - reservedIdentifiers, - frontend::OptimiserSettings::standard().expectedExecutionsPerDeployment - }; - - FunctionHoister::run(context, ast); - FunctionGrouper::run(context, ast); - MainFunction::run(context, ast); - ForLoopConditionIntoBody::run(context, ast); - ExpressionSplitter::run(context, ast); - WordSizeTransform::run(m_dialect, WasmDialect::instance(), ast, nameDispenser); - - NameDisplacer{nameDispenser, m_polyfillFunctions}(ast); - for (auto const& st: m_polyfill->statements) - ast.statements.emplace_back(ASTCopier{}.translate(st)); - - Object ret; - ret.name = _object.name; - ret.code = make_shared(std::move(ast)); - ret.debugData = _object.debugData; - ret.analysisInfo = make_shared(); - - ErrorList errors; - ErrorReporter errorReporter(errors); - AsmAnalyzer analyzer(*ret.analysisInfo, errorReporter, WasmDialect::instance(), {}, _object.qualifiedDataNames()); - if (!analyzer.analyze(*ret.code)) - { - string message = "Invalid code generated after EVM to wasm translation.\n"; - message += "Note that the source locations in the errors below will reference the original, not the translated code.\n"; - message += "Translated code:\n"; - message += "----------------------------------\n"; - message += ret.toString(&WasmDialect::instance()); - message += "----------------------------------\n"; - for (auto const& err: errors) - message += langutil::SourceReferenceFormatter::formatErrorInformation(*err, m_charStreamProvider); - yulAssert(false, message); - } - - for (auto const& subObjectNode: _object.subObjects) - if (Object const* subObject = dynamic_cast(subObjectNode.get())) - ret.subObjects.push_back(make_shared(run(*subObject))); - else - ret.subObjects.push_back(make_shared(dynamic_cast(*subObjectNode))); - ret.subIndexByName = _object.subIndexByName; - - return ret; -} - -void EVMToEwasmTranslator::parsePolyfill() -{ - ErrorList errors; - ErrorReporter errorReporter(errors); - CharStream charStream( - "{" + - string(solidity::yul::wasm::polyfill::Arithmetic) + - string(solidity::yul::wasm::polyfill::Bitwise) + - string(solidity::yul::wasm::polyfill::Comparison) + - string(solidity::yul::wasm::polyfill::Conversion) + - string(solidity::yul::wasm::polyfill::Interface) + - string(solidity::yul::wasm::polyfill::Keccak) + - string(solidity::yul::wasm::polyfill::Logical) + - string(solidity::yul::wasm::polyfill::Memory) + - "}", ""); - - // Passing an empty SourceLocation() here is a workaround to prevent a crash - // when compiling from yul->ewasm. We're stripping nativeLocation and - // originLocation from the AST (but we only really need to strip nativeLocation) - m_polyfill = Parser(errorReporter, WasmDialect::instance(), langutil::SourceLocation()).parse(charStream); - if (!errors.empty()) - { - string message; - for (auto const& err: errors) - message += langutil::SourceReferenceFormatter::formatErrorInformation( - *err, - SingletonCharStreamProvider(charStream) - ); - yulAssert(false, message); - } - - m_polyfillFunctions.clear(); - for (auto const& statement: m_polyfill->statements) - m_polyfillFunctions.insert(std::get(statement).name); -} diff --git a/libyul/backends/wasm/EVMToEwasmTranslator.h b/libyul/backends/wasm/EVMToEwasmTranslator.h deleted file mode 100644 index 7f95f8d138ea..000000000000 --- a/libyul/backends/wasm/EVMToEwasmTranslator.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Translates Yul code from EVM dialect to Ewasm dialect. - */ - -#pragma once - -#include -#include -#include - -namespace solidity::langutil -{ -class CharStreamProvider; -} -namespace solidity::yul -{ -struct Object; - -class EVMToEwasmTranslator: public ASTModifier -{ -public: - EVMToEwasmTranslator(Dialect const& _evmDialect, langutil::CharStreamProvider const& _charStreamProvider): - m_dialect(_evmDialect), - m_charStreamProvider(_charStreamProvider) - {} - Object run(Object const& _object); - -private: - void parsePolyfill(); - - Dialect const& m_dialect; - langutil::CharStreamProvider const& m_charStreamProvider; - - std::shared_ptr m_polyfill; - std::set m_polyfillFunctions; -}; - -} diff --git a/libyul/backends/wasm/TextTransform.cpp b/libyul/backends/wasm/TextTransform.cpp deleted file mode 100644 index 62596ba6e81b..000000000000 --- a/libyul/backends/wasm/TextTransform.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Component that transforms internal Wasm representation to text. - */ - -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include - -using namespace std; -using namespace solidity; -using namespace solidity::yul; -using namespace solidity::yul::wasm; -using namespace solidity::util; - -string TextTransform::run(wasm::Module const& _module) -{ - string ret = "(module\n"; - for (auto const& [name, module]: _module.subModules) - ret += - " ;; custom section for sub-module\n" - " ;; The Keccak-256 hash of the text representation of \"" + - name + - "\": " + - toHex(keccak256(run(module))) + - "\n" - " ;; (@custom \"" + - name + - "\" \"" + - util::toHex(BinaryTransform::run(module)) + - "\")\n"; - for (auto const& [name, data]: _module.customSections) - ret += - " ;; custom section for data\n" - " ;; (@custom \"" + - name + - "\" \"" + - util::toHex(data) + - "\")\n"; - for (wasm::FunctionImport const& imp: _module.imports) - { - ret += " (import \"" + imp.module + "\" \"" + imp.externalName + "\" (func $" + imp.internalName; - if (!imp.paramTypes.empty()) - ret += " (param" + joinHumanReadablePrefixed(imp.paramTypes | ranges::views::transform(encodeType), " ", " ") + ")"; - if (imp.returnType) - ret += " (result " + encodeType(*imp.returnType) + ")"; - ret += "))\n"; - } - - // allocate one 64k page of memory and make it available to the Ethereum client - ret += " (memory $memory (export \"memory\") 1)\n"; - for (auto const& f: _module.functions) - if (f.name == "main") - { - // export the main function - ret += " (export \"main\" (func $main))\n"; - break; - } - - for (auto const& g: _module.globals) - ret += " (global $" + g.variableName + " (mut " + encodeType(g.type) + ") (" + encodeType(g.type) + ".const 0))\n"; - ret += "\n"; - for (auto const& f: _module.functions) - ret += transform(f) + "\n"; - return std::move(ret) + ")\n"; -} - -string TextTransform::operator()(wasm::Literal const& _literal) -{ - return std::visit(GenericVisitor{ - [&](uint32_t _value) -> string { return "(i32.const " + to_string(_value) + ")"; }, - [&](uint64_t _value) -> string { return "(i64.const " + to_string(_value) + ")"; }, - }, _literal.value); -} - -string TextTransform::operator()(wasm::StringLiteral const& _literal) -{ - // StringLiteral is a special AST element used for certain builtins. - // The output of this will not be valid WebAssembly. - string quoted = boost::replace_all_copy(_literal.value, "\\", "\\\\"); - boost::replace_all(quoted, "\"", "\\\""); - return "\"" + quoted + "\""; -} - -string TextTransform::operator()(wasm::LocalVariable const& _identifier) -{ - return "(local.get $" + _identifier.name + ")"; -} - -string TextTransform::operator()(wasm::GlobalVariable const& _identifier) -{ - return "(global.get $" + _identifier.name + ")"; -} - -string TextTransform::operator()(wasm::BuiltinCall const& _builtinCall) -{ - string args = joinTransformed(_builtinCall.arguments); - string funcName = _builtinCall.functionName; - // These are prefixed in the dialect, but are actually overloaded instructions in WebAssembly. - if (funcName == "i32.drop" || funcName == "i64.drop") - funcName = "drop"; - else if (funcName == "i32.select" || funcName == "i64.select") - funcName = "select"; - return "(" + funcName + (args.empty() ? "" : " " + args) + ")"; -} - -string TextTransform::operator()(wasm::FunctionCall const& _functionCall) -{ - string args = joinTransformed(_functionCall.arguments); - return "(call $" + _functionCall.functionName + (args.empty() ? "" : " " + args) + ")"; -} - -string TextTransform::operator()(wasm::LocalAssignment const& _assignment) -{ - return "(local.set $" + _assignment.variableName + " " + visit(*_assignment.value) + ")\n"; -} - -string TextTransform::operator()(wasm::GlobalAssignment const& _assignment) -{ - return "(global.set $" + _assignment.variableName + " " + visit(*_assignment.value) + ")\n"; -} - -string TextTransform::operator()(wasm::If const& _if) -{ - string text = "(if " + visit(*_if.condition) + " (then\n" + indented(joinTransformed(_if.statements, '\n')) + ")"; - if (_if.elseStatements) - text += "(else\n" + indented(joinTransformed(*_if.elseStatements, '\n')) + ")"; - return std::move(text) + ")\n"; -} - -string TextTransform::operator()(wasm::Loop const& _loop) -{ - string label = _loop.labelName.empty() ? "" : " $" + _loop.labelName; - return "(loop" + std::move(label) + "\n" + indented(joinTransformed(_loop.statements, '\n')) + ")\n"; -} - -string TextTransform::operator()(wasm::Branch const& _branch) -{ - return "(br $" + _branch.label.name + ")\n"; -} - -string TextTransform::operator()(wasm::BranchIf const& _branchIf) -{ - return "(br_if $" + _branchIf.label.name + " " + visit(*_branchIf.condition) + ")\n"; -} - -string TextTransform::operator()(wasm::Return const&) -{ - return "(return)\n"; -} - -string TextTransform::operator()(wasm::Block const& _block) -{ - string label = _block.labelName.empty() ? "" : " $" + _block.labelName; - return "(block" + std::move(label) + "\n" + indented(joinTransformed(_block.statements, '\n')) + "\n)\n"; -} - -string TextTransform::indented(string const& _in) -{ - string replacement; - - if (!_in.empty()) - { - replacement.reserve(_in.size() + 4); - replacement += " "; - for (auto it = _in.begin(); it != _in.end(); ++it) - if (*it == '\n' && it + 1 != _in.end() && *(it + 1) != '\n') - replacement += "\n "; - else - replacement += *it; - } - return replacement; -} - -string TextTransform::transform(wasm::FunctionDefinition const& _function) -{ - string ret = "(func $" + _function.name + "\n"; - for (auto const& param: _function.parameters) - ret += " (param $" + param.name + " " + encodeType(param.type) + ")\n"; - if (_function.returnType.has_value()) - ret += " (result " + encodeType(_function.returnType.value()) + ")\n"; - for (auto const& local: _function.locals) - ret += " (local $" + local.variableName + " " + encodeType(local.type) + ")\n"; - ret += indented(joinTransformed(_function.body, '\n')); - if (ret.back() != '\n') - ret += '\n'; - ret += ")\n"; - return ret; -} - - -string TextTransform::visit(wasm::Expression const& _expression) -{ - return std::visit(*this, _expression); -} - -string TextTransform::joinTransformed(vector const& _expressions, char _separator) -{ - string ret; - for (auto const& e: _expressions) - { - string t = visit(e); - if (!t.empty() && !ret.empty() && ret.back() != '\n') - ret += _separator; - ret += std::move(t); - } - return ret; -} - -string TextTransform::encodeType(wasm::Type _type) -{ - if (_type == wasm::Type::i32) - return "i32"; - else if (_type == wasm::Type::i64) - return "i64"; - else - yulAssert(false, "Invalid wasm type"); -} diff --git a/libyul/backends/wasm/TextTransform.h b/libyul/backends/wasm/TextTransform.h deleted file mode 100644 index eb14da65d971..000000000000 --- a/libyul/backends/wasm/TextTransform.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Component that transforms internal Wasm representation to text. - */ - -#pragma once - -#include - -#include - -namespace solidity::yul -{ -struct AsmAnalysisInfo; -} - -namespace solidity::yul::wasm -{ - -class TextTransform -{ -public: - std::string run(wasm::Module const& _module); - -public: - std::string operator()(wasm::Literal const& _literal); - std::string operator()(wasm::StringLiteral const& _literal); - std::string operator()(wasm::LocalVariable const& _identifier); - std::string operator()(wasm::GlobalVariable const& _identifier); - std::string operator()(wasm::BuiltinCall const& _builinCall); - std::string operator()(wasm::FunctionCall const& _functionCall); - std::string operator()(wasm::LocalAssignment const& _assignment); - std::string operator()(wasm::GlobalAssignment const& _assignment); - std::string operator()(wasm::If const& _if); - std::string operator()(wasm::Loop const& _loop); - std::string operator()(wasm::Branch const& _branch); - std::string operator()(wasm::BranchIf const& _branchIf); - std::string operator()(wasm::Return const& _return); - std::string operator()(wasm::Block const& _block); - -private: - std::string indented(std::string const& _in); - - std::string transform(wasm::FunctionDefinition const& _function); - - std::string visit(wasm::Expression const& _expression); - std::string joinTransformed( - std::vector const& _expressions, - char _separator = ' ' - ); - - static std::string encodeType(wasm::Type _type); -}; - -} diff --git a/libyul/backends/wasm/WasmAST.h b/libyul/backends/wasm/WasmAST.h deleted file mode 100644 index 67b642ec9b88..000000000000 --- a/libyul/backends/wasm/WasmAST.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Simplified in-memory representation of a Wasm AST. - */ - -#pragma once - -#include - -#include -#include -#include -#include -#include -#include - -namespace solidity::yul::wasm -{ - -enum class Type -{ - i32, - i64, -}; - -struct TypedName { std::string name; Type type; }; -using TypedNameList = std::vector; - -struct Literal; -struct StringLiteral; -struct LocalVariable; -struct GlobalVariable; -struct FunctionCall; -struct BuiltinCall; -struct LocalAssignment; -struct GlobalAssignment; -struct Block; -struct If; -struct Loop; -struct Branch; -struct BranchIf; -struct Return; -using Expression = std::variant< - Literal, StringLiteral, LocalVariable, GlobalVariable, - FunctionCall, BuiltinCall, LocalAssignment, GlobalAssignment, - Block, If, Loop, Branch, BranchIf, Return ->; - -struct Literal { std::variant value; }; -// This is a special AST element used for certain builtins. It is not mapped to actual WebAssembly. -struct StringLiteral { std::string value; }; -struct LocalVariable { std::string name; }; -struct GlobalVariable { std::string name; }; -struct Label { std::string name; }; -struct FunctionCall { std::string functionName; std::vector arguments; }; -struct BuiltinCall { std::string functionName; std::vector arguments; }; -struct LocalAssignment { std::string variableName; std::unique_ptr value; }; -struct GlobalAssignment { std::string variableName; std::unique_ptr value; }; -struct Block { std::string labelName; std::vector statements; }; -struct If { - std::unique_ptr condition; - std::vector statements; - std::unique_ptr> elseStatements; -}; -struct Loop { std::string labelName; std::vector statements; }; -struct Branch { Label label; }; -struct Return {}; -struct BranchIf { Label label; std::unique_ptr condition; }; - -struct VariableDeclaration { std::string variableName; Type type; }; -struct GlobalVariableDeclaration { std::string variableName; Type type; }; -struct FunctionImport { - std::string module; - std::string externalName; - std::string internalName; - std::vector paramTypes; - std::optional returnType; -}; - -struct FunctionDefinition -{ - std::string name; - std::vector parameters; - std::optional returnType; - std::vector locals; - std::vector body; -}; - -/** - * Abstract representation of a wasm module. - */ -struct Module -{ - std::vector globals; - std::vector imports; - std::vector functions; - std::map subModules; - std::map customSections; -}; - -} diff --git a/libyul/backends/wasm/WasmCodeTransform.cpp b/libyul/backends/wasm/WasmCodeTransform.cpp deleted file mode 100644 index 2d895d3fe056..000000000000 --- a/libyul/backends/wasm/WasmCodeTransform.cpp +++ /dev/null @@ -1,449 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** -* Common code generator for translating Yul / inline assembly to Wasm. -*/ - -#include - -#include - -#include -#include -#include -#include - -#include - -#include -#include - -using namespace std; -using namespace solidity; -using namespace solidity::yul; -using namespace solidity::util; - -wasm::Module WasmCodeTransform::run(Dialect const& _dialect, yul::Block const& _ast) -{ - wasm::Module module; - - TypeInfo typeInfo(_dialect, _ast); - WasmCodeTransform transform(_dialect, _ast, typeInfo); - - for (auto const& statement: _ast.statements) - { - yulAssert( - holds_alternative(statement), - "Expected only function definitions at the highest level." - ); - if (holds_alternative(statement)) - module.functions.emplace_back(transform.translateFunction(std::get(statement))); - } - - for (auto& imp: transform.m_functionsToImport) - module.imports.emplace_back(std::move(imp.second)); - module.globals = transform.m_globalVariables; - - return module; -} - -wasm::Expression WasmCodeTransform::generateMultiAssignment( - vector _variableNames, - unique_ptr _firstValue -) -{ - yulAssert(!_variableNames.empty(), ""); - wasm::LocalAssignment assignment{std::move(_variableNames.front()), std::move(_firstValue)}; - - if (_variableNames.size() == 1) - return { std::move(assignment) }; - - vector typesForGlobals; - for (size_t i = 1; i < _variableNames.size(); ++i) - typesForGlobals.push_back(translatedType(m_typeInfo.typeOfVariable(YulString(_variableNames[i])))); - vector allocatedIndices = allocateGlobals(typesForGlobals); - yulAssert(allocatedIndices.size() == _variableNames.size() - 1, ""); - - wasm::Block block; - block.statements.emplace_back(std::move(assignment)); - for (size_t i = 1; i < _variableNames.size(); ++i) - block.statements.emplace_back(wasm::LocalAssignment{ - std::move(_variableNames.at(i)), - make_unique(wasm::GlobalVariable{m_globalVariables.at(allocatedIndices[i - 1]).variableName}) - }); - return { std::move(block) }; -} - -wasm::Expression WasmCodeTransform::operator()(yul::VariableDeclaration const& _varDecl) -{ - vector variableNames; - for (auto const& var: _varDecl.variables) - { - variableNames.emplace_back(var.name.str()); - m_localVariables.emplace_back(wasm::VariableDeclaration{variableNames.back(), translatedType(var.type)}); - } - - if (_varDecl.value) - return generateMultiAssignment(std::move(variableNames), visit(*_varDecl.value)); - else - return wasm::BuiltinCall{"nop", {}}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Assignment const& _assignment) -{ - vector variableNames; - for (auto const& var: _assignment.variableNames) - variableNames.emplace_back(var.name.str()); - return generateMultiAssignment(std::move(variableNames), visit(*_assignment.value)); -} - -wasm::Expression WasmCodeTransform::operator()(yul::ExpressionStatement const& _statement) -{ - return visitReturnByValue(_statement.expression); -} - -void WasmCodeTransform::importBuiltinFunction(BuiltinFunction const* _builtin, string const& _module, string const& _externalName, string const& _internalName) -{ - yulAssert(_builtin, ""); - yulAssert(_builtin->returns.size() <= 1, ""); - // Imported function, use regular call, but mark for import. - YulString internalName(_internalName); - if (!m_functionsToImport.count(internalName)) - { - wasm::FunctionImport imp{ - _module, - _externalName, - _internalName, - {}, - _builtin->returns.empty() ? nullopt : make_optional(translatedType(_builtin->returns.front())) - }; - for (auto const& param: _builtin->parameters) - imp.paramTypes.emplace_back(translatedType(param)); - m_functionsToImport[internalName] = std::move(imp); - } -} - -wasm::Expression WasmCodeTransform::operator()(yul::FunctionCall const& _call) -{ - if (BuiltinFunction const* builtin = m_dialect.builtin(_call.functionName.name)) - { - if (_call.functionName.name.str().substr(0, 6) == "debug.") - importBuiltinFunction(builtin, "debug", builtin->name.str().substr(6), builtin->name.str()); - else if (_call.functionName.name.str().substr(0, 4) == "eth.") - importBuiltinFunction(builtin, "ethereum", builtin->name.str().substr(4), builtin->name.str()); - else - { - vector arguments; - for (size_t i = 0; i < _call.arguments.size(); i++) - if (builtin->literalArgument(i)) - { - yulAssert(builtin->literalArgument(i) == LiteralKind::String, ""); - arguments.emplace_back(wasm::StringLiteral{std::get(_call.arguments[i]).value.str()}); - } - else - arguments.emplace_back(visitReturnByValue(_call.arguments[i])); - - return wasm::BuiltinCall{_call.functionName.name.str(), std::move(arguments)}; - } - } - - // If this function returns multiple values, then the first one will - // be returned in the expression itself and the others in global variables. - // The values have to be used right away in an assignment or variable declaration, - // so it is handled there. - - return wasm::FunctionCall{_call.functionName.name.str(), visit(_call.arguments)}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Identifier const& _identifier) -{ - return wasm::LocalVariable{_identifier.name.str()}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Literal const& _literal) -{ - return makeLiteral(translatedType(_literal.type), valueOfLiteral(_literal)); -} - -wasm::Expression WasmCodeTransform::operator()(yul::If const& _if) -{ - yul::Type conditionType = m_typeInfo.typeOf(*_if.condition); - - wasm::Expression condition; - if (conditionType == "i32"_yulstring) - condition = visitReturnByValue(*_if.condition); - else if (conditionType == "i64"_yulstring) - { - vector args; - args.emplace_back(visitReturnByValue(*_if.condition)); - args.emplace_back(makeLiteral(translatedType("i64"_yulstring), 0)); - - // NOTE: `if` in wasm requires an i32 argument - condition = wasm::BuiltinCall{"i64.ne", std::move(args)}; - } - else - yulAssert(false, "Invalid condition type"); - - return wasm::If{make_unique(std::move(condition)), visit(_if.body.statements), {}}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Switch const& _switch) -{ - yul::Type expressionType = m_typeInfo.typeOf(*_switch.expression); - YulString eq_instruction = YulString(expressionType.str() + ".eq"); - yulAssert(WasmDialect::instance().builtin(eq_instruction), ""); - - wasm::Block block; - string condition = m_nameDispenser.newName("condition"_yulstring).str(); - m_localVariables.emplace_back(wasm::VariableDeclaration{condition, translatedType(expressionType)}); - block.statements.emplace_back(wasm::LocalAssignment{condition, visit(*_switch.expression)}); - - vector* currentBlock = &block.statements; - for (size_t i = 0; i < _switch.cases.size(); ++i) - { - Case const& c = _switch.cases.at(i); - if (c.value) - { - wasm::BuiltinCall comparison{eq_instruction.str(), make_vector( - wasm::LocalVariable{condition}, - visitReturnByValue(*c.value) - )}; - wasm::If ifStmnt{ - make_unique(std::move(comparison)), - visit(c.body.statements), - {} - }; - vector* nextBlock = nullptr; - if (i != _switch.cases.size() - 1) - { - ifStmnt.elseStatements = make_unique>(); - nextBlock = ifStmnt.elseStatements.get(); - } - currentBlock->emplace_back(std::move(ifStmnt)); - currentBlock = nextBlock; - } - else - { - yulAssert(i == _switch.cases.size() - 1, "Default case must be last."); - *currentBlock += visit(c.body.statements); - } - } - return { std::move(block) }; -} - -wasm::Expression WasmCodeTransform::operator()(yul::FunctionDefinition const&) -{ - yulAssert(false, "Should not have visited here."); - return {}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::ForLoop const& _for) -{ - string breakLabel = newLabel(); - string continueLabel = newLabel(); - m_breakContinueLabelNames.push({breakLabel, continueLabel}); - - yul::Type conditionType = m_typeInfo.typeOf(*_for.condition); - YulString eqz_instruction = YulString(conditionType.str() + ".eqz"); - yulAssert(WasmDialect::instance().builtin(eqz_instruction), ""); - - std::vector statements = visit(_for.pre.statements); - - wasm::Loop loop; - loop.labelName = newLabel(); - loop.statements.emplace_back(wasm::BranchIf{wasm::Label{breakLabel}, make_unique( - wasm::BuiltinCall{eqz_instruction.str(), make_vector( - visitReturnByValue(*_for.condition) - )} - )}); - loop.statements.emplace_back(wasm::Block{continueLabel, visit(_for.body.statements)}); - loop.statements += visit(_for.post.statements); - loop.statements.emplace_back(wasm::Branch{wasm::Label{loop.labelName}}); - - statements += make_vector(std::move(loop)); - return wasm::Block{breakLabel, std::move(statements)}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Break const&) -{ - yulAssert(m_breakContinueLabelNames.size() > 0, ""); - return wasm::Branch{wasm::Label{m_breakContinueLabelNames.top().first}}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Continue const&) -{ - yulAssert(m_breakContinueLabelNames.size() > 0, ""); - return wasm::Branch{wasm::Label{m_breakContinueLabelNames.top().second}}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Leave const&) -{ - yulAssert(!m_functionBodyLabel.empty(), ""); - return wasm::Branch{wasm::Label{m_functionBodyLabel}}; -} - -wasm::Expression WasmCodeTransform::operator()(yul::Block const& _block) -{ - return wasm::Block{{}, visit(_block.statements)}; -} - -unique_ptr WasmCodeTransform::visit(yul::Expression const& _expression) -{ - return make_unique(std::visit(*this, _expression)); -} - -wasm::Expression WasmCodeTransform::visitReturnByValue(yul::Expression const& _expression) -{ - return std::visit(*this, _expression); -} - -vector WasmCodeTransform::visit(vector const& _expressions) -{ - vector ret; - for (auto const& e: _expressions) - ret.emplace_back(visitReturnByValue(e)); - return ret; -} - -wasm::Expression WasmCodeTransform::visit(yul::Statement const& _statement) -{ - return std::visit(*this, _statement); -} - -vector WasmCodeTransform::visit(vector const& _statements) -{ - vector ret; - for (auto const& s: _statements) - ret.emplace_back(visit(s)); - return ret; -} - -wasm::FunctionDefinition WasmCodeTransform::translateFunction(yul::FunctionDefinition const& _fun) -{ - wasm::FunctionDefinition fun; - fun.name = _fun.name.str(); - for (auto const& param: _fun.parameters) - fun.parameters.push_back({param.name.str(), translatedType(param.type)}); - for (auto const& retParam: _fun.returnVariables) - fun.locals.emplace_back(wasm::VariableDeclaration{retParam.name.str(), translatedType(retParam.type)}); - if (!_fun.returnVariables.empty()) - fun.returnType = translatedType(_fun.returnVariables[0].type); - - yulAssert(m_localVariables.empty(), ""); - yulAssert(m_functionBodyLabel.empty(), ""); - m_functionBodyLabel = newLabel(); - fun.body.emplace_back(wasm::Expression(wasm::Block{ - m_functionBodyLabel, - visit(_fun.body.statements) - })); - fun.locals += m_localVariables; - - m_localVariables.clear(); - m_functionBodyLabel = {}; - - if (!_fun.returnVariables.empty()) - { - // First return variable is returned directly, the others are stored - // in globals. - vector typesForGlobals; - for (size_t i = 1; i < _fun.returnVariables.size(); ++i) - typesForGlobals.push_back(translatedType(_fun.returnVariables[i].type)); - vector allocatedIndices = allocateGlobals(typesForGlobals); - yulAssert(allocatedIndices.size() == _fun.returnVariables.size() - 1, ""); - - for (size_t i = 1; i < _fun.returnVariables.size(); ++i) - fun.body.emplace_back(wasm::GlobalAssignment{ - m_globalVariables.at(allocatedIndices[i - 1]).variableName, - make_unique(wasm::LocalVariable{_fun.returnVariables.at(i).name.str()}) - }); - fun.body.emplace_back(wasm::LocalVariable{_fun.returnVariables.front().name.str()}); - } - return fun; -} - -string WasmCodeTransform::newLabel() -{ - return m_nameDispenser.newName("label_"_yulstring).str(); -} - -vector WasmCodeTransform::allocateGlobals(vector const& _typesForGlobals) -{ - map availableGlobals; - for (wasm::GlobalVariableDeclaration const& global: m_globalVariables) - ++availableGlobals[global.type]; - - map neededGlobals; - for (wasm::Type const& type: _typesForGlobals) - ++neededGlobals[type]; - - for (auto [type, neededGlobalCount]: neededGlobals) - while (availableGlobals[type] < neededGlobalCount) - { - m_globalVariables.emplace_back(wasm::GlobalVariableDeclaration{ - m_nameDispenser.newName("global_"_yulstring).str(), - type, - }); - - ++availableGlobals[type]; - } - - vector allocatedIndices; - map nextGlobal; - for (wasm::Type const& type: _typesForGlobals) - { - while (m_globalVariables[nextGlobal[type]].type != type) - ++nextGlobal[type]; - - allocatedIndices.push_back(nextGlobal[type]++); - } - - yulAssert(all_of( - allocatedIndices.begin(), - allocatedIndices.end(), - [this](size_t index){ return index < m_globalVariables.size(); } - ), ""); - yulAssert(allocatedIndices.size() == set(allocatedIndices.begin(), allocatedIndices.end()).size(), "Indices not unique"); - yulAssert(allocatedIndices.size() == _typesForGlobals.size(), ""); - return allocatedIndices; -} - -wasm::Type WasmCodeTransform::translatedType(yul::Type _yulType) -{ - if (_yulType == "i32"_yulstring) - return wasm::Type::i32; - else if (_yulType == "i64"_yulstring) - return wasm::Type::i64; - else - yulAssert(false, "This Yul type does not have a corresponding type in Wasm."); -} - -wasm::Literal WasmCodeTransform::makeLiteral(wasm::Type _type, u256 _value) -{ - if (_type == wasm::Type::i32) - { - yulAssert(_value <= numeric_limits::max(), "Literal too large: " + _value.str()); - return wasm::Literal{static_cast(_value)}; - } - else if (_type == wasm::Type::i64) - { - yulAssert(_value <= numeric_limits::max(), "Literal too large: " + _value.str()); - return wasm::Literal{static_cast(_value)}; - } - else - yulAssert(false, "Invalid Wasm literal type"); -} diff --git a/libyul/backends/wasm/WasmCodeTransform.h b/libyul/backends/wasm/WasmCodeTransform.h deleted file mode 100644 index 1026f17c60c5..000000000000 --- a/libyul/backends/wasm/WasmCodeTransform.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Common code generator for translating Yul / inline assembly to Wasm. - */ - -#pragma once - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -namespace solidity::yul -{ -struct AsmAnalysisInfo; - -class WasmCodeTransform -{ -public: - static wasm::Module run(Dialect const& _dialect, yul::Block const& _ast); - -public: - wasm::Expression operator()(yul::Literal const& _literal); - wasm::Expression operator()(yul::Identifier const& _identifier); - wasm::Expression operator()(yul::FunctionCall const&); - wasm::Expression operator()(yul::ExpressionStatement const& _statement); - wasm::Expression operator()(yul::Assignment const& _assignment); - wasm::Expression operator()(yul::VariableDeclaration const& _varDecl); - wasm::Expression operator()(yul::If const& _if); - wasm::Expression operator()(yul::Switch const& _switch); - wasm::Expression operator()(yul::FunctionDefinition const&); - wasm::Expression operator()(yul::ForLoop const&); - wasm::Expression operator()(yul::Break const&); - wasm::Expression operator()(yul::Continue const&); - wasm::Expression operator()(yul::Leave const&); - wasm::Expression operator()(yul::Block const& _block); - -private: - WasmCodeTransform( - Dialect const& _dialect, - Block const& _ast, - TypeInfo& _typeInfo - ): - m_dialect(_dialect), - m_nameDispenser(_dialect, _ast), - m_typeInfo(_typeInfo) - {} - - std::unique_ptr visit(yul::Expression const& _expression); - wasm::Expression visitReturnByValue(yul::Expression const& _expression); - std::vector visit(std::vector const& _expressions); - wasm::Expression visit(yul::Statement const& _statement); - std::vector visit(std::vector const& _statements); - - /// Returns an assignment or a block containing multiple assignments. - /// @param _variableNames the names of the variables to assign to - /// @param _firstValue the value to be assigned to the first variable. If there - /// is more than one variable, the values are taken from m_globalVariables. - wasm::Expression generateMultiAssignment( - std::vector _variableNames, - std::unique_ptr _firstValue - ); - - wasm::FunctionDefinition translateFunction(yul::FunctionDefinition const& _funDef); - - /// Imports an external function into the current module. - /// @param _builtin _builtin the builtin that will be imported into the current module. - /// @param _module _module the module name under which the external function can be found. - /// @param _externalName the name of the external function within the module _module. - /// @param _internalName the name of the internal function under that the external function is accessible. - void importBuiltinFunction(BuiltinFunction const* _builtin, std::string const& _module, std::string const& _externalName, std::string const& _internalName); - - std::string newLabel(); - /// Selects a subset of global variables matching specified sequence of variable types. - /// Defines more global variables of a given type if there's not enough. - std::vector allocateGlobals(std::vector const& _typesForGlobals); - - static wasm::Type translatedType(yul::Type _yulType); - static wasm::Literal makeLiteral(wasm::Type _type, u256 _value); - - Dialect const& m_dialect; - NameDispenser m_nameDispenser; - - std::vector m_localVariables; - std::vector m_globalVariables; - std::map m_functionsToImport; - std::string m_functionBodyLabel; - std::stack> m_breakContinueLabelNames; - TypeInfo& m_typeInfo; -}; - -} diff --git a/libyul/backends/wasm/WasmDialect.cpp b/libyul/backends/wasm/WasmDialect.cpp deleted file mode 100644 index b724ba69e63d..000000000000 --- a/libyul/backends/wasm/WasmDialect.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Dialects for Wasm. - */ - -#include - -#include -#include - -using namespace std; -using namespace solidity::yul; - -WasmDialect::WasmDialect() -{ - YulString i64 = "i64"_yulstring; - YulString i32 = "i32"_yulstring; - defaultType = i64; - boolType = i32; - types = {i64, i32}; - - for (auto t: types) - for (auto const& name: { - "add", - "sub", - "mul", - // TODO: div_s - "div_u", - // TODO: rem_s - "rem_u", - "and", - "or", - "xor", - "shl", - // TODO: shr_s - "shr_u", - // TODO: rotl - // TODO: rotr - }) - addFunction(t.str() + "." + name, {t, t}, {t}); - - for (auto t: types) - for (auto const& name: { - "eq", - "ne", - // TODO: lt_s - "lt_u", - // TODO: gt_s - "gt_u", - // TODO: le_s - "le_u", - // TODO: ge_s - "ge_u" - }) - addFunction(t.str() + "." + name, {t, t}, {i32}); - - addFunction("i32.eqz", {i32}, {i32}); - addFunction("i64.eqz", {i64}, {i32}); - - for (auto t: types) - for (auto const& name: { - "clz", - "ctz", - "popcnt", - }) - addFunction(t.str() + "." + name, {t}, {t}); - - addFunction("i32.wrap_i64", {i64}, {i32}); - - addFunction("i64.extend_i32_u", {i32}, {i64}); - - addFunction("i32.store", {i32, i32}, {}, false); - m_functions["i32.store"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["i32.store"_yulstring].sideEffects.otherState = SideEffects::None; - addFunction("i64.store", {i32, i64}, {}, false); - // TODO: add i32.store16, i64.store8, i64.store16, i64.store32 - m_functions["i64.store"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["i64.store"_yulstring].sideEffects.otherState = SideEffects::None; - - addFunction("i32.store8", {i32, i32}, {}, false); - m_functions["i32.store8"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["i32.store8"_yulstring].sideEffects.otherState = SideEffects::None; - - addFunction("i64.store8", {i32, i64}, {}, false); - m_functions["i64.store8"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["i64.store8"_yulstring].sideEffects.otherState = SideEffects::None; - - addFunction("i32.load", {i32}, {i32}, false); - m_functions["i32.load"_yulstring].sideEffects.canBeRemoved = true; - m_functions["i32.load"_yulstring].sideEffects.canBeRemovedIfNoMSize = true; - m_functions["i32.load"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["i32.load"_yulstring].sideEffects.memory = SideEffects::Read; - m_functions["i32.load"_yulstring].sideEffects.otherState = SideEffects::None; - addFunction("i64.load", {i32}, {i64}, false); - // TODO: add i32.load8, i32.load16, i64.load8, i64.load16, i64.load32 - m_functions["i64.load"_yulstring].sideEffects.canBeRemoved = true; - m_functions["i64.load"_yulstring].sideEffects.canBeRemovedIfNoMSize = true; - m_functions["i64.load"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["i64.load"_yulstring].sideEffects.memory = SideEffects::Read; - m_functions["i64.load"_yulstring].sideEffects.otherState = SideEffects::None; - - // Drop is actually overloaded for all types, but Yul does not support that. - // Because of that, we introduce "i32.drop" and "i64.drop". - addFunction("i32.drop", {i32}, {}); - addFunction("i64.drop", {i64}, {}); - - // Select is also overloaded. - addFunction("i32.select", {i32, i32, i32}, {i32}); - addFunction("i64.select", {i64, i64, i32}, {i64}); - - addFunction("nop", {}, {}); - addFunction("unreachable", {}, {}, false); - m_functions["unreachable"_yulstring].sideEffects.storage = SideEffects::None; - m_functions["unreachable"_yulstring].sideEffects.memory = SideEffects::None; - m_functions["unreachable"_yulstring].sideEffects.otherState = SideEffects::None; - m_functions["unreachable"_yulstring].controlFlowSideEffects.canTerminate = false; - m_functions["unreachable"_yulstring].controlFlowSideEffects.canRevert = true; - m_functions["unreachable"_yulstring].controlFlowSideEffects.canContinue = false; - - addFunction("datasize", {i64}, {i64}, true, {LiteralKind::String}); - addFunction("dataoffset", {i64}, {i64}, true, {LiteralKind::String}); - - addExternals(); -} - -BuiltinFunction const* WasmDialect::builtin(YulString _name) const -{ - auto it = m_functions.find(_name); - if (it != m_functions.end()) - return &it->second; - else - return nullptr; -} - -BuiltinFunction const* WasmDialect::discardFunction(YulString _type) const -{ - if (_type == "i32"_yulstring) - return builtin("i32.drop"_yulstring); - yulAssert(_type == "i64"_yulstring, ""); - return builtin("i64.drop"_yulstring); -} - -BuiltinFunction const* WasmDialect::equalityFunction(YulString _type) const -{ - if (_type == "i32"_yulstring) - return builtin("i32.eq"_yulstring); - yulAssert(_type == "i64"_yulstring, ""); - return builtin("i64.eq"_yulstring); -} - -WasmDialect const& WasmDialect::instance() -{ - static std::unique_ptr dialect; - static YulStringRepository::ResetCallback callback{[&] { dialect.reset(); }}; - if (!dialect) - dialect = make_unique(); - return *dialect; -} - -void WasmDialect::addExternals() -{ - // These are not YulStrings because that would be too complicated with regards - // to the YulStringRepository reset. - static string const i64{"i64"}; - static string const i32{"i32"}; - static string const i32ptr{"i32"}; // Uses "i32" on purpose. - struct External - { - string module; - string name; - vector parameters; - vector returns; - ControlFlowSideEffects controlFlowSideEffects = ControlFlowSideEffects{}; - }; - static vector externals{ - {"eth", "getAddress", {i32ptr}, {}}, - {"eth", "getExternalBalance", {i32ptr, i32ptr}, {}}, - {"eth", "getBlockBaseFee", {i32ptr}, {}}, - {"eth", "getBlockHash", {i64, i32ptr}, {i32}}, - {"eth", "call", {i64, i32ptr, i32ptr, i32ptr, i32}, {i32}}, - {"eth", "callDataCopy", {i32ptr, i32, i32}, {}}, - {"eth", "getCallDataSize", {}, {i32}}, - {"eth", "callCode", {i64, i32ptr, i32ptr, i32ptr, i32}, {i32}}, - {"eth", "callDelegate", {i64, i32ptr, i32ptr, i32}, {i32}}, - {"eth", "callStatic", {i64, i32ptr, i32ptr, i32}, {i32}}, - {"eth", "storageStore", {i32ptr, i32ptr}, {}}, - {"eth", "storageLoad", {i32ptr, i32ptr}, {}}, - {"eth", "getCaller", {i32ptr}, {}}, - {"eth", "getCallValue", {i32ptr}, {}}, - {"eth", "codeCopy", {i32ptr, i32, i32}, {}}, - {"eth", "getCodeSize", {}, {i32}}, - {"eth", "getBlockCoinbase", {i32ptr}, {}}, - {"eth", "create", {i32ptr, i32ptr, i32, i32ptr}, {i32}}, - {"eth", "getBlockDifficulty", {i32ptr}, {}}, - {"eth", "externalCodeCopy", {i32ptr, i32ptr, i32, i32}, {}}, - {"eth", "getExternalCodeSize", {i32ptr}, {i32}}, - {"eth", "getGasLeft", {}, {i64}}, - {"eth", "getBlockGasLimit", {}, {i64}}, - {"eth", "getTxGasPrice", {i32ptr}, {}}, - {"eth", "log", {i32ptr, i32, i32, i32ptr, i32ptr, i32ptr, i32ptr}, {}}, - {"eth", "getBlockNumber", {}, {i64}}, - {"eth", "getTxOrigin", {i32ptr}, {}}, - {"eth", "finish", {i32ptr, i32}, {}, ControlFlowSideEffects{true, false, false}}, - {"eth", "revert", {i32ptr, i32}, {}, ControlFlowSideEffects{false, true, false}}, - {"eth", "getReturnDataSize", {}, {i32}}, - {"eth", "returnDataCopy", {i32ptr, i32, i32}, {}}, - {"eth", "selfDestruct", {i32ptr}, {}, ControlFlowSideEffects{false, true, false}}, - {"eth", "getBlockTimestamp", {}, {i64}}, - {"debug", "print32", {i32}, {}}, - {"debug", "print64", {i64}, {}}, - {"debug", "printMem", {i32, i32}, {}}, - {"debug", "printMemHex", {i32, i32}, {}}, - {"debug", "printStorage", {i32}, {}}, - {"debug", "printStorageHex", {i32}, {}}, - }; - for (External const& ext: externals) - { - YulString name{ext.module + "." + ext.name}; - BuiltinFunction& f = m_functions[name]; - f.name = name; - for (string const& p: ext.parameters) - f.parameters.emplace_back(YulString(p)); - for (string const& p: ext.returns) - f.returns.emplace_back(YulString(p)); - // TODO some of them are side effect free. - f.sideEffects = SideEffects::worst(); - f.sideEffects.cannotLoop = true; - f.sideEffects.movableApartFromEffects = !ext.controlFlowSideEffects.terminatesOrReverts(); - f.controlFlowSideEffects = ext.controlFlowSideEffects; - f.isMSize = false; - f.literalArguments.clear(); - - static set const writesToStorage{ - "storageStore", - "call", - "callcode", - "callDelegate", - "create" - }; - static set const readsStorage{"storageLoad", "callStatic"}; - if (readsStorage.count(ext.name)) - f.sideEffects.storage = SideEffects::Read; - else if (!writesToStorage.count(ext.name)) - f.sideEffects.storage = SideEffects::None; - } -} - -void WasmDialect::addFunction( - string _name, - vector _params, - vector _returns, - bool _movable, - vector> _literalArguments -) -{ - YulString name{std::move(_name)}; - BuiltinFunction& f = m_functions[name]; - f.name = name; - f.parameters = std::move(_params); - yulAssert(_returns.size() <= 1, "The Wasm 1.0 specification only allows up to 1 return value."); - f.returns = std::move(_returns); - f.sideEffects = _movable ? SideEffects{} : SideEffects::worst(); - f.sideEffects.cannotLoop = true; - // TODO This should be improved when LoopInvariantCodeMotion gets specialized for WASM - f.sideEffects.movableApartFromEffects = _movable; - f.isMSize = false; - f.literalArguments = std::move(_literalArguments); -} diff --git a/libyul/backends/wasm/WasmDialect.h b/libyul/backends/wasm/WasmDialect.h deleted file mode 100644 index 2776c14e79f4..000000000000 --- a/libyul/backends/wasm/WasmDialect.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Dialects for Wasm. - */ - -#pragma once - -#include - -#include - -namespace solidity::yul -{ - -class YulString; -using Type = YulString; -struct FunctionCall; -struct Object; - -/** - * Yul dialect for Wasm as a backend. - * - * Builtin functions are a subset of the wasm instructions. - * - * There is a builtin function `i32.drop` that takes an i32, while `i64.drop` takes i64. - * - */ -struct WasmDialect: public Dialect -{ - WasmDialect(); - - BuiltinFunction const* builtin(YulString _name) const override; - BuiltinFunction const* discardFunction(YulString _type) const override; - BuiltinFunction const* equalityFunction(YulString _type) const override; - BuiltinFunction const* booleanNegationFunction() const override { return builtin("i32.eqz"_yulstring); } - - std::set fixedFunctionNames() const override { return {"main"_yulstring}; } - - static WasmDialect const& instance(); - -private: - void addExternals(); - - void addFunction( - std::string _name, - std::vector _params, - std::vector _returns, - bool _movable = true, - std::vector> _literalArguments = std::vector>{} - ); - - std::map m_functions; -}; - -} diff --git a/libyul/backends/wasm/WasmObjectCompiler.cpp b/libyul/backends/wasm/WasmObjectCompiler.cpp deleted file mode 100644 index bdd109d31ccf..000000000000 --- a/libyul/backends/wasm/WasmObjectCompiler.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Compiler that transforms Yul Objects to Wasm text and binary representation (Ewasm flavoured). - */ - -#include - -#include -#include -#include - -#include -#include - -#include - -using namespace solidity; -using namespace solidity::yul; -using namespace std; - -pair WasmObjectCompiler::compile(Object& _object, Dialect const& _dialect) -{ - WasmObjectCompiler compiler(_dialect); - wasm::Module module = compiler.run(_object); - return {wasm::TextTransform().run(module), wasm::BinaryTransform::run(module)}; -} - -wasm::Module WasmObjectCompiler::run(Object& _object) -{ - yulAssert(_object.analysisInfo, "No analysis info."); - yulAssert(_object.code, "No code."); - - wasm::Module module = WasmCodeTransform::run(m_dialect, *_object.code); - - for (auto& subNode: _object.subObjects) - if (Object* subObject = dynamic_cast(subNode.get())) - module.subModules[subObject->name.str()] = run(*subObject); - else if (Data* subObject = dynamic_cast(subNode.get())) - module.customSections[subObject->name.str()] = subObject->data; - else - yulAssert(false, ""); - - return module; -} diff --git a/libyul/backends/wasm/WasmObjectCompiler.h b/libyul/backends/wasm/WasmObjectCompiler.h deleted file mode 100644 index 52e48a9d5ecf..000000000000 --- a/libyul/backends/wasm/WasmObjectCompiler.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Compiler that transforms Yul Objects to Wasm text and binary representation (Ewasm flavoured). - */ - -#pragma once - -#include -#include -#include -#include // solidity::bytes - -namespace solidity::yul -{ -struct Object; -struct Dialect; -namespace wasm -{ -struct Module; -} - -class WasmObjectCompiler -{ -public: - /// Compiles the given object and returns the Wasm text and binary representation. - static std::pair compile(Object& _object, Dialect const& _dialect); -private: - WasmObjectCompiler(Dialect const& _dialect): - m_dialect(_dialect) - {} - - wasm::Module run(Object& _object); - - Dialect const& m_dialect; -}; - -} diff --git a/libyul/backends/wasm/WordSizeTransform.cpp b/libyul/backends/wasm/WordSizeTransform.cpp deleted file mode 100644 index ad723717b65a..000000000000 --- a/libyul/backends/wasm/WordSizeTransform.cpp +++ /dev/null @@ -1,433 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -using namespace std; -using namespace solidity; -using namespace solidity::yul; -using namespace solidity::util; - -void WordSizeTransform::operator()(FunctionDefinition& _fd) -{ - rewriteVarDeclList(_fd.parameters); - rewriteVarDeclList(_fd.returnVariables); - (*this)(_fd.body); -} - -void WordSizeTransform::operator()(FunctionCall& _fc) -{ - vector> const* literalArguments = nullptr; - - if (BuiltinFunction const* fun = m_inputDialect.builtin(_fc.functionName.name)) - if (!fun->literalArguments.empty()) - literalArguments = &fun->literalArguments; - - vector newArgs; - - for (size_t i = 0; i < _fc.arguments.size(); i++) - if (!literalArguments || !(*literalArguments)[i].has_value()) - newArgs += expandValueToVector(_fc.arguments[i]); - else - { - get(_fc.arguments[i]).type = m_targetDialect.defaultType; - newArgs.emplace_back(std::move(_fc.arguments[i])); - } - - _fc.arguments = std::move(newArgs); -} - -void WordSizeTransform::operator()(If& _if) -{ - _if.condition = make_unique(FunctionCall{ - debugDataOf(*_if.condition), - Identifier{debugDataOf(*_if.condition), "or_bool"_yulstring}, - expandValueToVector(*_if.condition) - }); - (*this)(_if.body); -} - -void WordSizeTransform::operator()(Switch&) -{ - yulAssert(false, "Switch statement has to be handled inside the containing block."); -} - -void WordSizeTransform::operator()(ForLoop& _for) -{ - (*this)(_for.pre); - _for.condition = make_unique(FunctionCall{ - debugDataOf(*_for.condition), - Identifier{debugDataOf(*_for.condition), "or_bool"_yulstring}, - expandValueToVector(*_for.condition) - }); - (*this)(_for.post); - (*this)(_for.body); -} - -void WordSizeTransform::operator()(Block& _block) -{ - iterateReplacing( - _block.statements, - [&](Statement& _s) -> std::optional> - { - if (holds_alternative(_s)) - { - VariableDeclaration& varDecl = std::get(_s); - - if (!varDecl.value) - rewriteVarDeclList(varDecl.variables); - else if (holds_alternative(*varDecl.value)) - { - visit(*varDecl.value); - - // Special handling for datasize and dataoffset - they will only need one variable. - if (BuiltinFunction const* f = m_inputDialect.builtin(std::get(*varDecl.value).functionName.name)) - if (f->name == "datasize"_yulstring || f->name == "dataoffset"_yulstring) - { - yulAssert(f->literalArguments.size() == 1, ""); - yulAssert(f->literalArguments.at(0) == LiteralKind::String, ""); - yulAssert(varDecl.variables.size() == 1, ""); - auto newLhs = generateU64IdentifierNames(varDecl.variables[0].name); - vector ret; - for (size_t i = 0; i < 3; i++) - ret.emplace_back(VariableDeclaration{ - varDecl.debugData, - {TypedName{varDecl.debugData, newLhs[i], m_targetDialect.defaultType}}, - make_unique(Literal{ - debugDataOf(*varDecl.value), - LiteralKind::Number, - "0"_yulstring, - m_targetDialect.defaultType - }) - }); - ret.emplace_back(VariableDeclaration{ - varDecl.debugData, - {TypedName{varDecl.debugData, newLhs[3], m_targetDialect.defaultType}}, - std::move(varDecl.value) - }); - return {std::move(ret)}; - } - - rewriteVarDeclList(varDecl.variables); - return std::nullopt; - } - else if ( - holds_alternative(*varDecl.value) || - holds_alternative(*varDecl.value) - ) - { - yulAssert(varDecl.variables.size() == 1, ""); - auto newRhs = expandValue(*varDecl.value); - auto newLhs = generateU64IdentifierNames(varDecl.variables[0].name); - vector ret; - for (size_t i = 0; i < 4; i++) - ret.emplace_back(VariableDeclaration{ - varDecl.debugData, - {TypedName{varDecl.debugData, newLhs[i], m_targetDialect.defaultType}}, - std::move(newRhs[i]) - } - ); - return {std::move(ret)}; - } - else - yulAssert(false, ""); - } - else if (holds_alternative(_s)) - { - Assignment& assignment = std::get(_s); - yulAssert(assignment.value, ""); - - if (holds_alternative(*assignment.value)) - { - visit(*assignment.value); - - // Special handling for datasize and dataoffset - they will only need one variable. - if (BuiltinFunction const* f = m_inputDialect.builtin(std::get(*assignment.value).functionName.name)) - if (f->name == "datasize"_yulstring || f->name == "dataoffset"_yulstring) - { - yulAssert(f->literalArguments.size() == 1, ""); - yulAssert(f->literalArguments[0] == LiteralKind::String, ""); - yulAssert(assignment.variableNames.size() == 1, ""); - auto newLhs = generateU64IdentifierNames(assignment.variableNames[0].name); - vector ret; - for (size_t i = 0; i < 3; i++) - ret.emplace_back(Assignment{ - assignment.debugData, - {Identifier{assignment.debugData, newLhs[i]}}, - make_unique(Literal{ - debugDataOf(*assignment.value), - LiteralKind::Number, - "0"_yulstring, - m_targetDialect.defaultType - }) - }); - ret.emplace_back(Assignment{ - assignment.debugData, - {Identifier{assignment.debugData, newLhs[3]}}, - std::move(assignment.value) - }); - return {std::move(ret)}; - } - - rewriteIdentifierList(assignment.variableNames); - return std::nullopt; - } - else if ( - holds_alternative(*assignment.value) || - holds_alternative(*assignment.value) - ) - { - yulAssert(assignment.variableNames.size() == 1, ""); - auto newRhs = expandValue(*assignment.value); - YulString lhsName = assignment.variableNames[0].name; - vector ret; - for (size_t i = 0; i < 4; i++) - ret.emplace_back(Assignment{ - assignment.debugData, - {Identifier{assignment.debugData, m_variableMapping.at(lhsName)[i]}}, - std::move(newRhs[i]) - } - ); - return {std::move(ret)}; - } - else - yulAssert(false, ""); - } - else if (holds_alternative(_s)) - return handleSwitch(std::get(_s)); - else - visit(_s); - return std::nullopt; - } - ); -} - -void WordSizeTransform::run( - Dialect const& _inputDialect, - Dialect const& _targetDialect, - Block& _ast, - NameDispenser& _nameDispenser -) -{ - // Free the name `or_bool`. - NameDisplacer{_nameDispenser, {"or_bool"_yulstring}}(_ast); - WordSizeTransform{_inputDialect, _targetDialect, _nameDispenser}(_ast); -} - -WordSizeTransform::WordSizeTransform( - Dialect const& _inputDialect, - Dialect const& _targetDialect, - NameDispenser& _nameDispenser -): - m_inputDialect(_inputDialect), - m_targetDialect(_targetDialect), - m_nameDispenser(_nameDispenser) -{ -} - -void WordSizeTransform::rewriteVarDeclList(TypedNameList& _nameList) -{ - iterateReplacing( - _nameList, - [&](TypedName const& _n) -> std::optional - { - TypedNameList ret; - for (auto newName: generateU64IdentifierNames(_n.name)) - ret.emplace_back(TypedName{_n.debugData, newName, m_targetDialect.defaultType}); - return ret; - } - ); -} - -void WordSizeTransform::rewriteIdentifierList(vector& _ids) -{ - iterateReplacing( - _ids, - [&](Identifier const& _id) -> std::optional> - { - vector ret; - for (auto newId: m_variableMapping.at(_id.name)) - ret.push_back(Identifier{_id.debugData, newId}); - return ret; - } - ); -} - -vector WordSizeTransform::handleSwitchInternal( - shared_ptr const& _debugData, - vector const& _splitExpressions, - vector _cases, - YulString _runDefaultFlag, - size_t _depth -) -{ - if (_depth == 4) - { - yulAssert(_cases.size() == 1, ""); - return std::move(_cases.front().body.statements); - } - - // Extract current 64 bit segment and group by it. - map> cases; - for (Case& c: _cases) - { - yulAssert(c.value, "Default case still present."); - cases[ - (valueOfLiteral(*c.value) >> (256 - 64 * (_depth + 1))) & - std::numeric_limits::max() - ].emplace_back(std::move(c)); - } - - Switch ret{ - _debugData, - make_unique(Identifier{_debugData, _splitExpressions.at(_depth)}), - {} - }; - - for (auto& c: cases) - { - Literal label{_debugData, LiteralKind::Number, YulString(c.first.str()), m_targetDialect.defaultType}; - ret.cases.emplace_back(Case{ - c.second.front().debugData, - make_unique(std::move(label)), - Block{_debugData, handleSwitchInternal( - _debugData, - _splitExpressions, - std::move(c.second), - _runDefaultFlag, - _depth + 1 - )} - }); - } - if (!_runDefaultFlag.empty()) - ret.cases.emplace_back(Case{ - _debugData, - nullptr, - Block{_debugData, make_vector( - Assignment{ - _debugData, - {{_debugData, _runDefaultFlag}}, - make_unique(Literal{_debugData, LiteralKind::Boolean, "true"_yulstring, m_targetDialect.boolType}) - } - )} - }); - return make_vector(std::move(ret)); -} - -std::vector WordSizeTransform::handleSwitch(Switch& _switch) -{ - for (auto& c: _switch.cases) - (*this)(c.body); - - // Turns the switch into a quadruply-nested switch plus - // a flag that tells to execute the default case after all the switches. - vector ret; - - YulString runDefaultFlag; - Case defaultCase; - if (!_switch.cases.back().value) - { - runDefaultFlag = m_nameDispenser.newName("run_default"_yulstring); - defaultCase = std::move(_switch.cases.back()); - _switch.cases.pop_back(); - ret.emplace_back(VariableDeclaration{ - _switch.debugData, - {TypedName{_switch.debugData, runDefaultFlag, m_targetDialect.boolType}}, - {} - }); - } - vector splitExpressions; - for (auto const& expr: expandValue(*_switch.expression)) - splitExpressions.emplace_back(std::get(*expr).name); - - ret += handleSwitchInternal( - _switch.debugData, - splitExpressions, - std::move(_switch.cases), - runDefaultFlag, - 0 - ); - if (!runDefaultFlag.empty()) - ret.emplace_back(If{ - _switch.debugData, - make_unique(Identifier{_switch.debugData, runDefaultFlag}), - std::move(defaultCase.body) - }); - return ret; -} - - -array WordSizeTransform::generateU64IdentifierNames(YulString const& _s) -{ - yulAssert(m_variableMapping.find(_s) == m_variableMapping.end(), ""); - for (size_t i = 0; i < 4; i++) - m_variableMapping[_s][i] = m_nameDispenser.newName(YulString{_s.str() + "_" + to_string(i)}); - return m_variableMapping[_s]; -} - -array, 4> WordSizeTransform::expandValue(Expression const& _e) -{ - array, 4> ret; - if (holds_alternative(_e)) - { - auto const& id = std::get(_e); - for (size_t i = 0; i < 4; i++) - ret[i] = make_unique(Identifier{id.debugData, m_variableMapping.at(id.name)[i]}); - } - else if (holds_alternative(_e)) - { - auto const& lit = std::get(_e); - u256 val = valueOfLiteral(lit); - for (size_t exprIndex = 0; exprIndex < 4; ++exprIndex) - { - size_t exprIndexReverse = 3 - exprIndex; - u256 currentVal = val & std::numeric_limits::max(); - val >>= 64; - ret[exprIndexReverse] = make_unique( - Literal{ - lit.debugData, - LiteralKind::Number, - YulString(currentVal.str()), - m_targetDialect.defaultType - } - ); - } - } - else - yulAssert(false, "Invalid expression to split."); - return ret; -} - -vector WordSizeTransform::expandValueToVector(Expression const& _e) -{ - vector ret; - for (unique_ptr& val: expandValue(_e)) - ret.emplace_back(std::move(*val)); - return ret; -} diff --git a/libyul/backends/wasm/WordSizeTransform.h b/libyul/backends/wasm/WordSizeTransform.h deleted file mode 100644 index faa7806a562d..000000000000 --- a/libyul/backends/wasm/WordSizeTransform.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Replace every u256 variable with four u64 variables. - */ - -#pragma once - -#include -#include - -#include - -#include -#include - -namespace solidity::yul -{ - -/** - * A stage that replace every u256 variable with four u64 variables. - * This transformation stage is required because values in EVM are 256 bits, - * but wasm only supports values up to 64 bits, so we use four u64 values to simulate - * one u256 value. - * - * For FunctionCall that accepts or returns u256 values, they accepts or returns - * four times the number of values after this transformation, with the order of significance, - * from the most significant to the least significant. - * - * For example, the FunctionCall MUL supplied by code generator - * should take 8 arguments and return 4 values (instead of 2 and 1) after this transformation. - * - * mul(a1, a2, a3, a4, b1, b2, b3, b4) -> c1, c2, c3, c4 - * - * the value of c4 should be - * ((a1*(2^192) + a2*(2^128) + a3(2^64) + a4) * (b1*(2^192) + b2*(2^128) + b3(2^64) + b4)) & ((1<<64)-1) - * - * The resulting code still uses the EVM builtin functions but assumes that they - * take four times the parameters and each of type u64. - * In addition, it uses a single other builtin function called `or_bool` that - * takes four u64 parameters and is supposed to return the logical disjunction - * of them as a i32 value. If this name is already used somewhere, it is renamed. - * - * Prerequisite: Disambiguator, ForLoopConditionIntoBody, ExpressionSplitter - */ -class WordSizeTransform: public ASTModifier -{ -public: - void operator()(FunctionDefinition&) override; - void operator()(FunctionCall&) override; - void operator()(If&) override; - void operator()(Switch&) override; - void operator()(ForLoop&) override; - void operator()(Block& _block) override; - - static void run( - Dialect const& _inputDialect, - Dialect const& _targetDialect, - Block& _ast, - NameDispenser& _nameDispenser - ); - -private: - explicit WordSizeTransform( - Dialect const& _inputDialect, - Dialect const& _targetDialect, - NameDispenser& _nameDispenser - ); - - void rewriteVarDeclList(std::vector&); - void rewriteIdentifierList(std::vector&); - - std::vector handleSwitch(Switch& _switch); - std::vector handleSwitchInternal( - std::shared_ptr const& _debugData, - std::vector const& _splitExpressions, - std::vector _cases, - YulString _runDefaultFlag, - size_t _depth - ); - - std::array generateU64IdentifierNames(YulString const& _s); - std::array, 4> expandValue(Expression const& _e); - std::vector expandValueToVector(Expression const& _e); - - Dialect const& m_inputDialect; - Dialect const& m_targetDialect; - NameDispenser& m_nameDispenser; - /// maps original u256 variable's name to corresponding u64 variables' names - std::map> m_variableMapping; -}; - -} diff --git a/libyul/backends/wasm/polyfill/Arithmetic.yul b/libyul/backends/wasm/polyfill/Arithmetic.yul deleted file mode 100644 index 7a4a80f5f1d5..000000000000 --- a/libyul/backends/wasm/polyfill/Arithmetic.yul +++ /dev/null @@ -1,396 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Arithmetic.h`. - -// returns a + y + c plus carry value on 64 bit values. -// c should be at most 1 -function add_carry(x, y, c) -> r, r_c { - let t := i64.add(x, y) - r := i64.add(t, c) - r_c := i64.extend_i32_u(i32.or( - i64.lt_u(t, x), - i64.lt_u(r, t) - )) -} - -function add(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - let carry - r4, carry := add_carry(x4, y4, 0) - r3, carry := add_carry(x3, y3, carry) - r2, carry := add_carry(x2, y2, carry) - r1, carry := add_carry(x1, y1, carry) -} - -function sub(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - // x - y = x + (~y + 1) - let carry - r4, carry := add_carry(x4, bit_negate(y4), 1) - r3, carry := add_carry(x3, bit_negate(y3), carry) - r2, carry := add_carry(x2, bit_negate(y2), carry) - r1, carry := add_carry(x1, bit_negate(y1), carry) -} - -function sub320(x1, x2, x3, x4, x5, y1, y2, y3, y4, y5) -> r1, r2, r3, r4, r5 { - // x - y = x + (~y + 1) - let carry - r5, carry := add_carry(x5, bit_negate(y5), 1) - r4, carry := add_carry(x4, bit_negate(y4), carry) - r3, carry := add_carry(x3, bit_negate(y3), carry) - r2, carry := add_carry(x2, bit_negate(y2), carry) - r1, carry := add_carry(x1, bit_negate(y1), carry) -} - -function sub512(x1, x2, x3, x4, x5, x6, x7, x8, y1, y2, y3, y4, y5, y6, y7, y8) -> r1, r2, r3, r4, r5, r6, r7, r8 { - // x - y = x + (~y + 1) - let carry - r8, carry := add_carry(x8, bit_negate(y8), 1) - r7, carry := add_carry(x7, bit_negate(y7), carry) - r6, carry := add_carry(x6, bit_negate(y6), carry) - r5, carry := add_carry(x5, bit_negate(y5), carry) - r4, carry := add_carry(x4, bit_negate(y4), carry) - r3, carry := add_carry(x3, bit_negate(y3), carry) - r2, carry := add_carry(x2, bit_negate(y2), carry) - r1, carry := add_carry(x1, bit_negate(y1), carry) -} - -// Multiplies two 64 bit values resulting in a 128 bit -// value split into two 64 bit values. -function mul_64x64_128(x, y) -> hi, lo { - let xh, xl := split(x) - let yh, yl := split(y) - let t0 := i64.mul(xl, yl) - let t1 := i64.mul(xh, yl) - let t2 := i64.mul(xl, yh) - let t3 := i64.mul(xh, yh) - let t0h, t0l := split(t0) - let u1 := i64.add(t1, t0h) - let u1h, u1l := split(u1) - let u2 := i64.add(t2, u1l) - lo := i64.or(i64.shl(u2, 32), t0l) - hi := i64.add(t3, i64.add(i64.shr_u(u2, 32), u1h)) -} - -// Multiplies two 128 bit values resulting in a 256 bit -// value split into four 64 bit values. -function mul_128x128_256(x1, x2, y1, y2) -> r1, r2, r3, r4 { - let ah, al := mul_64x64_128(x1, y1) - let bh, bl := mul_64x64_128(x1, y2) - let ch, cl := mul_64x64_128(x2, y1) - let dh, dl := mul_64x64_128(x2, y2) - r4 := dl - let carry1, carry2 - let t1, t2 - r3, carry1 := add_carry(bl, cl, 0) - r3, carry2 := add_carry(r3, dh, 0) - t1, carry1 := add_carry(bh, ch, carry1) - r2, carry2 := add_carry(t1, al, carry2) - r1 := i64.add(i64.add(ah, carry1), carry2) -} - -// Multiplies two 256 bit values resulting in a 512 bit -// value split into eight 64 bit values. -function mul_256x256_512(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4, r5, r6, r7, r8 { - let a1, a2, a3, a4 := mul_128x128_256(x1, x2, y1, y2) - let b1, b2, b3, b4 := mul_128x128_256(x1, x2, y3, y4) - let c1, c2, c3, c4 := mul_128x128_256(x3, x4, y1, y2) - let d1, d2, d3, d4 := mul_128x128_256(x3, x4, y3, y4) - r8 := d4 - r7 := d3 - let carry1, carry2 - let t1, t2 - r6, carry1 := add_carry(b4, c4, 0) - r6, carry2 := add_carry(r6, d2, 0) - r5, carry1 := add_carry(b3, c3, carry1) - r5, carry2 := add_carry(r5, d1, carry2) - r4, carry1 := add_carry(a4, b2, carry1) - r4, carry2 := add_carry(r4, c2, carry2) - r3, carry1 := add_carry(a3, b1, carry1) - r3, carry2 := add_carry(r3, c1, carry2) - r2, carry1 := add_carry(a2, carry1, carry2) - r1 := i64.add(a1, carry1) -} - -function mul(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - // TODO it would actually suffice to have mul_128x128_128 for the first two. - let b1, b2, b3, b4 := mul_128x128_256(x3, x4, y1, y2) - let c1, c2, c3, c4 := mul_128x128_256(x1, x2, y3, y4) - let d1, d2, d3, d4 := mul_128x128_256(x3, x4, y3, y4) - r4 := d4 - r3 := d3 - let t1, t2 - t1, t2, r1, r2 := add(0, 0, b3, b4, 0, 0, c3, c4) - t1, t2, r1, r2 := add(0, 0, r1, r2, 0, 0, d1, d2) -} - -function div(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - // Based on https://github.com/ewasm/evm2wasm/blob/master/wasm/DIV.wast - if iszero256(y1, y2, y3, y4) { - leave - } - - let m1 := 0 - let m2 := 0 - let m3 := 0 - let m4 := 1 - - for {} true {} { - if i32.or(i64.eqz(i64.clz(y1)), gte_256x256_64(y1, y2, y3, y4, x1, x2, x3, x4)) { - break - } - y1, y2, y3, y4 := shl_internal(1, y1, y2, y3, y4) - m1, m2, m3, m4 := shl_internal(1, m1, m2, m3, m4) - } - - for {} or_bool(m1, m2, m3, m4) {} { - if gte_256x256_64(x1, x2, x3, x4, y1, y2, y3, y4) { - x1, x2, x3, x4 := sub(x1, x2, x3, x4, y1, y2, y3, y4) - r1, r2, r3, r4 := add(r1, r2, r3, r4, m1, m2, m3, m4) - } - y1, y2, y3, y4 := shr_internal(1, y1, y2, y3, y4) - m1, m2, m3, m4 := shr_internal(1, m1, m2, m3, m4) - } -} - -function sdiv(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - // Based on https://github.com/ewasm/evm2wasm/blob/master/wasm/SDIV.wast - - let sign:i32 := i32.wrap_i64(i64.shr_u(i64.xor(x1, y1), 63)) - - if i64.eqz(i64.clz(x1)) { - x1, x2, x3, x4 := xor( - x1, x2, x3, x4, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - x1, x2, x3, x4 := add(x1, x2, x3, x4, 0, 0, 0, 1) - } - - if i64.eqz(i64.clz(y1)) { - y1, y2, y3, y4 := xor( - y1, y2, y3, y4, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - y1, y2, y3, y4 := add(y1, y2, y3, y4, 0, 0, 0, 1) - } - - r1, r2, r3, r4 := div(x1, x2, x3, x4, y1, y2, y3, y4) - - if sign { - r1, r2, r3, r4 := xor( - r1, r2, r3, r4, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - r1, r2, r3, r4 := add(r1, r2, r3, r4, 0, 0, 0, 1) - } -} - -function mod(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - // Based on https://github.com/ewasm/evm2wasm/blob/master/wasm/MOD.wast - if iszero256(y1, y2, y3, y4) { - leave - } - - r1 := x1 - r2 := x2 - r3 := x3 - r4 := x4 - - let m1 := 0 - let m2 := 0 - let m3 := 0 - let m4 := 1 - - for {} true {} { - if i32.or(i64.eqz(i64.clz(y1)), gte_256x256_64(y1, y2, y3, y4, r1, r2, r3, r4)) { - break - } - - y1, y2, y3, y4 := shl_internal(1, y1, y2, y3, y4) - m1, m2, m3, m4 := shl_internal(1, m1, m2, m3, m4) - } - - for {} or_bool(m1, m2, m3, m4) {} { - if gte_256x256_64(r1, r2, r3, r4, y1, y2, y3, y4) { - r1, r2, r3, r4 := sub(r1, r2, r3, r4, y1, y2, y3, y4) - } - - y1, y2, y3, y4 := shr_internal(1, y1, y2, y3, y4) - m1, m2, m3, m4 := shr_internal(1, m1, m2, m3, m4) - } -} - -function mod320(x1, x2, x3, x4, x5, y1, y2, y3, y4, y5) -> r1, r2, r3, r4, r5 { - // Based on https://github.com/ewasm/evm2wasm/blob/master/wasm/mod_320.wast - if iszero320(y1, y2, y3, y4, y5) { - leave - } - - let m1 := 0 - let m2 := 0 - let m3 := 0 - let m4 := 0 - let m5 := 1 - - r1 := x1 - r2 := x2 - r3 := x3 - r4 := x4 - r5 := x5 - - for {} true {} { - if i32.or(i64.eqz(i64.clz(y1)), gte_320x320_64(y1, y2, y3, y4, y5, r1, r2, r3, r4, r5)) { - break - } - y1, y2, y3, y4, y5 := shl320_internal(1, y1, y2, y3, y4, y5) - m1, m2, m3, m4, m5 := shl320_internal(1, m1, m2, m3, m4, m5) - } - - for {} or_bool_320(m1, m2, m3, m4, m5) {} { - if gte_320x320_64(r1, r2, r3, r4, r5, y1, y2, y3, y4, y5) { - r1, r2, r3, r4, r5 := sub320(r1, r2, r3, r4, r5, y1, y2, y3, y4, y5) - } - - y1, y2, y3, y4, y5 := shr320_internal(1, y1, y2, y3, y4, y5) - m1, m2, m3, m4, m5 := shr320_internal(1, m1, m2, m3, m4, m5) - } -} - -function mod512(x1, x2, x3, x4, x5, x6, x7, x8, y1, y2, y3, y4, y5, y6, y7, y8) -> r1, r2, r3, r4, r5, r6, r7, r8 { - // Based on https://github.com/ewasm/evm2wasm/blob/master/wasm/mod_512.wast - if iszero512(y1, y2, y3, y4, y5, y6, y7, y8) { - leave - } - - let m1 := 0 - let m2 := 0 - let m3 := 0 - let m4 := 0 - let m5 := 0 - let m6 := 0 - let m7 := 0 - let m8 := 1 - - r1 := x1 - r2 := x2 - r3 := x3 - r4 := x4 - r5 := x5 - r6 := x6 - r7 := x7 - r8 := x8 - - for {} true {} { - if i32.or( - i64.eqz(i64.clz(y1)), - gte_512x512_64(y1, y2, y3, y4, y5, y6, y7, y8, r1, r2, r3, r4, r5, r6, r7, r8) - ) - { - break - } - y1, y2, y3, y4, y5, y6, y7, y8 := shl512_internal(1, y1, y2, y3, y4, y5, y6, y7, y8) - m1, m2, m3, m4, m5, m6, m7, m8 := shl512_internal(1, m1, m2, m3, m4, m5, m6, m7, m8) - } - - for {} or_bool_512(m1, m2, m3, m4, m5, m6, m7, m8) {} { - if gte_512x512_64(r1, r2, r3, r4, r5, r6, r7, r8, y1, y2, y3, y4, y5, y6, y7, y8) { - r1, r2, r3, r4, r5, r6, r7, r8 := sub512(r1, r2, r3, r4, r5, r6, r7, r8, y1, y2, y3, y4, y5, y6, y7, y8) - } - - y1, y2, y3, y4, y5, y6, y7, y8 := shr512_internal(1, y1, y2, y3, y4, y5, y6, y7, y8) - m1, m2, m3, m4, m5, m6, m7, m8 := shr512_internal(1, m1, m2, m3, m4, m5, m6, m7, m8) - } -} - -function smod(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - // Based on https://github.com/ewasm/evm2wasm/blob/master/wasm/SMOD.wast - let m1 := 0 - let m2 := 0 - let m3 := 0 - let m4 := 1 - - let sign:i32 := i32.wrap_i64(i64.shr_u(x1, 63)) - - if i64.eqz(i64.clz(x1)) { - x1, x2, x3, x4 := xor( - x1, x2, x3, x4, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - x1, x2, x3, x4 := add(x1, x2, x3, x4, 0, 0, 0, 1) - } - - if i64.eqz(i64.clz(y1)) { - y1, y2, y3, y4 := xor( - y1, y2, y3, y4, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - y1, y2, y3, y4 := add(y1, y2, y3, y4, 0, 0, 0, 1) - } - - r1, r2, r3, r4 := mod(x1, x2, x3, x4, y1, y2, y3, y4) - - if sign { - r1, r2, r3, r4 := xor( - r1, r2, r3, r4, - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - r1, r2, r3, r4 := add(r1, r2, r3, r4, 0, 0, 0, 1) - } -} - -function exp(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - r4 := 1 - for {} or_bool(y1, y2, y3, y4) {} { - if i32.wrap_i64(i64.and(y4, 1)) { - r1, r2, r3, r4 := mul(r1, r2, r3, r4, x1, x2, x3, x4) - } - x1, x2, x3, x4 := mul(x1, x2, x3, x4, x1, x2, x3, x4) - y1, y2, y3, y4 := shr_internal(1, y1, y2, y3, y4) - } -} - -function addmod(x1, x2, x3, x4, y1, y2, y3, y4, m1, m2, m3, m4) -> z1, z2, z3, z4 { - let carry - z4, carry := add_carry(x4, y4, 0) - z3, carry := add_carry(x3, y3, carry) - z2, carry := add_carry(x2, y2, carry) - z1, carry := add_carry(x1, y1, carry) - - let z0 - z0, z1, z2, z3, z4 := mod320(carry, z1, z2, z3, z4, 0, m1, m2, m3, m4) -} - -function mulmod(x1, x2, x3, x4, y1, y2, y3, y4, m1, m2, m3, m4) -> z1, z2, z3, z4 { - let r1, r2, r3, r4, r5, r6, r7, r8 := mul_256x256_512(x1, x2, x3, x4, y1, y2, y3, y4) - let t1 - let t2 - let t3 - let t4 - t1, t2, t3, t4, z1, z2, z3, z4 := mod512(r1, r2, r3, r4, r5, r6, r7, r8, 0, 0, 0, 0, m1, m2, m3, m4) -} - -function signextend(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - z1 := y1 - z2 := y2 - z3 := y3 - z4 := y4 - if lt_256x256_64(x1, x2, x3, x4, 0, 0, 0, 32) { - let d := i64.mul(i64.sub(31, x4), 8) - z1, z2, z3, z4 := shl(0, 0, 0, d, z1, z2, z3, z4) - z1, z2, z3, z4 := sar(0, 0, 0, d, z1, z2, z3, z4) - } -} diff --git a/libyul/backends/wasm/polyfill/Bitwise.yul b/libyul/backends/wasm/polyfill/Bitwise.yul deleted file mode 100644 index 3efa07bf50e5..000000000000 --- a/libyul/backends/wasm/polyfill/Bitwise.yul +++ /dev/null @@ -1,222 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Bitwise.h`. - -function bit_negate(x) -> y { - y := i64.xor(x, 0xffffffffffffffff) -} - -function split(x) -> hi, lo { - hi := i64.shr_u(x, 32) - lo := i64.and(x, 0xffffffff) -} - -function shl_internal(amount, x1, x2, x3, x4) -> r1, r2, r3, r4 { - // amount < 64 - r1 := i64.add(i64.shl(x1, amount), i64.shr_u(x2, i64.sub(64, amount))) - r2 := i64.add(i64.shl(x2, amount), i64.shr_u(x3, i64.sub(64, amount))) - r3 := i64.add(i64.shl(x3, amount), i64.shr_u(x4, i64.sub(64, amount))) - r4 := i64.shl(x4, amount) -} - -function shr_internal(amount, x1, x2, x3, x4) -> r1, r2, r3, r4 { - // amount < 64 - r4 := i64.add(i64.shr_u(x4, amount), i64.shl(x3, i64.sub(64, amount))) - r3 := i64.add(i64.shr_u(x3, amount), i64.shl(x2, i64.sub(64, amount))) - r2 := i64.add(i64.shr_u(x2, amount), i64.shl(x1, i64.sub(64, amount))) - r1 := i64.shr_u(x1, amount) -} - -function shl320_internal(amount, x1, x2, x3, x4, x5) -> r1, r2, r3, r4, r5 { - // amount < 64 - r1 := i64.add(i64.shl(x1, amount), i64.shr_u(x2, i64.sub(64, amount))) - r2 := i64.add(i64.shl(x2, amount), i64.shr_u(x3, i64.sub(64, amount))) - r3 := i64.add(i64.shl(x3, amount), i64.shr_u(x4, i64.sub(64, amount))) - r4 := i64.add(i64.shl(x4, amount), i64.shr_u(x5, i64.sub(64, amount))) - r5 := i64.shl(x5, 1) -} - -function shr320_internal(amount, x1, x2, x3, x4, x5) -> r1, r2, r3, r4, r5 { - // amount < 64 - r5 := i64.add(i64.shr_u(x5, amount), i64.shl(x4, i64.sub(64, amount))) - r4 := i64.add(i64.shr_u(x4, amount), i64.shl(x3, i64.sub(64, amount))) - r3 := i64.add(i64.shr_u(x3, amount), i64.shl(x2, i64.sub(64, amount))) - r2 := i64.add(i64.shr_u(x2, amount), i64.shl(x1, i64.sub(64, amount))) - r1 := i64.shr_u(x1, 1) -} - -function shl512_internal(amount, x1, x2, x3, x4, x5, x6, x7, x8) -> r1, r2, r3, r4, r5, r6, r7, r8 { - // amount < 64 - r1 := i64.add(i64.shl(x1, amount), i64.shr_u(x2, i64.sub(64, amount))) - r2 := i64.add(i64.shl(x2, amount), i64.shr_u(x3, i64.sub(64, amount))) - r3 := i64.add(i64.shl(x3, amount), i64.shr_u(x4, i64.sub(64, amount))) - r4 := i64.add(i64.shl(x4, amount), i64.shr_u(x5, i64.sub(64, amount))) - r5 := i64.add(i64.shl(x5, amount), i64.shr_u(x6, i64.sub(64, amount))) - r6 := i64.add(i64.shl(x6, amount), i64.shr_u(x7, i64.sub(64, amount))) - r7 := i64.add(i64.shl(x7, amount), i64.shr_u(x8, i64.sub(64, amount))) - r8 := i64.shl(x8, amount) -} - -function shr512_internal(amount, x1, x2, x3, x4, x5, x6, x7, x8) -> r1, r2, r3, r4, r5, r6, r7, r8 { - // amount < 64 - r8 := i64.add(i64.shr_u(x8, amount), i64.shl(x7, i64.sub(64, amount))) - r7 := i64.add(i64.shr_u(x7, amount), i64.shl(x6, i64.sub(64, amount))) - r6 := i64.add(i64.shr_u(x6, amount), i64.shl(x5, i64.sub(64, amount))) - r5 := i64.add(i64.shr_u(x5, amount), i64.shl(x4, i64.sub(64, amount))) - r4 := i64.add(i64.shr_u(x4, amount), i64.shl(x3, i64.sub(64, amount))) - r3 := i64.add(i64.shr_u(x3, amount), i64.shl(x2, i64.sub(64, amount))) - r2 := i64.add(i64.shr_u(x2, amount), i64.shl(x1, i64.sub(64, amount))) - r1 := i64.shr_u(x1, amount) -} - -function byte(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - if i64.eqz(i64.or(i64.or(x1, x2), x3)) { - let component - switch i64.div_u(x4, 8) - case 0 { component := y1 } - case 1 { component := y2 } - case 2 { component := y3 } - case 3 { component := y4 } - x4 := i64.mul(i64.rem_u(x4, 8), 8) - r4 := i64.shr_u(component, i64.sub(56, x4)) - r4 := i64.and(0xff, r4) - } -} - -function xor(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - r1 := i64.xor(x1, y1) - r2 := i64.xor(x2, y2) - r3 := i64.xor(x3, y3) - r4 := i64.xor(x4, y4) -} - -function or(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - r1 := i64.or(x1, y1) - r2 := i64.or(x2, y2) - r3 := i64.or(x3, y3) - r4 := i64.or(x4, y4) -} - -function and(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - r1 := i64.and(x1, y1) - r2 := i64.and(x2, y2) - r3 := i64.and(x3, y3) - r4 := i64.and(x4, y4) -} - -function not(x1, x2, x3, x4) -> r1, r2, r3, r4 { - let mask := 0xffffffffffffffff - r1, r2, r3, r4 := xor(x1, x2, x3, x4, mask, mask, mask, mask) -} - -function shl_single(a, amount) -> x, y { - // amount < 64 - x := i64.shr_u(a, i64.sub(64, amount)) - y := i64.shl(a, amount) -} - -function shl(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - if i32.and(i64.eqz(x1), i64.eqz(x2)) { - if i64.eqz(x3) { - if i64.lt_u(x4, 256) { - if i64.ge_u(x4, 128) { - y1 := y3 - y2 := y4 - y3 := 0 - y4 := 0 - x4 := i64.sub(x4, 128) - } - if i64.ge_u(x4, 64) { - y1 := y2 - y2 := y3 - y3 := y4 - y4 := 0 - x4 := i64.sub(x4, 64) - } - let t, r - t, z4 := shl_single(y4, x4) - r, z3 := shl_single(y3, x4) - z3 := i64.or(z3, t) - t, z2 := shl_single(y2, x4) - z2 := i64.or(z2, r) - r, z1 := shl_single(y1, x4) - z1 := i64.or(z1, t) - } - } - } -} - -function shr_single(a, amount) -> x, y { - // amount < 64 - y := i64.shl(a, i64.sub(64, amount)) - x := i64.shr_u(a, amount) -} - -function shr(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - if i32.and(i64.eqz(x1), i64.eqz(x2)) { - if i64.eqz(x3) { - if i64.lt_u(x4, 256) { - if i64.ge_u(x4, 128) { - y4 := y2 - y3 := y1 - y2 := 0 - y1 := 0 - x4 := i64.sub(x4, 128) - } - if i64.ge_u(x4, 64) { - y4 := y3 - y3 := y2 - y2 := y1 - y1 := 0 - x4 := i64.sub(x4, 64) - } - let t - z4, t := shr_single(y4, x4) - z3, t := shr_single(y3, x4) - z4 := i64.or(z4, t) - z2, t := shr_single(y2, x4) - z3 := i64.or(z3, t) - z1, t := shr_single(y1, x4) - z2 := i64.or(z2, t) - } - } - } -} - -function sar(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - if i64.gt_u(i64.clz(y1), 0) { - z1, z2, z3, z4 := shr(x1, x2, x3, x4, y1, y2, y3, y4) - leave - } - - if gte_256x256_64(x1, x2, x3, x4, 0, 0, 0, 256) { - z1 := 0xffffffffffffffff - z2 := 0xffffffffffffffff - z3 := 0xffffffffffffffff - z4 := 0xffffffffffffffff - } - if lt_256x256_64(x1, x2, x3, x4, 0, 0, 0, 256) { - y1, y2, y3, y4 := shr(0, 0, 0, x4, y1, y2, y3, y4) - z1, z2, z3, z4 := shl( - 0, 0, 0, i64.sub(256, x4), - 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff - ) - z1, z2, z3, z4 := or(y1, y2, y3, y4, z1, z2, z3, z4) - } -} diff --git a/libyul/backends/wasm/polyfill/Comparison.yul b/libyul/backends/wasm/polyfill/Comparison.yul deleted file mode 100644 index dc052a14595d..000000000000 --- a/libyul/backends/wasm/polyfill/Comparison.yul +++ /dev/null @@ -1,168 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Comparison.h`. - -function iszero(x1, x2, x3, x4) -> r1, r2, r3, r4 { - r4 := i64.extend_i32_u(iszero256(x1, x2, x3, x4)) -} - -function iszero256(x1, x2, x3, x4) -> r:i32 { - r := i64.eqz(i64.or(i64.or(x1, x2), i64.or(x3, x4))) -} - -function iszero320(x1, x2, x3, x4, x5) -> r:i32 { - r := i64.eqz(i64.or(i64.or(i64.or(x1, x2), i64.or(x3, x4)), x5)) -} - -function iszero512(x1, x2, x3, x4, x5, x6, x7, x8) -> r:i32 { - r := i32.and(iszero256(x1, x2, x3, x4), iszero256(x5, x6, x7, x8)) -} - -function eq(x1, x2, x3, x4, y1, y2, y3, y4) -> r1, r2, r3, r4 { - r4 := i64.extend_i32_u( - i32.and( - i64.eq(x1, y1), - i32.and( - i64.eq(x2, y2), - i32.and( - i64.eq(x3, y3), - i64.eq(x4, y4) - ) - ) - ) - ) -} - -// returns 0 if a == b, -1 if a < b and 1 if a > b -function cmp(a, b) -> r:i32 { - r := i32.select(0xffffffff:i32, i64.ne(a, b), i64.lt_u(a, b)) -} - -function lt_320x320_64(x1, x2, x3, x4, x5, y1, y2, y3, y4, y5) -> z:i32 { - switch cmp(x1, y1) - case 0:i32 { - switch cmp(x2, y2) - case 0:i32 { - switch cmp(x3, y3) - case 0:i32 { - switch cmp(x4, y4) - case 0:i32 { - z := i64.lt_u(x5, y5) - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } -} - -function lt_512x512_64(x1, x2, x3, x4, x5, x6, x7, x8, y1, y2, y3, y4, y5, y6, y7, y8) -> z:i32 { - switch cmp(x1, y1) - case 0:i32 { - switch cmp(x2, y2) - case 0:i32 { - switch cmp(x3, y3) - case 0:i32 { - switch cmp(x4, y4) - case 0:i32 { - switch cmp(x5, y5) - case 0:i32 { - switch cmp(x6, y6) - case 0:i32 { - switch cmp(x7, y7) - case 0:i32 { - z := i64.lt_u(x8, y8) - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } -} - -function lt_256x256_64(x1, x2, x3, x4, y1, y2, y3, y4) -> z:i32 { - switch cmp(x1, y1) - case 0:i32 { - switch cmp(x2, y2) - case 0:i32 { - switch cmp(x3, y3) - case 0:i32 { - z := i64.lt_u(x4, y4) - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } -} - -function lt(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - z4 := i64.extend_i32_u(lt_256x256_64(x1, x2, x3, x4, y1, y2, y3, y4)) -} - -function gte_256x256_64(x1, x2, x3, x4, y1, y2, y3, y4) -> z:i32 { - z := i32.eqz(lt_256x256_64(x1, x2, x3, x4, y1, y2, y3, y4)) -} - -function gte_320x320_64(x1, x2, x3, x4, x5, y1, y2, y3, y4, y5) -> z:i32 { - z := i32.eqz(lt_320x320_64(x1, x2, x3, x4, x5, y1, y2, y3, y4, y5)) -} - -function gte_512x512_64(x1, x2, x3, x4, x5, x6, x7, x8, y1, y2, y3, y4, y5, y6, y7, y8) -> z:i32 { - z := i32.eqz(lt_512x512_64(x1, x2, x3, x4, x5, x6, x7, x8, y1, y2, y3, y4, y5, y6, y7, y8)) -} - -function gt(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - z1, z2, z3, z4 := lt(y1, y2, y3, y4, x1, x2, x3, x4) -} - -function slt(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - // TODO correct? - x1 := i64.add(x1, 0x8000000000000000) - y1 := i64.add(y1, 0x8000000000000000) - z1, z2, z3, z4 := lt(x1, x2, x3, x4, y1, y2, y3, y4) -} - -function sgt(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - z1, z2, z3, z4 := slt(y1, y2, y3, y4, x1, x2, x3, x4) -} diff --git a/libyul/backends/wasm/polyfill/Conversion.yul b/libyul/backends/wasm/polyfill/Conversion.yul deleted file mode 100644 index 17d205ddd564..000000000000 --- a/libyul/backends/wasm/polyfill/Conversion.yul +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Conversion.h`. - -function u256_to_u128(x1, x2, x3, x4) -> v1, v2 { - if i64.ne(0, i64.or(x1, x2)) { invalid() } - v2 := x4 - v1 := x3 -} - -function u256_to_i64(x1, x2, x3, x4) -> v { - if i64.ne(0, i64.or(i64.or(x1, x2), x3)) { invalid() } - v := x4 -} - -function u256_to_i32(x1, x2, x3, x4) -> v:i32 { - if i64.ne(0, i64.or(i64.or(x1, x2), x3)) { invalid() } - if i64.ne(0, i64.shr_u(x4, 32)) { invalid() } - v := i32.wrap_i64(x4) -} - -function u256_to_byte(x1, x2, x3, x4) -> v { - if i64.ne(0, i64.or(i64.or(x1, x2), x3)) { invalid() } - if i64.gt_u(x4, 255) { invalid() } - v := x4 -} - -function u256_to_i32ptr(x1, x2, x3, x4) -> v:i32 { - v := u256_to_i32(x1, x2, x3, x4) -} - -function to_internal_i32ptr(x1, x2, x3, x4) -> r:i32 { - let p:i32 := u256_to_i32ptr(x1, x2, x3, x4) - r := i32.add(p, 64:i32) - if i32.lt_u(r, p) { invalid() } -} - -function u256_to_address(x1, x2, x3, x4) -> r1, r2, r3 { - if i64.ne(0, x1) { invalid() } - if i64.ne(0, i64.shr_u(x2, 32)) { invalid() } - r1 := x2 - r2 := x3 - r3 := x4 -} - -function bswap16(x:i32) -> y:i32 { - let hi:i32 := i32.and(i32.shl(x, 8:i32), 0xff00:i32) - let lo:i32 := i32.and(i32.shr_u(x, 8:i32), 0xff:i32) - y := i32.or(hi, lo) -} - -function bswap32(x:i32) -> y:i32 { - let hi:i32 := i32.shl(bswap16(x), 16:i32) - let lo:i32 := bswap16(i32.shr_u(x, 16:i32)) - y := i32.or(hi, lo) -} - - -function bswap64(x) -> y { - let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(x))), 32) - let lo := i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(x, 32)))) - y := i64.or(hi, lo) -} diff --git a/libyul/backends/wasm/polyfill/Interface.yul b/libyul/backends/wasm/polyfill/Interface.yul deleted file mode 100644 index a840e3bb016d..000000000000 --- a/libyul/backends/wasm/polyfill/Interface.yul +++ /dev/null @@ -1,413 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Interface.h`. - -function address() -> z1, z2, z3, z4 { - eth.getAddress(12:i32) - z1, z2, z3, z4 := mload_address(0:i32) -} - -function balance(x1, x2, x3, x4) -> z1, z2, z3, z4 { - mstore_address(0:i32, x1, x2, x3, x4) - eth.getExternalBalance(12:i32, 32:i32) - z3 := i64.load(40:i32) - z4 := i64.load(32:i32) -} - -function selfbalance() -> z1, z2, z3, z4 { - // TODO: not part of current Ewasm spec - unreachable() -} - -function chainid() -> z1, z2, z3, z4 { - // TODO: not part of current Ewasm spec - unreachable() -} - -function origin() -> z1, z2, z3, z4 { - eth.getTxOrigin(12:i32) - z1, z2, z3, z4 := mload_address(0:i32) -} - -function caller() -> z1, z2, z3, z4 { - eth.getCaller(12:i32) - z1, z2, z3, z4 := mload_address(0:i32) -} - -function callvalue() -> z1, z2, z3, z4 { - eth.getCallValue(0:i32) - z3 := i64.load(8:i32) - z4 := i64.load(0:i32) -} - -function calldataload(x1, x2, x3, x4) -> z1, z2, z3, z4 { - calldatacopy(0, 0, 0, 0, x1, x2, x3, x4, 0, 0, 0, 32) - z1, z2, z3, z4 := mload_internal(0:i32) -} - -function calldatasize() -> z1, z2, z3, z4 { - z4 := i64.extend_i32_u(eth.getCallDataSize()) -} - -function calldatacopy(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4) { - let cds:i32 := eth.getCallDataSize() - let destination:i32 := u256_to_i32(x1, x2, x3, x4) - let offset:i32 := u256_to_i32(y1, y2, y3, y4) - let requested_size:i32 := u256_to_i32(z1, z2, z3, z4) - // overflow? - if i32.gt_u(offset, i32.sub(0xffffffff:i32, requested_size)) { - eth.revert(0:i32, 0:i32) - } - - let available_size:i32 := i32.sub(cds, offset) - if i32.gt_u(offset, cds) { - available_size := 0:i32 - } - - if i32.gt_u(available_size, 0:i32) { - eth.callDataCopy( - destination, - offset, - available_size - ) - } - - if i32.gt_u(requested_size, available_size) { - memset(i32.add(destination, available_size), 0:i32, i32.sub(requested_size, available_size)) - } -} - -// Needed? -function codesize() -> z1, z2, z3, z4 { - z4 := i64.extend_i32_u(eth.getCodeSize()) -} - -function codecopy(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4) { - eth.codeCopy( - to_internal_i32ptr(x1, x2, x3, x4), - u256_to_i32(y1, y2, y3, y4), - u256_to_i32(z1, z2, z3, z4) - ) -} - -function datacopy(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4) { - // TODO correct? - codecopy(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4) -} - -function gasprice() -> z1, z2, z3, z4 { - eth.getTxGasPrice(0:i32) - z3 := i64.load(8:i32) - z4 := i64.load(0:i32) -} - -function extcodesize_internal(x1, x2, x3, x4) -> r:i32 { - mstore_address(0:i32, x1, x2, x3, x4) - r := eth.getExternalCodeSize(12:i32) -} - -function extcodesize(x1, x2, x3, x4) -> z1, z2, z3, z4 { - z4 := i64.extend_i32_u(extcodesize_internal(x1, x2, x3, x4)) -} - -function extcodehash(x1, x2, x3, x4) -> z1, z2, z3, z4 { - // TODO: not part of current Ewasm spec - unreachable() -} - -function extcodecopy(a1, a2, a3, a4, p1, p2, p3, p4, o1, o2, o3, o4, l1, l2, l3, l4) { - mstore_address(0:i32, a1, a2, a3, a4) - let codeOffset:i32 := u256_to_i32(o1, o2, o3, o4) - let codeLength:i32 := u256_to_i32(l1, l2, l3, l4) - eth.externalCodeCopy(12:i32, to_internal_i32ptr(p1, p2, p3, p4), codeOffset, codeLength) -} - -function returndatasize() -> z1, z2, z3, z4 { - z4 := i64.extend_i32_u(eth.getReturnDataSize()) -} - -function returndatacopy(x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4) { - eth.returnDataCopy( - to_internal_i32ptr(x1, x2, x3, x4), - u256_to_i32(y1, y2, y3, y4), - u256_to_i32(z1, z2, z3, z4) - ) -} - -function blockhash(x1, x2, x3, x4) -> z1, z2, z3, z4 { - let r:i32 := eth.getBlockHash(u256_to_i64(x1, x2, x3, x4), 0:i32) - if i32.eqz(r) { - z1, z2, z3, z4 := mload_internal(0:i32) - } -} - -function coinbase() -> z1, z2, z3, z4 { - eth.getBlockCoinbase(12:i32) - z1, z2, z3, z4 := mload_address(0:i32) -} - -function timestamp() -> z1, z2, z3, z4 { - z4 := eth.getBlockTimestamp() -} - -function number() -> z1, z2, z3, z4 { - z4 := eth.getBlockNumber() -} - -function difficulty() -> z1, z2, z3, z4 { - eth.getBlockDifficulty(0:i32) - z1 := i64.load(24:i32) - z2 := i64.load(16:i32) - z3 := i64.load(8:i32) - z4 := i64.load(0:i32) -} - -function gaslimit() -> z1, z2, z3, z4 { - z4 := eth.getBlockGasLimit() -} - -function mload(x1, x2, x3, x4) -> z1, z2, z3, z4 { - z1, z2, z3, z4 := mload_internal(to_internal_i32ptr(x1, x2, x3, x4)) -} - -function mstore(x1, x2, x3, x4, y1, y2, y3, y4) { - mstore_internal(to_internal_i32ptr(x1, x2, x3, x4), y1, y2, y3, y4) -} - -// Needed? -function msize() -> z1, z2, z3, z4 { - // TODO implement - unreachable() -} - -function sload(x1, x2, x3, x4) -> z1, z2, z3, z4 { - mstore_internal(0:i32, x1, x2, x3, x4) - eth.storageLoad(0:i32, 32:i32) - z1, z2, z3, z4 := mload_internal(32:i32) -} - -function sstore(x1, x2, x3, x4, y1, y2, y3, y4) { - mstore_internal(0:i32, x1, x2, x3, x4) - mstore_internal(32:i32, y1, y2, y3, y4) - eth.storageStore(0:i32, 32:i32) -} - -function gas() -> z1, z2, z3, z4 { - z4 := eth.getGasLeft() -} - -function log0(p1, p2, p3, p4, s1, s2, s3, s4) { - eth.log( - to_internal_i32ptr(p1, p2, p3, p4), - u256_to_i32(s1, s2, s3, s4), - 0:i32, 0:i32, 0:i32, 0:i32, 0:i32 - ) -} - -function log1( - p1, p2, p3, p4, s1, s2, s3, s4, - t1_1, t1_2, t1_3, t1_4 -) { - eth.log( - to_internal_i32ptr(p1, p2, p3, p4), - u256_to_i32(s1, s2, s3, s4), - 1:i32, - to_internal_i32ptr(t1_1, t1_2, t1_3, t1_4), - 0:i32, 0:i32, 0:i32 - ) -} - -function log2( - p1, p2, p3, p4, s1, s2, s3, s4, - t1_1, t1_2, t1_3, t1_4, - t2_1, t2_2, t2_3, t2_4 -) { - eth.log( - to_internal_i32ptr(p1, p2, p3, p4), - u256_to_i32(s1, s2, s3, s4), - 2:i32, - to_internal_i32ptr(t1_1, t1_2, t1_3, t1_4), - to_internal_i32ptr(t2_1, t2_2, t2_3, t2_4), - 0:i32, 0:i32 - ) -} - -function log3( - p1, p2, p3, p4, s1, s2, s3, s4, - t1_1, t1_2, t1_3, t1_4, - t2_1, t2_2, t2_3, t2_4, - t3_1, t3_2, t3_3, t3_4 -) { - eth.log( - to_internal_i32ptr(p1, p2, p3, p4), - u256_to_i32(s1, s2, s3, s4), - 3:i32, - to_internal_i32ptr(t1_1, t1_2, t1_3, t1_4), - to_internal_i32ptr(t2_1, t2_2, t2_3, t2_4), - to_internal_i32ptr(t3_1, t3_2, t3_3, t3_4), - 0:i32 - ) -} - -function log4( - p1, p2, p3, p4, s1, s2, s3, s4, - t1_1, t1_2, t1_3, t1_4, - t2_1, t2_2, t2_3, t2_4, - t3_1, t3_2, t3_3, t3_4, - t4_1, t4_2, t4_3, t4_4, -) { - eth.log( - to_internal_i32ptr(p1, p2, p3, p4), - u256_to_i32(s1, s2, s3, s4), - 4:i32, - to_internal_i32ptr(t1_1, t1_2, t1_3, t1_4), - to_internal_i32ptr(t2_1, t2_2, t2_3, t2_4), - to_internal_i32ptr(t3_1, t3_2, t3_3, t3_4), - to_internal_i32ptr(t4_1, t4_2, t4_3, t4_4) - ) -} - -function create( - x1, x2, x3, x4, - y1, y2, y3, y4, - z1, z2, z3, z4 -) -> a1, a2, a3, a4 { - let v1, v2 := u256_to_u128(x1, x2, x3, x4) - mstore_internal(0:i32, 0, 0, v1, v2) - - let r:i32 := eth.create(0:i32, to_internal_i32ptr(y1, y2, y3, y4), u256_to_i32(z1, z2, z3, z4), 32:i32) - if i32.eqz(r) { - a1, a2, a3, a4 := mload_internal(32:i32) - } -} - -function call( - a1, a2, a3, a4, - b1, b2, b3, b4, - c1, c2, c3, c4, - d1, d2, d3, d4, - e1, e2, e3, e4, - f1, f2, f3, f4, - g1, g2, g3, g4 -) -> x1, x2, x3, x4 { - let g := u256_to_i64(a1, a2, a3, a4) - mstore_address(0:i32, b1, b2, b3, b4) - - let v1, v2 := u256_to_u128(c1, c2, c3, c4) - mstore_internal(32:i32, 0, 0, v1, v2) - - x4 := i64.extend_i32_u(eth.call(g, 12:i32, 32:i32, to_internal_i32ptr(d1, d2, d3, d4), u256_to_i32(e1, e2, e3, e4))) -} - -function callcode( - a1, a2, a3, a4, - b1, b2, b3, b4, - c1, c2, c3, c4, - d1, d2, d3, d4, - e1, e2, e3, e4, - f1, f2, f3, f4, - g1, g2, g3, g4 -) -> x1, x2, x3, x4 { - mstore_address(0:i32, b1, b2, b3, b4) - - let v1, v2 := u256_to_u128(c1, c2, c3, c4) - mstore_internal(32:i32, 0, 0, v1, v2) - - x4 := i64.extend_i32_u(eth.callCode( - u256_to_i64(a1, a2, a3, a4), - 12:i32, - 32:i32, - to_internal_i32ptr(d1, d2, d3, d4), - u256_to_i32(e1, e2, e3, e4) - )) -} - -function delegatecall( - a1, a2, a3, a4, - b1, b2, b3, b4, - c1, c2, c3, c4, - d1, d2, d3, d4, - e1, e2, e3, e4, - f1, f2, f3, f4 -) -> x1, x2, x3, x4 { - mstore_address(0:i32, b1, b2, b3, b4) - - x4 := i64.extend_i32_u(eth.callDelegate( - u256_to_i64(a1, a2, a3, a4), - 12:i32, - to_internal_i32ptr(c1, c2, c3, c4), - u256_to_i32(d1, d2, d3, d4) - )) -} - -function staticcall( - a1, a2, a3, a4, - b1, b2, b3, b4, - c1, c2, c3, c4, - d1, d2, d3, d4, - e1, e2, e3, e4, - f1, f2, f3, f4 -) -> x1, x2, x3, x4 { - mstore_address(0:i32, b1, b2, b3, b4) - - x4 := i64.extend_i32_u(eth.callStatic( - u256_to_i64(a1, a2, a3, a4), - 12:i32, - to_internal_i32ptr(c1, c2, c3, c4), - u256_to_i32(d1, d2, d3, d4) - )) -} - -function create2( - a1, a2, a3, a4, - b1, b2, b3, b4, - c1, c2, c3, c4, - d1, d2, d3, d4 -) -> x1, x2, x3, x4 { - // TODO: not part of current Ewasm spec - unreachable() -} - -function selfdestruct(a1, a2, a3, a4) { - mstore_address(0:i32, a1, a2, a3, a4) - // In EVM, addresses are padded to 32 bytes, so discard the first 12. - eth.selfDestruct(12:i32) -} - -function return(x1, x2, x3, x4, y1, y2, y3, y4) { - eth.finish( - to_internal_i32ptr(x1, x2, x3, x4), - u256_to_i32(y1, y2, y3, y4) - ) -} - -function revert(x1, x2, x3, x4, y1, y2, y3, y4) { - eth.revert( - to_internal_i32ptr(x1, x2, x3, x4), - u256_to_i32(y1, y2, y3, y4) - ) -} - -function invalid() { - unreachable() -} - -function stop() { - eth.finish(0:i32, 0:i32) -} diff --git a/libyul/backends/wasm/polyfill/Keccak.yul b/libyul/backends/wasm/polyfill/Keccak.yul deleted file mode 100644 index 2dae23394101..000000000000 --- a/libyul/backends/wasm/polyfill/Keccak.yul +++ /dev/null @@ -1,24 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Keccak.h`. - -function keccak256(x1, x2, x3, x4, y1, y2, y3, y4) -> z1, z2, z3, z4 { - // TODO implement - unreachable() -} diff --git a/libyul/backends/wasm/polyfill/Logical.yul b/libyul/backends/wasm/polyfill/Logical.yul deleted file mode 100644 index 8d297d3545e6..000000000000 --- a/libyul/backends/wasm/polyfill/Logical.yul +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Logical.h`. - -function or_bool(a, b, c, d) -> r:i32 { - r := i32.eqz(i64.eqz(i64.or(i64.or(a, b), i64.or(c, d)))) -} - -function or_bool_320(a, b, c, d, e) -> r:i32 { - r := i32.or(or_bool(a, b, c, 0), or_bool(d, e, 0, 0)) -} - -function or_bool_512(a, b, c, d, e, f, g, h) -> r:i32 { - r := i32.or(or_bool(a, b, c, d), or_bool(e, f, g, h)) -} diff --git a/libyul/backends/wasm/polyfill/Memory.yul b/libyul/backends/wasm/polyfill/Memory.yul deleted file mode 100644 index 410c42d8fa2b..000000000000 --- a/libyul/backends/wasm/polyfill/Memory.yul +++ /dev/null @@ -1,109 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -// NOTE: This file is used to generate `ewasmPolyfills/Memory.h`. - -function save_temp_mem_32() -> t1, t2, t3, t4 { - t1 := i64.load(0:i32) - t2 := i64.load(8:i32) - t3 := i64.load(16:i32) - t4 := i64.load(24:i32) -} - -function restore_temp_mem_32(t1, t2, t3, t4) { - i64.store(0:i32, t1) - i64.store(8:i32, t2) - i64.store(16:i32, t3) - i64.store(24:i32, t4) -} - -function save_temp_mem_64() -> t1, t2, t3, t4, t5, t6, t7, t8 { - t1 := i64.load(0:i32) - t2 := i64.load(8:i32) - t3 := i64.load(16:i32) - t4 := i64.load(24:i32) - t5 := i64.load(32:i32) - t6 := i64.load(40:i32) - t7 := i64.load(48:i32) - t8 := i64.load(54:i32) -} - -function restore_temp_mem_64(t1, t2, t3, t4, t5, t6, t7, t8) { - i64.store(0:i32, t1) - i64.store(8:i32, t2) - i64.store(16:i32, t3) - i64.store(24:i32, t4) - i64.store(32:i32, t5) - i64.store(40:i32, t6) - i64.store(48:i32, t7) - i64.store(54:i32, t8) -} - -function pop(x1, x2, x3, x4) { -} - -function memoryguard(x:i64) -> y1, y2, y3, y4 { - y4 := x -} - -// Fill `length` bytes starting from `ptr` with `value`. -function memset(ptr:i32, value:i32, length:i32) { - for { let i:i32 := 0:i32 } i32.lt_u(i, length) { i := i32.add(i, 1:i32) } - { - i32.store8(i32.add(ptr, i), value) - } -} - -// Writes 256-bits from `pos`, but only set the bottom 160-bits. -function mstore_address(pos:i32, a1, a2, a3, a4) { - a1, a2, a3 := u256_to_address(a1, a2, a3, a4) - i64.store(pos, 0:i64) - i32.store(i32.add(pos, 8:i32), 0:i32) - i32.store(i32.add(pos, 12:i32), bswap32(i32.wrap_i64(a1))) - i64.store(i32.add(pos, 16:i32), bswap64(a2)) - i64.store(i32.add(pos, 24:i32), bswap64(a3)) -} - -// Reads 256-bits from `pos`, but only returns the bottom 160-bits. -function mload_address(pos:i32) -> z1, z2, z3, z4 { - z2 := i64.extend_i32_u(bswap32(i32.load(i32.add(pos, 12:i32)))) - z3 := bswap64(i64.load(i32.add(pos, 16:i32))) - z4 := bswap64(i64.load(i32.add(pos, 24:i32))) -} - -// Writes 256-bits from `pos`. -function mstore_internal(pos:i32, y1, y2, y3, y4) { - i64.store(pos, bswap64(y1)) - i64.store(i32.add(pos, 8:i32), bswap64(y2)) - i64.store(i32.add(pos, 16:i32), bswap64(y3)) - i64.store(i32.add(pos, 24:i32), bswap64(y4)) -} - -// Reads 256-bits from `pos`. -function mload_internal(pos:i32) -> z1, z2, z3, z4 { - z1 := bswap64(i64.load(pos)) - z2 := bswap64(i64.load(i32.add(pos, 8:i32))) - z3 := bswap64(i64.load(i32.add(pos, 16:i32))) - z4 := bswap64(i64.load(i32.add(pos, 24:i32))) -} - -// Stores one byte at position `x` of value `y`. -function mstore8(x1, x2, x3, x4, y1, y2, y3, y4) { - let v := u256_to_byte(y1, y2, y3, y4) - i64.store8(to_internal_i32ptr(x1, x2, x3, x4), v) -} diff --git a/libyul/optimiser/Suite.cpp b/libyul/optimiser/Suite.cpp index 0641328f141e..e29112b01d80 100644 --- a/libyul/optimiser/Suite.cpp +++ b/libyul/optimiser/Suite.cpp @@ -70,7 +70,6 @@ #include #include -#include #include #include @@ -212,13 +211,6 @@ void OptimiserSuite::run( else if (evmDialect->providesObjectAccess() && _optimizeStackAllocation) StackLimitEvader::run(suite.m_context, _object); } - else if (dynamic_cast(&_dialect)) - { - // If the first statement is an empty block, remove it. - // We should only have function definitions after that. - if (ast.statements.size() > 1 && std::get(ast.statements.front()).statements.empty()) - ast.statements.erase(ast.statements.begin()); - } dispenser.reset(ast); NameSimplifier::run(suite.m_context, ast); diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 7da0d3bf1b1a..0f45f519630e 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -239,29 +239,6 @@ void CommandLineInterface::handleIROptimized(string const& _contractName) } } -void CommandLineInterface::handleEwasm(string const& _contractName) -{ - solAssert(CompilerInputModes.count(m_options.input.mode) == 1); - - if (!m_options.compiler.outputs.ewasm) - return; - - if (!m_options.output.dir.empty()) - { - createFile(m_compiler->filesystemFriendlyName(_contractName) + ".wast", m_compiler->ewasm(_contractName)); - createFile( - m_compiler->filesystemFriendlyName(_contractName) + ".wasm", - asString(m_compiler->ewasmObject(_contractName).bytecode) - ); - } - else - { - sout() << "Ewasm text:" << endl; - sout() << m_compiler->ewasm(_contractName) << endl; - sout() << "Ewasm binary (hex): " << m_compiler->ewasmObject(_contractName).toHex() << endl; - } -} - void CommandLineInterface::handleBytecode(string const& _contract) { solAssert(CompilerInputModes.count(m_options.input.mode) == 1); @@ -715,7 +692,6 @@ void CommandLineInterface::compile() // TODO: Perhaps we should not compile unless requested m_compiler->enableIRGeneration(m_options.compiler.outputs.ir || m_options.compiler.outputs.irOptimized); - m_compiler->enableEwasmGeneration(m_options.compiler.outputs.ewasm); m_compiler->enableEvmBytecodeGeneration( m_options.compiler.estimateGas || m_options.compiler.outputs.asm_ || @@ -1082,9 +1058,8 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y for (auto const& src: m_fileReader.sourceUnits()) { - string machine = - _targetMachine == yul::YulStack::Machine::EVM ? "EVM" : - "Ewasm"; + solAssert(_targetMachine == yul::YulStack::Machine::EVM); + string machine = "EVM"; sout() << endl << "======= " << src.first << " (" << machine << ") =======" << endl; yul::YulStack& stack = yulStacks[src.first]; @@ -1097,19 +1072,6 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y sout() << stack.print() << endl; } - if (_language != yul::YulStack::Language::Ewasm && _targetMachine == yul::YulStack::Machine::Ewasm) - { - stack.translate(yul::YulStack::Language::Ewasm); - stack.optimize(); - - if (m_options.compiler.outputs.ewasmIR) - { - sout() << endl << "==========================" << endl; - sout() << endl << "Translated source:" << endl; - sout() << stack.print() << endl; - } - } - yul::MachineAssemblyObject object; object = stack.assemble(_targetMachine); object.bytecode->link(m_options.linker.libraries); @@ -1123,11 +1085,8 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y serr() << "No binary representation found." << endl; } - solAssert(_targetMachine == yul::YulStack::Machine::Ewasm || _targetMachine == yul::YulStack::Machine::EVM, ""); - if ( - (_targetMachine == yul::YulStack::Machine::EVM && m_options.compiler.outputs.asm_) || - (_targetMachine == yul::YulStack::Machine::Ewasm && m_options.compiler.outputs.ewasm) - ) + solAssert(_targetMachine == yul::YulStack::Machine::EVM, ""); + if (m_options.compiler.outputs.asm_) { sout() << endl << "Text representation:" << endl; if (!object.assembly.empty()) @@ -1183,7 +1142,6 @@ void CommandLineInterface::outputCompilationResults() handleBytecode(contract); handleIR(contract); handleIROptimized(contract); - handleEwasm(contract); handleSignatureHashes(contract); handleMetadata(contract); handleABI(contract); diff --git a/solc/CommandLineInterface.h b/solc/CommandLineInterface.h index 80b4bee6fb2c..b6d7f92a8c63 100644 --- a/solc/CommandLineInterface.h +++ b/solc/CommandLineInterface.h @@ -102,7 +102,6 @@ class CommandLineInterface void handleOpcode(std::string const& _contract); void handleIR(std::string const& _contract); void handleIROptimized(std::string const& _contract); - void handleEwasm(std::string const& _contract); void handleBytecode(std::string const& _contract); void handleSignatureHashes(std::string const& _contract); void handleMetadata(std::string const& _contract); diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index a3e7829660f1..1f11fc57c0d7 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -46,7 +46,6 @@ static string const g_strCombinedJson = "combined-json"; static string const g_strErrorRecovery = "error-recovery"; static string const g_strEVM = "evm"; static string const g_strEVMVersion = "evm-version"; -static string const g_strEwasm = "ewasm"; static string const g_strEOFVersion = "experimental-eof-version"; static string const g_strViaIR = "via-ir"; static string const g_strExperimentalViaIR = "experimental-via-ir"; @@ -114,15 +113,13 @@ static string const g_strErrorIds = "error-codes"; /// Possible arguments to for --machine static set const g_machineArgs { - g_strEVM, - g_strEwasm + g_strEVM }; /// Possible arguments to for --yul-dialect static set const g_yulDialectArgs { - g_strEVM, - g_strEwasm + g_strEVM }; /// Possible arguments to for --metadata-hash @@ -460,13 +457,11 @@ void CommandLineParser::parseOutputSelection() CompilerOutputs::componentMap() | ranges::views::keys | ranges::to() - ) - set{CompilerOutputs::componentName(&CompilerOutputs::ewasmIR)}; + ); static set const assemblerModeOutputs = { CompilerOutputs::componentName(&CompilerOutputs::asm_), CompilerOutputs::componentName(&CompilerOutputs::binary), - CompilerOutputs::componentName(&CompilerOutputs::irOptimized), - CompilerOutputs::componentName(&CompilerOutputs::ewasm), - CompilerOutputs::componentName(&CompilerOutputs::ewasmIR), + CompilerOutputs::componentName(&CompilerOutputs::irOptimized) }; switch (_mode) @@ -499,8 +494,6 @@ void CommandLineParser::parseOutputSelection() m_options.compiler.outputs.asm_ = true; m_options.compiler.outputs.binary = true; m_options.compiler.outputs.irOptimized = true; - m_options.compiler.outputs.ewasm = true; - m_options.compiler.outputs.ewasmIR = true; } vector unsupportedOutputs; @@ -743,8 +736,6 @@ General Information)").c_str(), (CompilerOutputs::componentName(&CompilerOutputs::abi).c_str(), "ABI specification of the contracts.") (CompilerOutputs::componentName(&CompilerOutputs::ir).c_str(), "Intermediate Representation (IR) of all contracts.") (CompilerOutputs::componentName(&CompilerOutputs::irOptimized).c_str(), "Optimized intermediate Representation (IR) of all contracts.") - (CompilerOutputs::componentName(&CompilerOutputs::ewasm).c_str(), "Ewasm text representation of all contracts (EXPERIMENTAL).") - (CompilerOutputs::componentName(&CompilerOutputs::ewasmIR).c_str(), "Intermediate representation (IR) converted to a form that can be translated directly into Ewasm text representation (EXPERIMENTAL).") (CompilerOutputs::componentName(&CompilerOutputs::signatureHashes).c_str(), "Function signature hashes of the contracts.") (CompilerOutputs::componentName(&CompilerOutputs::natspecUser).c_str(), "Natspec user documentation of all contracts.") (CompilerOutputs::componentName(&CompilerOutputs::natspecDev).c_str(), "Natspec developer documentation of all contracts.") @@ -1001,8 +992,6 @@ void CommandLineParser::processArgs() CompilerOutputs::componentName(&CompilerOutputs::binary), CompilerOutputs::componentName(&CompilerOutputs::ir), CompilerOutputs::componentName(&CompilerOutputs::irOptimized), - CompilerOutputs::componentName(&CompilerOutputs::ewasm), - CompilerOutputs::componentName(&CompilerOutputs::ewasmIR), g_strGas, CompilerOutputs::componentName(&CompilerOutputs::asm_), CompilerOutputs::componentName(&CompilerOutputs::asmJson), @@ -1215,42 +1204,22 @@ void CommandLineParser::processArgs() string machine = m_args[g_strMachine].as(); if (machine == g_strEVM) m_options.assembly.targetMachine = Machine::EVM; - else if (machine == g_strEwasm) - m_options.assembly.targetMachine = Machine::Ewasm; else solThrow(CommandLineValidationError, "Invalid option for --" + g_strMachine + ": " + machine); } - if (m_options.assembly.targetMachine == Machine::Ewasm && m_options.assembly.inputLanguage == Input::StrictAssembly) - m_options.assembly.inputLanguage = Input::Ewasm; if (m_args.count(g_strYulDialect)) { string dialect = m_args[g_strYulDialect].as(); if (dialect == g_strEVM) m_options.assembly.inputLanguage = Input::StrictAssembly; - else if (dialect == g_strEwasm) - { - m_options.assembly.inputLanguage = Input::Ewasm; - if (m_options.assembly.targetMachine != Machine::Ewasm) - solThrow( - CommandLineValidationError, - "If you select Ewasm as --" + g_strYulDialect + ", " - "--" + g_strMachine + " has to be Ewasm as well." - ); - } else solThrow(CommandLineValidationError, "Invalid option for --" + g_strYulDialect + ": " + dialect); } - if (m_options.optimizer.enabled && (m_options.assembly.inputLanguage != Input::StrictAssembly && m_options.assembly.inputLanguage != Input::Ewasm)) + if (m_options.optimizer.enabled && (m_options.assembly.inputLanguage != Input::StrictAssembly)) solThrow( CommandLineValidationError, "Optimizer can only be used for strict assembly. Use --" + g_strStrictAssembly + "." ); - if (m_options.assembly.targetMachine == Machine::Ewasm && m_options.assembly.inputLanguage != Input::StrictAssembly && m_options.assembly.inputLanguage != Input::Ewasm) - solThrow( - CommandLineValidationError, - "The selected input language is not directly supported when targeting the Ewasm machine " - "and automatic translation is not available." - ); return; } else if (countEnabledOptions({g_strYulDialect, g_strMachine}) >= 1) diff --git a/solc/CommandLineParser.h b/solc/CommandLineParser.h index 51efc9e40828..9bfae034625e 100644 --- a/solc/CommandLineParser.h +++ b/solc/CommandLineParser.h @@ -78,8 +78,6 @@ struct CompilerOutputs {"abi", &CompilerOutputs::abi}, {"ir", &CompilerOutputs::ir}, {"ir-optimized", &CompilerOutputs::irOptimized}, - {"ewasm", &CompilerOutputs::ewasm}, - {"ewasm-ir", &CompilerOutputs::ewasmIR}, {"hashes", &CompilerOutputs::signatureHashes}, {"userdoc", &CompilerOutputs::natspecUser}, {"devdoc", &CompilerOutputs::natspecDev}, @@ -98,8 +96,6 @@ struct CompilerOutputs bool abi = false; bool ir = false; bool irOptimized = false; - bool ewasm = false; - bool ewasmIR = false; bool signatureHashes = false; bool natspecUser = false; bool natspecDev = false; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9a2c78fd8c1b..9a3fa84b490f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -135,8 +135,6 @@ set(libyul_sources libyul/ControlFlowSideEffectsTest.h libyul/EVMCodeTransformTest.cpp libyul/EVMCodeTransformTest.h - libyul/EwasmTranslationTest.cpp - libyul/EwasmTranslationTest.h libyul/FunctionSideEffects.cpp libyul/FunctionSideEffects.h libyul/Inliner.cpp diff --git a/test/Common.cpp b/test/Common.cpp index 3af23c782783..72e4d13e8f6f 100644 --- a/test/Common.cpp +++ b/test/Common.cpp @@ -108,13 +108,11 @@ void CommonOptions::addOptions() ("eof-version", po::value()->implicit_value(1u), "which EOF version to use") ("testpath", po::value(&this->testPath)->default_value(solidity::test::testPath()), "path to test files") ("vm", po::value>(&vmPaths), "path to evmc library, can be supplied multiple times.") - ("ewasm", po::bool_switch(&ewasm)->default_value(ewasm), "tries to automatically find an ewasm vm and enable ewasm test-execution.") ("batches", po::value(&this->batches)->default_value(1), "set number of batches to split the tests into") ("selected-batch", po::value(&this->selectedBatch)->default_value(0), "zero-based number of batch to execute") ("no-semantic-tests", po::bool_switch(&disableSemanticTests)->default_value(disableSemanticTests), "disable semantic tests") ("no-smt", po::bool_switch(&disableSMT)->default_value(disableSMT), "disable SMT checker") ("optimize", po::bool_switch(&optimize)->default_value(optimize), "enables optimization") - ("enforce-compile-to-ewasm", po::bool_switch(&enforceCompileToEwasm)->default_value(enforceCompileToEwasm), "Enforce compiling all tests to Ewasm to see if additional tests can be activated.") ("enforce-gas-cost", po::value(&enforceGasTest)->default_value(enforceGasTest)->implicit_value(true), "Enforce checking gas cost in semantic tests.") ("enforce-gas-cost-min-value", po::value(&enforceGasTestMinValue)->default_value(enforceGasTestMinValue), "Threshold value to enforce adding gas checks to a test.") ("abiencoderv1", po::bool_switch(&useABIEncoderV1)->default_value(useABIEncoderV1), "enables abi encoder v1") @@ -209,14 +207,6 @@ bool CommonOptions::parse(int argc, char const* const* argv) vmPaths.emplace_back(*repoPath); else vmPaths.emplace_back(evmoneFilename); - if (ewasm) { - if (auto envPath = getenv("ETH_HERA")) - vmPaths.emplace_back(envPath); - else if (auto repoPath = findInDefaultPath(heraFilename)) - vmPaths.emplace_back(*repoPath); - else - vmPaths.emplace_back(heraFilename); - } } return true; @@ -234,8 +224,6 @@ string CommonOptions::toString(vector const& _selectedOptions) const {"optimize", boolToString(optimize)}, {"useABIEncoderV1", boolToString(useABIEncoderV1)}, {"batch", to_string(selectedBatch + 1) + "/" + to_string(batches)}, - {"ewasm", boolToString(ewasm)}, - {"enforceCompileToEwasm", boolToString(enforceCompileToEwasm)}, {"enforceGasTest", boolToString(enforceGasTest)}, {"enforceGasTestMinValue", enforceGasTestMinValue.str()}, {"disableSemanticTests", boolToString(disableSemanticTests)}, @@ -303,10 +291,10 @@ bool isValidSemanticTestPath(boost::filesystem::path const& _testPath) bool loadVMs(CommonOptions const& _options) { - if (_options.disableSemanticTests && !_options.ewasm) + if (_options.disableSemanticTests) return true; - auto [evmSupported, ewasmSupported] = solidity::test::EVMHost::checkVmPaths(_options.vmPaths); + bool evmSupported = solidity::test::EVMHost::checkVmPaths(_options.vmPaths); if (!_options.disableSemanticTests && !evmSupported) { std::cerr << "Unable to find " << solidity::test::evmoneFilename; @@ -315,14 +303,6 @@ bool loadVMs(CommonOptions const& _options) std::cerr << solidity::test::evmoneDownloadLink << std::endl; return false; } - if (_options.ewasm && !ewasmSupported) - { - std::cerr << "Unable to find " << solidity::test::heraFilename; - std::cerr << ". To be able to enable ewasm tests, please provide the path using --vm ." << std::endl; - std::cerr << "You can download it at" << std::endl; - std::cerr << solidity::test::heraDownloadLink << std::endl; - return false; - } return true; } diff --git a/test/Common.h b/test/Common.h index 468e5af645d3..d82ff9c6b71f 100644 --- a/test/Common.h +++ b/test/Common.h @@ -34,18 +34,12 @@ namespace solidity::test #ifdef _WIN32 static constexpr auto evmoneFilename = "evmone.dll"; static constexpr auto evmoneDownloadLink = "https://github.com/ethereum/evmone/releases/download/v0.10.0/evmone-0.10.0-windows-amd64.zip"; -static constexpr auto heraFilename = "hera.dll"; -static constexpr auto heraDownloadLink = "https://github.com/ewasm/hera/archive/v0.6.0.tar.gz"; #elif defined(__APPLE__) static constexpr auto evmoneFilename = "libevmone.dylib"; static constexpr auto evmoneDownloadLink = "https://github.com/ethereum/evmone/releases/download/v0.10.0/evmone-0.10.0-darwin-x86_64.tar.gz"; -static constexpr auto heraFilename = "libhera.dylib"; -static constexpr auto heraDownloadLink = "https://github.com/ewasm/hera/releases/download/v0.6.0/hera-0.6.0-darwin-x86_64.tar.gz"; #else static constexpr auto evmoneFilename = "libevmone.so"; static constexpr auto evmoneDownloadLink = "https://github.com/ethereum/evmone/releases/download/v0.10.0/evmone-0.10.0-linux-x86_64.tar.gz"; -static constexpr auto heraFilename = "libhera.so"; -static constexpr auto heraDownloadLink = "https://github.com/ewasm/hera/releases/download/v0.6.0/hera-0.6.0-linux-x86_64.tar.gz"; #endif struct ConfigException: public util::Exception {}; @@ -58,9 +52,7 @@ struct CommonOptions std::vector vmPaths; boost::filesystem::path testPath; - bool ewasm = false; bool optimize = false; - bool enforceCompileToEwasm = false; bool enforceGasTest = false; u256 enforceGasTestMinValue = 100000; bool disableSemanticTests = false; diff --git a/test/EVMHost.cpp b/test/EVMHost.cpp index 132ce2bebadb..81005547d2de 100644 --- a/test/EVMHost.cpp +++ b/test/EVMHost.cpp @@ -47,10 +47,10 @@ evmc::VM& EVMHost::getVM(string const& _path) auto vm = evmc::VM{evmc_load_and_configure(_path.c_str(), &errorCode)}; if (vm && errorCode == EVMC_LOADER_SUCCESS) { - if (vm.get_capabilities() & (EVMC_CAPABILITY_EVM1 | EVMC_CAPABILITY_EWASM)) + if (vm.get_capabilities() & (EVMC_CAPABILITY_EVM1)) vms[_path] = make_unique(evmc::VM(std::move(vm))); else - cerr << "VM loaded neither supports EVM1 nor EWASM" << endl; + cerr << "VM loaded does not support EVM1" << endl; } else { @@ -67,10 +67,9 @@ evmc::VM& EVMHost::getVM(string const& _path) return NullVM; } -std::tuple EVMHost::checkVmPaths(vector const& _vmPaths) +bool EVMHost::checkVmPaths(vector const& _vmPaths) { bool evmVmFound = false; - bool ewasmVmFound = false; for (auto const& path: _vmPaths) { evmc::VM& vm = EVMHost::getVM(path.string()); @@ -83,15 +82,8 @@ std::tuple EVMHost::checkVmPaths(vector con BOOST_THROW_EXCEPTION(runtime_error("Multiple evm1 evmc vms defined. Please only define one evm1 evmc vm.")); evmVmFound = true; } - - if (vm.has_capability(EVMC_CAPABILITY_EWASM)) - { - if (ewasmVmFound) - BOOST_THROW_EXCEPTION(runtime_error("Multiple ewasm evmc vms where defined. Please only define one ewasm evmc vm.")); - ewasmVmFound = true; - } } - return {evmVmFound, ewasmVmFound}; + return evmVmFound; } EVMHost::EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm): diff --git a/test/EVMHost.h b/test/EVMHost.h index 61b4c3c71c8f..967adc2486aa 100644 --- a/test/EVMHost.h +++ b/test/EVMHost.h @@ -65,16 +65,15 @@ class EVMHost: public evmc::MockedHost // Solidity testing specific features. - /// Tries to dynamically load an evmc vm supporting evm1 or ewasm and caches the loaded VM. + /// Tries to dynamically load an evmc vm supporting evm1 and caches the loaded VM. /// @returns vmc::VM(nullptr) on failure. static evmc::VM& getVM(std::string const& _path = {}); /// Tries to load all defined evmc vm shared libraries. /// @param _vmPaths paths to multiple evmc shared libraries. - /// @throw Exception if multiple evm1 or multiple ewasm evmc vms where loaded. - /// @returns A pair of booleans, the first element being true, if an evmc vm supporting evm1 was loaded properly, - /// the second being true, if an evmc vm supporting ewasm was loaded properly. - static std::tuple checkVmPaths(std::vector const& _vmPaths); + /// @throw Exception if multiple evm1 vms where loaded. + /// @returns true, if an evmc vm supporting evm1 was loaded properly, + static bool checkVmPaths(std::vector const& _vmPaths); explicit EVMHost(langutil::EVMVersion _evmVersion, evmc::VM& _vm); diff --git a/test/ExecutionFramework.cpp b/test/ExecutionFramework.cpp index 0b7c6ea80caf..a18a73de06b8 100644 --- a/test/ExecutionFramework.cpp +++ b/test/ExecutionFramework.cpp @@ -60,11 +60,6 @@ ExecutionFramework::ExecutionFramework(langutil::EVMVersion _evmVersion, vector< { if (solidity::test::CommonOptions::get().optimize) m_optimiserSettings = solidity::frontend::OptimiserSettings::standard(); - - for (auto const& path: m_vmPaths) - if (EVMHost::getVM(path.string()).has_capability(EVMC_CAPABILITY_EWASM)) - m_supportsEwasm = true; - selectVM(evmc_capabilities::EVMC_CAPABILITY_EVM1); } diff --git a/test/ExecutionFramework.h b/test/ExecutionFramework.h index b39751142847..27ceb4f28033 100644 --- a/test/ExecutionFramework.h +++ b/test/ExecutionFramework.h @@ -295,7 +295,6 @@ class ExecutionFramework solidity::frontend::RevertStrings m_revertStrings = solidity::frontend::RevertStrings::Default; solidity::frontend::OptimiserSettings m_optimiserSettings = solidity::frontend::OptimiserSettings::minimal(); bool m_showMessages = false; - bool m_supportsEwasm = false; std::unique_ptr m_evmcHost; std::vector m_vmPaths; diff --git a/test/InteractiveTests.h b/test/InteractiveTests.h index e58beabbf8e4..9e054c109c5d 100644 --- a/test/InteractiveTests.h +++ b/test/InteractiveTests.h @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -78,7 +77,6 @@ Testsuite const g_interactiveTestsuites[] = { {"SMT Checker", "libsolidity", "smtCheckerTests", true, false, &SMTCheckerTest::create}, {"Gas Estimates", "libsolidity", "gasTests", false, false, &GasTest::create}, {"Memory Guard Tests", "libsolidity", "memoryGuardTests", false, false, &MemoryGuardTest::create}, - {"Ewasm Translation", "libyul", "ewasmTranslationTests", false, false, &yul::test::EwasmTranslationTest::create} }; } diff --git a/test/TestCase.h b/test/TestCase.h index 7a5c75c50209..f631bea8dce3 100644 --- a/test/TestCase.h +++ b/test/TestCase.h @@ -41,7 +41,6 @@ class TestCase langutil::EVMVersion evmVersion; std::optional eofVersion; std::vector vmPaths; - bool enforceCompileToEwasm = false; bool enforceGasCost = false; u256 enforceGasCostMinValue; }; diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index ce9af142fc76..c492f529092a 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -209,8 +209,6 @@ EOF sed -i.bak -E -e 's/([0-9a-f]{34}\$__)[0-9a-f]+(__\$[0-9a-f]{17})/\1\2/g' "$stdout_path" # Remove metadata in assembly output (see below about the magic numbers) sed -i.bak -E -e 's/"[0-9a-f]+64697066735822[0-9a-f]+64736f6c63[0-9a-f]+/"/g' "$stdout_path" - # Remove hash of text representation in ewasm - sed -i.bak -E -e 's/The Keccak-256 hash of the text representation of .*: [0-9a-f]+/The Keccak-256 hash of the text representation of /g' "$stdout_path" # Replace escaped newlines by actual newlines for readability # shellcheck disable=SC1003 diff --git a/test/cmdlineTests/evm_to_wasm/args b/test/cmdlineTests/evm_to_wasm/args deleted file mode 100644 index 099ebdc3a380..000000000000 --- a/test/cmdlineTests/evm_to_wasm/args +++ /dev/null @@ -1 +0,0 @@ ---assemble --optimize --yul-dialect evm --machine ewasm diff --git a/test/cmdlineTests/evm_to_wasm/input.yul b/test/cmdlineTests/evm_to_wasm/input.yul deleted file mode 100644 index f21cd2b7e038..000000000000 --- a/test/cmdlineTests/evm_to_wasm/input.yul +++ /dev/null @@ -1,3 +0,0 @@ -{ - sstore(0, 1) -} diff --git a/test/cmdlineTests/evm_to_wasm/output b/test/cmdlineTests/evm_to_wasm/output deleted file mode 100644 index fa454f80f7e9..000000000000 --- a/test/cmdlineTests/evm_to_wasm/output +++ /dev/null @@ -1,96 +0,0 @@ - -======= evm_to_wasm/input.yul (Ewasm) ======= - -Pretty printed source: -object "object" { - code { { sstore(0, 1) } } -} - - -========================== - -Translated source: -object "object" { - code { - function main() - { - let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(0))), 32) - let y := i64.or(hi, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(0, 32))))) - i64.store(0:i32, y) - i64.store(i32.add(0:i32, 8:i32), y) - i64.store(i32.add(0:i32, 16:i32), y) - i64.store(i32.add(0:i32, 24:i32), y) - i64.store(32:i32, y) - i64.store(i32.add(32:i32, 8:i32), y) - i64.store(i32.add(32:i32, 16:i32), y) - let hi_1 := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(1))), 32) - i64.store(i32.add(32:i32, 24:i32), i64.or(hi_1, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(1, 32)))))) - eth.storageStore(0:i32, 32:i32) - } - function bswap16(x:i32) -> y:i32 - { - y := i32.or(i32.and(i32.shl(x, 8:i32), 0xff00:i32), i32.and(i32.shr_u(x, 8:i32), 0xff:i32)) - } - function bswap32(x:i32) -> y:i32 - { - let hi:i32 := i32.shl(bswap16(x), 16:i32) - y := i32.or(hi, bswap16(i32.shr_u(x, 16:i32))) - } - } -} - - -Binary representation: -0061736d01000000010e0360000060017f017f60027f7f0002190108657468657265756d0c73746f7261676553746f726500020304030001010503010001060100071102066d656d6f72790200046d61696e00010ac70103850101037e02404200a71003ad422086210020004200422088a71003ad84210141002001370000410041086a2001370000410041106a2001370000410041186a200137000041202001370000412041086a2001370000412041106a20013700004201a71003ad4220862102412041186a20024201422088a71003ad843700004100412010000b0b1f01017f024020004108744180fe0371200041087641ff01717221010b20010b1e01027f02402000100241107421022002200041107610027221010b20010b - -Text representation: -(module - (import "ethereum" "storageStore" (func $eth.storageStore (param i32 i32))) - (memory $memory (export "memory") 1) - (export "main" (func $main)) - -(func $main - (local $hi i64) - (local $y i64) - (local $hi_1 i64) - (block $label_ - (local.set $hi (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 0)))) (i64.const 32))) - (local.set $y (i64.or (local.get $hi) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 0) (i64.const 32))))))) - (i64.store (i32.const 0) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 8)) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 16)) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 24)) (local.get $y)) - (i64.store (i32.const 32) (local.get $y)) - (i64.store (i32.add (i32.const 32) (i32.const 8)) (local.get $y)) - (i64.store (i32.add (i32.const 32) (i32.const 16)) (local.get $y)) - (local.set $hi_1 (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 1)))) (i64.const 32))) - (i64.store (i32.add (i32.const 32) (i32.const 24)) (i64.or (local.get $hi_1) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 1) (i64.const 32))))))) - (call $eth.storageStore (i32.const 0) (i32.const 32)) - ) -) - -(func $bswap16 - (param $x i32) - (result i32) - (local $y i32) - (block $label__1 - (local.set $y (i32.or (i32.and (i32.shl (local.get $x) (i32.const 8)) (i32.const 65280)) (i32.and (i32.shr_u (local.get $x) (i32.const 8)) (i32.const 255)))) - - ) - (local.get $y) -) - -(func $bswap32 - (param $x i32) - (result i32) - (local $y i32) - (local $hi i32) - (block $label__2 - (local.set $hi (i32.shl (call $bswap16 (local.get $x)) (i32.const 16))) - (local.set $y (i32.or (local.get $hi) (call $bswap16 (i32.shr_u (local.get $x) (i32.const 16))))) - - ) - (local.get $y) -) - -) diff --git a/test/cmdlineTests/evm_to_wasm_break/args b/test/cmdlineTests/evm_to_wasm_break/args deleted file mode 100644 index 099ebdc3a380..000000000000 --- a/test/cmdlineTests/evm_to_wasm_break/args +++ /dev/null @@ -1 +0,0 @@ ---assemble --optimize --yul-dialect evm --machine ewasm diff --git a/test/cmdlineTests/evm_to_wasm_break/input.yul b/test/cmdlineTests/evm_to_wasm_break/input.yul deleted file mode 100644 index a625eea088e1..000000000000 --- a/test/cmdlineTests/evm_to_wasm_break/input.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - let x := calldataload(0) - for { } lt(x, 10) { x := add(x, 1) } { - if eq(x, 2) { break } - if eq(x, 4) { continue } - } - sstore(0, x) -} diff --git a/test/cmdlineTests/evm_to_wasm_break/output b/test/cmdlineTests/evm_to_wasm_break/output deleted file mode 100644 index 01a4cbb411aa..000000000000 --- a/test/cmdlineTests/evm_to_wasm_break/output +++ /dev/null @@ -1,583 +0,0 @@ - -======= evm_to_wasm_break/input.yul (Ewasm) ======= - -Pretty printed source: -object "object" { - code { - { - let x := calldataload(0) - for { } lt(x, 10) { x := add(x, 1) } - { - if eq(x, 2) { break } - if eq(x, 4) { continue } - } - sstore(0, x) - } - } -} - - -========================== - -Translated source: -object "object" { - code { - function main() - { - let x, x_1, x_2, x_3 := calldataload() - let x_4 := x - let x_5 := x_1 - let x_6 := x_2 - let x_7 := x_3 - let _1:i32 := i32.eqz(i32.eqz(i64.eqz(i64.or(i64.or(0, 0), i64.or(0, 1))))) - for { } - i32.eqz(_1) - { - let x_8, x_9, x_10, x_11 := add(x_4, x_5, x_6, x_7) - x_4 := x_8 - x_5 := x_9 - x_6 := x_10 - x_7 := x_11 - } - { - let _2, _3, _4, _5 := iszero_1324_2108(lt(x_4, x_5, x_6, x_7)) - if i32.eqz(i64.eqz(i64.or(i64.or(_2, _3), i64.or(_4, _5)))) { break } - let _6, _7, _8, _9 := eq_771_2109(x_4, x_5, x_6, x_7) - if i32.eqz(i64.eqz(i64.or(i64.or(_6, _7), i64.or(_8, _9)))) { break } - let _10, _11, _12, _13 := eq_772_2110(x_4, x_5, x_6, x_7) - if i32.eqz(i64.eqz(i64.or(i64.or(_10, _11), i64.or(_12, _13)))) { continue } - } - sstore(x_4, x_5, x_6, x_7) - } - function add(x1, x2, x3, x4) -> r1, r2, r3, r4 - { - let t := i64.add(x4, 1) - r4 := i64.add(t, 0) - let t_1 := i64.add(x3, 0) - r3 := i64.add(t_1, i64.extend_i32_u(i32.or(i64.lt_u(t, x4), i64.lt_u(r4, t)))) - let t_2 := i64.add(x2, 0) - r2 := i64.add(t_2, i64.extend_i32_u(i32.or(i64.lt_u(t_1, x3), i64.lt_u(r3, t_1)))) - r1 := i64.add(i64.add(x1, 0), i64.extend_i32_u(i32.or(i64.lt_u(t_2, x2), i64.lt_u(r2, t_2)))) - } - function iszero_1324_2108(x4) -> r1, r2, r3, r4 - { - r4 := i64.extend_i32_u(i64.eqz(i64.or(i64.or(0, 0), i64.or(0, x4)))) - } - function eq_771_2109(x1, x2, x3, x4) -> r1, r2, r3, r4 - { - r4 := i64.extend_i32_u(i32.and(i64.eq(x1, 0), i32.and(i64.eq(x2, 0), i32.and(i64.eq(x3, 0), i64.eq(x4, 2))))) - } - function eq_772_2110(x1, x2, x3, x4) -> r1, r2, r3, r4 - { - r4 := i64.extend_i32_u(i32.and(i64.eq(x1, 0), i32.and(i64.eq(x2, 0), i32.and(i64.eq(x3, 0), i64.eq(x4, 4))))) - } - function lt(x1, x2, x3, x4) -> z4 - { - let z:i32 := false - let _1 := 0 - let _2:i32 := 0xffffffff:i32 - switch i32.select(_2, i64.ne(x1, _1), i64.lt_u(x1, _1)) - case 0:i32 { - switch i32.select(_2, i64.ne(x2, _1), i64.lt_u(x2, _1)) - case 0:i32 { - switch i32.select(_2, i64.ne(x3, _1), i64.lt_u(x3, _1)) - case 0:i32 { z := i64.lt_u(x4, 10) } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - } - case 1:i32 { z := 0:i32 } - default { z := 1:i32 } - z4 := i64.extend_i32_u(z) - } - function u256_to_i32_774() -> v:i32 - { - let _1 := 0 - if i64.ne(_1, i64.or(i64.or(_1, _1), _1)) { unreachable() } - if i64.ne(_1, i64.shr_u(_1, 32)) { unreachable() } - v := i32.wrap_i64(_1) - } - function u256_to_i32() -> v:i32 - { - if i64.ne(0, i64.or(i64.or(0, 0), 0)) { unreachable() } - if i64.ne(0, i64.shr_u(32, 32)) { unreachable() } - v := i32.wrap_i64(32) - } - function bswap16(x:i32) -> y:i32 - { - y := i32.or(i32.and(i32.shl(x, 8:i32), 0xff00:i32), i32.and(i32.shr_u(x, 8:i32), 0xff:i32)) - } - function bswap32(x:i32) -> y:i32 - { - let hi:i32 := i32.shl(bswap16(x), 16:i32) - y := i32.or(hi, bswap16(i32.shr_u(x, 16:i32))) - } - function bswap64(x) -> y - { - let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(x))), 32) - y := i64.or(hi, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(x, 32))))) - } - function calldataload() -> z1, z2, z3, z4 - { - let cds:i32 := eth.getCallDataSize() - let destination:i32 := u256_to_i32_774() - let offset:i32 := u256_to_i32_774() - let requested_size:i32 := u256_to_i32() - if i32.gt_u(offset, i32.sub(0xffffffff:i32, requested_size)) { eth.revert(0:i32, 0:i32) } - let available_size:i32 := i32.sub(cds, offset) - if i32.gt_u(offset, cds) { available_size := 0:i32 } - let _1:i32 := 0:i32 - if i32.gt_u(available_size, _1) - { - eth.callDataCopy(destination, offset, available_size) - } - if i32.gt_u(requested_size, available_size) - { - let _2:i32 := i32.sub(requested_size, available_size) - let _3:i32 := i32.add(destination, available_size) - let i:i32 := _1 - for { } i32.lt_u(i, _2) { i := i32.add(i, 1:i32) } - { - i32.store8(i32.add(_3, i), _1) - } - } - let z1_1 := bswap64(i64.load(_1)) - let z2_1 := bswap64(i64.load(i32.add(_1, 8:i32))) - let z3_1 := bswap64(i64.load(i32.add(_1, 16:i32))) - let z4_1 := bswap64(i64.load(i32.add(_1, 24:i32))) - z1 := z1_1 - z2 := z2_1 - z3 := z3_1 - z4 := z4_1 - } - function sstore(y1, y2, y3, y4) - { - let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(0))), 32) - let y := i64.or(hi, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(0, 32))))) - i64.store(0:i32, y) - i64.store(i32.add(0:i32, 8:i32), y) - i64.store(i32.add(0:i32, 16:i32), y) - i64.store(i32.add(0:i32, 24:i32), y) - i64.store(32:i32, bswap64(y1)) - i64.store(i32.add(32:i32, 8:i32), bswap64(y2)) - i64.store(i32.add(32:i32, 16:i32), bswap64(y3)) - i64.store(i32.add(32:i32, 24:i32), bswap64(y4)) - eth.storageStore(0:i32, 32:i32) - } - } -} - - -Binary representation: -0061736d010000000130096000006000017e6000017f60017e017e60047e7e7e7e0060047e7e7e7e017e60017f017f60027f7f0060037f7f7f00025e0408657468657265756d0c73746f7261676553746f7265000708657468657265756d06726576657274000708657468657265756d0f67657443616c6c4461746153697a65000208657468657265756d0c63616c6c44617461436f70790008030e0d0005030505050202060603010405030100010615047e0142000b7e0142000b7e0142000b7f0141000b071102066d656d6f72790200046d61696e00040abd090d8d0203087e017f107e02400240100f21002300210123012102230221030b200021042001210520022106200321074200420084420042018484504545210802400340200845450d010240024020042005200620071009100621092303210a2300210b2301210c0b2009200a84200b200c8484504504400c030b024020042005200620071007210d2300210e2301210f230221100b200d200e84200f20108484504504400c030b02402004200520062007100821112300211223012113230221140b2011201284201320148484504504400c010b0b02402004200520062007100521152300211623012117230221180b201521042016210520172106201821070c000b0b200420052006200710100b0b6701077e0240200342017c2108200842007c2107200242007c210920092008200354200720085472ad7c2106200142007c210a200a2009200254200620095472ad7c2105200042007c200a2001542005200a5472ad7c21040b20052400200624012007240220040b2401047e0240420042008442002000848450ad21040b20022400200324012004240220010b2f01047e02402000420051200142005120024200512003420251717171ad21070b20052400200624012007240220040b2f01047e02402000420051200142005120024200512003420451717171ad21070b20052400200624012007240220040bab0104017e017f017e047f02404100210542002106417f210702402007200020065220002006541b21082008410046044002402007200120065220012006541b21092009410046044002402007200220065220022006541b210a200a41004604402003420a54210505200a41014604404100210505410121050b0b0b05200941014604404100210505410121050b0b0b05200841014604404100210505410121050b0b0b2005ad21040b20040b2f02017f017e02404200210120012001200184200184520440000b20012001422088520440000b2001a721000b20000b2901017f024042004200420084420084520440000b42004220422088520440000b4220a721000b20000b1f01017f024020004108744180fe0371200041087641ff01717221010b20010b1e01027f02402000100c411074210220022000411076100c7221010b20010b2201027e02402000a7100dad422086210220022000422088a7100dad8421010b20010bdc0103047e097f047e024010022104100a2105100a2106100b21072006417f20076b4b04404100410010010b200420066b2108200620044b0440410021080b41002109200820094b044020052006200810030b200720084b0440200720086b210a200520086a210b2009210c02400340200c200a49450d010240200b200c6a20093a00000b200c41016a210c0c000b0b0b2009290000100e210d200941086a290000100e210e200941106a290000100e210f200941186a290000100e2110200d2100200e2101200f2102201021030b20012400200224012003240220000b7801027e02404200a7100dad422086210420044200422088a7100dad84210541002005370000410041086a2005370000410041106a2005370000410041186a200537000041202000100e370000412041086a2001100e370000412041106a2002100e370000412041186a2003100e3700004100412010000b0b - -Text representation: -(module - (import "ethereum" "storageStore" (func $eth.storageStore (param i32 i32))) - (import "ethereum" "revert" (func $eth.revert (param i32 i32))) - (import "ethereum" "getCallDataSize" (func $eth.getCallDataSize (result i32))) - (import "ethereum" "callDataCopy" (func $eth.callDataCopy (param i32 i32 i32))) - (memory $memory (export "memory") 1) - (export "main" (func $main)) - (global $global_ (mut i64) (i64.const 0)) - (global $global__1 (mut i64) (i64.const 0)) - (global $global__2 (mut i64) (i64.const 0)) - (global $global__6 (mut i32) (i32.const 0)) - -(func $main - (local $x i64) - (local $x_1 i64) - (local $x_2 i64) - (local $x_3 i64) - (local $x_4 i64) - (local $x_5 i64) - (local $x_6 i64) - (local $x_7 i64) - (local $_1 i32) - (local $_2 i64) - (local $_3 i64) - (local $_4 i64) - (local $_5 i64) - (local $_6 i64) - (local $_7 i64) - (local $_8 i64) - (local $_9 i64) - (local $_10 i64) - (local $_11 i64) - (local $_12 i64) - (local $_13 i64) - (local $x_8 i64) - (local $x_9 i64) - (local $x_10 i64) - (local $x_11 i64) - (block $label_ - (block - (local.set $x (call $calldataload)) - (local.set $x_1 (global.get $global_)) - (local.set $x_2 (global.get $global__1)) - (local.set $x_3 (global.get $global__2)) - - ) - (local.set $x_4 (local.get $x)) - (local.set $x_5 (local.get $x_1)) - (local.set $x_6 (local.get $x_2)) - (local.set $x_7 (local.get $x_3)) - (local.set $_1 (i32.eqz (i32.eqz (i64.eqz (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.or (i64.const 0) (i64.const 1))))))) - (block $label__3 - (loop $label__5 - (br_if $label__3 (i32.eqz (i32.eqz (local.get $_1)))) - (block $label__4 - (block - (local.set $_2 (call $iszero_1324_2108 (call $lt (local.get $x_4) (local.get $x_5) (local.get $x_6) (local.get $x_7)))) - (local.set $_3 (global.get $global__6)) - (local.set $_4 (global.get $global_)) - (local.set $_5 (global.get $global__1)) - - ) - (if (i32.eqz (i64.eqz (i64.or (i64.or (local.get $_2) (local.get $_3)) (i64.or (local.get $_4) (local.get $_5))))) (then - (br $label__3) - )) - (block - (local.set $_6 (call $eq_771_2109 (local.get $x_4) (local.get $x_5) (local.get $x_6) (local.get $x_7))) - (local.set $_7 (global.get $global_)) - (local.set $_8 (global.get $global__1)) - (local.set $_9 (global.get $global__2)) - - ) - (if (i32.eqz (i64.eqz (i64.or (i64.or (local.get $_6) (local.get $_7)) (i64.or (local.get $_8) (local.get $_9))))) (then - (br $label__3) - )) - (block - (local.set $_10 (call $eq_772_2110 (local.get $x_4) (local.get $x_5) (local.get $x_6) (local.get $x_7))) - (local.set $_11 (global.get $global_)) - (local.set $_12 (global.get $global__1)) - (local.set $_13 (global.get $global__2)) - - ) - (if (i32.eqz (i64.eqz (i64.or (i64.or (local.get $_10) (local.get $_11)) (i64.or (local.get $_12) (local.get $_13))))) (then - (br $label__4) - )) - - ) - (block - (local.set $x_8 (call $add (local.get $x_4) (local.get $x_5) (local.get $x_6) (local.get $x_7))) - (local.set $x_9 (global.get $global_)) - (local.set $x_10 (global.get $global__1)) - (local.set $x_11 (global.get $global__2)) - - ) - (local.set $x_4 (local.get $x_8)) - (local.set $x_5 (local.get $x_9)) - (local.set $x_6 (local.get $x_10)) - (local.set $x_7 (local.get $x_11)) - (br $label__5) - ) - - ) - (call $sstore (local.get $x_4) (local.get $x_5) (local.get $x_6) (local.get $x_7)) - ) -) - -(func $add - (param $x1 i64) - (param $x2 i64) - (param $x3 i64) - (param $x4 i64) - (result i64) - (local $r1 i64) - (local $r2 i64) - (local $r3 i64) - (local $r4 i64) - (local $t i64) - (local $t_1 i64) - (local $t_2 i64) - (block $label__7 - (local.set $t (i64.add (local.get $x4) (i64.const 1))) - (local.set $r4 (i64.add (local.get $t) (i64.const 0))) - (local.set $t_1 (i64.add (local.get $x3) (i64.const 0))) - (local.set $r3 (i64.add (local.get $t_1) (i64.extend_i32_u (i32.or (i64.lt_u (local.get $t) (local.get $x4)) (i64.lt_u (local.get $r4) (local.get $t)))))) - (local.set $t_2 (i64.add (local.get $x2) (i64.const 0))) - (local.set $r2 (i64.add (local.get $t_2) (i64.extend_i32_u (i32.or (i64.lt_u (local.get $t_1) (local.get $x3)) (i64.lt_u (local.get $r3) (local.get $t_1)))))) - (local.set $r1 (i64.add (i64.add (local.get $x1) (i64.const 0)) (i64.extend_i32_u (i32.or (i64.lt_u (local.get $t_2) (local.get $x2)) (i64.lt_u (local.get $r2) (local.get $t_2)))))) - - ) - (global.set $global_ (local.get $r2)) - (global.set $global__1 (local.get $r3)) - (global.set $global__2 (local.get $r4)) - (local.get $r1) -) - -(func $iszero_1324_2108 - (param $x4 i64) - (result i64) - (local $r1 i64) - (local $r2 i64) - (local $r3 i64) - (local $r4 i64) - (block $label__8 - (local.set $r4 (i64.extend_i32_u (i64.eqz (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.or (i64.const 0) (local.get $x4)))))) - - ) - (global.set $global_ (local.get $r2)) - (global.set $global__1 (local.get $r3)) - (global.set $global__2 (local.get $r4)) - (local.get $r1) -) - -(func $eq_771_2109 - (param $x1 i64) - (param $x2 i64) - (param $x3 i64) - (param $x4 i64) - (result i64) - (local $r1 i64) - (local $r2 i64) - (local $r3 i64) - (local $r4 i64) - (block $label__9 - (local.set $r4 (i64.extend_i32_u (i32.and (i64.eq (local.get $x1) (i64.const 0)) (i32.and (i64.eq (local.get $x2) (i64.const 0)) (i32.and (i64.eq (local.get $x3) (i64.const 0)) (i64.eq (local.get $x4) (i64.const 2))))))) - - ) - (global.set $global_ (local.get $r2)) - (global.set $global__1 (local.get $r3)) - (global.set $global__2 (local.get $r4)) - (local.get $r1) -) - -(func $eq_772_2110 - (param $x1 i64) - (param $x2 i64) - (param $x3 i64) - (param $x4 i64) - (result i64) - (local $r1 i64) - (local $r2 i64) - (local $r3 i64) - (local $r4 i64) - (block $label__10 - (local.set $r4 (i64.extend_i32_u (i32.and (i64.eq (local.get $x1) (i64.const 0)) (i32.and (i64.eq (local.get $x2) (i64.const 0)) (i32.and (i64.eq (local.get $x3) (i64.const 0)) (i64.eq (local.get $x4) (i64.const 4))))))) - - ) - (global.set $global_ (local.get $r2)) - (global.set $global__1 (local.get $r3)) - (global.set $global__2 (local.get $r4)) - (local.get $r1) -) - -(func $lt - (param $x1 i64) - (param $x2 i64) - (param $x3 i64) - (param $x4 i64) - (result i64) - (local $z4 i64) - (local $z i32) - (local $_1 i64) - (local $_2 i32) - (local $condition i32) - (local $condition_12 i32) - (local $condition_13 i32) - (block $label__11 - (local.set $z (i32.const 0)) - (local.set $_1 (i64.const 0)) - (local.set $_2 (i32.const 4294967295)) - (block - (local.set $condition (select (local.get $_2) (i64.ne (local.get $x1) (local.get $_1)) (i64.lt_u (local.get $x1) (local.get $_1)))) - (if (i32.eq (local.get $condition) (i32.const 0)) (then - (block - (local.set $condition_12 (select (local.get $_2) (i64.ne (local.get $x2) (local.get $_1)) (i64.lt_u (local.get $x2) (local.get $_1)))) - (if (i32.eq (local.get $condition_12) (i32.const 0)) (then - (block - (local.set $condition_13 (select (local.get $_2) (i64.ne (local.get $x3) (local.get $_1)) (i64.lt_u (local.get $x3) (local.get $_1)))) - (if (i32.eq (local.get $condition_13) (i32.const 0)) (then - (local.set $z (i64.lt_u (local.get $x4) (i64.const 10))) - )(else - (if (i32.eq (local.get $condition_13) (i32.const 1)) (then - (local.set $z (i32.const 0)) - )(else - (local.set $z (i32.const 1)) - )) - )) - - ) - )(else - (if (i32.eq (local.get $condition_12) (i32.const 1)) (then - (local.set $z (i32.const 0)) - )(else - (local.set $z (i32.const 1)) - )) - )) - - ) - )(else - (if (i32.eq (local.get $condition) (i32.const 1)) (then - (local.set $z (i32.const 0)) - )(else - (local.set $z (i32.const 1)) - )) - )) - - ) - (local.set $z4 (i64.extend_i32_u (local.get $z))) - - ) - (local.get $z4) -) - -(func $u256_to_i32_774 - (result i32) - (local $v i32) - (local $_1 i64) - (block $label__14 - (local.set $_1 (i64.const 0)) - (if (i64.ne (local.get $_1) (i64.or (i64.or (local.get $_1) (local.get $_1)) (local.get $_1))) (then - (unreachable))) - (if (i64.ne (local.get $_1) (i64.shr_u (local.get $_1) (i64.const 32))) (then - (unreachable))) - (local.set $v (i32.wrap_i64 (local.get $_1))) - - ) - (local.get $v) -) - -(func $u256_to_i32 - (result i32) - (local $v i32) - (block $label__15 - (if (i64.ne (i64.const 0) (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.const 0))) (then - (unreachable))) - (if (i64.ne (i64.const 0) (i64.shr_u (i64.const 32) (i64.const 32))) (then - (unreachable))) - (local.set $v (i32.wrap_i64 (i64.const 32))) - - ) - (local.get $v) -) - -(func $bswap16 - (param $x i32) - (result i32) - (local $y i32) - (block $label__16 - (local.set $y (i32.or (i32.and (i32.shl (local.get $x) (i32.const 8)) (i32.const 65280)) (i32.and (i32.shr_u (local.get $x) (i32.const 8)) (i32.const 255)))) - - ) - (local.get $y) -) - -(func $bswap32 - (param $x i32) - (result i32) - (local $y i32) - (local $hi i32) - (block $label__17 - (local.set $hi (i32.shl (call $bswap16 (local.get $x)) (i32.const 16))) - (local.set $y (i32.or (local.get $hi) (call $bswap16 (i32.shr_u (local.get $x) (i32.const 16))))) - - ) - (local.get $y) -) - -(func $bswap64 - (param $x i64) - (result i64) - (local $y i64) - (local $hi i64) - (block $label__18 - (local.set $hi (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (local.get $x)))) (i64.const 32))) - (local.set $y (i64.or (local.get $hi) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (local.get $x) (i64.const 32))))))) - - ) - (local.get $y) -) - -(func $calldataload - (result i64) - (local $z1 i64) - (local $z2 i64) - (local $z3 i64) - (local $z4 i64) - (local $cds i32) - (local $destination i32) - (local $offset i32) - (local $requested_size i32) - (local $available_size i32) - (local $_1 i32) - (local $_2 i32) - (local $_3 i32) - (local $i i32) - (local $z1_1 i64) - (local $z2_1 i64) - (local $z3_1 i64) - (local $z4_1 i64) - (block $label__19 - (local.set $cds (call $eth.getCallDataSize)) - (local.set $destination (call $u256_to_i32_774)) - (local.set $offset (call $u256_to_i32_774)) - (local.set $requested_size (call $u256_to_i32)) - (if (i32.gt_u (local.get $offset) (i32.sub (i32.const 4294967295) (local.get $requested_size))) (then - (call $eth.revert (i32.const 0) (i32.const 0)))) - (local.set $available_size (i32.sub (local.get $cds) (local.get $offset))) - (if (i32.gt_u (local.get $offset) (local.get $cds)) (then - (local.set $available_size (i32.const 0)) - )) - (local.set $_1 (i32.const 0)) - (if (i32.gt_u (local.get $available_size) (local.get $_1)) (then - (call $eth.callDataCopy (local.get $destination) (local.get $offset) (local.get $available_size)))) - (if (i32.gt_u (local.get $requested_size) (local.get $available_size)) (then - (local.set $_2 (i32.sub (local.get $requested_size) (local.get $available_size))) - (local.set $_3 (i32.add (local.get $destination) (local.get $available_size))) - (local.set $i (local.get $_1)) - (block $label__20 - (loop $label__22 - (br_if $label__20 (i32.eqz (i32.lt_u (local.get $i) (local.get $_2)))) - (block $label__21 - (i32.store8 (i32.add (local.get $_3) (local.get $i)) (local.get $_1)) - ) - (local.set $i (i32.add (local.get $i) (i32.const 1))) - (br $label__22) - ) - - ) - )) - (local.set $z1_1 (call $bswap64 (i64.load (local.get $_1)))) - (local.set $z2_1 (call $bswap64 (i64.load (i32.add (local.get $_1) (i32.const 8))))) - (local.set $z3_1 (call $bswap64 (i64.load (i32.add (local.get $_1) (i32.const 16))))) - (local.set $z4_1 (call $bswap64 (i64.load (i32.add (local.get $_1) (i32.const 24))))) - (local.set $z1 (local.get $z1_1)) - (local.set $z2 (local.get $z2_1)) - (local.set $z3 (local.get $z3_1)) - (local.set $z4 (local.get $z4_1)) - - ) - (global.set $global_ (local.get $z2)) - (global.set $global__1 (local.get $z3)) - (global.set $global__2 (local.get $z4)) - (local.get $z1) -) - -(func $sstore - (param $y1 i64) - (param $y2 i64) - (param $y3 i64) - (param $y4 i64) - (local $hi i64) - (local $y i64) - (block $label__23 - (local.set $hi (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 0)))) (i64.const 32))) - (local.set $y (i64.or (local.get $hi) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 0) (i64.const 32))))))) - (i64.store (i32.const 0) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 8)) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 16)) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 24)) (local.get $y)) - (i64.store (i32.const 32) (call $bswap64 (local.get $y1))) - (i64.store (i32.add (i32.const 32) (i32.const 8)) (call $bswap64 (local.get $y2))) - (i64.store (i32.add (i32.const 32) (i32.const 16)) (call $bswap64 (local.get $y3))) - (i64.store (i32.add (i32.const 32) (i32.const 24)) (call $bswap64 (local.get $y4))) - (call $eth.storageStore (i32.const 0) (i32.const 32)) - ) -) - -) diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/args b/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/args deleted file mode 100644 index f39038498198..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/args +++ /dev/null @@ -1 +0,0 @@ ---assemble --optimize --yul-dialect evm --machine ewasm --asm diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/input.yul b/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/input.yul deleted file mode 100644 index 4fa5ef66f8da..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/input.yul +++ /dev/null @@ -1,4 +0,0 @@ -{ - let x := 42 - sstore(0, x) -} diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/output b/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/output deleted file mode 100644 index d0cb60f39bee..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_asm_only/output +++ /dev/null @@ -1,2 +0,0 @@ - -======= evm_to_wasm_output_selection_asm_only/input.yul (Ewasm) ======= diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/args b/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/args deleted file mode 100644 index 7c6526b562d3..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/args +++ /dev/null @@ -1 +0,0 @@ ---assemble --optimize --yul-dialect evm --machine ewasm --ewasm-ir diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/input.yul b/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/input.yul deleted file mode 100644 index 4fa5ef66f8da..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/input.yul +++ /dev/null @@ -1,4 +0,0 @@ -{ - let x := 42 - sstore(0, x) -} diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/output b/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/output deleted file mode 100644 index 3124db17da95..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_ir_only/output +++ /dev/null @@ -1,34 +0,0 @@ - -======= evm_to_wasm_output_selection_ewasm_ir_only/input.yul (Ewasm) ======= - -========================== - -Translated source: -object "object" { - code { - function main() - { - let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(0))), 32) - let y := i64.or(hi, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(0, 32))))) - i64.store(0:i32, y) - i64.store(i32.add(0:i32, 8:i32), y) - i64.store(i32.add(0:i32, 16:i32), y) - i64.store(i32.add(0:i32, 24:i32), y) - i64.store(32:i32, y) - i64.store(i32.add(32:i32, 8:i32), y) - i64.store(i32.add(32:i32, 16:i32), y) - let hi_1 := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(42))), 32) - i64.store(i32.add(32:i32, 24:i32), i64.or(hi_1, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(42, 32)))))) - eth.storageStore(0:i32, 32:i32) - } - function bswap16(x:i32) -> y:i32 - { - y := i32.or(i32.and(i32.shl(x, 8:i32), 0xff00:i32), i32.and(i32.shr_u(x, 8:i32), 0xff:i32)) - } - function bswap32(x:i32) -> y:i32 - { - let hi:i32 := i32.shl(bswap16(x), 16:i32) - y := i32.or(hi, bswap16(i32.shr_u(x, 16:i32))) - } - } -} diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/args b/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/args deleted file mode 100644 index 48a844213a96..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/args +++ /dev/null @@ -1 +0,0 @@ ---assemble --optimize --yul-dialect evm --machine ewasm --ewasm diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/input.yul b/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/input.yul deleted file mode 100644 index 4fa5ef66f8da..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/input.yul +++ /dev/null @@ -1,4 +0,0 @@ -{ - let x := 42 - sstore(0, x) -} diff --git a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/output b/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/output deleted file mode 100644 index e8b306260504..000000000000 --- a/test/cmdlineTests/evm_to_wasm_output_selection_ewasm_only/output +++ /dev/null @@ -1,54 +0,0 @@ - -======= evm_to_wasm_output_selection_ewasm_only/input.yul (Ewasm) ======= - -Text representation: -(module - (import "ethereum" "storageStore" (func $eth.storageStore (param i32 i32))) - (memory $memory (export "memory") 1) - (export "main" (func $main)) - -(func $main - (local $hi i64) - (local $y i64) - (local $hi_1 i64) - (block $label_ - (local.set $hi (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 0)))) (i64.const 32))) - (local.set $y (i64.or (local.get $hi) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 0) (i64.const 32))))))) - (i64.store (i32.const 0) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 8)) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 16)) (local.get $y)) - (i64.store (i32.add (i32.const 0) (i32.const 24)) (local.get $y)) - (i64.store (i32.const 32) (local.get $y)) - (i64.store (i32.add (i32.const 32) (i32.const 8)) (local.get $y)) - (i64.store (i32.add (i32.const 32) (i32.const 16)) (local.get $y)) - (local.set $hi_1 (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 42)))) (i64.const 32))) - (i64.store (i32.add (i32.const 32) (i32.const 24)) (i64.or (local.get $hi_1) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 42) (i64.const 32))))))) - (call $eth.storageStore (i32.const 0) (i32.const 32)) - ) -) - -(func $bswap16 - (param $x i32) - (result i32) - (local $y i32) - (block $label__1 - (local.set $y (i32.or (i32.and (i32.shl (local.get $x) (i32.const 8)) (i32.const 65280)) (i32.and (i32.shr_u (local.get $x) (i32.const 8)) (i32.const 255)))) - - ) - (local.get $y) -) - -(func $bswap32 - (param $x i32) - (result i32) - (local $y i32) - (local $hi i32) - (block $label__2 - (local.set $hi (i32.shl (call $bswap16 (local.get $x)) (i32.const 16))) - (local.set $y (i32.or (local.get $hi) (call $bswap16 (i32.shr_u (local.get $x) (i32.const 16))))) - - ) - (local.get $y) -) - -) diff --git a/test/cmdlineTests/evm_to_wasm_unsupported_translation/args b/test/cmdlineTests/evm_to_wasm_unsupported_translation/args deleted file mode 100644 index cc6c07083182..000000000000 --- a/test/cmdlineTests/evm_to_wasm_unsupported_translation/args +++ /dev/null @@ -1 +0,0 @@ ---assemble --machine ewasm diff --git a/test/cmdlineTests/evm_to_wasm_unsupported_translation/err b/test/cmdlineTests/evm_to_wasm_unsupported_translation/err deleted file mode 100644 index 5ef050f64424..000000000000 --- a/test/cmdlineTests/evm_to_wasm_unsupported_translation/err +++ /dev/null @@ -1 +0,0 @@ -The selected input language is not directly supported when targeting the Ewasm machine and automatic translation is not available. diff --git a/test/cmdlineTests/evm_to_wasm_unsupported_translation/exit b/test/cmdlineTests/evm_to_wasm_unsupported_translation/exit deleted file mode 100644 index d00491fd7e5b..000000000000 --- a/test/cmdlineTests/evm_to_wasm_unsupported_translation/exit +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/test/cmdlineTests/evm_to_wasm_unsupported_translation/input.yul b/test/cmdlineTests/evm_to_wasm_unsupported_translation/input.yul deleted file mode 100644 index f21cd2b7e038..000000000000 --- a/test/cmdlineTests/evm_to_wasm_unsupported_translation/input.yul +++ /dev/null @@ -1,3 +0,0 @@ -{ - sstore(0, 1) -} diff --git a/test/cmdlineTests/evm_to_wasm_unsupported_translation/output b/test/cmdlineTests/evm_to_wasm_unsupported_translation/output deleted file mode 100644 index 8b137891791f..000000000000 --- a/test/cmdlineTests/evm_to_wasm_unsupported_translation/output +++ /dev/null @@ -1 +0,0 @@ - diff --git a/test/cmdlineTests/linker_mode_output_selection_invalid/args b/test/cmdlineTests/linker_mode_output_selection_invalid/args index ded0d6efc551..6c5b1680bc18 100644 --- a/test/cmdlineTests/linker_mode_output_selection_invalid/args +++ b/test/cmdlineTests/linker_mode_output_selection_invalid/args @@ -1 +1 @@ ---link --asm --asm-json --opcodes --bin --bin-runtime --abi --ir --ir-optimized --ewasm --hashes --userdoc --devdoc --metadata --storage-layout +--link --asm --asm-json --opcodes --bin --bin-runtime --abi --ir --ir-optimized --hashes --userdoc --devdoc --metadata --storage-layout diff --git a/test/cmdlineTests/linker_mode_output_selection_invalid/err b/test/cmdlineTests/linker_mode_output_selection_invalid/err index c84a12d97ede..614ade61f23c 100644 --- a/test/cmdlineTests/linker_mode_output_selection_invalid/err +++ b/test/cmdlineTests/linker_mode_output_selection_invalid/err @@ -1 +1 @@ -The following outputs are not supported in linker mode: --abi, --asm, --asm-json, --bin, --bin-runtime, --devdoc, --ewasm, --hashes, --ir, --ir-optimized, --metadata, --opcodes, --storage-layout, --userdoc. +The following outputs are not supported in linker mode: --abi, --asm, --asm-json, --bin, --bin-runtime, --devdoc, --hashes, --ir, --ir-optimized, --metadata, --opcodes, --storage-layout, --userdoc. diff --git a/test/cmdlineTests/output_selection_ewasm_ir_only/args b/test/cmdlineTests/output_selection_ewasm_ir_only/args deleted file mode 100644 index bccff6085e10..000000000000 --- a/test/cmdlineTests/output_selection_ewasm_ir_only/args +++ /dev/null @@ -1 +0,0 @@ ---optimize --ewasm-ir diff --git a/test/cmdlineTests/output_selection_ewasm_ir_only/err b/test/cmdlineTests/output_selection_ewasm_ir_only/err deleted file mode 100644 index 52dd265b5dbd..000000000000 --- a/test/cmdlineTests/output_selection_ewasm_ir_only/err +++ /dev/null @@ -1 +0,0 @@ -The following outputs are not supported in compiler mode: --ewasm-ir. diff --git a/test/cmdlineTests/output_selection_ewasm_ir_only/exit b/test/cmdlineTests/output_selection_ewasm_ir_only/exit deleted file mode 100644 index d00491fd7e5b..000000000000 --- a/test/cmdlineTests/output_selection_ewasm_ir_only/exit +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/test/cmdlineTests/output_selection_ewasm_ir_only/input.sol b/test/cmdlineTests/output_selection_ewasm_ir_only/input.sol deleted file mode 100644 index 9755e16e71db..000000000000 --- a/test/cmdlineTests/output_selection_ewasm_ir_only/input.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -pragma solidity *; - -contract C {} diff --git a/test/cmdlineTests/standard_cli_output_selection_invalid/args b/test/cmdlineTests/standard_cli_output_selection_invalid/args index 538c8709722d..691b7fa54acd 100644 --- a/test/cmdlineTests/standard_cli_output_selection_invalid/args +++ b/test/cmdlineTests/standard_cli_output_selection_invalid/args @@ -1 +1 @@ ---ast-compact-json --asm --asm-json --opcodes --bin --bin-runtime --abi --ir --ir-optimized --ewasm --ewasm-ir --hashes --userdoc --devdoc --metadata --storage-layout +--ast-compact-json --asm --asm-json --opcodes --bin --bin-runtime --abi --ir --ir-optimized --hashes --userdoc --devdoc --metadata --storage-layout diff --git a/test/cmdlineTests/standard_cli_output_selection_invalid/err b/test/cmdlineTests/standard_cli_output_selection_invalid/err index e9d24e61d486..ead982255667 100644 --- a/test/cmdlineTests/standard_cli_output_selection_invalid/err +++ b/test/cmdlineTests/standard_cli_output_selection_invalid/err @@ -1 +1 @@ -The following outputs are not supported in standard JSON mode: --abi, --asm, --asm-json, --ast-compact-json, --bin, --bin-runtime, --devdoc, --ewasm, --ewasm-ir, --hashes, --ir, --ir-optimized, --metadata, --opcodes, --storage-layout, --userdoc. +The following outputs are not supported in standard JSON mode: --abi, --asm, --asm-json, --ast-compact-json, --bin, --bin-runtime, --devdoc, --hashes, --ir, --ir-optimized, --metadata, --opcodes, --storage-layout, --userdoc. diff --git a/test/cmdlineTests/standard_ewasm_requested/input.json b/test/cmdlineTests/standard_ewasm_requested/input.json deleted file mode 100644 index 53dcc68eefe7..000000000000 --- a/test/cmdlineTests/standard_ewasm_requested/input.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "language": "Solidity", - "sources": - { - "A": - { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0; pragma abicoder v2; contract C { }" - } - }, - "settings": - { - "optimizer": - { - "enabled": true, - "details": {"yul": true} - }, - "outputSelection": - { - "*": { "*": ["ewasm.wast", "ewasm.wasm"] } - } - } -} diff --git a/test/cmdlineTests/standard_ewasm_requested/output.json b/test/cmdlineTests/standard_ewasm_requested/output.json deleted file mode 100644 index 1db94af7d10d..000000000000 --- a/test/cmdlineTests/standard_ewasm_requested/output.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "contracts": - { - "A": - { - "C": - { - "ewasm": - { - "wasm": "", - "wast": "(module - ;; custom section for sub-module - ;; The Keccak-256 hash of the text representation of - ;; (@custom \"C_3_deployed\" \"\") - (import \"ethereum\" \"codeCopy\" (func $eth.codeCopy (param i32 i32 i32))) - (import \"ethereum\" \"revert\" (func $eth.revert (param i32 i32))) - (import \"ethereum\" \"getCallValue\" (func $eth.getCallValue (param i32))) - (import \"ethereum\" \"finish\" (func $eth.finish (param i32 i32))) - (memory $memory (export \"memory\") 1) - (export \"main\" (func $main)) - -(func $main - (local $p i32) - (local $r i32) - (local $hi i64) - (local $y i64) - (local $z3 i64) - (local $_1 i64) - (block $label_ - (local.set $p (call $u256_to_i32_716)) - (local.set $r (i32.add (local.get $p) (i32.const 64))) - (if (i32.lt_u (local.get $r) (local.get $p)) (then - (unreachable))) - (local.set $hi (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 0)))) (i64.const 32))) - (local.set $y (i64.or (local.get $hi) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 0) (i64.const 32))))))) - (i64.store (local.get $r) (local.get $y)) - (i64.store (i32.add (local.get $r) (i32.const 8)) (local.get $y)) - (i64.store (i32.add (local.get $r) (i32.const 16)) (local.get $y)) - (i64.store (i32.add (local.get $r) (i32.const 24)) (call $bswap64)) - (call $eth.getCallValue (i32.const 0)) - (local.set $z3 (i64.load (i32.const 8))) - (if (i32.eqz (i64.eqz (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.or (local.get $z3) (i64.load (i32.const 0)))))) (then - (call $eth.revert (call $to_internal_i32ptr_334) (call $u256_to_i32_333)))) - (local.set $_1 (datasize \"C_3_deployed\")) - (call $eth.codeCopy (call $to_internal_i32ptr) (call $u256_to_i32 (dataoffset \"C_3_deployed\")) (call $u256_to_i32 (local.get $_1))) - (call $eth.finish (call $to_internal_i32ptr) (call $u256_to_i32 (local.get $_1))) - ) -) - -(func $u256_to_i32_333 - (result i32) - (local $v i32) - (local $_1 i64) - (block $label__1 - (local.set $_1 (i64.const 0)) - (if (i64.ne (local.get $_1) (i64.or (i64.or (local.get $_1) (local.get $_1)) (local.get $_1))) (then - (unreachable))) - (if (i64.ne (local.get $_1) (i64.shr_u (local.get $_1) (i64.const 32))) (then - (unreachable))) - (local.set $v (i32.wrap_i64 (local.get $_1))) - - ) - (local.get $v) -) - -(func $u256_to_i32 - (param $x4 i64) - (result i32) - (local $v i32) - (block $label__2 - (if (i64.ne (i64.const 0) (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.const 0))) (then - (unreachable))) - (if (i64.ne (i64.const 0) (i64.shr_u (local.get $x4) (i64.const 32))) (then - (unreachable))) - (local.set $v (i32.wrap_i64 (local.get $x4))) - - ) - (local.get $v) -) - -(func $u256_to_i32_716 - (result i32) - (local $v i32) - (block $label__3 - (if (i64.ne (i64.const 0) (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.const 0))) (then - (unreachable))) - (if (i64.ne (i64.const 0) (i64.shr_u (i64.const 64) (i64.const 32))) (then - (unreachable))) - (local.set $v (i32.wrap_i64 (i64.const 64))) - - ) - (local.get $v) -) - -(func $to_internal_i32ptr_334 - (result i32) - (local $r i32) - (local $p i32) - (block $label__4 - (local.set $p (call $u256_to_i32_333)) - (local.set $r (i32.add (local.get $p) (i32.const 64))) - (if (i32.lt_u (local.get $r) (local.get $p)) (then - (unreachable))) - - ) - (local.get $r) -) - -(func $to_internal_i32ptr - (result i32) - (local $r i32) - (local $v i32) - (block $label__5 - (if (i64.ne (i64.const 0) (i64.or (i64.or (i64.const 0) (i64.const 0)) (i64.const 0))) (then - (unreachable))) - (if (i64.ne (i64.const 0) (i64.shr_u (i64.const 128) (i64.const 32))) (then - (unreachable))) - (local.set $v (i32.wrap_i64 (i64.const 128))) - (local.set $r (i32.add (local.get $v) (i32.const 64))) - (if (i32.lt_u (local.get $r) (local.get $v)) (then - (unreachable))) - - ) - (local.get $r) -) - -(func $bswap16 - (param $x i32) - (result i32) - (local $y i32) - (block $label__6 - (local.set $y (i32.or (i32.and (i32.shl (local.get $x) (i32.const 8)) (i32.const 65280)) (i32.and (i32.shr_u (local.get $x) (i32.const 8)) (i32.const 255)))) - - ) - (local.get $y) -) - -(func $bswap32 - (param $x i32) - (result i32) - (local $y i32) - (local $hi i32) - (block $label__7 - (local.set $hi (i32.shl (call $bswap16 (local.get $x)) (i32.const 16))) - (local.set $y (i32.or (local.get $hi) (call $bswap16 (i32.shr_u (local.get $x) (i32.const 16))))) - - ) - (local.get $y) -) - -(func $bswap64 - (result i64) - (local $y i64) - (local $hi i64) - (block $label__8 - (local.set $hi (i64.shl (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.const 128)))) (i64.const 32))) - (local.set $y (i64.or (local.get $hi) (i64.extend_i32_u (call $bswap32 (i32.wrap_i64 (i64.shr_u (i64.const 128) (i64.const 32))))))) - - ) - (local.get $y) -) - -) -" - } - } - } - }, - "sources": - { - "A": - { - "id": 0 - } - } -} diff --git a/test/cmdlineTests/standard_ewasm_requested_abstract/input.json b/test/cmdlineTests/standard_ewasm_requested_abstract/input.json deleted file mode 100644 index 2ee666fe2d58..000000000000 --- a/test/cmdlineTests/standard_ewasm_requested_abstract/input.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "language": "Solidity", - "sources": - { - "A": - { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0; pragma abicoder v2; abstract contract C { }" - } - }, - "settings": - { - "optimizer": - { - "enabled": true, - "details": {"yul": true} - }, - "outputSelection": - { - "*": { "*": ["ewasm.wast", "ewasm.wasm"] } - } - } -} diff --git a/test/cmdlineTests/standard_ewasm_requested_abstract/output.json b/test/cmdlineTests/standard_ewasm_requested_abstract/output.json deleted file mode 100644 index 14a4ef2df946..000000000000 --- a/test/cmdlineTests/standard_ewasm_requested_abstract/output.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "contracts": - { - "A": - { - "C": - { - "ewasm": - { - "wasm": "", - "wast": "" - } - } - } - }, - "sources": - { - "A": - { - "id": 0 - } - } -} diff --git a/test/cmdlineTests/strict_asm_options_in_non_asm_mode/args b/test/cmdlineTests/strict_asm_options_in_non_asm_mode/args index 6f9a273ab6a0..9efe91f61f29 100644 --- a/test/cmdlineTests/strict_asm_options_in_non_asm_mode/args +++ b/test/cmdlineTests/strict_asm_options_in_non_asm_mode/args @@ -1 +1 @@ ---yul-dialect evm --machine ewasm +--yul-dialect evm --machine evm diff --git a/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/args b/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/args deleted file mode 100644 index 647c63654cfa..000000000000 --- a/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/args +++ /dev/null @@ -1 +0,0 @@ ---strict-assembly --optimize --ewasm-ir diff --git a/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/input.yul b/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/input.yul deleted file mode 100644 index 4fa5ef66f8da..000000000000 --- a/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/input.yul +++ /dev/null @@ -1,4 +0,0 @@ -{ - let x := 42 - sstore(0, x) -} diff --git a/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/output b/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/output deleted file mode 100644 index 8026a6e83e85..000000000000 --- a/test/cmdlineTests/strict_asm_output_selection_ewasm_ir_only/output +++ /dev/null @@ -1,2 +0,0 @@ - -======= strict_asm_output_selection_ewasm_ir_only/input.yul (EVM) ======= diff --git a/test/cmdlineTests/strict_asm_output_selection_ewasm_only/args b/test/cmdlineTests/strict_asm_output_selection_ewasm_only/args deleted file mode 100644 index bb147ae337d9..000000000000 --- a/test/cmdlineTests/strict_asm_output_selection_ewasm_only/args +++ /dev/null @@ -1 +0,0 @@ ---strict-assembly --optimize --ewasm diff --git a/test/cmdlineTests/strict_asm_output_selection_ewasm_only/input.yul b/test/cmdlineTests/strict_asm_output_selection_ewasm_only/input.yul deleted file mode 100644 index 4fa5ef66f8da..000000000000 --- a/test/cmdlineTests/strict_asm_output_selection_ewasm_only/input.yul +++ /dev/null @@ -1,4 +0,0 @@ -{ - let x := 42 - sstore(0, x) -} diff --git a/test/cmdlineTests/strict_asm_output_selection_ewasm_only/output b/test/cmdlineTests/strict_asm_output_selection_ewasm_only/output deleted file mode 100644 index f90f049aaa49..000000000000 --- a/test/cmdlineTests/strict_asm_output_selection_ewasm_only/output +++ /dev/null @@ -1,2 +0,0 @@ - -======= strict_asm_output_selection_ewasm_only/input.yul (EVM) ======= diff --git a/test/cmdlineTests/strict_asm_output_selection_invalid/args b/test/cmdlineTests/strict_asm_output_selection_invalid/args index 85814eb29b53..daeb64aae98b 100644 --- a/test/cmdlineTests/strict_asm_output_selection_invalid/args +++ b/test/cmdlineTests/strict_asm_output_selection_invalid/args @@ -1 +1 @@ ---strict-assembly --asm --asm-json --opcodes --bin --bin-runtime --abi --ir --ir-optimized --ewasm --hashes --userdoc --devdoc --metadata --storage-layout +--strict-assembly --asm --asm-json --opcodes --bin --bin-runtime --abi --ir --ir-optimized --hashes --userdoc --devdoc --metadata --storage-layout diff --git a/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/args b/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/args deleted file mode 100644 index 04cd5f05ba49..000000000000 --- a/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/args +++ /dev/null @@ -1 +0,0 @@ ---yul --yul-dialect ewasm --machine ewasm diff --git a/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/input.yul b/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/input.yul deleted file mode 100644 index 2b1a6d9606c0..000000000000 --- a/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/input.yul +++ /dev/null @@ -1,17 +0,0 @@ -object "object" { - code { - function main() - { - let m:i64, n:i32, p:i32, q:i64 := multireturn(1:i32, 2:i64, 3:i64, 4:i32) - } - - function multireturn(a:i32, b:i64, c:i64, d:i32) -> x:i64, y:i32, z:i32, w:i64 - { - x := b - w := c - - y := a - z := d - } - } -} diff --git a/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/output b/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/output deleted file mode 100644 index 4a3ef4eba760..000000000000 --- a/test/cmdlineTests/wasm_to_wasm_function_returning_multiple_values/output +++ /dev/null @@ -1,73 +0,0 @@ - -======= wasm_to_wasm_function_returning_multiple_values/input.yul (Ewasm) ======= - -Pretty printed source: -object "object" { - code { - function main() - { - let m, n:i32, p:i32, q := multireturn(1:i32, 2, 3, 4:i32) - } - function multireturn(a:i32, b, c, d:i32) -> x, y:i32, z:i32, w - { - x := b - w := c - y := a - z := d - } - } -} - - -Binary representation: -0061736d01000000010c0260000060047f7e7e7f017e020100030302000105030100010610037f0141000b7f0141000b7e0142000b071102066d656d6f72790200046d61696e00000a52022603017e027f017e024002404101420242034104100121002300210123012102230221030b0b0b2903017e027f017e0240200121042002210720002105200321060b20052400200624012007240220040b - -Text representation: -(module - (memory $memory (export "memory") 1) - (export "main" (func $main)) - (global $global_ (mut i32) (i32.const 0)) - (global $global__1 (mut i32) (i32.const 0)) - (global $global__2 (mut i64) (i64.const 0)) - -(func $main - (local $m i64) - (local $n i32) - (local $p i32) - (local $q i64) - (block $label_ - (block - (local.set $m (call $multireturn (i32.const 1) (i64.const 2) (i64.const 3) (i32.const 4))) - (local.set $n (global.get $global_)) - (local.set $p (global.get $global__1)) - (local.set $q (global.get $global__2)) - - ) - - ) -) - -(func $multireturn - (param $a i32) - (param $b i64) - (param $c i64) - (param $d i32) - (result i64) - (local $x i64) - (local $y i32) - (local $z i32) - (local $w i64) - (block $label__3 - (local.set $x (local.get $b)) - (local.set $w (local.get $c)) - (local.set $y (local.get $a)) - (local.set $z (local.get $d)) - - ) - (global.set $global_ (local.get $y)) - (global.set $global__1 (local.get $z)) - (global.set $global__2 (local.get $w)) - (local.get $x) -) - -) diff --git a/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/args b/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/args deleted file mode 100644 index 04cd5f05ba49..000000000000 --- a/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/args +++ /dev/null @@ -1 +0,0 @@ ---yul --yul-dialect ewasm --machine ewasm diff --git a/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/input.yul b/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/input.yul deleted file mode 100644 index 731e6c9bb21a..000000000000 --- a/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/input.yul +++ /dev/null @@ -1,8 +0,0 @@ -object "object" { - code { - function main() - { - i64.store8(0x01:i32, 42:i64) - } - } -} diff --git a/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/output b/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/output deleted file mode 100644 index e0cc44e57771..000000000000 --- a/test/cmdlineTests/wasm_to_wasm_memory_instructions_alignment/output +++ /dev/null @@ -1,27 +0,0 @@ - -======= wasm_to_wasm_memory_instructions_alignment/input.yul (Ewasm) ======= - -Pretty printed source: -object "object" { - code { - function main() - { i64.store8(0x01:i32, 42) } - } -} - - -Binary representation: -0061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a0e010c0002404101422a3c00000b0b - -Text representation: -(module - (memory $memory (export "memory") 1) - (export "main" (func $main)) - -(func $main - (block $label_ - (i64.store8 (i32.const 1) (i64.const 42)) - ) -) - -) diff --git a/test/cmdlineTests/yul_to_wasm_source_location_crash/args b/test/cmdlineTests/yul_to_wasm_source_location_crash/args deleted file mode 100644 index 254a1883c133..000000000000 --- a/test/cmdlineTests/yul_to_wasm_source_location_crash/args +++ /dev/null @@ -1 +0,0 @@ ---strict-assembly --yul-dialect evm --machine ewasm --optimize --ewasm-ir diff --git a/test/cmdlineTests/yul_to_wasm_source_location_crash/input.yul b/test/cmdlineTests/yul_to_wasm_source_location_crash/input.yul deleted file mode 100644 index 89e060931b95..000000000000 --- a/test/cmdlineTests/yul_to_wasm_source_location_crash/input.yul +++ /dev/null @@ -1,4 +0,0 @@ -/// @use-src 0:"test.sol" -object "C" { - code { sstore(0,0) } -} diff --git a/test/cmdlineTests/yul_to_wasm_source_location_crash/output b/test/cmdlineTests/yul_to_wasm_source_location_crash/output deleted file mode 100644 index 29ff631aa52a..000000000000 --- a/test/cmdlineTests/yul_to_wasm_source_location_crash/output +++ /dev/null @@ -1,34 +0,0 @@ - -======= yul_to_wasm_source_location_crash/input.yul (Ewasm) ======= - -========================== - -Translated source: -/// @use-src 0:"test.sol" -object "C" { - code { - function main() - { - let hi := i64.shl(i64.extend_i32_u(bswap32(i32.wrap_i64(0))), 32) - let y := i64.or(hi, i64.extend_i32_u(bswap32(i32.wrap_i64(i64.shr_u(0, 32))))) - i64.store(0:i32, y) - i64.store(i32.add(0:i32, 8:i32), y) - i64.store(i32.add(0:i32, 16:i32), y) - i64.store(i32.add(0:i32, 24:i32), y) - i64.store(32:i32, y) - i64.store(i32.add(32:i32, 8:i32), y) - i64.store(i32.add(32:i32, 16:i32), y) - i64.store(i32.add(32:i32, 24:i32), y) - eth.storageStore(0:i32, 32:i32) - } - function bswap16(x:i32) -> y:i32 - { - y := i32.or(i32.and(i32.shl(x, 8:i32), 0xff00:i32), i32.and(i32.shr_u(x, 8:i32), 0xff:i32)) - } - function bswap32(x:i32) -> y:i32 - { - let hi:i32 := i32.shl(bswap16(x), 16:i32) - y := i32.or(hi, bswap16(i32.shr_u(x, 16:i32))) - } - } -} diff --git a/test/libsolidity/ASTJSON/abstract_contract.sol b/test/libsolidity/ASTJSON/abstract_contract.sol index bddbc177931a..3ef96612f5fb 100644 --- a/test/libsolidity/ASTJSON/abstract_contract.sol +++ b/test/libsolidity/ASTJSON/abstract_contract.sol @@ -2,5 +2,4 @@ abstract contract C { constructor() { } } - // ---- diff --git a/test/libsolidity/ASTJSON/address_payable.sol b/test/libsolidity/ASTJSON/address_payable.sol index 28c9c8a20da4..f9ebb124ebaf 100644 --- a/test/libsolidity/ASTJSON/address_payable.sol +++ b/test/libsolidity/ASTJSON/address_payable.sol @@ -7,5 +7,4 @@ contract C { m[c] = payable(0); } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/call.sol b/test/libsolidity/ASTJSON/assembly/call.sol index 09d1ce184378..1735fd7f7e22 100644 --- a/test/libsolidity/ASTJSON/assembly/call.sol +++ b/test/libsolidity/ASTJSON/assembly/call.sol @@ -3,5 +3,4 @@ contract C { assembly { pop(call(0, 1, 2, 3, 4, 5, 6)) } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/empty_block.sol b/test/libsolidity/ASTJSON/assembly/empty_block.sol index 23c2babbe36d..33bb796ea615 100644 --- a/test/libsolidity/ASTJSON/assembly/empty_block.sol +++ b/test/libsolidity/ASTJSON/assembly/empty_block.sol @@ -3,5 +3,4 @@ contract C { assembly { {} } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/function.sol b/test/libsolidity/ASTJSON/assembly/function.sol index 6020f1f51318..1edf2f2de24d 100644 --- a/test/libsolidity/ASTJSON/assembly/function.sol +++ b/test/libsolidity/ASTJSON/assembly/function.sol @@ -3,5 +3,4 @@ contract C { assembly { function g() { pop(blockhash(20)) } g() } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/leave.sol b/test/libsolidity/ASTJSON/assembly/leave.sol index 5ae4a9e0dd09..39f1cafedb22 100644 --- a/test/libsolidity/ASTJSON/assembly/leave.sol +++ b/test/libsolidity/ASTJSON/assembly/leave.sol @@ -3,5 +3,4 @@ contract C { assembly { function f() { leave } } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/loop.sol b/test/libsolidity/ASTJSON/assembly/loop.sol index bba8d282f63d..baa45e62c489 100644 --- a/test/libsolidity/ASTJSON/assembly/loop.sol +++ b/test/libsolidity/ASTJSON/assembly/loop.sol @@ -3,5 +3,4 @@ contract C { assembly { for {} 1 { pop(sload(0)) } { break continue } } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/nested_functions.sol b/test/libsolidity/ASTJSON/assembly/nested_functions.sol index 396efa0bf8a2..42479fa94ad3 100644 --- a/test/libsolidity/ASTJSON/assembly/nested_functions.sol +++ b/test/libsolidity/ASTJSON/assembly/nested_functions.sol @@ -8,5 +8,4 @@ contract C { } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/slot_offset.sol b/test/libsolidity/ASTJSON/assembly/slot_offset.sol index d3c8f75542e2..0cc2b07c116b 100644 --- a/test/libsolidity/ASTJSON/assembly/slot_offset.sol +++ b/test/libsolidity/ASTJSON/assembly/slot_offset.sol @@ -5,5 +5,4 @@ contract C { assembly { let x := s.offset let y := mul(s.slot, 2) } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/stringlit.sol b/test/libsolidity/ASTJSON/assembly/stringlit.sol index e382095ad0be..6f5278ac17f1 100644 --- a/test/libsolidity/ASTJSON/assembly/stringlit.sol +++ b/test/libsolidity/ASTJSON/assembly/stringlit.sol @@ -3,5 +3,4 @@ contract C { assembly { let x := "abc" } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/switch.sol b/test/libsolidity/ASTJSON/assembly/switch.sol index c04d311b09e4..a7a23d26aac3 100644 --- a/test/libsolidity/ASTJSON/assembly/switch.sol +++ b/test/libsolidity/ASTJSON/assembly/switch.sol @@ -8,5 +8,4 @@ contract C { } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/switch_default.sol b/test/libsolidity/ASTJSON/assembly/switch_default.sol index 1f61896fe275..0760bb7dfdb7 100644 --- a/test/libsolidity/ASTJSON/assembly/switch_default.sol +++ b/test/libsolidity/ASTJSON/assembly/switch_default.sol @@ -3,5 +3,4 @@ contract C { assembly { switch 0 case 0 {} default {} } } } - // ---- diff --git a/test/libsolidity/ASTJSON/assembly/var_access.sol b/test/libsolidity/ASTJSON/assembly/var_access.sol index 768f38c3342c..e4b7423fde04 100644 --- a/test/libsolidity/ASTJSON/assembly/var_access.sol +++ b/test/libsolidity/ASTJSON/assembly/var_access.sol @@ -4,5 +4,4 @@ contract C { assembly { x := 7 } } } - // ---- diff --git a/test/libsolidity/ASTJSON/constructor.sol b/test/libsolidity/ASTJSON/constructor.sol index b2b1c646048b..b48aa1be342a 100644 --- a/test/libsolidity/ASTJSON/constructor.sol +++ b/test/libsolidity/ASTJSON/constructor.sol @@ -2,5 +2,4 @@ contract C { constructor() { } } - // ---- diff --git a/test/libsolidity/ASTJSON/documentation.sol b/test/libsolidity/ASTJSON/documentation.sol index 4d354dd26a1d..6bbf4042af60 100644 --- a/test/libsolidity/ASTJSON/documentation.sol +++ b/test/libsolidity/ASTJSON/documentation.sol @@ -16,5 +16,4 @@ contract C { /** Some comment on mod.*/ modifier mod() { _; } /** Some comment on fn.*/ function fn() public {} } - // ---- diff --git a/test/libsolidity/ASTJSON/documentation_local_variable.sol b/test/libsolidity/ASTJSON/documentation_local_variable.sol index b21602d9280b..a593e0194a9a 100644 --- a/test/libsolidity/ASTJSON/documentation_local_variable.sol +++ b/test/libsolidity/ASTJSON/documentation_local_variable.sol @@ -21,5 +21,4 @@ contract C { uint param3 ) public {} } - // ---- diff --git a/test/libsolidity/ASTJSON/documentation_on_statements.sol b/test/libsolidity/ASTJSON/documentation_on_statements.sol index 235fa3d20bb4..9506bb05c165 100644 --- a/test/libsolidity/ASTJSON/documentation_on_statements.sol +++ b/test/libsolidity/ASTJSON/documentation_on_statements.sol @@ -12,5 +12,4 @@ contract C { return x; } } - // ---- diff --git a/test/libsolidity/ASTJSON/documentation_triple.sol b/test/libsolidity/ASTJSON/documentation_triple.sol index 578933d9c74e..5b14e58f6f05 100644 --- a/test/libsolidity/ASTJSON/documentation_triple.sol +++ b/test/libsolidity/ASTJSON/documentation_triple.sol @@ -12,5 +12,4 @@ contract C { return x; } } - // ---- diff --git a/test/libsolidity/ASTJSON/event_with_variables_of_internal_types.sol b/test/libsolidity/ASTJSON/event_with_variables_of_internal_types.sol index a2291057003d..6fe58c39c168 100644 --- a/test/libsolidity/ASTJSON/event_with_variables_of_internal_types.sol +++ b/test/libsolidity/ASTJSON/event_with_variables_of_internal_types.sol @@ -1,5 +1,4 @@ contract C { event E(function() internal); } - // ---- diff --git a/test/libsolidity/ASTJSON/fail_after_parsing.sol b/test/libsolidity/ASTJSON/fail_after_parsing.sol index b3b53a7c1611..882b4c950267 100644 --- a/test/libsolidity/ASTJSON/fail_after_parsing.sol +++ b/test/libsolidity/ASTJSON/fail_after_parsing.sol @@ -11,6 +11,5 @@ interface I { uint calldata c = 123.4; } } - // ---- // failAfter: Parsed diff --git a/test/libsolidity/ASTJSON/fallback.sol b/test/libsolidity/ASTJSON/fallback.sol index 219d85db593a..170e77958c97 100644 --- a/test/libsolidity/ASTJSON/fallback.sol +++ b/test/libsolidity/ASTJSON/fallback.sol @@ -2,5 +2,4 @@ contract C { fallback() external payable { } } - // ---- diff --git a/test/libsolidity/ASTJSON/fallback_and_receive_ether.sol b/test/libsolidity/ASTJSON/fallback_and_receive_ether.sol index 89acccf5a603..7eb712582db6 100644 --- a/test/libsolidity/ASTJSON/fallback_and_receive_ether.sol +++ b/test/libsolidity/ASTJSON/fallback_and_receive_ether.sol @@ -4,5 +4,4 @@ contract C { fallback() external payable { } } - // ---- diff --git a/test/libsolidity/ASTJSON/fallback_payable.sol b/test/libsolidity/ASTJSON/fallback_payable.sol index d66d378aff8d..7eff747af373 100644 --- a/test/libsolidity/ASTJSON/fallback_payable.sol +++ b/test/libsolidity/ASTJSON/fallback_payable.sol @@ -1,5 +1,4 @@ contract C { fallback() external {} } - // ---- diff --git a/test/libsolidity/ASTJSON/mappings.sol b/test/libsolidity/ASTJSON/mappings.sol index 05912d21f703..5412ca601eb9 100644 --- a/test/libsolidity/ASTJSON/mappings.sol +++ b/test/libsolidity/ASTJSON/mappings.sol @@ -5,5 +5,4 @@ contract C { mapping(E => bool) c; mapping(address keyAddress => uint256 value) d; } - // ---- diff --git a/test/libsolidity/ASTJSON/mutability.sol b/test/libsolidity/ASTJSON/mutability.sol index 7688186e773f..3f67c29e0981 100644 --- a/test/libsolidity/ASTJSON/mutability.sol +++ b/test/libsolidity/ASTJSON/mutability.sol @@ -4,5 +4,4 @@ contract C uint public constant b = 2; uint public c = 3; } - // ---- diff --git a/test/libsolidity/ASTJSON/not_existing_import.sol b/test/libsolidity/ASTJSON/not_existing_import.sol index 7251a02b84a5..ad3c100c499b 100644 --- a/test/libsolidity/ASTJSON/not_existing_import.sol +++ b/test/libsolidity/ASTJSON/not_existing_import.sol @@ -4,6 +4,5 @@ contract C is NotExisting.X NotExisting.SomeStruct public myStruct; constructor() {} } - // ---- // failAfter: Parsed diff --git a/test/libsolidity/ASTJSON/override.sol b/test/libsolidity/ASTJSON/override.sol index 1aaa58c600ab..a03244985744 100644 --- a/test/libsolidity/ASTJSON/override.sol +++ b/test/libsolidity/ASTJSON/override.sol @@ -9,5 +9,4 @@ contract C is B { function foo() public override { } function faa() public override { } } - // ---- diff --git a/test/libsolidity/ASTJSON/receive_ether.sol b/test/libsolidity/ASTJSON/receive_ether.sol index f75a43b2dfd1..1e59dc1317bc 100644 --- a/test/libsolidity/ASTJSON/receive_ether.sol +++ b/test/libsolidity/ASTJSON/receive_ether.sol @@ -2,5 +2,4 @@ contract C { receive() external payable { } } - // ---- diff --git a/test/libsolidity/ASTJSON/two_base_functions.sol b/test/libsolidity/ASTJSON/two_base_functions.sol index 89c8e207a531..0a00bcc14505 100644 --- a/test/libsolidity/ASTJSON/two_base_functions.sol +++ b/test/libsolidity/ASTJSON/two_base_functions.sol @@ -7,5 +7,4 @@ contract B { contract C is A, B { function f() public override(A, B) {} } - // ---- diff --git a/test/libsolidity/ASTJSON/used_errors.sol b/test/libsolidity/ASTJSON/used_errors.sol index 24c03982fed6..97f7a27f48e2 100644 --- a/test/libsolidity/ASTJSON/used_errors.sol +++ b/test/libsolidity/ASTJSON/used_errors.sol @@ -4,5 +4,4 @@ contract C { error T(); function h() public { f(); } } - // ---- diff --git a/test/libsolidity/ASTJSON/userDefinedValueType.sol b/test/libsolidity/ASTJSON/userDefinedValueType.sol index f1124f8cd6fd..d5ef2e00b9f8 100644 --- a/test/libsolidity/ASTJSON/userDefinedValueType.sol +++ b/test/libsolidity/ASTJSON/userDefinedValueType.sol @@ -9,5 +9,4 @@ contract C { type MyUInt is uint; mapping(MyAddress => MyUInt) public m; } - // ---- diff --git a/test/libsolidity/ASTJSON/user_defined_operator.sol b/test/libsolidity/ASTJSON/user_defined_operator.sol index df5d0ed32609..bfbdf7b9bf83 100644 --- a/test/libsolidity/ASTJSON/user_defined_operator.sol +++ b/test/libsolidity/ASTJSON/user_defined_operator.sol @@ -7,5 +7,4 @@ contract C { return -a - b; } } - // ---- diff --git a/test/libsolidity/ASTJSON/yul_hex_literal.sol b/test/libsolidity/ASTJSON/yul_hex_literal.sol index f441866c1d1b..c3b57a8fe8d2 100644 --- a/test/libsolidity/ASTJSON/yul_hex_literal.sol +++ b/test/libsolidity/ASTJSON/yul_hex_literal.sol @@ -7,5 +7,4 @@ contract Sample { } } } - // ---- diff --git a/test/libsolidity/SemanticTest.cpp b/test/libsolidity/SemanticTest.cpp index 4746999a3ec8..1d8a9c9c09ce 100644 --- a/test/libsolidity/SemanticTest.cpp +++ b/test/libsolidity/SemanticTest.cpp @@ -50,7 +50,6 @@ SemanticTest::SemanticTest( langutil::EVMVersion _evmVersion, optional _eofVersion, vector const& _vmPaths, - bool _enforceCompileToEwasm, bool _enforceGasCost, u256 _enforceGasCostMinValue ): @@ -60,7 +59,6 @@ SemanticTest::SemanticTest( m_lineOffset(m_reader.lineNumber()), m_builtins(makeBuiltins()), m_sideEffectHooks(makeSideEffectHooks()), - m_enforceCompileToEwasm(_enforceCompileToEwasm), m_enforceGasCost(_enforceGasCost), m_enforceGasCostMinValue(std::move(_enforceGasCostMinValue)) { @@ -83,25 +81,6 @@ SemanticTest::SemanticTest( m_testCaseWantsYulRun = util::contains(yulRunTriggers, compileViaYul); m_testCaseWantsLegacyRun = util::contains(legacyRunTriggers, compileViaYul); - // Do not enforce ewasm, if via yul was explicitly denied. - if (compileViaYul == "false") - m_enforceCompileToEwasm = false; - - string compileToEwasm = m_reader.stringSetting("compileToEwasm", "false"); - if (compileToEwasm == "also") - m_testCaseWantsEwasmRun = true; - else if (compileToEwasm == "false") - m_testCaseWantsEwasmRun = false; - else - BOOST_THROW_EXCEPTION(runtime_error("Invalid compileToEwasm value: " + compileToEwasm + ".")); - - if (m_testCaseWantsEwasmRun && !m_testCaseWantsYulRun) - BOOST_THROW_EXCEPTION(runtime_error("Invalid compileToEwasm value: " + compileToEwasm + ", compileViaYul need to be enabled.")); - - // run ewasm tests only if an ewasm evmc vm was defined - if (m_testCaseWantsEwasmRun && !m_supportsEwasm) - m_testCaseWantsEwasmRun = false; - auto revertStrings = revertStringsFromString(m_reader.stringSetting("revertStrings", "default")); soltestAssert(revertStrings, "Invalid revertStrings setting."); m_revertStrings = revertStrings.value(); @@ -298,24 +277,10 @@ TestCase::TestResult SemanticTest::run(ostream& _stream, string const& _linePref TestResult result = TestResult::Success; if (m_testCaseWantsLegacyRun && !m_eofVersion.has_value()) - result = runTest(_stream, _linePrefix, _formatted, false, false); + result = runTest(_stream, _linePrefix, _formatted, false); if (m_testCaseWantsYulRun && result == TestResult::Success) - result = runTest(_stream, _linePrefix, _formatted, true, false); - - if (!m_eofVersion.has_value() && (m_testCaseWantsEwasmRun || m_enforceCompileToEwasm) && result == TestResult::Success) - { - // TODO: Once we have full Ewasm support, we could remove try/catch here. - try - { - result = runTest(_stream, _linePrefix, _formatted, true, true); - } - catch (...) - { - if (!m_enforceCompileToEwasm) - throw; - } - } + result = runTest(_stream, _linePrefix, _formatted, true); if (result != TestResult::Success) solidity::test::CommonOptions::get().printSelectedOptions( @@ -331,33 +296,19 @@ TestCase::TestResult SemanticTest::runTest( ostream& _stream, string const& _linePrefix, bool _formatted, - bool _isYulRun, - bool _isEwasmRun) + bool _isYulRun) { bool success = true; m_gasCostFailure = false; - if (_isEwasmRun) - { - soltestAssert(_isYulRun, ""); - selectVM(evmc_capabilities::EVMC_CAPABILITY_EWASM); - } - else - selectVM(evmc_capabilities::EVMC_CAPABILITY_EVM1); + selectVM(evmc_capabilities::EVMC_CAPABILITY_EVM1); reset(); m_compileViaYul = _isYulRun; - if (_isEwasmRun) - { - soltestAssert(m_compileViaYul, ""); - m_compileToEwasm = _isEwasmRun; - } - - m_canEnableEwasmRun = false; if (_isYulRun) - AnsiColorized(_stream, _formatted, {BOLD, CYAN}) << _linePrefix << "Running via Yul" << (_isEwasmRun ? " (ewasm):" : ":") << endl; + AnsiColorized(_stream, _formatted, {BOLD, CYAN}) << _linePrefix << "Running via Yul: " << endl; for (TestFunctionCall& test: m_tests) test.reset(); @@ -470,31 +421,8 @@ TestCase::TestResult SemanticTest::runTest( success &= test.call().expectedSideEffects == test.call().actualSideEffects; } - // Right now we have sometimes different test results in Yul vs. Ewasm. - // The main reason is that Ewasm just returns a failure in some cases. - // TODO: If Ewasm support got fully implemented, we could implement this in the same way as above. - if (success && !m_testCaseWantsEwasmRun && _isEwasmRun) - { - // TODO: There is something missing in Ewasm to support other types of revert strings: - // for now, we just ignore test-cases that do not use RevertStrings::Default. - if (m_revertStrings != RevertStrings::Default) - return TestResult::Success; - - m_canEnableEwasmRun = true; - AnsiColorized(_stream, _formatted, {BOLD, YELLOW}) << - _linePrefix << endl << - _linePrefix << "Test can pass via Yul (Ewasm), but marked with \"compileToEwasm: false.\"" << endl; - return TestResult::Failure; - } - if (!success) { - // Ignore failing tests that can't yet get compiled to Ewasm: - // if the test run was not successful and enforce compiling to ewasm was set, - // but the test case did not want to get run with Ewasm, we just ignore this failure. - if (m_enforceCompileToEwasm && !m_testCaseWantsEwasmRun) - return TestResult::Success; - AnsiColorized(_stream, _formatted, {BOLD, CYAN}) << _linePrefix << "Expected result:" << endl; for (TestFunctionCall const& test: m_tests) { @@ -647,21 +575,12 @@ void SemanticTest::printUpdatedExpectations(ostream& _stream, string const&) con void SemanticTest::printUpdatedSettings(ostream& _stream, string const& _linePrefix) { auto& settings = m_reader.settings(); - if (settings.empty() && !m_canEnableEwasmRun) + if (settings.empty()) return; _stream << _linePrefix << "// ====" << endl; - if (m_canEnableEwasmRun) - { - soltestAssert(m_testCaseWantsYulRun, ""); - _stream << _linePrefix << "// compileToEwasm: also\n"; - } - for (auto const& [settingName, settingValue]: settings) - if ( - !(settingName == "compileToEwasm" && m_canEnableEwasmRun) - ) - _stream << _linePrefix << "// " << settingName << ": " << settingValue<< endl; + _stream << _linePrefix << "// " << settingName << ": " << settingValue<< endl; } void SemanticTest::parseExpectations(istream& _stream) diff --git a/test/libsolidity/SemanticTest.h b/test/libsolidity/SemanticTest.h index c5abb93e270d..b5b7be83afa9 100644 --- a/test/libsolidity/SemanticTest.h +++ b/test/libsolidity/SemanticTest.h @@ -53,7 +53,6 @@ class SemanticTest: public SolidityExecutionFramework, public EVMVersionRestrict _options.evmVersion, _options.eofVersion, _options.vmPaths, - _options.enforceCompileToEwasm, _options.enforceGasCost, _options.enforceGasCostMinValue ); @@ -64,7 +63,6 @@ class SemanticTest: public SolidityExecutionFramework, public EVMVersionRestrict langutil::EVMVersion _evmVersion, std::optional _eofVersion, std::vector const& _vmPaths, - bool _enforceCompileToEwasm = false, bool _enforceGasCost = false, u256 _enforceGasCostMinValue = 100000 ); @@ -85,7 +83,7 @@ class SemanticTest: public SolidityExecutionFramework, public EVMVersionRestrict bool deploy(std::string const& _contractName, u256 const& _value, bytes const& _arguments, std::map const& _libraries = {}); private: - TestResult runTest(std::ostream& _stream, std::string const& _linePrefix, bool _formatted, bool _isYulRun, bool _isEwasmRun); + TestResult runTest(std::ostream& _stream, std::string const& _linePrefix, bool _formatted, bool _isYulRun); bool checkGasCostExpectation(TestFunctionCall& io_test, bool _compileViaYul) const; std::map makeBuiltins(); std::vector makeSideEffectHooks() const; @@ -98,12 +96,9 @@ class SemanticTest: public SolidityExecutionFramework, public EVMVersionRestrict std::map const m_builtins; std::vector const m_sideEffectHooks; bool m_testCaseWantsYulRun = true; - bool m_testCaseWantsEwasmRun = false; bool m_testCaseWantsLegacyRun = true; - bool m_enforceCompileToEwasm = false; bool m_runWithABIEncoderV1Only = false; bool m_allowNonExistingFunctions = false; - bool m_canEnableEwasmRun = false; bool m_gasCostFailure = false; bool m_enforceGasCost = false; u256 m_enforceGasCostMinValue; diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 268861fd2abc..b174419d21d2 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -53,33 +53,19 @@ using namespace solidity::langutil; #define ALSO_VIA_YUL(CODE) \ { \ - m_doEwasmTestrun = true; \ - \ m_compileViaYul = false; \ - m_compileToEwasm = false; \ { CODE } \ \ m_compileViaYul = true; \ reset(); \ { CODE } \ - \ - if (m_doEwasmTestrun) \ - { \ - m_compileToEwasm = true; \ - reset(); \ - { CODE } \ - } \ } -#define DISABLE_EWASM_TESTRUN() \ - { m_doEwasmTestrun = false; } - namespace solidity::frontend::test { struct SolidityEndToEndTestExecutionFramework: public SolidityExecutionFramework { - bool m_doEwasmTestrun = false; }; BOOST_FIXTURE_TEST_SUITE(SolidityEndToEndTest, SolidityEndToEndTestExecutionFramework) @@ -108,7 +94,6 @@ BOOST_AUTO_TEST_CASE(creation_code_optimizer) reset(); compileAndRun(codeC + codeD); ABI_CHECK(callContractFunction("f()"), encodeArgs(0x20, bytecodeC.size()) + encode(bytecodeC, false)); - m_doEwasmTestrun = false; }) } @@ -166,8 +151,6 @@ BOOST_AUTO_TEST_CASE(recursive_calls) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); function recursive_calls_cpp = [&recursive_calls_cpp](u256 const& n) -> u256 { @@ -193,8 +176,6 @@ BOOST_AUTO_TEST_CASE(while_loop) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto while_loop_cpp = [](u256 const& n) -> u256 @@ -223,8 +204,6 @@ BOOST_AUTO_TEST_CASE(do_while_loop) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto do_while_loop_cpp = [](u256 const& n) -> u256 @@ -270,8 +249,6 @@ BOOST_AUTO_TEST_CASE(do_while_loop_multiple_local_vars) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto do_while = [](u256 n) -> u256 @@ -322,8 +299,6 @@ BOOST_AUTO_TEST_CASE(nested_loops) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto nested_loops_cpp = [](u256 n) -> u256 @@ -390,8 +365,6 @@ BOOST_AUTO_TEST_CASE(nested_loops_multiple_local_vars) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto nested_loops_cpp = [](u256 n) -> u256 @@ -446,8 +419,6 @@ BOOST_AUTO_TEST_CASE(for_loop_multiple_local_vars) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto for_loop = [](u256 n) -> u256 @@ -509,8 +480,6 @@ BOOST_AUTO_TEST_CASE(nested_for_loop_multiple_local_vars) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto for_loop = [](u256 n) -> u256 @@ -551,8 +520,6 @@ BOOST_AUTO_TEST_CASE(for_loop) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto for_loop_cpp = [](u256 const& n) -> u256 @@ -580,8 +547,6 @@ BOOST_AUTO_TEST_CASE(for_loop_simple_init_expr) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto for_loop_simple_init_expr_cpp = [](u256 const& n) -> u256 @@ -621,7 +586,6 @@ BOOST_AUTO_TEST_CASE(for_loop_break_continue) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode); auto breakContinue = [](u256 const& n) -> u256 @@ -657,8 +621,6 @@ BOOST_AUTO_TEST_CASE(short_circuiting) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); auto short_circuiting_cpp = [](u256 n) -> u256 @@ -776,8 +738,6 @@ BOOST_AUTO_TEST_CASE(mapping_state_inc_dec) return --table[value++]; }; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); value = 0; table.clear(); @@ -804,8 +764,6 @@ BOOST_AUTO_TEST_CASE(multi_level_mapping) else return table[_x][_y] = _z; }; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); table.clear(); @@ -842,8 +800,6 @@ BOOST_AUTO_TEST_CASE(constructor) }; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); testContractAgainstCpp("get(uint256)", get, u256(6)); testContractAgainstCpp("get(uint256)", get, u256(7)); @@ -862,8 +818,6 @@ BOOST_AUTO_TEST_CASE(send_ether) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - u256 amount(250); compileAndRun(sourceCode, amount + 1); h160 address(23); @@ -896,8 +850,6 @@ BOOST_AUTO_TEST_CASE(transfer_ether) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode, 0, "B"); h160 const nonPayableRecipient = m_contractAddress; compileAndRun(sourceCode, 0, "C"); @@ -1237,8 +1189,6 @@ BOOST_AUTO_TEST_CASE(empty_name_input_parameter_with_named_one) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); BOOST_CHECK(callContractFunction("f(uint256,uint256)", 5, 9) != encodeArgs(5, 8)); ABI_CHECK(callContractFunction("f(uint256,uint256)", 5, 9), encodeArgs(9, 8)); @@ -1382,7 +1332,6 @@ BOOST_AUTO_TEST_CASE(library_call_protection) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "Lib"); ABI_CHECK(callContractFunction("np(Lib.S storage)", 0), encodeArgs()); ABI_CHECK(callContractFunction("v(Lib.S storage)", 0), encodeArgs(m_sender)); @@ -1406,7 +1355,6 @@ BOOST_AUTO_TEST_CASE(bytes_from_calldata_to_memory) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN(); compileAndRun(sourceCode); bytes calldata1 = util::selectorFromSignatureH32("f()").asBytes() + bytes(61, 0x22) + bytes(12, 0x12); sendMessage(calldata1, false); @@ -1446,7 +1394,6 @@ BOOST_AUTO_TEST_CASE(call_forward_bytes_length) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN(); compileAndRun(sourceCode, 0, "sender"); // No additional data, just function selector @@ -1485,7 +1432,6 @@ BOOST_AUTO_TEST_CASE(copying_bytes_multiassign) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "sender"); ABI_CHECK(callContractFunction("recv(uint256)", 7), bytes()); ABI_CHECK(callContractFunction("val()"), encodeArgs(0)); @@ -1508,7 +1454,6 @@ BOOST_AUTO_TEST_CASE(copy_from_calldata_removes_bytes_data) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode); ABI_CHECK(callContractFunction("set()", 1, 2, 3, 4, 5), encodeArgs(true)); BOOST_CHECK(!storageEmpty(m_contractAddress)); @@ -1569,7 +1514,6 @@ BOOST_AUTO_TEST_CASE(struct_referencing) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "L"); ABI_CHECK(callContractFunction("f()"), encodeArgs(0, 3)); ABI_CHECK(callContractFunction("g()"), encodeArgs(4)); @@ -1618,7 +1562,6 @@ BOOST_AUTO_TEST_CASE(enum_referencing) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "L"); ABI_CHECK(callContractFunction("f()"), encodeArgs(1)); ABI_CHECK(callContractFunction("g()"), encodeArgs(3)); @@ -1649,8 +1592,6 @@ BOOST_AUTO_TEST_CASE(bytes_in_arguments) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); string innercalldata1 = asString(util::selectorFromSignatureH32("f(uint256,uint256)").asBytes() + encodeArgs(8, 9)); @@ -1702,8 +1643,6 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_abi) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode); bytes valueSequence; for (size_t i = 0; i < 101; ++i) @@ -2138,8 +2077,6 @@ BOOST_AUTO_TEST_CASE(string_as_mapping_key) }; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode, 0, "Test"); for (unsigned i = 0; i < strings.size(); i++) ABI_CHECK(callContractFunction( @@ -2308,7 +2245,6 @@ BOOST_AUTO_TEST_CASE(library_call) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "Lib"); compileAndRun(sourceCode, 0, "Test", bytes(), map{{":Lib", m_contractAddress}}); ABI_CHECK(callContractFunction("f(uint256)", u256(33)), encodeArgs(u256(33) * 9)); @@ -2326,7 +2262,6 @@ BOOST_AUTO_TEST_CASE(library_function_external) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "Lib"); compileAndRun(sourceCode, 0, "Test", bytes(), map{{":Lib", m_contractAddress}}); ABI_CHECK(callContractFunction("f(bytes)", u256(0x20), u256(5), "abcde"), encodeArgs("c")); @@ -2478,7 +2413,6 @@ BOOST_AUTO_TEST_CASE(short_strings) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "A"); ABI_CHECK(callContractFunction("data1()"), encodeDyn(string("123"))); ABI_CHECK(callContractFunction("lengthChange()"), encodeArgs(u256(0))); @@ -2522,7 +2456,6 @@ BOOST_AUTO_TEST_CASE(reject_ether_sent_to_library) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "lib"); Address libraryAddress = m_contractAddress; compileAndRun(sourceCode, 10, "c"); @@ -2737,7 +2670,6 @@ BOOST_AUTO_TEST_CASE(non_payable_throw) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "C"); ABI_CHECK(callContractFunctionWithValue("f()", 27), encodeArgs()); BOOST_CHECK_EQUAL(balanceAt(m_contractAddress), 0); @@ -2784,7 +2716,6 @@ BOOST_AUTO_TEST_CASE(receive_external_function_type) )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "C"); ABI_CHECK(callContractFunction( "f(function)", @@ -2839,8 +2770,6 @@ BOOST_AUTO_TEST_CASE(contracts_separated_with_comment) contract C2 {} )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() - compileAndRun(sourceCode, 0, "C1"); compileAndRun(sourceCode, 0, "C2"); ) @@ -3308,7 +3237,6 @@ BOOST_AUTO_TEST_CASE(bare_call_return_data) } )DELIMITER"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "C"); ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_bool()"))), encodeArgs(true, 0x40, 0x20, true)); ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_int32()"))), encodeArgs(true, 0x40, 0x20, u256(-32))); @@ -3369,7 +3297,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePacked) for (auto v2: {false, true}) { ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() string prefix = "pragma abicoder " + string(v2 ? "v2" : "v1") + ";\n"; compileAndRun(prefix + sourceCode, 0, "C"); ABI_CHECK(callContractFunction("f0()"), encodeArgs(0x20, 0)); @@ -3447,7 +3374,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePacked_from_storage) for (auto v2: {false, true}) { ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() string prefix = "pragma abicoder " + string(v2 ? "v2" : "v1") + ";\n"; compileAndRun(prefix + sourceCode, 0, "C"); bytes payload = encodeArgs(0xfffff1, 0, 0xfffff2, 0, 0, 0xfffff3, 0, 0, 0xfffff4); @@ -3521,7 +3447,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePacked_from_memory) for (auto v2: {false, true}) { ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() string prefix = "pragma abicoder " + string(v2 ? "v2" : "v1") + ";\n"; compileAndRun(prefix + sourceCode, 0, "C"); bytes payload = encodeArgs(0xfffff1, 0, 0xfffff2, 0, 0, 0xfffff3, 0, 0, 0xfffff4); @@ -3568,7 +3493,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePacked_functionPtr) for (auto v2: {false, true}) { ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() string prefix = "pragma abicoder " + string(v2 ? "v2" : "v1") + ";\n"; compileAndRun(prefix + sourceCode, 0, "C"); string directEncoding = asString(fromHex("08" "1112131400000000000011121314000000000087" "26121ff0" "02")); @@ -3611,7 +3535,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePackedV2_structs) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "C"); bytes structEnc = encodeArgs(int(0x12), u256(-7), int(2), int(3), u256(-7), u256(-8)); ABI_CHECK(callContractFunction("testStorage()"), encodeArgs()); @@ -3647,7 +3570,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePackedV2_nestedArray) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "C"); bytes structEnc = encodeArgs(1, 2, 3, 0, 0, 0, 0, 4); ABI_CHECK(callContractFunction("testNestedArrays()"), encodeArgs()); @@ -3678,7 +3600,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePackedV2_arrayOfStrings) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "C"); bytes arrayEncoding = encodeArgs("abc", "0123456789012345678901234567890123456789"); ABI_CHECK(callContractFunction("testStorage()"), encodeArgs()); @@ -3798,7 +3719,6 @@ BOOST_AUTO_TEST_CASE(event_wrong_abi_name) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() compileAndRun(sourceCode, 0, "ClientReceipt", bytes()); compileAndRun(sourceCode, 0, "Test", bytes(), map{{":ClientReceipt", m_contractAddress}}); @@ -3874,7 +3794,6 @@ BOOST_AUTO_TEST_CASE(strip_reason_strings) } )"; ALSO_VIA_YUL( - DISABLE_EWASM_TESTRUN() m_revertStrings = RevertStrings::Default; compileAndRun(sourceCode, 0, "C"); diff --git a/test/libsolidity/SolidityExecutionFramework.cpp b/test/libsolidity/SolidityExecutionFramework.cpp index 3e8372ef78a7..7d18e1bb4aa5 100644 --- a/test/libsolidity/SolidityExecutionFramework.cpp +++ b/test/libsolidity/SolidityExecutionFramework.cpp @@ -53,7 +53,6 @@ bytes SolidityExecutionFramework::multiSourceCompileContract( entry.second = addPreamble(entry.second); m_compiler.reset(); - m_compiler.enableEwasmGeneration(m_compileToEwasm); m_compiler.setSources(sourcesWithPreamble); m_compiler.setLibraries(_libraryAddresses); m_compiler.setRevertStringBehaviour(m_revertStrings); @@ -83,46 +82,41 @@ bytes SolidityExecutionFramework::multiSourceCompileContract( evmasm::LinkerObject obj; if (m_compileViaYul) { - if (m_compileToEwasm) - obj = m_compiler.ewasmObject(contractName); - else + // Try compiling twice: If the first run fails due to stack errors, forcefully enable + // the optimizer. + for (bool forceEnableOptimizer: {false, true}) { - // Try compiling twice: If the first run fails due to stack errors, forcefully enable - // the optimizer. - for (bool forceEnableOptimizer: {false, true}) + OptimiserSettings optimiserSettings = m_optimiserSettings; + if (!forceEnableOptimizer && !optimiserSettings.runYulOptimiser) { - OptimiserSettings optimiserSettings = m_optimiserSettings; - if (!forceEnableOptimizer && !optimiserSettings.runYulOptimiser) - { - // Enable some optimizations on the first run - optimiserSettings.runYulOptimiser = true; - optimiserSettings.yulOptimiserSteps = "uljmul jmul"; - } - else if (forceEnableOptimizer) - optimiserSettings = OptimiserSettings::full(); + // Enable some optimizations on the first run + optimiserSettings.runYulOptimiser = true; + optimiserSettings.yulOptimiserSteps = "uljmul jmul"; + } + else if (forceEnableOptimizer) + optimiserSettings = OptimiserSettings::full(); - yul::YulStack asmStack( - m_evmVersion, - m_eofVersion, - yul::YulStack::Language::StrictAssembly, - optimiserSettings, - DebugInfoSelection::All() - ); - bool analysisSuccessful = asmStack.parseAndAnalyze("", m_compiler.yulIROptimized(contractName)); - solAssert(analysisSuccessful, "Code that passed analysis in CompilerStack can't have errors"); + yul::YulStack asmStack( + m_evmVersion, + m_eofVersion, + yul::YulStack::Language::StrictAssembly, + optimiserSettings, + DebugInfoSelection::All() + ); + bool analysisSuccessful = asmStack.parseAndAnalyze("", m_compiler.yulIROptimized(contractName)); + solAssert(analysisSuccessful, "Code that passed analysis in CompilerStack can't have errors"); - try - { - asmStack.optimize(); - obj = std::move(*asmStack.assemble(yul::YulStack::Machine::EVM).bytecode); - obj.link(_libraryAddresses); - break; - } - catch (...) - { - if (forceEnableOptimizer || optimiserSettings == OptimiserSettings::full()) - throw; - } + try + { + asmStack.optimize(); + obj = std::move(*asmStack.assemble(yul::YulStack::Machine::EVM).bytecode); + obj.link(_libraryAddresses); + break; + } + catch (...) + { + if (forceEnableOptimizer || optimiserSettings == OptimiserSettings::full()) + throw; } } } diff --git a/test/libsolidity/SolidityExecutionFramework.h b/test/libsolidity/SolidityExecutionFramework.h index 4865c68a2253..c2cea6600ae6 100644 --- a/test/libsolidity/SolidityExecutionFramework.h +++ b/test/libsolidity/SolidityExecutionFramework.h @@ -87,7 +87,6 @@ class SolidityExecutionFramework: public solidity::test::ExecutionFramework std::optional m_eofVersion; CompilerStack m_compiler; bool m_compileViaYul = false; - bool m_compileToEwasm = false; bool m_showMetadata = false; bool m_appendCBORMetadata = true; CompilerStack::MetadataHash m_metadataHash = CompilerStack::MetadataHash::IPFS; diff --git a/test/libsolidity/errorRecoveryTests/contract_recovery.sol b/test/libsolidity/errorRecoveryTests/contract_recovery.sol index 980c2beaba5c..082d91be6c76 100644 --- a/test/libsolidity/errorRecoveryTests/contract_recovery.sol +++ b/test/libsolidity/errorRecoveryTests/contract_recovery.sol @@ -1,7 +1,6 @@ contract Errort6 { using foo for ; // missing type name } - // ---- // ParserError 3546: (36-37): Expected type name // Warning 3796: (59-60): Recovered in ContractDefinition at '}'. diff --git a/test/libsolidity/errorRecoveryTests/error_to_eos.sol b/test/libsolidity/errorRecoveryTests/error_to_eos.sol index 6ecc6d9d63fe..5d09898601cc 100644 --- a/test/libsolidity/errorRecoveryTests/error_to_eos.sol +++ b/test/libsolidity/errorRecoveryTests/error_to_eos.sol @@ -15,7 +15,6 @@ contract SendCoin { return true; } } - // ---- // ParserError 6635: (235-236): Expected identifier but got '}' // ParserError 6635: (276-284): Expected ';' but got 'contract' diff --git a/test/libsolidity/lsp/rename/function.sol b/test/libsolidity/lsp/rename/function.sol index ffd8f6b58967..852086c2c785 100644 --- a/test/libsolidity/lsp/rename/function.sol +++ b/test/libsolidity/lsp/rename/function.sol @@ -40,7 +40,6 @@ function free() pure // ^^^^^^^^ @FunctionInFreeFunction // ^ @CursorInFreeFunction } - // ---- // -> textDocument/rename { // "newName": "Renamed", diff --git a/test/libsolidity/lsp/rename/import_directive.sol b/test/libsolidity/lsp/rename/import_directive.sol index a6b596866a7b..70d86f5d0619 100644 --- a/test/libsolidity/lsp/rename/import_directive.sol +++ b/test/libsolidity/lsp/rename/import_directive.sol @@ -26,7 +26,6 @@ contract C // ^^^^ @UserInPublicVariable // ^ @CursorOnUserInPublicVariable } - // ---- // contract: // -> textDocument/rename { diff --git a/test/libsolidity/lsp/rename/variable.sol b/test/libsolidity/lsp/rename/variable.sol index 39c23bcd72a8..a3c08f320229 100644 --- a/test/libsolidity/lsp/rename/variable.sol +++ b/test/libsolidity/lsp/rename/variable.sol @@ -24,7 +24,6 @@ function freeFunction(C _contract) view returns(int) // ^^^^^^^^ @VariableInFreeFunction // ^ @CursorOnVariableInFreeFunction } - // ---- // -> textDocument/rename { // "newName": "Renamed", diff --git a/test/libsolidity/lsp/semanticTokens/enums.sol b/test/libsolidity/lsp/semanticTokens/enums.sol index ea1655e1ef6f..848c08e7fe55 100644 --- a/test/libsolidity/lsp/semanticTokens/enums.sol +++ b/test/libsolidity/lsp/semanticTokens/enums.sol @@ -17,7 +17,6 @@ function getColorEnum() pure returns (Color result) { result = Color.Red; } - // ---- // -> textDocument/semanticTokens/full { // } diff --git a/test/libsolidity/lsp/semanticTokens/functions.sol b/test/libsolidity/lsp/semanticTokens/functions.sol index fee9af788783..a7a53495fddc 100644 --- a/test/libsolidity/lsp/semanticTokens/functions.sol +++ b/test/libsolidity/lsp/semanticTokens/functions.sol @@ -22,7 +22,6 @@ contract Contract return true; } } - // ---- // functions: @unusedVariable 2072 // -> textDocument/semanticTokens/full { diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_dynamic_array.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_dynamic_array.sol index 180d89ec185b..4d6b92073212 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_dynamic_array.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_dynamic_array.sol @@ -3,6 +3,5 @@ contract C { return abi.decode(data, (uint256[])); } } - // ---- // f(bytes): 0x20, 0xc0, 0x20, 0x4, 0x3, 0x4, 0x5, 0x6 -> 0x20, 0x4, 0x3, 0x4, 0x5, 0x6 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array.sol index 270a5abc0695..fd0a59abb8f6 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array.sol @@ -7,6 +7,5 @@ contract C { return abi.decode(data, (uint256[2][3])); } } - // ---- // f(bytes): 0x20, 0xc0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 -> 1, 2, 3, 4, 5, 6 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array_v2.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array_v2.sol index 5e4d03a7e044..e228099c4eb3 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array_v2.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_static_array_v2.sol @@ -10,6 +10,5 @@ contract C { return abi.decode(data, (uint256[2][3])); } } - // ---- // f(bytes): 0x20, 0xc0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 -> 1, 2, 3, 4, 5, 6 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_trivial.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_trivial.sol index 7b873951f676..c1b91815accf 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_trivial.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_trivial.sol @@ -3,6 +3,5 @@ contract C { return abi.decode(data, (uint256)); } } - // ---- // f(bytes): 0x20, 0x20, 0x21 -> 33 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2.sol index eb4bd70fbca3..782971c59c5d 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2.sol @@ -17,6 +17,5 @@ contract C { return abi.decode(abi.encode(s), (S)); } } - // ---- // f() -> 0x20, 0x8, 0x40, 0x3, 0x9, 0xa, 0xb diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_calldata.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_calldata.sol index ddfe343294a6..8bbb77b9aad0 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_calldata.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_calldata.sol @@ -11,6 +11,5 @@ contract C { return abi.decode(data, (S)); } } - // ---- // f(bytes): 0x20, 0xe0, 0x20, 0x21, 0x40, 0x3, 0xa, 0xb, 0xc -> 0x20, 0x21, 0x40, 0x3, 0xa, 0xb, 0xc diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol index 61360868be69..c13f004fba41 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_decode_v2_storage.sol @@ -19,7 +19,6 @@ contract C { return abi.decode(data, (S)); } } - // ---- // f() -> 0x20, 0x8, 0x40, 0x3, 0x9, 0xa, 0xb // gas irOptimized: 203166 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode.sol index 773b7d2c6600..1e654d281ce0 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode.sol @@ -27,9 +27,6 @@ contract C { return abi.encode(bytes2(x)); } } - -// ==== -// compileToEwasm: also // ---- // f0() -> 0x20, 0x0 // f1() -> 0x20, 0x40, 0x1, 0x2 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_call.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_call.sol index d73db5da6228..e34d46b74a42 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_call.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_call.sol @@ -21,6 +21,5 @@ contract C { return x; } } - // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_decode_simple.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_decode_simple.sol index fb093b41a7da..627f0b0c6b7f 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_decode_simple.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_decode_simple.sol @@ -4,8 +4,5 @@ contract C { return abi.decode(abi.encode(uint256(33), arg), (uint256, bytes)); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x21, 0x40, 0x7, "abcdefg" diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_empty_string.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_empty_string.sol index 7497d3c35a91..601fb3cbeea5 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_empty_string.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_empty_string.sol @@ -19,7 +19,6 @@ contract C { return abi.encodeWithSelector(0x00000001, msg); } } - // ==== // ABIEncoderV1Only: true // compileViaYul: false diff --git a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_rational.sol b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_rational.sol index c5ba49368f50..44cf1ab5b9fd 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_rational.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/abi_encode_rational.sol @@ -4,8 +4,5 @@ contract C { return abi.encode(1, -2); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0x40, 0x1, -2 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/calldata_arrays_too_large.sol b/test/libsolidity/semanticTests/abiEncoderV1/calldata_arrays_too_large.sol index b372a4c47a43..49bee94ea344 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/calldata_arrays_too_large.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/calldata_arrays_too_large.sol @@ -3,7 +3,5 @@ contract C { return 7; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256[],uint256): 6, 0x60, 9, 0x8000000000000000000000000000000000000000000000000000000000000002, 1, 2 -> FAILURE diff --git a/test/libsolidity/semanticTests/abiEncoderV1/decode_slice.sol b/test/libsolidity/semanticTests/abiEncoderV1/decode_slice.sol index 11e79dec03ff..35cb15077abc 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/decode_slice.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/decode_slice.sol @@ -5,8 +5,5 @@ contract C { f = abi.decode(msg.data[4 + 32 : 4 + 32 + 32], (uint256)); } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 42, 23 -> 42, 23, 42, 23 diff --git a/test/libsolidity/semanticTests/abiEncoderV1/dynamic_memory_copy.sol b/test/libsolidity/semanticTests/abiEncoderV1/dynamic_memory_copy.sol index 126c6c950bde..ef2b07cb5213 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/dynamic_memory_copy.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/dynamic_memory_copy.sol @@ -18,7 +18,6 @@ contract C { } } } - // ---- // test(bytes): 0x20, 0x80, 0x40, 0x60, 0, 0 -> false, false // test(bytes): 0x20, 0xC0, 0x40, 0x80, 1, 0x42, 1, 0x42 -> false, false diff --git a/test/libsolidity/semanticTests/abiEncoderV1/memory_dynamic_array_and_calldata_bytes.sol b/test/libsolidity/semanticTests/abiEncoderV1/memory_dynamic_array_and_calldata_bytes.sol index 3b2b90c6c3a1..f828ab41e88c 100644 --- a/test/libsolidity/semanticTests/abiEncoderV1/memory_dynamic_array_and_calldata_bytes.sol +++ b/test/libsolidity/semanticTests/abiEncoderV1/memory_dynamic_array_and_calldata_bytes.sol @@ -9,7 +9,6 @@ contract C { return f(a, b); } } - // ==== // EVMVersion: >homestead // ---- diff --git a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_empty_string_v2.sol b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_empty_string_v2.sol index 8db4674c22f8..849c24a91f3c 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_empty_string_v2.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_empty_string_v2.sol @@ -8,8 +8,5 @@ contract C { return (abi.encode(""), abi.encodePacked("")); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x40, 0xa0, 0x40, 0x20, 0x0, 0x0 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_rational_v2.sol b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_rational_v2.sol index 106c26ea9723..edd319d45a39 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_rational_v2.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_rational_v2.sol @@ -7,8 +7,5 @@ contract C { return abi.encode(1, -2); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0x40, 0x1, -2 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol index a0b732caed24..cdf2d3087d35 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/abi_encode_v2.sol @@ -44,7 +44,6 @@ contract C { require(y[0] == "e"); } } - // ---- // f0() -> 0x20, 0x0 // f1() -> 0x20, 0x40, 0x1, 0x2 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/bool_out_of_bounds.sol b/test/libsolidity/semanticTests/abiEncoderV2/bool_out_of_bounds.sol index 1a6856ff4d47..e47125707515 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/bool_out_of_bounds.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/bool_out_of_bounds.sol @@ -3,8 +3,6 @@ pragma abicoder v2; contract C { function f(bool b) public pure returns (bool) { return b; } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> true // f(bool): false -> false diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_dynamic_static_short_decode.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_dynamic_static_short_decode.sol index 9fab29f9f791..2d8095704751 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_dynamic_static_short_decode.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_dynamic_static_short_decode.sol @@ -5,8 +5,6 @@ contract C { return 23; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[][2][]): 0x20, 0x01, 0x20, 0x40, 0x60, 0x00, 0x00 -> 23 # this is the common encoding for x.length == 1 && x[0][0].length == 0 && x[0][1].length == 0 # // f(uint256[][2][]): 0x20, 0x01, 0x20, 0x00, 0x00 -> 23 # exotic, but still valid encoding # diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_dynamic_array_to_memory.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_dynamic_array_to_memory.sol index f044d6f05a42..1fca188a6857 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_dynamic_array_to_memory.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_dynamic_array_to_memory.sol @@ -13,7 +13,6 @@ contract C { return a; } } - // ---- // f(uint256[][]): 0x20, 2, 0x40, 0xa0, 2, 5, 6, 2, 7, 8 -> 0x20, 2, 0x40, 0xa0, 2, 5, 6, 2, 7, 8 // f(uint256[][]): 0x20, 2, 0x40, 0xa0, 2, 5, 6, 2, 7, 8, 9 -> 0x20, 2, 0x40, 0xa0, 2, 5, 6, 2, 7, 8 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol index 1b1f360f48d0..796488a9fe4a 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_dynamic_arrays.sol @@ -22,7 +22,6 @@ contract C { return abi.encode(s); } } - // ---- // f_memory(uint256[],uint256[2]): 0x20, 1, 2 -> 0x60, 0x01, 0x02, 1, 2 // f_memory(uint256[],uint256[2]): 0x40, 1, 2, 5, 6 -> 0x60, 1, 2, 2, 5, 6 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_nested_dynamic_arrays.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_nested_dynamic_arrays.sol index f7ed9daf4563..d5a3266f0520 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_nested_dynamic_arrays.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_overlapped_nested_dynamic_arrays.sol @@ -16,7 +16,6 @@ contract C { return a[which]; } } - // ---- // f_memory(uint256[][]): 0x20, 2, 0x40, 0x40, 2, 1, 2 -> 0x20, 2, 0x40, 0xa0, 2, 1, 2, 2, 1, 2 // f_memory(uint256[][]): 0x20, 2, 0x40, 0x60, 2, 1, 2 -> 0x20, 2, 0x40, 0xa0, 2, 1, 2, 1, 2 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_struct_array_reencode.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_struct_array_reencode.sol index d456cdfcc255..347710a30dd2 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_struct_array_reencode.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_struct_array_reencode.sol @@ -33,7 +33,6 @@ contract C { } } - // ---- // f((uint256[])): 0x20, 0x20, 0 -> 0x20, 0x60, 0x20, 0x20, 0 // f((uint256[])): 0x20, 0x20, 1 -> FAILURE diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_three_dimensional_dynamic_array_index_access.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_three_dimensional_dynamic_array_index_access.sol index a97c4f6d8a37..745bebe72891 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_three_dimensional_dynamic_array_index_access.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_three_dimensional_dynamic_array_index_access.sol @@ -23,7 +23,6 @@ contract C { return abi.encode(s[i][j].a); } } - // ==== // revertStrings: debug // ---- diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_with_garbage.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_with_garbage.sol index b126928546fd..58f68b8cc268 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_with_garbage.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_with_garbage.sol @@ -39,7 +39,6 @@ contract C { return (a[which], b[0]); } } - // ---- // f_memory(uint256[]): 0x80, 9, 9, 9, 0 -> 0x20, 0 // f_memory(uint256[]): 0x80, 9, 9, 9, 1, 7 -> 0x20, 1, 7 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/cleanup/cleanup.sol b/test/libsolidity/semanticTests/abiEncoderV2/cleanup/cleanup.sol index b680e9cd23c1..4286f8f07d34 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/cleanup/cleanup.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/cleanup/cleanup.sol @@ -6,8 +6,6 @@ contract C { assembly { v := a w := b x := c y := d z := e} } } -// ==== -// compileToEwasm: also // ---- // f(uint16,int16,address,bytes3,bool): 1, 2, 3, "a", true -> 1, 2, 3, "a", true // f(uint16,int16,address,bytes3,bool): 0xffffff, 0x1ffff, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "abcd", 1 -> FAILURE diff --git a/test/libsolidity/semanticTests/abiEncoderV2/enums.sol b/test/libsolidity/semanticTests/abiEncoderV2/enums.sol index 285bf334f951..1e323472897f 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/enums.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/enums.sol @@ -6,8 +6,6 @@ contract C { assembly { x := e } } } -// ==== -// compileToEwasm: also // ---- // f(uint8): 0 -> 0 // f(uint8): 1 -> 1 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_bytes.sol b/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_bytes.sol index 07d035080090..3fe54eff57e5 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_bytes.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_bytes.sol @@ -7,7 +7,6 @@ contract C { return f(a, b); } } - // ---- // f(uint256[],bytes): 0x40, 0x80, 1, 0xFF, 6, "123456" -> 0x20, 0xc0, 0x40, 0x80, 1, 0xff, 6, "123456" // g(uint256[],bytes): 0x40, 0x80, 1, 0xffff, 8, "12345678" -> 0x20, 0xc0, 0x40, 0x80, 1, 0xffff, 8, "12345678" diff --git a/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_static_array.sol b/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_static_array.sol index a8f4f55541a4..a734103f10d2 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_static_array.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/memory_dynamic_array_and_calldata_static_array.sol @@ -11,7 +11,6 @@ contract C { return (a, b); } } - // ---- // f(uint256[],uint256[1]): 0x40, 0xff, 1, 0xffff -> 0x20, 0x80, 0x40, 0xff, 1, 0xffff // g(uint256[],uint256[1]): 0x40, 0xff, 1, 0xffff -> 0x20, 0x80, 0x40, 0xff, 1, 0xffff diff --git a/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_short.sol b/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_short.sol index 73fa9b415f30..ce6550d31a34 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_short.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_short.sol @@ -6,8 +6,6 @@ contract C { q = s; } } -// ==== -// compileToEwasm: also // ---- // f((int256,uint256,bytes16)): 0xff010, 0xff0002, "abcd" -> 0xff010, 0xff0002, "abcd" // f((int256,uint256,bytes16)): 0xff010, 0xff0002, 0x1111222233334444555566667777888800000000000000000000000000000000 -> 0xff010, 0xff0002, left(0x11112222333344445555666677778888) diff --git a/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_simple.sol b/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_simple.sol index 80fe3149b742..cf631b8aec79 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_simple.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_simple.sol @@ -9,7 +9,5 @@ contract C { d = uint16(s.d); } } -// ==== -// compileToEwasm: also // ---- // f((uint256,uint8,uint8,bytes2)): 1, 2, 3, "ab" -> 1, 2, 3, 0x6162 diff --git a/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_validation.sol b/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_validation.sol index 3e266410244c..57e218f7d561 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_validation.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/struct/struct_validation.sol @@ -10,8 +10,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f((int16,uint8,bytes2)): 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01, 0xff, "ab" -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01, 0xff, "ab" // f((int16,uint8,bytes2)): 0xff010, 0xff, "ab" -> FAILURE diff --git a/test/libsolidity/semanticTests/abiEncoderV2/struct/validation_function_type_inside_struct.sol b/test/libsolidity/semanticTests/abiEncoderV2/struct/validation_function_type_inside_struct.sol index b1151c2fac5b..8a22b037f6de 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/struct/validation_function_type_inside_struct.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/struct/validation_function_type_inside_struct.sol @@ -6,8 +6,6 @@ contract C { function g(S calldata) external pure returns (uint r) { r = 2; } function h(S calldata s) external pure returns (uint r) { s.x; r = 3; } } -// ==== -// compileToEwasm: also // ---- // f((function)): "01234567890123456789abcd" -> 1 // f((function)): "01234567890123456789abcdX" -> FAILURE diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_calldata.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_calldata.sol index 3bab26b831a2..6b6e55e02241 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_calldata.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_calldata.sol @@ -7,6 +7,5 @@ contract C { return abi.decode(data, (uint256, bytes)); } } - // ---- // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple.sol index 2703f25e93e9..9ae6602f310f 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple.sol @@ -3,6 +3,5 @@ contract C { return abi.decode(data, (uint256, bytes)); } } - // ---- // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol index 93fe74c99168..03084f0a35b6 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_decode_simple_storage.sol @@ -6,7 +6,6 @@ contract C { return abi.decode(data, (uint256, bytes)); } } - // ---- // f(bytes): 0x20, 0x80, 0x21, 0x40, 0x7, "abcdefg" -> 0x21, 0x40, 0x7, "abcdefg" // gas irOptimized: 135693 diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call.sol index ab7a94372eb2..1edede787853 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call.sol @@ -44,6 +44,5 @@ contract C { return success; } } - // ---- // callExternal() -> true diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_declaration.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_declaration.sol index 86399614105d..752298fbb059 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_declaration.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_declaration.sol @@ -46,7 +46,6 @@ contract C is Base { } } - // ==== // EVMVersion: >=byzantium // ---- diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_memory.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_memory.sol index 2e2420af3519..5f67174cfcb4 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_memory.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_call_memory.sol @@ -21,6 +21,5 @@ contract C { return bytes4(a); } } - // ---- // test() -> 0xa7a0d53700000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selector.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selector.sol index 45c71e4d81d3..f72de4379bad 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selector.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selector.sol @@ -15,8 +15,6 @@ contract C { return abi.encodeWithSelector(x, type(uint).max); } } -// ==== -// compileToEwasm: also // ---- // f0() -> 0x20, 4, 8234104107246695022420661102507966550300666591269321702959126607540084801536 // f1() -> 0x20, 0x64, 8234104107246695022420661102507966550300666591269321702959126607540084801536, 862718293348820473429344482784628181556388621521298319395315527974912, 91135606241822717681769169345594720818313984248279388438121731325952, 0 diff --git a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selectorv2.sol b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selectorv2.sol index a4f24a963e2f..b23e2dd27e85 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selectorv2.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/abi_encode_with_selectorv2.sol @@ -24,8 +24,6 @@ contract C { return abi.encodeWithSelector(x, type(uint).max, s, uint(3)); } } -// ==== -// compileToEwasm: also // ---- // f0() -> 0x20, 4, 8234104107246695022420661102507966550300666591269321702959126607540084801536 // f1() -> 0x20, 0x64, 8234104107246695022420661102507966550300666591269321702959126607540084801536, 862718293348820473429344482784628181556388621521298319395315527974912, 91135606241822717681769169345594720818313984248279388438121731325952, 0 diff --git a/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding.sol b/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding.sol index 736794dc4f82..02937aced8da 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding.sol @@ -23,7 +23,5 @@ contract Test { return decoded[1][0]; } } -// ==== -// compileToEwasm: also // ---- // test() -> FAILURE diff --git a/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_2.sol b/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_2.sol index fe956322f18a..0a874914a93d 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_2.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_2.sol @@ -24,7 +24,5 @@ contract Test { return decoded[0][0] + decoded[1][0]; } } -// ==== -// compileToEwasm: also // ---- // withinArray() -> FAILURE diff --git a/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_3.sol b/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_3.sol index 8a7e572cc8ee..a20e9ae49fe1 100644 --- a/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_3.sol +++ b/test/libsolidity/semanticTests/abiencodedecode/offset_overflow_in_array_decoding_3.sol @@ -17,7 +17,5 @@ contract Test { return decoded[1][0]; } } -// ==== -// compileToEwasm: also // ---- // test() -> FAILURE diff --git a/test/libsolidity/semanticTests/accessor/accessor_for_const_state_variable.sol b/test/libsolidity/semanticTests/accessor/accessor_for_const_state_variable.sol index 1d6346259ce8..b8def58898a7 100644 --- a/test/libsolidity/semanticTests/accessor/accessor_for_const_state_variable.sol +++ b/test/libsolidity/semanticTests/accessor/accessor_for_const_state_variable.sol @@ -1,7 +1,5 @@ contract Lotto { uint256 public constant ticketPrice = 555; } -// ==== -// compileToEwasm: also // ---- // ticketPrice() -> 555 diff --git a/test/libsolidity/semanticTests/accessor/accessor_for_state_variable.sol b/test/libsolidity/semanticTests/accessor/accessor_for_state_variable.sol index 16b534585a37..51cb8e5e2369 100644 --- a/test/libsolidity/semanticTests/accessor/accessor_for_state_variable.sol +++ b/test/libsolidity/semanticTests/accessor/accessor_for_state_variable.sol @@ -1,8 +1,5 @@ contract Lotto { uint256 public ticketPrice = 500; } - -// ==== -// compileToEwasm: also // ---- // ticketPrice() -> 500 diff --git a/test/libsolidity/semanticTests/arithmetics/addmod_mulmod.sol b/test/libsolidity/semanticTests/arithmetics/addmod_mulmod.sol index 034abce943ed..e6f703bd7681 100644 --- a/test/libsolidity/semanticTests/arithmetics/addmod_mulmod.sol +++ b/test/libsolidity/semanticTests/arithmetics/addmod_mulmod.sol @@ -7,8 +7,5 @@ contract C { return 0; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 0 diff --git a/test/libsolidity/semanticTests/arithmetics/addmod_mulmod_zero.sol b/test/libsolidity/semanticTests/arithmetics/addmod_mulmod_zero.sol index cfcd9463faa6..cd32ceffa039 100644 --- a/test/libsolidity/semanticTests/arithmetics/addmod_mulmod_zero.sol +++ b/test/libsolidity/semanticTests/arithmetics/addmod_mulmod_zero.sol @@ -17,9 +17,6 @@ contract C { return 2; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> FAILURE, hex"4e487b71", 0x12 // g(uint256): 0 -> FAILURE, hex"4e487b71", 0x12 diff --git a/test/libsolidity/semanticTests/arithmetics/block_inside_unchecked.sol b/test/libsolidity/semanticTests/arithmetics/block_inside_unchecked.sol index b626289104cb..7a8504d53178 100644 --- a/test/libsolidity/semanticTests/arithmetics/block_inside_unchecked.sol +++ b/test/libsolidity/semanticTests/arithmetics/block_inside_unchecked.sol @@ -7,7 +7,5 @@ contract C { }} } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x00 diff --git a/test/libsolidity/semanticTests/arithmetics/checked_called_by_unchecked.sol b/test/libsolidity/semanticTests/arithmetics/checked_called_by_unchecked.sol index 4fc0ff189fd2..420a52cde48e 100644 --- a/test/libsolidity/semanticTests/arithmetics/checked_called_by_unchecked.sol +++ b/test/libsolidity/semanticTests/arithmetics/checked_called_by_unchecked.sol @@ -7,8 +7,6 @@ contract C { unchecked { return add(a, b) + c; } } } -// ==== -// compileToEwasm: also // ---- // f(uint16,uint16,uint16): 0xe000, 0xe500, 2 -> FAILURE, hex"4e487b71", 0x11 // f(uint16,uint16,uint16): 0xe000, 0x1000, 0x1000 -> 0x00 diff --git a/test/libsolidity/semanticTests/arithmetics/checked_modifier_called_by_unchecked.sol b/test/libsolidity/semanticTests/arithmetics/checked_modifier_called_by_unchecked.sol index 267489b419a2..42658f83a4f2 100644 --- a/test/libsolidity/semanticTests/arithmetics/checked_modifier_called_by_unchecked.sol +++ b/test/libsolidity/semanticTests/arithmetics/checked_modifier_called_by_unchecked.sol @@ -8,8 +8,6 @@ contract C { return b + c; } } -// ==== -// compileToEwasm: also // ---- // f(uint16,uint16,uint16): 0xe000, 0xe500, 2 -> 58626 // f(uint16,uint16,uint16): 0x1000, 0xe500, 0xe000 -> FAILURE, hex"4e487b71", 0x11 diff --git a/test/libsolidity/semanticTests/arithmetics/divisiod_by_zero.sol b/test/libsolidity/semanticTests/arithmetics/divisiod_by_zero.sol index d996409ca8c0..517c4966e984 100644 --- a/test/libsolidity/semanticTests/arithmetics/divisiod_by_zero.sol +++ b/test/libsolidity/semanticTests/arithmetics/divisiod_by_zero.sol @@ -7,8 +7,6 @@ contract C { return a % b; } } -// ==== -// compileToEwasm: also // ---- // div(uint256,uint256): 7, 2 -> 3 // div(uint256,uint256): 7, 0 -> FAILURE, hex"4e487b71", 0x12 # throws # diff --git a/test/libsolidity/semanticTests/arithmetics/exp_associativity.sol b/test/libsolidity/semanticTests/arithmetics/exp_associativity.sol index 730209fb58a4..0ec9f2c79077 100644 --- a/test/libsolidity/semanticTests/arithmetics/exp_associativity.sol +++ b/test/libsolidity/semanticTests/arithmetics/exp_associativity.sol @@ -29,7 +29,6 @@ contract C { (b**a**a/b**a**b == (b**(a**a))/(b**(a**b))); } } - // ---- // test_hardcode1(uint256,uint256,uint256): 2, 3, 4 -> 2417851639229258349412352 // test_hardcode2(uint256,uint256,uint256,uint256): 3, 2, 2, 2 -> 43046721 diff --git a/test/libsolidity/semanticTests/arithmetics/signed_mod.sol b/test/libsolidity/semanticTests/arithmetics/signed_mod.sol index 0239810ab9a6..3062562069ce 100644 --- a/test/libsolidity/semanticTests/arithmetics/signed_mod.sol +++ b/test/libsolidity/semanticTests/arithmetics/signed_mod.sol @@ -11,9 +11,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(int256,int256): 7, 5 -> 2 // f(int256,int256): 7, -5 -> 2 diff --git a/test/libsolidity/semanticTests/arithmetics/unchecked_called_by_checked.sol b/test/libsolidity/semanticTests/arithmetics/unchecked_called_by_checked.sol index f7859e6c131c..140506279d0a 100644 --- a/test/libsolidity/semanticTests/arithmetics/unchecked_called_by_checked.sol +++ b/test/libsolidity/semanticTests/arithmetics/unchecked_called_by_checked.sol @@ -9,8 +9,6 @@ contract C { return add(a, 0x100) + 0x100; } } -// ==== -// compileToEwasm: also // ---- // f(uint16): 7 -> 0x0207 // f(uint16): 0xffff -> 511 diff --git a/test/libsolidity/semanticTests/arithmetics/unchecked_div_by_zero.sol b/test/libsolidity/semanticTests/arithmetics/unchecked_div_by_zero.sol index 6e9cc90aeecd..ae91ea278f05 100644 --- a/test/libsolidity/semanticTests/arithmetics/unchecked_div_by_zero.sol +++ b/test/libsolidity/semanticTests/arithmetics/unchecked_div_by_zero.sol @@ -13,8 +13,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // div(uint256,uint256): 7, 2 -> 3 // div(uint256,uint256): 7, 0 -> FAILURE, hex"4e487b71", 0x12 # throws # diff --git a/test/libsolidity/semanticTests/array/calldata_array.sol b/test/libsolidity/semanticTests/array/calldata_array.sol index cdb1c9b6d5d0..c524d06e003b 100644 --- a/test/libsolidity/semanticTests/array/calldata_array.sol +++ b/test/libsolidity/semanticTests/array/calldata_array.sol @@ -11,7 +11,5 @@ contract C { b = s[1]; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[2]): 42, 23 -> 42, 23 diff --git a/test/libsolidity/semanticTests/array/calldata_array_as_argument_internal_function.sol b/test/libsolidity/semanticTests/array/calldata_array_as_argument_internal_function.sol index 99bd31c57f4c..d21c40caeef6 100644 --- a/test/libsolidity/semanticTests/array/calldata_array_as_argument_internal_function.sol +++ b/test/libsolidity/semanticTests/array/calldata_array_as_argument_internal_function.sol @@ -12,8 +12,6 @@ contract Test { return f(c[start: end]); } } -// ==== -// compileToEwasm: also // ---- // g(uint256[]): 0x20, 4, 1, 2, 3, 4 -> 4, 1 // h(uint256[],uint256,uint256): 0x60, 1, 3, 4, 1, 2, 3, 4 -> 2, 2 diff --git a/test/libsolidity/semanticTests/array/calldata_array_dynamic_invalid.sol b/test/libsolidity/semanticTests/array/calldata_array_dynamic_invalid.sol index 190d73d79a1c..dc1d1c31a18b 100644 --- a/test/libsolidity/semanticTests/array/calldata_array_dynamic_invalid.sol +++ b/test/libsolidity/semanticTests/array/calldata_array_dynamic_invalid.sol @@ -11,8 +11,6 @@ contract C { return 42; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[][]): 0x20, 0x0 -> 42 # valid access stub # // f(uint256[][]): 0x20, 0x1 -> FAILURE # invalid on argument decoding # diff --git a/test/libsolidity/semanticTests/array/calldata_array_of_struct.sol b/test/libsolidity/semanticTests/array/calldata_array_of_struct.sol index c31ffcb53623..006bf2521e32 100644 --- a/test/libsolidity/semanticTests/array/calldata_array_of_struct.sol +++ b/test/libsolidity/semanticTests/array/calldata_array_of_struct.sol @@ -19,8 +19,5 @@ contract C { d = s[1].b; } } - -// ==== -// compileToEwasm: also // ---- // f((uint256,uint256)[]): 0x20, 0x2, 0x1, 0x2, 0x3, 0x4 -> 2, 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/array/calldata_slice_access.sol b/test/libsolidity/semanticTests/array/calldata_slice_access.sol index b8eb63829e0e..76af2214f429 100644 --- a/test/libsolidity/semanticTests/array/calldata_slice_access.sol +++ b/test/libsolidity/semanticTests/array/calldata_slice_access.sol @@ -6,8 +6,6 @@ contract C { return (x[start:end][index], x[start:][0:end-start][index], x[:end][start:][index]); } } -// ==== -// compileToEwasm: also // ---- // f(uint256[],uint256,uint256): 0x80, 0, 0, 0, 1, 42 -> // f(uint256[],uint256,uint256): 0x80, 0, 1, 0, 1, 42 -> diff --git a/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_argument_list.sol b/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_argument_list.sol index 0485012e38e9..7041ff8513b5 100644 --- a/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_argument_list.sol +++ b/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_argument_list.sol @@ -3,7 +3,5 @@ contract C { return bytes.concat(); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0 diff --git a/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_strings.sol b/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_strings.sol index a83e5462b350..10d31162cb42 100644 --- a/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_strings.sol +++ b/test/libsolidity/semanticTests/array/concat/bytes_concat_empty_strings.sol @@ -18,8 +18,6 @@ contract C { return bytes.concat(b, "abc", b, "abc", b); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0 // g() -> 0x20, 6, "abcabc" diff --git a/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol b/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol index ffd4b54033e7..fe6f07a40e5d 100644 --- a/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol +++ b/test/libsolidity/semanticTests/array/constant_var_as_array_length.sol @@ -6,7 +6,6 @@ contract C { a = _a; } } - // ---- // constructor(): 1, 2, 3 -> // gas irOptimized: 140952 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol b/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol index 55e20f91729f..6f616f4b5328 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_different_packing.sol @@ -16,7 +16,6 @@ contract c { e = data2[5]; } } - // ---- // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x05000000000000000000000000000000000000000000000000 // gas irOptimized: 208122 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol b/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol index 03f58e11900f..7b5b30b79fd1 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_nested_array.sol @@ -10,7 +10,6 @@ contract c { return c[1][1] | c[1][2] | c[1][3] | c[1][4]; } } - // ---- // test(uint256[2][]): 32, 3, 7, 8, 9, 10, 11, 12 -> 10 // gas irOptimized: 689714 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_abi_signed.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_abi_signed.sol index 0e225f1e598c..335afd0ac45e 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_abi_signed.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_abi_signed.sol @@ -15,6 +15,5 @@ contract c { return x; } } - // ---- // test() -> 0x20, 0x8, -1, -1, 8, -16, -2, 6, 8, -1 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol index 113269ea2ba3..4ab3d0bd870c 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_different_base_nested.sol @@ -19,8 +19,6 @@ contract c { y = data2[0][4]; } } -// ==== -// compileToEwasm: also // ---- // test() -> 3, 4 // gas irOptimized: 169602 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol index 1582b711837c..fcdcf9c2d2c4 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_dynamic_dynamic.sol @@ -15,7 +15,6 @@ contract c { y = data2[4]; } } - // ---- // test() -> 5, 4 // gas irOptimized: 252986 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol index 8b750efa7ad3..943a5206eef4 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_dynamic.sol @@ -9,7 +9,6 @@ contract c { y = data2[8]; } } - // ---- // test() -> 9, 4 // gas irOptimized: 123142 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_simple.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_simple.sol index 00c69b7deeef..2fccff774e94 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_simple.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_simple.sol @@ -9,8 +9,6 @@ contract C { return (data2[0], data2[1]); } } -// ==== -// compileToEwasm: also // ---- // test() -> left(0x01), left(0x02) // gas legacy: 90001 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol index f7f0560653b4..3b0a229c96f1 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_storage_storage_static_static.sol @@ -12,9 +12,6 @@ contract c { y = data1[30]; // should be cleared } } - -// ==== -// compileToEwasm: also // ---- // test() -> 8, 0 // gas irOptimized: 196278 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol index a3f800b0834f..31addad5ecab 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover.sol @@ -15,8 +15,6 @@ contract c { res2 |= uint(uint16(data2[16 + i])) * 0x10000**i; } } -// ==== -// compileToEwasm: also // ---- // test() -> 0xffffffff, 0x0000000000000000000000000a00090008000700060005000400030002000100, 0x0000000000000000000000000000000000000000000000000000000000000000 // gas irOptimized: 104665 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover2.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover2.sol index 0e0a26fc9dff..0a2bcffce201 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover2.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_leftover2.sol @@ -17,8 +17,6 @@ contract c { r3 = data2[5]; } } -// ==== -// compileToEwasm: also // ---- // test() -> 0x04000000000000000000000000000000000000000000000000, 0x0, 0x0 // gas irOptimized: 93858 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol index 160697c6b157..0a306cade434 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple.sol @@ -16,9 +16,6 @@ contract c { e = data2[9]; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x0 // gas irOptimized: 273576 diff --git a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol index c2ab09c6432e..de100d0964d6 100644 --- a/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol +++ b/test/libsolidity/semanticTests/array/copying/array_copy_target_simple_2.sol @@ -16,9 +16,6 @@ contract c { e = data2[9]; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 0x01000000000000000000000000000000000000000000000000, 0x02000000000000000000000000000000000000000000000000, 0x03000000000000000000000000000000000000000000000000, 0x04000000000000000000000000000000000000000000000000, 0x00 // gas irOptimized: 233285 diff --git a/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol b/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol index e139e200ffe3..53ca44cdc5b3 100644 --- a/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol +++ b/test/libsolidity/semanticTests/array/copying/array_elements_to_mapping.sol @@ -50,7 +50,6 @@ contract C { return m[0]; } } - // ---- // from_storage() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 // gas irOptimized: 150061 diff --git a/test/libsolidity/semanticTests/array/copying/array_nested_storage_to_memory.sol b/test/libsolidity/semanticTests/array/copying/array_nested_storage_to_memory.sol index 40990ba81285..ebaada764708 100644 --- a/test/libsolidity/semanticTests/array/copying/array_nested_storage_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/array_nested_storage_to_memory.sol @@ -37,7 +37,6 @@ contract C { return a4; } } - // ---- // test1() -> 0x20, 2, 0x40, 0xa0, 2, 1, 2, 3, 3, 4, 5 // test2() -> 0x20, 0x40, 0xc0, 3, 6, 7, 8, 1, 9 diff --git a/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol b/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol index cbb87a2788ca..e335d8684978 100644 --- a/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol +++ b/test/libsolidity/semanticTests/array/copying/array_storage_multi_items_per_slot.sol @@ -10,8 +10,6 @@ contract C { return (a[32], b[1], c[2]); } } -// ==== -// compileToEwasm: also // ---- // f() -> 1, 2, 3 // gas irOptimized: 131932 diff --git a/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol b/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol index 5c36ed3f3a0e..9fcbbffcea46 100644 --- a/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol +++ b/test/libsolidity/semanticTests/array/copying/array_to_mapping.sol @@ -35,7 +35,6 @@ contract C { return m[0]; } } - // ---- // from_storage() -> 0x20, 2, 0x40, 0xa0, 2, 10, 11, 3, 12, 13, 14 // gas irOptimized: 147892 diff --git a/test/libsolidity/semanticTests/array/copying/bytes_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/bytes_memory_to_storage.sol index 6cdd48bf1c47..d1202e27eb07 100644 --- a/test/libsolidity/semanticTests/array/copying/bytes_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/bytes_memory_to_storage.sol @@ -6,7 +6,5 @@ contract C { return s[0]; } } -// ==== -// compileToEwasm: also // ---- // f() -> "a" diff --git a/test/libsolidity/semanticTests/array/copying/bytes_storage_to_memory.sol b/test/libsolidity/semanticTests/array/copying/bytes_storage_to_memory.sol index e996714ce278..84e11c1384b5 100644 --- a/test/libsolidity/semanticTests/array/copying/bytes_storage_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/bytes_storage_to_memory.sol @@ -5,7 +5,5 @@ contract C { return data[0]; } } -// ==== -// compileToEwasm: also // ---- // f() -> "a" diff --git a/test/libsolidity/semanticTests/array/copying/calldata_array_of_struct_to_memory.sol b/test/libsolidity/semanticTests/array/copying/calldata_array_of_struct_to_memory.sol index 25a2c05f1668..fcf4aca21eaa 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_array_of_struct_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_array_of_struct_to_memory.sol @@ -20,6 +20,5 @@ contract C { d = m[1].b; } } - // ---- // f((uint256,uint256)[]): 0x20, 0x2, 0x1, 0x2, 0x3, 0x4 -> 2, 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/array/copying/calldata_array_static_to_memory.sol b/test/libsolidity/semanticTests/array/copying/calldata_array_static_to_memory.sol index fbc1d03d94aa..ace6550bb87f 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_array_static_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_array_static_to_memory.sol @@ -4,7 +4,5 @@ contract C { return (m1[0], m1[1]); } } -// ==== -// compileToEwasm: also // ---- // f(uint256[2]): 43, 57 -> 43, 57 diff --git a/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol b/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol index 90b5b85d6afe..26f3d587f0c0 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_array_to_mapping.sol @@ -10,7 +10,6 @@ contract C { return m[0]; } } - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/calldata_bytes_to_storage.sol b/test/libsolidity/semanticTests/array/copying/calldata_bytes_to_storage.sol index 57f6b3a3e756..2409893e36a4 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_bytes_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_bytes_to_storage.sol @@ -5,7 +5,5 @@ contract C { return s[0]; } } -// ==== -// compileToEwasm: also // ---- // f(bytes): 0x20, 0x08, "abcdefgh" -> "a" diff --git a/test/libsolidity/semanticTests/array/copying/calldata_dynamic_array_to_memory.sol b/test/libsolidity/semanticTests/array/copying/calldata_dynamic_array_to_memory.sol index 28eecc4f2e40..db6625c8e7bf 100644 --- a/test/libsolidity/semanticTests/array/copying/calldata_dynamic_array_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/calldata_dynamic_array_to_memory.sol @@ -10,6 +10,5 @@ contract C { return (a.length, m); } } - // ---- // f(uint256[][]): 0x20, 0x1, 0x20, 0x2, 0x17, 0x2a -> 0x1, 0x40, 0x2, 0x17, 0x2a diff --git a/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol b/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol index d4d535950181..18795ff798c2 100644 --- a/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol +++ b/test/libsolidity/semanticTests/array/copying/copy_function_internal_storage_array.sol @@ -13,7 +13,6 @@ contract C { return 7; } } - // ---- // test() -> 7 // gas irOptimized: 122477 diff --git a/test/libsolidity/semanticTests/array/copying/copy_internal_function_array_to_storage.sol b/test/libsolidity/semanticTests/array/copying/copy_internal_function_array_to_storage.sol index 20b894082ca1..95ba9d8ed8e8 100644 --- a/test/libsolidity/semanticTests/array/copying/copy_internal_function_array_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/copy_internal_function_array_to_storage.sol @@ -16,9 +16,6 @@ contract C { return 2; } } - -// ==== -// compileToEwasm: also // ---- // one() -> 3 // gas legacy: 140253 diff --git a/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol b/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol index ca6362b5c01d..8277df30a1e1 100644 --- a/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol +++ b/test/libsolidity/semanticTests/array/copying/copying_bytes_multiassign.sol @@ -16,8 +16,6 @@ contract sender { bytes savedData1; bytes savedData2; } -// ==== -// compileToEwasm: false // ---- // (): 7 -> // gas irOptimized: 110820 diff --git a/test/libsolidity/semanticTests/array/copying/dirty_memory_bytes_to_storage_copy_ir.sol b/test/libsolidity/semanticTests/array/copying/dirty_memory_bytes_to_storage_copy_ir.sol index 2af9270624f6..3704e36821af 100644 --- a/test/libsolidity/semanticTests/array/copying/dirty_memory_bytes_to_storage_copy_ir.sol +++ b/test/libsolidity/semanticTests/array/copying/dirty_memory_bytes_to_storage_copy_ir.sol @@ -14,6 +14,5 @@ contract C { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // f() -> 0x6465616462656566000000000000000000000000000000000000000000000010 diff --git a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol index f435d9136367..eb0eb108fbf9 100644 --- a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_calldata_to_storage.sol @@ -27,8 +27,6 @@ contract C { return s3[0]; } } - - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol index 3a52e0a58488..9dbc64f734a9 100644 --- a/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/elements_of_nested_array_of_structs_memory_to_storage.sol @@ -27,8 +27,6 @@ contract C { return s3[0]; } } - - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_memory.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_memory.sol index ee715b5b6c11..e3843537fbed 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_memory.sol @@ -31,7 +31,6 @@ contract C { return tmp[0]; } } - // ---- // test1(uint8[][][]): 0x20, 2, 0x40, 0x60, 0, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 // test2(uint8[][1][]): 0x20, 2, 0x40, 0xe0, 0x20, 3, 12, 13, 14, 0x20, 3, 15, 16, 17 -> 0x20, 0x20, 3, 12, 13, 14 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_storage.sol index 93c458341b04..5040a72cadb5 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_calldata_to_storage.sol @@ -22,7 +22,6 @@ contract C { require(a2[1][1][1] == 0); } } - // ---- // test(uint8[2][2][2]): 1, 2, 3, 4, 5, 6, 7, 8 // test2(uint8[2][2]): 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_memory.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_memory.sol index ab3d472d6f29..3058df842a27 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_memory.sol @@ -31,7 +31,6 @@ contract C { return tmp[0]; } } - // ---- // test1(uint8[][][]): 0x20, 2, 0x40, 0x60, 0, 2, 0x40, 0x80, 1, 7, 2, 8, 9 -> 0x20, 2, 0x40, 0x80, 1, 7, 2, 8, 9 // test2(uint8[][1][]): 0x20, 2, 0x40, 0xe0, 0x20, 3, 12, 13, 14, 0x20, 3, 15, 16, 17 -> 0x20, 0x20, 3, 12, 13, 14 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_storage.sol index 2dd2e7aa37b5..2f4b4ca7c9a1 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_memory_to_storage.sol @@ -22,7 +22,6 @@ contract C { require(a2[1][1][1] == 0); } } - // ---- // test(uint8[2][2][2]): 1, 2, 3, 4, 5, 6, 7, 8 // test2(uint8[2][2]): 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_memory.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_memory.sol index 2f78042a488c..e30ca769bd42 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_memory.sol @@ -60,7 +60,6 @@ contract C { return tmp; } } - // ---- // test1() -> 0x20, 2, 0x40, 0xa0, 2, 3, 4, 2, 5, 6 // test2() -> 0x20, 2, 0x40, 0xa0, 2, 6, 7, 2, 8, 9 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol index c402c14b2099..c962d815f434 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_element_storage_to_storage.sol @@ -68,7 +68,6 @@ contract C { require(dst4[1][1] == src4[0][1][1]); } } - // ---- // test1() -> // gas irOptimized: 150508 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_memory.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_memory.sol index 159486eda666..3d424a7c5976 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_memory.sol @@ -18,7 +18,6 @@ contract C { return a; } } - // ---- // test1((uint8,uint8)[1][2]): 1, 2, 3, 4 -> 1, 2, 3, 4 // test2((uint8,uint8)[1][]): 0x20, 3, 7, 11, 13, 17, 19, 23 -> 0x20, 3, 7, 11, 13, 17, 19, 23 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol index 60d65cb59bd6..fe60365e4aa7 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol @@ -25,8 +25,6 @@ contract C { return s3; } } - - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_memory.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_memory.sol index 55a4d6aedb2c..6c8da98dd66c 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_memory.sol @@ -18,7 +18,6 @@ contract C { r = a; } } - // ---- // test1((uint8,uint8)[1][2]): 1, 2, 3, 4 -> 1, 2, 3, 4 // test2((uint8,uint8)[1][]): 0x20, 3, 7, 11, 13, 17, 19, 23 -> 0x20, 3, 7, 11, 13, 17, 19, 23 diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol index 13b350262162..ccf2f2a2082d 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_memory_to_storage.sol @@ -25,8 +25,6 @@ contract C { return s3; } } - - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol index 64c7f06a57c1..fb06b318874a 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_storage_to_storage.sol @@ -59,7 +59,6 @@ contract C { require(dst3[1][0].y == src3[1][0].y); } } - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_with_nested_array_from_storage_to_memory.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_with_nested_array_from_storage_to_memory.sol index 58240492ca75..3a5e44a5df01 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_with_nested_array_from_storage_to_memory.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_with_nested_array_from_storage_to_memory.sol @@ -37,7 +37,6 @@ contract C { return s2[0]; } } - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol index 5b7205553026..6e44ed2686ab 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_dynamic_array_element_calldata_to_storage.sol @@ -26,7 +26,6 @@ contract C { require(a2[1].length == 0); } } - // ==== // compileViaYul: true // ---- diff --git a/test/libsolidity/semanticTests/array/copying/storage_memory_packed.sol b/test/libsolidity/semanticTests/array/copying/storage_memory_packed.sol index b1410f7e2775..f49b4923b81f 100644 --- a/test/libsolidity/semanticTests/array/copying/storage_memory_packed.sol +++ b/test/libsolidity/semanticTests/array/copying/storage_memory_packed.sol @@ -9,7 +9,5 @@ contract C { return (m[0], m[16], m[32]); } } -// ==== -// compileToEwasm: also // ---- // f() -> 2, 3, 4 diff --git a/test/libsolidity/semanticTests/array/create_dynamic_array_with_zero_length.sol b/test/libsolidity/semanticTests/array/create_dynamic_array_with_zero_length.sol index 3856e23dc27c..9d2dbd8c28bb 100644 --- a/test/libsolidity/semanticTests/array/create_dynamic_array_with_zero_length.sol +++ b/test/libsolidity/semanticTests/array/create_dynamic_array_with_zero_length.sol @@ -4,7 +4,5 @@ contract C { return 7; } } -// ==== -// compileToEwasm: also // ---- // f() -> 7 diff --git a/test/libsolidity/semanticTests/array/create_memory_array_too_large.sol b/test/libsolidity/semanticTests/array/create_memory_array_too_large.sol index ed6a3740370a..1d886a8c0e7d 100644 --- a/test/libsolidity/semanticTests/array/create_memory_array_too_large.sol +++ b/test/libsolidity/semanticTests/array/create_memory_array_too_large.sol @@ -19,8 +19,6 @@ contract C { y[0] = 23; return x[2]; }} -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x41 // g() -> FAILURE, hex"4e487b71", 0x41 diff --git a/test/libsolidity/semanticTests/array/create_multiple_dynamic_arrays.sol b/test/libsolidity/semanticTests/array/create_multiple_dynamic_arrays.sol index ad5c3927927f..2396e3179b63 100644 --- a/test/libsolidity/semanticTests/array/create_multiple_dynamic_arrays.sol +++ b/test/libsolidity/semanticTests/array/create_multiple_dynamic_arrays.sol @@ -29,7 +29,5 @@ contract C { return 0; } } -// ==== -// compileToEwasm: also // ---- // f() -> 7 diff --git a/test/libsolidity/semanticTests/array/delete/delete_bytes_array.sol b/test/libsolidity/semanticTests/array/delete/delete_bytes_array.sol index 77096a645c32..b735d182d555 100644 --- a/test/libsolidity/semanticTests/array/delete/delete_bytes_array.sol +++ b/test/libsolidity/semanticTests/array/delete/delete_bytes_array.sol @@ -29,7 +29,6 @@ contract C { assert(size == 0); } } - // ---- // f() -> 0 // g() -> 0 diff --git a/test/libsolidity/semanticTests/array/delete/delete_memory_array.sol b/test/libsolidity/semanticTests/array/delete/delete_memory_array.sol index 54abc495c9b2..53a66af34337 100644 --- a/test/libsolidity/semanticTests/array/delete/delete_memory_array.sol +++ b/test/libsolidity/semanticTests/array/delete/delete_memory_array.sol @@ -10,6 +10,5 @@ contract C { } } } - // ---- // len() -> 0 diff --git a/test/libsolidity/semanticTests/array/delete/delete_on_array_of_structs.sol b/test/libsolidity/semanticTests/array/delete/delete_on_array_of_structs.sol index 316b8d9efd1e..2c1421eee952 100644 --- a/test/libsolidity/semanticTests/array/delete/delete_on_array_of_structs.sol +++ b/test/libsolidity/semanticTests/array/delete/delete_on_array_of_structs.sol @@ -15,6 +15,5 @@ contract C { return true; } } - // ---- // f() -> true # This code interprets x as an array length and thus will go out of gas. neither of the two should throw due to out-of-bounds access # diff --git a/test/libsolidity/semanticTests/array/delete/delete_storage_array.sol b/test/libsolidity/semanticTests/array/delete/delete_storage_array.sol index 0bb429674741..4136456684e2 100644 --- a/test/libsolidity/semanticTests/array/delete/delete_storage_array.sol +++ b/test/libsolidity/semanticTests/array/delete/delete_storage_array.sol @@ -32,7 +32,6 @@ contract C { } } } - // ---- // len() -> 0 // val() -> 0 diff --git a/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol b/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol index d6e7160be9fc..bce78baa4133 100644 --- a/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol +++ b/test/libsolidity/semanticTests/array/dynamic_arrays_in_storage.sol @@ -38,7 +38,6 @@ contract c { while (ids.length < l2) ids.push(); } } - // ---- // getLengths() -> 0, 0 // setLengths(uint256,uint256): 48, 49 -> diff --git a/test/libsolidity/semanticTests/array/dynamic_out_of_bounds_array_access.sol b/test/libsolidity/semanticTests/array/dynamic_out_of_bounds_array_access.sol index 844324f3253e..5cf35ef3edfe 100644 --- a/test/libsolidity/semanticTests/array/dynamic_out_of_bounds_array_access.sol +++ b/test/libsolidity/semanticTests/array/dynamic_out_of_bounds_array_access.sol @@ -19,7 +19,6 @@ contract c { return data.length; } } - // ---- // length() -> 0 // get(uint256): 3 -> FAILURE, hex"4e487b71", 0x32 diff --git a/test/libsolidity/semanticTests/array/external_array_args.sol b/test/libsolidity/semanticTests/array/external_array_args.sol index 53cc757725f0..da6664f9e91e 100644 --- a/test/libsolidity/semanticTests/array/external_array_args.sol +++ b/test/libsolidity/semanticTests/array/external_array_args.sol @@ -6,7 +6,5 @@ contract c { cv = c[c_index]; } } -// ==== -// compileToEwasm: also // ---- // test(uint256[8],uint256[],uint256[5],uint256,uint256,uint256): 1, 2, 3, 4, 5, 6, 7, 8, 0x220, 21, 22, 23, 24, 25, 0, 1, 2, 3, 11, 12, 13 -> 1, 12, 23 diff --git a/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol b/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol index 51f93db7a29b..337946a20c90 100644 --- a/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol +++ b/test/libsolidity/semanticTests/array/fixed_array_cleanup.sol @@ -7,8 +7,6 @@ contract c { } function clear() public { delete data; } } -// ==== -// compileToEwasm: also // ---- // storageEmpty -> 1 // fill() -> diff --git a/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol b/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol index 519a11131c85..9d8dc0bc7b52 100644 --- a/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol +++ b/test/libsolidity/semanticTests/array/fixed_arrays_as_return_type.sol @@ -16,7 +16,6 @@ contract B { res2 = a.f(1000); } } - // ---- // f() -> 2, 3, 4, 5, 6, 1000, 1001, 1002, 1003, 1004 // gas irOptimized: 115828 diff --git a/test/libsolidity/semanticTests/array/fixed_arrays_in_storage.sol b/test/libsolidity/semanticTests/array/fixed_arrays_in_storage.sol index eb167ee0c8f1..b65a3d254d54 100644 --- a/test/libsolidity/semanticTests/array/fixed_arrays_in_storage.sol +++ b/test/libsolidity/semanticTests/array/fixed_arrays_in_storage.sol @@ -33,8 +33,6 @@ contract c { l2 = ids.length; } } -// ==== -// compileToEwasm: also // ---- // setIDStatic(uint256): 0xb -> // getID(uint256): 0x2 -> 0xb diff --git a/test/libsolidity/semanticTests/array/fixed_bytes_length_access.sol b/test/libsolidity/semanticTests/array/fixed_bytes_length_access.sol index e22b56cfc1a6..d641cd83f1ac 100644 --- a/test/libsolidity/semanticTests/array/fixed_bytes_length_access.sol +++ b/test/libsolidity/semanticTests/array/fixed_bytes_length_access.sol @@ -5,7 +5,5 @@ contract C { return (x.length, bytes16(uint128(2)).length, a.length + 7); } } -// ==== -// compileToEwasm: also // ---- // f(bytes32): "789" -> 32, 16, 8 diff --git a/test/libsolidity/semanticTests/array/fixed_out_of_bounds_array_access.sol b/test/libsolidity/semanticTests/array/fixed_out_of_bounds_array_access.sol index d82ef152c971..1b3b640808b3 100644 --- a/test/libsolidity/semanticTests/array/fixed_out_of_bounds_array_access.sol +++ b/test/libsolidity/semanticTests/array/fixed_out_of_bounds_array_access.sol @@ -14,9 +14,6 @@ contract c { return data.length; } } - -// ==== -// compileToEwasm: also // ---- // length() -> 4 // set(uint256,uint256): 3, 4 -> true diff --git a/test/libsolidity/semanticTests/array/function_array_cross_calls.sol b/test/libsolidity/semanticTests/array/function_array_cross_calls.sol index 8bb4545b2b94..7e29d82a8166 100644 --- a/test/libsolidity/semanticTests/array/function_array_cross_calls.sol +++ b/test/libsolidity/semanticTests/array/function_array_cross_calls.sol @@ -40,7 +40,6 @@ contract C { return this.e; } } - // ---- // test() -> 5, 6, 7 // gas irOptimized: 260895 diff --git a/test/libsolidity/semanticTests/array/function_memory_array.sol b/test/libsolidity/semanticTests/array/function_memory_array.sol index 322eed73ead3..bdd23c67538e 100644 --- a/test/libsolidity/semanticTests/array/function_memory_array.sol +++ b/test/libsolidity/semanticTests/array/function_memory_array.sol @@ -30,8 +30,6 @@ contract C { return arr[i](x); } } -// ==== -// compileToEwasm: also // ---- // test(uint256,uint256): 10, 0 -> 11 // test(uint256,uint256): 10, 1 -> 12 diff --git a/test/libsolidity/semanticTests/array/indexAccess/index_access.sol b/test/libsolidity/semanticTests/array/indexAccess/index_access.sol index b90bbb12e38f..c618ae8e45d4 100644 --- a/test/libsolidity/semanticTests/array/indexAccess/index_access.sol +++ b/test/libsolidity/semanticTests/array/indexAccess/index_access.sol @@ -13,8 +13,6 @@ contract C { ret[7] = bytesValue[0]; } } -// ==== -// compileToEwasm: also // ---- // to_little_endian_64(uint64): 0 -> 0x20, 8, 0x00 // to_little_endian_64(uint64): 0x0102030405060708 -> 0x20, 8, 0x0807060504030201000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_ints.sol b/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_ints.sol index c1481fc9973e..0525f6f283ef 100644 --- a/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_ints.sol +++ b/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_ints.sol @@ -3,8 +3,5 @@ contract C { return ([1, 2, 3, 4][2]); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 3 diff --git a/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_strings.sol b/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_strings.sol index b826dc13d061..bf6c0b0ee8d4 100644 --- a/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_strings.sol +++ b/test/libsolidity/semanticTests/array/indexAccess/inline_array_index_access_strings.sol @@ -9,9 +9,6 @@ contract C { tester = f(); } } - -// ==== -// compileToEwasm: also // ---- // test() -> // tester() -> 0x20, 0x3, "abc" diff --git a/test/libsolidity/semanticTests/array/indexAccess/memory_arrays_index_access_write.sol b/test/libsolidity/semanticTests/array/indexAccess/memory_arrays_index_access_write.sol index ff83a43101bc..7a8a18670ea5 100644 --- a/test/libsolidity/semanticTests/array/indexAccess/memory_arrays_index_access_write.sol +++ b/test/libsolidity/semanticTests/array/indexAccess/memory_arrays_index_access_write.sol @@ -10,7 +10,5 @@ contract Test { return data; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07 diff --git a/test/libsolidity/semanticTests/array/inline_array_return.sol b/test/libsolidity/semanticTests/array/inline_array_return.sol index d6673882f606..25302dcbfdd2 100644 --- a/test/libsolidity/semanticTests/array/inline_array_return.sol +++ b/test/libsolidity/semanticTests/array/inline_array_return.sol @@ -10,8 +10,5 @@ contract C { return (tester[0], tester[1], tester[2], tester[3], tester[4]); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 1, 2, 3, 4, 5 diff --git a/test/libsolidity/semanticTests/array/inline_array_singleton.sol b/test/libsolidity/semanticTests/array/inline_array_singleton.sol index 870c853e14fd..b14ade6e48c1 100644 --- a/test/libsolidity/semanticTests/array/inline_array_singleton.sol +++ b/test/libsolidity/semanticTests/array/inline_array_singleton.sol @@ -4,7 +4,5 @@ contract C { return [4][0]; } } -// ==== -// compileToEwasm: also // ---- // f() -> 4 diff --git a/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_ints.sol b/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_ints.sol index 18626b055d7c..e145d281c906 100644 --- a/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_ints.sol +++ b/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_ints.sol @@ -6,8 +6,5 @@ contract C { return (z[0], z[1]); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 3, 6 diff --git a/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_strings.sol b/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_strings.sol index 2b456ca9aadc..7dfe6e642594 100644 --- a/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_strings.sol +++ b/test/libsolidity/semanticTests/array/inline_array_storage_to_memory_conversion_strings.sol @@ -7,8 +7,5 @@ contract C { return (x[1], x[2]); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x40, 0x80, 0x3, "ray", 0x2, "mi" diff --git a/test/libsolidity/semanticTests/array/inline_array_strings_from_document.sol b/test/libsolidity/semanticTests/array/inline_array_strings_from_document.sol index 23f2d89c704f..9cb16349a1ef 100644 --- a/test/libsolidity/semanticTests/array/inline_array_strings_from_document.sol +++ b/test/libsolidity/semanticTests/array/inline_array_strings_from_document.sol @@ -4,9 +4,6 @@ contract C { return (x[i]); } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 0x20, 0x4, "This" // f(uint256): 1 -> 0x20, 0x2, "is" diff --git a/test/libsolidity/semanticTests/array/memory.sol b/test/libsolidity/semanticTests/array/memory.sol index 6bde7c26cde3..88c18d4949b3 100644 --- a/test/libsolidity/semanticTests/array/memory.sol +++ b/test/libsolidity/semanticTests/array/memory.sol @@ -9,7 +9,6 @@ contract C { return this.h(n) * 2; } } - // ---- // h(uint256[4]): 1, 2, 3, 4 -> 10 // i(uint256[4]): 1, 2, 3, 4 -> 20 diff --git a/test/libsolidity/semanticTests/array/pop/array_pop_empty_exception.sol b/test/libsolidity/semanticTests/array/pop/array_pop_empty_exception.sol index 1750711e1349..6130130da2de 100644 --- a/test/libsolidity/semanticTests/array/pop/array_pop_empty_exception.sol +++ b/test/libsolidity/semanticTests/array/pop/array_pop_empty_exception.sol @@ -6,7 +6,5 @@ contract c { return true; } } -// ==== -// compileToEwasm: also // ---- // test() -> FAILURE, hex"4e487b71", 0x31 diff --git a/test/libsolidity/semanticTests/array/pop/array_pop_isolated.sol b/test/libsolidity/semanticTests/array/pop/array_pop_isolated.sol index ce41673e068d..43d7c3a9836d 100644 --- a/test/libsolidity/semanticTests/array/pop/array_pop_isolated.sol +++ b/test/libsolidity/semanticTests/array/pop/array_pop_isolated.sol @@ -8,7 +8,5 @@ contract c { x = 3; } } -// ==== -// compileToEwasm: also // ---- // test() -> 3 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop.sol index 81e1eb020d53..8f0152180e35 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop.sol @@ -12,7 +12,5 @@ contract c { l = data.length; } } -// ==== -// compileToEwasm: also // ---- // test() -> 2, 1, 1 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_copy_long.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_copy_long.sol index 3528e4c8180a..c64d93c1208a 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_copy_long.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_copy_long.sol @@ -7,7 +7,6 @@ contract c { return data; } } - // ---- // test() -> 0x20, 29, 0x0303030303030303030303030303030303030303030303030303030303000000 // gas irOptimized: 109310 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_empty_exception.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_empty_exception.sol index 5d573a096225..d860275e404f 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_empty_exception.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_empty_exception.sol @@ -9,7 +9,5 @@ contract c { return true; } } -// ==== -// compileToEwasm: also // ---- // test() -> FAILURE, hex"4e487b71", 0x31 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_isolated.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_isolated.sol index 519b0c5abed4..f74221712534 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_isolated.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_isolated.sol @@ -8,7 +8,5 @@ contract c { x = 3; } } -// ==== -// compileToEwasm: also // ---- // test() -> 3 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol index 6416afb2da74..623b58739a11 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_masking_long.sol @@ -7,7 +7,6 @@ contract c { return data; } } - // ---- // test() -> 0x20, 33, 0x303030303030303030303030303030303030303030303030303030303030303, 0x0300000000000000000000000000000000000000000000000000000000000000 // gas irOptimized: 108053 diff --git a/test/libsolidity/semanticTests/array/pop/byte_array_pop_storage_empty.sol b/test/libsolidity/semanticTests/array/pop/byte_array_pop_storage_empty.sol index 4b2e88ffa827..a89f8a2acebf 100644 --- a/test/libsolidity/semanticTests/array/pop/byte_array_pop_storage_empty.sol +++ b/test/libsolidity/semanticTests/array/pop/byte_array_pop_storage_empty.sol @@ -9,8 +9,6 @@ contract c { data.pop(); } } -// ==== -// compileToEwasm: also // ---- // test() -> // storageEmpty -> 1 diff --git a/test/libsolidity/semanticTests/array/push/array_push_packed_array.sol b/test/libsolidity/semanticTests/array/push/array_push_packed_array.sol index 434168119284..e7a3bdbd1f18 100644 --- a/test/libsolidity/semanticTests/array/push/array_push_packed_array.sol +++ b/test/libsolidity/semanticTests/array/push/array_push_packed_array.sol @@ -11,7 +11,6 @@ contract c { return (x[0], x[1], x[2], x[3]); } } - // ---- // test() -> 1, 2, 3, 4 // gas irOptimized: 93017 diff --git a/test/libsolidity/semanticTests/array/push/byte_array_push.sol b/test/libsolidity/semanticTests/array/push/byte_array_push.sol index 28afd9f89c2c..2e0288d24327 100644 --- a/test/libsolidity/semanticTests/array/push/byte_array_push.sol +++ b/test/libsolidity/semanticTests/array/push/byte_array_push.sol @@ -13,7 +13,5 @@ contract c { if (l != 0x03) return true; } } -// ==== -// compileToEwasm: also // ---- // test() -> false diff --git a/test/libsolidity/semanticTests/array/short_fixed_array_cleanup.sol b/test/libsolidity/semanticTests/array/short_fixed_array_cleanup.sol index 6fada19c57a3..8288e1e86165 100644 --- a/test/libsolidity/semanticTests/array/short_fixed_array_cleanup.sol +++ b/test/libsolidity/semanticTests/array/short_fixed_array_cleanup.sol @@ -7,8 +7,6 @@ contract c { } function clear() public { delete data; } } -// ==== -// compileToEwasm: also // ---- // storageEmpty -> 1 // fill() -> diff --git a/test/libsolidity/semanticTests/array/slices/array_calldata_assignment.sol b/test/libsolidity/semanticTests/array/slices/array_calldata_assignment.sol index 282ccba09b2b..c9c489a8fccd 100644 --- a/test/libsolidity/semanticTests/array/slices/array_calldata_assignment.sol +++ b/test/libsolidity/semanticTests/array/slices/array_calldata_assignment.sol @@ -4,7 +4,5 @@ contract C { return x[i]; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[],uint256[],uint256): 0x60, 0xA0, 1, 1, 0, 2, 1, 2 -> 2 diff --git a/test/libsolidity/semanticTests/array/storage_array_ref.sol b/test/libsolidity/semanticTests/array/storage_array_ref.sol index 0a896fed4b5b..37292ae874d1 100644 --- a/test/libsolidity/semanticTests/array/storage_array_ref.sol +++ b/test/libsolidity/semanticTests/array/storage_array_ref.sol @@ -38,7 +38,6 @@ contract Store is BinarySearch { return find(data, v); } } - // ---- // find(uint256): 7 -> -1 // add(uint256): 7 -> diff --git a/test/libsolidity/semanticTests/array/string_allocation_bug.sol b/test/libsolidity/semanticTests/array/string_allocation_bug.sol index bc974a438305..d6dadb78a964 100644 --- a/test/libsolidity/semanticTests/array/string_allocation_bug.sol +++ b/test/libsolidity/semanticTests/array/string_allocation_bug.sol @@ -16,7 +16,5 @@ contract Sample { p[0] = m; } } -// ==== -// compileToEwasm: also // ---- // p(uint256): 0x0 -> 0xbbbb, 0xcccc, 0x80, 0xc0, 0x05, "hello", 0x05, "world" diff --git a/test/libsolidity/semanticTests/array/strings_in_struct.sol b/test/libsolidity/semanticTests/array/strings_in_struct.sol index 1cc6b5a9325d..bacf8dec7a00 100644 --- a/test/libsolidity/semanticTests/array/strings_in_struct.sol +++ b/test/libsolidity/semanticTests/array/strings_in_struct.sol @@ -28,8 +28,6 @@ contract buggystruct { return bug.last; } } -// ==== -// compileToEwasm: also // ---- // getFirst() -> 0x0a // getSecond() -> 0x14 diff --git a/test/libsolidity/semanticTests/asmForLoop/for_loop_break.sol b/test/libsolidity/semanticTests/asmForLoop/for_loop_break.sol index c0c58007210e..d74db942c6a6 100644 --- a/test/libsolidity/semanticTests/asmForLoop/for_loop_break.sol +++ b/test/libsolidity/semanticTests/asmForLoop/for_loop_break.sol @@ -9,7 +9,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 6 diff --git a/test/libsolidity/semanticTests/asmForLoop/for_loop_continue.sol b/test/libsolidity/semanticTests/asmForLoop/for_loop_continue.sol index 4be20d6ba58a..f25a3c06a0bc 100644 --- a/test/libsolidity/semanticTests/asmForLoop/for_loop_continue.sol +++ b/test/libsolidity/semanticTests/asmForLoop/for_loop_continue.sol @@ -9,7 +9,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 5 diff --git a/test/libsolidity/semanticTests/asmForLoop/for_loop_nested.sol b/test/libsolidity/semanticTests/asmForLoop/for_loop_nested.sol index 620f2c3baaba..3a13e9f0e674 100644 --- a/test/libsolidity/semanticTests/asmForLoop/for_loop_nested.sol +++ b/test/libsolidity/semanticTests/asmForLoop/for_loop_nested.sol @@ -13,8 +13,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 2 // f(uint256): 1 -> 18 diff --git a/test/libsolidity/semanticTests/builtinFunctions/assignment_to_const_var_involving_keccak.sol b/test/libsolidity/semanticTests/builtinFunctions/assignment_to_const_var_involving_keccak.sol index 2e8a66363e51..2fc479d0e10a 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/assignment_to_const_var_involving_keccak.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/assignment_to_const_var_involving_keccak.sol @@ -5,7 +5,5 @@ contract C { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 diff --git a/test/libsolidity/semanticTests/builtinFunctions/blockhash.sol b/test/libsolidity/semanticTests/builtinFunctions/blockhash.sol index dc6e26f141a7..008a0467d42f 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/blockhash.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/blockhash.sol @@ -9,8 +9,6 @@ contract C { return blockhash(3); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x3737373737373737373737373737373737373737373737373737373737373738 // g() -> 0x3737373737373737373737373737373737373737373737373737373737373739 diff --git a/test/libsolidity/semanticTests/builtinFunctions/blockhash_shadow_resolution.sol b/test/libsolidity/semanticTests/builtinFunctions/blockhash_shadow_resolution.sol index fa1d01d4035f..0b532da0ec8d 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/blockhash_shadow_resolution.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/blockhash_shadow_resolution.sol @@ -2,7 +2,5 @@ contract C { function blockhash(uint256 blockNumber) public returns(bytes32) { bytes32 x; return x; } function f() public returns(bytes32) { return blockhash(3); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0 diff --git a/test/libsolidity/semanticTests/builtinFunctions/function_types_sig.sol b/test/libsolidity/semanticTests/builtinFunctions/function_types_sig.sol index 9a8132950c15..2e771032bc7e 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/function_types_sig.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/function_types_sig.sol @@ -19,8 +19,6 @@ contract C { return this.x.selector; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 // g() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/builtinFunctions/keccak256_empty.sol b/test/libsolidity/semanticTests/builtinFunctions/keccak256_empty.sol index 1898f0311374..f75c569e7777 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/keccak256_empty.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/keccak256_empty.sol @@ -3,8 +3,5 @@ contract C { return keccak256(""); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 diff --git a/test/libsolidity/semanticTests/builtinFunctions/keccak256_with_bytes.sol b/test/libsolidity/semanticTests/builtinFunctions/keccak256_with_bytes.sol index 725d984d86f8..1904e814021b 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/keccak256_with_bytes.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/keccak256_with_bytes.sol @@ -8,6 +8,5 @@ contract c { return keccak256(data) == keccak256("foo"); } } - // ---- // foo() -> true diff --git a/test/libsolidity/semanticTests/builtinFunctions/msg_sig.sol b/test/libsolidity/semanticTests/builtinFunctions/msg_sig.sol index 21c5ed76dba8..f28658fe7dc1 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/msg_sig.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/msg_sig.sol @@ -3,7 +3,5 @@ contract test { return msg.sig; } } -// ==== -// compileToEwasm: also // ---- // foo(uint256): 0x0 -> 0x2fbebd3800000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/builtinFunctions/msg_sig_after_internal_call_is_same.sol b/test/libsolidity/semanticTests/builtinFunctions/msg_sig_after_internal_call_is_same.sol index a50521610f9c..7ff53efaa478 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/msg_sig_after_internal_call_is_same.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/msg_sig_after_internal_call_is_same.sol @@ -7,7 +7,5 @@ contract test { return boo(); } } -// ==== -// compileToEwasm: also // ---- // foo(uint256): 0x0 -> 0x2fbebd3800000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/builtinFunctions/ripemd160_empty.sol b/test/libsolidity/semanticTests/builtinFunctions/ripemd160_empty.sol index c79625d3cc5b..330fafc4d8df 100644 --- a/test/libsolidity/semanticTests/builtinFunctions/ripemd160_empty.sol +++ b/test/libsolidity/semanticTests/builtinFunctions/ripemd160_empty.sol @@ -3,6 +3,5 @@ contract C { return ripemd160(""); } } - // ---- // f() -> 0x9c1185a5c5e9fc54612808977ee8f548b2258d31000000000000000000000000 diff --git a/test/libsolidity/semanticTests/c99_scoping_activation.sol b/test/libsolidity/semanticTests/c99_scoping_activation.sol index 394b211d625e..6edf9db476fa 100644 --- a/test/libsolidity/semanticTests/c99_scoping_activation.sol +++ b/test/libsolidity/semanticTests/c99_scoping_activation.sol @@ -34,8 +34,6 @@ contract test { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 3 // g() -> 0 diff --git a/test/libsolidity/semanticTests/calldata/calldata_array_index_range_access.sol b/test/libsolidity/semanticTests/calldata/calldata_array_index_range_access.sol index 61013596807b..634e35693ca2 100644 --- a/test/libsolidity/semanticTests/calldata/calldata_array_index_range_access.sol +++ b/test/libsolidity/semanticTests/calldata/calldata_array_index_range_access.sol @@ -25,8 +25,6 @@ contract C { return x[:e][idx]; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[],uint256,uint256): 0x60, 2, 4, 5, 1, 2, 3, 4, 5 -> 2 // f(uint256[],uint256,uint256): 0x60, 2, 6, 5, 1, 2, 3, 4, 5 -> FAILURE diff --git a/test/libsolidity/semanticTests/calldata/calldata_array_three_dimensional.sol b/test/libsolidity/semanticTests/calldata/calldata_array_three_dimensional.sol index 826c5f723b9c..42c360be0b7f 100644 --- a/test/libsolidity/semanticTests/calldata/calldata_array_three_dimensional.sol +++ b/test/libsolidity/semanticTests/calldata/calldata_array_three_dimensional.sol @@ -8,8 +8,6 @@ contract C { d = x[i][j][k]; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 0, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> 1, 2, 1, 42 // f(uint256[][2][],uint256,uint256,uint256): 0x80, 0, 1, 0, 1, 0x20, 0x40, 0x80, 1, 42, 1, 23 -> 1, 2, 1, 23 diff --git a/test/libsolidity/semanticTests/calldata/calldata_attached_to_bytes.sol b/test/libsolidity/semanticTests/calldata/calldata_attached_to_bytes.sol index e41b75c2dff0..1b6e7379b457 100644 --- a/test/libsolidity/semanticTests/calldata/calldata_attached_to_bytes.sol +++ b/test/libsolidity/semanticTests/calldata/calldata_attached_to_bytes.sol @@ -13,6 +13,5 @@ contract C { return _b.reverse(); } } - // ---- // test(uint256,bytes,uint256): 7, 0x60, 4, 2, "ab" -> "b", "a" diff --git a/test/libsolidity/semanticTests/calldata/calldata_attached_to_dynamic_array_or_slice.sol b/test/libsolidity/semanticTests/calldata/calldata_attached_to_dynamic_array_or_slice.sol index 3ebb4787acc7..5803ef6e845d 100644 --- a/test/libsolidity/semanticTests/calldata/calldata_attached_to_dynamic_array_or_slice.sol +++ b/test/libsolidity/semanticTests/calldata/calldata_attached_to_dynamic_array_or_slice.sol @@ -17,7 +17,6 @@ contract C { return _a[:].reverse(); } } - // ---- // testArray(uint256,uint256[],uint256): 7, 0x60, 4, 2, 66, 77 -> 77, 66 // testSlice(uint256,uint256[],uint256): 7, 0x60, 4, 2, 66, 77 -> 77, 66 diff --git a/test/libsolidity/semanticTests/calldata/calldata_attached_to_static_array.sol b/test/libsolidity/semanticTests/calldata/calldata_attached_to_static_array.sol index e43b17561cb2..a5158dad66a4 100644 --- a/test/libsolidity/semanticTests/calldata/calldata_attached_to_static_array.sol +++ b/test/libsolidity/semanticTests/calldata/calldata_attached_to_static_array.sol @@ -13,6 +13,5 @@ contract C { return _a.reverse(); } } - // ---- // test(uint256,uint256[2],uint256): 7, 66, 77, 4 -> 77, 66 diff --git a/test/libsolidity/semanticTests/calldata/calldata_struct_cleaning.sol b/test/libsolidity/semanticTests/calldata/calldata_struct_cleaning.sol index 493b1ef0b22e..45b323b3d182 100644 --- a/test/libsolidity/semanticTests/calldata/calldata_struct_cleaning.sol +++ b/test/libsolidity/semanticTests/calldata/calldata_struct_cleaning.sol @@ -16,8 +16,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f((uint8,bytes1)): 0x12, hex"3400000000000000000000000000000000000000000000000000000000000000" -> 0x12, hex"3400000000000000000000000000000000000000000000000000000000000000" # double check that the valid case goes through # // f((uint8,bytes1)): 0x1234, hex"5678000000000000000000000000000000000000000000000000000000000000" -> FAILURE diff --git a/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol b/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol index 8df274158469..3dd93c12e42c 100644 --- a/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol +++ b/test/libsolidity/semanticTests/calldata/copy_from_calldata_removes_bytes_data.sol @@ -7,7 +7,6 @@ contract c { } // ==== // EVMVersion: >=byzantium -// compileToEwasm: false // ---- // (): 1, 2, 3, 4, 5 -> // gas irOptimized: 155155 diff --git a/test/libsolidity/semanticTests/cleanup/bool_conversion_v2.sol b/test/libsolidity/semanticTests/cleanup/bool_conversion_v2.sol index 821da2dac605..003cdb0ec781 100644 --- a/test/libsolidity/semanticTests/cleanup/bool_conversion_v2.sol +++ b/test/libsolidity/semanticTests/cleanup/bool_conversion_v2.sol @@ -11,8 +11,6 @@ contract C { _out = _in; } } -// ==== -// compileToEwasm: also // ---- // f(bool): 0x0 -> 0x0 // f(bool): 0x1 -> 0x1 diff --git a/test/libsolidity/semanticTests/cleanup/cleanup_address_types_shortening.sol b/test/libsolidity/semanticTests/cleanup/cleanup_address_types_shortening.sol index 916f2e5aad74..8718cb2e6a67 100644 --- a/test/libsolidity/semanticTests/cleanup/cleanup_address_types_shortening.sol +++ b/test/libsolidity/semanticTests/cleanup/cleanup_address_types_shortening.sol @@ -25,9 +25,6 @@ contract C { require(z == 0x1122334455667788990011223344556677889900); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x1122334455667788990011223344556677889900 // g() -> 0x1122334455667788990011223344556677889900 diff --git a/test/libsolidity/semanticTests/cleanup/cleanup_address_types_v2.sol b/test/libsolidity/semanticTests/cleanup/cleanup_address_types_v2.sol index d6157ab23eb3..73db35c32cb5 100644 --- a/test/libsolidity/semanticTests/cleanup/cleanup_address_types_v2.sol +++ b/test/libsolidity/semanticTests/cleanup/cleanup_address_types_v2.sol @@ -13,8 +13,6 @@ contract C { return 0; } } -// ==== -// compileToEwasm: also // ---- // f(address): 0xffff1234567890123456789012345678901234567890 -> FAILURE # We input longer data on purpose.# // g(address): 0xffff1234567890123456789012345678901234567890 -> FAILURE diff --git a/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_shortening_newCodeGen.sol b/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_shortening_newCodeGen.sol index a99b82a08551..b26ba5640c9a 100644 --- a/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_shortening_newCodeGen.sol +++ b/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_shortening_newCodeGen.sol @@ -8,7 +8,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> 0xffff000000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_v2.sol b/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_v2.sol index f481ffed6b54..8a95f10c0911 100644 --- a/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_v2.sol +++ b/test/libsolidity/semanticTests/cleanup/cleanup_bytes_types_v2.sol @@ -10,7 +10,5 @@ contract C { return 0; } } -// ==== -// compileToEwasm: also // ---- // f(bytes2,uint16): "abc", 0x40102 -> FAILURE # We input longer data on purpose. # diff --git a/test/libsolidity/semanticTests/cleanup/cleanup_in_compound_assign.sol b/test/libsolidity/semanticTests/cleanup/cleanup_in_compound_assign.sol index 51815f5e9681..e0e62971cf89 100644 --- a/test/libsolidity/semanticTests/cleanup/cleanup_in_compound_assign.sol +++ b/test/libsolidity/semanticTests/cleanup/cleanup_in_compound_assign.sol @@ -8,7 +8,5 @@ contract C { return (x, y); } } -// ==== -// compileToEwasm: also // ---- // test() -> 0xff, 0xff diff --git a/test/libsolidity/semanticTests/cleanup/exp_cleanup.sol b/test/libsolidity/semanticTests/cleanup/exp_cleanup.sol index a5145bcebdaa..746f21ef5136 100644 --- a/test/libsolidity/semanticTests/cleanup/exp_cleanup.sol +++ b/test/libsolidity/semanticTests/cleanup/exp_cleanup.sol @@ -6,8 +6,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x1 diff --git a/test/libsolidity/semanticTests/cleanup/exp_cleanup_direct.sol b/test/libsolidity/semanticTests/cleanup/exp_cleanup_direct.sol index 663716a126c2..62f927b5bb6b 100644 --- a/test/libsolidity/semanticTests/cleanup/exp_cleanup_direct.sol +++ b/test/libsolidity/semanticTests/cleanup/exp_cleanup_direct.sol @@ -5,8 +5,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x1 diff --git a/test/libsolidity/semanticTests/cleanup/exp_cleanup_nonzero_base.sol b/test/libsolidity/semanticTests/cleanup/exp_cleanup_nonzero_base.sol index 12c3afba4754..de55afa9c657 100644 --- a/test/libsolidity/semanticTests/cleanup/exp_cleanup_nonzero_base.sol +++ b/test/libsolidity/semanticTests/cleanup/exp_cleanup_nonzero_base.sol @@ -6,8 +6,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x1 diff --git a/test/libsolidity/semanticTests/cleanup/exp_cleanup_smaller_base.sol b/test/libsolidity/semanticTests/cleanup/exp_cleanup_smaller_base.sol index b282948cb0ce..7b81d0a1c57e 100644 --- a/test/libsolidity/semanticTests/cleanup/exp_cleanup_smaller_base.sol +++ b/test/libsolidity/semanticTests/cleanup/exp_cleanup_smaller_base.sol @@ -9,7 +9,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x00 diff --git a/test/libsolidity/semanticTests/constantEvaluator/negative_fractional_mod.sol b/test/libsolidity/semanticTests/constantEvaluator/negative_fractional_mod.sol index 0385a4c3089e..4426f0c0c5bf 100644 --- a/test/libsolidity/semanticTests/constantEvaluator/negative_fractional_mod.sol +++ b/test/libsolidity/semanticTests/constantEvaluator/negative_fractional_mod.sol @@ -5,7 +5,5 @@ contract C { return (x, (-(-t % 3)) * 5); } } -// ==== -// compileToEwasm: also // ---- // f() -> 11, 10 diff --git a/test/libsolidity/semanticTests/constantEvaluator/rounding.sol b/test/libsolidity/semanticTests/constantEvaluator/rounding.sol index a7c1b4b45221..837e87dc8726 100644 --- a/test/libsolidity/semanticTests/constantEvaluator/rounding.sol +++ b/test/libsolidity/semanticTests/constantEvaluator/rounding.sol @@ -9,7 +9,5 @@ contract C { return (x.length, c, y.length, -d); } } -// ==== -// compileToEwasm: also // ---- // f() -> 2, 2, 2, 2 diff --git a/test/libsolidity/semanticTests/constants/asm_address_constant_regression.sol b/test/libsolidity/semanticTests/constants/asm_address_constant_regression.sol index 3da3ff646c1d..ae405d8f366f 100644 --- a/test/libsolidity/semanticTests/constants/asm_address_constant_regression.sol +++ b/test/libsolidity/semanticTests/constants/asm_address_constant_regression.sol @@ -7,8 +7,5 @@ contract C { assembly { z := e } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x00 diff --git a/test/libsolidity/semanticTests/constants/asm_constant_file_level.sol b/test/libsolidity/semanticTests/constants/asm_constant_file_level.sol index 89d2e250d4d1..4f907646357c 100644 --- a/test/libsolidity/semanticTests/constants/asm_constant_file_level.sol +++ b/test/libsolidity/semanticTests/constants/asm_constant_file_level.sol @@ -5,7 +5,5 @@ contract C { assembly { z := e } } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x1212121212121212121212121000002134593163 diff --git a/test/libsolidity/semanticTests/constants/constant_string.sol b/test/libsolidity/semanticTests/constants/constant_string.sol index 638b24382281..3b53102baaad 100644 --- a/test/libsolidity/semanticTests/constants/constant_string.sol +++ b/test/libsolidity/semanticTests/constants/constant_string.sol @@ -15,9 +15,6 @@ contract C { return bytes(c); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 3, "\x03\x01\x02" // g() -> 0x20, 3, "\x03\x01\x02" diff --git a/test/libsolidity/semanticTests/constants/constant_string_at_file_level.sol b/test/libsolidity/semanticTests/constants/constant_string_at_file_level.sol index a8822176da4c..0ff332c4f51d 100644 --- a/test/libsolidity/semanticTests/constants/constant_string_at_file_level.sol +++ b/test/libsolidity/semanticTests/constants/constant_string_at_file_level.sol @@ -23,9 +23,6 @@ contract C { return (x, choices, st); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 3, "\x03\x01\x02" // g() -> 0x20, 3, "\x03\x01\x02" diff --git a/test/libsolidity/semanticTests/constants/constant_variables.sol b/test/libsolidity/semanticTests/constants/constant_variables.sol index 4ae4edb976b3..2ecd6e76a6f6 100644 --- a/test/libsolidity/semanticTests/constants/constant_variables.sol +++ b/test/libsolidity/semanticTests/constants/constant_variables.sol @@ -4,8 +4,5 @@ contract Foo { ActionChoices constant choices = ActionChoices.GoLeft; bytes32 constant st = "abc\x00\xff__"; } - -// ==== -// compileToEwasm: also // ---- // constructor() -> diff --git a/test/libsolidity/semanticTests/constants/constants_at_file_level_referencing.sol b/test/libsolidity/semanticTests/constants/constants_at_file_level_referencing.sol index a1ae3911fc82..764ffc245034 100644 --- a/test/libsolidity/semanticTests/constants/constants_at_file_level_referencing.sol +++ b/test/libsolidity/semanticTests/constants/constants_at_file_level_referencing.sol @@ -31,9 +31,6 @@ contract C { return fre(); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 3, "\x03\x01\x02" // g() -> 0x20, 3, "\x03\x01\x02" diff --git a/test/libsolidity/semanticTests/constants/consteval_array_length.sol b/test/libsolidity/semanticTests/constants/consteval_array_length.sol index bdf95a9b9efa..91e929834df4 100644 --- a/test/libsolidity/semanticTests/constants/consteval_array_length.sol +++ b/test/libsolidity/semanticTests/constants/consteval_array_length.sol @@ -8,7 +8,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // constructor() -> diff --git a/test/libsolidity/semanticTests/constants/function_unreferenced.sol b/test/libsolidity/semanticTests/constants/function_unreferenced.sol index 2b80c440fcac..d7578fecea4d 100644 --- a/test/libsolidity/semanticTests/constants/function_unreferenced.sol +++ b/test/libsolidity/semanticTests/constants/function_unreferenced.sol @@ -5,7 +5,5 @@ contract C is B { bytes4 constant s2 = B.g.selector; function f() external pure returns (bytes4) { return s2; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/constants/same_constants_different_files.sol b/test/libsolidity/semanticTests/constants/same_constants_different_files.sol index 5a85c5fd7740..3a819befb824 100644 --- a/test/libsolidity/semanticTests/constants/same_constants_different_files.sol +++ b/test/libsolidity/semanticTests/constants/same_constants_different_files.sol @@ -19,8 +19,5 @@ contract C { return (a, fre(), M.a, b); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x0d, 0x59, 0x59, 0x59 diff --git a/test/libsolidity/semanticTests/constants/simple_constant_variables_test.sol b/test/libsolidity/semanticTests/constants/simple_constant_variables_test.sol index ea35262ef414..ed0e919fcd57 100644 --- a/test/libsolidity/semanticTests/constants/simple_constant_variables_test.sol +++ b/test/libsolidity/semanticTests/constants/simple_constant_variables_test.sol @@ -5,8 +5,5 @@ contract Foo { uint256 constant x = 56; } - -// ==== -// compileToEwasm: also // ---- // getX() -> 56 diff --git a/test/libsolidity/semanticTests/constructor/base_constructor_arguments.sol b/test/libsolidity/semanticTests/constructor/base_constructor_arguments.sol index d6d76adc5b18..55daf6d3d547 100644 --- a/test/libsolidity/semanticTests/constructor/base_constructor_arguments.sol +++ b/test/libsolidity/semanticTests/constructor/base_constructor_arguments.sol @@ -19,6 +19,5 @@ contract Derived is Base { return m_a; } } - // ---- // getA() -> 49 diff --git a/test/libsolidity/semanticTests/constructor/constructor_arguments_internal.sol b/test/libsolidity/semanticTests/constructor/constructor_arguments_internal.sol index bb7e7e596aa1..bf3f0c0c9b74 100644 --- a/test/libsolidity/semanticTests/constructor/constructor_arguments_internal.sol +++ b/test/libsolidity/semanticTests/constructor/constructor_arguments_internal.sol @@ -32,7 +32,6 @@ contract Main { return h.getName(); } } - // ---- // getFlag() -> true // getName() -> "abc" diff --git a/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol b/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol index b6242379e75b..dd91c86a2031 100644 --- a/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol +++ b/test/libsolidity/semanticTests/constructor/constructor_static_array_argument.sol @@ -7,7 +7,6 @@ contract C { b = _b; } } - // ---- // constructor(): 1, 2, 3, 4 -> // gas irOptimized: 172314 diff --git a/test/libsolidity/semanticTests/constructor/evm_exceptions_in_constructor_call_fail.sol b/test/libsolidity/semanticTests/constructor/evm_exceptions_in_constructor_call_fail.sol index 92633cdda968..43d1fdab848f 100644 --- a/test/libsolidity/semanticTests/constructor/evm_exceptions_in_constructor_call_fail.sol +++ b/test/libsolidity/semanticTests/constructor/evm_exceptions_in_constructor_call_fail.sol @@ -13,7 +13,6 @@ contract B { ++test; } } - // ---- // testIt() -> // test() -> 2 diff --git a/test/libsolidity/semanticTests/constructor/function_usage_in_constructor_arguments.sol b/test/libsolidity/semanticTests/constructor/function_usage_in_constructor_arguments.sol index 0c0b6e3144c6..c04f039188c4 100644 --- a/test/libsolidity/semanticTests/constructor/function_usage_in_constructor_arguments.sol +++ b/test/libsolidity/semanticTests/constructor/function_usage_in_constructor_arguments.sol @@ -19,6 +19,5 @@ contract Derived is Base { return m_a; } } - // ---- // getA() -> 2 diff --git a/test/libsolidity/semanticTests/constructor/functions_called_by_constructor.sol b/test/libsolidity/semanticTests/constructor/functions_called_by_constructor.sol index 397c314a9ff6..b968a07a161d 100644 --- a/test/libsolidity/semanticTests/constructor/functions_called_by_constructor.sol +++ b/test/libsolidity/semanticTests/constructor/functions_called_by_constructor.sol @@ -14,8 +14,5 @@ contract Test { name = _name; } } - -// ==== -// compileToEwasm: also // ---- // getName() -> "abc" diff --git a/test/libsolidity/semanticTests/constructor/functions_called_by_constructor_through_dispatch.sol b/test/libsolidity/semanticTests/constructor/functions_called_by_constructor_through_dispatch.sol index 763393a998ba..0a1250a8ba62 100644 --- a/test/libsolidity/semanticTests/constructor/functions_called_by_constructor_through_dispatch.sol +++ b/test/libsolidity/semanticTests/constructor/functions_called_by_constructor_through_dispatch.sol @@ -24,8 +24,5 @@ contract Test { name = _shiftOperator(name, _bytes); } } - -// ==== -// compileToEwasm: also // ---- // getName() -> "def\x00\x00\x00" diff --git a/test/libsolidity/semanticTests/constructor/inline_member_init_inheritence_without_constructor.sol b/test/libsolidity/semanticTests/constructor/inline_member_init_inheritence_without_constructor.sol index 6e1f46f86445..320349cda9ed 100644 --- a/test/libsolidity/semanticTests/constructor/inline_member_init_inheritence_without_constructor.sol +++ b/test/libsolidity/semanticTests/constructor/inline_member_init_inheritence_without_constructor.sol @@ -14,8 +14,6 @@ contract Derived is Base { return m_derived; } } -// ==== -// compileToEwasm: also // ---- // getBMember() -> 5 // getDMember() -> 6 diff --git a/test/libsolidity/semanticTests/constructor/payable_constructor.sol b/test/libsolidity/semanticTests/constructor/payable_constructor.sol index 0f19eb7e2664..09fe0a1cc32d 100644 --- a/test/libsolidity/semanticTests/constructor/payable_constructor.sol +++ b/test/libsolidity/semanticTests/constructor/payable_constructor.sol @@ -1,8 +1,5 @@ contract C { constructor() payable {} } - -// ==== -// compileToEwasm: also // ---- // constructor(), 27 wei -> diff --git a/test/libsolidity/semanticTests/constructor/store_function_in_constructor.sol b/test/libsolidity/semanticTests/constructor/store_function_in_constructor.sol index 7f0514041e6b..dee3af35415f 100644 --- a/test/libsolidity/semanticTests/constructor/store_function_in_constructor.sol +++ b/test/libsolidity/semanticTests/constructor/store_function_in_constructor.sol @@ -15,9 +15,6 @@ contract C { return x(_arg); } } - -// ==== -// compileToEwasm: also // ---- // use(uint256): 3 -> 6 // result_in_constructor() -> 4 diff --git a/test/libsolidity/semanticTests/constructor/store_function_in_constructor_packed.sol b/test/libsolidity/semanticTests/constructor/store_function_in_constructor_packed.sol index 7fef18a1568b..07b12ad96cb7 100644 --- a/test/libsolidity/semanticTests/constructor/store_function_in_constructor_packed.sol +++ b/test/libsolidity/semanticTests/constructor/store_function_in_constructor_packed.sol @@ -16,9 +16,6 @@ contract C { return x(_arg); } } - -// ==== -// compileToEwasm: also // ---- // use(uint16): 3 -> 0xfff9 // result_in_constructor() -> 0xfffb diff --git a/test/libsolidity/semanticTests/constructor/store_internal_unused_function_in_constructor.sol b/test/libsolidity/semanticTests/constructor/store_internal_unused_function_in_constructor.sol index 6721329a12a1..cc9d8ca6a134 100644 --- a/test/libsolidity/semanticTests/constructor/store_internal_unused_function_in_constructor.sol +++ b/test/libsolidity/semanticTests/constructor/store_internal_unused_function_in_constructor.sol @@ -13,8 +13,5 @@ contract C { return x(); } } - -// ==== -// compileToEwasm: also // ---- // t() -> 7 diff --git a/test/libsolidity/semanticTests/constructor/store_internal_unused_library_function_in_constructor.sol b/test/libsolidity/semanticTests/constructor/store_internal_unused_library_function_in_constructor.sol index 7b166489fb8c..5845e9b56e15 100644 --- a/test/libsolidity/semanticTests/constructor/store_internal_unused_library_function_in_constructor.sol +++ b/test/libsolidity/semanticTests/constructor/store_internal_unused_library_function_in_constructor.sol @@ -16,6 +16,5 @@ contract C { return x(); } } - // ---- // t() -> 7 diff --git a/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol b/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol index 6b1b6704afa3..00dfef4abc99 100644 --- a/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol +++ b/test/libsolidity/semanticTests/constructor_inheritance_init_order.sol @@ -11,7 +11,6 @@ contract B is A { uint public y = f(); } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // constructor() -> diff --git a/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol b/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol index b60564665ded..9b982d6e9930 100644 --- a/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol +++ b/test/libsolidity/semanticTests/constructor_inheritance_init_order_2.sol @@ -7,8 +7,6 @@ contract A { contract B is A { uint public y = f(); } -// ==== -// compileToEwasm: also // ---- // constructor() -> // gas irOptimized: 120936 diff --git a/test/libsolidity/semanticTests/deployedCodeExclusion/subassembly_deduplication.sol b/test/libsolidity/semanticTests/deployedCodeExclusion/subassembly_deduplication.sol index 2b2d694bd17a..b6ae85b838d8 100644 --- a/test/libsolidity/semanticTests/deployedCodeExclusion/subassembly_deduplication.sol +++ b/test/libsolidity/semanticTests/deployedCodeExclusion/subassembly_deduplication.sol @@ -37,6 +37,5 @@ contract C { x < 2 * type(A).creationCode.length; } } - // ---- // test() -> true diff --git a/test/libsolidity/semanticTests/dirty_calldata_bytes.sol b/test/libsolidity/semanticTests/dirty_calldata_bytes.sol index 48dc5ee2f1ad..5876b1f7c65c 100644 --- a/test/libsolidity/semanticTests/dirty_calldata_bytes.sol +++ b/test/libsolidity/semanticTests/dirty_calldata_bytes.sol @@ -8,7 +8,5 @@ contract C { correct = r == (0x64 << 248); } } -// ==== -// compileToEwasm: also // ---- // f(bytes): 0x20, 0x04, "dead" -> true diff --git a/test/libsolidity/semanticTests/empty_contract.sol b/test/libsolidity/semanticTests/empty_contract.sol index 511b72469240..7c1ae2846ea8 100644 --- a/test/libsolidity/semanticTests/empty_contract.sol +++ b/test/libsolidity/semanticTests/empty_contract.sol @@ -2,6 +2,5 @@ contract test { } // ==== // allowNonExistingFunctions: true -// compileToEwasm: also // ---- // i_am_not_there() -> FAILURE diff --git a/test/libsolidity/semanticTests/empty_for_loop.sol b/test/libsolidity/semanticTests/empty_for_loop.sol index d4ba09f1395e..450134b63901 100644 --- a/test/libsolidity/semanticTests/empty_for_loop.sol +++ b/test/libsolidity/semanticTests/empty_for_loop.sol @@ -7,7 +7,5 @@ contract test { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 10 diff --git a/test/libsolidity/semanticTests/enums/constructing_enums_from_ints.sol b/test/libsolidity/semanticTests/enums/constructing_enums_from_ints.sol index ddf1a66fa1e4..beabc514315b 100644 --- a/test/libsolidity/semanticTests/enums/constructing_enums_from_ints.sol +++ b/test/libsolidity/semanticTests/enums/constructing_enums_from_ints.sol @@ -5,8 +5,5 @@ contract c { return uint256(Truth(uint8(0x1))); } } - -// ==== -// compileToEwasm: also // ---- // test() -> 1 diff --git a/test/libsolidity/semanticTests/enums/enum_explicit_overflow.sol b/test/libsolidity/semanticTests/enums/enum_explicit_overflow.sol index a538946ad582..b952524b2a22 100644 --- a/test/libsolidity/semanticTests/enums/enum_explicit_overflow.sol +++ b/test/libsolidity/semanticTests/enums/enum_explicit_overflow.sol @@ -20,9 +20,7 @@ contract test { ActionChoices choice; } - // ==== -// compileToEwasm: also // EVMVersion: >=byzantium // ---- // getChoiceExp(uint256): 2 -> 2 diff --git a/test/libsolidity/semanticTests/enums/enum_explicit_overflow_homestead.sol b/test/libsolidity/semanticTests/enums/enum_explicit_overflow_homestead.sol index 9b783b404196..60a1d64d3e34 100644 --- a/test/libsolidity/semanticTests/enums/enum_explicit_overflow_homestead.sol +++ b/test/libsolidity/semanticTests/enums/enum_explicit_overflow_homestead.sol @@ -20,7 +20,6 @@ contract test { ActionChoices choice; } - // ==== // EVMVersion: 3 diff --git a/test/libsolidity/semanticTests/enums/minmax.sol b/test/libsolidity/semanticTests/enums/minmax.sol index 4b929c36cf58..a447f64338e4 100644 --- a/test/libsolidity/semanticTests/enums/minmax.sol +++ b/test/libsolidity/semanticTests/enums/minmax.sol @@ -4,7 +4,6 @@ contract test { function min() public returns(uint) { return uint(type(MinMax).min); } function max() public returns(uint) { return uint(type(MinMax).max); } } - // ---- // min() -> 0 // max() -> 3 diff --git a/test/libsolidity/semanticTests/enums/using_contract_enums_with_explicit_contract_name.sol b/test/libsolidity/semanticTests/enums/using_contract_enums_with_explicit_contract_name.sol index cda5d06ac371..a3bce93accae 100644 --- a/test/libsolidity/semanticTests/enums/using_contract_enums_with_explicit_contract_name.sol +++ b/test/libsolidity/semanticTests/enums/using_contract_enums_with_explicit_contract_name.sol @@ -5,8 +5,5 @@ contract test { _ret = test.Choice.B; } } - -// ==== -// compileToEwasm: also // ---- // answer() -> 1 diff --git a/test/libsolidity/semanticTests/enums/using_enums.sol b/test/libsolidity/semanticTests/enums/using_enums.sol index ec014160aae6..b4d0ce8e367f 100644 --- a/test/libsolidity/semanticTests/enums/using_enums.sol +++ b/test/libsolidity/semanticTests/enums/using_enums.sol @@ -11,8 +11,5 @@ contract test { ActionChoices choices; } - -// ==== -// compileToEwasm: also // ---- // getChoice() -> 2 diff --git a/test/libsolidity/semanticTests/enums/using_inherited_enum.sol b/test/libsolidity/semanticTests/enums/using_inherited_enum.sol index 8d65aeac8e8c..9741568baaf3 100644 --- a/test/libsolidity/semanticTests/enums/using_inherited_enum.sol +++ b/test/libsolidity/semanticTests/enums/using_inherited_enum.sol @@ -8,7 +8,5 @@ contract test is base { _ret = Choice.B; } } -// ==== -// compileToEwasm: also // ---- // answer() -> 1 diff --git a/test/libsolidity/semanticTests/enums/using_inherited_enum_excplicitly.sol b/test/libsolidity/semanticTests/enums/using_inherited_enum_excplicitly.sol index cac059774c1d..eb1d63a2fd6f 100644 --- a/test/libsolidity/semanticTests/enums/using_inherited_enum_excplicitly.sol +++ b/test/libsolidity/semanticTests/enums/using_inherited_enum_excplicitly.sol @@ -8,7 +8,5 @@ contract test is base { _ret = base.Choice.B; } } -// ==== -// compileToEwasm: also // ---- // answer() -> 1 diff --git a/test/libsolidity/semanticTests/errors/named_error_args.sol b/test/libsolidity/semanticTests/errors/named_error_args.sol index 28df2c4ccb9b..04697f52192b 100644 --- a/test/libsolidity/semanticTests/errors/named_error_args.sol +++ b/test/libsolidity/semanticTests/errors/named_error_args.sol @@ -4,7 +4,5 @@ contract C { revert E({b: 7, a: 2}); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"85208890", hex"0000000000000000000000000000000000000000000000000000000000000002", hex"0000000000000000000000000000000000000000000000000000000000000007" diff --git a/test/libsolidity/semanticTests/errors/named_parameters_shadowing_types.sol b/test/libsolidity/semanticTests/errors/named_parameters_shadowing_types.sol index a0d43c274fd8..2f2b7c676b9b 100644 --- a/test/libsolidity/semanticTests/errors/named_parameters_shadowing_types.sol +++ b/test/libsolidity/semanticTests/errors/named_parameters_shadowing_types.sol @@ -18,8 +18,6 @@ contract C { revert E2({EnumType: StructType(42), StructType: EnumType.B}); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"33a54193", hex"000000000000000000000000000000000000000000000000000000000000002a" // g() -> FAILURE, hex"374b9387", hex"0000000000000000000000000000000000000000000000000000000000000001", hex"000000000000000000000000000000000000000000000000000000000000002a" diff --git a/test/libsolidity/semanticTests/errors/panic_via_import.sol b/test/libsolidity/semanticTests/errors/panic_via_import.sol index b763164c9a48..94a6a7aaaf68 100644 --- a/test/libsolidity/semanticTests/errors/panic_via_import.sol +++ b/test/libsolidity/semanticTests/errors/panic_via_import.sol @@ -11,8 +11,6 @@ contract C { revert E(1); } } -// ==== -// compileToEwasm: also // ---- // a() -> FAILURE, hex"002ff067", hex"0000000000000000000000000000000000000000000000000000000000000001" // b() -> FAILURE, hex"002ff067", hex"0000000000000000000000000000000000000000000000000000000000000001" diff --git a/test/libsolidity/semanticTests/errors/simple.sol b/test/libsolidity/semanticTests/errors/simple.sol index b8a8e0d609dd..809b10c57d0a 100644 --- a/test/libsolidity/semanticTests/errors/simple.sol +++ b/test/libsolidity/semanticTests/errors/simple.sol @@ -4,7 +4,5 @@ contract C { revert E(2, 7); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"85208890", 2, 7 diff --git a/test/libsolidity/semanticTests/errors/using_structs.sol b/test/libsolidity/semanticTests/errors/using_structs.sol index 47979a9552d7..e04e4b1c7a49 100644 --- a/test/libsolidity/semanticTests/errors/using_structs.sol +++ b/test/libsolidity/semanticTests/errors/using_structs.sol @@ -13,8 +13,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> FAILURE, hex"e96e07f0", hex"0000000000000000000000000000000000000000000000000000000000000002", hex"0000000000000000000000000000000000000000000000000000000000000060", hex"0000000000000000000000000000000000000000000000000000000000000007", hex"0000000000000000000000000000000000000000000000000000000000000009", hex"0000000000000000000000000000000000000000000000000000000000000040", hex"0000000000000000000000000000000000000000000000000000000000000003", hex"6162630000000000000000000000000000000000000000000000000000000000" // f(bool): false -> FAILURE, hex"e96e07f0", hex"0000000000000000000000000000000000000000000000000000000000000002", hex"0000000000000000000000000000000000000000000000000000000000000060", hex"0000000000000000000000000000000000000000000000000000000000000007", hex"0000000000000000000000000000000000000000000000000000000000000009", hex"0000000000000000000000000000000000000000000000000000000000000040", hex"0000000000000000000000000000000000000000000000000000000000000003", hex"6162630000000000000000000000000000000000000000000000000000000000" diff --git a/test/libsolidity/semanticTests/errors/via_contract_type.sol b/test/libsolidity/semanticTests/errors/via_contract_type.sol index f0ea6ca3c8f8..09f60e6530d2 100644 --- a/test/libsolidity/semanticTests/errors/via_contract_type.sol +++ b/test/libsolidity/semanticTests/errors/via_contract_type.sol @@ -10,8 +10,6 @@ contract B is A { function h() public pure { revert X.E("abc"); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"002ff067", hex"0000000000000000000000000000000000000000000000000000000000000001" // g() -> FAILURE, hex"002ff067", hex"0000000000000000000000000000000000000000000000000000000000000001" diff --git a/test/libsolidity/semanticTests/errors/via_import.sol b/test/libsolidity/semanticTests/errors/via_import.sol index 6a6d3399edc8..eb54e5b4d71b 100644 --- a/test/libsolidity/semanticTests/errors/via_import.sol +++ b/test/libsolidity/semanticTests/errors/via_import.sol @@ -17,8 +17,6 @@ contract C { revert T.S.E(3); } } -// ==== -// compileToEwasm: also // ---- // x() -> FAILURE, hex"002ff067", hex"0000000000000000000000000000000000000000000000000000000000000001" // y() -> FAILURE, hex"002ff067", hex"0000000000000000000000000000000000000000000000000000000000000002" diff --git a/test/libsolidity/semanticTests/errors/weird_name.sol b/test/libsolidity/semanticTests/errors/weird_name.sol index d3d7545496f6..2466d6e20346 100644 --- a/test/libsolidity/semanticTests/errors/weird_name.sol +++ b/test/libsolidity/semanticTests/errors/weird_name.sol @@ -4,7 +4,5 @@ contract C { revert error(2); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"b48fb6cf", hex"0000000000000000000000000000000000000000000000000000000000000002" diff --git a/test/libsolidity/semanticTests/exponentiation/literal_base.sol b/test/libsolidity/semanticTests/exponentiation/literal_base.sol index f00999c97177..3dcba494abc0 100644 --- a/test/libsolidity/semanticTests/exponentiation/literal_base.sol +++ b/test/libsolidity/semanticTests/exponentiation/literal_base.sol @@ -7,8 +7,6 @@ contract test { } } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 1, 1 // f(uint256): 1 -> 2, -2 diff --git a/test/libsolidity/semanticTests/exponentiation/signed_base.sol b/test/libsolidity/semanticTests/exponentiation/signed_base.sol index 105a8ef5f723..f58c081293e6 100644 --- a/test/libsolidity/semanticTests/exponentiation/signed_base.sol +++ b/test/libsolidity/semanticTests/exponentiation/signed_base.sol @@ -10,7 +10,5 @@ contract test { return (x**y1, x**y2); } } -// ==== -// compileToEwasm: also // ---- // f() -> 9, -27 diff --git a/test/libsolidity/semanticTests/exponentiation/small_exp.sol b/test/libsolidity/semanticTests/exponentiation/small_exp.sol index 945b65c9df1c..a26675fb7f31 100644 --- a/test/libsolidity/semanticTests/exponentiation/small_exp.sol +++ b/test/libsolidity/semanticTests/exponentiation/small_exp.sol @@ -10,7 +10,5 @@ contract test { return r; } } -// ==== -// compileToEwasm: also // ---- // f() -> 4 diff --git a/test/libsolidity/semanticTests/expressions/bit_operators.sol b/test/libsolidity/semanticTests/expressions/bit_operators.sol index 733951e2c088..35887059c99e 100644 --- a/test/libsolidity/semanticTests/expressions/bit_operators.sol +++ b/test/libsolidity/semanticTests/expressions/bit_operators.sol @@ -13,7 +13,5 @@ contract test { z = a ^ b; } } -// ==== -// compileToEwasm: also // ---- // f() -> 3855, 268374015, 268370160 diff --git a/test/libsolidity/semanticTests/expressions/bytes_comparison.sol b/test/libsolidity/semanticTests/expressions/bytes_comparison.sol index 634486d915ef..b1220c510ce7 100644 --- a/test/libsolidity/semanticTests/expressions/bytes_comparison.sol +++ b/test/libsolidity/semanticTests/expressions/bytes_comparison.sol @@ -6,7 +6,5 @@ contract test { return a < x && x < b; } } -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_different_types.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_different_types.sol index 66eb86d50523..df07364b368d 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_different_types.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_different_types.sol @@ -5,8 +5,6 @@ contract test { return cond ? x : y; } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 0xcd // f(bool): false -> 0xabab diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_false_literal.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_false_literal.sol index f8c3abf2dd9c..3915c7b8dc61 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_false_literal.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_false_literal.sol @@ -3,7 +3,5 @@ contract test { return false ? 5 : 10; } } -// ==== -// compileToEwasm: also // ---- // f() -> 10 diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_functions.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_functions.sol index 5abc4e1e3371..bff9122b1ea1 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_functions.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_functions.sol @@ -7,8 +7,6 @@ contract test { return z(); } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 1 // f(bool): false -> 2 diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_multiple.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_multiple.sol index c51172b0d86b..2a9d6de8086a 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_multiple.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_multiple.sol @@ -6,8 +6,6 @@ contract test { x > 50 ? 50 : 10; } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 1001 -> 1000 // f(uint256): 500 -> 100 diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_storage_memory_1.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_storage_memory_1.sol index 40cfc7a9ddb7..3434cca016e8 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_storage_memory_1.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_storage_memory_1.sol @@ -22,8 +22,6 @@ contract test { return ret; } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 1 // f(bool): false -> 2 diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_true_literal.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_true_literal.sol index 968a4a02a80b..06247f0dc535 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_true_literal.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_true_literal.sol @@ -3,7 +3,5 @@ contract test { return true ? 5 : 10; } } -// ==== -// compileToEwasm: also // ---- // f() -> 5 diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_tuples.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_tuples.sol index a28dd1f06d2a..d27d06bacb79 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_tuples.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_tuples.sol @@ -3,8 +3,6 @@ contract test { return cond ? (1, 2) : (3, 4); } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 1, 2 // f(bool): false -> 3, 4 diff --git a/test/libsolidity/semanticTests/expressions/conditional_expression_with_return_values.sol b/test/libsolidity/semanticTests/expressions/conditional_expression_with_return_values.sol index fdf691ae4388..bbaf051bde11 100644 --- a/test/libsolidity/semanticTests/expressions/conditional_expression_with_return_values.sol +++ b/test/libsolidity/semanticTests/expressions/conditional_expression_with_return_values.sol @@ -3,8 +3,6 @@ contract test { cond ? a = v : b = v; } } -// ==== -// compileToEwasm: also // ---- // f(bool,uint256): true, 20 -> 20, 0 // f(bool,uint256): false, 20 -> 0, 20 diff --git a/test/libsolidity/semanticTests/expressions/exp_operator_const.sol b/test/libsolidity/semanticTests/expressions/exp_operator_const.sol index ef71a3d2b0af..e2a7ccc7355e 100644 --- a/test/libsolidity/semanticTests/expressions/exp_operator_const.sol +++ b/test/libsolidity/semanticTests/expressions/exp_operator_const.sol @@ -1,7 +1,5 @@ contract test { function f() public returns(uint d) { return 2 ** 3; } } -// ==== -// compileToEwasm: also // ---- // f() -> 8 diff --git a/test/libsolidity/semanticTests/expressions/exp_operator_const_signed.sol b/test/libsolidity/semanticTests/expressions/exp_operator_const_signed.sol index 4901f5c78f7f..b2dd001b3528 100644 --- a/test/libsolidity/semanticTests/expressions/exp_operator_const_signed.sol +++ b/test/libsolidity/semanticTests/expressions/exp_operator_const_signed.sol @@ -1,7 +1,5 @@ contract test { function f() public returns(int d) { return (-2) ** 3; } } -// ==== -// compileToEwasm: also // ---- // f() -> -8 diff --git a/test/libsolidity/semanticTests/expressions/exp_zero_literal.sol b/test/libsolidity/semanticTests/expressions/exp_zero_literal.sol index 716f72aeebb8..f7e5c6ab8107 100644 --- a/test/libsolidity/semanticTests/expressions/exp_zero_literal.sol +++ b/test/libsolidity/semanticTests/expressions/exp_zero_literal.sol @@ -1,7 +1,5 @@ contract test { function f() public returns(uint d) { return 0 ** 0; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/expressions/inc_dec_operators.sol b/test/libsolidity/semanticTests/expressions/inc_dec_operators.sol index b9eaa648033e..c6957ee9f62a 100644 --- a/test/libsolidity/semanticTests/expressions/inc_dec_operators.sol +++ b/test/libsolidity/semanticTests/expressions/inc_dec_operators.sol @@ -11,7 +11,5 @@ contract test { r += (++v) * 0x10000; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x053866 diff --git a/test/libsolidity/semanticTests/expressions/uncalled_address_transfer_send.sol b/test/libsolidity/semanticTests/expressions/uncalled_address_transfer_send.sol index 837f9f74108e..af408b3f5110 100644 --- a/test/libsolidity/semanticTests/expressions/uncalled_address_transfer_send.sol +++ b/test/libsolidity/semanticTests/expressions/uncalled_address_transfer_send.sol @@ -6,7 +6,5 @@ contract TransferTest { function f() pure public {} } -// ==== -// compileToEwasm: also // ---- // f() -> diff --git a/test/libsolidity/semanticTests/fallback/call_forward_bytes.sol b/test/libsolidity/semanticTests/fallback/call_forward_bytes.sol index 4a35fad1dbca..7bf3aee3acfe 100644 --- a/test/libsolidity/semanticTests/fallback/call_forward_bytes.sol +++ b/test/libsolidity/semanticTests/fallback/call_forward_bytes.sol @@ -14,7 +14,6 @@ contract sender { } // ==== // allowNonExistingFunctions: true -// compileToEwasm: false // ---- // recv(uint256): 7 -> // val() -> 0 diff --git a/test/libsolidity/semanticTests/fallback/falback_return.sol b/test/libsolidity/semanticTests/fallback/falback_return.sol index 55e65348b184..d59bb9d45247 100644 --- a/test/libsolidity/semanticTests/fallback/falback_return.sol +++ b/test/libsolidity/semanticTests/fallback/falback_return.sol @@ -5,8 +5,6 @@ contract A { x++; } } -// ==== -// compileToEwasm: also // ---- // () // x() -> 1 diff --git a/test/libsolidity/semanticTests/fallback/fallback_or_receive.sol b/test/libsolidity/semanticTests/fallback/fallback_or_receive.sol index 14366886cbe3..9b5319ae0013 100644 --- a/test/libsolidity/semanticTests/fallback/fallback_or_receive.sol +++ b/test/libsolidity/semanticTests/fallback/fallback_or_receive.sol @@ -5,8 +5,6 @@ contract C { receive () payable external { ++y; } function f() external returns (uint, uint) { return (x, y); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0, 0 // () -> diff --git a/test/libsolidity/semanticTests/fallback/inherited.sol b/test/libsolidity/semanticTests/fallback/inherited.sol index 75ab307bfc43..55c63944508c 100644 --- a/test/libsolidity/semanticTests/fallback/inherited.sol +++ b/test/libsolidity/semanticTests/fallback/inherited.sol @@ -4,8 +4,6 @@ contract A { function getData() public returns (uint r) { return data; } } contract B is A {} -// ==== -// compileToEwasm: also // ---- // getData() -> 0 // (): 42 -> diff --git a/test/libsolidity/semanticTests/fallback/short_data_calls_fallback.sol b/test/libsolidity/semanticTests/fallback/short_data_calls_fallback.sol index cb62135edfa9..dd97f4c03488 100644 --- a/test/libsolidity/semanticTests/fallback/short_data_calls_fallback.sol +++ b/test/libsolidity/semanticTests/fallback/short_data_calls_fallback.sol @@ -4,8 +4,6 @@ contract A { function fow() public { x = 3; } fallback () external { x = 2; } } -// ==== -// compileToEwasm: also // ---- // (): hex"d88e0b" // x() -> 2 diff --git a/test/libsolidity/semanticTests/freeFunctions/easy.sol b/test/libsolidity/semanticTests/freeFunctions/easy.sol index dae3b40377ed..f73f101256c5 100644 --- a/test/libsolidity/semanticTests/freeFunctions/easy.sol +++ b/test/libsolidity/semanticTests/freeFunctions/easy.sol @@ -7,7 +7,5 @@ contract C { return add(x, 2); } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 7 -> 9 diff --git a/test/libsolidity/semanticTests/freeFunctions/free_namesake_contract_function.sol b/test/libsolidity/semanticTests/freeFunctions/free_namesake_contract_function.sol index 465b80f7a921..cf4140286d7c 100644 --- a/test/libsolidity/semanticTests/freeFunctions/free_namesake_contract_function.sol +++ b/test/libsolidity/semanticTests/freeFunctions/free_namesake_contract_function.sol @@ -4,7 +4,5 @@ contract C { return f(); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE diff --git a/test/libsolidity/semanticTests/freeFunctions/import.sol b/test/libsolidity/semanticTests/freeFunctions/import.sol index f4ecd6bacab2..edd44de4939a 100644 --- a/test/libsolidity/semanticTests/freeFunctions/import.sol +++ b/test/libsolidity/semanticTests/freeFunctions/import.sol @@ -14,7 +14,5 @@ contract C { two = data.x; } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 7 -> 7, 8 diff --git a/test/libsolidity/semanticTests/freeFunctions/overloads.sol b/test/libsolidity/semanticTests/freeFunctions/overloads.sol index 468f75be994f..6a2da653610e 100644 --- a/test/libsolidity/semanticTests/freeFunctions/overloads.sol +++ b/test/libsolidity/semanticTests/freeFunctions/overloads.sol @@ -10,7 +10,5 @@ contract C { return (f(2), f("abc")); } } -// ==== -// compileToEwasm: also // ---- // g() -> 2, 3 diff --git a/test/libsolidity/semanticTests/freeFunctions/recursion.sol b/test/libsolidity/semanticTests/freeFunctions/recursion.sol index b6a131b63bf0..894a60f3f611 100644 --- a/test/libsolidity/semanticTests/freeFunctions/recursion.sol +++ b/test/libsolidity/semanticTests/freeFunctions/recursion.sol @@ -12,8 +12,6 @@ contract C { return exp(base, exponent); } } -// ==== -// compileToEwasm: also // ---- // g(uint256,uint256): 0, 0 -> 1 // g(uint256,uint256): 0, 1 -> 0x00 diff --git a/test/libsolidity/semanticTests/functionCall/array_multiple_local_vars.sol b/test/libsolidity/semanticTests/functionCall/array_multiple_local_vars.sol index 0605888d082b..4dbfe91f107f 100644 --- a/test/libsolidity/semanticTests/functionCall/array_multiple_local_vars.sol +++ b/test/libsolidity/semanticTests/functionCall/array_multiple_local_vars.sol @@ -22,8 +22,6 @@ contract test { return sum; } } -// ==== -// compileToEwasm: also // ---- // f(uint256[]): 32, 3, 1000, 1, 2 -> 3 // f(uint256[]): 32, 3, 100, 500, 300 -> 600 diff --git a/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_function.sol b/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_function.sol index 97bc083af99e..023133a49f32 100644 --- a/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_function.sol +++ b/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_function.sol @@ -8,8 +8,6 @@ contract C { } function t() public pure returns (uint) { return 7; } } -// ==== -// compileToEwasm: false // ---- // library: L // f() -> 7 diff --git a/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_storage_variable.sol b/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_storage_variable.sol index d8d55dc9bbec..5a599c8a5707 100644 --- a/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_storage_variable.sol +++ b/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_storage_variable.sol @@ -7,8 +7,6 @@ contract C { return (x.mul)({x: a}); } } -// ==== -// compileToEwasm: false // ---- // library: D // f(uint256): 7 -> 0x2a diff --git a/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_string.sol b/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_string.sol index d374573dc977..d2d23fb626d5 100644 --- a/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_string.sol +++ b/test/libsolidity/semanticTests/functionCall/call_attached_library_function_on_string.sol @@ -11,8 +11,6 @@ contract C { return s.length(); } } -// ==== -// compileToEwasm: false // ---- // library: D // f() -> 3 diff --git a/test/libsolidity/semanticTests/functionCall/call_function_returning_function.sol b/test/libsolidity/semanticTests/functionCall/call_function_returning_function.sol index 82c38cca5a02..a00628eaf108 100644 --- a/test/libsolidity/semanticTests/functionCall/call_function_returning_function.sol +++ b/test/libsolidity/semanticTests/functionCall/call_function_returning_function.sol @@ -21,8 +21,5 @@ contract test { return x()()()(); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/functionCall/call_function_returning_nothing_via_pointer.sol b/test/libsolidity/semanticTests/functionCall/call_function_returning_nothing_via_pointer.sol index ea5edaaef609..b43c453d2378 100644 --- a/test/libsolidity/semanticTests/functionCall/call_function_returning_nothing_via_pointer.sol +++ b/test/libsolidity/semanticTests/functionCall/call_function_returning_nothing_via_pointer.sol @@ -11,9 +11,6 @@ contract test { return flag; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true // flag() -> true diff --git a/test/libsolidity/semanticTests/functionCall/call_internal_function_via_expression.sol b/test/libsolidity/semanticTests/functionCall/call_internal_function_via_expression.sol index 043ee05a82aa..0b880bfd1b8a 100644 --- a/test/libsolidity/semanticTests/functionCall/call_internal_function_via_expression.sol +++ b/test/libsolidity/semanticTests/functionCall/call_internal_function_via_expression.sol @@ -17,8 +17,6 @@ contract C { return (get_ptr(foo))(); } } -// ==== -// compileToEwasm: also // ---- // associated() -> 42 // unassociated() -> 42 diff --git a/test/libsolidity/semanticTests/functionCall/calling_nonexisting_contract_throws.sol b/test/libsolidity/semanticTests/functionCall/calling_nonexisting_contract_throws.sol index 9753015a453d..229618384d1e 100644 --- a/test/libsolidity/semanticTests/functionCall/calling_nonexisting_contract_throws.sol +++ b/test/libsolidity/semanticTests/functionCall/calling_nonexisting_contract_throws.sol @@ -21,9 +21,6 @@ contract C { return 7; } } - -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE // g() -> FAILURE diff --git a/test/libsolidity/semanticTests/functionCall/calling_other_functions.sol b/test/libsolidity/semanticTests/functionCall/calling_other_functions.sol index 12139fc68453..9b008f12f2d9 100644 --- a/test/libsolidity/semanticTests/functionCall/calling_other_functions.sol +++ b/test/libsolidity/semanticTests/functionCall/calling_other_functions.sol @@ -12,8 +12,6 @@ contract collatz { return 3 * x + 1; } } -// ==== -// compileToEwasm: also // ---- // run(uint256): 0 -> 0 // run(uint256): 1 -> 1 diff --git a/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function.sol b/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function.sol index 2f660c24c8ac..701b1f51a3d4 100644 --- a/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function.sol +++ b/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function.sol @@ -11,8 +11,6 @@ contract C { return 7; } } -// ==== -// compileToEwasm: also // ---- // intern() -> FAILURE, hex"4e487b71", 0x51 # This should throw exceptions # // extern() -> FAILURE diff --git a/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_in_detail.sol b/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_in_detail.sol index a7295928aa8f..aa455afcf885 100644 --- a/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_in_detail.sol +++ b/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_in_detail.sol @@ -15,8 +15,5 @@ contract C { return 2; } } - -// ==== -// compileToEwasm: also // ---- // t() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_through_array.sol b/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_through_array.sol index f7d90c8f2dec..d83fab85222c 100644 --- a/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_through_array.sol +++ b/test/libsolidity/semanticTests/functionCall/calling_uninitialized_function_through_array.sol @@ -15,7 +15,5 @@ contract C { return 2; } } -// ==== -// compileToEwasm: also // ---- // t() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/functionCall/conditional_with_arguments.sol b/test/libsolidity/semanticTests/functionCall/conditional_with_arguments.sol index 65dbeaaeecf5..f5996d32ca9d 100644 --- a/test/libsolidity/semanticTests/functionCall/conditional_with_arguments.sol +++ b/test/libsolidity/semanticTests/functionCall/conditional_with_arguments.sol @@ -6,7 +6,5 @@ contract C { return (false ? g : h)(2, 1); } } -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/functionCall/disordered_named_args.sol b/test/libsolidity/semanticTests/functionCall/disordered_named_args.sol index 5529b90a013a..f15d2201da31 100644 --- a/test/libsolidity/semanticTests/functionCall/disordered_named_args.sol +++ b/test/libsolidity/semanticTests/functionCall/disordered_named_args.sol @@ -2,7 +2,5 @@ contract test { function a(uint a, uint b, uint c) public returns (uint r) { r = a * 100 + b * 10 + c * 1; } function b() public returns (uint r) { r = a({c: 3, a: 1, b: 2}); } } -// ==== -// compileToEwasm: also // ---- // b() -> 123 diff --git a/test/libsolidity/semanticTests/functionCall/external_call.sol b/test/libsolidity/semanticTests/functionCall/external_call.sol index 48dddecec886..9189d5cc7872 100644 --- a/test/libsolidity/semanticTests/functionCall/external_call.sol +++ b/test/libsolidity/semanticTests/functionCall/external_call.sol @@ -9,7 +9,6 @@ contract C { return this.g(2 * n); } } - // ---- // g(uint256): 4 -> 5 // f(uint256): 2 -> 5 diff --git a/test/libsolidity/semanticTests/functionCall/external_call_at_construction_time.sol b/test/libsolidity/semanticTests/functionCall/external_call_at_construction_time.sol index 69a2193a3018..6f7f020fe678 100644 --- a/test/libsolidity/semanticTests/functionCall/external_call_at_construction_time.sol +++ b/test/libsolidity/semanticTests/functionCall/external_call_at_construction_time.sol @@ -16,7 +16,6 @@ contract C { return 1 + c; } } - // ==== // EVMVersion: >=byzantium // ---- diff --git a/test/libsolidity/semanticTests/functionCall/external_call_dynamic_returndata.sol b/test/libsolidity/semanticTests/functionCall/external_call_dynamic_returndata.sol index 56a2876ed4ef..80ca6cc41e61 100644 --- a/test/libsolidity/semanticTests/functionCall/external_call_dynamic_returndata.sol +++ b/test/libsolidity/semanticTests/functionCall/external_call_dynamic_returndata.sol @@ -16,7 +16,6 @@ contract C { return sum; } } - // ==== // EVMVersion: >=byzantium // ---- diff --git a/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting.sol b/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting.sol index e8efe09fad0d..86d3dcc8f252 100644 --- a/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting.sol +++ b/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting.sol @@ -20,7 +20,6 @@ contract C { return 1 + c; } } - // ---- // constructor(), 1 ether -> // gas irOptimized: 265110 diff --git a/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting_debugstrings.sol b/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting_debugstrings.sol index 8fe807e638fe..96f097ce7f4a 100644 --- a/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting_debugstrings.sol +++ b/test/libsolidity/semanticTests/functionCall/external_call_to_nonexisting_debugstrings.sol @@ -20,7 +20,6 @@ contract C { return 1 + c; } } - // ==== // EVMVersion: >=byzantium // revertStrings: debug diff --git a/test/libsolidity/semanticTests/functionCall/external_call_value.sol b/test/libsolidity/semanticTests/functionCall/external_call_value.sol index 5a946533d51d..9639c1119a4d 100644 --- a/test/libsolidity/semanticTests/functionCall/external_call_value.sol +++ b/test/libsolidity/semanticTests/functionCall/external_call_value.sol @@ -9,7 +9,6 @@ contract C { return this.g{value: 10}(n); } } - // ---- // g(uint256), 1 ether: 4 -> 1000000000000000000000, 4 // f(uint256), 11 ether: 2 -> 10000, 2 diff --git a/test/libsolidity/semanticTests/functionCall/external_function.sol b/test/libsolidity/semanticTests/functionCall/external_function.sol index d6c13a4ef22a..284bad09885d 100644 --- a/test/libsolidity/semanticTests/functionCall/external_function.sol +++ b/test/libsolidity/semanticTests/functionCall/external_function.sol @@ -11,8 +11,5 @@ contract c { r_b = b; } } - -// ==== -// compileToEwasm: also // ---- // test(uint256,uint256): 2, 3 -> 9, 3 diff --git a/test/libsolidity/semanticTests/functionCall/external_public_override.sol b/test/libsolidity/semanticTests/functionCall/external_public_override.sol index 31f47420562f..8e34a5b22362 100644 --- a/test/libsolidity/semanticTests/functionCall/external_public_override.sol +++ b/test/libsolidity/semanticTests/functionCall/external_public_override.sol @@ -14,9 +14,6 @@ contract B is A { return f(); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 2 // g() -> 2 diff --git a/test/libsolidity/semanticTests/functionCall/file_level_call_via_module.sol b/test/libsolidity/semanticTests/functionCall/file_level_call_via_module.sol index 7db64dafcac9..7013a63527e9 100644 --- a/test/libsolidity/semanticTests/functionCall/file_level_call_via_module.sol +++ b/test/libsolidity/semanticTests/functionCall/file_level_call_via_module.sol @@ -9,7 +9,5 @@ contract C { } } -// ==== -// compileToEwasm: also // ---- // f() -> 7, 3 diff --git a/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol b/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol index abff2c9e7ec6..9c73e208e73e 100644 --- a/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol +++ b/test/libsolidity/semanticTests/functionCall/gas_and_value_basic.sol @@ -36,7 +36,6 @@ contract test { myBal = address(this).balance; } } - // ---- // constructor(), 20 wei -> // gas irOptimized: 260052 diff --git a/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol b/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol index dd7487cdfdef..801b22d1772a 100644 --- a/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol +++ b/test/libsolidity/semanticTests/functionCall/gas_and_value_brace_syntax.sol @@ -35,7 +35,6 @@ contract test { myBal = address(this).balance; } } - // ---- // constructor(), 20 wei -> // gas irOptimized: 260052 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/base_base_overload.sol b/test/libsolidity/semanticTests/functionCall/inheritance/base_base_overload.sol index 749e7c01bd03..adf1200eedec 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/base_base_overload.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/base_base_overload.sol @@ -34,8 +34,6 @@ contract Child is Base { BaseBase.init(c, d); } } -// ==== -// compileToEwasm: also // ---- // x() -> 0 // y() -> 0 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/base_overload.sol b/test/libsolidity/semanticTests/functionCall/inheritance/base_overload.sol index fa65755b850c..924431ec53f5 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/base_overload.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/base_overload.sol @@ -18,8 +18,6 @@ contract Child is Base { Base.init(c, d); } } -// ==== -// compileToEwasm: also // ---- // x() -> 0 // y() -> 0 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/call_base.sol b/test/libsolidity/semanticTests/functionCall/inheritance/call_base.sol index 85302de766f2..8f0e93ddbeb5 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/call_base.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/call_base.sol @@ -9,7 +9,5 @@ contract Child is Base { return f(n); } } -// ==== -// compileToEwasm: also // ---- // g(uint256): 4 -> 8 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base.sol b/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base.sol index 70ec4fd72901..8578a6707acc 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base.sol @@ -22,8 +22,6 @@ contract Child is Base { return s(n); } } -// ==== -// compileToEwasm: also // ---- // g(uint256): 4 -> 12 // h(uint256): 4 -> 16 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base_explicit.sol b/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base_explicit.sol index 169e1a6ba7bc..f327b3f28e3a 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base_explicit.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/call_base_base_explicit.sol @@ -25,8 +25,6 @@ contract Child is Base { return BaseBase.s(n); } } -// ==== -// compileToEwasm: also // ---- // g(uint256): 4 -> 8 // k(uint256): 4 -> 16 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/call_base_explicit.sol b/test/libsolidity/semanticTests/functionCall/inheritance/call_base_explicit.sol index 7ff1eae99adb..0a0cf465f03d 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/call_base_explicit.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/call_base_explicit.sol @@ -9,7 +9,5 @@ contract Child is Base { return Base.f(n); } } -// ==== -// compileToEwasm: also // ---- // g(uint256): 4 -> 8 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/call_unimplemented_base.sol b/test/libsolidity/semanticTests/functionCall/inheritance/call_unimplemented_base.sol index 61b428303bd7..21ab22e0bc63 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/call_unimplemented_base.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/call_unimplemented_base.sol @@ -14,7 +14,5 @@ contract C is V { function a() internal view override returns (uint256) { return 42; } } -// ==== -// compileToEwasm: also // ---- // b() -> 42 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_abstract_contract.sol b/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_abstract_contract.sol index 7dc726be2a62..20774d692668 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_abstract_contract.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_abstract_contract.sol @@ -15,7 +15,5 @@ contract B is A, I { return super.f(); } } -// ==== -// compileToEwasm: also // ---- // f() -> 42 diff --git a/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_interface.sol b/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_interface.sol index 218d1bca8edb..f5f0561334fe 100644 --- a/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_interface.sol +++ b/test/libsolidity/semanticTests/functionCall/inheritance/super_skip_unimplemented_in_interface.sol @@ -15,7 +15,5 @@ contract B is A, I { return super.f(); } } -// ==== -// compileToEwasm: also // ---- // f() -> 42 diff --git a/test/libsolidity/semanticTests/functionCall/member_accessors.sol b/test/libsolidity/semanticTests/functionCall/member_accessors.sol index ad0b8a3e2e48..ae5eab6d11b3 100644 --- a/test/libsolidity/semanticTests/functionCall/member_accessors.sol +++ b/test/libsolidity/semanticTests/functionCall/member_accessors.sol @@ -14,7 +14,6 @@ contract test { } // ==== // allowNonExistingFunctions: true -// compileToEwasm: also // ---- // data() -> 8 // name() -> "Celina" diff --git a/test/libsolidity/semanticTests/functionCall/multiple_functions.sol b/test/libsolidity/semanticTests/functionCall/multiple_functions.sol index 63fac55e0924..3c60a13f11cf 100644 --- a/test/libsolidity/semanticTests/functionCall/multiple_functions.sol +++ b/test/libsolidity/semanticTests/functionCall/multiple_functions.sol @@ -6,7 +6,6 @@ contract test { } // ==== // allowNonExistingFunctions: true -// compileToEwasm: also // ---- // a() -> 0 // b() -> 1 diff --git a/test/libsolidity/semanticTests/functionCall/multiple_return_values.sol b/test/libsolidity/semanticTests/functionCall/multiple_return_values.sol index ef746eb032bf..cb2a8a0c0395 100644 --- a/test/libsolidity/semanticTests/functionCall/multiple_return_values.sol +++ b/test/libsolidity/semanticTests/functionCall/multiple_return_values.sol @@ -3,7 +3,5 @@ contract test { y1 = x2; y2 = x1; } } -// ==== -// compileToEwasm: also // ---- // run(bool,uint256): true, 0xcd -> 0xcd, true, 0 diff --git a/test/libsolidity/semanticTests/functionCall/named_args.sol b/test/libsolidity/semanticTests/functionCall/named_args.sol index 4966f51860fe..706f6d94dc6a 100644 --- a/test/libsolidity/semanticTests/functionCall/named_args.sol +++ b/test/libsolidity/semanticTests/functionCall/named_args.sol @@ -3,8 +3,6 @@ contract test { function b() public returns (uint r) { r = a({a: 1, b: 2, c: 3}); } function c() public returns (uint r) { r = a({b: 2, c: 3, a: 1}); } } -// ==== -// compileToEwasm: also // ---- // b() -> 123 // c() -> 123 diff --git a/test/libsolidity/semanticTests/functionCall/named_args_overload.sol b/test/libsolidity/semanticTests/functionCall/named_args_overload.sol index 0c31e47c5030..65f34d8ff6d7 100644 --- a/test/libsolidity/semanticTests/functionCall/named_args_overload.sol +++ b/test/libsolidity/semanticTests/functionCall/named_args_overload.sol @@ -26,8 +26,6 @@ contract C { return 500; } } -// ==== -// compileToEwasm: also // ---- // call(uint256): 0 -> 0 // call(uint256): 1 -> 1 diff --git a/test/libsolidity/semanticTests/functionCall/send_zero_ether.sol b/test/libsolidity/semanticTests/functionCall/send_zero_ether.sol index b78951c41abe..18a19979295b 100644 --- a/test/libsolidity/semanticTests/functionCall/send_zero_ether.sol +++ b/test/libsolidity/semanticTests/functionCall/send_zero_ether.sol @@ -13,9 +13,6 @@ contract Main { return payable(r).send(0); } } - -// ==== -// compileToEwasm: also // ---- // constructor(), 20 wei -> // gas irOptimized: 100264 diff --git a/test/libsolidity/semanticTests/functionCall/transaction_status.sol b/test/libsolidity/semanticTests/functionCall/transaction_status.sol index 309cb8ef1845..caa538deec4b 100644 --- a/test/libsolidity/semanticTests/functionCall/transaction_status.sol +++ b/test/libsolidity/semanticTests/functionCall/transaction_status.sol @@ -3,8 +3,6 @@ contract test { function g() public { revert(); } function h() public { assert(false); } } -// ==== -// compileToEwasm: also // ---- // f() -> // g() -> FAILURE diff --git a/test/libsolidity/semanticTests/functionCall/value_test.sol b/test/libsolidity/semanticTests/functionCall/value_test.sol index c15e6332f1ec..a6fea6a50b50 100644 --- a/test/libsolidity/semanticTests/functionCall/value_test.sol +++ b/test/libsolidity/semanticTests/functionCall/value_test.sol @@ -3,8 +3,6 @@ contract C { return msg.value; } } -// ==== -// compileToEwasm: also // ---- // f(), 1 ether -> 1000000000000000000 // f(), 1 wei -> 1 diff --git a/test/libsolidity/semanticTests/functionSelector/function_selector_via_contract_name.sol b/test/libsolidity/semanticTests/functionSelector/function_selector_via_contract_name.sol index 5052ad2b400a..0a9e6d3ffd14 100644 --- a/test/libsolidity/semanticTests/functionSelector/function_selector_via_contract_name.sol +++ b/test/libsolidity/semanticTests/functionSelector/function_selector_via_contract_name.sol @@ -15,8 +15,6 @@ contract C { return (a.f.selector, a.g.selector, b.f.selector, b.g.selector); } } -// ==== -// compileToEwasm: also // ---- // test1() -> left(0x26121ff0), left(0xe420264a), left(0x26121ff0), left(0xe420264a) // test2() -> left(0x26121ff0), left(0xe420264a), left(0x26121ff0), left(0xe420264a) diff --git a/test/libsolidity/semanticTests/functionTypes/address_member.sol b/test/libsolidity/semanticTests/functionTypes/address_member.sol index c407a3ab6337..a5f56f3dc688 100644 --- a/test/libsolidity/semanticTests/functionTypes/address_member.sol +++ b/test/libsolidity/semanticTests/functionTypes/address_member.sol @@ -6,7 +6,5 @@ contract C { a2 = [this.f.address][0]; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0xc06afe3a8444fc0004668591e8306bfb9968e79e, 0xc06afe3a8444fc0004668591e8306bfb9968e79e diff --git a/test/libsolidity/semanticTests/functionTypes/function_delete_stack.sol b/test/libsolidity/semanticTests/functionTypes/function_delete_stack.sol index 409bb809eb47..67a4434dfe00 100644 --- a/test/libsolidity/semanticTests/functionTypes/function_delete_stack.sol +++ b/test/libsolidity/semanticTests/functionTypes/function_delete_stack.sol @@ -9,8 +9,5 @@ contract C { y(); } } - -// ==== -// compileToEwasm: also // ---- // test() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/functionTypes/function_delete_storage.sol b/test/libsolidity/semanticTests/functionTypes/function_delete_storage.sol index 4cf8be204029..a147b4e02587 100644 --- a/test/libsolidity/semanticTests/functionTypes/function_delete_storage.sol +++ b/test/libsolidity/semanticTests/functionTypes/function_delete_storage.sol @@ -19,9 +19,6 @@ contract C { return y(); } } - -// ==== -// compileToEwasm: also // ---- // set() -> 7 // ca() -> 7 diff --git a/test/libsolidity/semanticTests/functionTypes/function_type_library_internal.sol b/test/libsolidity/semanticTests/functionTypes/function_type_library_internal.sol index f096a4979444..587daac97894 100644 --- a/test/libsolidity/semanticTests/functionTypes/function_type_library_internal.sol +++ b/test/libsolidity/semanticTests/functionTypes/function_type_library_internal.sol @@ -21,6 +21,5 @@ contract C { return Utils.reduce(x, Utils.sum, 0); } } - // ---- // f(uint256[]): 0x20, 0x3, 0x1, 0x7, 0x3 -> 11 diff --git a/test/libsolidity/semanticTests/functionTypes/mapping_of_functions.sol b/test/libsolidity/semanticTests/functionTypes/mapping_of_functions.sol index 353844723c23..f9cd863baa7b 100644 --- a/test/libsolidity/semanticTests/functionTypes/mapping_of_functions.sol +++ b/test/libsolidity/semanticTests/functionTypes/mapping_of_functions.sol @@ -24,7 +24,6 @@ contract Flow { return 7; } } - // ---- // success() -> false // f() -> 7 diff --git a/test/libsolidity/semanticTests/functionTypes/pass_function_types_externally.sol b/test/libsolidity/semanticTests/functionTypes/pass_function_types_externally.sol index ebef9a2549a8..3f14eb594af5 100644 --- a/test/libsolidity/semanticTests/functionTypes/pass_function_types_externally.sol +++ b/test/libsolidity/semanticTests/functionTypes/pass_function_types_externally.sol @@ -15,7 +15,6 @@ contract C { return x + 1; } } - // ---- // f(uint256): 7 -> 8 // f2(uint256): 7 -> 8 diff --git a/test/libsolidity/semanticTests/functionTypes/pass_function_types_internally.sol b/test/libsolidity/semanticTests/functionTypes/pass_function_types_internally.sol index a2bab4051488..0acbcc5858d9 100644 --- a/test/libsolidity/semanticTests/functionTypes/pass_function_types_internally.sol +++ b/test/libsolidity/semanticTests/functionTypes/pass_function_types_internally.sol @@ -11,7 +11,5 @@ contract C { return x + 1; } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 7 -> 8 diff --git a/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime.sol b/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime.sol index 675c2d08b078..84f6fad1c098 100644 --- a/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime.sol +++ b/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime.sol @@ -13,8 +13,6 @@ contract C { return double(_arg); } } -// ==== -// compileToEwasm: also // ---- // runtime(uint256): 3 -> 6 // initial() -> 4 diff --git a/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime_equality_check.sol b/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime_equality_check.sol index d32db4d90882..b5b24954c9f6 100644 --- a/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime_equality_check.sol +++ b/test/libsolidity/semanticTests/functionTypes/same_function_in_construction_and_runtime_equality_check.sol @@ -13,8 +13,5 @@ contract C { _ret = _arg * 2; } } - -// ==== -// compileToEwasm: also // ---- // test() -> true diff --git a/test/libsolidity/semanticTests/functionTypes/selector_1.sol b/test/libsolidity/semanticTests/functionTypes/selector_1.sol index 3d49e5b42768..397655dae54c 100644 --- a/test/libsolidity/semanticTests/functionTypes/selector_1.sol +++ b/test/libsolidity/semanticTests/functionTypes/selector_1.sol @@ -10,6 +10,5 @@ contract C is B { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // test() -> 0xcf9f23b500000000000000000000000000000000000000000000000000000000, 0x7defb41000000000000000000000000000000000000000000000000000000000, 0xcf9f23b500000000000000000000000000000000000000000000000000000000, 0x7defb41000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/functionTypes/selector_2.sol b/test/libsolidity/semanticTests/functionTypes/selector_2.sol index 46de760551c9..248e446736bc 100644 --- a/test/libsolidity/semanticTests/functionTypes/selector_2.sol +++ b/test/libsolidity/semanticTests/functionTypes/selector_2.sol @@ -10,6 +10,5 @@ contract D { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // test() -> 0xcf9f23b500000000000000000000000000000000000000000000000000000000, 0x7defb41000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/functionTypes/store_function.sol b/test/libsolidity/semanticTests/functionTypes/store_function.sol index b1d0fc0c3bca..132a6c95659a 100644 --- a/test/libsolidity/semanticTests/functionTypes/store_function.sol +++ b/test/libsolidity/semanticTests/functionTypes/store_function.sol @@ -23,7 +23,6 @@ contract C { return ev(x); } } - // ---- // t() -> 9 // gas irOptimized: 99064 diff --git a/test/libsolidity/semanticTests/functionTypes/struct_with_external_function.sol b/test/libsolidity/semanticTests/functionTypes/struct_with_external_function.sol index 9c7684245ed4..3de9cfa8763b 100644 --- a/test/libsolidity/semanticTests/functionTypes/struct_with_external_function.sol +++ b/test/libsolidity/semanticTests/functionTypes/struct_with_external_function.sol @@ -27,6 +27,5 @@ contract Flow { return (t[0].x(), t[1].x()); } } - // ---- // f() -> 1, 2 diff --git a/test/libsolidity/semanticTests/functionTypes/struct_with_functions.sol b/test/libsolidity/semanticTests/functionTypes/struct_with_functions.sol index 1ecd9eaf514b..fae91862957a 100644 --- a/test/libsolidity/semanticTests/functionTypes/struct_with_functions.sol +++ b/test/libsolidity/semanticTests/functionTypes/struct_with_functions.sol @@ -27,8 +27,5 @@ contract Flow { return (t[0].x(), t[1].x()); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 1, 2 diff --git a/test/libsolidity/semanticTests/functionTypes/uninitialized_internal_storage_function_call.sol b/test/libsolidity/semanticTests/functionTypes/uninitialized_internal_storage_function_call.sol index fb34698bb8f5..b55de08758b8 100644 --- a/test/libsolidity/semanticTests/functionTypes/uninitialized_internal_storage_function_call.sol +++ b/test/libsolidity/semanticTests/functionTypes/uninitialized_internal_storage_function_call.sol @@ -6,8 +6,5 @@ contract Test { return 2; } } - -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/getters/bytes.sol b/test/libsolidity/semanticTests/getters/bytes.sol index 24f384fa5cc6..c22403c7792a 100644 --- a/test/libsolidity/semanticTests/getters/bytes.sol +++ b/test/libsolidity/semanticTests/getters/bytes.sol @@ -4,7 +4,5 @@ contract C { b = "abc"; } } -// ==== -// compileToEwasm: also // ---- // b() -> 0x20, 0x03, 0x6162630000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/getters/string_and_bytes.sol b/test/libsolidity/semanticTests/getters/string_and_bytes.sol index 9452ff97cd39..f9cf7316f866 100644 --- a/test/libsolidity/semanticTests/getters/string_and_bytes.sol +++ b/test/libsolidity/semanticTests/getters/string_and_bytes.sol @@ -9,8 +9,6 @@ contract C { c = hex"ff077fff"; } } -// ==== -// compileToEwasm: also // ---- // a() -> 0x20, 11, "hello world" // b() -> 0x20, 4, "ABCD" diff --git a/test/libsolidity/semanticTests/getters/value_types.sol b/test/libsolidity/semanticTests/getters/value_types.sol index 3d590ded1619..a8a8759e3e33 100644 --- a/test/libsolidity/semanticTests/getters/value_types.sol +++ b/test/libsolidity/semanticTests/getters/value_types.sol @@ -20,8 +20,6 @@ contract C { i = address(type(uint160).max / 3); } } -// ==== -// compileToEwasm: also // ---- // a() -> 3 // b() -> 4 diff --git a/test/libsolidity/semanticTests/inheritance/access_base_storage.sol b/test/libsolidity/semanticTests/inheritance/access_base_storage.sol index 4b11c3598ac6..034e7c1d34c5 100644 --- a/test/libsolidity/semanticTests/inheritance/access_base_storage.sol +++ b/test/libsolidity/semanticTests/inheritance/access_base_storage.sol @@ -21,9 +21,6 @@ contract Derived is Base { derived = dataDerived; } } - -// ==== -// compileToEwasm: also // ---- // setData(uint256,uint256): 1, 2 -> true // getViaBase() -> 1 diff --git a/test/libsolidity/semanticTests/inheritance/address_overload_resolution.sol b/test/libsolidity/semanticTests/inheritance/address_overload_resolution.sol index aa9dc4b9924e..c65d1abec558 100644 --- a/test/libsolidity/semanticTests/inheritance/address_overload_resolution.sol +++ b/test/libsolidity/semanticTests/inheritance/address_overload_resolution.sol @@ -18,7 +18,6 @@ contract D { return (new C()).transfer(5); } } - // ---- // f() -> 1 // gas irOptimized: 77051 diff --git a/test/libsolidity/semanticTests/inheritance/base_access_to_function_type_variables.sol b/test/libsolidity/semanticTests/inheritance/base_access_to_function_type_variables.sol index 7b5e856d34d8..9cff3c728d5c 100644 --- a/test/libsolidity/semanticTests/inheritance/base_access_to_function_type_variables.sol +++ b/test/libsolidity/semanticTests/inheritance/base_access_to_function_type_variables.sol @@ -13,9 +13,6 @@ contract C { return C.x(); } } - -// ==== -// compileToEwasm: also // ---- // g() -> 2 // h() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_direct.sol b/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_direct.sol index 87571f2d022e..02e20c49d6af 100644 --- a/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_direct.sol +++ b/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_direct.sol @@ -14,8 +14,5 @@ contract C is B { return f(1); } } - -// ==== -// compileToEwasm: also // ---- // g() -> 2 diff --git a/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_indirect.sol b/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_indirect.sol index 23f01e419552..5976fee6fefc 100644 --- a/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_indirect.sol +++ b/test/libsolidity/semanticTests/inheritance/derived_overload_base_function_indirect.sol @@ -21,9 +21,6 @@ contract C is A, B { return f(1); } } - -// ==== -// compileToEwasm: also // ---- // g() -> 10 // h() -> 2 diff --git a/test/libsolidity/semanticTests/inheritance/explicit_base_class.sol b/test/libsolidity/semanticTests/inheritance/explicit_base_class.sol index 4c5468f03837..78f1f186356c 100644 --- a/test/libsolidity/semanticTests/inheritance/explicit_base_class.sol +++ b/test/libsolidity/semanticTests/inheritance/explicit_base_class.sol @@ -21,8 +21,6 @@ contract Derived is Base { return 3; } } -// ==== -// compileToEwasm: also // ---- // g() -> 3 // f() -> 1 diff --git a/test/libsolidity/semanticTests/inheritance/inherited_constant_state_var.sol b/test/libsolidity/semanticTests/inheritance/inherited_constant_state_var.sol index 256367df453b..70674a6c78bf 100644 --- a/test/libsolidity/semanticTests/inheritance/inherited_constant_state_var.sol +++ b/test/libsolidity/semanticTests/inheritance/inherited_constant_state_var.sol @@ -8,8 +8,5 @@ contract B is A { return A.x; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 7 diff --git a/test/libsolidity/semanticTests/inheritance/inherited_function.sol b/test/libsolidity/semanticTests/inheritance/inherited_function.sol index 471fe7943ef1..fb3f8ee8f032 100644 --- a/test/libsolidity/semanticTests/inheritance/inherited_function.sol +++ b/test/libsolidity/semanticTests/inheritance/inherited_function.sol @@ -14,7 +14,5 @@ contract B is A { return A.f(); } } -// ==== -// compileToEwasm: also // ---- // g() -> 1 diff --git a/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_calldata_interface.sol b/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_calldata_interface.sol index 0663ddf4cc24..3114c80f1912 100644 --- a/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_calldata_interface.sol +++ b/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_calldata_interface.sol @@ -20,7 +20,6 @@ contract B { return i.f(new uint256[](2)); } } - // ---- // g() -> 42 // gas irOptimized: 80813 diff --git a/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_memory_interface.sol b/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_memory_interface.sol index e9339e66414c..74bf42ec7e61 100644 --- a/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_memory_interface.sol +++ b/test/libsolidity/semanticTests/inheritance/inherited_function_calldata_memory_interface.sol @@ -20,7 +20,6 @@ contract B { return i.f(new uint256[](2)); } } - // ---- // g() -> 42 // gas irOptimized: 100282 diff --git a/test/libsolidity/semanticTests/inheritance/inherited_function_from_a_library.sol b/test/libsolidity/semanticTests/inheritance/inherited_function_from_a_library.sol index 42d4f711c9b9..1b1092cba953 100644 --- a/test/libsolidity/semanticTests/inheritance/inherited_function_from_a_library.sol +++ b/test/libsolidity/semanticTests/inheritance/inherited_function_from_a_library.sol @@ -14,6 +14,5 @@ contract B { return A.f(); } } - // ---- // g() -> 1 diff --git a/test/libsolidity/semanticTests/inheritance/inherited_function_through_dispatch.sol b/test/libsolidity/semanticTests/inheritance/inherited_function_through_dispatch.sol index e304fc2817b5..39683079a4b5 100644 --- a/test/libsolidity/semanticTests/inheritance/inherited_function_through_dispatch.sol +++ b/test/libsolidity/semanticTests/inheritance/inherited_function_through_dispatch.sol @@ -15,7 +15,5 @@ contract B is A { return ptr(); } } -// ==== -// compileToEwasm: also // ---- // g() -> 1 diff --git a/test/libsolidity/semanticTests/inheritance/member_notation_ctor.sol b/test/libsolidity/semanticTests/inheritance/member_notation_ctor.sol index c0eef13c4b9b..33392e8d48c6 100644 --- a/test/libsolidity/semanticTests/inheritance/member_notation_ctor.sol +++ b/test/libsolidity/semanticTests/inheritance/member_notation_ctor.sol @@ -17,7 +17,6 @@ contract A { return d.getX(); } } - // ---- // g(int256): -1 -> -1 // gas legacy: 102086 diff --git a/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_first.sol b/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_first.sol index b54f9bc27e3a..d31dba485ac1 100644 --- a/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_first.sol +++ b/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_first.sol @@ -11,8 +11,5 @@ contract test { return f(3); } } - -// ==== -// compileToEwasm: also // ---- // g() -> 3 diff --git a/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_second.sol b/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_second.sol index 5479960ac079..c1f816c1f91d 100644 --- a/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_second.sol +++ b/test/libsolidity/semanticTests/inheritance/overloaded_function_call_resolve_to_second.sol @@ -11,8 +11,5 @@ contract test { return f(3, 7); } } - -// ==== -// compileToEwasm: also // ---- // g() -> 10 diff --git a/test/libsolidity/semanticTests/inheritance/overloaded_function_call_with_if_else.sol b/test/libsolidity/semanticTests/inheritance/overloaded_function_call_with_if_else.sol index 70be159e8829..c0ff8fd58062 100644 --- a/test/libsolidity/semanticTests/inheritance/overloaded_function_call_with_if_else.sol +++ b/test/libsolidity/semanticTests/inheritance/overloaded_function_call_with_if_else.sol @@ -12,9 +12,6 @@ contract test { else return f(3, 7); } } - -// ==== -// compileToEwasm: also // ---- // g(bool): true -> 3 // g(bool): false -> 10 diff --git a/test/libsolidity/semanticTests/inheritance/super_in_constructor.sol b/test/libsolidity/semanticTests/inheritance/super_in_constructor.sol index c4b6774538c5..7e0aa51d201c 100644 --- a/test/libsolidity/semanticTests/inheritance/super_in_constructor.sol +++ b/test/libsolidity/semanticTests/inheritance/super_in_constructor.sol @@ -30,7 +30,5 @@ contract D is B, C { return data; } } -// ==== -// compileToEwasm: also // ---- // f() -> 15 diff --git a/test/libsolidity/semanticTests/inheritance/super_in_constructor_assignment.sol b/test/libsolidity/semanticTests/inheritance/super_in_constructor_assignment.sol index 47978ddbc761..6b06a784bcef 100644 --- a/test/libsolidity/semanticTests/inheritance/super_in_constructor_assignment.sol +++ b/test/libsolidity/semanticTests/inheritance/super_in_constructor_assignment.sol @@ -33,7 +33,5 @@ contract D is B, C { return data; } } -// ==== -// compileToEwasm: also // ---- // f() -> 15 diff --git a/test/libsolidity/semanticTests/inheritance/super_overload.sol b/test/libsolidity/semanticTests/inheritance/super_overload.sol index 1bb36ca2abf5..7b0b1448f0db 100644 --- a/test/libsolidity/semanticTests/inheritance/super_overload.sol +++ b/test/libsolidity/semanticTests/inheritance/super_overload.sol @@ -21,9 +21,6 @@ contract C is A, B { return super.f(1); } } - -// ==== -// compileToEwasm: also // ---- // g() -> 10 // h() -> 2 diff --git a/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol b/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol index dce48fa28cd3..5390f64db082 100644 --- a/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol +++ b/test/libsolidity/semanticTests/inheritance/value_for_constructor.sol @@ -37,7 +37,6 @@ contract Main { them = address(h).balance; } } - // ---- // constructor(), 22 wei -> // gas irOptimized: 266886 diff --git a/test/libsolidity/semanticTests/inlineAssembly/calldata_array_read.sol b/test/libsolidity/semanticTests/inlineAssembly/calldata_array_read.sol index 21b52f84eadd..572e9def0ce2 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/calldata_array_read.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/calldata_array_read.sol @@ -6,7 +6,5 @@ contract C { assembly { s := t } } } -// ==== -// compileToEwasm: also // ---- // f(uint256[2][]): 0x20, 2, 1, 2, 3, 4 -> 0x44, 2, 0x84 diff --git a/test/libsolidity/semanticTests/inlineAssembly/calldata_length_read.sol b/test/libsolidity/semanticTests/inlineAssembly/calldata_length_read.sol index 04ec0b614f44..d3574806a239 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/calldata_length_read.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/calldata_length_read.sol @@ -7,8 +7,6 @@ contract C { assembly { l := x.length } } } -// ==== -// compileToEwasm: also // ---- // lenBytesRead(bytes): 0x20, 4, "abcd" -> 4 // lenBytesRead(bytes): 0x20, 0, "abcd" -> 0x00 diff --git a/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read.sol b/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read.sol index a9b82d11e05d..0b10748c50cf 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read.sol @@ -10,8 +10,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f(bytes): 0x20, 0, 0 -> 0x44 // f(bytes): 0x22, 0, 0, 0 -> 0x46 diff --git a/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read_write.sol b/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read_write.sol index 6375055fe2d6..bcba7169b0f0 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read_write.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/calldata_offset_read_write.sol @@ -10,9 +10,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,bytes,uint256): 7, 0x60, 8, 2, 0 -> 8, 0x14 // f(uint256,bytes,uint256): 0, 0, 0 -> 8, 0x14 diff --git a/test/libsolidity/semanticTests/inlineAssembly/constant_access.sol b/test/libsolidity/semanticTests/inlineAssembly/constant_access.sol index 130ebcd33d66..82badaca780b 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/constant_access.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/constant_access.sol @@ -14,7 +14,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 2, left(0xabcd), left(0x616263), true, 0x1212121212121212121212121212121212121212 diff --git a/test/libsolidity/semanticTests/inlineAssembly/constant_access_referencing.sol b/test/libsolidity/semanticTests/inlineAssembly/constant_access_referencing.sol index 91644d1ace09..d12a979c9983 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/constant_access_referencing.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/constant_access_referencing.sol @@ -22,7 +22,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 2, left(0xabcd), left(0x616263), true, 0x1212121212121212121212121212121212121212 diff --git a/test/libsolidity/semanticTests/inlineAssembly/difficulty.sol b/test/libsolidity/semanticTests/inlineAssembly/difficulty.sol index 7ae286110c50..ef531f78af6d 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/difficulty.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/difficulty.sol @@ -6,7 +6,6 @@ contract C { } } // ==== -// compileToEwasm: also // EVMVersion: 200000000 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_embedded_function_call.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_embedded_function_call.sol index 5d917437e85c..c925823d0d71 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_embedded_function_call.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_embedded_function_call.sol @@ -20,8 +20,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x1, 0x4, 0x7, 0x10 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for.sol index d074e677ff2a..848e9016c8e2 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for.sol @@ -15,9 +15,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 1 // f(uint256): 1 -> 1 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for2.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for2.sol index c4af2ea5fec3..2d8179513677 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for2.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_for2.sol @@ -20,9 +20,6 @@ contract C { c = st; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 0, 2, 0 // f(uint256): 1 -> 1, 4, 3 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call.sol index 48cceeb996c0..de198dff2e45 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call.sol @@ -14,8 +14,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 1, 2, 7 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call2.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call2.sol index caf441dd4608..d21084aa7128 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call2.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call2.sol @@ -17,8 +17,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x1, 0x2, 0x7, 0x10 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call_assignment.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call_assignment.sol index 675ec3b1d537..e2e07823c83e 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call_assignment.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_function_call_assignment.sol @@ -16,8 +16,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 1, 2, 7 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_if.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_if.sol index 852f10ac83bc..ebe50f516bb0 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_if.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_if.sol @@ -7,9 +7,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 0 // f(uint256): 1 -> 0 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_in_modifiers.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_in_modifiers.sol index f74fbbc6380e..e050d2b52220 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_in_modifiers.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_in_modifiers.sol @@ -27,9 +27,6 @@ contract C { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true // g() -> FAILURE diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_memory_access.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_memory_access.sol index 448cc3991483..1f6a50d65578 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_memory_access.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_memory_access.sol @@ -8,8 +8,5 @@ contract C { return x; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 0x20, 0x5, "12345" diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_read_and_write_stack.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_read_and_write_stack.sol index 58c77a81d59b..ae4b94ed5989 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_read_and_write_stack.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_read_and_write_stack.sol @@ -6,8 +6,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 45 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_recursion.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_recursion.sol index c3c9297bc05f..a509513199ff 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_recursion.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_recursion.sol @@ -17,9 +17,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 1 // f(uint256): 1 -> 1 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access.sol index d81bff29e1e3..254bc7473d51 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access.sol @@ -16,8 +16,6 @@ contract C { return true; } } -// ==== -// compileToEwasm: also // ---- // f() -> true // z() -> 7 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_inside_function.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_inside_function.sol index 039f133ecdca..80cd7e11ecfe 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_inside_function.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_inside_function.sol @@ -17,8 +17,6 @@ contract C { return true; } } -// ==== -// compileToEwasm: also // ---- // f() -> true // z() -> 7 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_local_var.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_local_var.sol index 5544d90efbc9..c7728068e46a 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_local_var.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_local_var.sol @@ -12,7 +12,5 @@ contract C { return a.length; } } -// ==== -// compileToEwasm: also // ---- // f() -> 7 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_via_pointer.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_via_pointer.sol index 687b1d914a86..6c382ef9e60b 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_via_pointer.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_storage_access_via_pointer.sol @@ -17,9 +17,6 @@ contract C { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true // a() -> 7 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_switch.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_switch.sol index e4d8419b48d3..615d69594b70 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_switch.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_switch.sol @@ -14,9 +14,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 0 -> 2 // f(uint256): 1 -> 8 diff --git a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_write_to_stack.sol b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_write_to_stack.sol index b181f825993e..ed20bfe2de0f 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_write_to_stack.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inline_assembly_write_to_stack.sol @@ -6,8 +6,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 7, "abcdef" diff --git a/test/libsolidity/semanticTests/inlineAssembly/inlineasm_empty_let.sol b/test/libsolidity/semanticTests/inlineAssembly/inlineasm_empty_let.sol index b9aa70aeda53..17e14e8ac08e 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/inlineasm_empty_let.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/inlineasm_empty_let.sol @@ -8,8 +8,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0, 0 diff --git a/test/libsolidity/semanticTests/inlineAssembly/keccak256_assembly.sol b/test/libsolidity/semanticTests/inlineAssembly/keccak256_assembly.sol index 741d03a8b1ce..253af98902c3 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/keccak256_assembly.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/keccak256_assembly.sol @@ -5,6 +5,5 @@ contract C { } } } - // ---- // f() -> 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 diff --git a/test/libsolidity/semanticTests/inlineAssembly/leave.sol b/test/libsolidity/semanticTests/inlineAssembly/leave.sol index 8dff599284c3..40add273e000 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/leave.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/leave.sol @@ -10,7 +10,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/inlineAssembly/prevrandao.sol b/test/libsolidity/semanticTests/inlineAssembly/prevrandao.sol index 5a3b791feb3d..8a71c8f4e68d 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/prevrandao.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/prevrandao.sol @@ -6,7 +6,6 @@ contract C { } } // ==== -// compileToEwasm: also // EVMVersion: >=paris // ---- // f() -> 0xa86c2e601b6c44eb4848f7d23d9df3113fbcac42041c49cbed5000cb4f118777 diff --git a/test/libsolidity/semanticTests/inlineAssembly/shadowing_local_function_opcode.sol b/test/libsolidity/semanticTests/inlineAssembly/shadowing_local_function_opcode.sol index ea24ec6c41e4..d7e585e33e75 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/shadowing_local_function_opcode.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/shadowing_local_function_opcode.sol @@ -7,7 +7,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // g() -> 7, 3 diff --git a/test/libsolidity/semanticTests/inlineAssembly/slot_access_via_mapping_pointer.sol b/test/libsolidity/semanticTests/inlineAssembly/slot_access_via_mapping_pointer.sol index 66f592bb67ed..e080985e36fe 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/slot_access_via_mapping_pointer.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/slot_access_via_mapping_pointer.sol @@ -25,7 +25,6 @@ contract C { } } } - // ---- // f(uint256): 0 -> 0, 0 // f(uint256): 1 -> 1, 0 diff --git a/test/libsolidity/semanticTests/inlineAssembly/truefalse.sol b/test/libsolidity/semanticTests/inlineAssembly/truefalse.sol index eb57b80926b1..4183642bb082 100644 --- a/test/libsolidity/semanticTests/inlineAssembly/truefalse.sol +++ b/test/libsolidity/semanticTests/inlineAssembly/truefalse.sol @@ -6,7 +6,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 1, 0 diff --git a/test/libsolidity/semanticTests/integer/basic.sol b/test/libsolidity/semanticTests/integer/basic.sol index b03cb20f2436..cea56cd7cbc0 100644 --- a/test/libsolidity/semanticTests/integer/basic.sol +++ b/test/libsolidity/semanticTests/integer/basic.sol @@ -18,7 +18,5 @@ contract C { return true; } } -// ==== -// compileToEwasm: also // ---- // basic() -> true diff --git a/test/libsolidity/semanticTests/integer/int.sol b/test/libsolidity/semanticTests/integer/int.sol index 770fa0be71df..d3681a0ee267 100644 --- a/test/libsolidity/semanticTests/integer/int.sol +++ b/test/libsolidity/semanticTests/integer/int.sol @@ -232,8 +232,6 @@ contract test { return true; } } -// ==== -// compileToEwasm: also // ---- // intMinA() -> true // intMinB() -> true diff --git a/test/libsolidity/semanticTests/integer/many_local_variables.sol b/test/libsolidity/semanticTests/integer/many_local_variables.sol index 0f3f0f642ee2..c43f92696898 100644 --- a/test/libsolidity/semanticTests/integer/many_local_variables.sol +++ b/test/libsolidity/semanticTests/integer/many_local_variables.sol @@ -5,7 +5,5 @@ contract test { y += b + x2; } } -// ==== -// compileToEwasm: also // ---- // run(uint256,uint256,uint256): 0x1000, 0x10000, 0x100000 -> 0x121121 diff --git a/test/libsolidity/semanticTests/integer/small_signed_types.sol b/test/libsolidity/semanticTests/integer/small_signed_types.sol index e1173b95557a..4c0311e50f92 100644 --- a/test/libsolidity/semanticTests/integer/small_signed_types.sol +++ b/test/libsolidity/semanticTests/integer/small_signed_types.sol @@ -3,7 +3,5 @@ contract test { return -int32(10) * -int64(20); } } -// ==== -// compileToEwasm: also // ---- // run() -> 200 diff --git a/test/libsolidity/semanticTests/integer/uint.sol b/test/libsolidity/semanticTests/integer/uint.sol index 2fa6028063fa..ccd32fab4119 100644 --- a/test/libsolidity/semanticTests/integer/uint.sol +++ b/test/libsolidity/semanticTests/integer/uint.sol @@ -231,8 +231,6 @@ contract test { return true; } } -// ==== -// compileToEwasm: also // ---- // uintMinA() -> true // uintMinB() -> true diff --git a/test/libsolidity/semanticTests/interfaceID/homer.sol b/test/libsolidity/semanticTests/interfaceID/homer.sol index 49b60b12f127..fbe6293ddb63 100644 --- a/test/libsolidity/semanticTests/interfaceID/homer.sol +++ b/test/libsolidity/semanticTests/interfaceID/homer.sol @@ -28,9 +28,6 @@ contract Homer is ERC165, Simpson { return "yellow"; } } - -// ==== -// compileToEwasm: also // ---- // supportsInterface(bytes4): left(0x01ffc9a0) -> false // supportsInterface(bytes4): left(0x01ffc9a7) -> true diff --git a/test/libsolidity/semanticTests/interfaceID/homer_interfaceId.sol b/test/libsolidity/semanticTests/interfaceID/homer_interfaceId.sol index 9bf0e3c59810..c66169cd3e2b 100644 --- a/test/libsolidity/semanticTests/interfaceID/homer_interfaceId.sol +++ b/test/libsolidity/semanticTests/interfaceID/homer_interfaceId.sol @@ -28,9 +28,6 @@ contract Homer is ERC165, Simpson { return "yellow"; } } - -// ==== -// compileToEwasm: also // ---- // supportsInterface(bytes4): left(0x01ffc9a0) -> false // supportsInterface(bytes4): left(0x01ffc9a7) -> true diff --git a/test/libsolidity/semanticTests/interfaceID/interfaceId_events.sol b/test/libsolidity/semanticTests/interfaceID/interfaceId_events.sol index 51d48f497ceb..9bbf11bedbe2 100644 --- a/test/libsolidity/semanticTests/interfaceID/interfaceId_events.sol +++ b/test/libsolidity/semanticTests/interfaceID/interfaceId_events.sol @@ -13,9 +13,6 @@ contract Test { bytes4 public hello_world = type(HelloWorld).interfaceId; bytes4 public hello_world_with_event = type(HelloWorldWithEvent).interfaceId; } - -// ==== -// compileToEwasm: also // ---- // hello_world() -> left(0xc6be8b58) // hello_world_with_event() -> left(0xc6be8b58) diff --git a/test/libsolidity/semanticTests/interfaceID/interfaces.sol b/test/libsolidity/semanticTests/interfaceID/interfaces.sol index 77cf83707242..f66d859ea347 100644 --- a/test/libsolidity/semanticTests/interfaceID/interfaces.sol +++ b/test/libsolidity/semanticTests/interfaceID/interfaces.sol @@ -50,9 +50,6 @@ contract Test { return type(HelloWorldDerived).interfaceId; } } - -// ==== -// compileToEwasm: also // ---- // hello() -> left(0x19ff1d21) // world() -> left(0xdf419679) diff --git a/test/libsolidity/semanticTests/interfaceID/lisa.sol b/test/libsolidity/semanticTests/interfaceID/lisa.sol index 885cf9b2463c..722502d86fa0 100644 --- a/test/libsolidity/semanticTests/interfaceID/lisa.sol +++ b/test/libsolidity/semanticTests/interfaceID/lisa.sol @@ -39,7 +39,6 @@ contract Lisa is ERC165MappingImplementation, Simpson { return "yellow"; } } - // ---- // supportsInterface(bytes4): left(0x01ffc9a0) -> false // supportsInterface(bytes4): left(0x01ffc9a7) -> true diff --git a/test/libsolidity/semanticTests/interfaceID/lisa_interfaceId.sol b/test/libsolidity/semanticTests/interfaceID/lisa_interfaceId.sol index c9a7c49050b2..457ac8856eb7 100644 --- a/test/libsolidity/semanticTests/interfaceID/lisa_interfaceId.sol +++ b/test/libsolidity/semanticTests/interfaceID/lisa_interfaceId.sol @@ -39,7 +39,6 @@ contract Lisa is ERC165MappingImplementation, Simpson { return "yellow"; } } - // ---- // supportsInterface(bytes4): left(0x01ffc9a0) -> false // supportsInterface(bytes4): left(0x01ffc9a7) -> true diff --git a/test/libsolidity/semanticTests/interface_inheritance_conversions.sol b/test/libsolidity/semanticTests/interface_inheritance_conversions.sol index 70c7fac4022c..62e1e4fba6dc 100644 --- a/test/libsolidity/semanticTests/interface_inheritance_conversions.sol +++ b/test/libsolidity/semanticTests/interface_inheritance_conversions.sol @@ -32,7 +32,6 @@ contract C { return (sb.parentFun(), sb.subBFun()); } } - // ---- // convertParent() -> 1 // gas irOptimized: 85524 diff --git a/test/libsolidity/semanticTests/isoltestFormatting.sol b/test/libsolidity/semanticTests/isoltestFormatting.sol index 88ec15f57250..9380dc01588e 100644 --- a/test/libsolidity/semanticTests/isoltestFormatting.sol +++ b/test/libsolidity/semanticTests/isoltestFormatting.sol @@ -8,8 +8,6 @@ contract C { return a; } } -// ==== -// compileToEwasm: also // ---- // f() -> 4, 11, 0x0111, 0x333333, 2222222222222222222 // g() -> 0x10, 0x0100, 0x0101, 0x333333, 2222222222222222222 diff --git a/test/libsolidity/semanticTests/libraries/internal_call_attached_with_parentheses.sol b/test/libsolidity/semanticTests/libraries/internal_call_attached_with_parentheses.sol index 43ce7ea66405..1fa930acc29b 100644 --- a/test/libsolidity/semanticTests/libraries/internal_call_attached_with_parentheses.sol +++ b/test/libsolidity/semanticTests/libraries/internal_call_attached_with_parentheses.sol @@ -20,6 +20,5 @@ contract C { return x.data[3]; } } - // ---- // f() -> 0x0a diff --git a/test/libsolidity/semanticTests/libraries/internal_call_unattached_with_parentheses.sol b/test/libsolidity/semanticTests/libraries/internal_call_unattached_with_parentheses.sol index 4de0f4dc969c..5a76dabdfa42 100644 --- a/test/libsolidity/semanticTests/libraries/internal_call_unattached_with_parentheses.sol +++ b/test/libsolidity/semanticTests/libraries/internal_call_unattached_with_parentheses.sol @@ -9,6 +9,5 @@ contract C { return (L.f)(); } } - // ---- // foo() -> 3 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function.sol b/test/libsolidity/semanticTests/libraries/internal_library_function.sol index a3c8a870018e..24299b6d14cd 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function.sol @@ -16,6 +16,5 @@ contract C { return x[3]; } } - // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_contract.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_contract.sol index afe9b0deb912..a4a25f51ebde 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_contract.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_contract.sol @@ -14,6 +14,5 @@ contract C { return e.foo(); } } - // ---- // test() -> 42 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_external_function_type.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_external_function_type.sol index 63ca1e0b7a96..a2473e7e79d7 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_external_function_type.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_external_function_type.sol @@ -16,6 +16,5 @@ contract C { return this.identity.double(value); } } - // ---- // test(uint256): 5 -> 10 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_interface.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_interface.sol index e00fd4612069..13228115a0e5 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_interface.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_interface.sol @@ -15,6 +15,5 @@ contract C { return I(e).foo(); } } - // ---- // test() -> 42 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type.sol index c566da79cbc9..4397711c6f52 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type.sol @@ -15,6 +15,5 @@ contract C { return identity.double(value); } } - // ---- // test(uint256): 5 -> 10 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type_named_selector.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type_named_selector.sol index d66bac750fc2..4305b6d40e11 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type_named_selector.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_internal_function_type_named_selector.sol @@ -15,6 +15,5 @@ contract C { return identity.selector(value); } } - // ---- // test(uint256): 5 -> 10 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_struct.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_struct.sol index f59ec9440dff..e9f95c0ac1d2 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_struct.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_attached_to_struct.sol @@ -21,6 +21,5 @@ contract C { return x.data[3]; } } - // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_calling_private.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_calling_private.sol index 2283c30ff5fc..5ef12f69b41f 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_calling_private.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_calling_private.sol @@ -21,6 +21,5 @@ contract C { return x[3]; } } - // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/libraries/internal_library_function_return_var_size.sol b/test/libsolidity/semanticTests/libraries/internal_library_function_return_var_size.sol index 21417b599b43..d6e0e926208b 100644 --- a/test/libsolidity/semanticTests/libraries/internal_library_function_return_var_size.sol +++ b/test/libsolidity/semanticTests/libraries/internal_library_function_return_var_size.sol @@ -21,6 +21,5 @@ contract C { return x.f()[3]; } } - // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol b/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol index 7b4e05b72e02..169f2e295b6b 100644 --- a/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol +++ b/test/libsolidity/semanticTests/libraries/internal_types_in_library.sol @@ -19,8 +19,6 @@ contract Test { b = Lib.find(data["abc"], 3); } } -// ==== -// compileToEwasm: false // ---- // library: Lib // f() -> 4, 0x11 diff --git a/test/libsolidity/semanticTests/libraries/library_call_in_homestead.sol b/test/libsolidity/semanticTests/libraries/library_call_in_homestead.sol index a49dc602ad97..44526da68a6a 100644 --- a/test/libsolidity/semanticTests/libraries/library_call_in_homestead.sol +++ b/test/libsolidity/semanticTests/libraries/library_call_in_homestead.sol @@ -6,7 +6,6 @@ contract Test { } } // ==== -// compileToEwasm: false // EVMVersion: >=homestead // ---- // library: Lib diff --git a/test/libsolidity/semanticTests/libraries/library_enum_as_an_expression.sol b/test/libsolidity/semanticTests/libraries/library_enum_as_an_expression.sol index f24d93c2d940..a385fb29a311 100644 --- a/test/libsolidity/semanticTests/libraries/library_enum_as_an_expression.sol +++ b/test/libsolidity/semanticTests/libraries/library_enum_as_an_expression.sol @@ -9,6 +9,5 @@ contract Tsra { return 1; } } - // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/libraries/library_references_preserve.sol b/test/libsolidity/semanticTests/libraries/library_references_preserve.sol index ce41e54e98cb..41c16d2f3a8c 100644 --- a/test/libsolidity/semanticTests/libraries/library_references_preserve.sol +++ b/test/libsolidity/semanticTests/libraries/library_references_preserve.sol @@ -40,7 +40,6 @@ contract C { return b.getSum(); } } - // ---- // library: L1 // library: L2 diff --git a/test/libsolidity/semanticTests/libraries/library_stray_values.sol b/test/libsolidity/semanticTests/libraries/library_stray_values.sol index 61f52b86c82a..3acc8557024f 100644 --- a/test/libsolidity/semanticTests/libraries/library_stray_values.sol +++ b/test/libsolidity/semanticTests/libraries/library_stray_values.sol @@ -6,8 +6,6 @@ contract Test { return x + 9; } } -// ==== -// compileToEwasm: false // ---- // library: Lib // f(uint256): 33 -> 0x2a diff --git a/test/libsolidity/semanticTests/libraries/library_struct_as_an_expression.sol b/test/libsolidity/semanticTests/libraries/library_struct_as_an_expression.sol index d7df52434136..96ee9bcffed7 100644 --- a/test/libsolidity/semanticTests/libraries/library_struct_as_an_expression.sol +++ b/test/libsolidity/semanticTests/libraries/library_struct_as_an_expression.sol @@ -12,6 +12,5 @@ contract Tsra { return 1; } } - // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/libraries/mapping_arguments_in_library.sol b/test/libsolidity/semanticTests/libraries/mapping_arguments_in_library.sol index 8a82350dc4f8..cfbf7b0c7d15 100644 --- a/test/libsolidity/semanticTests/libraries/mapping_arguments_in_library.sol +++ b/test/libsolidity/semanticTests/libraries/mapping_arguments_in_library.sol @@ -20,8 +20,6 @@ contract Test { return Lib.get(m, key); } } -// ==== -// compileToEwasm: false // ---- // library: Lib // set(uint256,uint256): 1, 42 -> 0 diff --git a/test/libsolidity/semanticTests/libraries/mapping_returns_in_library.sol b/test/libsolidity/semanticTests/libraries/mapping_returns_in_library.sol index a8188fcc65bd..da521f6bada5 100644 --- a/test/libsolidity/semanticTests/libraries/mapping_returns_in_library.sol +++ b/test/libsolidity/semanticTests/libraries/mapping_returns_in_library.sol @@ -24,8 +24,6 @@ contract Test { return b[key]; } } -// ==== -// compileToEwasm: false // ---- // library: Lib // set(bool,uint256,uint256): true, 1, 42 -> 0 diff --git a/test/libsolidity/semanticTests/libraries/mapping_returns_in_library_named.sol b/test/libsolidity/semanticTests/libraries/mapping_returns_in_library_named.sol index 6ddad7979b82..e5963c1b3fe6 100644 --- a/test/libsolidity/semanticTests/libraries/mapping_returns_in_library_named.sol +++ b/test/libsolidity/semanticTests/libraries/mapping_returns_in_library_named.sol @@ -22,8 +22,6 @@ contract Test { return (a[0], a[1], a[2], b[0], b[1], b[2]); } } -// ==== -// compileToEwasm: false // ---- // library: Lib // f() -> 0, 0x2a, 0, 0, 0x15, 0x54 diff --git a/test/libsolidity/semanticTests/libraries/payable_function_calls_library.sol b/test/libsolidity/semanticTests/libraries/payable_function_calls_library.sol index 5e78713b7ef7..178f22b40f92 100644 --- a/test/libsolidity/semanticTests/libraries/payable_function_calls_library.sol +++ b/test/libsolidity/semanticTests/libraries/payable_function_calls_library.sol @@ -6,8 +6,6 @@ contract C { return L.f(); } } -// ==== -// compileToEwasm: false // ---- // library: L // f(): 27 -> 7 diff --git a/test/libsolidity/semanticTests/libraries/using_for_by_name.sol b/test/libsolidity/semanticTests/libraries/using_for_by_name.sol index f9add4cb837d..d6c7f313e236 100644 --- a/test/libsolidity/semanticTests/libraries/using_for_by_name.sol +++ b/test/libsolidity/semanticTests/libraries/using_for_by_name.sol @@ -7,8 +7,6 @@ contract C { return x.mul({x: a}); } } -// ==== -// compileToEwasm: false // ---- // library: D // f(uint256): 7 -> 0x2a diff --git a/test/libsolidity/semanticTests/libraries/using_for_overload.sol b/test/libsolidity/semanticTests/libraries/using_for_overload.sol index 5bc0bc948c16..5dd67fba06be 100644 --- a/test/libsolidity/semanticTests/libraries/using_for_overload.sol +++ b/test/libsolidity/semanticTests/libraries/using_for_overload.sol @@ -11,8 +11,6 @@ contract C { return x.mul(a); } } -// ==== -// compileToEwasm: false // ---- // library: D // f(uint256): 7 -> 0x2a diff --git a/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol b/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol index 41c700976c7c..b180d52e4e39 100644 --- a/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol +++ b/test/libsolidity/semanticTests/libraries/using_library_mappings_public.sol @@ -16,8 +16,6 @@ contract Test { return (m1[0], m1[1], m1[2], m2[0], m2[1], m2[2]); } } -// ==== -// compileToEwasm: false // ---- // library: Lib // f() -> 1, 0, 0x2a, 0x17, 0, 0x63 diff --git a/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol b/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol index 3ac843eedaae..d46ed0a56a38 100644 --- a/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol +++ b/test/libsolidity/semanticTests/libraries/using_library_mappings_return.sol @@ -14,8 +14,6 @@ contract Test { return (m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2]); } } -// ==== -// compileToEwasm: false // ---- // library: Lib // f() -> 1, 0, 0x2a, 0x17, 0, 0x63 diff --git a/test/libsolidity/semanticTests/libraries/using_library_structs.sol b/test/libsolidity/semanticTests/libraries/using_library_structs.sol index 465dcebb1757..e709a5b5b93c 100644 --- a/test/libsolidity/semanticTests/libraries/using_library_structs.sol +++ b/test/libsolidity/semanticTests/libraries/using_library_structs.sol @@ -17,8 +17,6 @@ contract Test { b = data["abc"].b[19]; } } -// ==== -// compileToEwasm: false // ---- // library: Lib // f() -> 7, 8 diff --git a/test/libsolidity/semanticTests/literals/denominations.sol b/test/libsolidity/semanticTests/literals/denominations.sol index 9aec493cd1b9..f423775a613a 100644 --- a/test/libsolidity/semanticTests/literals/denominations.sol +++ b/test/libsolidity/semanticTests/literals/denominations.sol @@ -3,7 +3,5 @@ contract C { function f() public view returns(uint) { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1000000001000000001 diff --git a/test/libsolidity/semanticTests/literals/escape.sol b/test/libsolidity/semanticTests/literals/escape.sol index c198f21dc474..96fa9b11e631 100644 --- a/test/libsolidity/semanticTests/literals/escape.sol +++ b/test/libsolidity/semanticTests/literals/escape.sol @@ -7,7 +7,5 @@ contract C return (encoded.length, encoded[0], encoded[1]); } } -// ==== -// compileToEwasm: also // ---- // f() -> 2, 0x5c00000000000000000000000000000000000000000000000000000000000000, 0x5c00000000000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/literals/ether.sol b/test/libsolidity/semanticTests/literals/ether.sol index d2942a0657ae..16cb75315233 100644 --- a/test/libsolidity/semanticTests/literals/ether.sol +++ b/test/libsolidity/semanticTests/literals/ether.sol @@ -3,7 +3,5 @@ contract C { function f() public view returns(uint) { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1000000000000000000 diff --git a/test/libsolidity/semanticTests/literals/gwei.sol b/test/libsolidity/semanticTests/literals/gwei.sol index 3058ee720e79..bb8cc6ab0a71 100644 --- a/test/libsolidity/semanticTests/literals/gwei.sol +++ b/test/libsolidity/semanticTests/literals/gwei.sol @@ -3,7 +3,5 @@ contract C { function f() public view returns(uint) { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1000000000 diff --git a/test/libsolidity/semanticTests/literals/hex_string_with_non_printable_characters.sol b/test/libsolidity/semanticTests/literals/hex_string_with_non_printable_characters.sol index d10904cfaf33..3edd6049c000 100644 --- a/test/libsolidity/semanticTests/literals/hex_string_with_non_printable_characters.sol +++ b/test/libsolidity/semanticTests/literals/hex_string_with_non_printable_characters.sol @@ -5,7 +5,5 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f diff --git a/test/libsolidity/semanticTests/literals/hex_string_with_underscore.sol b/test/libsolidity/semanticTests/literals/hex_string_with_underscore.sol index b14297a94a2f..db7f70f83bdc 100644 --- a/test/libsolidity/semanticTests/literals/hex_string_with_underscore.sol +++ b/test/libsolidity/semanticTests/literals/hex_string_with_underscore.sol @@ -3,7 +3,5 @@ contract C { return hex"12_34_5678_9A"; } } -// ==== -// compileToEwasm: also // ---- // f() -> 32, 5, left(0x123456789A) diff --git a/test/libsolidity/semanticTests/literals/scientific_notation.sol b/test/libsolidity/semanticTests/literals/scientific_notation.sol index b03adee3938a..5e0d80148aec 100644 --- a/test/libsolidity/semanticTests/literals/scientific_notation.sol +++ b/test/libsolidity/semanticTests/literals/scientific_notation.sol @@ -23,9 +23,6 @@ contract C { return -2.5e1; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 20000000000 // g() -> 2 diff --git a/test/libsolidity/semanticTests/literals/wei.sol b/test/libsolidity/semanticTests/literals/wei.sol index bf115f1dce27..08bba771b0de 100644 --- a/test/libsolidity/semanticTests/literals/wei.sol +++ b/test/libsolidity/semanticTests/literals/wei.sol @@ -3,7 +3,5 @@ contract C { function f() public view returns(uint) { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/memoryManagement/assembly_access.sol b/test/libsolidity/semanticTests/memoryManagement/assembly_access.sol index e69c93e46ba6..d2ed3575ecec 100644 --- a/test/libsolidity/semanticTests/memoryManagement/assembly_access.sol +++ b/test/libsolidity/semanticTests/memoryManagement/assembly_access.sol @@ -10,7 +10,5 @@ contract C { assert(y != 0); } } -// ==== -// compileToEwasm: also // ---- // f() -> diff --git a/test/libsolidity/semanticTests/memoryManagement/struct_allocation.sol b/test/libsolidity/semanticTests/memoryManagement/struct_allocation.sol index f3a326534105..5b471e1a7e14 100644 --- a/test/libsolidity/semanticTests/memoryManagement/struct_allocation.sol +++ b/test/libsolidity/semanticTests/memoryManagement/struct_allocation.sol @@ -17,8 +17,6 @@ contract C { return memorySizeAfter - memorySizeBefore; } } -// ==== -// compileToEwasm: also // ---- // withValue() -> 0x00 // withoutValue() -> 0x60 diff --git a/test/libsolidity/semanticTests/metaTypes/name_other_contract.sol b/test/libsolidity/semanticTests/metaTypes/name_other_contract.sol index 4f9bfe971e81..efdaedf50257 100644 --- a/test/libsolidity/semanticTests/metaTypes/name_other_contract.sol +++ b/test/libsolidity/semanticTests/metaTypes/name_other_contract.sol @@ -22,8 +22,6 @@ contract Test is C { return type(I).name; } } -// ==== -// compileToEwasm: also // ---- // c() -> 0x20, 1, "C" // a() -> 0x20, 1, "A" diff --git a/test/libsolidity/semanticTests/modifiers/access_through_contract_name.sol b/test/libsolidity/semanticTests/modifiers/access_through_contract_name.sol index f56d611c2436..4d1538d7cfb7 100644 --- a/test/libsolidity/semanticTests/modifiers/access_through_contract_name.sol +++ b/test/libsolidity/semanticTests/modifiers/access_through_contract_name.sol @@ -12,8 +12,6 @@ contract C is A { return 10; } } -// ==== -// compileToEwasm: also // ---- // x() -> 7 // f() -> 9 diff --git a/test/libsolidity/semanticTests/modifiers/access_through_module_name.sol b/test/libsolidity/semanticTests/modifiers/access_through_module_name.sol index 925797b7ebd1..58c60014311f 100644 --- a/test/libsolidity/semanticTests/modifiers/access_through_module_name.sol +++ b/test/libsolidity/semanticTests/modifiers/access_through_module_name.sol @@ -15,8 +15,6 @@ contract C { r = 10; } } -// ==== -// compileToEwasm: also // ---- // x() -> 0x00 // f() -> 1, 9 diff --git a/test/libsolidity/semanticTests/modifiers/break_in_modifier.sol b/test/libsolidity/semanticTests/modifiers/break_in_modifier.sol index b15a80df14cd..67fc0e6be6c0 100644 --- a/test/libsolidity/semanticTests/modifiers/break_in_modifier.sol +++ b/test/libsolidity/semanticTests/modifiers/break_in_modifier.sol @@ -14,8 +14,6 @@ contract C { x = t; } } -// ==== -// compileToEwasm: also // ---- // x() -> 0 // f() -> diff --git a/test/libsolidity/semanticTests/modifiers/continue_in_modifier.sol b/test/libsolidity/semanticTests/modifiers/continue_in_modifier.sol index bc4c79739365..2879c55eaf0b 100644 --- a/test/libsolidity/semanticTests/modifiers/continue_in_modifier.sol +++ b/test/libsolidity/semanticTests/modifiers/continue_in_modifier.sol @@ -13,9 +13,6 @@ contract C { x = t; } } - -// ==== -// compileToEwasm: also // ---- // x() -> 0 // f() -> diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier.sol b/test/libsolidity/semanticTests/modifiers/function_modifier.sol index cca7e04b1aeb..e1978ba871f9 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier.sol @@ -7,9 +7,6 @@ contract C { if (msg.value > 0) _; } } - -// ==== -// compileToEwasm: also // ---- // getOne() -> 0 // getOne(), 1 wei -> 1 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_calling_functions_in_creation_context.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_calling_functions_in_creation_context.sol index 182baec8c581..bae503250173 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_calling_functions_in_creation_context.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_calling_functions_in_creation_context.sol @@ -44,8 +44,5 @@ contract C is A { data |= 0x4000; } } - -// ==== -// compileToEwasm: also // ---- // getData() -> 0x4300 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_empty.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_empty.sol index 222f87f97ee1..16cbad1a4ab9 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_empty.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_empty.sol @@ -12,8 +12,5 @@ contract C is A { if (false) _; } } - -// ==== -// compileToEwasm: also // ---- // f() -> false diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_for_constructor.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_for_constructor.sol index 71cbc4203773..f32a238145db 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_for_constructor.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_for_constructor.sol @@ -22,7 +22,5 @@ contract C is A { _; } } -// ==== -// compileToEwasm: also // ---- // getData() -> 6 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_library.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_library.sol index f10ebb0e74bb..c50fb5ddec51 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_library.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_library.sol @@ -23,6 +23,5 @@ contract Test { return s.v; } } - // ---- // f() -> 0x202 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_library_inheritance.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_library_inheritance.sol index 3d5e97de00f2..e87ac7a41330 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_library_inheritance.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_library_inheritance.sol @@ -29,6 +29,5 @@ contract Test { return s.v; } } - // ---- // f() -> 0x202 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_local_variables.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_local_variables.sol index dc44d6659801..c3b10475fcca 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_local_variables.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_local_variables.sol @@ -13,9 +13,6 @@ contract C { return 3; } } - -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 0 // f(bool): false -> 3 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_loop_viair.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_loop_viair.sol index 86da5500ec53..81caba767061 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_loop_viair.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_loop_viair.sol @@ -10,6 +10,5 @@ contract C { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_multi_invocation_viair.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_multi_invocation_viair.sol index ae8431d3cc59..929b006e3f83 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_multi_invocation_viair.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_multi_invocation_viair.sol @@ -10,7 +10,6 @@ contract C { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // f(bool): false -> 1 // f(bool): true -> 1 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times.sol index 83f855d2c7db..5cda8b6d2063 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times.sol @@ -9,9 +9,6 @@ contract C { return a; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 3 -> 10 // a() -> 10 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times_local_vars.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times_local_vars.sol index 264d256bdac3..780b5a360c8d 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times_local_vars.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_multiple_times_local_vars.sol @@ -12,9 +12,6 @@ contract C { return a; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 3 -> 10 // a() -> 0 diff --git a/test/libsolidity/semanticTests/modifiers/function_modifier_overriding.sol b/test/libsolidity/semanticTests/modifiers/function_modifier_overriding.sol index bef92dac2efb..16d6b821637a 100644 --- a/test/libsolidity/semanticTests/modifiers/function_modifier_overriding.sol +++ b/test/libsolidity/semanticTests/modifiers/function_modifier_overriding.sol @@ -14,8 +14,5 @@ contract C is A { if (false) _; } } - -// ==== -// compileToEwasm: also // ---- // f() -> false diff --git a/test/libsolidity/semanticTests/modifiers/function_return_parameter.sol b/test/libsolidity/semanticTests/modifiers/function_return_parameter.sol index e1a0c36d3bde..ecc7851b4ba2 100644 --- a/test/libsolidity/semanticTests/modifiers/function_return_parameter.sol +++ b/test/libsolidity/semanticTests/modifiers/function_return_parameter.sol @@ -4,7 +4,5 @@ contract B { modifier mod1(uint a, bool b) { if (b) _; } modifier mod2(bytes7 a) { while (a == "1234567") _; } } -// ==== -// compileToEwasm: also // ---- // f(uint8): 5 -> 0x00 diff --git a/test/libsolidity/semanticTests/modifiers/function_return_parameter_complex.sol b/test/libsolidity/semanticTests/modifiers/function_return_parameter_complex.sol index ab14d14c280b..530fadf63662 100644 --- a/test/libsolidity/semanticTests/modifiers/function_return_parameter_complex.sol +++ b/test/libsolidity/semanticTests/modifiers/function_return_parameter_complex.sol @@ -26,8 +26,6 @@ contract A { r = x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x10, 0x20, 0x40 // x() -> 1 diff --git a/test/libsolidity/semanticTests/modifiers/modifer_recursive.sol b/test/libsolidity/semanticTests/modifiers/modifer_recursive.sol index 006af1c2cc12..a69a26f5ce28 100644 --- a/test/libsolidity/semanticTests/modifiers/modifer_recursive.sol +++ b/test/libsolidity/semanticTests/modifiers/modifer_recursive.sol @@ -8,9 +8,6 @@ contract C { return x == 0 ? 2 : f(x - 1)**2; } } - -// ==== -// compileToEwasm: also // ---- // called() -> 0x00 // f(uint256): 5 -> 0x0100000000 diff --git a/test/libsolidity/semanticTests/modifiers/modifier_in_constructor_ice.sol b/test/libsolidity/semanticTests/modifiers/modifier_in_constructor_ice.sol index 88a2fa1071d0..136743d53089 100644 --- a/test/libsolidity/semanticTests/modifiers/modifier_in_constructor_ice.sol +++ b/test/libsolidity/semanticTests/modifiers/modifier_in_constructor_ice.sol @@ -1,7 +1,5 @@ // The IR of this contract used to throw contract A { modifier m1{_;} } contract B is A { constructor() A() m1{} } -// ==== -// compileToEwasm: also // ---- // constructor() -> diff --git a/test/libsolidity/semanticTests/modifiers/modifier_init_return.sol b/test/libsolidity/semanticTests/modifiers/modifier_init_return.sol index df4fa914c6c4..d4c72e1632d4 100644 --- a/test/libsolidity/semanticTests/modifiers/modifier_init_return.sol +++ b/test/libsolidity/semanticTests/modifiers/modifier_init_return.sol @@ -7,9 +7,6 @@ contract C { r[2] = 3; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 9 -> 0x00, 0x00, 0x00, 0x00, 0x00 // f(uint256): 10 -> 0x00, 0x00, 3, 0x00, 0x00 diff --git a/test/libsolidity/semanticTests/modifiers/modifiers_in_construction_context.sol b/test/libsolidity/semanticTests/modifiers/modifiers_in_construction_context.sol index 3f2b4ebea144..30cce5a79d79 100644 --- a/test/libsolidity/semanticTests/modifiers/modifiers_in_construction_context.sol +++ b/test/libsolidity/semanticTests/modifiers/modifiers_in_construction_context.sol @@ -7,7 +7,5 @@ contract B is A { modifier m2 { _; } constructor() A() m1 m2 { } } -// ==== -// compileToEwasm: also // ---- // constructor() -> diff --git a/test/libsolidity/semanticTests/modifiers/return_does_not_skip_modifier.sol b/test/libsolidity/semanticTests/modifiers/return_does_not_skip_modifier.sol index 1d71e5ac97a5..0d9bbfe32b2a 100644 --- a/test/libsolidity/semanticTests/modifiers/return_does_not_skip_modifier.sol +++ b/test/libsolidity/semanticTests/modifiers/return_does_not_skip_modifier.sol @@ -9,9 +9,6 @@ contract C { return 2; } } - -// ==== -// compileToEwasm: also // ---- // x() -> 0 // f() -> 2 diff --git a/test/libsolidity/semanticTests/modifiers/return_in_modifier.sol b/test/libsolidity/semanticTests/modifiers/return_in_modifier.sol index ffc503ae2050..00e2bb32846c 100644 --- a/test/libsolidity/semanticTests/modifiers/return_in_modifier.sol +++ b/test/libsolidity/semanticTests/modifiers/return_in_modifier.sol @@ -13,9 +13,6 @@ contract C { x = t; } } - -// ==== -// compileToEwasm: also // ---- // x() -> 0 // f() -> diff --git a/test/libsolidity/semanticTests/modifiers/stacked_return_with_modifiers.sol b/test/libsolidity/semanticTests/modifiers/stacked_return_with_modifiers.sol index a9b6bfa6c135..616a2183c02d 100644 --- a/test/libsolidity/semanticTests/modifiers/stacked_return_with_modifiers.sol +++ b/test/libsolidity/semanticTests/modifiers/stacked_return_with_modifiers.sol @@ -15,8 +15,6 @@ contract C { } } } -// ==== -// compileToEwasm: also // ---- // x() -> 0 // f() -> 42 diff --git a/test/libsolidity/semanticTests/multiSource/circular_import.sol b/test/libsolidity/semanticTests/multiSource/circular_import.sol index 15d75fde50cc..4c4ba4b28ae3 100644 --- a/test/libsolidity/semanticTests/multiSource/circular_import.sol +++ b/test/libsolidity/semanticTests/multiSource/circular_import.sol @@ -9,7 +9,5 @@ contract C { return f() - g(); } } -// ==== -// compileToEwasm: also // ---- // foo() -> 1 diff --git a/test/libsolidity/semanticTests/multiSource/circular_import_2.sol b/test/libsolidity/semanticTests/multiSource/circular_import_2.sol index de47c0380fec..639629372e93 100644 --- a/test/libsolidity/semanticTests/multiSource/circular_import_2.sol +++ b/test/libsolidity/semanticTests/multiSource/circular_import_2.sol @@ -10,7 +10,5 @@ contract C { return h() - f() - g(); } } -// ==== -// compileToEwasm: also // ---- // foo() -> 992 diff --git a/test/libsolidity/semanticTests/multiSource/circular_reimport.sol b/test/libsolidity/semanticTests/multiSource/circular_reimport.sol index 8b7fc32a594f..a866b0f547df 100644 --- a/test/libsolidity/semanticTests/multiSource/circular_reimport.sol +++ b/test/libsolidity/semanticTests/multiSource/circular_reimport.sol @@ -12,7 +12,5 @@ contract C { return f() - g() - h(); } } -// ==== -// compileToEwasm: also // ---- // foo() -> 0x60 diff --git a/test/libsolidity/semanticTests/multiSource/circular_reimport_2.sol b/test/libsolidity/semanticTests/multiSource/circular_reimport_2.sol index 3ae209daa8a4..3ff3a1a6029f 100644 --- a/test/libsolidity/semanticTests/multiSource/circular_reimport_2.sol +++ b/test/libsolidity/semanticTests/multiSource/circular_reimport_2.sol @@ -12,7 +12,5 @@ contract C { return 10000 + f() - g() - h(); } } -// ==== -// compileToEwasm: also // ---- // foo() -> 0x2324 diff --git a/test/libsolidity/semanticTests/multiSource/free_different_interger_types.sol b/test/libsolidity/semanticTests/multiSource/free_different_interger_types.sol index 5c428636681e..a103ef071afd 100644 --- a/test/libsolidity/semanticTests/multiSource/free_different_interger_types.sol +++ b/test/libsolidity/semanticTests/multiSource/free_different_interger_types.sol @@ -8,7 +8,5 @@ contract C { return (g(2), g(false)); } } -// ==== -// compileToEwasm: also // ---- // foo() -> 24, true diff --git a/test/libsolidity/semanticTests/multiSource/free_function_resolution_base_contract.sol b/test/libsolidity/semanticTests/multiSource/free_function_resolution_base_contract.sol index 4e91d42fb434..321e16ae32b1 100644 --- a/test/libsolidity/semanticTests/multiSource/free_function_resolution_base_contract.sol +++ b/test/libsolidity/semanticTests/multiSource/free_function_resolution_base_contract.sol @@ -12,7 +12,5 @@ contract D is C { return g(); } } -// ==== -// compileToEwasm: also // ---- // h() -> 1337 diff --git a/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual.sol b/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual.sol index 6df3631a769b..f111273d8f58 100644 --- a/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual.sol +++ b/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual.sol @@ -12,7 +12,5 @@ contract D is C { return f(); } } -// ==== -// compileToEwasm: also // ---- // g() -> 1337 diff --git a/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_super.sol b/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_super.sol index 71fed293ba6f..ae802d7c0a37 100644 --- a/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_super.sol +++ b/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_super.sol @@ -12,7 +12,5 @@ contract D is C { return super.g(); } } -// ==== -// compileToEwasm: also // ---- // g() -> 1337 diff --git a/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_transitive.sol b/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_transitive.sol index e31fdfa3db5a..71723f0fa5b3 100644 --- a/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_transitive.sol +++ b/test/libsolidity/semanticTests/multiSource/free_function_resolution_override_virtual_transitive.sol @@ -19,7 +19,5 @@ contract E is D { return super.g() + 1; } } -// ==== -// compileToEwasm: also // ---- // g() -> 1339 diff --git a/test/libsolidity/semanticTests/multiSource/free_function_transitive_import.sol b/test/libsolidity/semanticTests/multiSource/free_function_transitive_import.sol index 585ef8986d9f..dec4c3f29e99 100644 --- a/test/libsolidity/semanticTests/multiSource/free_function_transitive_import.sol +++ b/test/libsolidity/semanticTests/multiSource/free_function_transitive_import.sol @@ -20,8 +20,5 @@ contract E is D { return f(); } } - -// ==== -// compileToEwasm: also // ---- // i() -> 1337 diff --git a/test/libsolidity/semanticTests/multiSource/import.sol b/test/libsolidity/semanticTests/multiSource/import.sol index bcaf6f290638..2a0f43d53978 100644 --- a/test/libsolidity/semanticTests/multiSource/import.sol +++ b/test/libsolidity/semanticTests/multiSource/import.sol @@ -7,8 +7,6 @@ import "A"; contract B is A { function f(uint256 x) public view returns(uint256) { return x; } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 1337 -> 1337 // g(uint256): 1337 -> 1338 diff --git a/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias.sol b/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias.sol index f980805ed9f6..c57693674535 100644 --- a/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias.sol +++ b/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias.sol @@ -13,7 +13,5 @@ contract D is M.C { return super.g() + f() * 10000; } } -// ==== -// compileToEwasm: also // ---- // g() -> 61337 diff --git a/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias_direct_call.sol b/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias_direct_call.sol index 5188f0e4a3b6..a5f43f8b1c7a 100644 --- a/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias_direct_call.sol +++ b/test/libsolidity/semanticTests/multiSource/imported_free_function_via_alias_direct_call.sol @@ -8,7 +8,5 @@ contract D { return g() + f() * 10000; } } -// ==== -// compileToEwasm: also // ---- // h() -> 61337 diff --git a/test/libsolidity/semanticTests/multiSource/reimport_imported_function.sol b/test/libsolidity/semanticTests/multiSource/reimport_imported_function.sol index a31b438ff8ee..02b4821433f4 100644 --- a/test/libsolidity/semanticTests/multiSource/reimport_imported_function.sol +++ b/test/libsolidity/semanticTests/multiSource/reimport_imported_function.sol @@ -9,7 +9,5 @@ contract C { return h(); } } -// ==== -// compileToEwasm: also // ---- // foo() -> 1337 diff --git a/test/libsolidity/semanticTests/operators/compound_assign.sol b/test/libsolidity/semanticTests/operators/compound_assign.sol index 6ede4522d443..ed91f3b6c586 100644 --- a/test/libsolidity/semanticTests/operators/compound_assign.sol +++ b/test/libsolidity/semanticTests/operators/compound_assign.sol @@ -9,8 +9,6 @@ contract test { return value2 += 7; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 0, 6 -> 7 // f(uint256,uint256): 1, 3 -> 0x23 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_bytes_cleanup_viaYul.sol b/test/libsolidity/semanticTests/operators/shifts/shift_bytes_cleanup_viaYul.sol index 68a370454504..36b6e8b59375 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_bytes_cleanup_viaYul.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_bytes_cleanup_viaYul.sol @@ -13,7 +13,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // l(uint8): 64 -> 0x3930313233343536373839300000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_cleanup.sol b/test/libsolidity/semanticTests/operators/shifts/shift_cleanup.sol index 9f13f4bdce84..0adc5ae55641 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_cleanup.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_cleanup.sol @@ -8,8 +8,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x0 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_cleanup_garbled.sol b/test/libsolidity/semanticTests/operators/shifts/shift_cleanup_garbled.sol index 560def3b4e87..452884f26340 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_cleanup_garbled.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_cleanup_garbled.sol @@ -6,8 +6,5 @@ contract C { x >>= 8; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x0 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_constant_left.sol b/test/libsolidity/semanticTests/operators/shifts/shift_constant_left.sol index 1af4930060f0..bc0c9f48445a 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_constant_left.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_constant_left.sol @@ -1,7 +1,5 @@ contract C { uint256 public a = 0x42 << 8; } -// ==== -// compileToEwasm: also // ---- // a() -> 0x4200 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_constant_left_assignment.sol b/test/libsolidity/semanticTests/operators/shifts/shift_constant_left_assignment.sol index aa75ca487882..3d245e9bf325 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_constant_left_assignment.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_constant_left_assignment.sol @@ -4,8 +4,5 @@ contract C { a <<= 8; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x4200 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_constant_right.sol b/test/libsolidity/semanticTests/operators/shifts/shift_constant_right.sol index c39407215537..64403475093a 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_constant_right.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_constant_right.sol @@ -1,7 +1,5 @@ contract C { uint256 public a = 0x4200 >> 8; } -// ==== -// compileToEwasm: also // ---- // a() -> 0x42 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_constant_right_assignment.sol b/test/libsolidity/semanticTests/operators/shifts/shift_constant_right_assignment.sol index 0a959aa11b0c..ded331a79491 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_constant_right_assignment.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_constant_right_assignment.sol @@ -4,8 +4,5 @@ contract C { a >>= 8; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x42 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_left.sol b/test/libsolidity/semanticTests/operators/shifts/shift_left.sol index 058d233e906c..47afab5ec1f8 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_left.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_left.sol @@ -3,9 +3,6 @@ contract C { return a << b; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 0x4266, 0x0 -> 0x4266 // f(uint256,uint256): 0x4266, 0x8 -> 0x426600 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment.sol b/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment.sol index 55883ddaef24..afa82c6f7920 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment.sol @@ -4,9 +4,6 @@ contract C { return a; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 0x4266, 0x0 -> 0x4266 // f(uint256,uint256): 0x4266, 0x8 -> 0x426600 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment_different_type.sol b/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment_different_type.sol index 2242d2a16836..44fd4a924a1b 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment_different_type.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_left_assignment_different_type.sol @@ -4,9 +4,6 @@ contract C { return a; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,uint8): 0x4266, 0x0 -> 0x4266 // f(uint256,uint8): 0x4266, 0x8 -> 0x426600 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_left_larger_type.sol b/test/libsolidity/semanticTests/operators/shifts/shift_left_larger_type.sol index a1c3fc4cfca0..3d6d7c7e2b9c 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_left_larger_type.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_left_larger_type.sol @@ -6,7 +6,5 @@ contract C { return y << x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_left_uint32.sol b/test/libsolidity/semanticTests/operators/shifts/shift_left_uint32.sol index 6a208e9fc0e7..d66e2f4cbf74 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_left_uint32.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_left_uint32.sol @@ -3,9 +3,6 @@ contract C { return a << b; } } - -// ==== -// compileToEwasm: also // ---- // f(uint32,uint32): 0x4266, 0x0 -> 0x4266 // f(uint32,uint32): 0x4266, 0x8 -> 0x426600 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_left_uint8.sol b/test/libsolidity/semanticTests/operators/shifts/shift_left_uint8.sol index f9517fb618c7..d6d6d77bb163 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_left_uint8.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_left_uint8.sol @@ -3,9 +3,6 @@ contract C { return a << b; } } - -// ==== -// compileToEwasm: also // ---- // f(uint8,uint8): 0x66, 0x0 -> 0x66 // f(uint8,uint8): 0x66, 0x8 -> 0 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_left.sol b/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_left.sol index e303e73eac8d..7671ce19de6e 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_left.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_left.sol @@ -1,7 +1,5 @@ contract C { int256 public a = -0x42 << 8; } -// ==== -// compileToEwasm: also // ---- // a() -> -16896 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_right.sol b/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_right.sol index 32ae16edcd8b..e9a76d2c94ba 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_right.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_negative_constant_right.sol @@ -1,7 +1,5 @@ contract C { int256 public a = -0x4200 >> 8; } -// ==== -// compileToEwasm: also // ---- // a() -> -66 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_overflow.sol b/test/libsolidity/semanticTests/operators/shifts/shift_overflow.sol index 3e63bc8eba51..5b0491b36728 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_overflow.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_overflow.sol @@ -7,9 +7,6 @@ contract C { return x << y; } } - -// ==== -// compileToEwasm: also // ---- // leftU(uint8,uint8): 255, 8 -> 0 // leftU(uint8,uint8): 255, 1 -> 254 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right.sol index 97ca0a5c437e..4947b21d45a6 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 0x4266, 0x0 -> 0x4266 // f(uint256,uint256): 0x4266, 0x8 -> 0x42 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_assignment.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_assignment.sol index b427210843e8..f9206b092f4b 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_assignment.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_assignment.sol @@ -4,9 +4,6 @@ contract C { return a; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 0x4266, 0x0 -> 0x4266 // f(uint256,uint256): 0x4266, 0x8 -> 0x42 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_signed_v2.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_signed_v2.sol index c7fa354955c6..2b1afb52be25 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_signed_v2.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_signed_v2.sol @@ -18,8 +18,6 @@ contract C { return a >> b; } } -// ==== -// compileToEwasm: also // ---- // f(int8,uint8): 0x00, 0x03 -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe // f(int8,uint8): 0x00, 0x04 -> 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_v2.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_v2.sol index ecb51e902a9a..8cf89f4b0039 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_v2.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_garbled_v2.sol @@ -10,8 +10,6 @@ contract C { return a >> b; } } -// ==== -// compileToEwasm: also // ---- // f(uint8,uint8): 0x00, 0x04 -> 0x0f // f(uint8,uint8): 0x00, 0x1004 -> FAILURE diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_literal.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_literal.sol index 630f4905ea24..e24118afe130 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_literal.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_literal.sol @@ -47,9 +47,6 @@ contract C { return (-4267 >> 17) == -1; } } - -// ==== -// compileToEwasm: also // ---- // f1() -> true // f2() -> true diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue.sol index 6d2f7ae5823b..5dcde06f2bc1 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(int256,uint256): -4266, 0 -> -4266 // f(int256,uint256): -4266, 1 -> -2133 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_assignment.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_assignment.sol index 74b704f48ec0..00ac9662e829 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_assignment.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_assignment.sol @@ -4,9 +4,6 @@ contract C { return a; } } - -// ==== -// compileToEwasm: also // ---- // f(int256,uint256): -4266, 0 -> -4266 // f(int256,uint256): -4266, 1 -> -2133 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int16.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int16.sol index 533c93bc9212..50612a6f306d 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int16.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int16.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(int16,uint16): -4266, 0 -> -4266 // f(int16,uint16): -4266, 1 -> -2133 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int32.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int32.sol index 3dc12b2230a9..024eb3254624 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int32.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int32.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(int32,uint32): -4266, 0 -> -4266 // f(int32,uint32): -4266, 1 -> -2133 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int8.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int8.sol index f6dda7059775..9cff6c3b5249 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int8.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_int8.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(int8,uint8): -66, 0 -> -66 // f(int8,uint8): -66, 1 -> -33 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int16_v2.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int16_v2.sol index d81e00fd52da..f2c024483015 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int16_v2.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int16_v2.sol @@ -6,8 +6,6 @@ contract C { return a >> b; } } -// ==== -// compileToEwasm: also // ---- // f(int16,uint16): 0xff99, 0x00 -> FAILURE // f(int16,uint16): 0xff99, 0x01 -> FAILURE diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int32_v2.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int32_v2.sol index cac3a53b6c59..9c3090a783a9 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int32_v2.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int32_v2.sol @@ -6,8 +6,6 @@ contract C { return a >> b; } } -// ==== -// compileToEwasm: also // ---- // f(int32,uint32): 0xffffff99, 0x00 -> FAILURE // f(int32,uint32): 0xffffff99, 0x01 -> FAILURE diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int8_v2.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int8_v2.sol index 0fe10c9379fc..8d3cec4e31e3 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int8_v2.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_negative_lvalue_signextend_int8_v2.sol @@ -6,8 +6,6 @@ contract C { return a >> b; } } -// ==== -// compileToEwasm: also // ---- // f(int8,uint8): 0x99, 0x00 -> FAILURE // f(int8,uint8): 0x99, 0x01 -> FAILURE diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_uint32.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_uint32.sol index a5d1ed51cf8a..2619ea334d51 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_uint32.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_uint32.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(uint32,uint32): 0x4266, 0x0 -> 0x4266 // f(uint32,uint32): 0x4266, 0x8 -> 0x42 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_right_uint8.sol b/test/libsolidity/semanticTests/operators/shifts/shift_right_uint8.sol index 7ac59b3fc6d8..1792d8755193 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_right_uint8.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_right_uint8.sol @@ -3,9 +3,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(uint8,uint8): 0x66, 0x0 -> 0x66 // f(uint8,uint8): 0x66, 0x8 -> 0x0 diff --git a/test/libsolidity/semanticTests/operators/shifts/shift_underflow_negative_rvalue.sol b/test/libsolidity/semanticTests/operators/shifts/shift_underflow_negative_rvalue.sol index 111357e9ee81..6f4f95e919f3 100644 --- a/test/libsolidity/semanticTests/operators/shifts/shift_underflow_negative_rvalue.sol +++ b/test/libsolidity/semanticTests/operators/shifts/shift_underflow_negative_rvalue.sol @@ -7,9 +7,6 @@ contract C { return a >> b; } } - -// ==== -// compileToEwasm: also // ---- // f(int256,uint256): 1, -1 -> 0 // g(int256,uint256): 1, -1 -> 0 diff --git a/test/libsolidity/semanticTests/operators/userDefined/unchecked_operators.sol b/test/libsolidity/semanticTests/operators/userDefined/unchecked_operators.sol index 684ea1b433ad..9f3fd5d4e4d1 100644 --- a/test/libsolidity/semanticTests/operators/userDefined/unchecked_operators.sol +++ b/test/libsolidity/semanticTests/operators/userDefined/unchecked_operators.sol @@ -19,7 +19,6 @@ contract D { } } } - // ---- // testUncheckedOperator() -> 4 // testUncheckedOperatorInUncheckedBlock() -> 4 diff --git a/test/libsolidity/semanticTests/optimizer/shift_bytes.sol b/test/libsolidity/semanticTests/optimizer/shift_bytes.sol index 49d693a777de..6c7eef895cf6 100644 --- a/test/libsolidity/semanticTests/optimizer/shift_bytes.sol +++ b/test/libsolidity/semanticTests/optimizer/shift_bytes.sol @@ -37,8 +37,6 @@ contract C { return (x, y, z); } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -> 0x1f, 0x1f, 3 // g(uint256): 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -> 1, 3, 5 diff --git a/test/libsolidity/semanticTests/payable/no_nonpayable_circumvention_by_modifier.sol b/test/libsolidity/semanticTests/payable/no_nonpayable_circumvention_by_modifier.sol index 4c6557cd7a6f..c36095914363 100644 --- a/test/libsolidity/semanticTests/payable/no_nonpayable_circumvention_by_modifier.sol +++ b/test/libsolidity/semanticTests/payable/no_nonpayable_circumvention_by_modifier.sol @@ -9,8 +9,6 @@ contract C { return msg.value; } } -// ==== -// compileToEwasm: also // ---- // f(), 27 wei -> FAILURE // balance -> 0 diff --git a/test/libsolidity/semanticTests/receive/empty_calldata_calls_receive.sol b/test/libsolidity/semanticTests/receive/empty_calldata_calls_receive.sol index 1be435ff689f..ce04cd73745b 100644 --- a/test/libsolidity/semanticTests/receive/empty_calldata_calls_receive.sol +++ b/test/libsolidity/semanticTests/receive/empty_calldata_calls_receive.sol @@ -2,8 +2,6 @@ contract A { uint public x; receive () external payable { ++x; } } -// ==== -// compileToEwasm: also // ---- // x() -> 0 // () diff --git a/test/libsolidity/semanticTests/receive/ether_and_data.sol b/test/libsolidity/semanticTests/receive/ether_and_data.sol index df3c89884b5a..4c48df8d47ad 100644 --- a/test/libsolidity/semanticTests/receive/ether_and_data.sol +++ b/test/libsolidity/semanticTests/receive/ether_and_data.sol @@ -1,8 +1,6 @@ contract C { receive () payable external { } } -// ==== -// compileToEwasm: also // ---- // (), 1 ether // (), 1 ether: 1 -> FAILURE diff --git a/test/libsolidity/semanticTests/receive/inherited.sol b/test/libsolidity/semanticTests/receive/inherited.sol index 9ca685399fbf..36273068ac9b 100644 --- a/test/libsolidity/semanticTests/receive/inherited.sol +++ b/test/libsolidity/semanticTests/receive/inherited.sol @@ -4,8 +4,6 @@ contract A { function getData() public returns (uint r) { return data; } } contract B is A {} -// ==== -// compileToEwasm: also // ---- // getData() -> 0 // () -> diff --git a/test/libsolidity/semanticTests/reverts/assert_require.sol b/test/libsolidity/semanticTests/reverts/assert_require.sol index ee60fc192cdd..bc4db3602c72 100644 --- a/test/libsolidity/semanticTests/reverts/assert_require.sol +++ b/test/libsolidity/semanticTests/reverts/assert_require.sol @@ -13,9 +13,6 @@ contract C { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x01 // g(bool): false -> FAILURE, hex"4e487b71", 0x01 diff --git a/test/libsolidity/semanticTests/reverts/error_struct.sol b/test/libsolidity/semanticTests/reverts/error_struct.sol index 4ca57bd6eeaf..d6171a416a8c 100644 --- a/test/libsolidity/semanticTests/reverts/error_struct.sol +++ b/test/libsolidity/semanticTests/reverts/error_struct.sol @@ -10,8 +10,6 @@ contract C { return _struct.error; } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"f8a8fd6d" // g(uint256): 7 -> 7 diff --git a/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_arg.sol b/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_arg.sol index 1e3e34cb1a9a..28c4e01f9955 100644 --- a/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_arg.sol +++ b/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_arg.sol @@ -17,6 +17,5 @@ contract C { } // ==== // EVMVersion: >=byzantium -// compileToEwasm: also // ---- // test() -> FAILURE, hex"4e487b71", 0x21 # should throw # diff --git a/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_ret.sol b/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_ret.sol index 987931fa7d26..7416d295fc7c 100644 --- a/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_ret.sol +++ b/test/libsolidity/semanticTests/reverts/invalid_enum_as_external_ret.sol @@ -23,10 +23,8 @@ contract C { _ret = tmp; } } - // ==== // EVMVersion: >=byzantium -// compileToEwasm: also // ---- // test_return() -> FAILURE, hex"4e487b71", 33 # both should throw # // test_inline_assignment() -> FAILURE, hex"4e487b71", 33 diff --git a/test/libsolidity/semanticTests/reverts/invalid_enum_compared.sol b/test/libsolidity/semanticTests/reverts/invalid_enum_compared.sol index afdbd20b6721..527a4320235d 100644 --- a/test/libsolidity/semanticTests/reverts/invalid_enum_compared.sol +++ b/test/libsolidity/semanticTests/reverts/invalid_enum_compared.sol @@ -24,7 +24,6 @@ contract C { } // ==== // EVMVersion: >=byzantium -// compileToEwasm: also // ---- // test_eq_ok() -> 1 // test_eq() -> FAILURE, hex"4e487b71", 33 # both should throw # diff --git a/test/libsolidity/semanticTests/reverts/invalid_enum_stored.sol b/test/libsolidity/semanticTests/reverts/invalid_enum_stored.sol index fdf5e6bbb17c..8049a977e746 100644 --- a/test/libsolidity/semanticTests/reverts/invalid_enum_stored.sol +++ b/test/libsolidity/semanticTests/reverts/invalid_enum_stored.sol @@ -18,7 +18,6 @@ contract C { } // ==== // EVMVersion: >=byzantium -// compileToEwasm: also // ---- // test_store_ok() -> 1 // x() -> 0 diff --git a/test/libsolidity/semanticTests/reverts/invalid_instruction.sol b/test/libsolidity/semanticTests/reverts/invalid_instruction.sol index f4f64a11e5bb..69d9a0cd3605 100644 --- a/test/libsolidity/semanticTests/reverts/invalid_instruction.sol +++ b/test/libsolidity/semanticTests/reverts/invalid_instruction.sol @@ -5,8 +5,5 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE diff --git a/test/libsolidity/semanticTests/reverts/revert.sol b/test/libsolidity/semanticTests/reverts/revert.sol index cac02076d551..2d733b4e7db2 100644 --- a/test/libsolidity/semanticTests/reverts/revert.sol +++ b/test/libsolidity/semanticTests/reverts/revert.sol @@ -13,9 +13,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE // a() -> 42 diff --git a/test/libsolidity/semanticTests/reverts/revert_return_area.sol b/test/libsolidity/semanticTests/reverts/revert_return_area.sol index fa8156b3000b..8ab4ca22722c 100644 --- a/test/libsolidity/semanticTests/reverts/revert_return_area.sol +++ b/test/libsolidity/semanticTests/reverts/revert_return_area.sol @@ -12,7 +12,6 @@ contract C { } } } - // ==== // EVMVersion: >=byzantium // ---- diff --git a/test/libsolidity/semanticTests/reverts/simple_throw.sol b/test/libsolidity/semanticTests/reverts/simple_throw.sol index 0d43c97e96f3..1c1bfee0b377 100644 --- a/test/libsolidity/semanticTests/reverts/simple_throw.sol +++ b/test/libsolidity/semanticTests/reverts/simple_throw.sol @@ -5,9 +5,6 @@ contract Test { return 2; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 11 -> 21 // f(uint256): 1 -> FAILURE diff --git a/test/libsolidity/semanticTests/smoke/basic.sol b/test/libsolidity/semanticTests/smoke/basic.sol index 81e8bd829cb4..8f05c4262598 100644 --- a/test/libsolidity/semanticTests/smoke/basic.sol +++ b/test/libsolidity/semanticTests/smoke/basic.sol @@ -28,8 +28,6 @@ contract C { return a * 7; } } -// ==== -// compileToEwasm: also // ---- // d() -> // e(), 1 wei -> 1 diff --git a/test/libsolidity/semanticTests/smoke/failure.sol b/test/libsolidity/semanticTests/smoke/failure.sol index eeb82a3ce4da..14cf1e627304 100644 --- a/test/libsolidity/semanticTests/smoke/failure.sol +++ b/test/libsolidity/semanticTests/smoke/failure.sol @@ -16,7 +16,6 @@ contract C { // ==== // EVMVersion: >homestead // allowNonExistingFunctions: true -// compileToEwasm: also // ---- // _() -> FAILURE // e() -> FAILURE, hex"08c379a0", 0x20, 0x13, "Transaction failed." diff --git a/test/libsolidity/semanticTests/smoke/fallback.sol b/test/libsolidity/semanticTests/smoke/fallback.sol index 5a4f89d8437e..b0e515db3210 100644 --- a/test/libsolidity/semanticTests/smoke/fallback.sol +++ b/test/libsolidity/semanticTests/smoke/fallback.sol @@ -8,8 +8,6 @@ contract A { externalData = msg.data; } } -// ==== -// compileToEwasm: also // ---- // data() -> 0 // () diff --git a/test/libsolidity/semanticTests/smoke/multiline.sol b/test/libsolidity/semanticTests/smoke/multiline.sol index 97fbd5b3bee1..624b19473d36 100644 --- a/test/libsolidity/semanticTests/smoke/multiline.sol +++ b/test/libsolidity/semanticTests/smoke/multiline.sol @@ -5,7 +5,6 @@ contract C { } // ==== // allowNonExistingFunctions: true -// compileToEwasm: also // ---- // f(uint256,uint256,uint256,uint256,uint256): 1, 1, 1, 1, 1 // -> 5 diff --git a/test/libsolidity/semanticTests/smoke/multiline_comments.sol b/test/libsolidity/semanticTests/smoke/multiline_comments.sol index cdfe43f5ec23..17de40fc4dab 100644 --- a/test/libsolidity/semanticTests/smoke/multiline_comments.sol +++ b/test/libsolidity/semanticTests/smoke/multiline_comments.sol @@ -3,8 +3,6 @@ contract C { return a + b + c + d + e; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256,uint256,uint256,uint256): 1, 1, 1, 1, 1 // # A comment on the function parameters. # diff --git a/test/libsolidity/semanticTests/smoke/structs.sol b/test/libsolidity/semanticTests/smoke/structs.sol index 813d6954c0f2..d6df382c95b1 100644 --- a/test/libsolidity/semanticTests/smoke/structs.sol +++ b/test/libsolidity/semanticTests/smoke/structs.sol @@ -17,8 +17,6 @@ contract C { return T(23, 42, "any"); } } -// ==== -// compileToEwasm: also // ---- // s() -> 23, 42 // t() -> 0x20, 23, 42, 0x60, 3, "any" diff --git a/test/libsolidity/semanticTests/specialFunctions/abi_encode_with_signature_from_string.sol b/test/libsolidity/semanticTests/specialFunctions/abi_encode_with_signature_from_string.sol index f38eee42973c..80f734a31a1c 100644 --- a/test/libsolidity/semanticTests/specialFunctions/abi_encode_with_signature_from_string.sol +++ b/test/libsolidity/semanticTests/specialFunctions/abi_encode_with_signature_from_string.sol @@ -8,7 +8,5 @@ contract C { assert(r1[i] == r2[i]); } } -// ==== -// compileToEwasm: false // ---- // f() -> 0x40, 0xa0, 0x24, -813742827273327954027712588510533233455028711326166692885570228492575965184, 26959946667150639794667015087019630673637144422540572481103610249216, 0x24, -813742827273327954027712588510533233455028711326166692885570228492575965184, 26959946667150639794667015087019630673637144422540572481103610249216 diff --git a/test/libsolidity/semanticTests/specialFunctions/abi_functions_member_access.sol b/test/libsolidity/semanticTests/specialFunctions/abi_functions_member_access.sol index 4c46d1ea00d8..b255b1880b0e 100644 --- a/test/libsolidity/semanticTests/specialFunctions/abi_functions_member_access.sol +++ b/test/libsolidity/semanticTests/specialFunctions/abi_functions_member_access.sol @@ -7,7 +7,5 @@ contract C { abi.decode; } } -// ==== -// compileToEwasm: also // ---- // f() -> diff --git a/test/libsolidity/semanticTests/state/block_coinbase.sol b/test/libsolidity/semanticTests/state/block_coinbase.sol index 5087fe732369..e7aae2fc739a 100644 --- a/test/libsolidity/semanticTests/state/block_coinbase.sol +++ b/test/libsolidity/semanticTests/state/block_coinbase.sol @@ -3,8 +3,6 @@ contract C { return block.coinbase; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x7878787878787878787878787878787878787878 // f() -> 0x7878787878787878787878787878787878787878 diff --git a/test/libsolidity/semanticTests/state/block_difficulty.sol b/test/libsolidity/semanticTests/state/block_difficulty.sol index 4f6a6b08ff46..921200ddf26a 100644 --- a/test/libsolidity/semanticTests/state/block_difficulty.sol +++ b/test/libsolidity/semanticTests/state/block_difficulty.sol @@ -4,7 +4,6 @@ contract C { } } // ==== -// compileToEwasm: also // EVMVersion: 200000000 diff --git a/test/libsolidity/semanticTests/state/block_difficulty_post_paris.sol b/test/libsolidity/semanticTests/state/block_difficulty_post_paris.sol index 9fb467e6f5f1..226a8bbb8b4b 100644 --- a/test/libsolidity/semanticTests/state/block_difficulty_post_paris.sol +++ b/test/libsolidity/semanticTests/state/block_difficulty_post_paris.sol @@ -4,7 +4,6 @@ contract C { } } // ==== -// compileToEwasm: also // EVMVersion: >=paris // ---- // f() -> 0xa86c2e601b6c44eb4848f7d23d9df3113fbcac42041c49cbed5000cb4f118777 diff --git a/test/libsolidity/semanticTests/state/block_gaslimit.sol b/test/libsolidity/semanticTests/state/block_gaslimit.sol index 3ccc37543cb5..0201068b630b 100644 --- a/test/libsolidity/semanticTests/state/block_gaslimit.sol +++ b/test/libsolidity/semanticTests/state/block_gaslimit.sol @@ -3,8 +3,6 @@ contract C { return block.gaslimit; } } -// ==== -// compileToEwasm: also // ---- // f() -> 20000000 // f() -> 20000000 diff --git a/test/libsolidity/semanticTests/state/block_number.sol b/test/libsolidity/semanticTests/state/block_number.sol index a55c2a3cac22..01ec30966a3d 100644 --- a/test/libsolidity/semanticTests/state/block_number.sol +++ b/test/libsolidity/semanticTests/state/block_number.sol @@ -4,8 +4,6 @@ contract C { return block.number; } } -// ==== -// compileToEwasm: also // ---- // constructor() // f() -> 2 diff --git a/test/libsolidity/semanticTests/state/block_prevrandao.sol b/test/libsolidity/semanticTests/state/block_prevrandao.sol index 24d5f2af6350..590265da9fcd 100644 --- a/test/libsolidity/semanticTests/state/block_prevrandao.sol +++ b/test/libsolidity/semanticTests/state/block_prevrandao.sol @@ -4,7 +4,6 @@ contract C { } } // ==== -// compileToEwasm: also // EVMVersion: >=paris // ---- // f() -> 0xa86c2e601b6c44eb4848f7d23d9df3113fbcac42041c49cbed5000cb4f118777 diff --git a/test/libsolidity/semanticTests/state/block_prevrandao_pre_paris.sol b/test/libsolidity/semanticTests/state/block_prevrandao_pre_paris.sol index efc4d226f51d..6824cab5caff 100644 --- a/test/libsolidity/semanticTests/state/block_prevrandao_pre_paris.sol +++ b/test/libsolidity/semanticTests/state/block_prevrandao_pre_paris.sol @@ -4,7 +4,6 @@ contract C { } } // ==== -// compileToEwasm: also // EVMVersion: 200000000 diff --git a/test/libsolidity/semanticTests/state/block_timestamp.sol b/test/libsolidity/semanticTests/state/block_timestamp.sol index 84cfe3b9f461..485ae4be32cc 100644 --- a/test/libsolidity/semanticTests/state/block_timestamp.sol +++ b/test/libsolidity/semanticTests/state/block_timestamp.sol @@ -4,8 +4,6 @@ contract C { return block.timestamp; } } -// ==== -// compileToEwasm: also // ---- // constructor() # This is the 1st block # // f() -> 0x1e # This is the 2nd block (each block is "15 seconds") # diff --git a/test/libsolidity/semanticTests/state/gasleft.sol b/test/libsolidity/semanticTests/state/gasleft.sol index 9f50ef46dc3c..6ce623ce81ea 100644 --- a/test/libsolidity/semanticTests/state/gasleft.sol +++ b/test/libsolidity/semanticTests/state/gasleft.sol @@ -3,8 +3,6 @@ contract C { return gasleft() > 0; } } -// ==== -// compileToEwasm: also // ---- // f() -> true // f() -> true diff --git a/test/libsolidity/semanticTests/state/msg_sender.sol b/test/libsolidity/semanticTests/state/msg_sender.sol index eda4e5a059d0..951d1f529201 100644 --- a/test/libsolidity/semanticTests/state/msg_sender.sol +++ b/test/libsolidity/semanticTests/state/msg_sender.sol @@ -3,7 +3,5 @@ contract C { return msg.sender; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x1212121212121212121212121212120000000012 diff --git a/test/libsolidity/semanticTests/state/msg_sig.sol b/test/libsolidity/semanticTests/state/msg_sig.sol index 858ee98539ef..f2f26e24567f 100644 --- a/test/libsolidity/semanticTests/state/msg_sig.sol +++ b/test/libsolidity/semanticTests/state/msg_sig.sol @@ -6,8 +6,6 @@ contract C { return msg.sig; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x26121ff000000000000000000000000000000000000000000000000000000000 // g() -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/state/msg_value.sol b/test/libsolidity/semanticTests/state/msg_value.sol index 2d14d1d7b8a4..143183b865a3 100644 --- a/test/libsolidity/semanticTests/state/msg_value.sol +++ b/test/libsolidity/semanticTests/state/msg_value.sol @@ -3,8 +3,6 @@ contract C { return msg.value; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0 // f(), 12 ether -> 12000000000000000000 diff --git a/test/libsolidity/semanticTests/state/tx_gasprice.sol b/test/libsolidity/semanticTests/state/tx_gasprice.sol index 59ddfbe5cfe4..0d6dc6ae9c42 100644 --- a/test/libsolidity/semanticTests/state/tx_gasprice.sol +++ b/test/libsolidity/semanticTests/state/tx_gasprice.sol @@ -3,8 +3,6 @@ contract C { return tx.gasprice; } } -// ==== -// compileToEwasm: also // ---- // f() -> 3000000000 // f() -> 3000000000 diff --git a/test/libsolidity/semanticTests/state/tx_origin.sol b/test/libsolidity/semanticTests/state/tx_origin.sol index 838353824384..aa726c355262 100644 --- a/test/libsolidity/semanticTests/state/tx_origin.sol +++ b/test/libsolidity/semanticTests/state/tx_origin.sol @@ -3,8 +3,6 @@ contract C { return tx.origin; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x9292929292929292929292929292929292929292 // f() -> 0x9292929292929292929292929292929292929292 diff --git a/test/libsolidity/semanticTests/state/uncalled_blockhash.sol b/test/libsolidity/semanticTests/state/uncalled_blockhash.sol index 02c55c7d332b..4e2526c72846 100644 --- a/test/libsolidity/semanticTests/state/uncalled_blockhash.sol +++ b/test/libsolidity/semanticTests/state/uncalled_blockhash.sol @@ -3,7 +3,5 @@ contract C { return (blockhash)(block.number - 1); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x3737373737373737373737373737373737373737373737373737373737373738 diff --git a/test/libsolidity/semanticTests/state_var_initialization.sol b/test/libsolidity/semanticTests/state_var_initialization.sol index 93b22bfa9137..a8b0f108a868 100644 --- a/test/libsolidity/semanticTests/state_var_initialization.sol +++ b/test/libsolidity/semanticTests/state_var_initialization.sol @@ -7,8 +7,6 @@ contract C { k = k - i; } } -// ==== -// compileToEwasm: also // ---- // i() -> 2 // k() -> 0 diff --git a/test/libsolidity/semanticTests/state_variables_init_order.sol b/test/libsolidity/semanticTests/state_variables_init_order.sol index b6ac20cd0e27..6f8a59c14d37 100644 --- a/test/libsolidity/semanticTests/state_variables_init_order.sol +++ b/test/libsolidity/semanticTests/state_variables_init_order.sol @@ -8,7 +8,5 @@ contract A { } contract B is A { } -// ==== -// compileToEwasm: also // ---- // x() -> 1 diff --git a/test/libsolidity/semanticTests/state_variables_init_order_2.sol b/test/libsolidity/semanticTests/state_variables_init_order_2.sol index 95c0b420077a..9003898e6129 100644 --- a/test/libsolidity/semanticTests/state_variables_init_order_2.sol +++ b/test/libsolidity/semanticTests/state_variables_init_order_2.sol @@ -12,7 +12,5 @@ contract B is A { z = x; } } -// ==== -// compileToEwasm: also // ---- // z() -> 1 diff --git a/test/libsolidity/semanticTests/statements/do_while_loop_continue.sol b/test/libsolidity/semanticTests/statements/do_while_loop_continue.sol index 761cc76bda2b..76f2bc4ae6e4 100644 --- a/test/libsolidity/semanticTests/statements/do_while_loop_continue.sol +++ b/test/libsolidity/semanticTests/statements/do_while_loop_continue.sol @@ -10,7 +10,5 @@ contract test { return 42; } } -// ==== -// compileToEwasm: also // ---- // f() -> 42 diff --git a/test/libsolidity/semanticTests/storage/packed_functions.sol b/test/libsolidity/semanticTests/storage/packed_functions.sol index 4a49a614f3b5..564a3fabf355 100644 --- a/test/libsolidity/semanticTests/storage/packed_functions.sol +++ b/test/libsolidity/semanticTests/storage/packed_functions.sol @@ -38,7 +38,6 @@ contract C { return 8; } } - // ---- // set() -> // t1() -> 7 diff --git a/test/libsolidity/semanticTests/storage/packed_storage_overflow.sol b/test/libsolidity/semanticTests/storage/packed_storage_overflow.sol index c10931f99ddb..af2ecc70c9d5 100644 --- a/test/libsolidity/semanticTests/storage/packed_storage_overflow.sol +++ b/test/libsolidity/semanticTests/storage/packed_storage_overflow.sol @@ -11,7 +11,5 @@ contract C { return (x, c, b, a); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x1234, 0x0, 0x0, 0xfffe diff --git a/test/libsolidity/semanticTests/storage/packed_storage_signed.sol b/test/libsolidity/semanticTests/storage/packed_storage_signed.sol index b457d0731b68..92cb82c90c6f 100644 --- a/test/libsolidity/semanticTests/storage/packed_storage_signed.sol +++ b/test/libsolidity/semanticTests/storage/packed_storage_signed.sol @@ -19,8 +19,5 @@ contract C { x4 = d; } } - -// ==== -// compileToEwasm: also // ---- // test() -> -2, 4, -112, 0 diff --git a/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol b/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol index a3131d564f2a..b1686d90748d 100644 --- a/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol +++ b/test/libsolidity/semanticTests/storage/packed_storage_structs_bytes.sol @@ -40,9 +40,6 @@ contract C { y == 0x07; } } - -// ==== -// compileToEwasm: also // ---- // test() -> true // gas irOptimized: 132505 diff --git a/test/libsolidity/semanticTests/storage/packed_storage_structs_enum.sol b/test/libsolidity/semanticTests/storage/packed_storage_structs_enum.sol index d9e897762d1f..cda71d33da9f 100644 --- a/test/libsolidity/semanticTests/storage/packed_storage_structs_enum.sol +++ b/test/libsolidity/semanticTests/storage/packed_storage_structs_enum.sol @@ -28,8 +28,5 @@ contract C { return 1; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 1 diff --git a/test/libsolidity/semanticTests/storage/packed_storage_structs_uint.sol b/test/libsolidity/semanticTests/storage/packed_storage_structs_uint.sol index d01f07268534..ea3c03d64426 100644 --- a/test/libsolidity/semanticTests/storage/packed_storage_structs_uint.sol +++ b/test/libsolidity/semanticTests/storage/packed_storage_structs_uint.sol @@ -25,8 +25,5 @@ contract C { return 1; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 1 diff --git a/test/libsolidity/semanticTests/storage/simple_accessor.sol b/test/libsolidity/semanticTests/storage/simple_accessor.sol index 72398d9abba5..7aaeb4dbb98c 100644 --- a/test/libsolidity/semanticTests/storage/simple_accessor.sol +++ b/test/libsolidity/semanticTests/storage/simple_accessor.sol @@ -4,7 +4,5 @@ contract test { data = 8; } } -// ==== -// compileToEwasm: also // ---- // data() -> 8 diff --git a/test/libsolidity/semanticTests/storage/state_smoke_test.sol b/test/libsolidity/semanticTests/storage/state_smoke_test.sol index 0bcdd1ad396d..1b464531b523 100644 --- a/test/libsolidity/semanticTests/storage/state_smoke_test.sol +++ b/test/libsolidity/semanticTests/storage/state_smoke_test.sol @@ -10,8 +10,6 @@ contract test { else value2 = value; } } -// ==== -// compileToEwasm: also // ---- // get(uint8): 0x00 -> 0 // get(uint8): 0x01 -> 0 diff --git a/test/libsolidity/semanticTests/strings/concat/string_concat_empty_argument_list.sol b/test/libsolidity/semanticTests/strings/concat/string_concat_empty_argument_list.sol index b5db79e8f245..0297bd26f125 100644 --- a/test/libsolidity/semanticTests/strings/concat/string_concat_empty_argument_list.sol +++ b/test/libsolidity/semanticTests/strings/concat/string_concat_empty_argument_list.sol @@ -3,7 +3,5 @@ contract C { return string.concat(); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0 diff --git a/test/libsolidity/semanticTests/strings/concat/string_concat_empty_strings.sol b/test/libsolidity/semanticTests/strings/concat/string_concat_empty_strings.sol index f452c3b3524e..b90235b3f83f 100644 --- a/test/libsolidity/semanticTests/strings/concat/string_concat_empty_strings.sol +++ b/test/libsolidity/semanticTests/strings/concat/string_concat_empty_strings.sol @@ -18,8 +18,6 @@ contract C { return string.concat(b, "abc", b, "abc", b); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0 // g() -> 0x20, 6, "abcabc" diff --git a/test/libsolidity/semanticTests/strings/empty_string.sol b/test/libsolidity/semanticTests/strings/empty_string.sol index d1a6fc5849e8..f023c7236913 100644 --- a/test/libsolidity/semanticTests/strings/empty_string.sol +++ b/test/libsolidity/semanticTests/strings/empty_string.sol @@ -3,7 +3,5 @@ contract C { return ""; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0 diff --git a/test/libsolidity/semanticTests/strings/return_string.sol b/test/libsolidity/semanticTests/strings/return_string.sol index 4393d7dcc788..704a7859cdd5 100644 --- a/test/libsolidity/semanticTests/strings/return_string.sol +++ b/test/libsolidity/semanticTests/strings/return_string.sol @@ -10,8 +10,6 @@ contract Main { r = s; } } -// ==== -// compileToEwasm: also // ---- // set(string): 0x20, 5, "Julia" -> // get1() -> 0x20, 5, "Julia" diff --git a/test/libsolidity/semanticTests/strings/string_escapes.sol b/test/libsolidity/semanticTests/strings/string_escapes.sol index 3ccae698f065..ea178d645e47 100644 --- a/test/libsolidity/semanticTests/strings/string_escapes.sol +++ b/test/libsolidity/semanticTests/strings/string_escapes.sol @@ -4,7 +4,5 @@ contract test { return escapeCharacters; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x090a0d27225c0000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/strings/unicode_escapes.sol b/test/libsolidity/semanticTests/strings/unicode_escapes.sol index 95c322f5b28f..401d8b61e4ec 100644 --- a/test/libsolidity/semanticTests/strings/unicode_escapes.sol +++ b/test/libsolidity/semanticTests/strings/unicode_escapes.sol @@ -15,8 +15,6 @@ contract C { return "\u0024\u00A2\u20AC"; } } -// ==== -// compileToEwasm: also // ---- // oneByteUTF8() -> 0x20, 7, "aaa$aaa" // twoBytesUTF8() -> 0x20, 8, "aaa\xc2\xa2aaa" diff --git a/test/libsolidity/semanticTests/strings/unicode_string.sol b/test/libsolidity/semanticTests/strings/unicode_string.sol index 516febe6ed55..e06556fb5466 100644 --- a/test/libsolidity/semanticTests/strings/unicode_string.sol +++ b/test/libsolidity/semanticTests/strings/unicode_string.sol @@ -7,8 +7,6 @@ contract C { and 😈"; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0x14, "\xf0\x9f\x98\x83, \xf0\x9f\x98\xad, and \xf0\x9f\x98\x88" // g() -> 0x20, 0x14, "\xf0\x9f\x98\x83, \xf0\x9f\x98\xad, and \xf0\x9f\x98\x88" diff --git a/test/libsolidity/semanticTests/structs/array_of_recursive_struct.sol b/test/libsolidity/semanticTests/structs/array_of_recursive_struct.sol index f62f4c084528..f5f53cc40d06 100644 --- a/test/libsolidity/semanticTests/structs/array_of_recursive_struct.sol +++ b/test/libsolidity/semanticTests/structs/array_of_recursive_struct.sol @@ -8,7 +8,5 @@ contract Test { assert(val[0].vals.length == 42); } } -// ==== -// compileToEwasm: also // ---- // func() -> diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct.sol index ca635aeb4351..418f9e93a8f6 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct.sol @@ -12,8 +12,5 @@ contract C { b = s.b; } } - -// ==== -// compileToEwasm: also // ---- // f((uint256,uint256)): 42, 23 -> 42, 23 diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_and_ints.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_and_ints.sol index 144df2d61688..5bdd1b42fb94 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_and_ints.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_and_ints.sol @@ -15,6 +15,5 @@ contract C { return (a, s.a, s.b, b); } } - // ---- // f(uint256,(uint256,uint256),uint256): 1, 2, 3, 4 -> 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_array_member_dynamic.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_array_member_dynamic.sol index e6972e03f34b..14f770a35070 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_array_member_dynamic.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_array_member_dynamic.sol @@ -18,7 +18,5 @@ contract C { c = s.c; } } -// ==== -// compileToEwasm: also // ---- // f((uint32,uint256[],uint64)): 0x20, 42, 0x60, 23, 2, 1, 2 -> 42, 1, 2, 23 diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_memory.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_memory.sol index 76e6f7c1d880..3aeb0dcbca27 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_memory.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_memory.sol @@ -12,8 +12,5 @@ contract C { return (m.a, m.b, m.c[1]); } } - -// ==== -// compileToEwasm: also // ---- // f((uint256,uint256,bytes2)): 42, 23, "ab" -> 42, 23, "b" diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_storage.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_storage.sol index 74d30f5052e3..6b56a73c2ca8 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_storage.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_to_storage.sol @@ -15,8 +15,5 @@ contract C { return (s.a, s.b, s.c[1]); } } - -// ==== -// compileToEwasm: also // ---- // f(uint32,(uint256,uint64,bytes2),uint256): 1, 42, 23, "ab", 1 -> 42, 23, "b" diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_array_to_memory.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_array_to_memory.sol index 7ae085dbb5b3..b7b3058b4259 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_array_to_memory.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_array_to_memory.sol @@ -16,6 +16,5 @@ contract C { return (m.a, m.b[0], m.b[1], m.c); } } - // ---- // f((uint256,uint256[2],uint256)): 42, 1, 2, 23 -> 42, 1, 2, 23 diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_bytes_to_memory.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_bytes_to_memory.sol index 0adc4c5a7be6..3fa7a33fda6e 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_bytes_to_memory.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_struct_with_bytes_to_memory.sol @@ -16,6 +16,5 @@ contract C { return (m.a, m.b[0], m.b[1], m.c); } } - // ---- // f((uint256,bytes,uint256)): 0x20, 42, 0x60, 23, 2, "ab" -> 42, "a", "b", 23 diff --git a/test/libsolidity/semanticTests/structs/calldata/calldata_structs.sol b/test/libsolidity/semanticTests/structs/calldata/calldata_structs.sol index 6092b161d926..b73077131295 100644 --- a/test/libsolidity/semanticTests/structs/calldata/calldata_structs.sol +++ b/test/libsolidity/semanticTests/structs/calldata/calldata_structs.sol @@ -22,8 +22,5 @@ contract C { e = s3.b; } } - -// ==== -// compileToEwasm: also // ---- // f((uint256,uint256),(uint256),(uint256,uint256)): 1, 2, 3, 4, 5 -> 1, 2, 3, 4, 5 diff --git a/test/libsolidity/semanticTests/structs/calldata/dynamic_nested.sol b/test/libsolidity/semanticTests/structs/calldata/dynamic_nested.sol index 2b7544139403..633c4c7b321f 100644 --- a/test/libsolidity/semanticTests/structs/calldata/dynamic_nested.sol +++ b/test/libsolidity/semanticTests/structs/calldata/dynamic_nested.sol @@ -7,7 +7,5 @@ contract C { return (s.children.length, s.a, s.children[0].b, s.children[1].b); } } -// ==== -// compileToEwasm: also // ---- // f((uint256,(uint256)[])): 32, 17, 64, 2, 23, 42 -> 2, 17, 23, 42 diff --git a/test/libsolidity/semanticTests/structs/calldata/dynamically_encoded.sol b/test/libsolidity/semanticTests/structs/calldata/dynamically_encoded.sol index b4beff94169d..0dfa2cea3f53 100644 --- a/test/libsolidity/semanticTests/structs/calldata/dynamically_encoded.sol +++ b/test/libsolidity/semanticTests/structs/calldata/dynamically_encoded.sol @@ -6,7 +6,5 @@ contract C { return (s.a.length, s.a[0], s.a[1]); } } -// ==== -// compileToEwasm: also // ---- // f((uint256[])): 32, 32, 2, 42, 23 -> 2, 42, 23 diff --git a/test/libsolidity/semanticTests/structs/copy_from_mapping.sol b/test/libsolidity/semanticTests/structs/copy_from_mapping.sol index 9aa41a34255b..df118de3231d 100644 --- a/test/libsolidity/semanticTests/structs/copy_from_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_from_mapping.sol @@ -34,7 +34,6 @@ contract C { } } - // ---- // to_state() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 // gas irOptimized: 121497 diff --git a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_memory.sol b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_memory.sol index 8ccc30936e8f..6c22c71da8c8 100644 --- a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_memory.sol +++ b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_memory.sol @@ -10,7 +10,6 @@ contract C { return s; } } - // ---- // test((uint8[1],uint8[])): 0x20, 3, 0x40, 2, 7, 11 -> 0x20, 3, 0x40, 2, 7, 11 // test((uint8[1],uint8[])): 0x20, 3, 0x40, 3, 17, 19, 23 -> 0x20, 3, 0x40, 3, 17, 19, 23 diff --git a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_storage.sol b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_storage.sol index fa67deb2c0d1..dcf2a3a27720 100644 --- a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_calldata_to_storage.sol @@ -17,6 +17,5 @@ contract C { require(s.y[1] == 11); } } - // ---- // test((uint8[1],uint8[])): 0x20, 3, 0x40, 2, 7, 11 diff --git a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_memory_to_memory.sol b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_memory_to_memory.sol index c340289adf44..3d132641f4f9 100644 --- a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_memory_to_memory.sol +++ b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_memory_to_memory.sol @@ -10,7 +10,6 @@ contract C { return r; } } - // ---- // test((uint8[1],uint8[])): 0x20, 3, 0x40, 2, 7, 11 -> 0x20, 0, 0x40, 0 // test((uint8[1],uint8[])): 0x20, 3, 0x40, 3, 17, 19, 23 -> 0x20, 0, 0x40, 0 diff --git a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_storage_to_storage.sol b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_storage_to_storage.sol index 3f29790d8356..880b7433dd2d 100644 --- a/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_storage_to_storage.sol +++ b/test/libsolidity/semanticTests/structs/copy_struct_with_nested_array_from_storage_to_storage.sol @@ -22,6 +22,5 @@ contract C { require(dst.y[1] == 11); } } - // ---- // test() diff --git a/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol b/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol index 29618bb044b6..66954a7f5c16 100644 --- a/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_substructures_from_mapping.sol @@ -42,7 +42,6 @@ contract C { } } - // ---- // to_state() -> 0x20, 0x60, 0xa0, 7, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 // gas irOptimized: 121598 diff --git a/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol b/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol index ec989b508ef6..065187cdc348 100644 --- a/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_substructures_to_mapping.sol @@ -50,7 +50,6 @@ contract C { return m[2]; } } - // ---- // from_memory() -> 0x20, 0x60, 0xa0, 0x15, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 // gas irOptimized: 123029 diff --git a/test/libsolidity/semanticTests/structs/copy_to_mapping.sol b/test/libsolidity/semanticTests/structs/copy_to_mapping.sol index e5c02001fe13..5b99efc6477d 100644 --- a/test/libsolidity/semanticTests/structs/copy_to_mapping.sol +++ b/test/libsolidity/semanticTests/structs/copy_to_mapping.sol @@ -43,7 +43,6 @@ contract C { return m[3]; } } - // ---- // from_state() -> 0x20, 0x60, 0xa0, 21, 3, 0x666F6F0000000000000000000000000000000000000000000000000000000000, 2, 13, 14 // gas irOptimized: 121693 diff --git a/test/libsolidity/semanticTests/structs/global.sol b/test/libsolidity/semanticTests/structs/global.sol index d51194ca0a8c..052122538eb9 100644 --- a/test/libsolidity/semanticTests/structs/global.sol +++ b/test/libsolidity/semanticTests/structs/global.sol @@ -6,7 +6,5 @@ contract C { return (s.a, s.b); } } -// ==== -// compileToEwasm: also // ---- // f((uint256,uint256)): 42, 23 -> 42, 23 diff --git a/test/libsolidity/semanticTests/structs/lone_struct_array_type.sol b/test/libsolidity/semanticTests/structs/lone_struct_array_type.sol index fe6de19f4698..9434e40454f8 100644 --- a/test/libsolidity/semanticTests/structs/lone_struct_array_type.sol +++ b/test/libsolidity/semanticTests/structs/lone_struct_array_type.sol @@ -9,8 +9,5 @@ contract C { return 3; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 3 diff --git a/test/libsolidity/semanticTests/structs/memory_struct_named_constructor.sol b/test/libsolidity/semanticTests/structs/memory_struct_named_constructor.sol index 445961e2da3c..f844c08fac01 100644 --- a/test/libsolidity/semanticTests/structs/memory_struct_named_constructor.sol +++ b/test/libsolidity/semanticTests/structs/memory_struct_named_constructor.sol @@ -11,8 +11,5 @@ contract C { return S({x: true, a: 8}); } } - -// ==== -// compileToEwasm: also // ---- // s() -> 8, true diff --git a/test/libsolidity/semanticTests/structs/memory_structs_as_function_args.sol b/test/libsolidity/semanticTests/structs/memory_structs_as_function_args.sol index a76518684b5f..96b9569920ea 100644 --- a/test/libsolidity/semanticTests/structs/memory_structs_as_function_args.sol +++ b/test/libsolidity/semanticTests/structs/memory_structs_as_function_args.sol @@ -27,8 +27,5 @@ contract Test { s.z = z; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 1, 2, 3 diff --git a/test/libsolidity/semanticTests/structs/memory_structs_nested.sol b/test/libsolidity/semanticTests/structs/memory_structs_nested.sol index 3fee9b210528..e541fa975733 100644 --- a/test/libsolidity/semanticTests/structs/memory_structs_nested.sol +++ b/test/libsolidity/semanticTests/structs/memory_structs_nested.sol @@ -37,8 +37,5 @@ contract Test { s.s.z = z; } } - -// ==== -// compileToEwasm: also // ---- // test() -> 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol b/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol index 12b514a23c6a..3089f97b52ac 100644 --- a/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol +++ b/test/libsolidity/semanticTests/structs/memory_structs_nested_load.sol @@ -64,8 +64,6 @@ contract Test { a2 = m_x.a[1]; } } -// ==== -// compileToEwasm: also // ---- // load() -> 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 // gas irOptimized: 110326 diff --git a/test/libsolidity/semanticTests/structs/memory_structs_read_write.sol b/test/libsolidity/semanticTests/structs/memory_structs_read_write.sol index 5cafe53232bd..fe319d19df26 100644 --- a/test/libsolidity/semanticTests/structs/memory_structs_read_write.sol +++ b/test/libsolidity/semanticTests/structs/memory_structs_read_write.sol @@ -49,9 +49,6 @@ contract Test { a = s.a[1]; } } - -// ==== -// compileToEwasm: also // ---- // testInit() -> 0, 0, 0, 0, true // testCopyRead() -> 1, 2, 3, 4 diff --git a/test/libsolidity/semanticTests/structs/multislot_struct_allocation.sol b/test/libsolidity/semanticTests/structs/multislot_struct_allocation.sol index 3336b30b1ca7..648c962cf9b8 100644 --- a/test/libsolidity/semanticTests/structs/multislot_struct_allocation.sol +++ b/test/libsolidity/semanticTests/structs/multislot_struct_allocation.sol @@ -15,8 +15,5 @@ contract C { return s.a.x(1); } } - - - // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/structs/nested_struct_allocation.sol b/test/libsolidity/semanticTests/structs/nested_struct_allocation.sol index 64328b2dee87..0037d9573e8a 100644 --- a/test/libsolidity/semanticTests/structs/nested_struct_allocation.sol +++ b/test/libsolidity/semanticTests/structs/nested_struct_allocation.sol @@ -12,7 +12,5 @@ contract C { return s.a.b; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/structs/recursive_structs.sol b/test/libsolidity/semanticTests/structs/recursive_structs.sol index 58f178e5ec52..f8944f11f355 100644 --- a/test/libsolidity/semanticTests/structs/recursive_structs.sol +++ b/test/libsolidity/semanticTests/structs/recursive_structs.sol @@ -14,8 +14,5 @@ contract C { return 1; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/structs/simple_struct_allocation.sol b/test/libsolidity/semanticTests/structs/simple_struct_allocation.sol index c05d87b37c54..e45626d3168c 100644 --- a/test/libsolidity/semanticTests/structs/simple_struct_allocation.sol +++ b/test/libsolidity/semanticTests/structs/simple_struct_allocation.sol @@ -8,7 +8,5 @@ contract C { return s.a; } } -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/structs/struct_assign_reference_to_struct.sol b/test/libsolidity/semanticTests/structs/struct_assign_reference_to_struct.sol index 357863abb48d..47b9a9ece202 100644 --- a/test/libsolidity/semanticTests/structs/struct_assign_reference_to_struct.sol +++ b/test/libsolidity/semanticTests/structs/struct_assign_reference_to_struct.sol @@ -31,8 +31,5 @@ contract test { ret_global1 = data1.m_value; // = 3. Changed due to the assignment to x.m_value } } - -// ==== -// compileToEwasm: also // ---- // assign() -> 2, 2, 3, 3 diff --git a/test/libsolidity/semanticTests/structs/struct_copy.sol b/test/libsolidity/semanticTests/structs/struct_copy.sol index 956416a967e6..6da42ebec7d4 100644 --- a/test/libsolidity/semanticTests/structs/struct_copy.sol +++ b/test/libsolidity/semanticTests/structs/struct_copy.sol @@ -33,7 +33,6 @@ contract c { c = data[k].c; } } - // ---- // set(uint256): 7 -> true // gas irOptimized: 109896 diff --git a/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol b/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol index 53d1ca93a9d7..22d9dd29deb5 100644 --- a/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol +++ b/test/libsolidity/semanticTests/structs/struct_copy_via_local.sol @@ -15,9 +15,6 @@ contract c { return data2.a == data1.a && data2.b == data1.b; } } - -// ==== -// compileToEwasm: also // ---- // test() -> true // gas irOptimized: 109713 diff --git a/test/libsolidity/semanticTests/structs/struct_delete_member.sol b/test/libsolidity/semanticTests/structs/struct_delete_member.sol index c881d8a9367c..7f991f401bc5 100644 --- a/test/libsolidity/semanticTests/structs/struct_delete_member.sol +++ b/test/libsolidity/semanticTests/structs/struct_delete_member.sol @@ -15,8 +15,5 @@ contract test { ret_value = data1.m_value; } } - -// ==== -// compileToEwasm: also // ---- // deleteMember() -> 0 diff --git a/test/libsolidity/semanticTests/structs/struct_delete_storage.sol b/test/libsolidity/semanticTests/structs/struct_delete_storage.sol index 776ceddc6e4f..31558cfbe288 100644 --- a/test/libsolidity/semanticTests/structs/struct_delete_storage.sol +++ b/test/libsolidity/semanticTests/structs/struct_delete_storage.sol @@ -17,7 +17,5 @@ contract C { assert(a == 17); } } -// ==== -// compileToEwasm: also // ---- // f() -> diff --git a/test/libsolidity/semanticTests/structs/struct_delete_storage_small.sol b/test/libsolidity/semanticTests/structs/struct_delete_storage_small.sol index 21140e45eec8..046e4ec6d6b6 100644 --- a/test/libsolidity/semanticTests/structs/struct_delete_storage_small.sol +++ b/test/libsolidity/semanticTests/structs/struct_delete_storage_small.sol @@ -19,7 +19,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> 0 diff --git a/test/libsolidity/semanticTests/structs/struct_delete_struct_in_mapping.sol b/test/libsolidity/semanticTests/structs/struct_delete_struct_in_mapping.sol index b5c8a2cfa622..ae21f6f865b8 100644 --- a/test/libsolidity/semanticTests/structs/struct_delete_struct_in_mapping.sol +++ b/test/libsolidity/semanticTests/structs/struct_delete_struct_in_mapping.sol @@ -13,6 +13,5 @@ contract test { return campaigns[0].m_value; } } - // ---- // deleteIt() -> 0 diff --git a/test/libsolidity/semanticTests/structs/struct_memory_to_storage.sol b/test/libsolidity/semanticTests/structs/struct_memory_to_storage.sol index 66657fc6764c..290c812ccdca 100644 --- a/test/libsolidity/semanticTests/structs/struct_memory_to_storage.sol +++ b/test/libsolidity/semanticTests/structs/struct_memory_to_storage.sol @@ -21,8 +21,5 @@ contract C { return (x.s.a, x.s.b, x.s.c); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 42, 23, 34 diff --git a/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol b/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol index 46094d3766d6..c19875062f9b 100644 --- a/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol +++ b/test/libsolidity/semanticTests/structs/struct_memory_to_storage_function_ptr.sol @@ -26,9 +26,6 @@ contract C { return x.s.a; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 42, 23, 34, 42, 42 // gas irOptimized: 110388 diff --git a/test/libsolidity/semanticTests/structs/struct_named_constructor.sol b/test/libsolidity/semanticTests/structs/struct_named_constructor.sol index 2433da86664f..f16f61e3213e 100644 --- a/test/libsolidity/semanticTests/structs/struct_named_constructor.sol +++ b/test/libsolidity/semanticTests/structs/struct_named_constructor.sol @@ -9,8 +9,5 @@ contract C { s = S({x: true, a: 1}); } } - -// ==== -// compileToEwasm: also // ---- // s() -> 1, true diff --git a/test/libsolidity/semanticTests/structs/struct_referencing.sol b/test/libsolidity/semanticTests/structs/struct_referencing.sol index cbe8a72bfc78..93fad63befcf 100644 --- a/test/libsolidity/semanticTests/structs/struct_referencing.sol +++ b/test/libsolidity/semanticTests/structs/struct_referencing.sol @@ -45,8 +45,6 @@ contract C is I { function a1() public pure returns (uint) { S memory s; return L.a(s); } function a2() public pure returns (uint) { L.S memory s; return L.a(s); } } -// ==== -// compileToEwasm: false // ---- // library: L // f() -> 1 diff --git a/test/libsolidity/semanticTests/structs/struct_storage_to_memory.sol b/test/libsolidity/semanticTests/structs/struct_storage_to_memory.sol index 8b9035d188f6..26862fd008fc 100644 --- a/test/libsolidity/semanticTests/structs/struct_storage_to_memory.sol +++ b/test/libsolidity/semanticTests/structs/struct_storage_to_memory.sol @@ -19,8 +19,5 @@ contract C { return (m.s.a, m.s.b, m.s.c); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 42, 23, 34 diff --git a/test/libsolidity/semanticTests/structs/struct_storage_to_memory_function_ptr.sol b/test/libsolidity/semanticTests/structs/struct_storage_to_memory_function_ptr.sol index c3aa23c3be85..5ec25fb3632c 100644 --- a/test/libsolidity/semanticTests/structs/struct_storage_to_memory_function_ptr.sol +++ b/test/libsolidity/semanticTests/structs/struct_storage_to_memory_function_ptr.sol @@ -25,8 +25,5 @@ contract C { return x.s.a; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 42, 23, 34, 42, 42 diff --git a/test/libsolidity/semanticTests/structs/using_for_function_on_struct.sol b/test/libsolidity/semanticTests/structs/using_for_function_on_struct.sol index f97935fb67e1..7b51b59fcf0a 100644 --- a/test/libsolidity/semanticTests/structs/using_for_function_on_struct.sol +++ b/test/libsolidity/semanticTests/structs/using_for_function_on_struct.sol @@ -7,8 +7,6 @@ contract C { return x.mul(a); } } -// ==== -// compileToEwasm: false // ---- // library: D // f(uint256): 7 -> 0x15 diff --git a/test/libsolidity/semanticTests/types/assign_calldata_value_type.sol b/test/libsolidity/semanticTests/types/assign_calldata_value_type.sol index 04724f4c794f..8350628e4764 100644 --- a/test/libsolidity/semanticTests/types/assign_calldata_value_type.sol +++ b/test/libsolidity/semanticTests/types/assign_calldata_value_type.sol @@ -5,7 +5,5 @@ contract C { return (x, b); } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 23 -> 42, 23 diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_greater_size.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_greater_size.sol index 09558a697b07..fdfafa9e2a34 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_greater_size.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_greater_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes4(input); } } -// ==== -// compileToEwasm: also // ---- // bytesToBytes(bytes2): "ab" -> "ab" diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_same_size.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_same_size.sol index 5417800271c3..5c9a6cdc5ac3 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_same_size.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_same_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes4(input); } } -// ==== -// compileToEwasm: also // ---- // bytesToBytes(bytes4): "abcd" -> "abcd" diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_smaller_size.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_smaller_size.sol index 5868492940cf..2052c9da9278 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_smaller_size.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_fixed_bytes_smaller_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes2(input); } } -// ==== -// compileToEwasm: also // ---- // bytesToBytes(bytes4): "abcd" -> "ab" diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_greater_size.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_greater_size.sol index 93906e6e0e93..b0ab07f549f2 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_greater_size.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_greater_size.sol @@ -3,7 +3,5 @@ contract Test { return uint64(uint32(s)); } } -// ==== -// compileToEwasm: also // ---- // bytesToUint(bytes4): "abcd" -> 0x61626364 diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_min_size.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_min_size.sol index 52a99511d1cf..ff1dfebfd657 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_min_size.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_min_size.sol @@ -3,7 +3,5 @@ contract Test { return uint8(s); } } -// ==== -// compileToEwasm: also // ---- // bytesToUint(bytes1): "a" -> 0x61 diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_type.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_type.sol index e13f99cd6016..390bf4b01d51 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_type.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_same_type.sol @@ -3,7 +3,5 @@ contract Test { return uint(s); } } -// ==== -// compileToEwasm: also // ---- // bytesToUint(bytes32): "abc2" -> left(0x61626332) diff --git a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_smaller_size.sol b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_smaller_size.sol index aae1576e5a69..eb450993e492 100644 --- a/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_smaller_size.sol +++ b/test/libsolidity/semanticTests/types/convert_fixed_bytes_to_uint_smaller_size.sol @@ -3,7 +3,5 @@ contract Test { return uint16(uint32(s)); } } -// ==== -// compileToEwasm: also // ---- // bytesToUint(bytes4): "abcd" -> 0x6364 diff --git a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_greater_size.sol b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_greater_size.sol index cf170a2aaf34..9949b477b290 100644 --- a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_greater_size.sol +++ b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_greater_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes8(uint64(h)); } } -// ==== -// compileToEwasm: also // ---- // UintToBytes(uint16): 0x6162 -> "\x00\x00\x00\x00\x00\x00ab" diff --git a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_min_size.sol b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_min_size.sol index 18a09dfe549a..60b9a4cf0105 100644 --- a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_min_size.sol +++ b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_min_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes1(h); } } -// ==== -// compileToEwasm: also // ---- // UintToBytes(uint8): 0x61 -> "a" diff --git a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_size.sol b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_size.sol index 10c3a351dec1..5662d909e6f0 100644 --- a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_size.sol +++ b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_same_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes32(h); } } -// ==== -// compileToEwasm: also // ---- // uintToBytes(uint256): left(0x616263) -> left(0x616263) diff --git a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_smaller_size.sol b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_smaller_size.sol index 8abc70d3d313..963cbc3427fa 100644 --- a/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_smaller_size.sol +++ b/test/libsolidity/semanticTests/types/convert_uint_to_fixed_bytes_smaller_size.sol @@ -3,7 +3,5 @@ contract Test { return bytes2(uint16(h)); } } -// ==== -// compileToEwasm: also // ---- // uintToBytes(uint32): 0x61626364 -> "cd" diff --git a/test/libsolidity/semanticTests/types/external_function_to_address.sol b/test/libsolidity/semanticTests/types/external_function_to_address.sol index d2f5523b170f..fb938d37aaca 100644 --- a/test/libsolidity/semanticTests/types/external_function_to_address.sol +++ b/test/libsolidity/semanticTests/types/external_function_to_address.sol @@ -6,8 +6,6 @@ contract C { return cb.address; } } -// ==== -// compileToEwasm: also // ---- // f() -> true // g(function): hex"00000000000000000000000000000000000004226121ff00000000000000000" -> 0x42 diff --git a/test/libsolidity/semanticTests/types/mapping/copy_from_mapping_to_mapping.sol b/test/libsolidity/semanticTests/types/mapping/copy_from_mapping_to_mapping.sol index daf5d000c864..b17ba6d9160b 100644 --- a/test/libsolidity/semanticTests/types/mapping/copy_from_mapping_to_mapping.sol +++ b/test/libsolidity/semanticTests/types/mapping/copy_from_mapping_to_mapping.sol @@ -27,7 +27,6 @@ contract C { return dst[0]; } } - // ---- // f() -> 0x20, 7, 8, 9, 0xa0, 13, 2, 0x40, 0xa0, 2, 3, 4, 2, 3, 4 // gas irOptimized: 197082 diff --git a/test/libsolidity/semanticTests/types/mapping/copy_struct_to_array_stored_in_mapping.sol b/test/libsolidity/semanticTests/types/mapping/copy_struct_to_array_stored_in_mapping.sol index 26a33682d5c3..43f2a80fc79a 100644 --- a/test/libsolidity/semanticTests/types/mapping/copy_struct_to_array_stored_in_mapping.sol +++ b/test/libsolidity/semanticTests/types/mapping/copy_struct_to_array_stored_in_mapping.sol @@ -47,7 +47,6 @@ contract C { return m2[0]; } } - // ---- // from_storage_to_static_array() -> 0, 7 // from_storage_to_dynamic_array() -> 0x20, 1, 7 diff --git a/test/libsolidity/semanticTests/types/mapping/user_defined_types_mapping_storage.sol b/test/libsolidity/semanticTests/types/mapping/user_defined_types_mapping_storage.sol index ef092f3ea6b9..a8a8fca44cec 100644 --- a/test/libsolidity/semanticTests/types/mapping/user_defined_types_mapping_storage.sol +++ b/test/libsolidity/semanticTests/types/mapping/user_defined_types_mapping_storage.sol @@ -19,7 +19,6 @@ contract C { return uintMap[3] == 4; } } - // ---- // library: L // testAB() -> true diff --git a/test/libsolidity/semanticTests/types/nested_tuples.sol b/test/libsolidity/semanticTests/types/nested_tuples.sol index c3e96240a5cf..32203a9cbed7 100644 --- a/test/libsolidity/semanticTests/types/nested_tuples.sol +++ b/test/libsolidity/semanticTests/types/nested_tuples.sol @@ -26,8 +26,6 @@ contract test { return a; } } -// ==== -// compileToEwasm: also // ---- // f0() -> 2, true // f1() -> 1 diff --git a/test/libsolidity/semanticTests/types/packing_signed_types.sol b/test/libsolidity/semanticTests/types/packing_signed_types.sol index 392a52f2cf5f..2d2e0e16e608 100644 --- a/test/libsolidity/semanticTests/types/packing_signed_types.sol +++ b/test/libsolidity/semanticTests/types/packing_signed_types.sol @@ -4,7 +4,5 @@ contract test { return int8(x); } } -// ==== -// compileToEwasm: also // ---- // run() -> 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa diff --git a/test/libsolidity/semanticTests/types/packing_unpacking_types.sol b/test/libsolidity/semanticTests/types/packing_unpacking_types.sol index 7d12c47a44f0..8b500cca1351 100644 --- a/test/libsolidity/semanticTests/types/packing_unpacking_types.sol +++ b/test/libsolidity/semanticTests/types/packing_unpacking_types.sol @@ -5,8 +5,6 @@ contract test { y = y * 0x10000000000000000 | ~c; } } -// ==== -// compileToEwasm: also // ---- // run(bool,uint32,uint64): true, 0x0f0f0f0f, 0xf0f0f0f0f0f0f0f0 // -> 0x0000000000000000000000000000000000000001f0f0f0f00f0f0f0f0f0f0f0f diff --git a/test/libsolidity/semanticTests/types/strings.sol b/test/libsolidity/semanticTests/types/strings.sol index 9242eca2e099..f76116bba319 100644 --- a/test/libsolidity/semanticTests/types/strings.sol +++ b/test/libsolidity/semanticTests/types/strings.sol @@ -10,9 +10,6 @@ contract test { large = small; } } - -// ==== -// compileToEwasm: also // ---- // fixedBytesHex() -> "\xaa\xbb\x00\xff" // fixedBytes() -> "abc\x00\xff__" diff --git a/test/libsolidity/semanticTests/types/tuple_assign_multi_slot_grow.sol b/test/libsolidity/semanticTests/types/tuple_assign_multi_slot_grow.sol index 5ac35853bfd1..6574dcb59771 100644 --- a/test/libsolidity/semanticTests/types/tuple_assign_multi_slot_grow.sol +++ b/test/libsolidity/semanticTests/types/tuple_assign_multi_slot_grow.sol @@ -7,7 +7,5 @@ contract C { } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x30, 0x31, 0x32 diff --git a/test/libsolidity/semanticTests/types/type_conversion_cleanup.sol b/test/libsolidity/semanticTests/types/type_conversion_cleanup.sol index 320290c9f3a4..d3d2b01bbcb4 100644 --- a/test/libsolidity/semanticTests/types/type_conversion_cleanup.sol +++ b/test/libsolidity/semanticTests/types/type_conversion_cleanup.sol @@ -1,7 +1,5 @@ contract Test { function test() public returns (uint ret) { return uint(uint160(address(uint160(uint128(type(uint200).max))))); } } -// ==== -// compileToEwasm: also // ---- // test() -> 0xffffffffffffffffffffffffffffffff diff --git a/test/libsolidity/semanticTests/underscore/as_function.sol b/test/libsolidity/semanticTests/underscore/as_function.sol index 8f9fe0b5978d..be60a01bc351 100644 --- a/test/libsolidity/semanticTests/underscore/as_function.sol +++ b/test/libsolidity/semanticTests/underscore/as_function.sol @@ -12,8 +12,6 @@ contract C { return 33; } } -// ==== -// compileToEwasm: also // ---- // _() -> 88 // g() -> 88 diff --git a/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidInConstructor.sol b/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidInConstructor.sol index e2551a2a8f5b..e4e6453c5e15 100644 --- a/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidInConstructor.sol +++ b/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidInConstructor.sol @@ -19,7 +19,5 @@ contract Test { new C(); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidStoredInConstructor.sol b/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidStoredInConstructor.sol index 209ad8bb2487..fbaca1a67a33 100644 --- a/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidStoredInConstructor.sol +++ b/test/libsolidity/semanticTests/uninitializedFunctionPointer/invalidStoredInConstructor.sol @@ -19,7 +19,5 @@ contract Test { new C(); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/uninitializedFunctionPointer/store2.sol b/test/libsolidity/semanticTests/uninitializedFunctionPointer/store2.sol index 0f446f775b0e..1c1e596abd64 100644 --- a/test/libsolidity/semanticTests/uninitializedFunctionPointer/store2.sol +++ b/test/libsolidity/semanticTests/uninitializedFunctionPointer/store2.sol @@ -35,7 +35,5 @@ contract InvalidTest { x++; } } -// ==== -// compileToEwasm: also // ---- // run() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/uninitializedFunctionPointer/storeInConstructor.sol b/test/libsolidity/semanticTests/uninitializedFunctionPointer/storeInConstructor.sol index e534e42313b2..08a96792c2ad 100644 --- a/test/libsolidity/semanticTests/uninitializedFunctionPointer/storeInConstructor.sol +++ b/test/libsolidity/semanticTests/uninitializedFunctionPointer/storeInConstructor.sol @@ -14,8 +14,6 @@ contract InvalidTest { storedFn(); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x51 // f() -> FAILURE, hex"4e487b71", 0x51 diff --git a/test/libsolidity/semanticTests/uninitializedFunctionPointer/uninitialized_internal_storage_function_via_yul.sol b/test/libsolidity/semanticTests/uninitializedFunctionPointer/uninitialized_internal_storage_function_via_yul.sol index 1c69ffef23e0..bf8eab8ced87 100644 --- a/test/libsolidity/semanticTests/uninitializedFunctionPointer/uninitialized_internal_storage_function_via_yul.sol +++ b/test/libsolidity/semanticTests/uninitializedFunctionPointer/uninitialized_internal_storage_function_via_yul.sol @@ -13,6 +13,5 @@ contract Test { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/userDefinedValueType/cleanup.sol b/test/libsolidity/semanticTests/userDefinedValueType/cleanup.sol index cc5304ed752b..cc165e879e5b 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/cleanup.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/cleanup.sol @@ -33,7 +33,6 @@ contract C { return (a, b, c); } } - // ---- // ret() -> 0xff // f(uint8): 0x1ff -> FAILURE diff --git a/test/libsolidity/semanticTests/userDefinedValueType/cleanup_abicoderv1.sol b/test/libsolidity/semanticTests/userDefinedValueType/cleanup_abicoderv1.sol index f5de5e5010b1..727c66063333 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/cleanup_abicoderv1.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/cleanup_abicoderv1.sol @@ -33,7 +33,6 @@ contract C { return (a, b, c); } } - // ==== // compileViaYul: false // ---- diff --git a/test/libsolidity/semanticTests/userDefinedValueType/conversion.sol b/test/libsolidity/semanticTests/userDefinedValueType/conversion.sol index bcdc9440e999..24b316f9cf4a 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/conversion.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/conversion.sol @@ -27,7 +27,6 @@ contract C { return MyUInt8.wrap(uint8(MyUInt16.unwrap(a))); } } - // ---- // f(uint256): 1 -> 1 // f(uint256): 2 -> 2 diff --git a/test/libsolidity/semanticTests/userDefinedValueType/conversion_abicoderv1.sol b/test/libsolidity/semanticTests/userDefinedValueType/conversion_abicoderv1.sol index af91aab0c453..e8fbfb246036 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/conversion_abicoderv1.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/conversion_abicoderv1.sol @@ -27,7 +27,6 @@ contract C { return MyUInt8.wrap(uint8(MyUInt16.unwrap(a))); } } - // ==== // compileViaYul: false // ---- diff --git a/test/libsolidity/semanticTests/userDefinedValueType/storage_layout_struct.sol b/test/libsolidity/semanticTests/userDefinedValueType/storage_layout_struct.sol index ee63c185d334..8c51b2921b1a 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/storage_layout_struct.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/storage_layout_struct.sol @@ -150,7 +150,6 @@ contract C { } } } - // ---- // storage_a() -> 0, 0 // set_a(int64,int64): 100, 200 -> diff --git a/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_elementary.sol b/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_elementary.sol index 1c3b66b28da0..2c5a15bb93ac 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_elementary.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_elementary.sol @@ -15,7 +15,6 @@ contract C { return a + b; } } - // ---- // getX() -> 0 // gas irOptimized: 23379 diff --git a/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_userdefined.sol b/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_userdefined.sol index 55e38689fc37..2f275c543b11 100644 --- a/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_userdefined.sol +++ b/test/libsolidity/semanticTests/userDefinedValueType/zero_cost_abstraction_comparison_userdefined.sol @@ -16,7 +16,6 @@ contract C { return MyInt.wrap(MyInt.unwrap(a) + MyInt.unwrap(b)); } } - // ---- // getX() -> 0 // gas irOptimized: 23379 diff --git a/test/libsolidity/semanticTests/using/free_function_multi.sol b/test/libsolidity/semanticTests/using/free_function_multi.sol index feec1beb3980..31ac50bc3a94 100644 --- a/test/libsolidity/semanticTests/using/free_function_multi.sol +++ b/test/libsolidity/semanticTests/using/free_function_multi.sol @@ -17,7 +17,6 @@ function id(uint x) pure returns (uint) { function zero(uint) pure returns (uint) { return 0; } - // ---- // f(uint256): 10 -> 10 // g(uint256): 10 -> 0 diff --git a/test/libsolidity/semanticTests/using/free_functions_individual.sol b/test/libsolidity/semanticTests/using/free_functions_individual.sol index 170eae4d0f12..5a14cd7cb230 100644 --- a/test/libsolidity/semanticTests/using/free_functions_individual.sol +++ b/test/libsolidity/semanticTests/using/free_functions_individual.sol @@ -19,8 +19,6 @@ function id(uint x) pure returns (uint) { function zero(uint) pure returns (uint) { return 0; } - - // ---- // f(uint256): 10 -> 10 // g(uint256): 10 -> 0 diff --git a/test/libsolidity/semanticTests/using/using_global_for_global.sol b/test/libsolidity/semanticTests/using/using_global_for_global.sol index 77bbb896fa9d..67a31c3415cc 100644 --- a/test/libsolidity/semanticTests/using/using_global_for_global.sol +++ b/test/libsolidity/semanticTests/using/using_global_for_global.sol @@ -13,6 +13,5 @@ contract C { return r.f().g(); } } - // ---- // f(uint256): 100 -> 111 \ No newline at end of file diff --git a/test/libsolidity/semanticTests/variables/delete_local.sol b/test/libsolidity/semanticTests/variables/delete_local.sol index 21f4c8edfca5..1d00bace1f61 100644 --- a/test/libsolidity/semanticTests/variables/delete_local.sol +++ b/test/libsolidity/semanticTests/variables/delete_local.sol @@ -5,7 +5,5 @@ contract test { res = v; } } -// ==== -// compileToEwasm: also // ---- // delLocal() -> 0 diff --git a/test/libsolidity/semanticTests/variables/delete_locals.sol b/test/libsolidity/semanticTests/variables/delete_locals.sol index 8c14639d36d8..e442b8e853fa 100644 --- a/test/libsolidity/semanticTests/variables/delete_locals.sol +++ b/test/libsolidity/semanticTests/variables/delete_locals.sol @@ -8,7 +8,5 @@ contract test { res2 = x; } } -// ==== -// compileToEwasm: also // ---- // delLocal() -> 6, 7 diff --git a/test/libsolidity/semanticTests/variables/public_state_overridding.sol b/test/libsolidity/semanticTests/variables/public_state_overridding.sol index 752c429cacc1..78e0fb447833 100644 --- a/test/libsolidity/semanticTests/variables/public_state_overridding.sol +++ b/test/libsolidity/semanticTests/variables/public_state_overridding.sol @@ -11,8 +11,6 @@ contract X is A function set() public { test = 2; } } -// ==== -// compileToEwasm: also // ---- // test() -> 0 // set() -> diff --git a/test/libsolidity/semanticTests/variables/public_state_overridding_dynamic_struct.sol b/test/libsolidity/semanticTests/variables/public_state_overridding_dynamic_struct.sol index 2195c85e10c0..15226b5e0997 100644 --- a/test/libsolidity/semanticTests/variables/public_state_overridding_dynamic_struct.sol +++ b/test/libsolidity/semanticTests/variables/public_state_overridding_dynamic_struct.sol @@ -16,10 +16,6 @@ contract X is A function set() public { test.v = 2; test.s = "statevar"; } } - - -// ==== -// compileToEwasm: also // ---- // test() -> 0, 64, 0 // set() -> diff --git a/test/libsolidity/semanticTests/variables/public_state_overridding_mapping_to_dynamic_struct.sol b/test/libsolidity/semanticTests/variables/public_state_overridding_mapping_to_dynamic_struct.sol index 5a3df6d21498..62aa616e891c 100644 --- a/test/libsolidity/semanticTests/variables/public_state_overridding_mapping_to_dynamic_struct.sol +++ b/test/libsolidity/semanticTests/variables/public_state_overridding_mapping_to_dynamic_struct.sol @@ -16,8 +16,6 @@ contract X is A function set() public { test[42].v = 2; test[42].s = "statevar"; } } - - // ---- // test(uint256): 0 -> 0, 64, 0 // test(uint256): 42 -> 0, 64, 0 diff --git a/test/libsolidity/semanticTests/various/address_code.sol b/test/libsolidity/semanticTests/various/address_code.sol index b944100b96f1..2712503a45c5 100644 --- a/test/libsolidity/semanticTests/various/address_code.sol +++ b/test/libsolidity/semanticTests/various/address_code.sol @@ -12,8 +12,6 @@ contract C { function g() public view returns (uint) { return address(0).code.length; } function h() public view returns (uint) { return address(1).code.length; } } -// ==== -// compileToEwasm: also // ---- // constructor() -> // gas irOptimized: 175145 diff --git a/test/libsolidity/semanticTests/various/assignment_to_const_var_involving_expression.sol b/test/libsolidity/semanticTests/various/assignment_to_const_var_involving_expression.sol index 0aa7ceb954c9..110240ce938d 100644 --- a/test/libsolidity/semanticTests/various/assignment_to_const_var_involving_expression.sol +++ b/test/libsolidity/semanticTests/various/assignment_to_const_var_involving_expression.sol @@ -5,8 +5,5 @@ contract C { return x + 1; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x57a diff --git a/test/libsolidity/semanticTests/various/balance.sol b/test/libsolidity/semanticTests/various/balance.sol index 916c7fbff6df..8638f409c062 100644 --- a/test/libsolidity/semanticTests/various/balance.sol +++ b/test/libsolidity/semanticTests/various/balance.sol @@ -5,9 +5,6 @@ contract test { return address(this).balance; } } - -// ==== -// compileToEwasm: also // ---- // constructor(), 23 wei -> // getBalance() -> 23 diff --git a/test/libsolidity/semanticTests/various/byte_optimization_bug.sol b/test/libsolidity/semanticTests/various/byte_optimization_bug.sol index f023e971f4d6..b850ea327e5e 100644 --- a/test/libsolidity/semanticTests/various/byte_optimization_bug.sol +++ b/test/libsolidity/semanticTests/various/byte_optimization_bug.sol @@ -11,9 +11,6 @@ contract C { } } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 2 -> 0 // g(uint256): 2 -> 2 diff --git a/test/libsolidity/semanticTests/various/code_access_create.sol b/test/libsolidity/semanticTests/various/code_access_create.sol index 839608aaf5ac..075682129cda 100644 --- a/test/libsolidity/semanticTests/various/code_access_create.sol +++ b/test/libsolidity/semanticTests/various/code_access_create.sol @@ -21,7 +21,6 @@ contract C { return d.f(); } } - // ---- // test() -> 7 // gas legacy: 100849 diff --git a/test/libsolidity/semanticTests/various/code_access_runtime.sol b/test/libsolidity/semanticTests/various/code_access_runtime.sol index d22d3e43cb35..9a9e7a80bf90 100644 --- a/test/libsolidity/semanticTests/various/code_access_runtime.sol +++ b/test/libsolidity/semanticTests/various/code_access_runtime.sol @@ -19,7 +19,6 @@ contract C { return 42; } } - // ==== // EVMVersion: >=constantinople // ---- diff --git a/test/libsolidity/semanticTests/various/code_length.sol b/test/libsolidity/semanticTests/various/code_length.sol index 84fd393bd721..97a7637976eb 100644 --- a/test/libsolidity/semanticTests/various/code_length.sol +++ b/test/libsolidity/semanticTests/various/code_length.sol @@ -57,8 +57,6 @@ contract C { } } -// ==== -// compileToEwasm: also // ---- // constructor() // gas legacy: 124168 diff --git a/test/libsolidity/semanticTests/various/code_length_contract_member.sol b/test/libsolidity/semanticTests/various/code_length_contract_member.sol index 8486671ed858..ff883139a46e 100644 --- a/test/libsolidity/semanticTests/various/code_length_contract_member.sol +++ b/test/libsolidity/semanticTests/various/code_length_contract_member.sol @@ -11,7 +11,5 @@ contract C { return (s.code.length, s.another.length, address(this).code.length > 50); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 0x20, true diff --git a/test/libsolidity/semanticTests/various/codebalance_assembly.sol b/test/libsolidity/semanticTests/various/codebalance_assembly.sol index be2b89f29e63..fad0d3e5b465 100644 --- a/test/libsolidity/semanticTests/various/codebalance_assembly.sol +++ b/test/libsolidity/semanticTests/various/codebalance_assembly.sol @@ -17,7 +17,6 @@ contract C { } } } - // ==== // EVMVersion: >=constantinople // ---- diff --git a/test/libsolidity/semanticTests/various/codehash.sol b/test/libsolidity/semanticTests/various/codehash.sol index f787ca5be8aa..fa7dab9dab9f 100644 --- a/test/libsolidity/semanticTests/various/codehash.sol +++ b/test/libsolidity/semanticTests/various/codehash.sol @@ -11,7 +11,6 @@ contract C { return address(this).codehash != 0; } } - // ==== // EVMVersion: >=constantinople // ---- diff --git a/test/libsolidity/semanticTests/various/codehash_assembly.sol b/test/libsolidity/semanticTests/various/codehash_assembly.sol index 71e3a20ef52a..fe2210fa107a 100644 --- a/test/libsolidity/semanticTests/various/codehash_assembly.sol +++ b/test/libsolidity/semanticTests/various/codehash_assembly.sol @@ -15,7 +15,6 @@ contract C { } } } - // ==== // EVMVersion: >=constantinople // ---- diff --git a/test/libsolidity/semanticTests/various/contract_binary_dependencies.sol b/test/libsolidity/semanticTests/various/contract_binary_dependencies.sol index 561e316880d8..0ebf772fbad7 100644 --- a/test/libsolidity/semanticTests/various/contract_binary_dependencies.sol +++ b/test/libsolidity/semanticTests/various/contract_binary_dependencies.sol @@ -15,9 +15,6 @@ contract C { new B(); } } - -// ==== -// compileToEwasm: also // ---- // constructor() -> // gas irOptimized: 100415 diff --git a/test/libsolidity/semanticTests/various/crazy_elementary_typenames_on_stack.sol b/test/libsolidity/semanticTests/various/crazy_elementary_typenames_on_stack.sol index 135543898f32..bc16bacbb6f4 100644 --- a/test/libsolidity/semanticTests/various/crazy_elementary_typenames_on_stack.sol +++ b/test/libsolidity/semanticTests/various/crazy_elementary_typenames_on_stack.sol @@ -8,8 +8,5 @@ contract C { return uint256(x); } } - -// ==== -// compileToEwasm: also // ---- // f() -> -7 diff --git a/test/libsolidity/semanticTests/various/cross_contract_types.sol b/test/libsolidity/semanticTests/various/cross_contract_types.sol index b0cf070a7bcc..9c7728a02c25 100644 --- a/test/libsolidity/semanticTests/various/cross_contract_types.sol +++ b/test/libsolidity/semanticTests/various/cross_contract_types.sol @@ -12,8 +12,5 @@ contract Test { r = x.b; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 3 diff --git a/test/libsolidity/semanticTests/various/decayed_tuple.sol b/test/libsolidity/semanticTests/various/decayed_tuple.sol index f143b98471db..799da3481791 100644 --- a/test/libsolidity/semanticTests/various/decayed_tuple.sol +++ b/test/libsolidity/semanticTests/various/decayed_tuple.sol @@ -5,7 +5,5 @@ contract C { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/various/destructuring_assignment.sol b/test/libsolidity/semanticTests/various/destructuring_assignment.sol index e2c8c52638b7..1534891dc1b8 100644 --- a/test/libsolidity/semanticTests/various/destructuring_assignment.sol +++ b/test/libsolidity/semanticTests/various/destructuring_assignment.sol @@ -31,7 +31,6 @@ contract C { if (x != 456 || memBytes.length != s.length || y[2] != 789) return 11; } } - // ---- // f(bytes): 0x20, 0x5, "abcde" -> 0 // gas irOptimized: 241853 diff --git a/test/libsolidity/semanticTests/various/empty_name_return_parameter.sol b/test/libsolidity/semanticTests/various/empty_name_return_parameter.sol index 906df85cc858..71eb0077c91f 100644 --- a/test/libsolidity/semanticTests/various/empty_name_return_parameter.sol +++ b/test/libsolidity/semanticTests/various/empty_name_return_parameter.sol @@ -3,8 +3,5 @@ contract test { return k; } } - -// ==== -// compileToEwasm: also // ---- // f(uint256): 9 -> 9 diff --git a/test/libsolidity/semanticTests/various/external_types_in_calls.sol b/test/libsolidity/semanticTests/various/external_types_in_calls.sol index 6b28f542c731..e8742c2346b0 100644 --- a/test/libsolidity/semanticTests/various/external_types_in_calls.sol +++ b/test/libsolidity/semanticTests/various/external_types_in_calls.sol @@ -22,7 +22,6 @@ contract C { return C1(address(9)); } } - // ---- // test() -> 9, 7 // gas legacy: 127514 diff --git a/test/libsolidity/semanticTests/various/flipping_sign_tests.sol b/test/libsolidity/semanticTests/various/flipping_sign_tests.sol index f2f63575a10e..174fb993f7bd 100644 --- a/test/libsolidity/semanticTests/various/flipping_sign_tests.sol +++ b/test/libsolidity/semanticTests/various/flipping_sign_tests.sol @@ -5,8 +5,5 @@ contract test { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/various/gasleft_decrease.sol b/test/libsolidity/semanticTests/various/gasleft_decrease.sol index 22566bfb1855..ab7302743f64 100644 --- a/test/libsolidity/semanticTests/various/gasleft_decrease.sol +++ b/test/libsolidity/semanticTests/various/gasleft_decrease.sol @@ -14,9 +14,6 @@ contract C { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true // g() -> true diff --git a/test/libsolidity/semanticTests/various/gasleft_shadow_resolution.sol b/test/libsolidity/semanticTests/various/gasleft_shadow_resolution.sol index 3fe3ba10d3d6..280bc496095b 100644 --- a/test/libsolidity/semanticTests/various/gasleft_shadow_resolution.sol +++ b/test/libsolidity/semanticTests/various/gasleft_shadow_resolution.sol @@ -7,8 +7,5 @@ contract C { return gasleft(); } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0 diff --git a/test/libsolidity/semanticTests/various/inline_member_init.sol b/test/libsolidity/semanticTests/various/inline_member_init.sol index 7d3b754928e7..5c48b5d72e2c 100644 --- a/test/libsolidity/semanticTests/various/inline_member_init.sol +++ b/test/libsolidity/semanticTests/various/inline_member_init.sol @@ -14,7 +14,5 @@ contract test { c = m_c; } } -// ==== -// compileToEwasm: also // ---- // get() -> 5, 6, 8 diff --git a/test/libsolidity/semanticTests/various/inline_member_init_inheritence.sol b/test/libsolidity/semanticTests/various/inline_member_init_inheritence.sol index 825bd6d2f9e3..b440b35a83b0 100644 --- a/test/libsolidity/semanticTests/various/inline_member_init_inheritence.sol +++ b/test/libsolidity/semanticTests/various/inline_member_init_inheritence.sol @@ -18,8 +18,6 @@ contract Derived is Base { return m_derived; } } -// ==== -// compileToEwasm: also // ---- // getBMember() -> 5 // getDMember() -> 6 diff --git a/test/libsolidity/semanticTests/various/inline_tuple_with_rational_numbers.sol b/test/libsolidity/semanticTests/various/inline_tuple_with_rational_numbers.sol index f8c396dd161b..e85a38dd6b2a 100644 --- a/test/libsolidity/semanticTests/various/inline_tuple_with_rational_numbers.sol +++ b/test/libsolidity/semanticTests/various/inline_tuple_with_rational_numbers.sol @@ -4,8 +4,5 @@ contract c { return foo3[0]; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 1 diff --git a/test/libsolidity/semanticTests/various/iszero_bnot_correct.sol b/test/libsolidity/semanticTests/various/iszero_bnot_correct.sol index 5744272cee13..d797ab9cd4b8 100644 --- a/test/libsolidity/semanticTests/various/iszero_bnot_correct.sol +++ b/test/libsolidity/semanticTests/various/iszero_bnot_correct.sol @@ -14,8 +14,5 @@ contract C { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/various/literal_empty_string.sol b/test/libsolidity/semanticTests/various/literal_empty_string.sol index bf4da54099af..44154fa55b99 100644 --- a/test/libsolidity/semanticTests/various/literal_empty_string.sol +++ b/test/libsolidity/semanticTests/various/literal_empty_string.sol @@ -11,7 +11,6 @@ contract C { this.f("", 2); } } - // ---- // x() -> 0 // a() -> 0 diff --git a/test/libsolidity/semanticTests/various/memory_overwrite.sol b/test/libsolidity/semanticTests/various/memory_overwrite.sol index 930b06f4a0ab..3ab16a3e88f4 100644 --- a/test/libsolidity/semanticTests/various/memory_overwrite.sol +++ b/test/libsolidity/semanticTests/various/memory_overwrite.sol @@ -5,8 +5,5 @@ contract C { x[0] = 0x62; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 0x20, 5, "b23a5" diff --git a/test/libsolidity/semanticTests/various/multi_modifiers.sol b/test/libsolidity/semanticTests/various/multi_modifiers.sol index b6d8dd84c9b0..07f6c038d3db 100644 --- a/test/libsolidity/semanticTests/various/multi_modifiers.sol +++ b/test/libsolidity/semanticTests/various/multi_modifiers.sol @@ -16,8 +16,6 @@ contract C { x += 3; } } -// ==== -// compileToEwasm: also // ---- // f1() -> // x() -> 0x08 diff --git a/test/libsolidity/semanticTests/various/multi_variable_declaration.sol b/test/libsolidity/semanticTests/various/multi_variable_declaration.sol index e054329c911f..de4ecdbe46bd 100644 --- a/test/libsolidity/semanticTests/various/multi_variable_declaration.sol +++ b/test/libsolidity/semanticTests/various/multi_variable_declaration.sol @@ -42,7 +42,5 @@ contract C { return f1() && f2(); } } -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/various/nested_calldata_struct.sol b/test/libsolidity/semanticTests/various/nested_calldata_struct.sol index 8ba68599e93d..b11241322cec 100644 --- a/test/libsolidity/semanticTests/various/nested_calldata_struct.sol +++ b/test/libsolidity/semanticTests/various/nested_calldata_struct.sol @@ -21,8 +21,5 @@ contract C { return (s.a, s.b, s.s.a, s.s.b, s.c); } } - -// ==== -// compileToEwasm: also // ---- // f((uint256,uint256,(uint256,uint256),uint256)): 1, 2, 3, 4, 5 -> 1, 2, 3, 4, 5 diff --git a/test/libsolidity/semanticTests/various/nested_calldata_struct_to_memory.sol b/test/libsolidity/semanticTests/various/nested_calldata_struct_to_memory.sol index 595f88f54548..25cd645e45bd 100644 --- a/test/libsolidity/semanticTests/various/nested_calldata_struct_to_memory.sol +++ b/test/libsolidity/semanticTests/various/nested_calldata_struct_to_memory.sol @@ -22,6 +22,5 @@ contract C { return (m.a, m.b, m.s.a, m.s.b, m.c); } } - // ---- // f((uint256,uint256,(uint256,uint256),uint256)): 1, 2, 3, 4, 5 -> 1, 2, 3, 4, 5 diff --git a/test/libsolidity/semanticTests/various/positive_integers_to_signed.sol b/test/libsolidity/semanticTests/various/positive_integers_to_signed.sol index 4c23564995bb..4c0d7114588e 100644 --- a/test/libsolidity/semanticTests/various/positive_integers_to_signed.sol +++ b/test/libsolidity/semanticTests/various/positive_integers_to_signed.sol @@ -3,8 +3,6 @@ contract test { int8 public y = 127; int16 public q = 250; } -// ==== -// compileToEwasm: also // ---- // x() -> 2 // y() -> 127 diff --git a/test/libsolidity/semanticTests/various/senders_balance.sol b/test/libsolidity/semanticTests/various/senders_balance.sol index 9f391e2a17ea..6a8da27784f1 100644 --- a/test/libsolidity/semanticTests/various/senders_balance.sol +++ b/test/libsolidity/semanticTests/various/senders_balance.sol @@ -14,7 +14,6 @@ contract D { return c.f(); } } - // ---- // constructor(), 27 wei -> // gas irOptimized: 169377 diff --git a/test/libsolidity/semanticTests/various/single_copy_with_multiple_inheritance.sol b/test/libsolidity/semanticTests/various/single_copy_with_multiple_inheritance.sol index c1dab1895d8f..69c4c4121dee 100644 --- a/test/libsolidity/semanticTests/various/single_copy_with_multiple_inheritance.sol +++ b/test/libsolidity/semanticTests/various/single_copy_with_multiple_inheritance.sol @@ -26,9 +26,6 @@ contract B is Base { contract Derived is Base, B, A {} - -// ==== -// compileToEwasm: also // ---- // getViaB() -> 0 // setViaA(uint256): 23 -> diff --git a/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol b/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol index ec94f73a1f18..efff7a95073a 100644 --- a/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol +++ b/test/libsolidity/semanticTests/various/skip_dynamic_types_for_structs.sol @@ -17,7 +17,6 @@ contract C { return (x, y); } } - // ---- // g() -> 2, 6 // gas irOptimized: 178542 diff --git a/test/libsolidity/semanticTests/various/state_variable_local_variable_mixture.sol b/test/libsolidity/semanticTests/various/state_variable_local_variable_mixture.sol index d3203160a620..f7add5fba191 100644 --- a/test/libsolidity/semanticTests/various/state_variable_local_variable_mixture.sol +++ b/test/libsolidity/semanticTests/various/state_variable_local_variable_mixture.sol @@ -6,7 +6,5 @@ contract A { x = A.y; } } -// ==== -// compileToEwasm: also // ---- // a() -> 2 diff --git a/test/libsolidity/semanticTests/various/state_variable_under_contract_name.sol b/test/libsolidity/semanticTests/various/state_variable_under_contract_name.sol index e71d802fbf71..1167da57e08d 100644 --- a/test/libsolidity/semanticTests/various/state_variable_under_contract_name.sol +++ b/test/libsolidity/semanticTests/various/state_variable_under_contract_name.sol @@ -5,7 +5,5 @@ contract Scope { stateVar = Scope.stateVar; } } -// ==== -// compileToEwasm: also // ---- // getStateVar() -> 42 diff --git a/test/libsolidity/semanticTests/various/string_tuples.sol b/test/libsolidity/semanticTests/various/string_tuples.sol index 935c0b3c2035..57028ae39a05 100644 --- a/test/libsolidity/semanticTests/various/string_tuples.sol +++ b/test/libsolidity/semanticTests/various/string_tuples.sol @@ -11,8 +11,6 @@ contract C { return ("abc"); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x40, 0x8, 0x3, "abc" // g() -> 0x40, 0x80, 0x3, "abc", 0x3, "def" diff --git a/test/libsolidity/semanticTests/various/super.sol b/test/libsolidity/semanticTests/various/super.sol index 9035f0ca2a80..cd1b4a71afd8 100644 --- a/test/libsolidity/semanticTests/various/super.sol +++ b/test/libsolidity/semanticTests/various/super.sol @@ -24,8 +24,5 @@ contract D is B, C { return super.f() | 8; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 15 diff --git a/test/libsolidity/semanticTests/various/super_alone.sol b/test/libsolidity/semanticTests/various/super_alone.sol index 069df9a91c2b..223e31762c86 100644 --- a/test/libsolidity/semanticTests/various/super_alone.sol +++ b/test/libsolidity/semanticTests/various/super_alone.sol @@ -3,8 +3,5 @@ contract A { super; } } - -// ==== -// compileToEwasm: also // ---- // f() -> diff --git a/test/libsolidity/semanticTests/various/super_parentheses.sol b/test/libsolidity/semanticTests/various/super_parentheses.sol index 3c687d9c19ee..fd7944764dec 100644 --- a/test/libsolidity/semanticTests/various/super_parentheses.sol +++ b/test/libsolidity/semanticTests/various/super_parentheses.sol @@ -24,8 +24,5 @@ contract D is B, C { return ((super).f)() | 8; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 15 diff --git a/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol b/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol index a21065bf7219..482847b67f64 100644 --- a/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol +++ b/test/libsolidity/semanticTests/various/swap_in_storage_overwrite.sol @@ -22,9 +22,6 @@ contract c { (x, y) = (y, x); } } - -// ==== -// compileToEwasm: also // ---- // x() -> 0, 0 // y() -> 0, 0 diff --git a/test/libsolidity/semanticTests/various/test_underscore_in_hex.sol b/test/libsolidity/semanticTests/various/test_underscore_in_hex.sol index 76c6828cd2b6..b9503e44c667 100644 --- a/test/libsolidity/semanticTests/various/test_underscore_in_hex.sol +++ b/test/libsolidity/semanticTests/various/test_underscore_in_hex.sol @@ -5,8 +5,6 @@ contract test { return cond ? x : y; } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 0x1234ab // f(bool): false -> 0x1234abcd1234 diff --git a/test/libsolidity/semanticTests/various/typed_multi_variable_declaration.sol b/test/libsolidity/semanticTests/various/typed_multi_variable_declaration.sol index 018ee9669874..c9f12fdaefd4 100644 --- a/test/libsolidity/semanticTests/various/typed_multi_variable_declaration.sol +++ b/test/libsolidity/semanticTests/various/typed_multi_variable_declaration.sol @@ -21,8 +21,5 @@ contract C { return true; } } - -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/various/value_complex.sol b/test/libsolidity/semanticTests/various/value_complex.sol index a799b7d9bf2c..80f8bb55cc82 100644 --- a/test/libsolidity/semanticTests/various/value_complex.sol +++ b/test/libsolidity/semanticTests/various/value_complex.sol @@ -17,7 +17,6 @@ contract test { return h.getBalance{value: amount + 3, gas: 1000}(); } } - // ---- // constructor(), 20 wei -> // gas irOptimized: 174351 diff --git a/test/libsolidity/semanticTests/various/value_insane.sol b/test/libsolidity/semanticTests/various/value_insane.sol index 8718bd42249f..4a4432758458 100644 --- a/test/libsolidity/semanticTests/various/value_insane.sol +++ b/test/libsolidity/semanticTests/various/value_insane.sol @@ -16,7 +16,6 @@ contract test { return h.getBalance{value: amount + 3, gas: 1000}(); } } - // ---- // constructor(), 20 wei -> // gas irOptimized: 175215 diff --git a/test/libsolidity/semanticTests/various/write_storage_external.sol b/test/libsolidity/semanticTests/various/write_storage_external.sol index 0bbe522484da..a8959b24ea81 100644 --- a/test/libsolidity/semanticTests/various/write_storage_external.sol +++ b/test/libsolidity/semanticTests/various/write_storage_external.sol @@ -33,7 +33,6 @@ contract D { return c.x(); } } - // ---- // f() -> 3 // g() -> 8 diff --git a/test/libsolidity/semanticTests/viaYul/assert.sol b/test/libsolidity/semanticTests/viaYul/assert.sol index aa8de1c277ae..bd1cabc48be3 100644 --- a/test/libsolidity/semanticTests/viaYul/assert.sol +++ b/test/libsolidity/semanticTests/viaYul/assert.sol @@ -13,8 +13,6 @@ contract C { assert(true); } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> true // f(bool): false -> FAILURE, hex"4e487b71", 0x01 diff --git a/test/libsolidity/semanticTests/viaYul/assert_and_require.sol b/test/libsolidity/semanticTests/viaYul/assert_and_require.sol index 290ef35b31d7..a403b5d64a65 100644 --- a/test/libsolidity/semanticTests/viaYul/assert_and_require.sol +++ b/test/libsolidity/semanticTests/viaYul/assert_and_require.sol @@ -10,8 +10,6 @@ contract C { require(b); } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> true // f(bool): false -> FAILURE, hex"4e487b71", 0x01 diff --git a/test/libsolidity/semanticTests/viaYul/assign_tuple_from_function_call.sol b/test/libsolidity/semanticTests/viaYul/assign_tuple_from_function_call.sol index c36cc26dc0f0..5da58b31641d 100644 --- a/test/libsolidity/semanticTests/viaYul/assign_tuple_from_function_call.sol +++ b/test/libsolidity/semanticTests/viaYul/assign_tuple_from_function_call.sol @@ -9,8 +9,6 @@ contract C { (,,a) = f(); } } -// ==== -// compileToEwasm: also // ---- // g() -> 3, 2, 1 // h() -> 3 diff --git a/test/libsolidity/semanticTests/viaYul/cleanup/checked_arithmetic.sol b/test/libsolidity/semanticTests/viaYul/cleanup/checked_arithmetic.sol index a81ab4577a2c..19b7cb846430 100644 --- a/test/libsolidity/semanticTests/viaYul/cleanup/checked_arithmetic.sol +++ b/test/libsolidity/semanticTests/viaYul/cleanup/checked_arithmetic.sol @@ -51,7 +51,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // add() -> 1, 1 diff --git a/test/libsolidity/semanticTests/viaYul/cleanup/comparison.sol b/test/libsolidity/semanticTests/viaYul/cleanup/comparison.sol index ab3d92a18b3b..035c2690614a 100644 --- a/test/libsolidity/semanticTests/viaYul/cleanup/comparison.sol +++ b/test/libsolidity/semanticTests/viaYul/cleanup/comparison.sol @@ -30,8 +30,6 @@ contract C { return (x < y); } } -// ==== -// compileToEwasm: also // ---- // eq() -> true // neq() -> false diff --git a/test/libsolidity/semanticTests/viaYul/comparison.sol b/test/libsolidity/semanticTests/viaYul/comparison.sol index 0b0763b6eab7..1ac2aec17558 100644 --- a/test/libsolidity/semanticTests/viaYul/comparison.sol +++ b/test/libsolidity/semanticTests/viaYul/comparison.sol @@ -36,8 +36,6 @@ contract C { return a != b; } } -// ==== -// compileToEwasm: also // ---- // f(address): 0x1234 -> false // f(address): 0x00 -> true diff --git a/test/libsolidity/semanticTests/viaYul/comparison_functions.sol b/test/libsolidity/semanticTests/viaYul/comparison_functions.sol index 89d90e577b31..a004299b3b75 100644 --- a/test/libsolidity/semanticTests/viaYul/comparison_functions.sol +++ b/test/libsolidity/semanticTests/viaYul/comparison_functions.sol @@ -24,8 +24,6 @@ contract C { inv = internal1 != invalid; } } -// ==== -// compileToEwasm: also // ---- // equal() -> true, false, false // unequal() -> false, true, true diff --git a/test/libsolidity/semanticTests/viaYul/conditional/conditional_multiple.sol b/test/libsolidity/semanticTests/viaYul/conditional/conditional_multiple.sol index 9e1e8c77877d..828398f57b40 100644 --- a/test/libsolidity/semanticTests/viaYul/conditional/conditional_multiple.sol +++ b/test/libsolidity/semanticTests/viaYul/conditional/conditional_multiple.sol @@ -4,7 +4,5 @@ contract A { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 7 diff --git a/test/libsolidity/semanticTests/viaYul/conditional/conditional_true_false_literal.sol b/test/libsolidity/semanticTests/viaYul/conditional/conditional_true_false_literal.sol index 3eda8bfc7681..c2bbb08d5294 100644 --- a/test/libsolidity/semanticTests/viaYul/conditional/conditional_true_false_literal.sol +++ b/test/libsolidity/semanticTests/viaYul/conditional/conditional_true_false_literal.sol @@ -5,7 +5,5 @@ contract A { return x + y; } } -// ==== -// compileToEwasm: also // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/viaYul/conditional/conditional_tuple.sol b/test/libsolidity/semanticTests/viaYul/conditional/conditional_tuple.sol index a0b206a12833..51030f9a3a25 100644 --- a/test/libsolidity/semanticTests/viaYul/conditional/conditional_tuple.sol +++ b/test/libsolidity/semanticTests/viaYul/conditional/conditional_tuple.sol @@ -4,8 +4,6 @@ contract A { return (a, b); } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> 1, 2 // f(bool): false -> 3, 4 diff --git a/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_assignment.sol b/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_assignment.sol index a132e887307c..80d4dde60dc6 100644 --- a/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_assignment.sol @@ -7,7 +7,5 @@ contract A { return (x, y1, y2, z); } } -// ==== -// compileToEwasm: also // ---- // f() -> 6, 1, 5, 5 diff --git a/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_variables.sol b/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_variables.sol index c5bf8e01851c..4de296630d46 100644 --- a/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_variables.sol +++ b/test/libsolidity/semanticTests/viaYul/conditional/conditional_with_variables.sol @@ -7,7 +7,5 @@ contract A { return (x, y, z, w); } } -// ==== -// compileToEwasm: also // ---- // f() -> 3, 1, 3, 1 diff --git a/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_assignment.sol b/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_assignment.sol index 5d0d50dadd03..cc5a156e20dc 100644 --- a/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_assignment.sol @@ -4,7 +4,5 @@ contract C { x = y; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x78 diff --git a/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_function_call.sol b/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_function_call.sol index 34cc69ffeb3d..0ab4b34a741d 100644 --- a/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_function_call.sol +++ b/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_function_call.sol @@ -6,7 +6,5 @@ contract C { x = f(bytes4(uint32(0x12345678))); } } -// ==== -// compileToEwasm: also // ---- // g() -> 0x1234567800000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_local_assignment.sol b/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_local_assignment.sol index fe07146e18fb..425c6eaedd68 100644 --- a/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_local_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/conversion/explicit_cast_local_assignment.sol @@ -4,7 +4,5 @@ contract C { x = b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 0x12345678 -> 0x78 diff --git a/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_assignment.sol b/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_assignment.sol index 05d265343c80..e22466010c83 100644 --- a/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_assignment.sol @@ -8,7 +8,5 @@ contract C { x = y; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x78 diff --git a/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_function_call.sol b/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_function_call.sol index a2c2d92077a6..e62d45b3576f 100644 --- a/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_function_call.sol +++ b/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_function_call.sol @@ -11,7 +11,5 @@ contract C { x = f(a); } } -// ==== -// compileToEwasm: also // ---- // g() -> 0x78 diff --git a/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_local_assignment.sol b/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_local_assignment.sol index e582ff394e2f..3793b4e0cf21 100644 --- a/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_local_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/conversion/implicit_cast_local_assignment.sol @@ -7,7 +7,5 @@ contract C { y = z; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0x78 diff --git a/test/libsolidity/semanticTests/viaYul/define_tuple_from_function_call.sol b/test/libsolidity/semanticTests/viaYul/define_tuple_from_function_call.sol index 24c72943fff1..3e1559bcfa2f 100644 --- a/test/libsolidity/semanticTests/viaYul/define_tuple_from_function_call.sol +++ b/test/libsolidity/semanticTests/viaYul/define_tuple_from_function_call.sol @@ -11,8 +11,6 @@ contract C { return a; } } -// ==== -// compileToEwasm: also // ---- // g() -> 3, 2, 1 // h() -> 3 diff --git a/test/libsolidity/semanticTests/viaYul/delete.sol b/test/libsolidity/semanticTests/viaYul/delete.sol index 3439bc4df9f5..6a0f3d598618 100644 --- a/test/libsolidity/semanticTests/viaYul/delete.sol +++ b/test/libsolidity/semanticTests/viaYul/delete.sol @@ -18,8 +18,6 @@ contract C { return func() == internal_func(); } } -// ==== -// compileToEwasm: also // ---- // call_deleted_internal_func() -> FAILURE, hex"4e487b71", 0x51 // call_internal_func() -> true diff --git a/test/libsolidity/semanticTests/viaYul/detect_add_overflow.sol b/test/libsolidity/semanticTests/viaYul/detect_add_overflow.sol index 6e6f108a629b..412998b55993 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_add_overflow.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_add_overflow.sol @@ -6,8 +6,6 @@ contract C { x = a + b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 5, 6 -> 11 // f(uint256,uint256): -2, 1 -> -1 diff --git a/test/libsolidity/semanticTests/viaYul/detect_add_overflow_signed.sol b/test/libsolidity/semanticTests/viaYul/detect_add_overflow_signed.sol index 0e7d2db37d15..5c721ac2f2bf 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_add_overflow_signed.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_add_overflow_signed.sol @@ -6,8 +6,6 @@ contract C { x = a + b; } } -// ==== -// compileToEwasm: also // ---- // f(int256,int256): 5, 6 -> 11 // f(int256,int256): -2, 1 -> -1 diff --git a/test/libsolidity/semanticTests/viaYul/detect_div_overflow.sol b/test/libsolidity/semanticTests/viaYul/detect_div_overflow.sol index ab3d97f46da7..d4cefe12f651 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_div_overflow.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_div_overflow.sol @@ -9,8 +9,6 @@ contract C { x = a / b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 10, 3 -> 3 // f(uint256,uint256): 1, 0 -> FAILURE, hex"4e487b71", 0x12 diff --git a/test/libsolidity/semanticTests/viaYul/detect_mod_zero.sol b/test/libsolidity/semanticTests/viaYul/detect_mod_zero.sol index 5307f958984f..0d0432987459 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_mod_zero.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_mod_zero.sol @@ -6,8 +6,6 @@ contract C { x = a % b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 10, 3 -> 1 // f(uint256,uint256): 10, 2 -> 0 diff --git a/test/libsolidity/semanticTests/viaYul/detect_mod_zero_signed.sol b/test/libsolidity/semanticTests/viaYul/detect_mod_zero_signed.sol index 102df82f3003..e97bc4cc30a2 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_mod_zero_signed.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_mod_zero_signed.sol @@ -6,8 +6,6 @@ contract C { x = a % b; } } -// ==== -// compileToEwasm: also // ---- // f(int256,int256): 10, 3 -> 1 // f(int256,int256): 10, 2 -> 0 diff --git a/test/libsolidity/semanticTests/viaYul/detect_mul_overflow.sol b/test/libsolidity/semanticTests/viaYul/detect_mul_overflow.sol index 8cc64ffa07dc..935d03752dc5 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_mul_overflow.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_mul_overflow.sol @@ -6,8 +6,6 @@ contract C { x = a * b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 5, 6 -> 30 // f(uint256,uint256): -1, 1 -> -1 diff --git a/test/libsolidity/semanticTests/viaYul/detect_mul_overflow_signed.sol b/test/libsolidity/semanticTests/viaYul/detect_mul_overflow_signed.sol index a9581c49f721..213b1a6d3b24 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_mul_overflow_signed.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_mul_overflow_signed.sol @@ -9,8 +9,6 @@ contract C { x = a * b; } } -// ==== -// compileToEwasm: also // ---- // f(int256,int256): 5, 6 -> 30 // f(int256,int256): -1, 1 -> -1 diff --git a/test/libsolidity/semanticTests/viaYul/detect_sub_overflow.sol b/test/libsolidity/semanticTests/viaYul/detect_sub_overflow.sol index 1f6a0d7e5adc..ee059137a028 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_sub_overflow.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_sub_overflow.sol @@ -6,8 +6,6 @@ contract C { x = a - b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 6, 5 -> 1 // f(uint256,uint256): 6, 6 -> 0 diff --git a/test/libsolidity/semanticTests/viaYul/detect_sub_overflow_signed.sol b/test/libsolidity/semanticTests/viaYul/detect_sub_overflow_signed.sol index 34992607903f..a247af68bff8 100644 --- a/test/libsolidity/semanticTests/viaYul/detect_sub_overflow_signed.sol +++ b/test/libsolidity/semanticTests/viaYul/detect_sub_overflow_signed.sol @@ -6,8 +6,6 @@ contract C { x = a - b; } } -// ==== -// compileToEwasm: also // ---- // f(int256,int256): 5, 6 -> -1 // f(int256,int256): -2, 1 -> -3 diff --git a/test/libsolidity/semanticTests/viaYul/dirty_memory_dynamic_array.sol b/test/libsolidity/semanticTests/viaYul/dirty_memory_dynamic_array.sol index 8b34fd801f85..36a253b02452 100644 --- a/test/libsolidity/semanticTests/viaYul/dirty_memory_dynamic_array.sol +++ b/test/libsolidity/semanticTests/viaYul/dirty_memory_dynamic_array.sol @@ -13,7 +13,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/dirty_memory_int32.sol b/test/libsolidity/semanticTests/viaYul/dirty_memory_int32.sol index 636572d500f3..fc2fe4251658 100644 --- a/test/libsolidity/semanticTests/viaYul/dirty_memory_int32.sol +++ b/test/libsolidity/semanticTests/viaYul/dirty_memory_int32.sol @@ -13,7 +13,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/dirty_memory_static_array.sol b/test/libsolidity/semanticTests/viaYul/dirty_memory_static_array.sol index 2e9acb27c322..4742bae2dfdf 100644 --- a/test/libsolidity/semanticTests/viaYul/dirty_memory_static_array.sol +++ b/test/libsolidity/semanticTests/viaYul/dirty_memory_static_array.sol @@ -13,7 +13,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/dirty_memory_struct.sol b/test/libsolidity/semanticTests/viaYul/dirty_memory_struct.sol index 7c14280502a9..411cbe069e6a 100644 --- a/test/libsolidity/semanticTests/viaYul/dirty_memory_struct.sol +++ b/test/libsolidity/semanticTests/viaYul/dirty_memory_struct.sol @@ -17,7 +17,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/dirty_memory_uint32.sol b/test/libsolidity/semanticTests/viaYul/dirty_memory_uint32.sol index cfd2c05af9bb..a23a566c5bbe 100644 --- a/test/libsolidity/semanticTests/viaYul/dirty_memory_uint32.sol +++ b/test/libsolidity/semanticTests/viaYul/dirty_memory_uint32.sol @@ -13,7 +13,6 @@ contract C { } } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/exp.sol b/test/libsolidity/semanticTests/viaYul/exp.sol index 1ca5842ab078..324256b456df 100644 --- a/test/libsolidity/semanticTests/viaYul/exp.sol +++ b/test/libsolidity/semanticTests/viaYul/exp.sol @@ -3,8 +3,6 @@ contract C { return x**y; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 0, 0 -> 1 // f(uint256,uint256): 0, 1 -> 0x00 diff --git a/test/libsolidity/semanticTests/viaYul/exp_literals.sol b/test/libsolidity/semanticTests/viaYul/exp_literals.sol index 55ed66eb3fc9..382d75184ff5 100644 --- a/test/libsolidity/semanticTests/viaYul/exp_literals.sol +++ b/test/libsolidity/semanticTests/viaYul/exp_literals.sol @@ -29,7 +29,6 @@ contract C { } // ==== -// compileToEwasm: also // compileViaYul: true // ---- // exp_2(uint256): 255 -> 57896044618658097711785492504343953926634992332820282019728792003956564819968 diff --git a/test/libsolidity/semanticTests/viaYul/exp_literals_success.sol b/test/libsolidity/semanticTests/viaYul/exp_literals_success.sol index d28a56eb4f17..12ab33924293 100644 --- a/test/libsolidity/semanticTests/viaYul/exp_literals_success.sol +++ b/test/libsolidity/semanticTests/viaYul/exp_literals_success.sol @@ -28,8 +28,6 @@ contract C { } } -// ==== -// compileToEwasm: also // ---- // exp_2(uint256): 255 -> 57896044618658097711785492504343953926634992332820282019728792003956564819968 // exp_minus_2(uint256): 255 -> -57896044618658097711785492504343953926634992332820282019728792003956564819968 diff --git a/test/libsolidity/semanticTests/viaYul/exp_neg.sol b/test/libsolidity/semanticTests/viaYul/exp_neg.sol index de58d65926cd..a6ba617d7945 100644 --- a/test/libsolidity/semanticTests/viaYul/exp_neg.sol +++ b/test/libsolidity/semanticTests/viaYul/exp_neg.sol @@ -3,8 +3,6 @@ contract C { return x**y; } } -// ==== -// compileToEwasm: also // ---- // f(int256,uint256): 0, 0 -> 1 // f(int256,uint256): 0, 1 -> 0x00 diff --git a/test/libsolidity/semanticTests/viaYul/exp_neg_overflow.sol b/test/libsolidity/semanticTests/viaYul/exp_neg_overflow.sol index 9d4b59d5286b..a966e3ccdbf3 100644 --- a/test/libsolidity/semanticTests/viaYul/exp_neg_overflow.sol +++ b/test/libsolidity/semanticTests/viaYul/exp_neg_overflow.sol @@ -6,8 +6,6 @@ contract C { return x**y; } } -// ==== -// compileToEwasm: also // ---- // f(int8,uint256): 2, 6 -> 64 // f(int8,uint256): 2, 7 -> FAILURE, hex"4e487b71", 0x11 diff --git a/test/libsolidity/semanticTests/viaYul/exp_overflow.sol b/test/libsolidity/semanticTests/viaYul/exp_overflow.sol index 8ba9c1d4ad77..7a100c2be003 100644 --- a/test/libsolidity/semanticTests/viaYul/exp_overflow.sol +++ b/test/libsolidity/semanticTests/viaYul/exp_overflow.sol @@ -6,8 +6,6 @@ contract C { return x**y; } } -// ==== -// compileToEwasm: also // ---- // f(uint8,uint8): 2, 7 -> 0x80 // f(uint8,uint8): 2, 8 -> FAILURE, hex"4e487b71", 0x11 diff --git a/test/libsolidity/semanticTests/viaYul/exp_various.sol b/test/libsolidity/semanticTests/viaYul/exp_various.sol index a1a69ed03143..3e9cf9d40bb6 100644 --- a/test/libsolidity/semanticTests/viaYul/exp_various.sol +++ b/test/libsolidity/semanticTests/viaYul/exp_various.sol @@ -6,8 +6,6 @@ contract C { return x**y; } } -// ==== -// compileToEwasm: also // ---- // f(uint8,uint8): 0, 0 -> 1 // f(uint8,uint8): 0, 1 -> 0x00 diff --git a/test/libsolidity/semanticTests/viaYul/function_address.sol b/test/libsolidity/semanticTests/viaYul/function_address.sol index e7d6c49a2261..0c1c58dd821d 100644 --- a/test/libsolidity/semanticTests/viaYul/function_address.sol +++ b/test/libsolidity/semanticTests/viaYul/function_address.sol @@ -9,8 +9,6 @@ contract C { return a.address; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0xc06afe3a8444fc0004668591e8306bfb9968e79e // g() -> true diff --git a/test/libsolidity/semanticTests/viaYul/function_entry_checks.sol b/test/libsolidity/semanticTests/viaYul/function_entry_checks.sol index 29812e01892a..6f5f90824f60 100644 --- a/test/libsolidity/semanticTests/viaYul/function_entry_checks.sol +++ b/test/libsolidity/semanticTests/viaYul/function_entry_checks.sol @@ -16,8 +16,6 @@ contract C { function t(uint) public pure { } } -// ==== -// compileToEwasm: also // ---- // f() -> 0 // g(uint256,uint256): 1, -2 -> 0 diff --git a/test/libsolidity/semanticTests/viaYul/function_pointers.sol b/test/libsolidity/semanticTests/viaYul/function_pointers.sol index 8bc69baa8783..b34f01981788 100644 --- a/test/libsolidity/semanticTests/viaYul/function_pointers.sol +++ b/test/libsolidity/semanticTests/viaYul/function_pointers.sol @@ -16,8 +16,6 @@ contract C { k1()(); } } -// ==== -// compileToEwasm: also // ---- // f() -> FAILURE, hex"4e487b71", 0x51 // g() -> FAILURE diff --git a/test/libsolidity/semanticTests/viaYul/function_selector.sol b/test/libsolidity/semanticTests/viaYul/function_selector.sol index d21afdcf545b..4737a36d9a94 100644 --- a/test/libsolidity/semanticTests/viaYul/function_selector.sol +++ b/test/libsolidity/semanticTests/viaYul/function_selector.sol @@ -6,8 +6,6 @@ contract C { return a.selector; } } -// ==== -// compileToEwasm: also // ---- // f() -> left(0x26121ff0) // h(function): left(0x1122334400112233445566778899AABBCCDDEEFF42424242) -> left(0x42424242) diff --git a/test/libsolidity/semanticTests/viaYul/if.sol b/test/libsolidity/semanticTests/viaYul/if.sol index d2f582bb1b56..0fe752d51020 100644 --- a/test/libsolidity/semanticTests/viaYul/if.sol +++ b/test/libsolidity/semanticTests/viaYul/if.sol @@ -59,8 +59,6 @@ contract C { } while(false); } } -// ==== -// compileToEwasm: also // ---- // f(bool): 0 -> 23 // f(bool): 1 -> 42 diff --git a/test/libsolidity/semanticTests/viaYul/local_address_assignment.sol b/test/libsolidity/semanticTests/viaYul/local_address_assignment.sol index 35a2765ff54f..529513eafff5 100644 --- a/test/libsolidity/semanticTests/viaYul/local_address_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/local_address_assignment.sol @@ -4,7 +4,5 @@ contract C { x = b; } } -// ==== -// compileToEwasm: also // ---- // f(address): 0x1234 -> 0x1234 diff --git a/test/libsolidity/semanticTests/viaYul/local_assignment.sol b/test/libsolidity/semanticTests/viaYul/local_assignment.sol index 978b905e3869..f77d25c663d4 100644 --- a/test/libsolidity/semanticTests/viaYul/local_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/local_assignment.sol @@ -4,7 +4,5 @@ contract C { x = b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256): 6 -> 6 diff --git a/test/libsolidity/semanticTests/viaYul/local_bool_assignment.sol b/test/libsolidity/semanticTests/viaYul/local_bool_assignment.sol index c95cbf41aca1..d32e281dad56 100644 --- a/test/libsolidity/semanticTests/viaYul/local_bool_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/local_bool_assignment.sol @@ -4,7 +4,5 @@ contract C { x = b; } } -// ==== -// compileToEwasm: also // ---- // f(bool): true -> true diff --git a/test/libsolidity/semanticTests/viaYul/local_tuple_assignment.sol b/test/libsolidity/semanticTests/viaYul/local_tuple_assignment.sol index a6b14a9e0201..ff7f0785574e 100644 --- a/test/libsolidity/semanticTests/viaYul/local_tuple_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/local_tuple_assignment.sol @@ -21,8 +21,6 @@ contract C { (((d))) = (13); } } -// ==== -// compileToEwasm: also // ---- // x() -> 17 // f(uint256,uint256): 23, 42 -> 23, 42 diff --git a/test/libsolidity/semanticTests/viaYul/local_variable_without_init.sol b/test/libsolidity/semanticTests/viaYul/local_variable_without_init.sol index f11cd661f943..f1b2b1740bc3 100644 --- a/test/libsolidity/semanticTests/viaYul/local_variable_without_init.sol +++ b/test/libsolidity/semanticTests/viaYul/local_variable_without_init.sol @@ -4,7 +4,5 @@ contract C { return x; } } -// ==== -// compileToEwasm: also // ---- // f() -> 0 diff --git a/test/libsolidity/semanticTests/viaYul/loops/break.sol b/test/libsolidity/semanticTests/viaYul/loops/break.sol index 939cd0b7f646..77ecface7958 100644 --- a/test/libsolidity/semanticTests/viaYul/loops/break.sol +++ b/test/libsolidity/semanticTests/viaYul/loops/break.sol @@ -23,8 +23,6 @@ contract C { } while (x < 3); } } -// ==== -// compileToEwasm: also // ---- // f() -> 2 // g() -> 2 diff --git a/test/libsolidity/semanticTests/viaYul/loops/continue.sol b/test/libsolidity/semanticTests/viaYul/loops/continue.sol index 25e57dac19c5..b9c3f167d3a7 100644 --- a/test/libsolidity/semanticTests/viaYul/loops/continue.sol +++ b/test/libsolidity/semanticTests/viaYul/loops/continue.sol @@ -29,8 +29,6 @@ contract C { x = x + a; } } -// ==== -// compileToEwasm: also // ---- // f() -> 11 // g() -> 11 diff --git a/test/libsolidity/semanticTests/viaYul/loops/return.sol b/test/libsolidity/semanticTests/viaYul/loops/return.sol index 3f3b709bae3d..ee7062e70073 100644 --- a/test/libsolidity/semanticTests/viaYul/loops/return.sol +++ b/test/libsolidity/semanticTests/viaYul/loops/return.sol @@ -26,8 +26,6 @@ contract C { } while (x < 3); } } -// ==== -// compileToEwasm: also // ---- // f() -> 1 // g() -> 1 diff --git a/test/libsolidity/semanticTests/viaYul/loops/simple.sol b/test/libsolidity/semanticTests/viaYul/loops/simple.sol index 3a09098ab22a..a4d076325c39 100644 --- a/test/libsolidity/semanticTests/viaYul/loops/simple.sol +++ b/test/libsolidity/semanticTests/viaYul/loops/simple.sol @@ -29,8 +29,6 @@ contract C { for (;;) {break;} } } -// ==== -// compileToEwasm: also // ---- // f() -> 1024 // g() -> 1024 diff --git a/test/libsolidity/semanticTests/viaYul/memory_struct_allow.sol b/test/libsolidity/semanticTests/viaYul/memory_struct_allow.sol index 47213b7b4847..9f87c7b97d0f 100644 --- a/test/libsolidity/semanticTests/viaYul/memory_struct_allow.sol +++ b/test/libsolidity/semanticTests/viaYul/memory_struct_allow.sol @@ -15,7 +15,5 @@ contract C { return (s.a, s.b); } } -// ==== -// compileToEwasm: also // ---- // f() -> 0, 0 diff --git a/test/libsolidity/semanticTests/viaYul/msg_sender.sol b/test/libsolidity/semanticTests/viaYul/msg_sender.sol index 520c9be4e3e3..058f142f8694 100644 --- a/test/libsolidity/semanticTests/viaYul/msg_sender.sol +++ b/test/libsolidity/semanticTests/viaYul/msg_sender.sol @@ -5,7 +5,5 @@ contract C { return x == msg.sender; } } -// ==== -// compileToEwasm: also // ---- // test() -> true diff --git a/test/libsolidity/semanticTests/viaYul/require.sol b/test/libsolidity/semanticTests/viaYul/require.sol index 7546921f18ac..39677b4f5d3f 100644 --- a/test/libsolidity/semanticTests/viaYul/require.sol +++ b/test/libsolidity/semanticTests/viaYul/require.sol @@ -30,7 +30,6 @@ contract C { } // ==== // EVMVersion: >=byzantium -// compileToEwasm: also // ---- // f(bool): true -> true // f(bool): false -> FAILURE diff --git a/test/libsolidity/semanticTests/viaYul/return.sol b/test/libsolidity/semanticTests/viaYul/return.sol index c42353e60f36..f58632b964e8 100644 --- a/test/libsolidity/semanticTests/viaYul/return.sol +++ b/test/libsolidity/semanticTests/viaYul/return.sol @@ -4,7 +4,5 @@ contract C { x = 3; } } -// ==== -// compileToEwasm: also // ---- // f() -> 7 diff --git a/test/libsolidity/semanticTests/viaYul/return_and_convert.sol b/test/libsolidity/semanticTests/viaYul/return_and_convert.sol index 547838371eb7..78e9e3bea0c0 100644 --- a/test/libsolidity/semanticTests/viaYul/return_and_convert.sol +++ b/test/libsolidity/semanticTests/viaYul/return_and_convert.sol @@ -5,7 +5,5 @@ contract C { return b; } } -// ==== -// compileToEwasm: also // ---- // f() -> 255 diff --git a/test/libsolidity/semanticTests/viaYul/return_storage_pointers.sol b/test/libsolidity/semanticTests/viaYul/return_storage_pointers.sol index fd886596fda4..936058124b48 100644 --- a/test/libsolidity/semanticTests/viaYul/return_storage_pointers.sol +++ b/test/libsolidity/semanticTests/viaYul/return_storage_pointers.sol @@ -10,7 +10,5 @@ contract C { } } -// ==== -// compileToEwasm: also // ---- // g() -> 0, 0 diff --git a/test/libsolidity/semanticTests/viaYul/short_circuit.sol b/test/libsolidity/semanticTests/viaYul/short_circuit.sol index 5823f7734061..b160bbd77e94 100644 --- a/test/libsolidity/semanticTests/viaYul/short_circuit.sol +++ b/test/libsolidity/semanticTests/viaYul/short_circuit.sol @@ -8,8 +8,6 @@ contract C { y = x; } } -// ==== -// compileToEwasm: also // ---- // or(uint256): 0 -> true, 0 // and(uint256): 0 -> true, 8 diff --git a/test/libsolidity/semanticTests/viaYul/simple_assignment.sol b/test/libsolidity/semanticTests/viaYul/simple_assignment.sol index 016f7438dfb3..ed0ba28784dd 100644 --- a/test/libsolidity/semanticTests/viaYul/simple_assignment.sol +++ b/test/libsolidity/semanticTests/viaYul/simple_assignment.sol @@ -4,7 +4,5 @@ contract C { y = b; } } -// ==== -// compileToEwasm: also // ---- // f(uint256,uint256): 5, 6 -> 5, 6 diff --git a/test/libsolidity/semanticTests/viaYul/simple_inline_asm.sol b/test/libsolidity/semanticTests/viaYul/simple_inline_asm.sol index 99e0cbcdfa65..8e8cd78e87f2 100644 --- a/test/libsolidity/semanticTests/viaYul/simple_inline_asm.sol +++ b/test/libsolidity/semanticTests/viaYul/simple_inline_asm.sol @@ -11,7 +11,5 @@ contract C { x = a + b + c; } } -// ==== -// compileToEwasm: also // ---- // f() -> 6 diff --git a/test/libsolidity/semanticTests/viaYul/smoke_test.sol b/test/libsolidity/semanticTests/viaYul/smoke_test.sol index 6460ad90f31f..53a11869fefd 100644 --- a/test/libsolidity/semanticTests/viaYul/smoke_test.sol +++ b/test/libsolidity/semanticTests/viaYul/smoke_test.sol @@ -2,6 +2,5 @@ contract C { } // ==== // allowNonExistingFunctions: true -// compileToEwasm: also // ---- // f() -> FAILURE diff --git a/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_bytes.sol b/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_bytes.sol index f61808084b75..d1ec20db09b5 100644 --- a/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_bytes.sol +++ b/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_bytes.sol @@ -12,7 +12,5 @@ contract C { correct = r == (0x64 << 248); } } -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_static_array.sol b/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_static_array.sol index 59b63ddf2f83..7c035f05362a 100644 --- a/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_static_array.sol +++ b/test/libsolidity/semanticTests/viaYul/storage/dirty_storage_static_array.sol @@ -12,7 +12,5 @@ contract C { correct = (s[0] == 0x01) && (r == 0x01); } } -// ==== -// compileToEwasm: also // ---- // f() -> true diff --git a/test/libsolidity/semanticTests/viaYul/storage/packed_storage.sol b/test/libsolidity/semanticTests/viaYul/storage/packed_storage.sol index a39c0797dece..5253a6a1ab16 100644 --- a/test/libsolidity/semanticTests/viaYul/storage/packed_storage.sol +++ b/test/libsolidity/semanticTests/viaYul/storage/packed_storage.sol @@ -10,7 +10,5 @@ contract C { _x = x; } } -// ==== -// compileToEwasm: also // ---- // f(uint8): 6 -> 9 diff --git a/test/libsolidity/semanticTests/viaYul/storage/simple_storage.sol b/test/libsolidity/semanticTests/viaYul/storage/simple_storage.sol index df2575a8877d..03d7ed92051c 100644 --- a/test/libsolidity/semanticTests/viaYul/storage/simple_storage.sol +++ b/test/libsolidity/semanticTests/viaYul/storage/simple_storage.sol @@ -10,8 +10,6 @@ contract C { _y = y; } } -// ==== -// compileToEwasm: also // ---- // setX(uint256): 6 -> 6 // setY(uint256): 2 -> 2 diff --git a/test/libsolidity/semanticTests/viaYul/string_format.sol b/test/libsolidity/semanticTests/viaYul/string_format.sol index 49746adb4616..5869ea2e76fb 100644 --- a/test/libsolidity/semanticTests/viaYul/string_format.sol +++ b/test/libsolidity/semanticTests/viaYul/string_format.sol @@ -4,8 +4,6 @@ contract C { function g() external pure returns (bytes32) { return "abcabc"; } function h() external pure returns (bytes4) { return 0xcafecafe; } } -// ==== -// compileToEwasm: also // ---- // f1() -> 0x20, 6, left(0x616263616263) // f2() -> 32, 47, 44048183223289766195424279195050628400112610419087780792899004030957505095210, 18165586057823232067963737336409268114628061002662705707816940456850361417728 diff --git a/test/libsolidity/semanticTests/viaYul/string_literals.sol b/test/libsolidity/semanticTests/viaYul/string_literals.sol index f1140ffb4d7a..985d26354253 100644 --- a/test/libsolidity/semanticTests/viaYul/string_literals.sol +++ b/test/libsolidity/semanticTests/viaYul/string_literals.sol @@ -18,8 +18,6 @@ contract C { x = "abc"; } } -// ==== -// compileToEwasm: also // ---- // short_dyn() -> 0x20, 3, "abc" // long_dyn() -> 0x20, 80, "12345678901234567890123456789012", "34567890123456789012345678901234", "5678901234567890" diff --git a/test/libsolidity/semanticTests/viaYul/tuple_evaluation_order.sol b/test/libsolidity/semanticTests/viaYul/tuple_evaluation_order.sol index edde645880fb..e1a1689b7fc0 100644 --- a/test/libsolidity/semanticTests/viaYul/tuple_evaluation_order.sol +++ b/test/libsolidity/semanticTests/viaYul/tuple_evaluation_order.sol @@ -8,7 +8,5 @@ contract C { return (x, y); } } -// ==== -// compileToEwasm: also // ---- // f() -> 3, 1 diff --git a/test/libsolidity/semanticTests/viaYul/unary_fixedbytes.sol b/test/libsolidity/semanticTests/viaYul/unary_fixedbytes.sol index f0e811ac237c..d8e640713a05 100644 --- a/test/libsolidity/semanticTests/viaYul/unary_fixedbytes.sol +++ b/test/libsolidity/semanticTests/viaYul/unary_fixedbytes.sol @@ -58,8 +58,6 @@ contract C { return r; } } -// ==== -// compileToEwasm: also // ---- // conv(bytes25): left(0xff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff) -> 0xff00ff00ff00ff00ff00ff00ff00ff00ffffffffffffffffffffffffffffffff // upcast(bytes25): left(0xff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff) -> 0xff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0000000000000000 diff --git a/test/libsolidity/semanticTests/viaYul/unary_operations.sol b/test/libsolidity/semanticTests/viaYul/unary_operations.sol index 37a6e90d8447..17d8dad03472 100644 --- a/test/libsolidity/semanticTests/viaYul/unary_operations.sol +++ b/test/libsolidity/semanticTests/viaYul/unary_operations.sol @@ -84,7 +84,6 @@ contract C { } // ==== // compileViaYul: true -// compileToEwasm: also // ---- // preincr_s8(int8): 128 -> FAILURE // postincr_s8(int8): 128 -> FAILURE diff --git a/test/libsolidity/semanticTests/viaYul/various_inline_asm.sol b/test/libsolidity/semanticTests/viaYul/various_inline_asm.sol index dc9057121d06..b440d8e136c6 100644 --- a/test/libsolidity/semanticTests/viaYul/various_inline_asm.sol +++ b/test/libsolidity/semanticTests/viaYul/various_inline_asm.sol @@ -17,7 +17,5 @@ contract C { x = a + b + c; } } -// ==== -// compileToEwasm: also // ---- // f() -> 70 diff --git a/test/libsolidity/semanticTests/viaYul/virtual_functions.sol b/test/libsolidity/semanticTests/viaYul/virtual_functions.sol index ea43914b73c6..798f90ffd431 100644 --- a/test/libsolidity/semanticTests/viaYul/virtual_functions.sol +++ b/test/libsolidity/semanticTests/viaYul/virtual_functions.sol @@ -23,8 +23,6 @@ contract C is X { x = 3; } } -// ==== -// compileToEwasm: also // ---- // f() -> 3 // f1() -> 3 diff --git a/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls.sol b/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls.sol index 7c5658ae2b60..28705ee40ee8 100644 --- a/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls.sol +++ b/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls.sol @@ -14,8 +14,5 @@ contract Derived is Base { return 2; } } - -// ==== -// compileToEwasm: also // ---- // f() -> 2 diff --git a/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls_through_dispatch.sol b/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls_through_dispatch.sol index f74a2df7a9be..d83343048399 100644 --- a/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls_through_dispatch.sol +++ b/test/libsolidity/semanticTests/virtualFunctions/internal_virtual_function_calls_through_dispatch.sol @@ -19,8 +19,5 @@ contract Derived is Base { return f(); } } - -// ==== -// compileToEwasm: also // ---- // h() -> 2 diff --git a/test/libsolidity/semanticTests/virtualFunctions/virtual_function_calls.sol b/test/libsolidity/semanticTests/virtualFunctions/virtual_function_calls.sol index d277712f0d3d..ea543a786fdc 100644 --- a/test/libsolidity/semanticTests/virtualFunctions/virtual_function_calls.sol +++ b/test/libsolidity/semanticTests/virtualFunctions/virtual_function_calls.sol @@ -14,9 +14,6 @@ contract Derived is Base { return 2; } } - -// ==== -// compileToEwasm: also // ---- // g() -> 2 // f() -> 2 diff --git a/test/libsolidity/semanticTests/virtualFunctions/virtual_function_usage_in_constructor_arguments.sol b/test/libsolidity/semanticTests/virtualFunctions/virtual_function_usage_in_constructor_arguments.sol index d8417e3e266a..55a50a5c91cb 100644 --- a/test/libsolidity/semanticTests/virtualFunctions/virtual_function_usage_in_constructor_arguments.sol +++ b/test/libsolidity/semanticTests/virtualFunctions/virtual_function_usage_in_constructor_arguments.sol @@ -27,6 +27,5 @@ contract Derived is Base { return 2; } } - // ---- // getA() -> 2 diff --git a/test/libsolidity/smtCheckerTests/array_members/push_overflow_2_safe.sol b/test/libsolidity/smtCheckerTests/array_members/push_overflow_2_safe.sol index 5c0466ace414..798f8fce7bfd 100644 --- a/test/libsolidity/smtCheckerTests/array_members/push_overflow_2_safe.sol +++ b/test/libsolidity/smtCheckerTests/array_members/push_overflow_2_safe.sol @@ -9,7 +9,6 @@ contract C { assert(x[0] == 42 || x[0] == 23); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/array_members/push_struct_member_1.sol b/test/libsolidity/smtCheckerTests/array_members/push_struct_member_1.sol index 15330f39b0fe..bb69ec9eeceb 100644 --- a/test/libsolidity/smtCheckerTests/array_members/push_struct_member_1.sol +++ b/test/libsolidity/smtCheckerTests/array_members/push_struct_member_1.sol @@ -12,7 +12,6 @@ contract C { t.s.b.push(); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/array_members/push_struct_member_2.sol b/test/libsolidity/smtCheckerTests/array_members/push_struct_member_2.sol index 091ec74af698..ad7a675b0b0d 100644 --- a/test/libsolidity/smtCheckerTests/array_members/push_struct_member_2.sol +++ b/test/libsolidity/smtCheckerTests/array_members/push_struct_member_2.sol @@ -13,7 +13,6 @@ contract C { t.s[0].b.push(); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/complex/MerkleProof.sol b/test/libsolidity/smtCheckerTests/complex/MerkleProof.sol index 606625d3fe22..ac268409d8ac 100644 --- a/test/libsolidity/smtCheckerTests/complex/MerkleProof.sol +++ b/test/libsolidity/smtCheckerTests/complex/MerkleProof.sol @@ -30,7 +30,6 @@ library MerkleProof { return computedHash == root; } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/function_selector/homer.sol b/test/libsolidity/smtCheckerTests/function_selector/homer.sol index f4536e5bf0eb..a3bb0c64ba1a 100644 --- a/test/libsolidity/smtCheckerTests/function_selector/homer.sol +++ b/test/libsolidity/smtCheckerTests/function_selector/homer.sol @@ -38,8 +38,6 @@ contract Homer is ERC165, Simpson { assert(supportsInterface(type(PeaceMaker).interfaceId)); } } - - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_1.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_1.sol index 5bf37f0815cd..40a023bb47e3 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_1.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_1.sol @@ -9,7 +9,6 @@ contract C assert(x > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol index c77359fd424a..ceb42881ff3b 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_1_fail.sol @@ -9,7 +9,6 @@ contract C assert(x > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_2.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_2.sol index 1ecdd5c8b87d..54d0abaf7543 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_2.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_2.sol @@ -13,7 +13,6 @@ contract C assert(x > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol index 33f37ffcc9c5..4d6ff0a64711 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_2_fail.sol @@ -13,7 +13,6 @@ contract C assert(x > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple.sol index 4c9885ff6e34..e140fdedce29 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple.sol @@ -9,7 +9,6 @@ contract C assert(x > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple_fail.sol index 9da6fd551ec1..b511dc63bc02 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_identity_as_tuple_fail.sol @@ -9,7 +9,6 @@ contract C assert(x > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_recursive.sol b/test/libsolidity/smtCheckerTests/functions/functions_recursive.sol index 4f664fb04102..0e3699e6be72 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_recursive.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_recursive.sol @@ -11,7 +11,6 @@ contract C assert(a == 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1.sol b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1.sol index b7148bc7305b..2b6289b95fa9 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1.sol @@ -10,7 +10,6 @@ contract C assert(a > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1_fail.sol index e775c97a9a0a..3e045cee7036 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_1_fail.sol @@ -10,7 +10,6 @@ contract C assert(a > 0); } } - // ==== // SMTEngine: all // SMTIgnoreOS: macos diff --git a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2.sol b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2.sol index 5bfb5dcc8e71..001067a28ad3 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2.sol @@ -11,7 +11,6 @@ contract C assert(a > 1); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2_fail.sol b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2_fail.sol index 29fd5aefbce5..35906db3b991 100644 --- a/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2_fail.sol +++ b/test/libsolidity/smtCheckerTests/functions/functions_storage_var_2_fail.sol @@ -11,7 +11,6 @@ contract C assert(a > 0); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/functions/library_after_contract.sol b/test/libsolidity/smtCheckerTests/functions/library_after_contract.sol index e98556f99455..7fe00f5724cc 100644 --- a/test/libsolidity/smtCheckerTests/functions/library_after_contract.sol +++ b/test/libsolidity/smtCheckerTests/functions/library_after_contract.sol @@ -10,7 +10,6 @@ library L { return x; } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol b/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol index 694d110e195e..15bb168a72a0 100644 --- a/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol +++ b/test/libsolidity/smtCheckerTests/operators/assignment_contract_member_variable_array_2.sol @@ -5,7 +5,6 @@ contract A { A.a[0] = 2; } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/special/msg_value_inheritance_3.sol b/test/libsolidity/smtCheckerTests/special/msg_value_inheritance_3.sol index b2f083e025e4..fc8d6e08f300 100644 --- a/test/libsolidity/smtCheckerTests/special/msg_value_inheritance_3.sol +++ b/test/libsolidity/smtCheckerTests/special/msg_value_inheritance_3.sol @@ -15,7 +15,6 @@ contract C is A, B { assert(msg.value >= 0); // should hold } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/special/range_check.sol b/test/libsolidity/smtCheckerTests/special/range_check.sol index 210aed4daea4..8880a68a7a0f 100644 --- a/test/libsolidity/smtCheckerTests/special/range_check.sol +++ b/test/libsolidity/smtCheckerTests/special/range_check.sol @@ -55,7 +55,6 @@ contract D { } } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/try_catch/try_inside_if.sol b/test/libsolidity/smtCheckerTests/try_catch/try_inside_if.sol index 4c82cebd99fb..4a65bd9a3003 100644 --- a/test/libsolidity/smtCheckerTests/try_catch/try_inside_if.sol +++ b/test/libsolidity/smtCheckerTests/try_catch/try_inside_if.sol @@ -8,7 +8,6 @@ contract C { } } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_3.sol b/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_3.sol index 6b5d727caaef..37ef3158e1e8 100644 --- a/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_3.sol +++ b/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_3.sol @@ -5,7 +5,6 @@ contract D { data.push(inner); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_4.sol b/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_4.sol index 7173d57ba45c..f0049b3f3dce 100644 --- a/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_4.sol +++ b/test/libsolidity/smtCheckerTests/types/static_array_implicit_push_4.sol @@ -5,7 +5,6 @@ contract D { data.push(inner); } } - // ==== // SMTEngine: all // ---- diff --git a/test/libsolidity/smtCheckerTests/unchecked/unchecked_double_with_modifier.sol b/test/libsolidity/smtCheckerTests/unchecked/unchecked_double_with_modifier.sol index 55931bfa98b4..5db44309d1d1 100644 --- a/test/libsolidity/smtCheckerTests/unchecked/unchecked_double_with_modifier.sol +++ b/test/libsolidity/smtCheckerTests/unchecked/unchecked_double_with_modifier.sol @@ -11,8 +11,6 @@ contract C { unchecked { t(); } } } - - // ==== // SMTEngine: all // ---- diff --git a/test/libyul/Common.cpp b/test/libyul/Common.cpp index 11896d2f910f..800684f35376 100644 --- a/test/libyul/Common.cpp +++ b/test/libyul/Common.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -119,11 +118,6 @@ std::map const vali "yul", [](langutil::EVMVersion) -> yul::Dialect const& { return yul::Dialect::yulDeprecated(); } - }, - { - "ewasm", - [](langutil::EVMVersion) -> yul::Dialect const& - { return yul::WasmDialect::instance(); } } }; diff --git a/test/libyul/EwasmTranslationTest.cpp b/test/libyul/EwasmTranslationTest.cpp deleted file mode 100644 index f40bc2e42042..000000000000 --- a/test/libyul/EwasmTranslationTest.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -#include - -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include - -#include - -using namespace solidity; -using namespace solidity::util; -using namespace solidity::langutil; -using namespace solidity::yul; -using namespace solidity::yul::test; -using namespace solidity::frontend; -using namespace solidity::frontend::test; -using namespace std; - - -EwasmTranslationTest::EwasmTranslationTest(string const& _filename): - EVMVersionRestrictedTestCase(_filename) -{ - m_source = m_reader.source(); - m_expectation = m_reader.simpleExpectations(); -} - -TestCase::TestResult EwasmTranslationTest::run(ostream& _stream, string const& _linePrefix, bool const _formatted) -{ - if (!parse(_stream, _linePrefix, _formatted)) - return TestResult::FatalError; - - *m_object = EVMToEwasmTranslator( - EVMDialect::strictAssemblyForEVMObjects(solidity::test::CommonOptions::get().evmVersion()), - m_stack - ).run(*m_object); - - // Add call to "main()". - m_object->code->statements.emplace_back( - ExpressionStatement{{}, FunctionCall{{}, Identifier{{}, "main"_yulstring}, {}}} - ); - - m_obtainedResult = interpret(); - - return checkResult(_stream, _linePrefix, _formatted); -} - -bool EwasmTranslationTest::parse(ostream& _stream, string const& _linePrefix, bool const _formatted) -{ - m_stack = YulStack( - solidity::test::CommonOptions::get().evmVersion(), - solidity::test::CommonOptions::get().eofVersion(), - YulStack::Language::StrictAssembly, - solidity::frontend::OptimiserSettings::none(), - DebugInfoSelection::All() - ); - if (m_stack.parseAndAnalyze("", m_source)) - { - m_object = m_stack.parserResult(); - return true; - } - else - { - AnsiColorized(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Error parsing source." << endl; - SourceReferenceFormatter{_stream, m_stack, true, false} - .printErrorInformation(m_stack.errors()); - return false; - } -} - -string EwasmTranslationTest::interpret() -{ - InterpreterState state; - state.maxTraceSize = 10000; - state.maxSteps = 1000000; - state.maxExprNesting = 64; - try - { - Interpreter::run( - state, - WasmDialect{}, - *m_object->code, - /*disableExternalCalls=*/true, - /*disableMemoryTracing=*/false - ); - } - catch (InterpreterTerminatedGeneric const&) - { - } - - stringstream result; - state.dumpTraceAndState(result, false); - return result.str(); -} diff --git a/test/libyul/EwasmTranslationTest.h b/test/libyul/EwasmTranslationTest.h deleted file mode 100644 index d54b8732a0ed..000000000000 --- a/test/libyul/EwasmTranslationTest.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 - -#pragma once - -#include - -#include - -namespace solidity::yul -{ -struct Object; -class YulStack; -} - -namespace solidity::yul::test -{ - -class EwasmTranslationTest: public solidity::frontend::test::EVMVersionRestrictedTestCase -{ -public: - static std::unique_ptr create(Config const& _config) - { - return std::make_unique(_config.filename); - } - - explicit EwasmTranslationTest(std::string const& _filename); - - TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool const _formatted = false) override; - -private: - bool parse(std::ostream& _stream, std::string const& _linePrefix, bool const _formatted); - std::string interpret(); - - std::shared_ptr m_object; - YulStack m_stack; -}; - -} diff --git a/test/libyul/ObjectCompilerTest.cpp b/test/libyul/ObjectCompilerTest.cpp index 3a8d966922cb..74a680b9b7c0 100644 --- a/test/libyul/ObjectCompilerTest.cpp +++ b/test/libyul/ObjectCompilerTest.cpp @@ -59,7 +59,6 @@ ObjectCompilerTest::ObjectCompilerTest(string const& _filename): }, "minimal" ); - m_wasm = m_reader.boolSetting("wasm", false); m_expectation = m_reader.simpleExpectations(); } @@ -68,7 +67,7 @@ TestCase::TestResult ObjectCompilerTest::run(ostream& _stream, string const& _li YulStack stack( EVMVersion(), nullopt, - m_wasm ? YulStack::Language::Ewasm : YulStack::Language::StrictAssembly, + YulStack::Language::StrictAssembly, OptimiserSettings::preset(m_optimisationPreset), DebugInfoSelection::All() ); @@ -81,33 +80,22 @@ TestCase::TestResult ObjectCompilerTest::run(ostream& _stream, string const& _li } stack.optimize(); - if (m_wasm) - { - MachineAssemblyObject obj = stack.assemble(YulStack::Machine::Ewasm); - solAssert(obj.bytecode, ""); + MachineAssemblyObject obj = stack.assemble(YulStack::Machine::EVM); + solAssert(obj.bytecode, ""); + solAssert(obj.sourceMappings, ""); - m_obtainedResult = "Text:\n" + obj.assembly + "\n"; - m_obtainedResult += "Binary:\n" + util::toHex(obj.bytecode->bytecode) + "\n"; - } + m_obtainedResult = "Assembly:\n" + obj.assembly; + if (obj.bytecode->bytecode.empty()) + m_obtainedResult += "-- empty bytecode --\n"; else - { - MachineAssemblyObject obj = stack.assemble(YulStack::Machine::EVM); - solAssert(obj.bytecode, ""); - solAssert(obj.sourceMappings, ""); - - m_obtainedResult = "Assembly:\n" + obj.assembly; - if (obj.bytecode->bytecode.empty()) - m_obtainedResult += "-- empty bytecode --\n"; - else - m_obtainedResult += - "Bytecode: " + - util::toHex(obj.bytecode->bytecode) + - "\nOpcodes: " + - boost::trim_copy(evmasm::disassemble(obj.bytecode->bytecode, solidity::test::CommonOptions::get().evmVersion())) + - "\nSourceMappings:" + - (obj.sourceMappings->empty() ? "" : " " + *obj.sourceMappings) + - "\n"; - } + m_obtainedResult += + "Bytecode: " + + util::toHex(obj.bytecode->bytecode) + + "\nOpcodes: " + + boost::trim_copy(evmasm::disassemble(obj.bytecode->bytecode, solidity::test::CommonOptions::get().evmVersion())) + + "\nSourceMappings:" + + (obj.sourceMappings->empty() ? "" : " " + *obj.sourceMappings) + + "\n"; return checkResult(_stream, _linePrefix, _formatted); } diff --git a/test/libyul/ObjectCompilerTest.h b/test/libyul/ObjectCompilerTest.h index c7880fe55637..fe899870022e 100644 --- a/test/libyul/ObjectCompilerTest.h +++ b/test/libyul/ObjectCompilerTest.h @@ -55,7 +55,6 @@ class ObjectCompilerTest: public solidity::frontend::test::TestCase void disambiguate(); frontend::OptimisationPreset m_optimisationPreset; - bool m_wasm = false; }; } diff --git a/test/libyul/YulOptimizerTestCommon.cpp b/test/libyul/YulOptimizerTestCommon.cpp index 7623efc12cad..7e5f324305ed 100644 --- a/test/libyul/YulOptimizerTestCommon.cpp +++ b/test/libyul/YulOptimizerTestCommon.cpp @@ -61,8 +61,6 @@ #include #include #include -#include -#include #include #include @@ -326,11 +324,6 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( StackCompressor::run(*m_dialect, *m_object, true, maxIterations); BlockFlattener::run(*m_context, *m_ast); }}, - {"wordSizeTransform", [&]() { - disambiguate(); - ExpressionSplitter::run(*m_context, *m_ast); - WordSizeTransform::run(*m_dialect, *m_dialect, *m_ast, *m_nameDispenser); - }}, {"fullSuite", [&]() { GasMeter meter(dynamic_cast(*m_dialect), false, 200); OptimiserSuite::run( diff --git a/test/libyul/ewasmTranslationTests/address.yul b/test/libyul/ewasmTranslationTests/address.yul deleted file mode 100644 index 0290bad4d487..000000000000 --- a/test/libyul/ewasmTranslationTests/address.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, address()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000011111111 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000011111111 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_add.yul b/test/libyul/ewasmTranslationTests/arithmetic_add.yul deleted file mode 100644 index b2203070fcf4..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_add.yul +++ /dev/null @@ -1,35 +0,0 @@ -{ - sstore(0, add(0, 1)) - sstore(1, add(1, not(0))) - sstore(2, add(0, 0)) - sstore(3, add(1, 2)) - sstore(4, add(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1)) - sstore(5, add( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, add(not(0), 1)) - sstore(7, add(0xffffffffffffffffffffffffffffffff, 1)) - sstore(8, add(0xffffffffffffffff, 1)) - sstore(9, add(0xffffffffffffffffffffffffffffffff0000000000000000, 1)) - sstore(10, add(0xffffffffffffffffffffffffffffffffffffffffffffffff, 3)) - sstore(11, add(0xffffffffffffffffffffffffffffffff, 3)) - sstore(12, add(0xffffffffffffffff, 3)) - sstore(13, add(0xffffffffffffffffffffffffffffffff0000000000000000, 3)) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000d -// 20: 0000000000000000ffffffffffffffffffffffffffffffff0000000000000003 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000003 -// 0000000000000000000000000000000000000000000000000000000000000004: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000005: 8000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000007: 0000000000000000000000000000000100000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000008: 0000000000000000000000000000000000000000000000010000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000009: 0000000000000000ffffffffffffffffffffffffffffffff0000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000001000000000000000000000000000000000000000000000002 -// 000000000000000000000000000000000000000000000000000000000000000b: 0000000000000000000000000000000100000000000000000000000000000002 -// 000000000000000000000000000000000000000000000000000000000000000c: 0000000000000000000000000000000000000000000000010000000000000002 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000ffffffffffffffffffffffffffffffff0000000000000003 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_addmod.yul b/test/libyul/ewasmTranslationTests/arithmetic_addmod.yul deleted file mode 100644 index 40b84764ede8..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_addmod.yul +++ /dev/null @@ -1,25 +0,0 @@ -{ - sstore(0, addmod(0, 1, 1)) - sstore(1, addmod(0, 1, 2)) - sstore(2, addmod(3, 1, 2)) - sstore(3, addmod(1, not(0), 5)) - sstore(4, addmod(0, 0, 0)) - sstore(5, addmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1, 1)) - sstore(6, addmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1, 0)) - sstore(7, addmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd, 1, 5)) - sstore(8, addmod( - 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, - 5 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000008 -// 20: 0000000000000000000000000000000000000000000000000000000000000004 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000007: 0000000000000000000000000000000000000000000000000000000000000004 -// 0000000000000000000000000000000000000000000000000000000000000008: 0000000000000000000000000000000000000000000000000000000000000004 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_div.yul b/test/libyul/ewasmTranslationTests/arithmetic_div.yul deleted file mode 100644 index f32c244a9f03..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_div.yul +++ /dev/null @@ -1,34 +0,0 @@ -{ - sstore(0, div(0, 1)) - sstore(1, div(1, not(0))) - sstore(2, div(0, 0)) - sstore(3, div(1, 2)) - sstore(4, div(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1)) - sstore(5, div( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, div(not(0), 1)) - sstore(7, div(0xffffffffffffffffffffffffffffffff, 1)) - sstore(8, div(0xffffffffffffffff, 1)) - sstore(9, div(0xffffffffffffffffffffffffffffffff0000000000000000, 1)) - sstore(10, div(0xffffffffffffffffffffffffffffffffffffffffffffffff, 3)) - sstore(11, div(0xffffffffffffffffffffffffffffffff, 3)) - sstore(12, div(0xffffffffffffffff, 3)) - sstore(13, div(0xffffffffffffffffffffffffffffffff0000000000000000, 3)) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000d -// 20: 0000000000000000555555555555555555555555555555550000000000000000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000004: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -// 0000000000000000000000000000000000000000000000000000000000000005: 8000000000000000000000000000000000000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000006: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000007: 00000000000000000000000000000000ffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000008: 000000000000000000000000000000000000000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000009: 0000000000000000ffffffffffffffffffffffffffffffff0000000000000000 -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000000555555555555555555555555555555555555555555555555 -// 000000000000000000000000000000000000000000000000000000000000000b: 0000000000000000000000000000000055555555555555555555555555555555 -// 000000000000000000000000000000000000000000000000000000000000000c: 0000000000000000000000000000000000000000000000005555555555555555 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000555555555555555555555555555555550000000000000000 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_exp.yul b/test/libyul/ewasmTranslationTests/arithmetic_exp.yul deleted file mode 100644 index 6428e73437bf..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_exp.yul +++ /dev/null @@ -1,40 +0,0 @@ -{ - sstore(0, exp(0, 1)) - sstore(1, exp(1, not(0))) - sstore(2, exp(0, 0)) - sstore(3, exp(1, 2)) - sstore(4, exp(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1)) - sstore(5, exp( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, exp(not(0), 1)) - sstore(7, exp(0xffffffffffffffffffffffffffffffff, 2)) - sstore(8, exp(0xffffffffffffffff, 2)) - sstore(9, exp(0xffffffffffffffffffffffffffffffff0000000000000000, 2)) - sstore(10, exp(0xffffffffffffffffffffffffffffffffffffffffffffffff, 3)) - sstore(11, exp(0xffffffffffffffffffffffffffffffff, 3)) - sstore(12, exp(0xffffffffffffffff, 3)) - sstore(13, exp(0xffffffffffffffffffffffffffffffff0000000000000000, 3)) - sstore(14, exp(2, 256)) - sstore(15, exp(2, 255)) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000f -// 20: 8000000000000000000000000000000000000000000000000000000000000000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000002: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000004: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -// 0000000000000000000000000000000000000000000000000000000000000005: 8000000000000000000000000000000000000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000006: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000007: fffffffffffffffffffffffffffffffe00000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000008: 00000000000000000000000000000000fffffffffffffffe0000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000009: 0000000000000000000000000000000100000000000000000000000000000000 -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000002ffffffffffffffffffffffffffffffffffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000b: 00000000000000000000000000000002ffffffffffffffffffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000c: 0000000000000000fffffffffffffffd0000000000000002ffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000d: ffffffffffffffff000000000000000000000000000000000000000000000000 -// 000000000000000000000000000000000000000000000000000000000000000f: 8000000000000000000000000000000000000000000000000000000000000000 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_mod.yul b/test/libyul/ewasmTranslationTests/arithmetic_mod.yul deleted file mode 100644 index 38cc808bf4a2..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_mod.yul +++ /dev/null @@ -1,29 +0,0 @@ -{ - sstore(0, mod(0, 1)) - sstore(1, mod(1, not(0))) - sstore(2, mod(0, 0)) - sstore(3, mod(1, 2)) - sstore(4, mod(not(0), 1)) - sstore(5, mod( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, mod(not(0), 1)) - sstore(7, mod(0xffffffffffffffffffffffffffffffff, 1)) - sstore(8, mod(0xffffffffffffffffffffffffffffffffffffffffffffffff, 0xfffffffffffffffffffffffffffffffe)) - sstore(9, mod(0xffffffffffffffffffffffffffffffffffffffffffffffff, 5)) - sstore(10, mod(0xffffffffffffffffffffffffffffffffffffffffffffffff, 4)) - sstore(11, mod(0xffffffffffffffffffffffffffffffff, 3)) - sstore(12, mod(0xffffffffffffffff, 3)) - sstore(13, mod(0xffffffffffffffffffffffffffffffff0000000000000000, 0xffffffffffffffff43342553000)) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000d -// 20: 0000000000000000000000000000000000000aacffffffff8b3c03a314db9000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000008: 000000000000000000000000000000000000000000000001ffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000000000000000000000000000000000000000000000000000003 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000000000000000000000000aacffffffff8b3c03a314db9000 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_mul.yul b/test/libyul/ewasmTranslationTests/arithmetic_mul.yul deleted file mode 100644 index 73e1bf3d86ba..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_mul.yul +++ /dev/null @@ -1,36 +0,0 @@ -{ - sstore(0, mul(0, 1)) - sstore(1, mul(1, not(0))) - sstore(2, mul(0, 0)) - sstore(3, mul(1, 2)) - sstore(4, mul(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1)) - sstore(5, mul( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, mul(not(0), 1)) - sstore(7, mul(0xffffffffffffffffffffffffffffffff, 1)) - sstore(8, mul(0xffffffffffffffff, 1)) - sstore(9, mul(0xffffffffffffffffffffffffffffffff0000000000000000, 1)) - sstore(10, mul(0xffffffffffffffffffffffffffffffffffffffffffffffff, 3)) - sstore(11, mul(0xffffffffffffffffffffffffffffffff, 3)) - sstore(12, mul(0xffffffffffffffff, 3)) - sstore(13, mul(0xffffffffffffffffffffffffffffffff0000000000000000, 3)) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000d -// 20: 0000000000000002fffffffffffffffffffffffffffffffd0000000000000000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000002 -// 0000000000000000000000000000000000000000000000000000000000000004: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -// 0000000000000000000000000000000000000000000000000000000000000005: 8000000000000000000000000000000000000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000006: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000007: 00000000000000000000000000000000ffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000008: 000000000000000000000000000000000000000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000009: 0000000000000000ffffffffffffffffffffffffffffffff0000000000000000 -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000002fffffffffffffffffffffffffffffffffffffffffffffffd -// 000000000000000000000000000000000000000000000000000000000000000b: 00000000000000000000000000000002fffffffffffffffffffffffffffffffd -// 000000000000000000000000000000000000000000000000000000000000000c: 000000000000000000000000000000000000000000000002fffffffffffffffd -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000002fffffffffffffffffffffffffffffffd0000000000000000 diff --git a/test/libyul/ewasmTranslationTests/arithmetic_mulmod.yul b/test/libyul/ewasmTranslationTests/arithmetic_mulmod.yul deleted file mode 100644 index ef6efafd4214..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_mulmod.yul +++ /dev/null @@ -1,27 +0,0 @@ -{ - sstore(0, mulmod(0, 1, 2)) - sstore(1, mulmod(1, not(0), 5)) - sstore(2, mulmod(0, 0, 5)) - sstore(3, mulmod(1, 3, 2)) - sstore(4, mulmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, - 1, - 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) - sstore(5, mulmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1, 1)) - sstore(6, mulmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, 1, 0)) - sstore(7, mulmod(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd, 1, 5)) - sstore(8, mulmod( - not(0), - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, - 25 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000008 -// 20: 000000000000000000000000000000000000000000000000000000000000000f -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000004: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -// 0000000000000000000000000000000000000000000000000000000000000007: 0000000000000000000000000000000000000000000000000000000000000003 -// 0000000000000000000000000000000000000000000000000000000000000008: 000000000000000000000000000000000000000000000000000000000000000f diff --git a/test/libyul/ewasmTranslationTests/arithmetic_sdiv.yul b/test/libyul/ewasmTranslationTests/arithmetic_sdiv.yul deleted file mode 100644 index 0cefb340586c..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_sdiv.yul +++ /dev/null @@ -1,33 +0,0 @@ -{ - sstore(0, sdiv(0, 1)) - sstore(1, sdiv(0, not(0))) - sstore(2, sdiv(0, 0)) - sstore(3, sdiv(1, 2)) - sstore(4, sdiv(not(0), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe)) - sstore(5, sdiv(0x8000000000000000000000000000000000000000000000000000000000000000, not(0))) - sstore(6, sdiv(not(0), 0x8000000000000000000000000000000000000000000000000000000000000000)) - sstore(7, sdiv(0x7000000000000000000000000000000000000000000000000000000000000000, 1)) - sstore(8, sdiv(1, 0x7000000000000000000000000000000000000000000000000000000000000000)) - sstore(9, sdiv(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, not(0))) - sstore(10, sdiv(not(0), 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) - sstore(11, sdiv(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 1)) - sstore(12, sdiv(not(0), not(0))) - sstore(13, sdiv( - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe, - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe - )) - sstore(14, sdiv(0x8000000000000000000000000000000000000000000000000000000000000001, not(0))) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000e -// 20: 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000005: 8000000000000000000000000000000000000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000007: 7000000000000000000000000000000000000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000009: 8000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000b: 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000c: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000e: 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/test/libyul/ewasmTranslationTests/arithmetic_smod.yul b/test/libyul/ewasmTranslationTests/arithmetic_smod.yul deleted file mode 100644 index cffb8f73d3c7..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_smod.yul +++ /dev/null @@ -1,33 +0,0 @@ -{ - sstore(0, smod(0, 1)) - sstore(1, smod(1, not(0))) - sstore(2, smod(0, 0)) - sstore(3, smod(1, 2)) - sstore(4, smod(not(0), 1)) - sstore(5, smod( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, smod(not(0), 1)) - sstore(7, smod(0xffffffffffffffffffffffffffffffff, 1)) - sstore(8, smod(0xffffffffffffffffffffffffffffffffffffffffffffffff, 0xfffffffffffffffffffffffffffffffe)) - sstore(9, smod(0xffffffffffffffffffffffffffffffffffffffffffffffff, 5)) - sstore(10, smod(0xffffffffffffffffffffffffffffffffffffffffffffffff, 4)) - sstore(11, smod(0xffffffffffffffffffffffffffffffff, 3)) - sstore(12, smod(0xffffffffffffffff, 3)) - sstore(13, smod(0xffffffffffffffffffffffffffffffff0000000000000000, 0xffffffffffffffff43342553000)) - sstore(14, smod( - 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd, - 0xffffffffffffffff43342553000 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000e -// 20: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000008: 000000000000000000000000000000000000000000000001ffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000000000000000000000000000000000000000000000000000003 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000000000000000000000000aacffffffff8b3c03a314db9000 -// 000000000000000000000000000000000000000000000000000000000000000e: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd diff --git a/test/libyul/ewasmTranslationTests/arithmetic_sub.yul b/test/libyul/ewasmTranslationTests/arithmetic_sub.yul deleted file mode 100644 index fefb5d682439..000000000000 --- a/test/libyul/ewasmTranslationTests/arithmetic_sub.yul +++ /dev/null @@ -1,36 +0,0 @@ -{ - sstore(0, sub(0, 1)) - sstore(1, sub(1, not(0))) - sstore(2, sub(0, 0)) - sstore(3, sub(1, 2)) - sstore(4, sub(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 1)) - sstore(5, sub( - 0x8000000000000000000000000000000000000000000000000000000000000000, 1 - )) - sstore(6, sub(not(0), 1)) - sstore(7, sub(not(0), not(0))) - sstore(8, sub(0x1000000000000000000000000000000000000000000000000, 1)) - sstore(9, sub(0x100000000000000000000000000000000, 1)) - sstore(10, sub(0x10000000000000000, 1)) - sstore(11, sub(0x1000000000000000000000000000000000000000000000000, 3)) - sstore(12, sub(0x100000000000000000000000000000000, 3)) - sstore(13, sub(0x10000000000000000, 3)) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000d -// 20: 000000000000000000000000000000000000000000000000fffffffffffffffd -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000002 -// 0000000000000000000000000000000000000000000000000000000000000003: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000004: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -// 0000000000000000000000000000000000000000000000000000000000000005: 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000006: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe -// 0000000000000000000000000000000000000000000000000000000000000008: 0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000009: 00000000000000000000000000000000ffffffffffffffffffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000a: 000000000000000000000000000000000000000000000000ffffffffffffffff -// 000000000000000000000000000000000000000000000000000000000000000b: 0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffd -// 000000000000000000000000000000000000000000000000000000000000000c: 00000000000000000000000000000000fffffffffffffffffffffffffffffffd -// 000000000000000000000000000000000000000000000000000000000000000d: 000000000000000000000000000000000000000000000000fffffffffffffffd diff --git a/test/libyul/ewasmTranslationTests/balance.yul b/test/libyul/ewasmTranslationTests/balance.yul deleted file mode 100644 index f8bb5017aed1..000000000000 --- a/test/libyul/ewasmTranslationTests/balance.yul +++ /dev/null @@ -1,12 +0,0 @@ -{ - sstore(0, balance(address())) - sstore(1, balance(0)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000001 -// 20: 0000000000000000000000000000000000000000000000000000000022222222 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000022222222 -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000022222222 diff --git a/test/libyul/ewasmTranslationTests/bitwise_and.yul b/test/libyul/ewasmTranslationTests/bitwise_and.yul deleted file mode 100644 index 6d5bfbb237d3..000000000000 --- a/test/libyul/ewasmTranslationTests/bitwise_and.yul +++ /dev/null @@ -1,24 +0,0 @@ -{ - sstore(0, and(not(0), 0)) - sstore(1, and(not(0), not(0))) - sstore(2, and(not(0), 0xffffffffffffffff)) - sstore(3, and(not(0), 0xffffffffffffffffff00000000000000)) - sstore(4, and(not(0), 0xffffffffffffffffff00000000000000ffffffffffffffff)) - sstore(5, and(not(0), 0xffffffffffffffffff00000000000000ffffffffffffffff0000000000000000)) - sstore(6, and(not(0), 0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555)) - sstore(7, and( - 0x5555555555550000aaaaaaaaaaaaaa000000aaaaaaaaa000000aaaaaaaaaaaaa, - 0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000007 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000002: 000000000000000000000000000000000000000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000003: 00000000000000000000000000000000ffffffffffffffffff00000000000000 -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000ffffffffffffffffff00000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000005: ffffffffffffffffff00000000000000ffffffffffffffff0000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000006: aaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555 diff --git a/test/libyul/ewasmTranslationTests/bitwise_not.yul b/test/libyul/ewasmTranslationTests/bitwise_not.yul deleted file mode 100644 index 706d810b4aed..000000000000 --- a/test/libyul/ewasmTranslationTests/bitwise_not.yul +++ /dev/null @@ -1,25 +0,0 @@ -{ - sstore(0, not(0)) - sstore(1, not(not(0))) - sstore(2, not(0xffffffffffffffff)) - sstore(3, not(0xffffffffffffffffff00000000000000)) - sstore(4, not(0xffffffffffffffffff00000000000000ffffffffffffffff)) - sstore(5, not(0xffffffffffffffffff00000000000000ffffffffffffffff0000000000000000)) - sstore(6, not(0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555)) - sstore(7, not(0x5555555555550000aaaaaaaaaaaaaa000000aaaaaaaaa000000aaaaaaaaaaaaa)) - sstore(8, not(0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000008 -// 20: 55555555555555aaaaaaaaaaaaaaaaaa55aaaaaaaaaaaaa55aaaaaaaaaaaaaaa -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000002: ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000003: ffffffffffffffffffffffffffffffff000000000000000000ffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000004: ffffffffffffffff000000000000000000ffffffffffffff0000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000005: 000000000000000000ffffffffffffff0000000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000006: 55555555555555aaaaaaaaaaaaaaaaaa55aaaaaaaaaaaaa55aaaaaaaaaaaaaaa -// 0000000000000000000000000000000000000000000000000000000000000007: aaaaaaaaaaaaffff55555555555555ffffff555555555ffffff5555555555555 -// 0000000000000000000000000000000000000000000000000000000000000008: 55555555555555aaaaaaaaaaaaaaaaaa55aaaaaaaaaaaaa55aaaaaaaaaaaaaaa diff --git a/test/libyul/ewasmTranslationTests/bitwise_or.yul b/test/libyul/ewasmTranslationTests/bitwise_or.yul deleted file mode 100644 index d9d645d86a6c..000000000000 --- a/test/libyul/ewasmTranslationTests/bitwise_or.yul +++ /dev/null @@ -1,26 +0,0 @@ -{ - sstore(0, or(0, 0)) - sstore(1, or(0, not(0))) - sstore(2, or(0, 0xffffffffffffffff)) - sstore(3, or(0, 0xffffffffffffffffff00000000000000)) - sstore(4, or(0, 0xffffffffffffffffff00000000000000ffffffffffffffff)) - sstore(5, or(0, 0xffffffffffffffffff00000000000000ffffffffffffffff0000000000000000)) - sstore(6, or(0, 0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555)) - sstore(7, or( - 0x5555555555550000aaaaaaaaaaaaaa000000aaaaaaaaa000000aaaaaaaaaaaaa, - 0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000007 -// 20: ffffffffffffaa55ffffffffffffff55aa55fffffffff55aa55fffffffffffff -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000002: 000000000000000000000000000000000000000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000003: 00000000000000000000000000000000ffffffffffffffffff00000000000000 -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000ffffffffffffffffff00000000000000ffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000005: ffffffffffffffffff00000000000000ffffffffffffffff0000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000006: aaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555 -// 0000000000000000000000000000000000000000000000000000000000000007: ffffffffffffaa55ffffffffffffff55aa55fffffffff55aa55fffffffffffff diff --git a/test/libyul/ewasmTranslationTests/bitwise_xor.yul b/test/libyul/ewasmTranslationTests/bitwise_xor.yul deleted file mode 100644 index b358bacb5f20..000000000000 --- a/test/libyul/ewasmTranslationTests/bitwise_xor.yul +++ /dev/null @@ -1,27 +0,0 @@ -{ - sstore(0, xor(0xffff, 0)) - sstore(1, xor(0xffff, not(0))) - sstore(2, xor(0xffff, 0xffffffffffffffff)) - sstore(3, xor(0xffff, 0xffffffffffffffffff00000000000000)) - sstore(4, xor(0xffff, 0xffffffffffffffffff00000000000000ffffffffffffffff)) - sstore(5, xor(0xffff, 0xffffffffffffffffff00000000000000ffffffffffffffff0000000000000000)) - sstore(6, xor(0xffff, 0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555)) - sstore(7, xor( - 0x5555555555550000aaaaaaaaaaaaaa000000aaaaaaaaa000000aaaaaaaaaaaaa, - 0xaaaaaaaaaaaaaa555555555555555555aa5555555555555aa555555555555555 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000007 -// 20: ffffffffffffaa55ffffffffffffff55aa55fffffffff55aa55fffffffffffff -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 000000000000000000000000000000000000000000000000000000000000ffff -// 0000000000000000000000000000000000000000000000000000000000000001: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000 -// 0000000000000000000000000000000000000000000000000000000000000002: 000000000000000000000000000000000000000000000000ffffffffffff0000 -// 0000000000000000000000000000000000000000000000000000000000000003: 00000000000000000000000000000000ffffffffffffffffff0000000000ffff -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000ffffffffffffffffff00000000000000ffffffffffff0000 -// 0000000000000000000000000000000000000000000000000000000000000005: ffffffffffffffffff00000000000000ffffffffffffffff000000000000ffff -// 0000000000000000000000000000000000000000000000000000000000000006: aaaaaaaaaaaaaa555555555555555555aa5555555555555aa55555555555aaaa -// 0000000000000000000000000000000000000000000000000000000000000007: ffffffffffffaa55ffffffffffffff55aa55fffffffff55aa55fffffffffffff diff --git a/test/libyul/ewasmTranslationTests/blockhash.yul b/test/libyul/ewasmTranslationTests/blockhash.yul deleted file mode 100644 index 8b906232f2c0..000000000000 --- a/test/libyul/ewasmTranslationTests/blockhash.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, blockhash(1023)) -} -// ---- -// Trace: -// Memory dump: -// 20: 00000000000000000000000000000000000000000000000000000000aaaaa9a9 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 00000000000000000000000000000000000000000000000000000000aaaaa9a9 diff --git a/test/libyul/ewasmTranslationTests/calldatacopy.yul b/test/libyul/ewasmTranslationTests/calldatacopy.yul deleted file mode 100644 index 0d7d57af0da0..000000000000 --- a/test/libyul/ewasmTranslationTests/calldatacopy.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - calldatacopy(0, 0, 32) - sstore(0, mload(0)) -} -// ---- -// Trace: -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/calldataload.yul b/test/libyul/ewasmTranslationTests/calldataload.yul deleted file mode 100644 index f0b4008f6b15..000000000000 --- a/test/libyul/ewasmTranslationTests/calldataload.yul +++ /dev/null @@ -1,7 +0,0 @@ -{ - sstore(0, calldataload(0)) -} -// ---- -// Trace: -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/calldatasize.yul b/test/libyul/ewasmTranslationTests/calldatasize.yul deleted file mode 100644 index 229f6b461468..000000000000 --- a/test/libyul/ewasmTranslationTests/calldatasize.yul +++ /dev/null @@ -1,7 +0,0 @@ -{ - sstore(0, calldatasize()) -} -// ---- -// Trace: -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/caller.yul b/test/libyul/ewasmTranslationTests/caller.yul deleted file mode 100644 index 1abb288d507e..000000000000 --- a/test/libyul/ewasmTranslationTests/caller.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, caller()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000044444444 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000044444444 diff --git a/test/libyul/ewasmTranslationTests/callvalue.yul b/test/libyul/ewasmTranslationTests/callvalue.yul deleted file mode 100644 index 5d34b58b6718..000000000000 --- a/test/libyul/ewasmTranslationTests/callvalue.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, callvalue()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000055555555 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000055555555 diff --git a/test/libyul/ewasmTranslationTests/chainid.yul b/test/libyul/ewasmTranslationTests/chainid.yul deleted file mode 100644 index 73a82f44231a..000000000000 --- a/test/libyul/ewasmTranslationTests/chainid.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - sstore(0, chainid()) -} -// ==== -// EVMVersion: >=istanbul -// ---- -// Trace: -// INVALID() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/codecopy.yul b/test/libyul/ewasmTranslationTests/codecopy.yul deleted file mode 100644 index 5b980c6b1cda..000000000000 --- a/test/libyul/ewasmTranslationTests/codecopy.yul +++ /dev/null @@ -1,11 +0,0 @@ -{ - codecopy(0x100, 0, codesize()) - sstore(0, mload(0x100)) -} -// ---- -// Trace: -// Memory dump: -// 20: 636f6465636f6465636f6465636f6465636f6465000000000000000000000000 -// 140: 636f6465636f6465636f6465636f6465636f6465000000000000000000000000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 636f6465636f6465636f6465636f6465636f6465000000000000000000000000 diff --git a/test/libyul/ewasmTranslationTests/codesize.yul b/test/libyul/ewasmTranslationTests/codesize.yul deleted file mode 100644 index ae96335fab21..000000000000 --- a/test/libyul/ewasmTranslationTests/codesize.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, codesize()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000014 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000014 diff --git a/test/libyul/ewasmTranslationTests/coinbase.yul b/test/libyul/ewasmTranslationTests/coinbase.yul deleted file mode 100644 index b83e298f545e..000000000000 --- a/test/libyul/ewasmTranslationTests/coinbase.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, coinbase()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000077777777 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000077777777 diff --git a/test/libyul/ewasmTranslationTests/comparison_eq.yul b/test/libyul/ewasmTranslationTests/comparison_eq.yul deleted file mode 100644 index d65d49cf900d..000000000000 --- a/test/libyul/ewasmTranslationTests/comparison_eq.yul +++ /dev/null @@ -1,28 +0,0 @@ -{ - sstore(0, eq(0, 0)) - sstore(1, eq(not(0), not(0))) - sstore(2, eq(0, not(0))) - sstore(3, eq(not(0), 0xffffffffffffffff)) - sstore(4, eq(0xfffffffffffffff000000000000000, 0xfffffffffffffff000000000000000)) - sstore(5, eq(0x000000000000000fffffffffffffff, 0xfffffffffffffff000000000000000)) - sstore(6, eq(0xfffffffffffffff000000000000000fffffffffffffff, 0xfffffffffffffff000000000000000fffffffffffffff)) - sstore(7, eq(0xfffffffffffffff000000000000000fffffffffffffff, 0x000000000000000ffffffffffffffffffffffffffffff)) - sstore(8, eq( - 0xaaaaaaaaaaaaaaaa5555555555555555ffffffffffffffff0000000000000000, - 0xaaaaaaaaaaaaaaaa5555555555555555ffffffffffffffff0000000000000000 - )) - sstore(9, eq( - 0xaaaaaaaaaaaaaaaa6666666666666666ffffffffffffffff0000000000000000, - 0xaaaaaaaaaaaaaaaa5555555555555555ffffffffffffffff0000000000000000 - )) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000009 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000006: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000008: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/comparison_gt.yul b/test/libyul/ewasmTranslationTests/comparison_gt.yul deleted file mode 100644 index bda8b94e1485..000000000000 --- a/test/libyul/ewasmTranslationTests/comparison_gt.yul +++ /dev/null @@ -1,36 +0,0 @@ -{ - sstore(0, gt(1, 0)) - sstore(1, gt(0, 1)) - sstore(2, gt(0, 0)) - sstore(3, gt(not(0), 0xffffffffffffffff)) - sstore(4, gt(0xffffffffffffffff, not(0))) - sstore(5, gt(not(0), not(0))) - sstore(6, gt(not(0), 0xffffffffffffffff0000000000000000)) - sstore(7, gt(0xffffffffffffffff0000000000000000, not(0))) - sstore(8, gt(0xffffffffffffffff0000000000000000, 0xffffffffffffffff0000000000000000)) - sstore(9, gt(not(0), 0xffffffffffffffff0000000000000000ffffffffffffffff)) - sstore(10, gt(0xffffffffffffffff0000000000000000ffffffffffffffff, not(0))) - sstore(11, gt(0xffffffffffffffff0000000000000000ffffffffffffffff, 0xffffffffffffffff0000000000000000ffffffffffffffff)) - sstore(12, gt(not(0), 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000)) - sstore(13, gt(0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000, not(0))) - sstore(14, gt( - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000, - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000) - ) - sstore(15, gt( - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000001, - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000) - ) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000f -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000006: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000009: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000c: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000f: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/comparison_lt.yul b/test/libyul/ewasmTranslationTests/comparison_lt.yul deleted file mode 100644 index be57da46e3fe..000000000000 --- a/test/libyul/ewasmTranslationTests/comparison_lt.yul +++ /dev/null @@ -1,36 +0,0 @@ -{ - sstore(0, lt(1, 0)) - sstore(1, lt(0, 1)) - sstore(2, lt(0, 0)) - sstore(3, lt(not(0), 0xffffffffffffffff)) - sstore(4, lt(0xffffffffffffffff, not(0))) - sstore(5, lt(not(0), not(0))) - sstore(6, lt(not(0), 0xffffffffffffffff0000000000000000)) - sstore(7, lt(0xffffffffffffffff0000000000000000, not(0))) - sstore(8, lt(0xffffffffffffffff0000000000000000, 0xffffffffffffffff0000000000000000)) - sstore(9, lt(not(0), 0xffffffffffffffff0000000000000000ffffffffffffffff)) - sstore(10, lt(0xffffffffffffffff0000000000000000ffffffffffffffff, not(0))) - sstore(11, lt(0xffffffffffffffff0000000000000000ffffffffffffffff, 0xffffffffffffffff0000000000000000ffffffffffffffff)) - sstore(12, lt(not(0), 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000)) - sstore(13, lt(0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000, not(0))) - sstore(14, lt( - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000, - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000) - ) - sstore(15, lt( - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000, - 0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000001) - ) -} -// ---- -// Trace: -// Memory dump: -// 0: 000000000000000000000000000000000000000000000000000000000000000f -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000007: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000f: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/comparison_sgt.yul b/test/libyul/ewasmTranslationTests/comparison_sgt.yul deleted file mode 100644 index 60def7e31e4e..000000000000 --- a/test/libyul/ewasmTranslationTests/comparison_sgt.yul +++ /dev/null @@ -1,54 +0,0 @@ -{ - sstore(0, sgt(0, 1)) - sstore(1, sgt(0, not(0))) - sstore(2, sgt(0, 0)) - sstore(3, sgt(1, 2)) - sstore(4, sgt(not(0), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe)) - sstore(5, sgt(0x8000000000000000000000000000000000000000000000000000000000000000, not(0))) - sstore(6, sgt(not(0), 0x8000000000000000000000000000000000000000000000000000000000000000)) - sstore(7, sgt(0x7000000000000000000000000000000000000000000000000000000000000000, 1)) - sstore(8, sgt(1, 0x7000000000000000000000000000000000000000000000000000000000000000)) - sstore(9, sgt(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, not(0))) - sstore(10, sgt(not(0), 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) - sstore(11, sgt(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 1)) - sstore(12, sgt(1, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) - sstore(13, sgt( - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(14, sgt( - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(15, sgt( - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - not(0) - )) - sstore(16, sgt( - not(0), - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(17, sgt( - not(0), - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(18, sgt( - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - not(0) - )) - -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000012 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000006: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000007: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000009: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000b: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000d: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000f: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000011: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/comparison_slt.yul b/test/libyul/ewasmTranslationTests/comparison_slt.yul deleted file mode 100644 index 577f6e9f1f77..000000000000 --- a/test/libyul/ewasmTranslationTests/comparison_slt.yul +++ /dev/null @@ -1,55 +0,0 @@ -{ - sstore(0, slt(0, 1)) - sstore(1, slt(0, not(0))) - sstore(2, slt(0, 0)) - sstore(3, slt(1, 2)) - sstore(4, slt(not(0), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe)) - sstore(5, slt(0x8000000000000000000000000000000000000000000000000000000000000000, not(0))) - sstore(6, slt(not(0), 0x8000000000000000000000000000000000000000000000000000000000000000)) - sstore(7, slt(0x7000000000000000000000000000000000000000000000000000000000000000, 1)) - sstore(8, slt(1, 0x7000000000000000000000000000000000000000000000000000000000000000)) - sstore(9, slt(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, not(0))) - sstore(10, slt(not(0), 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) - sstore(11, slt(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, 1)) - sstore(12, slt(1, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)) - sstore(13, slt( - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(14, slt( - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(15, slt( - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - not(0) - )) - sstore(16, slt( - not(0), - 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(17, slt( - not(0), - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - )) - sstore(18, slt( - 0x8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, - not(0) - )) - -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000012 -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000005: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000008: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000a: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000c: 0000000000000000000000000000000000000000000000000000000000000001 -// 000000000000000000000000000000000000000000000000000000000000000e: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000010: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000012: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/datacopy.yul b/test/libyul/ewasmTranslationTests/datacopy.yul deleted file mode 100644 index 8812e7c9bec3..000000000000 --- a/test/libyul/ewasmTranslationTests/datacopy.yul +++ /dev/null @@ -1,20 +0,0 @@ -object "main" -{ - code { - datacopy(0, and(dataoffset("main"), 15), and(datasize("main"), 15)) - datacopy(32, and(dataoffset("sub"), 15), and(datasize("sub"), 15)) - sstore(0, mload(0)) - sstore(1, mload(32)) - } - object "sub" { code { sstore(0, 1) } } -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000001 -// 20: 636f6465636f6465000000000000000000000000000000000000000000000000 -// 40: 6465636f00000000000000000000000000000000000000000000000000000000 -// 60: 636f6465636f6465000000000000000000000000000000000000000000000000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 6465636f00000000000000000000000000000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000001: 636f6465636f6465000000000000000000000000000000000000000000000000 diff --git a/test/libyul/ewasmTranslationTests/dataoffset.yul b/test/libyul/ewasmTranslationTests/dataoffset.yul deleted file mode 100644 index d9dc12c9cd52..000000000000 --- a/test/libyul/ewasmTranslationTests/dataoffset.yul +++ /dev/null @@ -1,16 +0,0 @@ -object "main" -{ - code { - sstore(0, dataoffset("main")) - sstore(1, dataoffset("sub")) - } - object "sub" { code { sstore(0, 1) } } -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000001 -// 20: 000000000000000000000000000000000000000000000000000000000000070c -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 000000000000000000000000000000000000000000000000000000000000006e -// 0000000000000000000000000000000000000000000000000000000000000001: 000000000000000000000000000000000000000000000000000000000000070c diff --git a/test/libyul/ewasmTranslationTests/datasize.yul b/test/libyul/ewasmTranslationTests/datasize.yul deleted file mode 100644 index 637c2c36de1f..000000000000 --- a/test/libyul/ewasmTranslationTests/datasize.yul +++ /dev/null @@ -1,16 +0,0 @@ -object "main" -{ - code { - sstore(0, datasize("main")) - sstore(1, datasize("sub")) - } - object "sub" { code { sstore(0, 1) } } -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000001 -// 20: 0000000000000000000000000000000000000000000000000000000000000109 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000b64 -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000109 diff --git a/test/libyul/ewasmTranslationTests/difficulty.yul b/test/libyul/ewasmTranslationTests/difficulty.yul deleted file mode 100644 index 52e4275b43f2..000000000000 --- a/test/libyul/ewasmTranslationTests/difficulty.yul +++ /dev/null @@ -1,11 +0,0 @@ -{ - sstore(0, difficulty()) -} -// ==== -// EVMVersion: =constantinople -// ---- -// Trace: -// INVALID() -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000011111111 -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/extcodesize.yul b/test/libyul/ewasmTranslationTests/extcodesize.yul deleted file mode 100644 index fb12db5ea70a..000000000000 --- a/test/libyul/ewasmTranslationTests/extcodesize.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, extcodesize(address())) -} -// ---- -// Trace: -// Memory dump: -// 20: 000000000000000000000000000000000000000000000000000000000000077b -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 000000000000000000000000000000000000000000000000000000000000077b diff --git a/test/libyul/ewasmTranslationTests/gas.yul b/test/libyul/ewasmTranslationTests/gas.yul deleted file mode 100644 index ef7125b26265..000000000000 --- a/test/libyul/ewasmTranslationTests/gas.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, gas()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000099 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000099 diff --git a/test/libyul/ewasmTranslationTests/gaslimit.yul b/test/libyul/ewasmTranslationTests/gaslimit.yul deleted file mode 100644 index d1d0cc2a8338..000000000000 --- a/test/libyul/ewasmTranslationTests/gaslimit.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, gaslimit()) -} -// ---- -// Trace: -// Memory dump: -// 20: 00000000000000000000000000000000000000000000000000000000003d0900 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 00000000000000000000000000000000000000000000000000000000003d0900 diff --git a/test/libyul/ewasmTranslationTests/gasprice.yul b/test/libyul/ewasmTranslationTests/gasprice.yul deleted file mode 100644 index 2c9d80452071..000000000000 --- a/test/libyul/ewasmTranslationTests/gasprice.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, gasprice()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000066666666 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000066666666 diff --git a/test/libyul/ewasmTranslationTests/invalid.yul b/test/libyul/ewasmTranslationTests/invalid.yul deleted file mode 100644 index c9844978aba5..000000000000 --- a/test/libyul/ewasmTranslationTests/invalid.yul +++ /dev/null @@ -1,14 +0,0 @@ -{ - sstore(0, 0x1234) - mstore(1, 0) - invalid() - sstore(0, 0x5678) - mstore(1, 0xff) -} -// ---- -// Trace: -// INVALID() -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000001234 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000001234 diff --git a/test/libyul/ewasmTranslationTests/iszero.yul b/test/libyul/ewasmTranslationTests/iszero.yul deleted file mode 100644 index 5175e22451c9..000000000000 --- a/test/libyul/ewasmTranslationTests/iszero.yul +++ /dev/null @@ -1,14 +0,0 @@ -{ - let x := 0 - let y := 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 - let z := 0x0000000000000000000111111111111111111111100000000000000000000000 - sstore(0, iszero(x)) - sstore(1, iszero(y)) - sstore(2, iszero(z)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000002 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/keccak256.yul b/test/libyul/ewasmTranslationTests/keccak256.yul deleted file mode 100644 index 81a650345c78..000000000000 --- a/test/libyul/ewasmTranslationTests/keccak256.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, keccak256(0, 0)) - sstore(0, keccak256(0, 0x20)) -} -// ---- -// Trace: -// INVALID() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/log0.yul b/test/libyul/ewasmTranslationTests/log0.yul deleted file mode 100644 index 6b02e598ba3a..000000000000 --- a/test/libyul/ewasmTranslationTests/log0.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - log0(0x20, 0x40) -} -// ---- -// Trace: -// LOG0() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/log1.yul b/test/libyul/ewasmTranslationTests/log1.yul deleted file mode 100644 index 296484bd7548..000000000000 --- a/test/libyul/ewasmTranslationTests/log1.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - log1(0x20, 0x40, 0x60) -} -// ---- -// Trace: -// LOG1() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/log2.yul b/test/libyul/ewasmTranslationTests/log2.yul deleted file mode 100644 index 887fef66f73f..000000000000 --- a/test/libyul/ewasmTranslationTests/log2.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - log2(0x20, 0x40, 0x60, 0x80) -} -// ---- -// Trace: -// LOG2() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/log3.yul b/test/libyul/ewasmTranslationTests/log3.yul deleted file mode 100644 index 8ff23e2bdbd5..000000000000 --- a/test/libyul/ewasmTranslationTests/log3.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - log3(0x20, 0x40, 0x60, 0x80, 0xa0) -} -// ---- -// Trace: -// LOG3() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/log4.yul b/test/libyul/ewasmTranslationTests/log4.yul deleted file mode 100644 index 152595e288bc..000000000000 --- a/test/libyul/ewasmTranslationTests/log4.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - log4(0x20, 0x40, 0x60, 0x80, 0xa0, 0xb0) -} -// ---- -// Trace: -// LOG4() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/loop_break.yul b/test/libyul/ewasmTranslationTests/loop_break.yul deleted file mode 100644 index b473988d5fbb..000000000000 --- a/test/libyul/ewasmTranslationTests/loop_break.yul +++ /dev/null @@ -1,13 +0,0 @@ -{ - let i := 0 - for { } lt(i, 10) { i := add(i, 1) } { - if eq(i, 3) { break } - } - sstore(0, i) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000003 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000003 diff --git a/test/libyul/ewasmTranslationTests/loop_continue.yul b/test/libyul/ewasmTranslationTests/loop_continue.yul deleted file mode 100644 index 31200c2fe240..000000000000 --- a/test/libyul/ewasmTranslationTests/loop_continue.yul +++ /dev/null @@ -1,22 +0,0 @@ -{ - let i := 0 - for { } lt(i, 10) { i := add(i, 1) } { - if eq(i, 3) { continue } - sstore(add(i, 0x10), i) - } - sstore(0, i) -} -// ---- -// Trace: -// Memory dump: -// 20: 000000000000000000000000000000000000000000000000000000000000000a -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 000000000000000000000000000000000000000000000000000000000000000a -// 0000000000000000000000000000000000000000000000000000000000000011: 0000000000000000000000000000000000000000000000000000000000000001 -// 0000000000000000000000000000000000000000000000000000000000000012: 0000000000000000000000000000000000000000000000000000000000000002 -// 0000000000000000000000000000000000000000000000000000000000000014: 0000000000000000000000000000000000000000000000000000000000000004 -// 0000000000000000000000000000000000000000000000000000000000000015: 0000000000000000000000000000000000000000000000000000000000000005 -// 0000000000000000000000000000000000000000000000000000000000000016: 0000000000000000000000000000000000000000000000000000000000000006 -// 0000000000000000000000000000000000000000000000000000000000000017: 0000000000000000000000000000000000000000000000000000000000000007 -// 0000000000000000000000000000000000000000000000000000000000000018: 0000000000000000000000000000000000000000000000000000000000000008 -// 0000000000000000000000000000000000000000000000000000000000000019: 0000000000000000000000000000000000000000000000000000000000000009 diff --git a/test/libyul/ewasmTranslationTests/memoryguard.yul b/test/libyul/ewasmTranslationTests/memoryguard.yul deleted file mode 100644 index 5aafc88d23b5..000000000000 --- a/test/libyul/ewasmTranslationTests/memoryguard.yul +++ /dev/null @@ -1,12 +0,0 @@ -{ - mstore(0x40, memoryguard(0x0102030405060708)) - sstore(1, mload(0x40)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000001 -// 20: 0000000000000000000000000000000000000000000000000102030405060708 -// 80: 0000000000000000000000000000000000000000000000000102030405060708 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000102030405060708 diff --git a/test/libyul/ewasmTranslationTests/msize.yul b/test/libyul/ewasmTranslationTests/msize.yul deleted file mode 100644 index b45b2aae07ea..000000000000 --- a/test/libyul/ewasmTranslationTests/msize.yul +++ /dev/null @@ -1,12 +0,0 @@ -{ - sstore(0, msize()) - mstore(0x20, 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20) - mstore(0x40, mload(0x20)) - sstore(1, mload(0x40)) - sstore(2, msize()) -} -// ---- -// Trace: -// INVALID() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/mstore8.yul b/test/libyul/ewasmTranslationTests/mstore8.yul deleted file mode 100644 index 78d10180003f..000000000000 --- a/test/libyul/ewasmTranslationTests/mstore8.yul +++ /dev/null @@ -1,15 +0,0 @@ -{ - mstore(0x30, not(0)) - mstore8(0x20, 0xaa) - mstore8(0x26, 0xcc) - mstore8(0x3b, 0x11) - sstore(0, mload(0x20)) -} -// ---- -// Trace: -// Memory dump: -// 20: aa0000000000cc000000000000000000ffffffffffffffffffffff11ffffffff -// 60: aa0000000000cc000000000000000000ffffffffffffffffffffff11ffffffff -// 80: ffffffffffffffffffffffffffffffff00000000000000000000000000000000 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: aa0000000000cc000000000000000000ffffffffffffffffffffff11ffffffff diff --git a/test/libyul/ewasmTranslationTests/mstore_mload.yul b/test/libyul/ewasmTranslationTests/mstore_mload.yul deleted file mode 100644 index 95646abe252f..000000000000 --- a/test/libyul/ewasmTranslationTests/mstore_mload.yul +++ /dev/null @@ -1,14 +0,0 @@ -{ - mstore(0x20, 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20) - mstore(0x40, mload(0x20)) - sstore(1, mload(0x40)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000001 -// 20: 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 -// 60: 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 -// 80: 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 diff --git a/test/libyul/ewasmTranslationTests/number.yul b/test/libyul/ewasmTranslationTests/number.yul deleted file mode 100644 index 83250247aa74..000000000000 --- a/test/libyul/ewasmTranslationTests/number.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, number()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000400 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000400 diff --git a/test/libyul/ewasmTranslationTests/origin.yul b/test/libyul/ewasmTranslationTests/origin.yul deleted file mode 100644 index 16fe9181f268..000000000000 --- a/test/libyul/ewasmTranslationTests/origin.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, origin()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000033333333 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000033333333 diff --git a/test/libyul/ewasmTranslationTests/return.yul b/test/libyul/ewasmTranslationTests/return.yul deleted file mode 100644 index bb8b141708a5..000000000000 --- a/test/libyul/ewasmTranslationTests/return.yul +++ /dev/null @@ -1,11 +0,0 @@ -{ - mstore(0x20, 0x1234556677889900aa) - return(0x20, 30) - invalid() -} -// ---- -// Trace: -// RETURN() [000000000000000000000000000000000000000000000012345566778899] -// Memory dump: -// 60: 00000000000000000000000000000000000000000000001234556677889900aa -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/returndatacopy.yul b/test/libyul/ewasmTranslationTests/returndatacopy.yul deleted file mode 100644 index c90b16f13c82..000000000000 --- a/test/libyul/ewasmTranslationTests/returndatacopy.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - returndatacopy(0x100, 0, returndatasize()) - sstore(0, mload(0x100)) -} -// ==== -// EVMVersion: >=byzantium -// ---- -// Trace: -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/returndatasize.yul b/test/libyul/ewasmTranslationTests/returndatasize.yul deleted file mode 100644 index b6aea851d662..000000000000 --- a/test/libyul/ewasmTranslationTests/returndatasize.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, returndatasize()) -} -// ==== -// EVMVersion: >=byzantium -// ---- -// Trace: -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/revert.yul b/test/libyul/ewasmTranslationTests/revert.yul deleted file mode 100644 index fbb5fc272002..000000000000 --- a/test/libyul/ewasmTranslationTests/revert.yul +++ /dev/null @@ -1,13 +0,0 @@ -{ - mstore(0x20, 0x1234556677889900aa) - revert(0x20, 30) - invalid() -} -// ==== -// EVMVersion: >=byzantium -// ---- -// Trace: -// REVERT() [000000000000000000000000000000000000000000000012345566778899] -// Memory dump: -// 60: 00000000000000000000000000000000000000000000001234556677889900aa -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/selfbalance.yul b/test/libyul/ewasmTranslationTests/selfbalance.yul deleted file mode 100644 index 32037fb5ac25..000000000000 --- a/test/libyul/ewasmTranslationTests/selfbalance.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - sstore(0, selfbalance()) -} -// ==== -// EVMVersion: >=istanbul -// ---- -// Trace: -// INVALID() -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/selfdestruct.yul b/test/libyul/ewasmTranslationTests/selfdestruct.yul deleted file mode 100644 index c000393fb7c5..000000000000 --- a/test/libyul/ewasmTranslationTests/selfdestruct.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - selfdestruct(0xffffffffffffffffffffffffffffffffffffffff) - invalid() -} -// ---- -// Trace: -// SELFDESTRUCT() -// Memory dump: -// 0: 000000000000000000000000ffffffffffffffffffffffffffffffffffffffff -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/shifts.yul b/test/libyul/ewasmTranslationTests/shifts.yul deleted file mode 100644 index cf900dae2350..000000000000 --- a/test/libyul/ewasmTranslationTests/shifts.yul +++ /dev/null @@ -1,23 +0,0 @@ -{ - let x := 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 - let y := shl(120, x) - let z := shr(136, y) - sstore(0, y) - sstore(1, z) - sstore(2, sar(136, 0x801112131415161718191a1b1c1d1e1f20000000000000000000000000000000)) - sstore(3, sar(256, 0x801112131415161718191a1b1c1d1e1f20000000000000000000000000000000)) - sstore(4, sar(136, 0x701112131415161718191a1b1c1d1e1f20000000000000000000000000000000)) - sstore(5, sar(256, 0x701112131415161718191a1b1c1d1e1f20000000000000000000000000000000)) -} -// ==== -// EVMVersion: >=constantinople -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000005 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 101112131415161718191a1b1c1d1e1f20000000000000000000000000000000 -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000101112131415161718191a1b1c1d1e -// 0000000000000000000000000000000000000000000000000000000000000002: ffffffffffffffffffffffffffffffffff801112131415161718191a1b1c1d1e -// 0000000000000000000000000000000000000000000000000000000000000003: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000004: 0000000000000000000000000000000000701112131415161718191a1b1c1d1e diff --git a/test/libyul/ewasmTranslationTests/signextend.yul b/test/libyul/ewasmTranslationTests/signextend.yul deleted file mode 100644 index f39d5926b943..000000000000 --- a/test/libyul/ewasmTranslationTests/signextend.yul +++ /dev/null @@ -1,16 +0,0 @@ -{ - sstore(0, signextend(0, 0x86)) - sstore(1, signextend(0, 0x76)) - sstore(2, signextend(32, not(0))) - sstore(3, signextend(5, 0xff8844553322)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000003 -// 20: ffffffffffffffffffffffffffffffffffffffffffffffffffffff8844553322 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86 -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000076 -// 0000000000000000000000000000000000000000000000000000000000000002: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000003: ffffffffffffffffffffffffffffffffffffffffffffffffffffff8844553322 diff --git a/test/libyul/ewasmTranslationTests/simple_mstore.yul b/test/libyul/ewasmTranslationTests/simple_mstore.yul deleted file mode 100644 index dd9ac1d5eda6..000000000000 --- a/test/libyul/ewasmTranslationTests/simple_mstore.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - mstore(0x20, 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20) -} -// ---- -// Trace: -// Memory dump: -// 60: 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/simple_sload.yul b/test/libyul/ewasmTranslationTests/simple_sload.yul deleted file mode 100644 index 6d4131a99e95..000000000000 --- a/test/libyul/ewasmTranslationTests/simple_sload.yul +++ /dev/null @@ -1,16 +0,0 @@ -{ - sstore(1, 7) - sstore(2, sub(0, 1)) - sstore(3, sload(1)) - sstore(4, sload(2)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000004 -// 20: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000007 -// 0000000000000000000000000000000000000000000000000000000000000002: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// 0000000000000000000000000000000000000000000000000000000000000003: 0000000000000000000000000000000000000000000000000000000000000007 -// 0000000000000000000000000000000000000000000000000000000000000004: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/test/libyul/ewasmTranslationTests/simple_sstore.yul b/test/libyul/ewasmTranslationTests/simple_sstore.yul deleted file mode 100644 index 8fbb4923ae2b..000000000000 --- a/test/libyul/ewasmTranslationTests/simple_sstore.yul +++ /dev/null @@ -1,12 +0,0 @@ -{ - sstore(1, 7) - sstore(2, sub(0, 1)) -} -// ---- -// Trace: -// Memory dump: -// 0: 0000000000000000000000000000000000000000000000000000000000000002 -// 20: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000001: 0000000000000000000000000000000000000000000000000000000000000007 -// 0000000000000000000000000000000000000000000000000000000000000002: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/test/libyul/ewasmTranslationTests/smoke.yul b/test/libyul/ewasmTranslationTests/smoke.yul deleted file mode 100644 index f7f1a1aefb8a..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke.yul +++ /dev/null @@ -1,5 +0,0 @@ -{} -// ---- -// Trace: -// Memory dump: -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/smoke_call.yul b/test/libyul/ewasmTranslationTests/smoke_call.yul deleted file mode 100644 index 6d93770161e1..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke_call.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - sstore(0, call(gas(), address(), 42, 0, 0x20, 0x20, 0x20)) -} -// ---- -// Trace: -// CALL() -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/smoke_callcode.yul b/test/libyul/ewasmTranslationTests/smoke_callcode.yul deleted file mode 100644 index dd22ef261178..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke_callcode.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - sstore(0, callcode(gas(), address(), 42, 0, 0x20, 0x20, 0x20)) -} -// ---- -// Trace: -// CALLCODE() -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/smoke_create.yul b/test/libyul/ewasmTranslationTests/smoke_create.yul deleted file mode 100644 index 7650e9e6c140..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke_create.yul +++ /dev/null @@ -1,11 +0,0 @@ -{ - let size := codesize() - codecopy(0, 0, size) - sstore(0, create(42, 0, size)) -} -// ---- -// Trace: -// CREATE() -// Memory dump: -// 40: 636f6465636f6465636f6465636f6465636f6465000000000000000000000000 -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/smoke_create2.yul b/test/libyul/ewasmTranslationTests/smoke_create2.yul deleted file mode 100644 index 32d789ea9abb..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke_create2.yul +++ /dev/null @@ -1,13 +0,0 @@ -{ - let size := codesize() - codecopy(0x40, 0, size) - sstore(0, create2(42, 0, size, 0x20)) -} -// ==== -// EVMVersion: >=constantinople -// ---- -// Trace: -// INVALID() -// Memory dump: -// 80: 636f6465636f6465636f6465636f6465636f6465000000000000000000000000 -// Storage dump: diff --git a/test/libyul/ewasmTranslationTests/smoke_delegatecall.yul b/test/libyul/ewasmTranslationTests/smoke_delegatecall.yul deleted file mode 100644 index 30ad4b96d220..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke_delegatecall.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - sstore(0, delegatecall(gas(), address(), 0, 0x20, 0x20, 0x20)) -} -// ---- -// Trace: -// DELEGATECALL() -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/smoke_staticcall.yul b/test/libyul/ewasmTranslationTests/smoke_staticcall.yul deleted file mode 100644 index 25faaa9ee93c..000000000000 --- a/test/libyul/ewasmTranslationTests/smoke_staticcall.yul +++ /dev/null @@ -1,12 +0,0 @@ -{ - sstore(0, staticcall(gas(), address(), 0, 0x20, 0x20, 0x20)) -} -// ==== -// EVMVersion: >=byzantium -// ---- -// Trace: -// STATICCALL() -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000000000001 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000000000001 diff --git a/test/libyul/ewasmTranslationTests/timestamp.yul b/test/libyul/ewasmTranslationTests/timestamp.yul deleted file mode 100644 index 9982590dfdc0..000000000000 --- a/test/libyul/ewasmTranslationTests/timestamp.yul +++ /dev/null @@ -1,9 +0,0 @@ -{ - sstore(0, timestamp()) -} -// ---- -// Trace: -// Memory dump: -// 20: 0000000000000000000000000000000000000000000000000000000088888888 -// Storage dump: -// 0000000000000000000000000000000000000000000000000000000000000000: 0000000000000000000000000000000000000000000000000000000088888888 diff --git a/test/libyul/objectCompiler/wasm/no_main_function.yul b/test/libyul/objectCompiler/wasm/no_main_function.yul deleted file mode 100644 index 2dd91a166236..000000000000 --- a/test/libyul/objectCompiler/wasm/no_main_function.yul +++ /dev/null @@ -1,22 +0,0 @@ -{ - function not_main() { - i64.drop(i64.add(0, 1)) - } -} -// ==== -// wasm: true -// ---- -// Text: -// (module -// (memory $memory (export "memory") 1) -// -// (func $not_main -// (block $label_ -// (drop (i64.add (i64.const 0) (i64.const 1))) -// ) -// ) -// -// ) -// -// Binary: -// 0061736d01000000010401600000020100030201000503010001060100070a01066d656d6f727902000a0d010b000240420042017c1a0b0b diff --git a/test/libyul/objectCompiler/wasm/simple.yul b/test/libyul/objectCompiler/wasm/simple.yul deleted file mode 100644 index b158aea52bf0..000000000000 --- a/test/libyul/objectCompiler/wasm/simple.yul +++ /dev/null @@ -1,23 +0,0 @@ -{ - function main() { - i64.drop(i64.add(0, 1)) - } -} -// ==== -// wasm: true -// ---- -// Text: -// (module -// (memory $memory (export "memory") 1) -// (export "main" (func $main)) -// -// (func $main -// (block $label_ -// (drop (i64.add (i64.const 0) (i64.const 1))) -// ) -// ) -// -// ) -// -// Binary: -// 0061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a0d010b000240420042017c1a0b0b diff --git a/test/libyul/objectCompiler/wasm/subObject.yul b/test/libyul/objectCompiler/wasm/subObject.yul deleted file mode 100644 index 683e64be1e98..000000000000 --- a/test/libyul/objectCompiler/wasm/subObject.yul +++ /dev/null @@ -1,22 +0,0 @@ -object "a" { - code {} - // Unreferenced data is not added to the assembled bytecode. - data "str" "Hello, World!" - object "sub" { code { function main() { i64.drop(11) } } } -} -// ==== -// wasm: true -// ---- -// Text: -// (module -// ;; custom section for sub-module -// ;; The Keccak-256 hash of the text representation of "sub": 78ac3419d75c8d6f42f663717b8e964eeb994d77ff175145133084422dbd23d7 -// ;; (@custom "sub" "0061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a0a0108000240420b1a0b0b") -// ;; custom section for data -// ;; (@custom "str" "48656c6c6f2c20576f726c6421") -// (memory $memory (export "memory") 1) -// -// ) -// -// Binary: -// 0061736d010000000101000201000301000503010001060100070a01066d656d6f727902000040037375620061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a0a0108000240420b1a0b0b00110373747248656c6c6f2c20576f726c64210a0100 diff --git a/test/libyul/objectCompiler/wasm/subObjectAccess.yul b/test/libyul/objectCompiler/wasm/subObjectAccess.yul deleted file mode 100644 index 8acced97f69d..000000000000 --- a/test/libyul/objectCompiler/wasm/subObjectAccess.yul +++ /dev/null @@ -1,79 +0,0 @@ -object "A" { - code { - function main() { - // TODO: support this - // i64.drop(dataoffset("A")) - // i64.drop(datasize("A")) - i64.drop(dataoffset("B")) - i64.drop(datasize("B")) - // TODO: support sub-subobjects - // i64.drop(dataoffset("B.C")) - // i64.drop(datasize("B.C")) - // i64.drop(dataoffset("B.E")) - // i64.drop(datasize("B.E")) - // i64.drop(dataoffset("B.C.D")) - // i64.drop(datasize("B.C.D")) - } - } - - data "data1" "Hello, World!" - - object "B" { - code { - function main() { - i64.drop(dataoffset("C")) - i64.drop(datasize("C")) - i64.drop(dataoffset("E")) - i64.drop(datasize("E")) - // i64.drop(dataoffset("C.D")) - // i64.drop(datasize("C.D")) - } - } - object "C" { - code { - function main() { - i64.drop(dataoffset("D")) - i64.drop(datasize("D")) - } - } - object "D" { - code { - function main() { - unreachable() - } - } - } - } - object "E" { - code { - function main() { - unreachable() - } - } - } - } -} -// ==== -// wasm: true -// ---- -// Text: -// (module -// ;; custom section for sub-module -// ;; The Keccak-256 hash of the text representation of "B": ccfc48ce1c0d0542ffd25ae6858777b2f7b8a6d2b6608f679458182e719f5434 -// ;; (@custom "B" "0061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e0000007f01430061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e0000003c01440061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a080106000240000b0b0a0d010b00024042341a423a1a0b0b003c01450061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a080106000240000b0b0a15011300024042341a42fd001a42b5011a423a1a0b0b") -// ;; custom section for data -// ;; (@custom "data1" "48656c6c6f2c20576f726c6421") -// (memory $memory (export "memory") 1) -// (export "main" (func $main)) -// -// (func $main -// (block $label_ -// (drop (dataoffset "B")) -// (drop (datasize "B")) -// ) -// ) -// -// ) -// -// Binary: -// 0061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e000000880201420061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e0000007f01430061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e0000003c01440061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a080106000240000b0b0a0d010b00024042341a423a1a0b0b003c01450061736d01000000010401600000020100030201000503010001060100071102066d656d6f72790200046d61696e00000a080106000240000b0b0a15011300024042341a42fd001a42b5011a423a1a0b0b001305646174613148656c6c6f2c20576f726c64210a0e010c00024042351a4286021a0b0b diff --git a/test/libyul/yulOptimizerTests/conditionalSimplifier/add_correct_type_wasm.yul b/test/libyul/yulOptimizerTests/conditionalSimplifier/add_correct_type_wasm.yul deleted file mode 100644 index de92aad7aefa..000000000000 --- a/test/libyul/yulOptimizerTests/conditionalSimplifier/add_correct_type_wasm.yul +++ /dev/null @@ -1,19 +0,0 @@ -{ - let y:i32 := 0:i32 - for {} true { } { - if y { break } - } -} -// ==== -// dialect: ewasm -// ---- -// step: conditionalSimplifier -// -// { -// let y:i32 := 0:i32 -// for { } true { } -// { -// if y { break } -// y := false -// } -// } diff --git a/test/libyul/yulOptimizerTests/expressionSplitter/typed.yul b/test/libyul/yulOptimizerTests/expressionSplitter/typed.yul deleted file mode 100644 index 4bae497d6392..000000000000 --- a/test/libyul/yulOptimizerTests/expressionSplitter/typed.yul +++ /dev/null @@ -1,43 +0,0 @@ -{ - function fun(x: i32, y) -> t: i32, z: i32 { - z := i32.add(x, i32.add(z, z)) - - } - i64.store(i32.load(5:i32), i64.load(8:i32)) - let i := 0 - for {} i32.eqz(i32.load(9:i32)) { i := i64.add(i, 1) } { - let f: i32, g: i32 := fun(i32.load(1:i32), i64.load(i32.load(0: i32))) - } -} -// ==== -// dialect: ewasm -// ---- -// step: expressionSplitter -// -// { -// function fun(x:i32, y) -> t:i32, z:i32 -// { -// let _1:i32 := i32.add(z, z) -// z := i32.add(x, _1) -// } -// let _2:i32 := 8:i32 -// let _3 := i64.load(_2) -// let _4:i32 := 5:i32 -// let _5:i32 := i32.load(_4) -// i64.store(_5, _3) -// let i := 0 -// for { } -// i32.eqz(i32.load(9:i32)) -// { -// let _6 := 1 -// i := i64.add(i, _6) -// } -// { -// let _7:i32 := 0:i32 -// let _8:i32 := i32.load(_7) -// let _9 := i64.load(_8) -// let _10:i32 := 1:i32 -// let _11:i32 := i32.load(_10) -// let f:i32, g:i32 := fun(_11, _9) -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/constant_assignment.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/constant_assignment.yul deleted file mode 100644 index 10f8814a66ed..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/constant_assignment.yul +++ /dev/null @@ -1,18 +0,0 @@ -{ - let val := 1234567890123456789012345678901234567890123456789012345678901234567890 - val := 9876543219876543219876543219876543219876543219876543219876543219876543210 -} - -// ---- -// step: wordSizeTransform -// -// { -// let val_0 := 196678011949 -// let val_1 := 17592899865401375162 -// let val_2 := 3392951883154430155 -// let val_3 := 12452437124710337234 -// val_0 := 1573424111353538 -// val_1 := 11180339179422519519 -// val_2 := 5225342777609112214 -// val_3 := 12264064093151869674 -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/function_call.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/function_call.yul deleted file mode 100644 index 3aef8c99ceea..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/function_call.yul +++ /dev/null @@ -1,43 +0,0 @@ -{ - function swap(x, y) -> a, b - { - a := y - b := x - } - function main(v1, v2) -> r1, r2 - { - let tmp := 11111111111111111111111111111111111111111111111111111111111111111111111111111 - r1, r2 := swap(v1, tmp) - r1, r2 := swap(2222222222222222222222222222222222222222222222222222222222222222222, r2) - } -} - -// ---- -// step: wordSizeTransform -// -// { -// function swap(x_0, x_1, x_2, x_3, y_0, y_1, y_2, y_3) -> a_0, a_1, a_2, a_3, b_0, b_1, b_2, b_3 -// { -// a_0 := y_0 -// a_1 := y_1 -// a_2 := y_2 -// a_3 := y_3 -// b_0 := x_0 -// b_1 := x_1 -// b_2 := x_2 -// b_3 := x_3 -// } -// function main(v1_0, v1_1, v1_2, v1_3, v2_0, v2_1, v2_2, v2_3) -> r1_0, r1_1, r1_2, r1_3, r2_0, r2_1, r2_2, r2_3 -// { -// let tmp_0 := 1770102123480502530 -// let tmp_1 := 591943673742124792 -// let tmp_2 := 13663686148824196892 -// let tmp_3 := 8198552921648689607 -// r1_0, r1_1, r1_2, r1_3, r2_0, r2_1, r2_2, r2_3 := swap(v1_0, v1_1, v1_2, v1_3, tmp_0, tmp_1, tmp_2, tmp_3) -// let _1_0 := 354020424 -// let _1_1 := 12840787883880108911 -// let _1_2 := 12527970737989311368 -// let _1_3 := 16397105843297379214 -// r1_0, r1_1, r1_2, r1_3, r2_0, r2_1, r2_2, r2_3 := swap(_1_0, _1_1, _1_2, _1_3, r2_0, r2_1, r2_2, r2_3) -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/functional_instruction.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/functional_instruction.yul deleted file mode 100644 index 5ac0bfc00a8d..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/functional_instruction.yul +++ /dev/null @@ -1,17 +0,0 @@ -{ - let x := add(999999999999999999999999999999999999999999999999999999999999999, 77777777777777777777777777777777777777777777777777777777777777) -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 12390 -// let _1_1 := 13186919961226471680 -// let _1_2 := 18324050535993369984 -// let _1_3 := 15884696285694336113 -// let _2_0 := 159309 -// let _2_1 := 3525417123811528497 -// let _2_2 := 6328259118096044006 -// let _2_3 := 9223372036854775807 -// let x_0, x_1, x_2, x_3 := add(_2_0, _2_1, _2_2, _2_3, _1_0, _1_1, _1_2, _1_3) -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/if.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/if.yul deleted file mode 100644 index b799760f839f..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/if.yul +++ /dev/null @@ -1,49 +0,0 @@ -{ - if calldataload(0) { sstore(0, 1) } - if add(calldataload(0), calldataload(1)) { sstore(0, 2) } -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 0 -// let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) -// if or_bool(_2_0, _2_1, _2_2, _2_3) -// { -// let _3_0 := 0 -// let _3_1 := 0 -// let _3_2 := 0 -// let _3_3 := 1 -// let _4_0 := 0 -// let _4_1 := 0 -// let _4_2 := 0 -// let _4_3 := 0 -// sstore(_4_0, _4_1, _4_2, _4_3, _3_0, _3_1, _3_2, _3_3) -// } -// let _5_0 := 0 -// let _5_1 := 0 -// let _5_2 := 0 -// let _5_3 := 1 -// let _6_0, _6_1, _6_2, _6_3 := calldataload(_5_0, _5_1, _5_2, _5_3) -// let _7_0 := 0 -// let _7_1 := 0 -// let _7_2 := 0 -// let _7_3 := 0 -// let _8_0, _8_1, _8_2, _8_3 := calldataload(_7_0, _7_1, _7_2, _7_3) -// let _9_0, _9_1, _9_2, _9_3 := add(_8_0, _8_1, _8_2, _8_3, _6_0, _6_1, _6_2, _6_3) -// if or_bool(_9_0, _9_1, _9_2, _9_3) -// { -// let _10_0 := 0 -// let _10_1 := 0 -// let _10_2 := 0 -// let _10_3 := 2 -// let _11_0 := 0 -// let _11_1 := 0 -// let _11_2 := 0 -// let _11_3 := 0 -// sstore(_11_0, _11_1, _11_2, _11_3, _10_0, _10_1, _10_2, _10_3) -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/or_bool_renamed.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/or_bool_renamed.yul deleted file mode 100644 index 803b289708f7..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/or_bool_renamed.yul +++ /dev/null @@ -1,25 +0,0 @@ -{ - let or_bool := 2 - if or_bool { sstore(0, 1) } -} -// ---- -// step: wordSizeTransform -// -// { -// let or_bool_3_0 := 0 -// let or_bool_3_1 := 0 -// let or_bool_3_2 := 0 -// let or_bool_3_3 := 2 -// if or_bool(or_bool_3_0, or_bool_3_1, or_bool_3_2, or_bool_3_3) -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 1 -// let _2_0 := 0 -// let _2_1 := 0 -// let _2_2 := 0 -// let _2_3 := 0 -// sstore(_2_0, _2_1, _2_2, _2_3, _1_0, _1_1, _1_2, _1_3) -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_1.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_1.yul deleted file mode 100644 index d40e2283fc12..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_1.yul +++ /dev/null @@ -1,71 +0,0 @@ -{ - switch calldataload(0) - case 0 { sstore(0, 1) } - case 1 { sstore(1, 1) } - case 2 { sstore(2, 1) } - case 3 { sstore(3, 1) } -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 0 -// let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) -// switch _2_0 -// case 0 { -// switch _2_1 -// case 0 { -// switch _2_2 -// case 0 { -// switch _2_3 -// case 0 { -// let _3_0 := 0 -// let _3_1 := 0 -// let _3_2 := 0 -// let _3_3 := 1 -// let _4_0 := 0 -// let _4_1 := 0 -// let _4_2 := 0 -// let _4_3 := 0 -// sstore(_4_0, _4_1, _4_2, _4_3, _3_0, _3_1, _3_2, _3_3) -// } -// case 1 { -// let _5_0 := 0 -// let _5_1 := 0 -// let _5_2 := 0 -// let _5_3 := 1 -// let _6_0 := 0 -// let _6_1 := 0 -// let _6_2 := 0 -// let _6_3 := 1 -// sstore(_6_0, _6_1, _6_2, _6_3, _5_0, _5_1, _5_2, _5_3) -// } -// case 2 { -// let _7_0 := 0 -// let _7_1 := 0 -// let _7_2 := 0 -// let _7_3 := 1 -// let _8_0 := 0 -// let _8_1 := 0 -// let _8_2 := 0 -// let _8_3 := 2 -// sstore(_8_0, _8_1, _8_2, _8_3, _7_0, _7_1, _7_2, _7_3) -// } -// case 3 { -// let _9_0 := 0 -// let _9_1 := 0 -// let _9_2 := 0 -// let _9_3 := 1 -// let _10_0 := 0 -// let _10_1 := 0 -// let _10_2 := 0 -// let _10_3 := 3 -// sstore(_10_0, _10_1, _10_2, _10_3, _9_0, _9_1, _9_2, _9_3) -// } -// } -// } -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_2.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_2.yul deleted file mode 100644 index a9612a392776..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_2.yul +++ /dev/null @@ -1,77 +0,0 @@ -{ - switch calldataload(0) - case 0x01000000000000000000000000000000000000010 { sstore(0, 1) } - case 0x02000000000000000000000000000000000000010 { sstore(1, 1) } - case 0x01000000000000000000000000000000000000020 { sstore(2, 1) } - case 0x02000000000000000000000000000000000000020 { sstore(3, 1) } -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 0 -// let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) -// switch _2_0 -// case 0 { -// switch _2_1 -// case 268435456 { -// switch _2_2 -// case 0 { -// switch _2_3 -// case 16 { -// let _3_0 := 0 -// let _3_1 := 0 -// let _3_2 := 0 -// let _3_3 := 1 -// let _4_0 := 0 -// let _4_1 := 0 -// let _4_2 := 0 -// let _4_3 := 0 -// sstore(_4_0, _4_1, _4_2, _4_3, _3_0, _3_1, _3_2, _3_3) -// } -// case 32 { -// let _7_0 := 0 -// let _7_1 := 0 -// let _7_2 := 0 -// let _7_3 := 1 -// let _8_0 := 0 -// let _8_1 := 0 -// let _8_2 := 0 -// let _8_3 := 2 -// sstore(_8_0, _8_1, _8_2, _8_3, _7_0, _7_1, _7_2, _7_3) -// } -// } -// } -// case 536870912 { -// switch _2_2 -// case 0 { -// switch _2_3 -// case 16 { -// let _5_0 := 0 -// let _5_1 := 0 -// let _5_2 := 0 -// let _5_3 := 1 -// let _6_0 := 0 -// let _6_1 := 0 -// let _6_2 := 0 -// let _6_3 := 1 -// sstore(_6_0, _6_1, _6_2, _6_3, _5_0, _5_1, _5_2, _5_3) -// } -// case 32 { -// let _9_0 := 0 -// let _9_1 := 0 -// let _9_2 := 0 -// let _9_3 := 1 -// let _10_0 := 0 -// let _10_1 := 0 -// let _10_2 := 0 -// let _10_3 := 3 -// sstore(_10_0, _10_1, _10_2, _10_3, _9_0, _9_1, _9_2, _9_3) -// } -// } -// } -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul deleted file mode 100644 index 403c579623ac..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_3.yul +++ /dev/null @@ -1,89 +0,0 @@ -{ - switch calldataload(0) - case 0 { sstore(0, 1) } - case 1 { sstore(1, 1) } - case 2 { sstore(2, 1) } - case 3 { sstore(3, 1) } - default { sstore(8, 9) } -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 0 -// let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) -// let run_default -// switch _2_0 -// case 0 { -// switch _2_1 -// case 0 { -// switch _2_2 -// case 0 { -// switch _2_3 -// case 0 { -// let _3_0 := 0 -// let _3_1 := 0 -// let _3_2 := 0 -// let _3_3 := 1 -// let _4_0 := 0 -// let _4_1 := 0 -// let _4_2 := 0 -// let _4_3 := 0 -// sstore(_4_0, _4_1, _4_2, _4_3, _3_0, _3_1, _3_2, _3_3) -// } -// case 1 { -// let _5_0 := 0 -// let _5_1 := 0 -// let _5_2 := 0 -// let _5_3 := 1 -// let _6_0 := 0 -// let _6_1 := 0 -// let _6_2 := 0 -// let _6_3 := 1 -// sstore(_6_0, _6_1, _6_2, _6_3, _5_0, _5_1, _5_2, _5_3) -// } -// case 2 { -// let _7_0 := 0 -// let _7_1 := 0 -// let _7_2 := 0 -// let _7_3 := 1 -// let _8_0 := 0 -// let _8_1 := 0 -// let _8_2 := 0 -// let _8_3 := 2 -// sstore(_8_0, _8_1, _8_2, _8_3, _7_0, _7_1, _7_2, _7_3) -// } -// case 3 { -// let _9_0 := 0 -// let _9_1 := 0 -// let _9_2 := 0 -// let _9_3 := 1 -// let _10_0 := 0 -// let _10_1 := 0 -// let _10_2 := 0 -// let _10_3 := 3 -// sstore(_10_0, _10_1, _10_2, _10_3, _9_0, _9_1, _9_2, _9_3) -// } -// default { run_default := true } -// } -// default { run_default := true } -// } -// default { run_default := true } -// } -// default { run_default := true } -// if run_default -// { -// let _11_0 := 0 -// let _11_1 := 0 -// let _11_2 := 0 -// let _11_3 := 9 -// let _12_0 := 0 -// let _12_1 := 0 -// let _12_2 := 0 -// let _12_3 := 8 -// sstore(_12_0, _12_1, _12_2, _12_3, _11_0, _11_1, _11_2, _11_3) -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul deleted file mode 100644 index d1f45a6231fd..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_4.yul +++ /dev/null @@ -1,97 +0,0 @@ -{ - switch calldataload(0) - case 0x01000000000000000000000000000000000000010 { sstore(0, 1) } - case 0x02000000000000000000000000000000000000010 { sstore(1, 1) } - case 0x01000000000000000000000000000000000000020 { sstore(2, 1) } - case 0x02000000000000000000000000000000000000020 { sstore(3, 1) } - default { sstore(8, 9) } -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 0 -// let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) -// let run_default -// switch _2_0 -// case 0 { -// switch _2_1 -// case 268435456 { -// switch _2_2 -// case 0 { -// switch _2_3 -// case 16 { -// let _3_0 := 0 -// let _3_1 := 0 -// let _3_2 := 0 -// let _3_3 := 1 -// let _4_0 := 0 -// let _4_1 := 0 -// let _4_2 := 0 -// let _4_3 := 0 -// sstore(_4_0, _4_1, _4_2, _4_3, _3_0, _3_1, _3_2, _3_3) -// } -// case 32 { -// let _7_0 := 0 -// let _7_1 := 0 -// let _7_2 := 0 -// let _7_3 := 1 -// let _8_0 := 0 -// let _8_1 := 0 -// let _8_2 := 0 -// let _8_3 := 2 -// sstore(_8_0, _8_1, _8_2, _8_3, _7_0, _7_1, _7_2, _7_3) -// } -// default { run_default := true } -// } -// default { run_default := true } -// } -// case 536870912 { -// switch _2_2 -// case 0 { -// switch _2_3 -// case 16 { -// let _5_0 := 0 -// let _5_1 := 0 -// let _5_2 := 0 -// let _5_3 := 1 -// let _6_0 := 0 -// let _6_1 := 0 -// let _6_2 := 0 -// let _6_3 := 1 -// sstore(_6_0, _6_1, _6_2, _6_3, _5_0, _5_1, _5_2, _5_3) -// } -// case 32 { -// let _9_0 := 0 -// let _9_1 := 0 -// let _9_2 := 0 -// let _9_3 := 1 -// let _10_0 := 0 -// let _10_1 := 0 -// let _10_2 := 0 -// let _10_3 := 3 -// sstore(_10_0, _10_1, _10_2, _10_3, _9_0, _9_1, _9_2, _9_3) -// } -// default { run_default := true } -// } -// default { run_default := true } -// } -// default { run_default := true } -// } -// default { run_default := true } -// if run_default -// { -// let _11_0 := 0 -// let _11_1 := 0 -// let _11_2 := 0 -// let _11_3 := 9 -// let _12_0 := 0 -// let _12_1 := 0 -// let _12_2 := 0 -// let _12_3 := 8 -// sstore(_12_0, _12_1, _12_2, _12_3, _11_0, _11_1, _11_2, _11_3) -// } -// } diff --git a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul b/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul deleted file mode 100644 index a02243a25a10..000000000000 --- a/test/libyul/yulOptimizerTests/wordSizeTransform/switch_5.yul +++ /dev/null @@ -1,29 +0,0 @@ -{ - switch calldataload(0) - default { sstore(8, 9) } -} -// ---- -// step: wordSizeTransform -// -// { -// let _1_0 := 0 -// let _1_1 := 0 -// let _1_2 := 0 -// let _1_3 := 0 -// let _2_0, _2_1, _2_2, _2_3 := calldataload(_1_0, _1_1, _1_2, _1_3) -// let run_default -// switch _2_0 -// default { run_default := true } -// if run_default -// { -// let _3_0 := 0 -// let _3_1 := 0 -// let _3_2 := 0 -// let _3_3 := 9 -// let _4_0 := 0 -// let _4_1 := 0 -// let _4_2 := 0 -// let _4_3 := 8 -// sstore(_4_0, _4_1, _4_2, _4_3, _3_0, _3_1, _3_2, _3_3) -// } -// } diff --git a/test/libyul/yulSyntaxTests/for_loop_condition_fail_ewasm.yul b/test/libyul/yulSyntaxTests/for_loop_condition_fail_ewasm.yul deleted file mode 100644 index ec7a162dc15a..000000000000 --- a/test/libyul/yulSyntaxTests/for_loop_condition_fail_ewasm.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - let x - for {} x {} {} -} -// ==== -// dialect: ewasm -// ---- -// TypeError 1733: (23-24): Expected a value of boolean type "i32" but got "i64" diff --git a/test/libyul/yulSyntaxTests/linkersymbol_ewasm.yul b/test/libyul/yulSyntaxTests/linkersymbol_ewasm.yul deleted file mode 100644 index 051359c07582..000000000000 --- a/test/libyul/yulSyntaxTests/linkersymbol_ewasm.yul +++ /dev/null @@ -1,7 +0,0 @@ -{ - linkersymbol("contract/library.sol:L") -} -// ==== -// dialect: ewasm -// ---- -// DeclarationError 4619: (6-18): Function "linkersymbol" not found. diff --git a/test/libyul/yulSyntaxTests/type_check_cases.yul b/test/libyul/yulSyntaxTests/type_check_cases.yul deleted file mode 100644 index 4e09457c89f5..000000000000 --- a/test/libyul/yulSyntaxTests/type_check_cases.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - switch 7:i64 - case 0:i64 {} - case 2:i64 {} -} -// ==== -// dialect: ewasm -// ---- diff --git a/test/libyul/yulSyntaxTests/type_check_cases_fail.yul b/test/libyul/yulSyntaxTests/type_check_cases_fail.yul deleted file mode 100644 index d9b4c0204a66..000000000000 --- a/test/libyul/yulSyntaxTests/type_check_cases_fail.yul +++ /dev/null @@ -1,10 +0,0 @@ -{ - switch 7:i32 - case 0:i64 {} - case 2:i64 {} -} -// ==== -// dialect: ewasm -// ---- -// TypeError 3781: (28-33): Expected a value of type "i32" but got "i64". -// TypeError 3781: (46-51): Expected a value of type "i32" but got "i64". diff --git a/test/libyul/yulSyntaxTests/type_check_if_condition.yul b/test/libyul/yulSyntaxTests/type_check_if_condition.yul deleted file mode 100644 index eaccf63f6408..000000000000 --- a/test/libyul/yulSyntaxTests/type_check_if_condition.yul +++ /dev/null @@ -1,7 +0,0 @@ -{ - let x:i32 - if x {} -} -// ==== -// dialect: ewasm -// ---- diff --git a/test/libyul/yulSyntaxTests/type_check_if_condition_fail.yul b/test/libyul/yulSyntaxTests/type_check_if_condition_fail.yul deleted file mode 100644 index c8711338ff6a..000000000000 --- a/test/libyul/yulSyntaxTests/type_check_if_condition_fail.yul +++ /dev/null @@ -1,8 +0,0 @@ -{ - let x:i64 - if x {} -} -// ==== -// dialect: ewasm -// ---- -// TypeError 1733: (23-24): Expected a value of boolean type "i32" but got "i64" diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 6fdecd7faee3..2883f5c51f09 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) "dir1/file1.sol:L=0x1234567890123456789012345678901234567890," "dir2/file2.sol:L=0x1111122222333334444455555666667777788888", "--ast-compact-json", "--asm", "--asm-json", "--opcodes", "--bin", "--bin-runtime", "--abi", - "--ir", "--ir-optimized", "--ewasm", "--hashes", "--userdoc", "--devdoc", "--metadata", "--storage-layout", + "--ir", "--ir-optimized", "--hashes", "--userdoc", "--devdoc", "--metadata", "--storage-layout", "--gas", "--combined-json=" "abi,metadata,bin,bin-runtime,opcodes,asm,storage-layout,generated-sources,generated-sources-runtime," @@ -192,10 +192,8 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) expectedOptions.compiler.outputs = { true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, - true, + true, true, true, true, }; - expectedOptions.compiler.outputs.ewasmIR = false; expectedOptions.compiler.estimateGas = true; expectedOptions.compiler.combinedJsonRequests = { true, true, true, true, true, @@ -249,13 +247,6 @@ BOOST_AUTO_TEST_CASE(via_ir_options) BOOST_AUTO_TEST_CASE(assembly_mode_options) { static vector, YulStack::Machine, YulStack::Language>> const allowedCombinations = { - {{"--machine=ewasm", "--yul-dialect=ewasm", "--assemble"}, YulStack::Machine::Ewasm, YulStack::Language::Ewasm}, - {{"--machine=ewasm", "--yul-dialect=ewasm", "--yul"}, YulStack::Machine::Ewasm, YulStack::Language::Ewasm}, - {{"--machine=ewasm", "--yul-dialect=ewasm", "--strict-assembly"}, YulStack::Machine::Ewasm, YulStack::Language::Ewasm}, - {{"--machine=ewasm", "--yul-dialect=evm", "--assemble"}, YulStack::Machine::Ewasm, YulStack::Language::StrictAssembly}, - {{"--machine=ewasm", "--yul-dialect=evm", "--yul"}, YulStack::Machine::Ewasm, YulStack::Language::StrictAssembly}, - {{"--machine=ewasm", "--yul-dialect=evm", "--strict-assembly"}, YulStack::Machine::Ewasm, YulStack::Language::StrictAssembly}, - {{"--machine=ewasm", "--strict-assembly"}, YulStack::Machine::Ewasm, YulStack::Language::Ewasm}, {{"--machine=evm", "--yul-dialect=evm", "--assemble"}, YulStack::Machine::EVM, YulStack::Language::StrictAssembly}, {{"--machine=evm", "--yul-dialect=evm", "--yul"}, YulStack::Machine::EVM, YulStack::Language::StrictAssembly}, {{"--machine=evm", "--yul-dialect=evm", "--strict-assembly"}, YulStack::Machine::EVM, YulStack::Language::StrictAssembly}, @@ -299,11 +290,9 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options) "--asm", "--bin", "--ir-optimized", - "--ewasm", - "--ewasm-ir", }; commandLine += assemblyOptions; - if (expectedLanguage == YulStack::Language::StrictAssembly || expectedLanguage == YulStack::Language::Ewasm) + if (expectedLanguage == YulStack::Language::StrictAssembly) commandLine += vector{ "--optimize", "--optimize-runs=1000", @@ -340,9 +329,7 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options) expectedOptions.compiler.outputs.asm_ = true; expectedOptions.compiler.outputs.binary = true; expectedOptions.compiler.outputs.irOptimized = true; - expectedOptions.compiler.outputs.ewasm = true; - expectedOptions.compiler.outputs.ewasmIR = true; - if (expectedLanguage == YulStack::Language::StrictAssembly || expectedLanguage == YulStack::Language::Ewasm) + if (expectedLanguage == YulStack::Language::StrictAssembly) { expectedOptions.optimizer.enabled = true; expectedOptions.optimizer.yulSteps = "agf"; diff --git a/test/soltest.cpp b/test/soltest.cpp index 2120acc2dfce..6aa100248875 100644 --- a/test/soltest.cpp +++ b/test/soltest.cpp @@ -133,7 +133,6 @@ int registerTests( boost::unit_test::test_suite& _suite, boost::filesystem::path const& _basepath, boost::filesystem::path const& _path, - bool _enforceCompileToEwasm, vector const& _labels, TestCase::TestCaseCreator _testCaseCreator, solidity::test::Batcher& _batcher @@ -146,7 +145,6 @@ int registerTests( solidity::test::CommonOptions::get().evmVersion(), solidity::test::CommonOptions::get().eofVersion(), solidity::test::CommonOptions::get().vmPaths, - _enforceCompileToEwasm, solidity::test::CommonOptions::get().enforceGasTest, solidity::test::CommonOptions::get().enforceGasTestMinValue, }; @@ -164,7 +162,6 @@ int registerTests( numTestsAdded += registerTests( *sub_suite, _basepath, _path / entry.path().filename(), - _enforceCompileToEwasm, _labels, _testCaseCreator, _batcher @@ -269,7 +266,6 @@ test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) master, options.testPath / ts.path, ts.subpath, - options.enforceCompileToEwasm, ts.labels, ts.testCaseCreator, batcher diff --git a/test/tools/CMakeLists.txt b/test/tools/CMakeLists.txt index 0bb8896cd8e0..5a2ba8da3f95 100644 --- a/test/tools/CMakeLists.txt +++ b/test/tools/CMakeLists.txt @@ -36,7 +36,6 @@ add_executable(isoltest ../libyul/ControlFlowGraphTest.cpp ../libyul/ControlFlowSideEffectsTest.cpp ../libyul/EVMCodeTransformTest.cpp - ../libyul/EwasmTranslationTest.cpp ../libyul/FunctionSideEffects.cpp ../libyul/ObjectCompilerTest.cpp ../libyul/SyntaxTest.cpp diff --git a/test/tools/isoltest.cpp b/test/tools/isoltest.cpp index 4739a54e9c3b..2d93bdbc2b9a 100644 --- a/test/tools/isoltest.cpp +++ b/test/tools/isoltest.cpp @@ -161,7 +161,6 @@ TestTool::Result TestTool::process() m_options.evmVersion(), m_options.eofVersion(), m_options.vmPaths, - m_options.enforceCompileToEwasm, m_options.enforceGasTest, m_options.enforceGasTestMinValue }); diff --git a/test/tools/yulInterpreter/CMakeLists.txt b/test/tools/yulInterpreter/CMakeLists.txt index cc1b40f074f6..235e8fac10a6 100644 --- a/test/tools/yulInterpreter/CMakeLists.txt +++ b/test/tools/yulInterpreter/CMakeLists.txt @@ -1,8 +1,6 @@ set(sources EVMInstructionInterpreter.h EVMInstructionInterpreter.cpp - EwasmBuiltinInterpreter.h - EwasmBuiltinInterpreter.cpp Interpreter.h Interpreter.cpp Inspector.h diff --git a/test/tools/yulInterpreter/EwasmBuiltinInterpreter.cpp b/test/tools/yulInterpreter/EwasmBuiltinInterpreter.cpp deleted file mode 100644 index fdba09aa46d4..000000000000 --- a/test/tools/yulInterpreter/EwasmBuiltinInterpreter.cpp +++ /dev/null @@ -1,617 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Yul interpreter module that evaluates Ewasm builtins. - */ - -#include - -#include - -#include -#include - -#include - -#include -#include - -#include - -using namespace std; -using namespace solidity; -using namespace solidity::yul; -using namespace solidity::yul::test; - -using solidity::util::h160; -using solidity::util::h256; - -namespace -{ - -/// Copy @a _size bytes of @a _source at offset @a _sourceOffset to -/// @a _target at offset @a _targetOffset. Behaves as if @a _source would -/// continue with an infinite sequence of zero bytes beyond its end. -void copyZeroExtended( - map& _target, bytes const& _source, - size_t _targetOffset, size_t _sourceOffset, size_t _size -) -{ - for (size_t i = 0; i < _size; ++i) - _target[_targetOffset + i] = _sourceOffset + i < _source.size() ? _source[_sourceOffset + i] : 0; -} - -/// Count leading zeros for uint64. Following WebAssembly rules, it returns 64 for @a _v being zero. -/// NOTE: the clz builtin of the compiler may or may not do this -uint64_t clz64(uint64_t _v) -{ - if (_v == 0) - return 64; - - uint64_t r = 0; - while (!(_v & 0x8000000000000000)) - { - r += 1; - _v = _v << 1; - } - return r; -} - -/// Count trailing zeros for uint32. Following WebAssembly rules, it returns 32 for @a _v being zero. -/// NOTE: the ctz builtin of the compiler may or may not do this -uint32_t ctz32(uint32_t _v) -{ - if (_v == 0) - return 32; - - uint32_t r = 0; - while (!(_v & 1)) - { - r++; - _v >>= 1; - } - return r; -} - -/// Count trailing zeros for uint64. Following WebAssembly rules, it returns 64 for @a _v being zero. -/// NOTE: the ctz builtin of the compiler may or may not do this -uint64_t ctz64(uint64_t _v) -{ - if (_v == 0) - return 64; - - uint64_t r = 0; - while (!(_v & 1)) - { - r++; - _v >>= 1; - } - return r; -} - -/// Count number of bits set for uint64 -uint64_t popcnt(uint64_t _v) -{ - uint64_t r = 0; - while (_v) - { - r += (_v & 1); - _v >>= 1; - } - return r; -} - -} - -u256 EwasmBuiltinInterpreter::evalBuiltin( - YulString _functionName, - vector const& _arguments, - vector const& _evaluatedArguments -) -{ - vector arg; - for (u256 const& a: _evaluatedArguments) - arg.emplace_back(uint64_t(a & uint64_t(-1))); - - string const fun = _functionName.str(); - if (fun == "datasize" || fun == "dataoffset") - { - string arg = std::get(_arguments.at(0)).value.str(); - if (arg.length() < 32) - arg.resize(32, 0); - if (fun == "datasize") - return u256(util::keccak256(arg)) & 0xfff; - else if (fun == "dataoffset") - { - // Force different value than for datasize - arg[31]++; - arg[31]++; - return u256(util::keccak256(arg)) & 0xfff; - } - } - else if (fun == "datacopy") - { - // This is identical to codecopy. - accessMemory(_evaluatedArguments.at(0), _evaluatedArguments.at(2)); - copyZeroExtended( - m_state.memory, - m_state.code, - static_cast(_evaluatedArguments.at(0)), - static_cast(_evaluatedArguments.at(1) & numeric_limits::max()), - static_cast(_evaluatedArguments.at(2)) - ); - return 0; - } - else if (fun == "i32.drop" || fun == "i64.drop" || fun == "nop") - return {}; - else if (fun == "i32.select") - { - if ((arg.at(2) & 0xffffffff) == 0) - return arg.at(1); - else - return arg.at(0); - } - else if (fun == "i64.select") - { - if ((arg.at(2) & 0xffffffffffffffff) == 0) - return arg.at(1); - else - return arg.at(0); - } - else if (fun == "i32.wrap_i64") - return arg.at(0) & uint32_t(-1); - else if (fun == "i64.extend_i32_u") - // Return the same as above because everything is u256 anyway. - return arg.at(0) & uint32_t(-1); - else if (fun == "unreachable") - { - logTrace(evmasm::Instruction::INVALID, {}); - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - } - else if (fun == "i64.store") - { - accessMemory(arg[0], 8); - writeMemoryWord(arg[0], arg[1]); - return 0; - } - else if (fun == "i64.store8" || fun == "i32.store8") - { - accessMemory(arg[0], 1); - writeMemoryByte(arg[0], static_cast(arg[1] & 0xff)); - return 0; - } - else if (fun == "i64.load") - { - accessMemory(arg[0], 8); - return readMemoryWord(arg[0]); - } - else if (fun == "i32.store") - { - accessMemory(arg[0], 4); - writeMemoryHalfWord(arg[0], static_cast(arg[1])); - return 0; - } - else if (fun == "i32.load") - { - accessMemory(arg[0], 4); - return readMemoryHalfWord(arg[0]); - } - else if (fun == "i32.clz") - // NOTE: the clz implementation assumes 64-bit inputs, hence the adjustment - return clz64(arg[0] & uint32_t(-1)) - 32; - else if (fun == "i64.clz") - return clz64(arg[0]); - else if (fun == "i32.ctz") - return ctz32(uint32_t(arg[0] & uint32_t(-1))); - else if (fun == "i64.ctz") - return ctz64(arg[0]); - - string prefix = fun; - string suffix; - auto dot = prefix.find("."); - if (dot != string::npos) - { - suffix = prefix.substr(dot + 1); - prefix.resize(dot); - } - - if (prefix == "i32") - { - vector halfWordArgs; - for (uint64_t a: arg) - halfWordArgs.push_back(uint32_t(a & uint32_t(-1))); - return evalWasmBuiltin(suffix, halfWordArgs); - } - else if (prefix == "i64") - return evalWasmBuiltin(suffix, arg); - else if (prefix == "eth") - return evalEthBuiltin(suffix, arg); - - yulAssert(false, "Unknown builtin: " + fun + " (or implementation did not return)"); - - return 0; -} - -template -u256 EwasmBuiltinInterpreter::evalWasmBuiltin(string const& _fun, vector const& _arguments) -{ - vector const& arg = _arguments; - - if (_fun == "add") - return arg[0] + arg[1]; - else if (_fun == "sub") - return arg[0] - arg[1]; - else if (_fun == "mul") - return arg[0] * arg[1]; - else if (_fun == "div_u") - { - if (arg[1] == 0) - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - else - return arg[0] / arg[1]; - } - else if (_fun == "rem_u") - { - if (arg[1] == 0) - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - else - return arg[0] % arg[1]; - } - else if (_fun == "and") - return arg[0] & arg[1]; - else if (_fun == "or") - return arg[0] | arg[1]; - else if (_fun == "xor") - return arg[0] ^ arg[1]; - else if (_fun == "shl") - return arg[0] << arg[1]; - else if (_fun == "shr_u") - return arg[0] >> arg[1]; - else if (_fun == "eq") - return arg[0] == arg[1] ? 1 : 0; - else if (_fun == "ne") - return arg[0] != arg[1] ? 1 : 0; - else if (_fun == "eqz") - return arg[0] == 0 ? 1 : 0; - else if (_fun == "popcnt") - return popcnt(arg[0]); - else if (_fun == "lt_u") - return arg[0] < arg[1] ? 1 : 0; - else if (_fun == "gt_u") - return arg[0] > arg[1] ? 1 : 0; - else if (_fun == "le_u") - return arg[0] <= arg[1] ? 1 : 0; - else if (_fun == "ge_u") - return arg[0] >= arg[1] ? 1 : 0; - - yulAssert(false, "Unknown builtin: " + _fun + " (or implementation did not return)"); - - return 0; -} - -u256 EwasmBuiltinInterpreter::evalEthBuiltin(string const& _fun, vector const& _arguments) -{ - vector const& arg = _arguments; - - if (_fun == "getAddress") - { - writeAddress(arg[0], m_state.address); - return 0; - } - else if (_fun == "getExternalBalance") - { - readAddress(arg[0]); - writeU128(arg[1], m_state.balance); - return 0; - } - else if (_fun == "getBlockHash") - { - if (arg[0] >= m_state.blockNumber || arg[0] + 256 < m_state.blockNumber) - return 1; - else - { - writeBytes32(arg[1], h256(0xaaaaaaaa + u256(arg[0] - m_state.blockNumber - 256))); - return 0; - } - } - else if (_fun == "call") - { - readAddress(arg[1]); - readU128(arg[2]); - accessMemory(arg[3], arg[4]); - logTrace(evmasm::Instruction::CALL, {}); - return arg[0] & 1; - } - else if (_fun == "callDataCopy") - { - if (arg[1] + arg[2] < arg[1] || arg[1] + arg[2] > m_state.calldata.size()) - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - accessMemory(arg[0], arg[2]); - copyZeroExtended( - m_state.memory, m_state.calldata, - size_t(arg[0]), size_t(arg[1]), size_t(arg[2]) - ); - return {}; - } - else if (_fun == "getCallDataSize") - return m_state.calldata.size(); - else if (_fun == "callCode") - { - readAddress(arg[1]); - readU128(arg[2]); - accessMemory(arg[3], arg[4]); - logTrace(evmasm::Instruction::CALLCODE, {}); - return arg[0] & 1; - } - else if (_fun == "callDelegate") - { - readAddress(arg[1]); - accessMemory(arg[2], arg[3]); - logTrace(evmasm::Instruction::DELEGATECALL, {}); - return arg[0] & 1; - } - else if (_fun == "callStatic") - { - readAddress(arg[1]); - accessMemory(arg[2], arg[3]); - logTrace(evmasm::Instruction::STATICCALL, {}); - return arg[0] & 1; - } - else if (_fun == "storageStore") - { - m_state.storage[readBytes32(arg[0])] = readBytes32(arg[1]); - return 0; - } - else if (_fun == "storageLoad") - { - writeBytes32(arg[1], m_state.storage[readBytes32(arg[0])]); - return 0; - } - else if (_fun == "getCaller") - { - writeAddress(arg[0], m_state.caller); - return 0; - } - else if (_fun == "getCallValue") - { - writeU128(arg[0], m_state.callvalue); - return 0; - } - else if (_fun == "codeCopy") - { - accessMemory(arg[0], arg[2]); - copyZeroExtended( - m_state.memory, m_state.code, - size_t(arg[0]), size_t(arg[1]), size_t(arg[2]) - ); - return 0; - } - else if (_fun == "getCodeSize") - return m_state.code.size(); - else if (_fun == "getBlockCoinbase") - { - writeAddress(arg[0], m_state.coinbase); - return 0; - } - else if (_fun == "create") - { - readU128(arg[0]); - accessMemory(arg[1], arg[2]); - logTrace(evmasm::Instruction::CREATE, {}); - writeAddress(arg[3], h160(0xcccccc + arg[1])); - return 1; - } - else if (_fun == "getBlockBaseFee") - { - writeU128(arg[0], m_state.basefee); - return 0; - } - else if (_fun == "getBlockDifficulty") - { - writeU256(arg[0], m_state.difficulty); - return 0; - } - else if (_fun == "externalCodeCopy") - { - readAddress(arg[0]); - accessMemory(arg[1], arg[3]); - // TODO this way extcodecopy and codecopy do the same thing. - copyZeroExtended( - m_state.memory, m_state.code, - size_t(arg[1]), size_t(arg[2]), size_t(arg[3]) - ); - return 0; - } - else if (_fun == "getExternalCodeSize") - // Generate "random" code length. - return uint32_t(u256(keccak256(h256(readAddress(arg[0]), h256::AlignLeft))) & 0xfff); - else if (_fun == "getGasLeft") - return 0x99; - else if (_fun == "getBlockGasLimit") - return uint64_t(m_state.gaslimit); - else if (_fun == "getTxGasPrice") - { - writeU128(arg[0], m_state.gasprice); - return 0; - } - else if (_fun == "log") - { - accessMemory(arg[0], arg[1]); - uint64_t numberOfTopics = arg[2]; - if (numberOfTopics > 4) - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - if (numberOfTopics > 0) - readBytes32(arg[3]); - if (numberOfTopics > 1) - readBytes32(arg[4]); - if (numberOfTopics > 2) - readBytes32(arg[5]); - if (numberOfTopics > 3) - readBytes32(arg[6]); - logTrace(evmasm::logInstruction(static_cast(numberOfTopics)), {}); - return 0; - } - else if (_fun == "getBlockNumber") - return m_state.blockNumber; - else if (_fun == "getTxOrigin") - { - writeAddress(arg[0], m_state.origin); - return 0; - } - else if (_fun == "finish") - { - bytes data; - accessMemory(arg[0], arg[1]); - data = readMemory(arg[0], arg[1]); - logTrace(evmasm::Instruction::RETURN, {}, data); - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - } - else if (_fun == "revert") - { - bytes data; - accessMemory(arg[0], arg[1]); - data = readMemory(arg[0], arg[1]); - logTrace(evmasm::Instruction::REVERT, {}, data); - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - } - else if (_fun == "getReturnDataSize") - return m_state.returndata.size(); - else if (_fun == "returnDataCopy") - { - if (arg[1] + arg[2] < arg[1] || arg[1] + arg[2] > m_state.returndata.size()) - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - accessMemory(arg[0], arg[2]); - copyZeroExtended( - m_state.memory, m_state.calldata, - size_t(arg[0]), size_t(arg[1]), size_t(arg[2]) - ); - return {}; - } - else if (_fun == "selfDestruct") - { - readAddress(arg[0]); - logTrace(evmasm::Instruction::SELFDESTRUCT, {}); - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); - } - else if (_fun == "getBlockTimestamp") - return m_state.timestamp; - - yulAssert(false, "Unknown builtin: " + _fun + " (or implementation did not return)"); - - return 0; -} - -void EwasmBuiltinInterpreter::accessMemory(u256 const& _offset, u256 const& _size) -{ - // Single WebAssembly page. - // TODO: Support expansion in this interpreter. - m_state.msize = 65536; - - if (((_offset + _size) < _offset) || ((_offset + _size) > m_state.msize)) - // Ewasm throws out of bounds exception as opposed to the EVM. - BOOST_THROW_EXCEPTION(ExplicitlyTerminated()); -} - -bytes EwasmBuiltinInterpreter::readMemory(uint64_t _offset, uint64_t _size) -{ - yulAssert(_size <= 0xffff, "Too large read."); - bytes data(size_t(_size), uint8_t(0)); - for (size_t i = 0; i < data.size(); ++i) - data[i] = m_state.memory[_offset + i]; - return data; -} - -uint64_t EwasmBuiltinInterpreter::readMemoryWord(uint64_t _offset) -{ - uint64_t r = 0; - for (size_t i = 0; i < 8; i++) - r |= uint64_t(m_state.memory[_offset + i]) << (i * 8); - return r; -} - -uint32_t EwasmBuiltinInterpreter::readMemoryHalfWord(uint64_t _offset) -{ - uint32_t r = 0; - for (size_t i = 0; i < 4; i++) - r |= uint32_t(m_state.memory[_offset + i]) << (i * 8); - return r; -} - -void EwasmBuiltinInterpreter::writeMemory(uint64_t _offset, bytes const& _value) -{ - for (size_t i = 0; i < _value.size(); i++) - m_state.memory[_offset + i] = _value[i]; -} - -void EwasmBuiltinInterpreter::writeMemoryWord(uint64_t _offset, uint64_t _value) -{ - for (size_t i = 0; i < 8; i++) - m_state.memory[_offset + i] = uint8_t((_value >> (i * 8)) & 0xff); -} - -void EwasmBuiltinInterpreter::writeMemoryHalfWord(uint64_t _offset, uint32_t _value) -{ - for (size_t i = 0; i < 4; i++) - m_state.memory[_offset + i] = uint8_t((_value >> (i * 8)) & 0xff); -} - -void EwasmBuiltinInterpreter::writeMemoryByte(uint64_t _offset, uint8_t _value) -{ - m_state.memory[_offset] = _value; -} - -void EwasmBuiltinInterpreter::writeU256(uint64_t _offset, u256 _value, size_t _croppedTo) -{ - accessMemory(_offset, _croppedTo); - for (size_t i = 0; i < _croppedTo; i++) - { - m_state.memory[_offset + i] = uint8_t(_value & 0xff); - _value >>= 8; - } -} - -u256 EwasmBuiltinInterpreter::readU256(uint64_t _offset, size_t _croppedTo) -{ - accessMemory(_offset, _croppedTo); - u256 value{0}; - for (size_t i = 0; i < _croppedTo; i++) - value = (value << 8) | m_state.memory[_offset + _croppedTo - 1 - i]; - - return value; -} - -void EwasmBuiltinInterpreter::logTrace(evmasm::Instruction _instruction, std::vector const& _arguments, bytes const& _data) -{ - logTrace(evmasm::instructionInfo(_instruction, langutil::EVMVersion()).name, _arguments, _data); -} - -void EwasmBuiltinInterpreter::logTrace(std::string const& _pseudoInstruction, std::vector const& _arguments, bytes const& _data) -{ - string message = _pseudoInstruction + "("; - for (size_t i = 0; i < _arguments.size(); ++i) - message += (i > 0 ? ", " : "") + formatNumber(_arguments[i]); - message += ")"; - if (!_data.empty()) - message += " [" + util::toHex(_data) + "]"; - m_state.trace.emplace_back(std::move(message)); - if (m_state.maxTraceSize > 0 && m_state.trace.size() >= m_state.maxTraceSize) - { - m_state.trace.emplace_back("Trace size limit reached."); - BOOST_THROW_EXCEPTION(TraceLimitReached()); - } -} diff --git a/test/tools/yulInterpreter/EwasmBuiltinInterpreter.h b/test/tools/yulInterpreter/EwasmBuiltinInterpreter.h deleted file mode 100644 index 1837f7509eb1..000000000000 --- a/test/tools/yulInterpreter/EwasmBuiltinInterpreter.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -// SPDX-License-Identifier: GPL-3.0 -/** - * Yul interpreter module that evaluates Ewasm builtins. - */ - -#pragma once - -#include - -#include -#include - -#include - -namespace solidity::evmasm -{ -enum class Instruction: uint8_t; -} - -namespace solidity::yul -{ -class YulString; -struct BuiltinFunctionForEVM; -} - -namespace solidity::yul::test -{ - -struct InterpreterState; - -/** - * Interprets Ewasm builtins based on the current state and logs instructions with - * side-effects. - * - * Since this is mainly meant to be used for differential fuzz testing, it is focused - * on a single contract only, does not do any gas counting and differs from the correct - * implementation in many ways: - * - * - If memory access to a "large" memory position is performed, a deterministic - * value is returned. Data that is stored in a "large" memory position is not - * retained. - * - The blockhash instruction returns a fixed value if the argument is in range. - * - Extcodesize returns a deterministic value depending on the address. - * - Extcodecopy copies a deterministic value depending on the address. - * - And many other things - * - * The main focus is that the generated execution trace is the same for equivalent executions - * and likely to be different for non-equivalent executions. - * - * The type names are following the Ewasm specification (https://github.com/ewasm/design/blob/master/eth_interface.md). - */ -class EwasmBuiltinInterpreter -{ -public: - explicit EwasmBuiltinInterpreter(InterpreterState& _state): - m_state(_state) - {} - /// Evaluate builtin function - u256 evalBuiltin( - YulString _functionName, - std::vector const& _arguments, - std::vector const& _evaluatedArguments - ); - -private: - template - u256 evalWasmBuiltin( - std::string const& _fun, - std::vector const& _arguments - ); - u256 evalEthBuiltin( - std::string const& _fun, - std::vector const& _arguments - ); - - /// Checks if the memory access is not too large for the interpreter and adjusts - /// msize accordingly. - void accessMemory(u256 const& _offset, u256 const& _size = 32); - /// @returns the memory contents at the provided address. - /// Does not adjust msize, use @a accessMemory for that - bytes readMemory(uint64_t _offset, uint64_t _size = 32); - /// @returns the memory contents (8 bytes) at the provided address (little-endian). - /// Does not adjust msize, use @a accessMemory for that - uint64_t readMemoryWord(uint64_t _offset); - /// @returns the memory contents (4 bytes) at the provided address (little-endian). - /// Does not adjust msize, use @a accessMemory for that - uint32_t readMemoryHalfWord(uint64_t _offset); - /// Writes bytes to memory. - /// Does not adjust msize, use @a accessMemory for that - void writeMemory(uint64_t _offset, bytes const& _value); - /// Writes a word to memory (little-endian) - /// Does not adjust msize, use @a accessMemory for that - void writeMemoryWord(uint64_t _offset, uint64_t _value); - /// Writes a 4-byte value to memory (little-endian) - /// Does not adjust msize, use @a accessMemory for that - void writeMemoryHalfWord(uint64_t _offset, uint32_t _value); - /// Writes a byte to memory - /// Does not adjust msize, use @a accessMemory for that - void writeMemoryByte(uint64_t _offset, uint8_t _value); - - /// Helper for eth.* builtins. Writes to memory (little-endian) and always returns zero. - void writeU256(uint64_t _offset, u256 _value, size_t _croppedTo = 32); - void writeU128(uint64_t _offset, u256 _value) { writeU256(_offset, std::move(_value), 16); } - /// Helper for eth.* builtins. Writes to memory (as a byte string). - void writeBytes32(uint64_t _offset, util::h256 _value) { accessMemory(_offset, 32); writeMemory(_offset, _value.asBytes()); } - void writeAddress(uint64_t _offset, util::h160 _value) { accessMemory(_offset, 20); writeMemory(_offset, _value.asBytes()); } - /// Helper for eth.* builtins. Reads from memory (little-endian) and returns the value. - u256 readU256(uint64_t _offset, size_t _croppedTo = 32); - u256 readU128(uint64_t _offset) { return readU256(_offset, 16); } - /// Helper for eth.* builtins. Reads from memory (as a byte string). - util::h256 readBytes32(uint64_t _offset) { accessMemory(_offset, 32); return util::h256(readMemory(_offset, 32)); } - util::h160 readAddress(uint64_t _offset) { accessMemory(_offset, 20); return util::h160(readMemory(_offset, 20)); } - - void logTrace(evmasm::Instruction _instruction, std::vector const& _arguments = {}, bytes const& _data = {}); - /// Appends a log to the trace representing an instruction or similar operation by string, - /// with arguments and auxiliary data (if nonempty). - void logTrace(std::string const& _pseudoInstruction, std::vector const& _arguments = {}, bytes const& _data = {}); - - InterpreterState& m_state; -}; - -} diff --git a/test/tools/yulInterpreter/Interpreter.cpp b/test/tools/yulInterpreter/Interpreter.cpp index b66967e26fb8..aadd22b4db77 100644 --- a/test/tools/yulInterpreter/Interpreter.cpp +++ b/test/tools/yulInterpreter/Interpreter.cpp @@ -22,13 +22,11 @@ #include #include -#include #include #include #include #include -#include #include @@ -329,13 +327,6 @@ void ExpressionEvaluator::operator()(FunctionCall const& _funCall) return; } } - else if (WasmDialect const* dialect = dynamic_cast(&m_dialect)) - if (dialect->builtin(_funCall.functionName.name)) - { - EwasmBuiltinInterpreter interpreter(m_state); - setValue(interpreter.evalBuiltin(_funCall.functionName.name, _funCall.arguments, values())); - return; - } Scope* scope = &m_scope; for (; scope; scope = scope->parent) From a334ab352533ceb7128b9b704165649a1770148b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20Uzdo=C4=9Fan?= Date: Mon, 15 May 2023 16:32:12 +0200 Subject: [PATCH 007/138] Add in immutables docs --- docs/contracts/constant-state-variables.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/contracts/constant-state-variables.rst b/docs/contracts/constant-state-variables.rst index 2e94397b1266..d99004e00452 100644 --- a/docs/contracts/constant-state-variables.rst +++ b/docs/contracts/constant-state-variables.rst @@ -84,7 +84,8 @@ contract's runtime code before it is returned by replacing all references to immutables with the values assigned to them. This is important if you are comparing the runtime code generated by the compiler with the one actually stored in the -blockchain. +blockchain. The compiler outputs where these immutables are located in the bytecode +in the ``immutableReferences`` of the :ref:`compiler output ` .. note:: Immutables that are assigned at their declaration are only considered From 5fcba5322348a842b029c0e9d64422b8011aad0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20Uzdo=C4=9Fan?= Date: Mon, 15 May 2023 16:39:31 +0200 Subject: [PATCH 008/138] Fix trailing whitespace, add punctuation --- docs/contracts/constant-state-variables.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contracts/constant-state-variables.rst b/docs/contracts/constant-state-variables.rst index d99004e00452..27604490787c 100644 --- a/docs/contracts/constant-state-variables.rst +++ b/docs/contracts/constant-state-variables.rst @@ -85,7 +85,7 @@ to immutables with the values assigned to them. This is important if you are comparing the runtime code generated by the compiler with the one actually stored in the blockchain. The compiler outputs where these immutables are located in the bytecode -in the ``immutableReferences`` of the :ref:`compiler output ` +in the ``immutableReferences`` of the :ref:`compiler output `. .. note:: Immutables that are assigned at their declaration are only considered From c8117ef75e7dc4f607965b3bee0581032cf43624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20Uzdo=C4=9Fan?= Date: Mon, 15 May 2023 17:21:03 +0200 Subject: [PATCH 009/138] Be more explicit about `immutableReferences` Co-authored-by: r0qs --- docs/contracts/constant-state-variables.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/contracts/constant-state-variables.rst b/docs/contracts/constant-state-variables.rst index 27604490787c..1b57bf3bec5b 100644 --- a/docs/contracts/constant-state-variables.rst +++ b/docs/contracts/constant-state-variables.rst @@ -84,8 +84,8 @@ contract's runtime code before it is returned by replacing all references to immutables with the values assigned to them. This is important if you are comparing the runtime code generated by the compiler with the one actually stored in the -blockchain. The compiler outputs where these immutables are located in the bytecode -in the ``immutableReferences`` of the :ref:`compiler output `. +blockchain. The compiler outputs where these immutables are located in the deployed bytecode +in the ``immutableReferences`` field of the :ref:`compiler JSON standard output `. .. note:: Immutables that are assigned at their declaration are only considered From 8a41f4ac7e05f8b5f9e0d2d43e4c9e70969bdc47 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Thu, 27 Apr 2023 19:39:59 +0200 Subject: [PATCH 010/138] Introduce solidity-next pragma Exclude pragma experimental error from ANTLR tests Test for first pragma after non-pragma declaration Resolve import pragmas Change pragma name from next to solidity Add Changelog entries Address review comments --- Changelog.md | 5 ++++ libsolidity/ast/AST.h | 11 +++++-- libsolidity/ast/ASTJsonExporter.cpp | 5 +++- libsolidity/ast/ASTJsonImporter.cpp | 6 +++- libsolidity/ast/ExperimentalFeatures.h | 4 ++- libsolidity/interface/CompilerStack.cpp | 29 +++++++++++++++++-- libsolidity/interface/CompilerStack.h | 2 +- libsolidity/parsing/Parser.cpp | 18 ++++++++++-- libsolidity/parsing/Parser.h | 4 ++- scripts/test_antlr_grammar.sh | 2 +- .../ASTJSON/pragma_experimental_solidity.json | 21 ++++++++++++++ .../ASTJSON/pragma_experimental_solidity.sol | 3 ++ ...ragma_experimental_solidity_parseOnly.json | 20 +++++++++++++ test/libsolidity/SolidityTypes.cpp | 2 +- .../pragma/experimental_solidity.sol | 3 ++ ...al_solidity_multisource_not_all_enable.sol | 24 +++++++++++++++ .../experimental_solidity_out_of_order_1.sol | 5 ++++ .../experimental_solidity_out_of_order_2.sol | 13 +++++++++ 18 files changed, 163 insertions(+), 14 deletions(-) create mode 100644 test/libsolidity/ASTJSON/pragma_experimental_solidity.json create mode 100644 test/libsolidity/ASTJSON/pragma_experimental_solidity.sol create mode 100644 test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json create mode 100644 test/libsolidity/syntaxTests/pragma/experimental_solidity.sol create mode 100644 test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol create mode 100644 test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol create mode 100644 test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol diff --git a/Changelog.md b/Changelog.md index b88348e1b178..71ccea0df1a0 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,12 +5,17 @@ Language Features: Compiler Features: * EWasm: Remove EWasm backend. + * Parser: Introduce ``pragma experimental solidity``, which will enable an experimental language mode that in particular has no stability guarantees between non-breaking releases and is not suited for production use. Bugfixes: * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. +AST Changes: + * AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``. + + ### 0.8.20 (2023-05-10) Compiler Features: diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 317e95d43643..494cbeac2123 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -167,9 +167,14 @@ class SourceUnit: public ASTNode, public ScopeOpener int64_t _id, SourceLocation const& _location, std::optional _licenseString, - std::vector> _nodes + std::vector> _nodes, + bool _experimentalSolidity ): - ASTNode(_id, _location), m_licenseString(std::move(_licenseString)), m_nodes(std::move(_nodes)) {} + ASTNode(_id, _location), + m_licenseString(std::move(_licenseString)), + m_nodes(std::move(_nodes)), + m_experimentalSolidity(_experimentalSolidity) + {} void accept(ASTVisitor& _visitor) override; void accept(ASTConstVisitor& _visitor) const override; @@ -180,10 +185,12 @@ class SourceUnit: public ASTNode, public ScopeOpener /// @returns a set of referenced SourceUnits. Recursively if @a _recurse is true. std::set referencedSourceUnits(bool _recurse = false, std::set _skipList = std::set()) const; + bool experimentalSolidity() const { return m_experimentalSolidity; } private: std::optional m_licenseString; std::vector> m_nodes; + bool m_experimentalSolidity = false; }; /** diff --git a/libsolidity/ast/ASTJsonExporter.cpp b/libsolidity/ast/ASTJsonExporter.cpp index e13cead11a18..da7f769362fe 100644 --- a/libsolidity/ast/ASTJsonExporter.cpp +++ b/libsolidity/ast/ASTJsonExporter.cpp @@ -214,9 +214,12 @@ bool ASTJsonExporter::visit(SourceUnit const& _node) { std::vector> attributes = { make_pair("license", _node.licenseString() ? Json::Value(*_node.licenseString()) : Json::nullValue), - make_pair("nodes", toJson(_node.nodes())) + make_pair("nodes", toJson(_node.nodes())), }; + if (_node.experimentalSolidity()) + attributes.emplace_back("experimentalSolidity", Json::Value(_node.experimentalSolidity())); + if (_node.annotation().exportedSymbols.set()) { Json::Value exportedSymbols = Json::objectValue; diff --git a/libsolidity/ast/ASTJsonImporter.cpp b/libsolidity/ast/ASTJsonImporter.cpp index 251219ea0a23..dd7098aabf9a 100644 --- a/libsolidity/ast/ASTJsonImporter.cpp +++ b/libsolidity/ast/ASTJsonImporter.cpp @@ -271,11 +271,15 @@ ASTPointer ASTJsonImporter::createSourceUnit(Json::Value const& _nod if (_node.isMember("license") && !_node["license"].isNull()) license = _node["license"].asString(); + bool experimentalSolidity = false; + if (_node.isMember("experimentalSolidity") && !_node["experimentalSolidity"].isNull()) + experimentalSolidity = _node["experimentalSolidity"].asBool(); + vector> nodes; for (auto& child: member(_node, "nodes")) nodes.emplace_back(convertJsonToASTNode(child)); - ASTPointer tmp = createASTNode(_node, license, nodes); + ASTPointer tmp = createASTNode(_node, license, nodes, experimentalSolidity); tmp->annotation().path = _srcName; return tmp; } diff --git a/libsolidity/ast/ExperimentalFeatures.h b/libsolidity/ast/ExperimentalFeatures.h index 772bc4e083a8..ae2cb14c54c4 100644 --- a/libsolidity/ast/ExperimentalFeatures.h +++ b/libsolidity/ast/ExperimentalFeatures.h @@ -32,7 +32,8 @@ enum class ExperimentalFeature ABIEncoderV2, // new ABI encoder that makes use of Yul SMTChecker, Test, - TestOnlyAnalysis + TestOnlyAnalysis, + Solidity }; static std::set const ExperimentalFeatureWithoutWarning = @@ -48,6 +49,7 @@ static std::map const ExperimentalFeatureNames { "SMTChecker", ExperimentalFeature::SMTChecker }, { "__test", ExperimentalFeature::Test }, { "__testOnlyAnalysis", ExperimentalFeature::TestOnlyAnalysis }, + { "solidity", ExperimentalFeature::Solidity } }; } diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index b18834a971f1..dae509ed5a08 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -429,7 +429,9 @@ bool CompilerStack::analyze() { if (m_stackState != ParsedAndImported || m_stackState >= AnalysisPerformed) solThrow(CompilerError, "Must call analyze only after parsing was performed."); - resolveImports(); + + if (!resolveImports()) + return false; for (Source const* source: m_sourceOrder) if (source->ast) @@ -1175,7 +1177,7 @@ string CompilerStack::applyRemapping(string const& _path, string const& _context return m_importRemapper.apply(_path, _context); } -void CompilerStack::resolveImports() +bool CompilerStack::resolveImports() { solAssert(m_stackState == ParsedAndImported, ""); @@ -1200,11 +1202,34 @@ void CompilerStack::resolveImports() sourceOrder.push_back(_source); }; + vector experimentalPragmaDirectives; for (auto const& sourcePair: m_sources) + { if (isRequestedSource(sourcePair.first)) toposort(&sourcePair.second); + if (sourcePair.second.ast && sourcePair.second.ast->experimentalSolidity()) + for (ASTPointer const& node: sourcePair.second.ast->nodes()) + if (PragmaDirective const* pragma = dynamic_cast(node.get())) + if (pragma->literals().size() >=2 && pragma->literals()[0] == "experimental" && pragma->literals()[1] == "solidity") + { + experimentalPragmaDirectives.push_back(pragma); + break; + } + } + + if (!experimentalPragmaDirectives.empty() && experimentalPragmaDirectives.size() != m_sources.size()) + { + for (auto &&pragma: experimentalPragmaDirectives) + m_errorReporter.parserError( + 2141_error, + pragma->location(), + "File declares \"pragma experimental solidity\". If you want to enable the experimental mode, all source units must include the pragma." + ); + return false; + } swap(m_sourceOrder, sourceOrder); + return true; } void CompilerStack::storeContractDefinitions() diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index ae11e233bd18..a01eaaa0ff1b 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -399,7 +399,7 @@ class CompilerStack: public langutil::CharStreamProvider /// @returns the newly loaded sources. StringMap loadMissingSources(SourceUnit const& _ast); std::string applyRemapping(std::string const& _path, std::string const& _context); - void resolveImports(); + bool resolveImports(); /// Store the contract definitions in m_contracts. void storeContractDefinitions(); diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index a73a4fbefad5..39b2df131a9e 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -94,14 +94,18 @@ ASTPointer Parser::parse(CharStream& _charStream) m_recursionDepth = 0; m_scanner = make_shared(_charStream); ASTNodeFactory nodeFactory(*this); + m_experimentalSolidityEnabledInCurrentSourceUnit = false; vector> nodes; + while (m_scanner->currentToken() == Token::Pragma) + nodes.push_back(parsePragmaDirective(false)); + while (m_scanner->currentToken() != Token::EOS) { switch (m_scanner->currentToken()) { case Token::Pragma: - nodes.push_back(parsePragmaDirective()); + nodes.push_back(parsePragmaDirective(true)); break; case Token::Import: nodes.push_back(parseImportDirective()); @@ -150,7 +154,7 @@ ASTPointer Parser::parse(CharStream& _charStream) } } solAssert(m_recursionDepth == 0, ""); - return nodeFactory.createNode(findLicenseString(nodes), nodes); + return nodeFactory.createNode(findLicenseString(nodes), nodes, m_experimentalSolidityEnabledInCurrentSourceUnit); } catch (FatalError const&) { @@ -203,7 +207,7 @@ ASTPointer Parser::parseStructuredDocumentation() return nullptr; } -ASTPointer Parser::parsePragmaDirective() +ASTPointer Parser::parsePragmaDirective(bool const _finishedParsingTopLevelPragmas) { RecursionGuard recursionGuard(*this); // pragma anything* ; @@ -213,6 +217,7 @@ ASTPointer Parser::parsePragmaDirective() expectToken(Token::Pragma); vector literals; vector tokens; + do { Token token = m_scanner->currentToken(); @@ -241,6 +246,13 @@ ASTPointer Parser::parsePragmaDirective() ); } + if (literals.size() >= 2 && literals[0] == "experimental" && literals[1] == "solidity") + { + if (_finishedParsingTopLevelPragmas) + fatalParserError(8185_error, "Experimental pragma \"solidity\" can only be set at the beginning of the source unit."); + m_experimentalSolidityEnabledInCurrentSourceUnit = true; + } + return nodeFactory.createNode(tokens, literals); } diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h index c7d6146be3c8..c83b307b8557 100644 --- a/libsolidity/parsing/Parser.h +++ b/libsolidity/parsing/Parser.h @@ -89,7 +89,7 @@ class Parser: public langutil::ParserBase ///@name Parsing functions for the AST nodes void parsePragmaVersion(langutil::SourceLocation const& _location, std::vector const& _tokens, std::vector const& _literals); ASTPointer parseStructuredDocumentation(); - ASTPointer parsePragmaDirective(); + ASTPointer parsePragmaDirective(bool _finishedParsingTopLevelPragmas); ASTPointer parseImportDirective(); /// @returns an std::pair, where /// result.second is set to true, if an abstract contract was parsed, false otherwise. @@ -227,6 +227,8 @@ class Parser: public langutil::ParserBase langutil::EVMVersion m_evmVersion; /// Counter for the next AST node ID int64_t m_currentNodeID = 0; + /// Flag that indicates whether experimental mode is enabled in the current source unit + bool m_experimentalSolidityEnabledInCurrentSourceUnit = false; }; } diff --git a/scripts/test_antlr_grammar.sh b/scripts/test_antlr_grammar.sh index 3394534f8d24..6ab28fc5f4b1 100755 --- a/scripts/test_antlr_grammar.sh +++ b/scripts/test_antlr_grammar.sh @@ -110,7 +110,7 @@ do SOL_FILES+=("$line") done < <( grep --include "*.sol" -riL -E \ - "^\/\/ (Syntax|Type|Declaration)Error|^\/\/ ParserError (1684|2837|3716|3997|5333|6275|6281|6933|7319)|^==== Source:" \ + "^\/\/ (Syntax|Type|Declaration)Error|^\/\/ ParserError (1684|2837|3716|3997|5333|6275|6281|6933|7319|8185)|^==== Source:" \ "${ROOT_DIR}/test/libsolidity/syntaxTests" \ "${ROOT_DIR}/test/libsolidity/semanticTests" | # Skipping the unicode tests as I couldn't adapt the lexical grammar to recursively counting RLO/LRO/PDF's. diff --git a/test/libsolidity/ASTJSON/pragma_experimental_solidity.json b/test/libsolidity/ASTJSON/pragma_experimental_solidity.json new file mode 100644 index 000000000000..d2f7e56adef5 --- /dev/null +++ b/test/libsolidity/ASTJSON/pragma_experimental_solidity.json @@ -0,0 +1,21 @@ +{ + "absolutePath": "a", + "experimentalSolidity": true, + "exportedSymbols": {}, + "id": 2, + "nodeType": "SourceUnit", + "nodes": + [ + { + "id": 1, + "literals": + [ + "experimental", + "solidity" + ], + "nodeType": "PragmaDirective", + "src": "0:29:1" + } + ], + "src": "0:30:1" +} diff --git a/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol b/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol new file mode 100644 index 000000000000..e0c1c81aaa09 --- /dev/null +++ b/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol @@ -0,0 +1,3 @@ +pragma experimental solidity; + +// ---- diff --git a/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json b/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json new file mode 100644 index 000000000000..a1a3410ffefb --- /dev/null +++ b/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json @@ -0,0 +1,20 @@ +{ + "absolutePath": "a", + "experimentalSolidity": true, + "id": 2, + "nodeType": "SourceUnit", + "nodes": + [ + { + "id": 1, + "literals": + [ + "experimental", + "solidity" + ], + "nodeType": "PragmaDirective", + "src": "0:29:1" + } + ], + "src": "0:30:1" +} diff --git a/test/libsolidity/SolidityTypes.cpp b/test/libsolidity/SolidityTypes.cpp index 48a0441b44de..db43f49c038b 100644 --- a/test/libsolidity/SolidityTypes.cpp +++ b/test/libsolidity/SolidityTypes.cpp @@ -213,7 +213,7 @@ BOOST_AUTO_TEST_CASE(type_identifiers) ModifierDefinition mod(++id, SourceLocation{}, make_shared("modif"), SourceLocation{}, {}, emptyParams, {}, {}, {}); BOOST_CHECK_EQUAL(ModifierType(mod).identifier(), "t_modifier$__$"); - SourceUnit su(++id, {}, {}, {}); + SourceUnit su(++id, {}, {}, {}, {}); BOOST_CHECK_EQUAL(ModuleType(su).identifier(), "t_module_7"); BOOST_CHECK_EQUAL(MagicType(MagicType::Kind::Block).identifier(), "t_magic_block"); BOOST_CHECK_EQUAL(MagicType(MagicType::Kind::Message).identifier(), "t_magic_message"); diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol new file mode 100644 index 000000000000..9bb74a7ecd56 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol @@ -0,0 +1,3 @@ +pragma experimental solidity; +// ---- +// Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol new file mode 100644 index 000000000000..747b8e166d93 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol @@ -0,0 +1,24 @@ +==== Source: A.sol ==== +contract A {} +==== Source: B.sol ==== +pragma experimental solidity; +import "A.sol"; +contract B { + A a; +} +==== Source: C.sol ==== +pragma experimental solidity; +import "A.sol"; +contract C { + A a; +} +==== Source: D.sol ==== +pragma experimental solidity; +import "A.sol"; +contract D { + A a; +} +// ---- +// ParserError 2141: (B.sol:0-29): File declares "pragma experimental solidity". If you want to enable the experimental mode, all source units must include the pragma. +// ParserError 2141: (C.sol:0-29): File declares "pragma experimental solidity". If you want to enable the experimental mode, all source units must include the pragma. +// ParserError 2141: (D.sol:0-29): File declares "pragma experimental solidity". If you want to enable the experimental mode, all source units must include the pragma. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol new file mode 100644 index 000000000000..5fde260f6431 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol @@ -0,0 +1,5 @@ +contract A {} + +pragma experimental solidity; +// ---- +// ParserError 8185: (45-45): Experimental pragma "solidity" can only be set at the beginning of the source unit. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol new file mode 100644 index 000000000000..3748a5c76d33 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol @@ -0,0 +1,13 @@ +function f() pure returns (uint) +{ + return 1; +} + +pragma experimental solidity; + +struct A +{ + uint256 x; +} +// ---- +// ParserError 8185: (83-89): Experimental pragma "solidity" can only be set at the beginning of the source unit. From 56403536039df74012e265a30593e577cc6b6413 Mon Sep 17 00:00:00 2001 From: r0qs Date: Mon, 15 May 2023 19:37:53 +0200 Subject: [PATCH 011/138] Add sudo to base images --- scripts/docker/buildpack-deps/Dockerfile.emscripten | 4 ++-- scripts/docker/buildpack-deps/Dockerfile.ubuntu.clang.ossfuzz | 4 ++-- scripts/docker/buildpack-deps/Dockerfile.ubuntu2004 | 4 ++-- scripts/docker/buildpack-deps/Dockerfile.ubuntu2204 | 4 ++-- scripts/docker/buildpack-deps/Dockerfile.ubuntu2204.clang | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/docker/buildpack-deps/Dockerfile.emscripten b/scripts/docker/buildpack-deps/Dockerfile.emscripten index c170aa3da6f3..c29fc699ac01 100644 --- a/scripts/docker/buildpack-deps/Dockerfile.emscripten +++ b/scripts/docker/buildpack-deps/Dockerfile.emscripten @@ -33,13 +33,13 @@ # Using $(em-config CACHE)/sysroot/usr seems to work, though, and still has cmake find the # dependencies automatically. FROM emscripten/emsdk:3.1.19 AS base -LABEL version="15" +LABEL version="16" ADD emscripten.jam /usr/src RUN set -ex && \ \ apt-get update && \ - apt-get install lz4 --no-install-recommends && \ + apt-get install lz4 sudo --no-install-recommends && \ \ cd /usr/src && \ git clone https://github.com/Z3Prover/z3.git -b z3-4.12.1 --depth 1 && \ diff --git a/scripts/docker/buildpack-deps/Dockerfile.ubuntu.clang.ossfuzz b/scripts/docker/buildpack-deps/Dockerfile.ubuntu.clang.ossfuzz index 705eacce48be..d5e6599ea71e 100644 --- a/scripts/docker/buildpack-deps/Dockerfile.ubuntu.clang.ossfuzz +++ b/scripts/docker/buildpack-deps/Dockerfile.ubuntu.clang.ossfuzz @@ -22,13 +22,13 @@ # (c) 2016-2021 solidity contributors. #------------------------------------------------------------------------------ FROM gcr.io/oss-fuzz-base/base-clang:latest as base -LABEL version="1" +LABEL version="2" ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update; \ apt-get -qqy install --no-install-recommends \ - build-essential \ + build-essential sudo \ software-properties-common \ ninja-build git wget \ libbz2-dev zlib1g-dev git curl uuid-dev \ diff --git a/scripts/docker/buildpack-deps/Dockerfile.ubuntu2004 b/scripts/docker/buildpack-deps/Dockerfile.ubuntu2004 index 193475f733f4..dbd1990023e7 100644 --- a/scripts/docker/buildpack-deps/Dockerfile.ubuntu2004 +++ b/scripts/docker/buildpack-deps/Dockerfile.ubuntu2004 @@ -22,7 +22,7 @@ # (c) 2016-2019 solidity contributors. #------------------------------------------------------------------------------ FROM buildpack-deps:focal AS base -LABEL version="19" +LABEL version="20" ARG DEBIAN_FRONTEND=noninteractive @@ -32,7 +32,7 @@ RUN set -ex; \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1c52189c923f6ca9 ; \ apt-get update; \ apt-get install -qqy --no-install-recommends \ - build-essential \ + build-essential sudo \ software-properties-common \ cmake ninja-build \ libboost-filesystem-dev libboost-test-dev libboost-system-dev \ diff --git a/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204 b/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204 index 5b94d71124f4..d5cfae924994 100644 --- a/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204 +++ b/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204 @@ -22,7 +22,7 @@ # (c) 2016-2019 solidity contributors. #------------------------------------------------------------------------------ FROM buildpack-deps:jammy AS base -LABEL version="4" +LABEL version="5" ARG DEBIAN_FRONTEND=noninteractive @@ -32,7 +32,7 @@ RUN set -ex; \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1c52189c923f6ca9 ; \ apt-get update; \ apt-get install -qqy --no-install-recommends \ - build-essential \ + build-essential sudo \ software-properties-common \ cmake ninja-build \ libboost-filesystem-dev libboost-test-dev libboost-system-dev \ diff --git a/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204.clang b/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204.clang index 64328ce79e83..3e23cd055f19 100644 --- a/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204.clang +++ b/scripts/docker/buildpack-deps/Dockerfile.ubuntu2204.clang @@ -22,7 +22,7 @@ # (c) 2016-2019 solidity contributors. #------------------------------------------------------------------------------ FROM buildpack-deps:jammy AS base -LABEL version="3" +LABEL version="4" ARG DEBIAN_FRONTEND=noninteractive @@ -32,7 +32,7 @@ RUN set -ex; \ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1c52189c923f6ca9 ; \ apt-get update; \ apt-get install -qqy --no-install-recommends \ - build-essential \ + build-essential sudo \ software-properties-common \ cmake ninja-build \ libboost-filesystem-dev libboost-test-dev libboost-system-dev \ From af74ab69c9041a52db1b299b955cbabff59115b6 Mon Sep 17 00:00:00 2001 From: r0qs Date: Tue, 16 May 2023 16:13:51 +0200 Subject: [PATCH 012/138] Workaround gp2 and prb-math external tests --- test/externalTests/gp2.sh | 8 ++++++++ test/externalTests/prb-math.sh | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/test/externalTests/gp2.sh b/test/externalTests/gp2.sh index 4dae6f0c3bcc..25403a879caa 100755 --- a/test/externalTests/gp2.sh +++ b/test/externalTests/gp2.sh @@ -69,6 +69,14 @@ function gp2_test force_hardhat_unlimited_contract_size "$config_file" "$config_var" yarn + # Workaround for error caused by the last release of hardhat-waffle@2.0.6 that bumps ethereum-waffle + # to version 4.0.10 and breaks gp2 build with the following error: + # + # Cannot find module 'ethereum-waffle/dist/cjs/src/deployContract' + # + # See: https://github.com/NomicFoundation/hardhat-waffle/commit/83ee9cb36ee59d0bedacbbd00043f030af104ad0 + yarn add '@nomiclabs/hardhat-waffle@2.0.5' + # Some dependencies come with pre-built artifacts. We want to build from scratch. rm -r node_modules/@gnosis.pm/safe-contracts/build/ diff --git a/test/externalTests/prb-math.sh b/test/externalTests/prb-math.sh index 99c7c2716cde..614c285f72f5 100755 --- a/test/externalTests/prb-math.sh +++ b/test/externalTests/prb-math.sh @@ -96,6 +96,14 @@ function prb_math_test yarn install --no-lock-file yarn add hardhat-gas-reporter + # Workaround for error caused by the last release of hardhat-waffle@2.0.6 that bumps ethereum-waffle + # to version 4.0.10 and breaks prb-math build with the following error: + # + # Cannot find module 'ethereum-waffle/dist/cjs/src/deployContract' + # + # See: https://github.com/NomicFoundation/hardhat-waffle/commit/83ee9cb36ee59d0bedacbbd00043f030af104ad0 + yarn add '@nomiclabs/hardhat-waffle@2.0.5' + replace_version_pragmas for preset in $SELECTED_PRESETS; do From d49ed7d66b1021b71850a051fa9d7d9e0bf64409 Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 17 May 2023 11:41:15 +0200 Subject: [PATCH 013/138] Drop ColonyNetwork external test run on nightly builds --- .circleci/config.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8c81fd561e8b..c6592c7bafd4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -684,15 +684,6 @@ defaults: binary_type: native image: cimg/node:18.11 - - job_ems_test_ext_colony: &job_ems_test_ext_colony - <<: *requires_b_ems - name: t_ems_test_ext_colony - project: colony - binary_type: solcjs - image: cimg/node:14.20 - resource_class: medium - python2: true - - job_b_ubu_asan_clang: &job_b_ubu_asan_clang <<: *on_all_tags_and_branches name: b_ubu_asan_clang @@ -1783,7 +1774,3 @@ workflows: - b_ubu_san_clang: *job_b_ubu_ubsan_clang - t_ubu_ubsan_clang_soltest: *requires_b_ubu_ubsan_clang - t_ubu_ubsan_clang_cli: *requires_b_ubu_ubsan_clang - - # Emscripten build and tests that take more than 15 minutes to execute - - b_ems: *requires_nothing - - t_ext: *job_ems_test_ext_colony From ff2e4736fa5dc5f6618a89ebc5857c28525031db Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 17 May 2023 14:52:47 +0200 Subject: [PATCH 014/138] Add Github authorization token to foundry installation --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index c6592c7bafd4..eaabc230aaeb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -131,6 +131,7 @@ commands: --silent \ --fail \ --show-error \ + --header "Authorization: Bearer ${GITHUB_ACCESS_TOKEN}" \ "https://api.github.com/repos/${FOUNDRY_REPO}/git/refs/tags/${FOUNDRY_VERSION}" \ | jq --raw-output .object.sha \ ) From 7460c997b73c351411aa553e30af580133c2b300 Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 17 May 2023 16:37:47 +0200 Subject: [PATCH 015/138] Add comment to colony test --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index eaabc230aaeb..c10310c8fc88 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -571,6 +571,8 @@ defaults: # Parameterized Job Templates # Separate compile-only runs of those external tests where a full run takes much longer. + # Also see https://github.com/ethereum/solidity/pull/14234 for why we excluded those + # external tests from the nightly jobs. - job_ems_compile_ext_colony: &job_ems_compile_ext_colony <<: *requires_b_ems name: t_ems_compile_ext_colony From 7a34d34045ffd972c25a27a07b322135d97cc7b5 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 17 May 2023 16:21:37 +0200 Subject: [PATCH 016/138] Restrict experimental solidity to constantinople and above --- libsolidity/parsing/Parser.cpp | 2 ++ scripts/test_antlr_grammar.sh | 2 +- .../libsolidity/ASTJSON/pragma_experimental_solidity.json | 2 +- test/libsolidity/ASTJSON/pragma_experimental_solidity.sol | 3 ++- .../ASTJSON/pragma_experimental_solidity_parseOnly.json | 2 +- .../syntaxTests/pragma/experimental_solidity.sol | 2 ++ .../experimental_solidity_multisource_not_all_enable.sol | 2 ++ .../pragma/experimental_solidity_out_of_order_1.sol | 2 ++ .../pragma/experimental_solidity_out_of_order_2.sol | 2 ++ .../pragma/experimental_solidity_wrong_evm_version.sol | 8 ++++++++ 10 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test/libsolidity/syntaxTests/pragma/experimental_solidity_wrong_evm_version.sol diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 39b2df131a9e..34fc9644e8d8 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -248,6 +248,8 @@ ASTPointer Parser::parsePragmaDirective(bool const _finishedPar if (literals.size() >= 2 && literals[0] == "experimental" && literals[1] == "solidity") { + if (m_evmVersion < EVMVersion::constantinople()) + fatalParserError(7637_error, "Experimental solidity requires Constantinople EVM version at the minimum."); if (_finishedParsingTopLevelPragmas) fatalParserError(8185_error, "Experimental pragma \"solidity\" can only be set at the beginning of the source unit."); m_experimentalSolidityEnabledInCurrentSourceUnit = true; diff --git a/scripts/test_antlr_grammar.sh b/scripts/test_antlr_grammar.sh index 6ab28fc5f4b1..e84f9b064a1c 100755 --- a/scripts/test_antlr_grammar.sh +++ b/scripts/test_antlr_grammar.sh @@ -110,7 +110,7 @@ do SOL_FILES+=("$line") done < <( grep --include "*.sol" -riL -E \ - "^\/\/ (Syntax|Type|Declaration)Error|^\/\/ ParserError (1684|2837|3716|3997|5333|6275|6281|6933|7319|8185)|^==== Source:" \ + "^\/\/ (Syntax|Type|Declaration)Error|^\/\/ ParserError (1684|2837|3716|3997|5333|6275|6281|6933|7319|8185|7637)|^==== Source:" \ "${ROOT_DIR}/test/libsolidity/syntaxTests" \ "${ROOT_DIR}/test/libsolidity/semanticTests" | # Skipping the unicode tests as I couldn't adapt the lexical grammar to recursively counting RLO/LRO/PDF's. diff --git a/test/libsolidity/ASTJSON/pragma_experimental_solidity.json b/test/libsolidity/ASTJSON/pragma_experimental_solidity.json index d2f7e56adef5..66ece94e08c8 100644 --- a/test/libsolidity/ASTJSON/pragma_experimental_solidity.json +++ b/test/libsolidity/ASTJSON/pragma_experimental_solidity.json @@ -17,5 +17,5 @@ "src": "0:29:1" } ], - "src": "0:30:1" + "src": "0:70:1" } diff --git a/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol b/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol index e0c1c81aaa09..b902bb061dbe 100644 --- a/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol +++ b/test/libsolidity/ASTJSON/pragma_experimental_solidity.sol @@ -1,3 +1,4 @@ pragma experimental solidity; - +// ==== +// EVMVersion: >=constantinople // ---- diff --git a/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json b/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json index a1a3410ffefb..b1ac937a2427 100644 --- a/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json +++ b/test/libsolidity/ASTJSON/pragma_experimental_solidity_parseOnly.json @@ -16,5 +16,5 @@ "src": "0:29:1" } ], - "src": "0:30:1" + "src": "0:70:1" } diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol index 9bb74a7ecd56..b6f871d87ffa 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity.sol @@ -1,3 +1,5 @@ pragma experimental solidity; +// ==== +// EVMVersion: >=constantinople // ---- // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol index 747b8e166d93..fe4125e84303 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_multisource_not_all_enable.sol @@ -18,6 +18,8 @@ import "A.sol"; contract D { A a; } +// ==== +// EVMVersion: >=constantinople // ---- // ParserError 2141: (B.sol:0-29): File declares "pragma experimental solidity". If you want to enable the experimental mode, all source units must include the pragma. // ParserError 2141: (C.sol:0-29): File declares "pragma experimental solidity". If you want to enable the experimental mode, all source units must include the pragma. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol index 5fde260f6431..d6741b0d3a99 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_1.sol @@ -1,5 +1,7 @@ contract A {} pragma experimental solidity; +// ==== +// EVMVersion: >=constantinople // ---- // ParserError 8185: (45-45): Experimental pragma "solidity" can only be set at the beginning of the source unit. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol index 3748a5c76d33..940bd3fbb369 100644 --- a/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_out_of_order_2.sol @@ -9,5 +9,7 @@ struct A { uint256 x; } +// ==== +// EVMVersion: >=constantinople // ---- // ParserError 8185: (83-89): Experimental pragma "solidity" can only be set at the beginning of the source unit. diff --git a/test/libsolidity/syntaxTests/pragma/experimental_solidity_wrong_evm_version.sol b/test/libsolidity/syntaxTests/pragma/experimental_solidity_wrong_evm_version.sol new file mode 100644 index 000000000000..3e070535b03d --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/experimental_solidity_wrong_evm_version.sol @@ -0,0 +1,8 @@ +pragma experimental solidity; + +contract C {} + +// ==== +// EVMVersion: Date: Wed, 17 May 2023 18:07:58 +0200 Subject: [PATCH 017/138] Make ASTJSONTest an EVMVersionRestrictedTestCase --- test/libsolidity/ASTJSONTest.cpp | 3 ++- test/libsolidity/ASTJSONTest.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/test/libsolidity/ASTJSONTest.cpp b/test/libsolidity/ASTJSONTest.cpp index 3602e1485913..6f264fc131ef 100644 --- a/test/libsolidity/ASTJSONTest.cpp +++ b/test/libsolidity/ASTJSONTest.cpp @@ -181,7 +181,8 @@ void ASTJSONTest::validateTestConfiguration() const } } -ASTJSONTest::ASTJSONTest(string const& _filename) +ASTJSONTest::ASTJSONTest(string const& _filename): + EVMVersionRestrictedTestCase(_filename) { if (!boost::algorithm::ends_with(_filename, ".sol")) BOOST_THROW_EXCEPTION(runtime_error("Invalid test contract file name: \"" + _filename + "\".")); diff --git a/test/libsolidity/ASTJSONTest.h b/test/libsolidity/ASTJSONTest.h index 648f3bbc3234..1e74b62fec8e 100644 --- a/test/libsolidity/ASTJSONTest.h +++ b/test/libsolidity/ASTJSONTest.h @@ -35,7 +35,7 @@ class CompilerStack; namespace solidity::frontend::test { -class ASTJSONTest: public TestCase +class ASTJSONTest: public EVMVersionRestrictedTestCase { public: struct TestVariant From 9f1f2a2a06f71817396d8e91f293a918bb01cbde Mon Sep 17 00:00:00 2001 From: r0qs Date: Mon, 15 May 2023 21:12:22 +0200 Subject: [PATCH 018/138] Bump docker images --- .circleci/config.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c6592c7bafd4..d70bd6b24495 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,24 +9,24 @@ version: 2.1 parameters: ubuntu-2004-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu2004-19 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:9c7d3be930936a70f0340d5e9fa9a0b8bf69e11192e7e2d37807afe1b7f55534" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu2004-20 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:7a1e1b01eda0d1e20704279672bcfd53dbbc481898ff960958a225dea76345bd" ubuntu-2204-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204-4 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:7555c26c82fd0dcbc02cbd422b74468f8de1b7f2972b84fadcfa90f7371d6de5" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204-5 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:4df420b7ccd96f540a4300a4fae0fcac2f4d3f23ffff9e3777c1f2d7c37ef901" ubuntu-2204-clang-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204.clang-3 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:3d5efffd1e4c381041d1dff6331add86976373bde1c9dfca97ebd3d735e09dab" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204.clang-4 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:538596bf55961197f8b5670d8a6742d9bcd502b6a1045ae9d372cdf35ce69d93" ubuntu-clang-ossfuzz-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu.clang.ossfuzz-1 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:d1bba750ab3f9ad9d28d45e332c2ec2126d248c1d619af369a3ef0c29f5936c3" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu.clang.ossfuzz-2 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:a4fc3a41240c3bc58882d3f504e446c6931b547119012f5c45f79b0df91dbdd1" emscripten-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:emscripten-15 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:e2729bd6c0734bb49d04e2688fec3dcf880394f351f69358dd2bd92c0f6fd309" + # solbuildpackpusher/solidity-buildpack-deps:emscripten-16 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:19fcb5ac029bbc27ec36e10f7d14ea224d8010145f9690562ef084fd16146b0c" evm-version: type: string default: london From 45bd6827d272133ef6b936a64c9dec0d92c206c5 Mon Sep 17 00:00:00 2001 From: r0qs Date: Thu, 18 May 2023 18:27:17 +0200 Subject: [PATCH 019/138] Use sed instead of envsubst --- scripts/ci/notification/matrix_notification.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/ci/notification/matrix_notification.sh b/scripts/ci/notification/matrix_notification.sh index cbe290af46c3..f7bd1949b471 100755 --- a/scripts/ci/notification/matrix_notification.sh +++ b/scripts/ci/notification/matrix_notification.sh @@ -1,7 +1,6 @@ #!/bin/bash set -euo pipefail -shopt -s inherit_errexit SCRIPT_DIR="$(dirname "$0")" @@ -28,6 +27,7 @@ function notify() { curl "https://${MATRIX_SERVER}/_matrix/client/v3/rooms/${MATRIX_NOTIFY_ROOM_ID}/send/m.room.message" \ --request POST \ --include \ + --fail \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --header "Authorization: Bearer ${MATRIX_ACCESS_TOKEN}" \ @@ -63,10 +63,14 @@ function format_predefined_message() { [[ -z "$template" ]] && fail "Message template for event [$event] not defined." - # Export variables that must be substituted - export WORKFLOW_NAME JOB BRANCH TAG BUILD_URL BUILD_NUM - envsubst < "$template" - unset WORKFLOW_NAME JOB BRANCH TAG BUILD_URL BUILD_NUM + # shellcheck disable=SC2016 + sed -e 's|${WORKFLOW_NAME}|'"${WORKFLOW_NAME}"'|' \ + -e 's|${JOB}|'"${JOB}"'|' \ + -e 's|${BRANCH}|'"${BRANCH}"'|' \ + -e 's|${TAG}|'"${TAG}"'|' \ + -e 's|${BUILD_URL}|'"${BUILD_URL}"'|' \ + -e 's|${BUILD_NUM}|'"${BUILD_NUM}"'|' \ + "$template" } # Set message environment variables based on CI backend From ab70c9cccb67d68efd532fd4903c06245cbfc48e Mon Sep 17 00:00:00 2001 From: r0qs Date: Thu, 18 May 2023 19:41:02 +0200 Subject: [PATCH 020/138] Update build_emscripten.sh --- .circleci/config.yml | 1 + scripts/build_emscripten.sh | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d70bd6b24495..0a86fe0d39e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,6 +25,7 @@ parameters: default: "solbuildpackpusher/solidity-buildpack-deps@sha256:a4fc3a41240c3bc58882d3f504e446c6931b547119012f5c45f79b0df91dbdd1" emscripten-docker-image: type: string + # NOTE: Please remember to update the `build_emscripten.sh` whenever the hash of this image changes. # solbuildpackpusher/solidity-buildpack-deps:emscripten-16 default: "solbuildpackpusher/solidity-buildpack-deps@sha256:19fcb5ac029bbc27ec36e10f7d14ea224d8010145f9690562ef084fd16146b0c" evm-version: diff --git a/scripts/build_emscripten.sh b/scripts/build_emscripten.sh index 4e605715768c..1b780a4276b6 100755 --- a/scripts/build_emscripten.sh +++ b/scripts/build_emscripten.sh @@ -33,9 +33,9 @@ if (( $# != 0 )); then params="$(printf "%q " "${@}")" fi -# solbuildpackpusher/solidity-buildpack-deps:emscripten-15 +# solbuildpackpusher/solidity-buildpack-deps:emscripten-16 # NOTE: Without `safe.directory` git would assume it's not safe to operate on /root/project since it's owned by a different user. # See https://github.blog/2022-04-12-git-security-vulnerability-announced/ docker run -v "$(pwd):/root/project" -w /root/project \ - solbuildpackpusher/solidity-buildpack-deps@sha256:f86cb1fb4631b1fbb927149f60caea7b095be5b85d379456eee09cb105e7f225 \ + solbuildpackpusher/solidity-buildpack-deps@sha256:19fcb5ac029bbc27ec36e10f7d14ea224d8010145f9690562ef084fd16146b0c \ /bin/bash -c "git config --global --add safe.directory /root/project && ./scripts/ci/build_emscripten.sh ${params}" From a2a00850ca6242087666bbd1fa23b794661e9edb Mon Sep 17 00:00:00 2001 From: johnnygee19 <132227312+johnnygee19@users.noreply.github.com> Date: Mon, 22 May 2023 07:31:21 -0400 Subject: [PATCH 021/138] Fix small typo on "Units and Globally Available Variables" page (#14252) * Fix typo * Update docs/units-and-global-variables.rst --------- Co-authored-by: Nuno Santos --- docs/units-and-global-variables.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/units-and-global-variables.rst b/docs/units-and-global-variables.rst index 90decfad5386..e890f904212c 100644 --- a/docs/units-and-global-variables.rst +++ b/docs/units-and-global-variables.rst @@ -235,7 +235,7 @@ Mathematical and Cryptographic Functions the ecrecover function remained unchanged. This is usually not a problem unless you require signatures to be unique or use them to identify items. - OpenZeppelin have a `ECDSA helper library `_ that you can use as a wrapper for ``ecrecover`` without this issue. + OpenZeppelin has an `ECDSA helper library `_ that you can use as a wrapper for ``ecrecover`` without this issue. .. note:: From 02a07fdf469c1829fa8f2811ff84edae9eb0bf26 Mon Sep 17 00:00:00 2001 From: Nuno Santos Date: Mon, 22 May 2023 12:54:43 +0100 Subject: [PATCH 022/138] Changed references to money --- docs/common-patterns.rst | 2 +- docs/control-structures.rst | 2 +- docs/examples/blind-auction.rst | 18 +++++++++--------- docs/examples/safe-remote.rst | 6 +++--- docs/introduction-to-smart-contracts.rst | 2 +- docs/security-considerations.rst | 2 +- docs/types/value-types.rst | 2 +- docs/units-and-global-variables.rst | 4 ++-- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/common-patterns.rst b/docs/common-patterns.rst index a76f61c18a3d..cbc219b53b5a 100644 --- a/docs/common-patterns.rst +++ b/docs/common-patterns.rst @@ -18,7 +18,7 @@ introduces a potential security risk. You may read more about this on the :ref:`security_considerations` page. The following is an example of the withdrawal pattern in practice in -a contract where the goal is to send the most money to the +a contract where the goal is to send the most of some compensation, e.g. Ether, to the contract in order to become the "richest", inspired by `King of the Ether `_. diff --git a/docs/control-structures.rst b/docs/control-structures.rst index 88fb53a56ab7..f7a33db7ef24 100644 --- a/docs/control-structures.rst +++ b/docs/control-structures.rst @@ -685,7 +685,7 @@ and ``assert`` for internal error checking. addr.transfer(msg.value / 2); // Since transfer throws an exception on failure and // cannot call back here, there should be no way for us to - // still have half of the money. + // still have half of the Ether. assert(address(this).balance == balanceBeforeTransfer - msg.value / 2); return address(this).balance; } diff --git a/docs/examples/blind-auction.rst b/docs/examples/blind-auction.rst index 3c7b3dcc6900..47e19033f9ae 100644 --- a/docs/examples/blind-auction.rst +++ b/docs/examples/blind-auction.rst @@ -16,11 +16,11 @@ Simple Open Auction =================== The general idea of the following simple auction contract is that everyone can -send their bids during a bidding period. The bids already include sending money -/ Ether in order to bind the bidders to their bid. If the highest bid is -raised, the previous highest bidder gets their money back. After the end of +send their bids during a bidding period. The bids already include sending some compensation, +e.g. Ether, in order to bind the bidders to their bid. If the highest bid is +raised, the previous highest bidder gets their Ether back. After the end of the bidding period, the contract has to be called manually for the beneficiary -to receive their money - contracts cannot activate themselves. +to receive their Ether - contracts cannot activate themselves. .. code-block:: solidity @@ -92,19 +92,19 @@ to receive their money - contracts cannot activate themselves. revert AuctionAlreadyEnded(); // If the bid is not higher, send the - // money back (the revert statement + // Ether back (the revert statement // will revert all changes in this // function execution including - // it having received the money). + // it having received the Ether). if (msg.value <= highestBid) revert BidNotHighEnough(highestBid); if (highestBid != 0) { - // Sending back the money by simply using + // Sending back the Ether by simply using // highestBidder.send(highestBid) is a security risk // because it could execute an untrusted contract. // It is always safer to let the recipients - // withdraw their money themselves. + // withdraw their Ether themselves. pendingReturns[highestBidder] += highestBid; } highestBidder = msg.sender; @@ -182,7 +182,7 @@ the contract checks that the hash value is the same as the one provided during the bidding period. Another challenge is how to make the auction **binding and blind** at the same -time: The only way to prevent the bidder from just not sending the money after +time: The only way to prevent the bidder from just not sending the Ether after they won the auction is to make them send it together with the bid. Since value transfers cannot be blinded in Ethereum, anyone can see the value. diff --git a/docs/examples/safe-remote.rst b/docs/examples/safe-remote.rst index e42b017fb606..a2651af23882 100644 --- a/docs/examples/safe-remote.rst +++ b/docs/examples/safe-remote.rst @@ -6,18 +6,18 @@ Safe Remote Purchase Purchasing goods remotely currently requires multiple parties that need to trust each other. The simplest configuration involves a seller and a buyer. The buyer would like to receive -an item from the seller and the seller would like to get money (or an equivalent) +an item from the seller and the seller would like to get some compensation, e.g. Ether, in return. The problematic part is the shipment here: There is no way to determine for sure that the item arrived at the buyer. There are multiple ways to solve this problem, but all fall short in one or the other way. In the following example, both parties have to put twice the value of the item into the -contract as escrow. As soon as this happened, the money will stay locked inside +contract as escrow. As soon as this happened, the Ether will stay locked inside the contract until the buyer confirms that they received the item. After that, the buyer is returned the value (half of their deposit) and the seller gets three times the value (their deposit plus the value). The idea behind this is that both parties have an incentive to resolve the situation or otherwise -their money is locked forever. +their Ether is locked forever. This contract of course does not solve the problem, but gives an overview of how you can use state machine-like constructs inside a contract. diff --git a/docs/introduction-to-smart-contracts.rst b/docs/introduction-to-smart-contracts.rst index 2edf22d47502..5595a2fed888 100644 --- a/docs/introduction-to-smart-contracts.rst +++ b/docs/introduction-to-smart-contracts.rst @@ -282,7 +282,7 @@ the source account is also not modified. Furthermore, a transaction is always cryptographically signed by the sender (creator). This makes it straightforward to guard access to specific modifications of the database. In the example of the electronic currency, a simple check ensures that -only the person holding the keys to the account can transfer money from it. +only the person holding the keys to the account can transfer some compensation, e.g. Ether, from it. .. index:: ! block diff --git a/docs/security-considerations.rst b/docs/security-considerations.rst index 95c0edb99b8d..92d601043dd7 100644 --- a/docs/security-considerations.rst +++ b/docs/security-considerations.rst @@ -447,7 +447,7 @@ so help through off-chain computations might be needed there. If the self-check fails, the contract automatically switches into some kind of "failsafe" mode, which, for example, disables most of the features, hands over control to a fixed and trusted third party -or just converts the contract into a simple "give me back my money" contract. +or just converts the contract into a simple "give me back my Ether" contract. Ask for Peer Review =================== diff --git a/docs/types/value-types.rst b/docs/types/value-types.rst index 60a11d6c30d6..872f54b0edeb 100644 --- a/docs/types/value-types.rst +++ b/docs/types/value-types.rst @@ -263,7 +263,7 @@ reverts on failure. There are some dangers in using ``send``: The transfer fails if the call stack depth is at 1024 (this can always be forced by the caller) and it also fails if the recipient runs out of gas. So in order to make safe Ether transfers, always check the return value of ``send``, use ``transfer`` or even better: - use a pattern where the recipient withdraws the money. + use a pattern where the recipient withdraws the Ether. * ``call``, ``delegatecall`` and ``staticcall`` diff --git a/docs/units-and-global-variables.rst b/docs/units-and-global-variables.rst index e890f904212c..a9b29d6ba2ec 100644 --- a/docs/units-and-global-variables.rst +++ b/docs/units-and-global-variables.rst @@ -107,7 +107,7 @@ Block and Transaction Properties Both the timestamp and the block hash can be influenced by miners to some degree. Bad actors in the mining community can for example run a casino payout function on a chosen hash - and just retry a different hash if they did not receive any money. + and just retry a different hash if they did not receive any compensation, e.g. Ether. The current block timestamp must be strictly larger than the timestamp of the last block, but the only guarantee is that it will be somewhere between the timestamps of two @@ -282,7 +282,7 @@ For more information, see the section on :ref:`address`. There are some dangers in using ``send``: The transfer fails if the call stack depth is at 1024 (this can always be forced by the caller) and it also fails if the recipient runs out of gas. So in order to make safe Ether transfers, always check the return value of ``send``, use ``transfer`` or even better: - Use a pattern where the recipient withdraws the money. + Use a pattern where the recipient withdraws the Ether. .. warning:: Due to the fact that the EVM considers a call to a non-existing contract to always succeed, From 0ce5e4c94d4fc2d5373eb2251c191b32a3c1f7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 23 May 2023 15:10:01 +0200 Subject: [PATCH 023/138] test_via_ir_equivalence(): Use assertions for precondition checks --- test/cmdlineTests.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index c492f529092a..110199c09ac3 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -317,14 +317,9 @@ function test_via_ir_equivalence() pushd "$SOLTMPDIR" > /dev/null (( $# <= 2 )) || fail "This function accepts at most two arguments." - - if [[ $2 != --optimize ]] && [[ $2 != "" ]] - then - fail "The second argument must be --optimize if present." - fi - local solidity_file="$1" local optimize_flag="$2" + [[ $optimize_flag == --optimize || $optimize_flag == "" ]] || assertFail "The second argument must be --optimize if present." output_file_prefix=$(basename "$1" .sol) From 17aacfdb6aabda73b08146a475b8dcb07c453636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 23 May 2023 15:25:48 +0200 Subject: [PATCH 024/138] test_via_ir_equivalence(): Fix quoting and locals --- test/cmdlineTests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 110199c09ac3..69ae6e46b024 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -321,6 +321,7 @@ function test_via_ir_equivalence() local optimize_flag="$2" [[ $optimize_flag == --optimize || $optimize_flag == "" ]] || assertFail "The second argument must be --optimize if present." + local output_file_prefix output_file_prefix=$(basename "$1" .sol) local optimizer_flags=() @@ -329,7 +330,7 @@ function test_via_ir_equivalence() msg_on_error --no-stderr "$SOLC" --ir-optimized --debug-info location "${optimizer_flags[@]}" "$solidity_file" | sed '/^Optimized IR:$/d' | - split_on_empty_lines_into_numbered_files $output_file_prefix ".yul" + split_on_empty_lines_into_numbered_files "$output_file_prefix" ".yul" for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do msg_on_error --no-stderr "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | From bcdb41f743256a9bd8630829cc2f56bf733c3446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 23 May 2023 15:28:18 +0200 Subject: [PATCH 025/138] test_via_ir_equivalence(): Remove unnecessary filter for `asm_output_two_stage` - This bit will never actually appear in the output file. --- test/cmdlineTests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 69ae6e46b024..8f4be1140719 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -339,7 +339,7 @@ function test_via_ir_equivalence() local asm_output_two_stage asm_output_via_ir for asm_file in $(find . -name "${output_file_prefix}*.asm" | sort -V); do - asm_output_two_stage+=$(sed '/^asm_output_two_stage:$/d' "$asm_file" | sed '/^=======/d') + asm_output_two_stage+=$(sed '/^=======/d') done asm_output_via_ir=$( From 8c5304368d5b8da36046fd501408629716a71819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 23 May 2023 15:30:07 +0200 Subject: [PATCH 026/138] test_via_ir_equivalence(): Simplify by merging the asm loops - And fix indentation --- test/cmdlineTests.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 8f4be1140719..416b97b32a5b 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -332,14 +332,14 @@ function test_via_ir_equivalence() sed '/^Optimized IR:$/d' | split_on_empty_lines_into_numbered_files "$output_file_prefix" ".yul" - for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do - msg_on_error --no-stderr "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | - sed '/^Text representation:$/d' > "${yul_file/.yul/.asm}" - done - local asm_output_two_stage asm_output_via_ir - for asm_file in $(find . -name "${output_file_prefix}*.asm" | sort -V); do - asm_output_two_stage+=$(sed '/^=======/d') + + for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do + asm_output_two_stage+=$( + msg_on_error --no-stderr "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | + sed '/^Text representation:$/d' | + sed '/^=======/d' + ) done asm_output_via_ir=$( @@ -354,7 +354,7 @@ function test_via_ir_equivalence() for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do bin_output_two_stage+=$( - msg_on_error --no-stderr "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | + msg_on_error --no-stderr "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | sed '/^Binary representation:$/d' | sed '/^=======/d' ) @@ -362,8 +362,8 @@ function test_via_ir_equivalence() bin_output_via_ir=$( msg_on_error --no-stderr "$SOLC" --via-ir --bin "${optimizer_flags[@]}" "$solidity_file" | - sed '/^Binary:$/d' | - sed '/^=======/d' + sed '/^Binary:$/d' | + sed '/^=======/d' ) diff_values "$bin_output_two_stage" "$bin_output_via_ir" --ignore-space-change --ignore-blank-lines From b24e4fcbfa1f8bf4f38e45075ac3ee9839506234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 24 May 2023 14:26:52 +0200 Subject: [PATCH 027/138] Command-line tests for --optimize-yul and --no-optimize-yul used together --- .../args | 1 + .../input.sol | 2 ++ .../args | 1 + .../err | 1 + .../exit | 1 + .../input.yul | 1 + 6 files changed, 7 insertions(+) create mode 100644 test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/args create mode 100644 test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/input.sol create mode 100644 test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/args create mode 100644 test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err create mode 100644 test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/exit create mode 100644 test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/input.yul diff --git a/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/args b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/args new file mode 100644 index 000000000000..ce566d3e0d9e --- /dev/null +++ b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/args @@ -0,0 +1 @@ +--optimize-yul --no-optimize-yul diff --git a/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/input.sol b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/input.sol new file mode 100644 index 000000000000..a32f63f78ff2 --- /dev/null +++ b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/input.sol @@ -0,0 +1,2 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; diff --git a/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/args b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/args new file mode 100644 index 000000000000..cbefff3e9bf3 --- /dev/null +++ b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/args @@ -0,0 +1 @@ +--strict-assembly --optimize-yul --no-optimize-yul diff --git a/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err new file mode 100644 index 000000000000..f020083cd0e5 --- /dev/null +++ b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err @@ -0,0 +1 @@ +The following options are invalid in assembly mode: --optimize-yul, --no-optimize-yul. Optimization is disabled by default and can be enabled with --optimize. diff --git a/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/exit b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/input.yul b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/input.yul new file mode 100644 index 000000000000..0967ef424bce --- /dev/null +++ b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/input.yul @@ -0,0 +1 @@ +{} From a11b1c83f047bd495c9f716336bf4186111fd302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 24 May 2023 15:40:36 +0200 Subject: [PATCH 028/138] Disallow using both --optimize-yul and --no-optimize-yul at the same time --- Changelog.md | 1 + solc/CommandLineParser.cpp | 7 +++++++ .../err | 1 + .../exit | 1 + .../err | 2 +- 5 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/err create mode 100644 test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/exit diff --git a/Changelog.md b/Changelog.md index 71ccea0df1a0..159ec5187a9a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,6 +9,7 @@ Compiler Features: Bugfixes: + * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 1f11fc57c0d7..814470126470 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -1146,6 +1146,13 @@ void CommandLineParser::processArgs() m_options.output.eofVersion = 1; } + if (m_args.count(g_strNoOptimizeYul) > 0 && m_args.count(g_strOptimizeYul) > 0) + solThrow( + CommandLineValidationError, + "Options --" + g_strOptimizeYul + " and --" + g_strNoOptimizeYul + " cannot be used together." + ); + + // We deliberately ignore --optimize-yul m_options.optimizer.enabled = (m_args.count(g_strOptimize) > 0); m_options.optimizer.noOptimizeYul = (m_args.count(g_strNoOptimizeYul) > 0); if (!m_args[g_strOptimizeRuns].defaulted()) diff --git a/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/err b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/err new file mode 100644 index 000000000000..43c54c2f3934 --- /dev/null +++ b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/err @@ -0,0 +1 @@ +Options --optimize-yul and --no-optimize-yul cannot be used together. diff --git a/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/exit b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/optimizer_enabled_invalid_yul_optimizer_enabled_and_disabled/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err index f020083cd0e5..43c54c2f3934 100644 --- a/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err +++ b/test/cmdlineTests/strict_asm_optimizer_invalid_yul_optimizer_enabled_and_disabled/err @@ -1 +1 @@ -The following options are invalid in assembly mode: --optimize-yul, --no-optimize-yul. Optimization is disabled by default and can be enabled with --optimize. +Options --optimize-yul and --no-optimize-yul cannot be used together. From 1cc656c550e7ac0db5c7ec09fbdfa9e04a19cfdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 24 May 2023 12:33:38 +0200 Subject: [PATCH 029/138] docs: Remove a few leftover mentions of Ewasm --- docs/internals/optimizer.rst | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/docs/internals/optimizer.rst b/docs/internals/optimizer.rst index 9ede5ef2ac15..7d168d2209cd 100644 --- a/docs/internals/optimizer.rst +++ b/docs/internals/optimizer.rst @@ -1279,8 +1279,8 @@ This is a tiny step that helps in reversing the effects of the SSA transform if it is combined with the Common Subexpression Eliminator and the Unused Pruner. -The SSA form we generate is detrimental to code generation on the EVM and -WebAssembly alike because it generates many local variables. It would +The SSA form we generate is detrimental to code generation +because it produces many local variables. It would be better to just re-use existing variables with assignments instead of fresh variable declarations. @@ -1398,15 +1398,3 @@ into } The LiteralRematerialiser should be run before this step. - - -WebAssembly specific --------------------- - -MainFunction -^^^^^^^^^^^^ - -Changes the topmost block to be a function with a specific name ("main") which has no -inputs nor outputs. - -Depends on the Function Grouper. From f09838a03d4426eee126d8bb139b8399e40d44da Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 24 May 2023 12:20:35 +0200 Subject: [PATCH 030/138] Prefer authenticated request to github api when the token is available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kamil Śliwak --- .circleci/config.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d56106f69b7b..6db33891a353 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -128,11 +128,15 @@ commands: command: | FOUNDRY_REPO="foundry-rs/foundry" FOUNDRY_VERSION="<< parameters.version >>" + # Make authenticated requests when the Github token is available + if [[ -n "$GITHUB_ACCESS_TOKEN" ]]; then + EXTRA_HEADERS=(--header 'Authorization: Bearer '"${GITHUB_ACCESS_TOKEN}") + fi FOUNDRY_RELEASE_SHA=$(curl \ --silent \ --fail \ --show-error \ - --header "Authorization: Bearer ${GITHUB_ACCESS_TOKEN}" \ + "${EXTRA_HEADERS[@]}" \ "https://api.github.com/repos/${FOUNDRY_REPO}/git/refs/tags/${FOUNDRY_VERSION}" \ | jq --raw-output .object.sha \ ) From 28a1abf89a536a5149e030f79b0ff9c728400299 Mon Sep 17 00:00:00 2001 From: GiokaMarkella Date: Tue, 2 May 2023 16:34:12 +0300 Subject: [PATCH 031/138] Yul AST output on the CLI and in Standard JSON --- Changelog.md | 4 + docs/using-the-compiler.rst | 10 +- libsolidity/codegen/ir/IRGenerator.cpp | 8 +- libsolidity/codegen/ir/IRGenerator.h | 4 +- libsolidity/interface/CompilerStack.cpp | 24 +- libsolidity/interface/CompilerStack.h | 8 + libsolidity/interface/StandardCompiler.cpp | 24 +- libyul/AsmJsonConverter.cpp | 45 +- libyul/AsmJsonConverter.h | 2 +- libyul/Object.cpp | 30 + libyul/Object.h | 7 +- libyul/YulStack.cpp | 10 +- libyul/YulStack.h | 4 +- solc/CommandLineInterface.cpp | 71 +- solc/CommandLineInterface.h | 2 + solc/CommandLineParser.cpp | 9 +- solc/CommandLineParser.h | 4 + test/cmdlineTests/ast_ir/args | 1 + test/cmdlineTests/ast_ir/input.sol | 4 + test/cmdlineTests/ast_ir/output | 1078 +++++++++++++++++ .../combined_json_generated_sources/output | 145 +++ .../standard_generatedSources/output.json | 365 ++++++ .../standard_irOptimized_ast_requested/in.sol | 4 + .../input.json | 9 + .../output.json | 729 +++++++++++ .../standard_ir_ast_requested/in.sol | 4 + .../standard_ir_ast_requested/input.json | 9 + .../standard_ir_ast_requested/output.json | 729 +++++++++++ .../output.json | 230 ++++ test/cmdlineTests/standard_yul/output.json | 123 ++ .../standard_yul_object/output.json | 130 ++ .../standard_yul_object_name/output.json | 185 +++ .../standard_yul_optimiserSteps/output.json | 123 ++ .../standard_yul_optimized/output.json | 123 ++ .../strict_asm_ast_compact_json/args | 1 + .../strict_asm_ast_compact_json/input.yul | 15 + .../strict_asm_ast_compact_json/output | 91 ++ test/libsolidity/ASTJSON/assembly/call.json | 13 + .../ASTJSON/assembly/call_parseOnly.json | 13 + .../ASTJSON/assembly/empty_block.json | 2 + .../assembly/empty_block_parseOnly.json | 2 + .../ASTJSON/assembly/function.json | 12 + .../ASTJSON/assembly/function_parseOnly.json | 12 + test/libsolidity/ASTJSON/assembly/leave.json | 4 + .../ASTJSON/assembly/leave_parseOnly.json | 4 + test/libsolidity/ASTJSON/assembly/loop.json | 14 + .../ASTJSON/assembly/loop_parseOnly.json | 14 + .../ASTJSON/assembly/nested_functions.json | 8 + .../assembly/nested_functions_parseOnly.json | 8 + .../ASTJSON/assembly/slot_offset.json | 10 + .../assembly/slot_offset_parseOnly.json | 10 + .../ASTJSON/assembly/stringlit.json | 4 + .../ASTJSON/assembly/stringlit_parseOnly.json | 4 + test/libsolidity/ASTJSON/assembly/switch.json | 18 + .../ASTJSON/assembly/switch_default.json | 8 + .../assembly/switch_default_parseOnly.json | 8 + .../ASTJSON/assembly/switch_parseOnly.json | 18 + .../ASTJSON/assembly/var_access.json | 4 + .../assembly/var_access_parseOnly.json | 4 + test/libsolidity/ASTJSON/yul_hex_literal.json | 10 + .../ASTJSON/yul_hex_literal_parseOnly.json | 10 + test/solc/CommandLineParser.cpp | 7 +- 62 files changed, 4542 insertions(+), 43 deletions(-) create mode 100644 test/cmdlineTests/ast_ir/args create mode 100644 test/cmdlineTests/ast_ir/input.sol create mode 100644 test/cmdlineTests/ast_ir/output create mode 100644 test/cmdlineTests/standard_irOptimized_ast_requested/in.sol create mode 100644 test/cmdlineTests/standard_irOptimized_ast_requested/input.json create mode 100644 test/cmdlineTests/standard_irOptimized_ast_requested/output.json create mode 100644 test/cmdlineTests/standard_ir_ast_requested/in.sol create mode 100644 test/cmdlineTests/standard_ir_ast_requested/input.json create mode 100644 test/cmdlineTests/standard_ir_ast_requested/output.json create mode 100644 test/cmdlineTests/strict_asm_ast_compact_json/args create mode 100644 test/cmdlineTests/strict_asm_ast_compact_json/input.yul create mode 100644 test/cmdlineTests/strict_asm_ast_compact_json/output diff --git a/Changelog.md b/Changelog.md index 159ec5187a9a..7276d02d8054 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,8 +4,12 @@ Language Features: Compiler Features: + * Commandline Interface: Add ``--ast-compact-json`` output in assembler mode. + * Commandline Interface: Add ``--ir-ast-json`` and ``--ir-optimized-ast-json`` outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. * EWasm: Remove EWasm backend. * Parser: Introduce ``pragma experimental solidity``, which will enable an experimental language mode that in particular has no stability guarantees between non-breaking releases and is not suited for production use. + * Standard JSON Interface: Add ``ast`` file-level output for Yul input. + * Standard JSON Interface: Add ``irAst`` and ``irOptimizedAst`` contract-level outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. Bugfixes: diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 57f0fab6cfb2..4c94923e0651 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -390,7 +390,9 @@ Input Description // userdoc - User documentation (natspec) // metadata - Metadata // ir - Yul intermediate representation of the code before optimization + // irAst - AST of Yul intermediate representation of the code before optimization // irOptimized - Intermediate representation after optimization + // irOptimizedAst - AST of intermediate representation after optimization // storageLayout - Slots, offsets and types of the contract's state variables. // evm.assembly - New assembly format // evm.legacyAssembly - Old-style assembly format in JSON @@ -536,8 +538,14 @@ Output Description "userdoc": {}, // Developer documentation (natspec) "devdoc": {}, - // Intermediate representation (string) + // Intermediate representation before optimization (string) "ir": "", + // AST of intermediate representation before optimization + "irAst": {/* ... */}, + // Intermediate representation after optimization (string) + "irOptimized": "", + // AST of intermediate representation after optimization + "irOptimizedAst": {/* ... */}, // See the Storage Layout documentation. "storageLayout": {"storage": [/* ... */], "types": {/* ... */} }, // EVM-related outputs diff --git a/libsolidity/codegen/ir/IRGenerator.cpp b/libsolidity/codegen/ir/IRGenerator.cpp index bc2f85b4aec0..bbc5ef3ac7b5 100644 --- a/libsolidity/codegen/ir/IRGenerator.cpp +++ b/libsolidity/codegen/ir/IRGenerator.cpp @@ -40,6 +40,8 @@ #include +#include + #include #include @@ -87,7 +89,7 @@ set collectReachableCallables( } -pair IRGenerator::run( +tuple IRGenerator::run( ContractDefinition const& _contract, bytes const& _cborMetadata, map const& _otherYulSources @@ -112,9 +114,11 @@ pair IRGenerator::run( ); solAssert(false, ir + "\n\nInvalid IR generated:\n" + errorMessage + "\n"); } + Json::Value irAst = asmStack.astJson(); asmStack.optimize(); + Json::Value irOptAst = asmStack.astJson(); - return {std::move(ir), asmStack.print(m_context.soliditySourceProvider())}; + return {std::move(ir), std::move(irAst), asmStack.print(m_context.soliditySourceProvider()), std::move(irOptAst)}; } string IRGenerator::generate( diff --git a/libsolidity/codegen/ir/IRGenerator.h b/libsolidity/codegen/ir/IRGenerator.h index 00387842ed01..9001244b2cd3 100644 --- a/libsolidity/codegen/ir/IRGenerator.h +++ b/libsolidity/codegen/ir/IRGenerator.h @@ -32,6 +32,8 @@ #include #include +#include + #include namespace solidity::frontend @@ -70,7 +72,7 @@ class IRGenerator /// Generates and returns the IR code, in unoptimized and optimized form /// (or just pretty-printed, depending on the optimizer settings). - std::pair run( + std::tuple run( ContractDefinition const& _contract, bytes const& _cborMetadata, std::map const& _otherYulSources diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index dae509ed5a08..f8a5fed6ecb0 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -883,6 +883,14 @@ string const& CompilerStack::yulIR(string const& _contractName) const return contract(_contractName).yulIR; } +Json::Value const& CompilerStack::yulIRAst(string const& _contractName) const +{ + if (m_stackState != CompilationSuccessful) + solThrow(CompilerError, "Compilation was not successful."); + + return contract(_contractName).yulIRAst; +} + string const& CompilerStack::yulIROptimized(string const& _contractName) const { if (m_stackState != CompilationSuccessful) @@ -891,6 +899,14 @@ string const& CompilerStack::yulIROptimized(string const& _contractName) const return contract(_contractName).yulIROptimized; } +Json::Value const& CompilerStack::yulIROptimizedAst(string const& _contractName) const +{ + if (m_stackState != CompilationSuccessful) + solThrow(CompilerError, "Compilation was not successful."); + + return contract(_contractName).yulIROptimizedAst; +} + evmasm::LinkerObject const& CompilerStack::object(string const& _contractName) const { if (m_stackState != CompilationSuccessful) @@ -1445,7 +1461,13 @@ void CompilerStack::generateIR(ContractDefinition const& _contract) m_debugInfoSelection, this ); - tie(compiledContract.yulIR, compiledContract.yulIROptimized) = generator.run( + + tie( + compiledContract.yulIR, + compiledContract.yulIRAst, + compiledContract.yulIROptimized, + compiledContract.yulIROptimizedAst + ) = generator.run( _contract, createCBORMetadata(compiledContract, /* _forIR */ true), otherYulSources diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index a01eaaa0ff1b..8880770b8225 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -276,9 +276,15 @@ class CompilerStack: public langutil::CharStreamProvider /// @returns the IR representation of a contract. std::string const& yulIR(std::string const& _contractName) const; + /// @returns the IR representation of a contract AST in format. + Json::Value const& yulIRAst(std::string const& _contractName) const; + /// @returns the optimized IR representation of a contract. std::string const& yulIROptimized(std::string const& _contractName) const; + /// @returns the optimized IR representation of a contract AST in JSON format. + Json::Value const& yulIROptimizedAst(std::string const& _contractName) const; + /// @returns the assembled object for a contract. evmasm::LinkerObject const& object(std::string const& _contractName) const; @@ -380,6 +386,8 @@ class CompilerStack: public langutil::CharStreamProvider evmasm::LinkerObject runtimeObject; ///< Runtime object. std::string yulIR; ///< Yul IR code. std::string yulIROptimized; ///< Optimized Yul IR code. + Json::Value yulIRAst; ///< JSON AST of Yul IR code. + Json::Value yulIROptimizedAst; ///< JSON AST of optimized Yul IR code. util::LazyInit metadata; ///< The metadata json that will be hashed into the chain. util::LazyInit abi; util::LazyInit storageLayout; diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index 28a564a4c927..972c04ba9763 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -179,7 +179,7 @@ bool hashMatchesContent(string const& _hash, string const& _content) bool isArtifactRequested(Json::Value const& _outputSelection, string const& _artifact, bool _wildcardMatchesExperimental) { - static set experimental{"ir", "irOptimized"}; + static set experimental{"ir", "irAst", "irOptimized", "irOptimizedAst"}; for (auto const& selectedArtifactJson: _outputSelection) { string const& selectedArtifact = selectedArtifactJson.asString(); @@ -263,7 +263,7 @@ bool isBinaryRequested(Json::Value const& _outputSelection) // This does not include "evm.methodIdentifiers" on purpose! static vector const outputsThatRequireBinaries = vector{ "*", - "ir", "irOptimized", + "ir", "irAst", "irOptimized", "irOptimizedAst", "evm.gasEstimates", "evm.legacyAssembly", "evm.assembly" } + evmObjectComponents("bytecode") + evmObjectComponents("deployedBytecode"); @@ -295,7 +295,7 @@ bool isEvmBytecodeRequested(Json::Value const& _outputSelection) } /// @returns true if any Yul IR was requested. Note that as an exception, '*' does not -/// yet match "ir" or "irOptimized" +/// yet match "ir", "irAst", "irOptimized" or "irOptimizedAst" bool isIRRequested(Json::Value const& _outputSelection) { if (!_outputSelection.isObject()) @@ -304,7 +304,12 @@ bool isIRRequested(Json::Value const& _outputSelection) for (auto const& fileRequests: _outputSelection) for (auto const& requests: fileRequests) for (auto const& request: requests) - if (request == "ir" || request == "irOptimized") + if ( + request == "ir" || + request == "irAst" || + request == "irOptimized" || + request == "irOptimizedAst" + ) return true; return false; @@ -1350,8 +1355,12 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting // IR if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "ir", wildcardMatchesExperimental)) contractData["ir"] = compilerStack.yulIR(contractName); + if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "irAst", wildcardMatchesExperimental)) + contractData["irAst"] = compilerStack.yulIRAst(contractName); if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "irOptimized", wildcardMatchesExperimental)) contractData["irOptimized"] = compilerStack.yulIROptimized(contractName); + if (compilationSuccess && isArtifactRequested(_inputsAndSettings.outputSelection, file, name, "irOptimizedAst", wildcardMatchesExperimental)) + contractData["irOptimizedAst"] = compilerStack.yulIROptimizedAst(contractName); // EVM Json::Value evmData(Json::objectValue); @@ -1513,6 +1522,13 @@ Json::Value StandardCompiler::compileYul(InputsAndSettings _inputsAndSettings) if (isArtifactRequested(_inputsAndSettings.outputSelection, sourceName, contractName, "ir", wildcardMatchesExperimental)) output["contracts"][sourceName][contractName]["ir"] = stack.print(); + if (isArtifactRequested(_inputsAndSettings.outputSelection, sourceName, contractName, "ast", wildcardMatchesExperimental)) + { + Json::Value sourceResult = Json::objectValue; + sourceResult["id"] = 1; + sourceResult["ast"] = stack.astJson(); + output["sources"][sourceName] = sourceResult; + } stack.optimize(); MachineAssemblyObject object; diff --git a/libyul/AsmJsonConverter.cpp b/libyul/AsmJsonConverter.cpp index 1807396c50a6..0a800c2bad42 100644 --- a/libyul/AsmJsonConverter.cpp +++ b/libyul/AsmJsonConverter.cpp @@ -33,7 +33,7 @@ namespace solidity::yul Json::Value AsmJsonConverter::operator()(Block const& _node) const { - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulBlock"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulBlock"); ret["statements"] = vectorOfVariantsToJson(_node.statements); return ret; } @@ -41,7 +41,7 @@ Json::Value AsmJsonConverter::operator()(Block const& _node) const Json::Value AsmJsonConverter::operator()(TypedName const& _node) const { yulAssert(!_node.name.empty(), "Invalid variable name."); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulTypedName"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulTypedName"); ret["name"] = _node.name.str(); ret["type"] = _node.type.str(); return ret; @@ -49,7 +49,7 @@ Json::Value AsmJsonConverter::operator()(TypedName const& _node) const Json::Value AsmJsonConverter::operator()(Literal const& _node) const { - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulLiteral"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulLiteral"); switch (_node.kind) { case LiteralKind::Number: @@ -76,7 +76,7 @@ Json::Value AsmJsonConverter::operator()(Literal const& _node) const Json::Value AsmJsonConverter::operator()(Identifier const& _node) const { yulAssert(!_node.name.empty(), "Invalid identifier"); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulIdentifier"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulIdentifier"); ret["name"] = _node.name.str(); return ret; } @@ -84,7 +84,7 @@ Json::Value AsmJsonConverter::operator()(Identifier const& _node) const Json::Value AsmJsonConverter::operator()(Assignment const& _node) const { yulAssert(_node.variableNames.size() >= 1, "Invalid assignment syntax"); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulAssignment"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulAssignment"); for (auto const& var: _node.variableNames) ret["variableNames"].append((*this)(var)); ret["value"] = _node.value ? std::visit(*this, *_node.value) : Json::nullValue; @@ -93,7 +93,7 @@ Json::Value AsmJsonConverter::operator()(Assignment const& _node) const Json::Value AsmJsonConverter::operator()(FunctionCall const& _node) const { - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulFunctionCall"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulFunctionCall"); ret["functionName"] = (*this)(_node.functionName); ret["arguments"] = vectorOfVariantsToJson(_node.arguments); return ret; @@ -101,14 +101,14 @@ Json::Value AsmJsonConverter::operator()(FunctionCall const& _node) const Json::Value AsmJsonConverter::operator()(ExpressionStatement const& _node) const { - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulExpressionStatement"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulExpressionStatement"); ret["expression"] = std::visit(*this, _node.expression); return ret; } Json::Value AsmJsonConverter::operator()(VariableDeclaration const& _node) const { - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulVariableDeclaration"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulVariableDeclaration"); for (auto const& var: _node.variables) ret["variables"].append((*this)(var)); @@ -120,7 +120,7 @@ Json::Value AsmJsonConverter::operator()(VariableDeclaration const& _node) const Json::Value AsmJsonConverter::operator()(FunctionDefinition const& _node) const { yulAssert(!_node.name.empty(), "Invalid function name."); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulFunctionDefinition"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulFunctionDefinition"); ret["name"] = _node.name.str(); for (auto const& var: _node.parameters) ret["parameters"].append((*this)(var)); @@ -133,7 +133,7 @@ Json::Value AsmJsonConverter::operator()(FunctionDefinition const& _node) const Json::Value AsmJsonConverter::operator()(If const& _node) const { yulAssert(_node.condition, "Invalid if condition."); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulIf"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulIf"); ret["condition"] = std::visit(*this, *_node.condition); ret["body"] = (*this)(_node.body); return ret; @@ -142,7 +142,7 @@ Json::Value AsmJsonConverter::operator()(If const& _node) const Json::Value AsmJsonConverter::operator()(Switch const& _node) const { yulAssert(_node.expression, "Invalid expression pointer."); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulSwitch"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulSwitch"); ret["expression"] = std::visit(*this, *_node.expression); for (auto const& var: _node.cases) ret["cases"].append((*this)(var)); @@ -151,7 +151,7 @@ Json::Value AsmJsonConverter::operator()(Switch const& _node) const Json::Value AsmJsonConverter::operator()(Case const& _node) const { - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulCase"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulCase"); ret["value"] = _node.value ? (*this)(*_node.value) : "default"; ret["body"] = (*this)(_node.body); return ret; @@ -160,7 +160,7 @@ Json::Value AsmJsonConverter::operator()(Case const& _node) const Json::Value AsmJsonConverter::operator()(ForLoop const& _node) const { yulAssert(_node.condition, "Invalid for loop condition."); - Json::Value ret = createAstNode(nativeLocationOf(_node), "YulForLoop"); + Json::Value ret = createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulForLoop"); ret["pre"] = (*this)(_node.pre); ret["condition"] = std::visit(*this, *_node.condition); ret["post"] = (*this)(_node.post); @@ -170,27 +170,30 @@ Json::Value AsmJsonConverter::operator()(ForLoop const& _node) const Json::Value AsmJsonConverter::operator()(Break const& _node) const { - return createAstNode(nativeLocationOf(_node), "YulBreak"); + return createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulBreak"); } Json::Value AsmJsonConverter::operator()(Continue const& _node) const { - return createAstNode(nativeLocationOf(_node), "YulContinue"); + return createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulContinue"); } Json::Value AsmJsonConverter::operator()(Leave const& _node) const { - return createAstNode(nativeLocationOf(_node), "YulLeave"); + return createAstNode(originLocationOf(_node), nativeLocationOf(_node), "YulLeave"); } -Json::Value AsmJsonConverter::createAstNode(langutil::SourceLocation const& _location, string _nodeType) const +Json::Value AsmJsonConverter::createAstNode(langutil::SourceLocation const& _originLocation, langutil::SourceLocation const& _nativeLocation, string _nodeType) const { Json::Value ret{Json::objectValue}; ret["nodeType"] = std::move(_nodeType); - int length = -1; - if (_location.start >= 0 && _location.end >= 0) - length = _location.end - _location.start; - ret["src"] = to_string(_location.start) + ":" + to_string(length) + ":" + (m_sourceIndex.has_value() ? to_string(m_sourceIndex.value()) : "-1"); + auto srcLocation = [&](int start, int end) -> string + { + int length = (start >= 0 && end >= 0 && end >= start) ? end - start : -1; + return to_string(start) + ":" + to_string(length) + ":" + (m_sourceIndex.has_value() ? to_string(m_sourceIndex.value()) : "-1"); + }; + ret["src"] = srcLocation(_originLocation.start, _originLocation.end); + ret["nativeSrc"] = srcLocation(_nativeLocation.start, _nativeLocation.end); return ret; } diff --git a/libyul/AsmJsonConverter.h b/libyul/AsmJsonConverter.h index 52e36d5cddab..236ecbba579c 100644 --- a/libyul/AsmJsonConverter.h +++ b/libyul/AsmJsonConverter.h @@ -62,7 +62,7 @@ class AsmJsonConverter: public boost::static_visitor Json::Value operator()(Label const& _node) const; private: - Json::Value createAstNode(langutil::SourceLocation const& _location, std::string _nodeType) const; + Json::Value createAstNode(langutil::SourceLocation const& _originLocation, langutil::SourceLocation const& _nativeLocation, std::string _nodeType) const; template Json::Value vectorOfVariantsToJson(std::vector const& vec) const; diff --git a/libyul/Object.cpp b/libyul/Object.cpp index cf68ff765fd1..97857aa4baa0 100644 --- a/libyul/Object.cpp +++ b/libyul/Object.cpp @@ -22,6 +22,8 @@ #include #include +#include +#include #include #include @@ -88,6 +90,34 @@ string Object::toString( return useSrcComment + "object \"" + name.str() + "\" {\n" + indent(inner) + "\n}"; } +Json::Value Data::toJson() const +{ + Json::Value ret{Json::objectValue}; + ret["nodeType"] = "YulData"; + ret["value"] = util::toHex(data); + return ret; +} + +Json::Value Object::toJson() const +{ + yulAssert(code, "No code"); + + Json::Value codeJson{Json::objectValue}; + codeJson["nodeType"] = "YulCode"; + codeJson["block"] = AsmJsonConverter(0 /* sourceIndex */)(*code); + + Json::Value subObjectsJson{Json::arrayValue}; + for (shared_ptr const& subObject: subObjects) + subObjectsJson.append(subObject->toJson()); + + Json::Value ret{Json::objectValue}; + ret["nodeType"] = "YulObject"; + ret["name"] = name.str(); + ret["code"] = codeJson; + ret["subObjects"] = subObjectsJson; + return ret; +} + set Object::qualifiedDataNames() const { set qualifiedNames = diff --git a/libyul/Object.h b/libyul/Object.h index f3c4ee34a550..5f88d3bc7ff6 100644 --- a/libyul/Object.h +++ b/libyul/Object.h @@ -32,13 +32,13 @@ #include #include #include +#include namespace solidity::yul { struct Dialect; struct AsmAnalysisInfo; - using SourceNameMap = std::map>; struct Object; @@ -58,6 +58,7 @@ struct ObjectNode langutil::DebugInfoSelection const& _debugInfoSelection, langutil::CharStreamProvider const* _soliditySourceProvider ) const = 0; + virtual Json::Value toJson() const = 0; }; /** @@ -74,6 +75,7 @@ struct Data: public ObjectNode langutil::DebugInfoSelection const& _debugInfoSelection, langutil::CharStreamProvider const* _soliditySourceProvider ) const override; + Json::Value toJson() const override; }; @@ -95,7 +97,8 @@ struct Object: public ObjectNode langutil::DebugInfoSelection const& _debugInfoSelection = langutil::DebugInfoSelection::Default(), langutil::CharStreamProvider const* _soliditySourceProvider = nullptr ) const; - + /// @returns a compact JSON representation of the AST. + Json::Value toJson() const; /// @returns the set of names of data objects accessible from within the code of /// this object, including the name of object itself /// Handles all names containing dots as reserved identifiers, not accessible as data. diff --git a/libyul/YulStack.cpp b/libyul/YulStack.cpp index 9ac90c3959f6..a4f9615646be 100644 --- a/libyul/YulStack.cpp +++ b/libyul/YulStack.cpp @@ -31,10 +31,11 @@ #include #include #include - #include #include + #include + #include using namespace std; @@ -270,6 +271,13 @@ string YulStack::print( return m_parserResult->toString(&languageToDialect(m_language, m_evmVersion), m_debugInfoSelection, _soliditySourceProvider) + "\n"; } +Json::Value YulStack::astJson() const +{ + yulAssert(m_parserResult, ""); + yulAssert(m_parserResult->code, ""); + return m_parserResult->toJson(); +} + shared_ptr YulStack::parserResult() const { yulAssert(m_analysisSuccessful, "Analysis was not successful."); diff --git a/libyul/YulStack.h b/libyul/YulStack.h index bd38cd6024f8..700fd2b3baa3 100644 --- a/libyul/YulStack.h +++ b/libyul/YulStack.h @@ -33,6 +33,8 @@ #include +#include + #include #include @@ -130,7 +132,7 @@ class YulStack: public langutil::CharStreamProvider std::string print( langutil::CharStreamProvider const* _soliditySourceProvider = nullptr ) const; - + Json::Value astJson() const; /// Return the parsed and analyzed object. std::shared_ptr parserResult() const; diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 0f45f519630e..0d0f4c5f9cbc 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -223,6 +223,31 @@ void CommandLineInterface::handleIR(string const& _contractName) } } +void CommandLineInterface::handleIRAst(string const& _contractName) +{ + solAssert(CompilerInputModes.count(m_options.input.mode) == 1); + + if (!m_options.compiler.outputs.irAstJson) + return; + + if (!m_options.output.dir.empty()) + createFile( + m_compiler->filesystemFriendlyName(_contractName) + "_yul_ast.json", + util::jsonPrint( + m_compiler->yulIRAst(_contractName), + m_options.formatting.json + ) + ); + else + { + sout() << "IR AST:" << endl; + sout() << util::jsonPrint( + m_compiler->yulIRAst(_contractName), + m_options.formatting.json + ) << endl; + } +} + void CommandLineInterface::handleIROptimized(string const& _contractName) { solAssert(CompilerInputModes.count(m_options.input.mode) == 1); @@ -231,7 +256,10 @@ void CommandLineInterface::handleIROptimized(string const& _contractName) return; if (!m_options.output.dir.empty()) - createFile(m_compiler->filesystemFriendlyName(_contractName) + "_opt.yul", m_compiler->yulIROptimized(_contractName)); + createFile( + m_compiler->filesystemFriendlyName(_contractName) + "_opt.yul", + m_compiler->yulIROptimized(_contractName) + ); else { sout() << "Optimized IR:" << endl; @@ -239,6 +267,31 @@ void CommandLineInterface::handleIROptimized(string const& _contractName) } } +void CommandLineInterface::handleIROptimizedAst(string const& _contractName) +{ + solAssert(CompilerInputModes.count(m_options.input.mode) == 1); + + if (!m_options.compiler.outputs.irOptimizedAstJson) + return; + + if (!m_options.output.dir.empty()) + createFile( + m_compiler->filesystemFriendlyName(_contractName) + "_opt_yul_ast.json", + util::jsonPrint( + m_compiler->yulIROptimizedAst(_contractName), + m_options.formatting.json + ) + ); + else + { + sout() << "Optimized IR AST:" << endl; + sout() << util::jsonPrint( + m_compiler->yulIROptimizedAst(_contractName), + m_options.formatting.json + ) << endl; + } +} + void CommandLineInterface::handleBytecode(string const& _contract) { solAssert(CompilerInputModes.count(m_options.input.mode) == 1); @@ -690,8 +743,12 @@ void CommandLineInterface::compile() if (m_options.output.debugInfoSelection.has_value()) m_compiler->selectDebugInfo(m_options.output.debugInfoSelection.value()); // TODO: Perhaps we should not compile unless requested - - m_compiler->enableIRGeneration(m_options.compiler.outputs.ir || m_options.compiler.outputs.irOptimized); + m_compiler->enableIRGeneration( + m_options.compiler.outputs.ir || + m_options.compiler.outputs.irOptimized || + m_options.compiler.outputs.irAstJson || + m_options.compiler.outputs.irOptimizedAstJson + ); m_compiler->enableEvmBytecodeGeneration( m_options.compiler.estimateGas || m_options.compiler.outputs.asm_ || @@ -1084,7 +1141,11 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y else serr() << "No binary representation found." << endl; } - + if (m_options.compiler.outputs.astCompactJson) + { + sout() << "AST:" << endl << endl; + sout() << util::jsonPrint(stack.astJson(), m_options.formatting.json) << endl; + } solAssert(_targetMachine == yul::YulStack::Machine::EVM, ""); if (m_options.compiler.outputs.asm_) { @@ -1141,7 +1202,9 @@ void CommandLineInterface::outputCompilationResults() handleBytecode(contract); handleIR(contract); + handleIRAst(contract); handleIROptimized(contract); + handleIROptimizedAst(contract); handleSignatureHashes(contract); handleMetadata(contract); handleABI(contract); diff --git a/solc/CommandLineInterface.h b/solc/CommandLineInterface.h index b6d7f92a8c63..5de69270b7e4 100644 --- a/solc/CommandLineInterface.h +++ b/solc/CommandLineInterface.h @@ -101,7 +101,9 @@ class CommandLineInterface void handleBinary(std::string const& _contract); void handleOpcode(std::string const& _contract); void handleIR(std::string const& _contract); + void handleIRAst(std::string const& _contract); void handleIROptimized(std::string const& _contract); + void handleIROptimizedAst(std::string const& _contract); void handleBytecode(std::string const& _contract); void handleSignatureHashes(std::string const& _contract); void handleMetadata(std::string const& _contract); diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 814470126470..514073389048 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -461,7 +461,8 @@ void CommandLineParser::parseOutputSelection() static set const assemblerModeOutputs = { CompilerOutputs::componentName(&CompilerOutputs::asm_), CompilerOutputs::componentName(&CompilerOutputs::binary), - CompilerOutputs::componentName(&CompilerOutputs::irOptimized) + CompilerOutputs::componentName(&CompilerOutputs::irOptimized), + CompilerOutputs::componentName(&CompilerOutputs::astCompactJson), }; switch (_mode) @@ -735,7 +736,9 @@ General Information)").c_str(), (CompilerOutputs::componentName(&CompilerOutputs::binaryRuntime).c_str(), "Binary of the runtime part of the contracts in hex.") (CompilerOutputs::componentName(&CompilerOutputs::abi).c_str(), "ABI specification of the contracts.") (CompilerOutputs::componentName(&CompilerOutputs::ir).c_str(), "Intermediate Representation (IR) of all contracts.") - (CompilerOutputs::componentName(&CompilerOutputs::irOptimized).c_str(), "Optimized intermediate Representation (IR) of all contracts.") + (CompilerOutputs::componentName(&CompilerOutputs::irAstJson).c_str(), "AST of Intermediate Representation (IR) of all contracts in a compact JSON format.") + (CompilerOutputs::componentName(&CompilerOutputs::irOptimized).c_str(), "Optimized Intermediate Representation (IR) of all contracts.") + (CompilerOutputs::componentName(&CompilerOutputs::irOptimizedAstJson).c_str(), "AST of optimized Intermediate Representation (IR) of all contracts in a compact JSON format.") (CompilerOutputs::componentName(&CompilerOutputs::signatureHashes).c_str(), "Function signature hashes of the contracts.") (CompilerOutputs::componentName(&CompilerOutputs::natspecUser).c_str(), "Natspec user documentation of all contracts.") (CompilerOutputs::componentName(&CompilerOutputs::natspecDev).c_str(), "Natspec developer documentation of all contracts.") @@ -991,7 +994,9 @@ void CommandLineParser::processArgs() array const conflictingWithStopAfter{ CompilerOutputs::componentName(&CompilerOutputs::binary), CompilerOutputs::componentName(&CompilerOutputs::ir), + CompilerOutputs::componentName(&CompilerOutputs::irAstJson), CompilerOutputs::componentName(&CompilerOutputs::irOptimized), + CompilerOutputs::componentName(&CompilerOutputs::irOptimizedAstJson), g_strGas, CompilerOutputs::componentName(&CompilerOutputs::asm_), CompilerOutputs::componentName(&CompilerOutputs::asmJson), diff --git a/solc/CommandLineParser.h b/solc/CommandLineParser.h index 9bfae034625e..a4c5a77194b7 100644 --- a/solc/CommandLineParser.h +++ b/solc/CommandLineParser.h @@ -77,7 +77,9 @@ struct CompilerOutputs {"bin-runtime", &CompilerOutputs::binaryRuntime}, {"abi", &CompilerOutputs::abi}, {"ir", &CompilerOutputs::ir}, + {"ir-ast-json", &CompilerOutputs::irAstJson}, {"ir-optimized", &CompilerOutputs::irOptimized}, + {"ir-optimized-ast-json", &CompilerOutputs::irOptimizedAstJson}, {"hashes", &CompilerOutputs::signatureHashes}, {"userdoc", &CompilerOutputs::natspecUser}, {"devdoc", &CompilerOutputs::natspecDev}, @@ -95,7 +97,9 @@ struct CompilerOutputs bool binaryRuntime = false; bool abi = false; bool ir = false; + bool irAstJson = false; bool irOptimized = false; + bool irOptimizedAstJson = false; bool signatureHashes = false; bool natspecUser = false; bool natspecDev = false; diff --git a/test/cmdlineTests/ast_ir/args b/test/cmdlineTests/ast_ir/args new file mode 100644 index 000000000000..d254bff83d54 --- /dev/null +++ b/test/cmdlineTests/ast_ir/args @@ -0,0 +1 @@ +--ir-ast-json --ir-optimized-ast-json --optimize --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/ast_ir/input.sol b/test/cmdlineTests/ast_ir/input.sol new file mode 100644 index 000000000000..f123f6c8bee3 --- /dev/null +++ b/test/cmdlineTests/ast_ir/input.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C {} diff --git a/test/cmdlineTests/ast_ir/output b/test/cmdlineTests/ast_ir/output new file mode 100644 index 000000000000..cca31349e868 --- /dev/null +++ b/test/cmdlineTests/ast_ir/output @@ -0,0 +1,1078 @@ +IR AST: +{ + "code": + { + "block": + { + "nativeSrc": "59:790:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "118:2:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "134:3:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "122:11:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "122:16:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "111:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "111:28:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "111:28:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "163:83:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "165:77:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "165:79:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "165:79:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + } + ] + }, + "condition": + { + "arguments": [], + "functionName": + { + "name": "callvalue", + "nativeSrc": "151:9:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "151:11:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "148:98:0", + "nodeType": "YulIf", + "src": "60:13:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "constructor_C_2", + "nativeSrc": "256:15:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "256:17:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "256:17:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "nativeSrc": "283:30:0", + "nodeType": "YulVariableDeclaration", + "src": "60:13:0", + "value": + { + "arguments": [], + "functionName": + { + "name": "allocate_unbounded", + "nativeSrc": "293:18:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "293:20:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "variables": + [ + { + "name": "_1", + "nativeSrc": "287:2:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "331:2:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "346:14:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "335:10:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "335:26:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "372:14:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "363:8:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "363:24:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "codecopy", + "nativeSrc": "322:8:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "322:66:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "322:66:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "405:2:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "418:14:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "409:8:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "409:24:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "return", + "nativeSrc": "398:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "398:36:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "398:36:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "484:43:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "nativeSrc": "498:19:0", + "nodeType": "YulAssignment", + "src": "60:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "514:2:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "64" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "508:5:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "508:9:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "variableNames": + [ + { + "name": "memPtr", + "nativeSrc": "498:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nativeSrc": "444:83:0", + "nodeType": "YulFunctionDefinition", + "returnVariables": + [ + { + "name": "memPtr", + "nativeSrc": "477:6:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ], + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "626:36:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "647:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "650:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "640:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "640:12:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "640:12:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + } + ] + }, + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "537:125:0", + "nodeType": "YulFunctionDefinition", + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "741:59:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": [] + }, + "name": "constructor_C_2", + "nativeSrc": "714:86:0", + "nodeType": "YulFunctionDefinition", + "src": "60:13:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2", + "nodeType": "YulObject", + "subObjects": + [ + { + "code": + { + "block": + { + "nativeSrc": "929:588:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "996:2:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1012:3:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "1000:11:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "1000:16:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "989:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "989:28:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "989:28:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1031:77:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "1031:79:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "1031:79:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "1177:77:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "nativeSrc": "1195:44:0", + "nodeType": "YulAssignment", + "src": "60:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1228:3:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "224" + }, + { + "name": "value", + "nativeSrc": "1233:5:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "shr", + "nativeSrc": "1224:3:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "1224:15:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "variableNames": + [ + { + "name": "newValue", + "nativeSrc": "1195:8:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ] + } + ] + }, + "name": "shift_right_224_unsigned", + "nativeSrc": "1124:130:0", + "nodeType": "YulFunctionDefinition", + "parameters": + [ + { + "name": "value", + "nativeSrc": "1158:5:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ], + "returnVariables": + [ + { + "name": "newValue", + "nativeSrc": "1168:8:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ], + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "1308:51:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "nativeSrc": "1326:19:0", + "nodeType": "YulAssignment", + "src": "60:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1342:2:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "64" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "1336:5:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "1336:9:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "variableNames": + [ + { + "name": "memPtr", + "nativeSrc": "1326:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nativeSrc": "1268:91:0", + "nodeType": "YulFunctionDefinition", + "returnVariables": + [ + { + "name": "memPtr", + "nativeSrc": "1301:6:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ], + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "1462:44:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1487:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "1490:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "1480:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "1480:12:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "1480:12:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + } + ] + }, + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1373:133:0", + "nodeType": "YulFunctionDefinition", + "src": "60:13:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2_deployed", + "nodeType": "YulObject", + "subObjects": + [ + { + "nodeType": "YulData", + "value": "" + } + ] + } + ] +} +Optimized IR AST: +{ + "code": + { + "block": + { + "nativeSrc": "59:790:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "nativeSrc": "59:790:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "nativeSrc": "122:16:0", + "nodeType": "YulVariableDeclaration", + "src": "60:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "134:3:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0x80" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "122:11:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "122:16:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "variables": + [ + { + "name": "_1", + "nativeSrc": "122:16:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "118:2:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "64" + }, + { + "name": "_1", + "nativeSrc": "122:16:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "111:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "111:28:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "111:28:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "body": + { + "nativeSrc": "163:83:0", + "nodeType": "YulBlock", + "src": "60:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "650:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "650:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "640:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "640:12:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "640:12:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + } + ] + }, + "condition": + { + "arguments": [], + "functionName": + { + "name": "callvalue", + "nativeSrc": "151:9:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "151:11:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "148:98:0", + "nodeType": "YulIf", + "src": "60:13:0" + }, + { + "nativeSrc": "363:24:0", + "nodeType": "YulVariableDeclaration", + "src": "60:13:0", + "value": + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "372:14:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "363:8:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "363:24:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "variables": + [ + { + "name": "_2", + "nativeSrc": "363:24:0", + "nodeType": "YulTypedName", + "src": "60:13:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "331:2:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "346:14:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "335:10:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "335:26:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + { + "name": "_2", + "nativeSrc": "363:24:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "codecopy", + "nativeSrc": "322:8:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "322:66:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "322:66:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "405:2:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + { + "name": "_2", + "nativeSrc": "409:24:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + } + ], + "functionName": + { + "name": "return", + "nativeSrc": "398:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "398:36:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "398:36:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + } + ] + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2", + "nodeType": "YulObject", + "subObjects": + [ + { + "code": + { + "block": + { + "nativeSrc": "929:588:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "nativeSrc": "929:588:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1490:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "1490:1:0", + "nodeType": "YulLiteral", + "src": "60:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "1480:6:0", + "nodeType": "YulIdentifier", + "src": "60:13:0" + }, + "nativeSrc": "1480:12:0", + "nodeType": "YulFunctionCall", + "src": "60:13:0" + }, + "nativeSrc": "1480:12:0", + "nodeType": "YulExpressionStatement", + "src": "60:13:0" + } + ] + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2_deployed", + "nodeType": "YulObject", + "subObjects": + [ + { + "nodeType": "YulData", + "value": "" + } + ] + } + ] +} diff --git a/test/cmdlineTests/combined_json_generated_sources/output b/test/cmdlineTests/combined_json_generated_sources/output index 0bd9395fea83..5ef9078d6e80 100644 --- a/test/cmdlineTests/combined_json_generated_sources/output +++ b/test/cmdlineTests/combined_json_generated_sources/output @@ -9,6 +9,7 @@ { "ast": { + "nativeSrc": "0:1856:1", "nodeType": "YulBlock", "src": "0:1856:1", "statements": @@ -16,11 +17,13 @@ { "body": { + "nativeSrc": "47:35:1", "nodeType": "YulBlock", "src": "47:35:1", "statements": [ { + "nativeSrc": "57:19:1", "nodeType": "YulAssignment", "src": "57:19:1", "value": @@ -29,6 +32,7 @@ [ { "kind": "number", + "nativeSrc": "73:2:1", "nodeType": "YulLiteral", "src": "73:2:1", "type": "", @@ -38,9 +42,11 @@ "functionName": { "name": "mload", + "nativeSrc": "67:5:1", "nodeType": "YulIdentifier", "src": "67:5:1" }, + "nativeSrc": "67:9:1", "nodeType": "YulFunctionCall", "src": "67:9:1" }, @@ -48,6 +54,7 @@ [ { "name": "memPtr", + "nativeSrc": "57:6:1", "nodeType": "YulIdentifier", "src": "57:6:1" } @@ -56,11 +63,13 @@ ] }, "name": "allocate_unbounded", + "nativeSrc": "7:75:1", "nodeType": "YulFunctionDefinition", "returnVariables": [ { "name": "memPtr", + "nativeSrc": "40:6:1", "nodeType": "YulTypedName", "src": "40:6:1", "type": "" @@ -71,6 +80,7 @@ { "body": { + "nativeSrc": "177:28:1", "nodeType": "YulBlock", "src": "177:28:1", "statements": @@ -82,6 +92,7 @@ [ { "kind": "number", + "nativeSrc": "194:1:1", "nodeType": "YulLiteral", "src": "194:1:1", "type": "", @@ -89,6 +100,7 @@ }, { "kind": "number", + "nativeSrc": "197:1:1", "nodeType": "YulLiteral", "src": "197:1:1", "type": "", @@ -98,24 +110,29 @@ "functionName": { "name": "revert", + "nativeSrc": "187:6:1", "nodeType": "YulIdentifier", "src": "187:6:1" }, + "nativeSrc": "187:12:1", "nodeType": "YulFunctionCall", "src": "187:12:1" }, + "nativeSrc": "187:12:1", "nodeType": "YulExpressionStatement", "src": "187:12:1" } ] }, "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nativeSrc": "88:117:1", "nodeType": "YulFunctionDefinition", "src": "88:117:1" }, { "body": { + "nativeSrc": "300:28:1", "nodeType": "YulBlock", "src": "300:28:1", "statements": @@ -127,6 +144,7 @@ [ { "kind": "number", + "nativeSrc": "317:1:1", "nodeType": "YulLiteral", "src": "317:1:1", "type": "", @@ -134,6 +152,7 @@ }, { "kind": "number", + "nativeSrc": "320:1:1", "nodeType": "YulLiteral", "src": "320:1:1", "type": "", @@ -143,24 +162,29 @@ "functionName": { "name": "revert", + "nativeSrc": "310:6:1", "nodeType": "YulIdentifier", "src": "310:6:1" }, + "nativeSrc": "310:12:1", "nodeType": "YulFunctionCall", "src": "310:12:1" }, + "nativeSrc": "310:12:1", "nodeType": "YulExpressionStatement", "src": "310:12:1" } ] }, "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nativeSrc": "211:117:1", "nodeType": "YulFunctionDefinition", "src": "211:117:1" }, { "body": { + "nativeSrc": "423:28:1", "nodeType": "YulBlock", "src": "423:28:1", "statements": @@ -172,6 +196,7 @@ [ { "kind": "number", + "nativeSrc": "440:1:1", "nodeType": "YulLiteral", "src": "440:1:1", "type": "", @@ -179,6 +204,7 @@ }, { "kind": "number", + "nativeSrc": "443:1:1", "nodeType": "YulLiteral", "src": "443:1:1", "type": "", @@ -188,24 +214,29 @@ "functionName": { "name": "revert", + "nativeSrc": "433:6:1", "nodeType": "YulIdentifier", "src": "433:6:1" }, + "nativeSrc": "433:12:1", "nodeType": "YulFunctionCall", "src": "433:12:1" }, + "nativeSrc": "433:12:1", "nodeType": "YulExpressionStatement", "src": "433:12:1" } ] }, "name": "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d", + "nativeSrc": "334:117:1", "nodeType": "YulFunctionDefinition", "src": "334:117:1" }, { "body": { + "nativeSrc": "546:28:1", "nodeType": "YulBlock", "src": "546:28:1", "statements": @@ -217,6 +248,7 @@ [ { "kind": "number", + "nativeSrc": "563:1:1", "nodeType": "YulLiteral", "src": "563:1:1", "type": "", @@ -224,6 +256,7 @@ }, { "kind": "number", + "nativeSrc": "566:1:1", "nodeType": "YulLiteral", "src": "566:1:1", "type": "", @@ -233,24 +266,29 @@ "functionName": { "name": "revert", + "nativeSrc": "556:6:1", "nodeType": "YulIdentifier", "src": "556:6:1" }, + "nativeSrc": "556:12:1", "nodeType": "YulFunctionCall", "src": "556:12:1" }, + "nativeSrc": "556:12:1", "nodeType": "YulExpressionStatement", "src": "556:12:1" } ] }, "name": "revert_error_15abf5612cd996bc235ba1e55a4a30ac60e6bb601ff7ba4ad3f179b6be8d0490", + "nativeSrc": "457:117:1", "nodeType": "YulFunctionDefinition", "src": "457:117:1" }, { "body": { + "nativeSrc": "669:28:1", "nodeType": "YulBlock", "src": "669:28:1", "statements": @@ -262,6 +300,7 @@ [ { "kind": "number", + "nativeSrc": "686:1:1", "nodeType": "YulLiteral", "src": "686:1:1", "type": "", @@ -269,6 +308,7 @@ }, { "kind": "number", + "nativeSrc": "689:1:1", "nodeType": "YulLiteral", "src": "689:1:1", "type": "", @@ -278,24 +318,29 @@ "functionName": { "name": "revert", + "nativeSrc": "679:6:1", "nodeType": "YulIdentifier", "src": "679:6:1" }, + "nativeSrc": "679:12:1", "nodeType": "YulFunctionCall", "src": "679:12:1" }, + "nativeSrc": "679:12:1", "nodeType": "YulExpressionStatement", "src": "679:12:1" } ] }, "name": "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef", + "nativeSrc": "580:117:1", "nodeType": "YulFunctionDefinition", "src": "580:117:1" }, { "body": { + "nativeSrc": "810:478:1", "nodeType": "YulBlock", "src": "810:478:1", "statements": @@ -303,6 +348,7 @@ { "body": { + "nativeSrc": "859:83:1", "nodeType": "YulBlock", "src": "859:83:1", "statements": @@ -314,12 +360,15 @@ "functionName": { "name": "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d", + "nativeSrc": "861:77:1", "nodeType": "YulIdentifier", "src": "861:77:1" }, + "nativeSrc": "861:79:1", "nodeType": "YulFunctionCall", "src": "861:79:1" }, + "nativeSrc": "861:79:1", "nodeType": "YulExpressionStatement", "src": "861:79:1" } @@ -337,11 +386,13 @@ [ { "name": "offset", + "nativeSrc": "838:6:1", "nodeType": "YulIdentifier", "src": "838:6:1" }, { "kind": "number", + "nativeSrc": "846:4:1", "nodeType": "YulLiteral", "src": "846:4:1", "type": "", @@ -351,14 +402,17 @@ "functionName": { "name": "add", + "nativeSrc": "834:3:1", "nodeType": "YulIdentifier", "src": "834:3:1" }, + "nativeSrc": "834:17:1", "nodeType": "YulFunctionCall", "src": "834:17:1" }, { "name": "end", + "nativeSrc": "853:3:1", "nodeType": "YulIdentifier", "src": "853:3:1" } @@ -366,9 +420,11 @@ "functionName": { "name": "slt", + "nativeSrc": "830:3:1", "nodeType": "YulIdentifier", "src": "830:3:1" }, + "nativeSrc": "830:27:1", "nodeType": "YulFunctionCall", "src": "830:27:1" } @@ -376,16 +432,20 @@ "functionName": { "name": "iszero", + "nativeSrc": "823:6:1", "nodeType": "YulIdentifier", "src": "823:6:1" }, + "nativeSrc": "823:35:1", "nodeType": "YulFunctionCall", "src": "823:35:1" }, + "nativeSrc": "820:122:1", "nodeType": "YulIf", "src": "820:122:1" }, { + "nativeSrc": "951:30:1", "nodeType": "YulAssignment", "src": "951:30:1", "value": @@ -394,6 +454,7 @@ [ { "name": "offset", + "nativeSrc": "974:6:1", "nodeType": "YulIdentifier", "src": "974:6:1" } @@ -401,9 +462,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "961:12:1", "nodeType": "YulIdentifier", "src": "961:12:1" }, + "nativeSrc": "961:20:1", "nodeType": "YulFunctionCall", "src": "961:20:1" }, @@ -411,6 +474,7 @@ [ { "name": "length", + "nativeSrc": "951:6:1", "nodeType": "YulIdentifier", "src": "951:6:1" } @@ -419,6 +483,7 @@ { "body": { + "nativeSrc": "1024:83:1", "nodeType": "YulBlock", "src": "1024:83:1", "statements": @@ -430,12 +495,15 @@ "functionName": { "name": "revert_error_15abf5612cd996bc235ba1e55a4a30ac60e6bb601ff7ba4ad3f179b6be8d0490", + "nativeSrc": "1026:77:1", "nodeType": "YulIdentifier", "src": "1026:77:1" }, + "nativeSrc": "1026:79:1", "nodeType": "YulFunctionCall", "src": "1026:79:1" }, + "nativeSrc": "1026:79:1", "nodeType": "YulExpressionStatement", "src": "1026:79:1" } @@ -447,11 +515,13 @@ [ { "name": "length", + "nativeSrc": "996:6:1", "nodeType": "YulIdentifier", "src": "996:6:1" }, { "kind": "number", + "nativeSrc": "1004:18:1", "nodeType": "YulLiteral", "src": "1004:18:1", "type": "", @@ -461,16 +531,20 @@ "functionName": { "name": "gt", + "nativeSrc": "993:2:1", "nodeType": "YulIdentifier", "src": "993:2:1" }, + "nativeSrc": "993:30:1", "nodeType": "YulFunctionCall", "src": "993:30:1" }, + "nativeSrc": "990:117:1", "nodeType": "YulIf", "src": "990:117:1" }, { + "nativeSrc": "1116:29:1", "nodeType": "YulAssignment", "src": "1116:29:1", "value": @@ -479,11 +553,13 @@ [ { "name": "offset", + "nativeSrc": "1132:6:1", "nodeType": "YulIdentifier", "src": "1132:6:1" }, { "kind": "number", + "nativeSrc": "1140:4:1", "nodeType": "YulLiteral", "src": "1140:4:1", "type": "", @@ -493,9 +569,11 @@ "functionName": { "name": "add", + "nativeSrc": "1128:3:1", "nodeType": "YulIdentifier", "src": "1128:3:1" }, + "nativeSrc": "1128:17:1", "nodeType": "YulFunctionCall", "src": "1128:17:1" }, @@ -503,6 +581,7 @@ [ { "name": "arrayPos", + "nativeSrc": "1116:8:1", "nodeType": "YulIdentifier", "src": "1116:8:1" } @@ -511,6 +590,7 @@ { "body": { + "nativeSrc": "1199:83:1", "nodeType": "YulBlock", "src": "1199:83:1", "statements": @@ -522,12 +602,15 @@ "functionName": { "name": "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef", + "nativeSrc": "1201:77:1", "nodeType": "YulIdentifier", "src": "1201:77:1" }, + "nativeSrc": "1201:79:1", "nodeType": "YulFunctionCall", "src": "1201:79:1" }, + "nativeSrc": "1201:79:1", "nodeType": "YulExpressionStatement", "src": "1201:79:1" } @@ -542,6 +625,7 @@ [ { "name": "arrayPos", + "nativeSrc": "1164:8:1", "nodeType": "YulIdentifier", "src": "1164:8:1" }, @@ -550,11 +634,13 @@ [ { "name": "length", + "nativeSrc": "1178:6:1", "nodeType": "YulIdentifier", "src": "1178:6:1" }, { "kind": "number", + "nativeSrc": "1186:4:1", "nodeType": "YulLiteral", "src": "1186:4:1", "type": "", @@ -564,9 +650,11 @@ "functionName": { "name": "mul", + "nativeSrc": "1174:3:1", "nodeType": "YulIdentifier", "src": "1174:3:1" }, + "nativeSrc": "1174:17:1", "nodeType": "YulFunctionCall", "src": "1174:17:1" } @@ -574,14 +662,17 @@ "functionName": { "name": "add", + "nativeSrc": "1160:3:1", "nodeType": "YulIdentifier", "src": "1160:3:1" }, + "nativeSrc": "1160:32:1", "nodeType": "YulFunctionCall", "src": "1160:32:1" }, { "name": "end", + "nativeSrc": "1194:3:1", "nodeType": "YulIdentifier", "src": "1194:3:1" } @@ -589,29 +680,35 @@ "functionName": { "name": "gt", + "nativeSrc": "1157:2:1", "nodeType": "YulIdentifier", "src": "1157:2:1" }, + "nativeSrc": "1157:41:1", "nodeType": "YulFunctionCall", "src": "1157:41:1" }, + "nativeSrc": "1154:128:1", "nodeType": "YulIf", "src": "1154:128:1" } ] }, "name": "abi_decode_t_array$_t_uint256_$dyn_calldata_ptr", + "nativeSrc": "720:568:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "offset", + "nativeSrc": "777:6:1", "nodeType": "YulTypedName", "src": "777:6:1", "type": "" }, { "name": "end", + "nativeSrc": "785:3:1", "nodeType": "YulTypedName", "src": "785:3:1", "type": "" @@ -621,12 +718,14 @@ [ { "name": "arrayPos", + "nativeSrc": "793:8:1", "nodeType": "YulTypedName", "src": "793:8:1", "type": "" }, { "name": "length", + "nativeSrc": "803:6:1", "nodeType": "YulTypedName", "src": "803:6:1", "type": "" @@ -637,6 +736,7 @@ { "body": { + "nativeSrc": "1395:458:1", "nodeType": "YulBlock", "src": "1395:458:1", "statements": @@ -644,6 +744,7 @@ { "body": { + "nativeSrc": "1441:83:1", "nodeType": "YulBlock", "src": "1441:83:1", "statements": @@ -655,12 +756,15 @@ "functionName": { "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nativeSrc": "1443:77:1", "nodeType": "YulIdentifier", "src": "1443:77:1" }, + "nativeSrc": "1443:79:1", "nodeType": "YulFunctionCall", "src": "1443:79:1" }, + "nativeSrc": "1443:79:1", "nodeType": "YulExpressionStatement", "src": "1443:79:1" } @@ -675,11 +779,13 @@ [ { "name": "dataEnd", + "nativeSrc": "1416:7:1", "nodeType": "YulIdentifier", "src": "1416:7:1" }, { "name": "headStart", + "nativeSrc": "1425:9:1", "nodeType": "YulIdentifier", "src": "1425:9:1" } @@ -687,14 +793,17 @@ "functionName": { "name": "sub", + "nativeSrc": "1412:3:1", "nodeType": "YulIdentifier", "src": "1412:3:1" }, + "nativeSrc": "1412:23:1", "nodeType": "YulFunctionCall", "src": "1412:23:1" }, { "kind": "number", + "nativeSrc": "1437:2:1", "nodeType": "YulLiteral", "src": "1437:2:1", "type": "", @@ -704,21 +813,26 @@ "functionName": { "name": "slt", + "nativeSrc": "1408:3:1", "nodeType": "YulIdentifier", "src": "1408:3:1" }, + "nativeSrc": "1408:32:1", "nodeType": "YulFunctionCall", "src": "1408:32:1" }, + "nativeSrc": "1405:119:1", "nodeType": "YulIf", "src": "1405:119:1" }, { + "nativeSrc": "1534:312:1", "nodeType": "YulBlock", "src": "1534:312:1", "statements": [ { + "nativeSrc": "1549:45:1", "nodeType": "YulVariableDeclaration", "src": "1549:45:1", "value": @@ -730,11 +844,13 @@ [ { "name": "headStart", + "nativeSrc": "1580:9:1", "nodeType": "YulIdentifier", "src": "1580:9:1" }, { "kind": "number", + "nativeSrc": "1591:1:1", "nodeType": "YulLiteral", "src": "1591:1:1", "type": "", @@ -744,9 +860,11 @@ "functionName": { "name": "add", + "nativeSrc": "1576:3:1", "nodeType": "YulIdentifier", "src": "1576:3:1" }, + "nativeSrc": "1576:17:1", "nodeType": "YulFunctionCall", "src": "1576:17:1" } @@ -754,9 +872,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "1563:12:1", "nodeType": "YulIdentifier", "src": "1563:12:1" }, + "nativeSrc": "1563:31:1", "nodeType": "YulFunctionCall", "src": "1563:31:1" }, @@ -764,6 +884,7 @@ [ { "name": "offset", + "nativeSrc": "1553:6:1", "nodeType": "YulTypedName", "src": "1553:6:1", "type": "" @@ -773,6 +894,7 @@ { "body": { + "nativeSrc": "1641:83:1", "nodeType": "YulBlock", "src": "1641:83:1", "statements": @@ -784,12 +906,15 @@ "functionName": { "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nativeSrc": "1643:77:1", "nodeType": "YulIdentifier", "src": "1643:77:1" }, + "nativeSrc": "1643:79:1", "nodeType": "YulFunctionCall", "src": "1643:79:1" }, + "nativeSrc": "1643:79:1", "nodeType": "YulExpressionStatement", "src": "1643:79:1" } @@ -801,11 +926,13 @@ [ { "name": "offset", + "nativeSrc": "1613:6:1", "nodeType": "YulIdentifier", "src": "1613:6:1" }, { "kind": "number", + "nativeSrc": "1621:18:1", "nodeType": "YulLiteral", "src": "1621:18:1", "type": "", @@ -815,16 +942,20 @@ "functionName": { "name": "gt", + "nativeSrc": "1610:2:1", "nodeType": "YulIdentifier", "src": "1610:2:1" }, + "nativeSrc": "1610:30:1", "nodeType": "YulFunctionCall", "src": "1610:30:1" }, + "nativeSrc": "1607:117:1", "nodeType": "YulIf", "src": "1607:117:1" }, { + "nativeSrc": "1738:98:1", "nodeType": "YulAssignment", "src": "1738:98:1", "value": @@ -836,11 +967,13 @@ [ { "name": "headStart", + "nativeSrc": "1808:9:1", "nodeType": "YulIdentifier", "src": "1808:9:1" }, { "name": "offset", + "nativeSrc": "1819:6:1", "nodeType": "YulIdentifier", "src": "1819:6:1" } @@ -848,14 +981,17 @@ "functionName": { "name": "add", + "nativeSrc": "1804:3:1", "nodeType": "YulIdentifier", "src": "1804:3:1" }, + "nativeSrc": "1804:22:1", "nodeType": "YulFunctionCall", "src": "1804:22:1" }, { "name": "dataEnd", + "nativeSrc": "1828:7:1", "nodeType": "YulIdentifier", "src": "1828:7:1" } @@ -863,9 +999,11 @@ "functionName": { "name": "abi_decode_t_array$_t_uint256_$dyn_calldata_ptr", + "nativeSrc": "1756:47:1", "nodeType": "YulIdentifier", "src": "1756:47:1" }, + "nativeSrc": "1756:80:1", "nodeType": "YulFunctionCall", "src": "1756:80:1" }, @@ -873,11 +1011,13 @@ [ { "name": "value0", + "nativeSrc": "1738:6:1", "nodeType": "YulIdentifier", "src": "1738:6:1" }, { "name": "value1", + "nativeSrc": "1746:6:1", "nodeType": "YulIdentifier", "src": "1746:6:1" } @@ -888,17 +1028,20 @@ ] }, "name": "abi_decode_tuple_t_array$_t_uint256_$dyn_calldata_ptr", + "nativeSrc": "1294:559:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", + "nativeSrc": "1357:9:1", "nodeType": "YulTypedName", "src": "1357:9:1", "type": "" }, { "name": "dataEnd", + "nativeSrc": "1368:7:1", "nodeType": "YulTypedName", "src": "1368:7:1", "type": "" @@ -908,12 +1051,14 @@ [ { "name": "value0", + "nativeSrc": "1380:6:1", "nodeType": "YulTypedName", "src": "1380:6:1", "type": "" }, { "name": "value1", + "nativeSrc": "1388:6:1", "nodeType": "YulTypedName", "src": "1388:6:1", "type": "" diff --git a/test/cmdlineTests/standard_generatedSources/output.json b/test/cmdlineTests/standard_generatedSources/output.json index e56ddaa80a96..350d108991bd 100644 --- a/test/cmdlineTests/standard_generatedSources/output.json +++ b/test/cmdlineTests/standard_generatedSources/output.json @@ -19,6 +19,7 @@ { "ast": { + "nativeSrc": "0:3989:1", "nodeType": "YulBlock", "src": "0:3989:1", "statements": @@ -26,11 +27,13 @@ { "body": { + "nativeSrc": "47:35:1", "nodeType": "YulBlock", "src": "47:35:1", "statements": [ { + "nativeSrc": "57:19:1", "nodeType": "YulAssignment", "src": "57:19:1", "value": @@ -39,6 +42,7 @@ [ { "kind": "number", + "nativeSrc": "73:2:1", "nodeType": "YulLiteral", "src": "73:2:1", "type": "", @@ -48,9 +52,11 @@ "functionName": { "name": "mload", + "nativeSrc": "67:5:1", "nodeType": "YulIdentifier", "src": "67:5:1" }, + "nativeSrc": "67:9:1", "nodeType": "YulFunctionCall", "src": "67:9:1" }, @@ -58,6 +64,7 @@ [ { "name": "memPtr", + "nativeSrc": "57:6:1", "nodeType": "YulIdentifier", "src": "57:6:1" } @@ -66,11 +73,13 @@ ] }, "name": "allocate_unbounded", + "nativeSrc": "7:75:1", "nodeType": "YulFunctionDefinition", "returnVariables": [ { "name": "memPtr", + "nativeSrc": "40:6:1", "nodeType": "YulTypedName", "src": "40:6:1", "type": "" @@ -81,6 +90,7 @@ { "body": { + "nativeSrc": "177:28:1", "nodeType": "YulBlock", "src": "177:28:1", "statements": @@ -92,6 +102,7 @@ [ { "kind": "number", + "nativeSrc": "194:1:1", "nodeType": "YulLiteral", "src": "194:1:1", "type": "", @@ -99,6 +110,7 @@ }, { "kind": "number", + "nativeSrc": "197:1:1", "nodeType": "YulLiteral", "src": "197:1:1", "type": "", @@ -108,24 +120,29 @@ "functionName": { "name": "revert", + "nativeSrc": "187:6:1", "nodeType": "YulIdentifier", "src": "187:6:1" }, + "nativeSrc": "187:12:1", "nodeType": "YulFunctionCall", "src": "187:12:1" }, + "nativeSrc": "187:12:1", "nodeType": "YulExpressionStatement", "src": "187:12:1" } ] }, "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nativeSrc": "88:117:1", "nodeType": "YulFunctionDefinition", "src": "88:117:1" }, { "body": { + "nativeSrc": "300:28:1", "nodeType": "YulBlock", "src": "300:28:1", "statements": @@ -137,6 +154,7 @@ [ { "kind": "number", + "nativeSrc": "317:1:1", "nodeType": "YulLiteral", "src": "317:1:1", "type": "", @@ -144,6 +162,7 @@ }, { "kind": "number", + "nativeSrc": "320:1:1", "nodeType": "YulLiteral", "src": "320:1:1", "type": "", @@ -153,24 +172,29 @@ "functionName": { "name": "revert", + "nativeSrc": "310:6:1", "nodeType": "YulIdentifier", "src": "310:6:1" }, + "nativeSrc": "310:12:1", "nodeType": "YulFunctionCall", "src": "310:12:1" }, + "nativeSrc": "310:12:1", "nodeType": "YulExpressionStatement", "src": "310:12:1" } ] }, "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nativeSrc": "211:117:1", "nodeType": "YulFunctionDefinition", "src": "211:117:1" }, { "body": { + "nativeSrc": "423:28:1", "nodeType": "YulBlock", "src": "423:28:1", "statements": @@ -182,6 +206,7 @@ [ { "kind": "number", + "nativeSrc": "440:1:1", "nodeType": "YulLiteral", "src": "440:1:1", "type": "", @@ -189,6 +214,7 @@ }, { "kind": "number", + "nativeSrc": "443:1:1", "nodeType": "YulLiteral", "src": "443:1:1", "type": "", @@ -198,29 +224,35 @@ "functionName": { "name": "revert", + "nativeSrc": "433:6:1", "nodeType": "YulIdentifier", "src": "433:6:1" }, + "nativeSrc": "433:12:1", "nodeType": "YulFunctionCall", "src": "433:12:1" }, + "nativeSrc": "433:12:1", "nodeType": "YulExpressionStatement", "src": "433:12:1" } ] }, "name": "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d", + "nativeSrc": "334:117:1", "nodeType": "YulFunctionDefinition", "src": "334:117:1" }, { "body": { + "nativeSrc": "505:54:1", "nodeType": "YulBlock", "src": "505:54:1", "statements": [ { + "nativeSrc": "515:38:1", "nodeType": "YulAssignment", "src": "515:38:1", "value": @@ -232,11 +264,13 @@ [ { "name": "value", + "nativeSrc": "533:5:1", "nodeType": "YulIdentifier", "src": "533:5:1" }, { "kind": "number", + "nativeSrc": "540:2:1", "nodeType": "YulLiteral", "src": "540:2:1", "type": "", @@ -246,9 +280,11 @@ "functionName": { "name": "add", + "nativeSrc": "529:3:1", "nodeType": "YulIdentifier", "src": "529:3:1" }, + "nativeSrc": "529:14:1", "nodeType": "YulFunctionCall", "src": "529:14:1" }, @@ -257,6 +293,7 @@ [ { "kind": "number", + "nativeSrc": "549:2:1", "nodeType": "YulLiteral", "src": "549:2:1", "type": "", @@ -266,9 +303,11 @@ "functionName": { "name": "not", + "nativeSrc": "545:3:1", "nodeType": "YulIdentifier", "src": "545:3:1" }, + "nativeSrc": "545:7:1", "nodeType": "YulFunctionCall", "src": "545:7:1" } @@ -276,9 +315,11 @@ "functionName": { "name": "and", + "nativeSrc": "525:3:1", "nodeType": "YulIdentifier", "src": "525:3:1" }, + "nativeSrc": "525:28:1", "nodeType": "YulFunctionCall", "src": "525:28:1" }, @@ -286,6 +327,7 @@ [ { "name": "result", + "nativeSrc": "515:6:1", "nodeType": "YulIdentifier", "src": "515:6:1" } @@ -294,11 +336,13 @@ ] }, "name": "round_up_to_mul_of_32", + "nativeSrc": "457:102:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", + "nativeSrc": "488:5:1", "nodeType": "YulTypedName", "src": "488:5:1", "type": "" @@ -308,6 +352,7 @@ [ { "name": "result", + "nativeSrc": "498:6:1", "nodeType": "YulTypedName", "src": "498:6:1", "type": "" @@ -318,6 +363,7 @@ { "body": { + "nativeSrc": "593:152:1", "nodeType": "YulBlock", "src": "593:152:1", "statements": @@ -329,6 +375,7 @@ [ { "kind": "number", + "nativeSrc": "610:1:1", "nodeType": "YulLiteral", "src": "610:1:1", "type": "", @@ -336,6 +383,7 @@ }, { "kind": "number", + "nativeSrc": "613:77:1", "nodeType": "YulLiteral", "src": "613:77:1", "type": "", @@ -345,12 +393,15 @@ "functionName": { "name": "mstore", + "nativeSrc": "603:6:1", "nodeType": "YulIdentifier", "src": "603:6:1" }, + "nativeSrc": "603:88:1", "nodeType": "YulFunctionCall", "src": "603:88:1" }, + "nativeSrc": "603:88:1", "nodeType": "YulExpressionStatement", "src": "603:88:1" }, @@ -361,6 +412,7 @@ [ { "kind": "number", + "nativeSrc": "707:1:1", "nodeType": "YulLiteral", "src": "707:1:1", "type": "", @@ -368,6 +420,7 @@ }, { "kind": "number", + "nativeSrc": "710:4:1", "nodeType": "YulLiteral", "src": "710:4:1", "type": "", @@ -377,12 +430,15 @@ "functionName": { "name": "mstore", + "nativeSrc": "700:6:1", "nodeType": "YulIdentifier", "src": "700:6:1" }, + "nativeSrc": "700:15:1", "nodeType": "YulFunctionCall", "src": "700:15:1" }, + "nativeSrc": "700:15:1", "nodeType": "YulExpressionStatement", "src": "700:15:1" }, @@ -393,6 +449,7 @@ [ { "kind": "number", + "nativeSrc": "731:1:1", "nodeType": "YulLiteral", "src": "731:1:1", "type": "", @@ -400,6 +457,7 @@ }, { "kind": "number", + "nativeSrc": "734:4:1", "nodeType": "YulLiteral", "src": "734:4:1", "type": "", @@ -409,29 +467,35 @@ "functionName": { "name": "revert", + "nativeSrc": "724:6:1", "nodeType": "YulIdentifier", "src": "724:6:1" }, + "nativeSrc": "724:15:1", "nodeType": "YulFunctionCall", "src": "724:15:1" }, + "nativeSrc": "724:15:1", "nodeType": "YulExpressionStatement", "src": "724:15:1" } ] }, "name": "panic_error_0x41", + "nativeSrc": "565:180:1", "nodeType": "YulFunctionDefinition", "src": "565:180:1" }, { "body": { + "nativeSrc": "794:238:1", "nodeType": "YulBlock", "src": "794:238:1", "statements": [ { + "nativeSrc": "804:58:1", "nodeType": "YulVariableDeclaration", "src": "804:58:1", "value": @@ -440,6 +504,7 @@ [ { "name": "memPtr", + "nativeSrc": "826:6:1", "nodeType": "YulIdentifier", "src": "826:6:1" }, @@ -448,6 +513,7 @@ [ { "name": "size", + "nativeSrc": "856:4:1", "nodeType": "YulIdentifier", "src": "856:4:1" } @@ -455,9 +521,11 @@ "functionName": { "name": "round_up_to_mul_of_32", + "nativeSrc": "834:21:1", "nodeType": "YulIdentifier", "src": "834:21:1" }, + "nativeSrc": "834:27:1", "nodeType": "YulFunctionCall", "src": "834:27:1" } @@ -465,9 +533,11 @@ "functionName": { "name": "add", + "nativeSrc": "822:3:1", "nodeType": "YulIdentifier", "src": "822:3:1" }, + "nativeSrc": "822:40:1", "nodeType": "YulFunctionCall", "src": "822:40:1" }, @@ -475,6 +545,7 @@ [ { "name": "newFreePtr", + "nativeSrc": "808:10:1", "nodeType": "YulTypedName", "src": "808:10:1", "type": "" @@ -484,6 +555,7 @@ { "body": { + "nativeSrc": "973:22:1", "nodeType": "YulBlock", "src": "973:22:1", "statements": @@ -495,12 +567,15 @@ "functionName": { "name": "panic_error_0x41", + "nativeSrc": "975:16:1", "nodeType": "YulIdentifier", "src": "975:16:1" }, + "nativeSrc": "975:18:1", "nodeType": "YulFunctionCall", "src": "975:18:1" }, + "nativeSrc": "975:18:1", "nodeType": "YulExpressionStatement", "src": "975:18:1" } @@ -515,11 +590,13 @@ [ { "name": "newFreePtr", + "nativeSrc": "916:10:1", "nodeType": "YulIdentifier", "src": "916:10:1" }, { "kind": "number", + "nativeSrc": "928:18:1", "nodeType": "YulLiteral", "src": "928:18:1", "type": "", @@ -529,9 +606,11 @@ "functionName": { "name": "gt", + "nativeSrc": "913:2:1", "nodeType": "YulIdentifier", "src": "913:2:1" }, + "nativeSrc": "913:34:1", "nodeType": "YulFunctionCall", "src": "913:34:1" }, @@ -540,11 +619,13 @@ [ { "name": "newFreePtr", + "nativeSrc": "952:10:1", "nodeType": "YulIdentifier", "src": "952:10:1" }, { "name": "memPtr", + "nativeSrc": "964:6:1", "nodeType": "YulIdentifier", "src": "964:6:1" } @@ -552,9 +633,11 @@ "functionName": { "name": "lt", + "nativeSrc": "949:2:1", "nodeType": "YulIdentifier", "src": "949:2:1" }, + "nativeSrc": "949:22:1", "nodeType": "YulFunctionCall", "src": "949:22:1" } @@ -562,12 +645,15 @@ "functionName": { "name": "or", + "nativeSrc": "910:2:1", "nodeType": "YulIdentifier", "src": "910:2:1" }, + "nativeSrc": "910:62:1", "nodeType": "YulFunctionCall", "src": "910:62:1" }, + "nativeSrc": "907:88:1", "nodeType": "YulIf", "src": "907:88:1" }, @@ -578,6 +664,7 @@ [ { "kind": "number", + "nativeSrc": "1011:2:1", "nodeType": "YulLiteral", "src": "1011:2:1", "type": "", @@ -585,6 +672,7 @@ }, { "name": "newFreePtr", + "nativeSrc": "1015:10:1", "nodeType": "YulIdentifier", "src": "1015:10:1" } @@ -592,29 +680,35 @@ "functionName": { "name": "mstore", + "nativeSrc": "1004:6:1", "nodeType": "YulIdentifier", "src": "1004:6:1" }, + "nativeSrc": "1004:22:1", "nodeType": "YulFunctionCall", "src": "1004:22:1" }, + "nativeSrc": "1004:22:1", "nodeType": "YulExpressionStatement", "src": "1004:22:1" } ] }, "name": "finalize_allocation", + "nativeSrc": "751:281:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "memPtr", + "nativeSrc": "780:6:1", "nodeType": "YulTypedName", "src": "780:6:1", "type": "" }, { "name": "size", + "nativeSrc": "788:4:1", "nodeType": "YulTypedName", "src": "788:4:1", "type": "" @@ -625,11 +719,13 @@ { "body": { + "nativeSrc": "1079:88:1", "nodeType": "YulBlock", "src": "1079:88:1", "statements": [ { + "nativeSrc": "1089:30:1", "nodeType": "YulAssignment", "src": "1089:30:1", "value": @@ -638,9 +734,11 @@ "functionName": { "name": "allocate_unbounded", + "nativeSrc": "1099:18:1", "nodeType": "YulIdentifier", "src": "1099:18:1" }, + "nativeSrc": "1099:20:1", "nodeType": "YulFunctionCall", "src": "1099:20:1" }, @@ -648,6 +746,7 @@ [ { "name": "memPtr", + "nativeSrc": "1089:6:1", "nodeType": "YulIdentifier", "src": "1089:6:1" } @@ -660,11 +759,13 @@ [ { "name": "memPtr", + "nativeSrc": "1148:6:1", "nodeType": "YulIdentifier", "src": "1148:6:1" }, { "name": "size", + "nativeSrc": "1156:4:1", "nodeType": "YulIdentifier", "src": "1156:4:1" } @@ -672,23 +773,28 @@ "functionName": { "name": "finalize_allocation", + "nativeSrc": "1128:19:1", "nodeType": "YulIdentifier", "src": "1128:19:1" }, + "nativeSrc": "1128:33:1", "nodeType": "YulFunctionCall", "src": "1128:33:1" }, + "nativeSrc": "1128:33:1", "nodeType": "YulExpressionStatement", "src": "1128:33:1" } ] }, "name": "allocate_memory", + "nativeSrc": "1038:129:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "size", + "nativeSrc": "1063:4:1", "nodeType": "YulTypedName", "src": "1063:4:1", "type": "" @@ -698,6 +804,7 @@ [ { "name": "memPtr", + "nativeSrc": "1072:6:1", "nodeType": "YulTypedName", "src": "1072:6:1", "type": "" @@ -708,6 +815,7 @@ { "body": { + "nativeSrc": "1255:229:1", "nodeType": "YulBlock", "src": "1255:229:1", "statements": @@ -715,6 +823,7 @@ { "body": { + "nativeSrc": "1360:22:1", "nodeType": "YulBlock", "src": "1360:22:1", "statements": @@ -726,12 +835,15 @@ "functionName": { "name": "panic_error_0x41", + "nativeSrc": "1362:16:1", "nodeType": "YulIdentifier", "src": "1362:16:1" }, + "nativeSrc": "1362:18:1", "nodeType": "YulFunctionCall", "src": "1362:18:1" }, + "nativeSrc": "1362:18:1", "nodeType": "YulExpressionStatement", "src": "1362:18:1" } @@ -743,11 +855,13 @@ [ { "name": "length", + "nativeSrc": "1332:6:1", "nodeType": "YulIdentifier", "src": "1332:6:1" }, { "kind": "number", + "nativeSrc": "1340:18:1", "nodeType": "YulLiteral", "src": "1340:18:1", "type": "", @@ -757,16 +871,20 @@ "functionName": { "name": "gt", + "nativeSrc": "1329:2:1", "nodeType": "YulIdentifier", "src": "1329:2:1" }, + "nativeSrc": "1329:30:1", "nodeType": "YulFunctionCall", "src": "1329:30:1" }, + "nativeSrc": "1326:56:1", "nodeType": "YulIf", "src": "1326:56:1" }, { + "nativeSrc": "1392:25:1", "nodeType": "YulAssignment", "src": "1392:25:1", "value": @@ -775,11 +893,13 @@ [ { "name": "length", + "nativeSrc": "1404:6:1", "nodeType": "YulIdentifier", "src": "1404:6:1" }, { "kind": "number", + "nativeSrc": "1412:4:1", "nodeType": "YulLiteral", "src": "1412:4:1", "type": "", @@ -789,9 +909,11 @@ "functionName": { "name": "mul", + "nativeSrc": "1400:3:1", "nodeType": "YulIdentifier", "src": "1400:3:1" }, + "nativeSrc": "1400:17:1", "nodeType": "YulFunctionCall", "src": "1400:17:1" }, @@ -799,12 +921,14 @@ [ { "name": "size", + "nativeSrc": "1392:4:1", "nodeType": "YulIdentifier", "src": "1392:4:1" } ] }, { + "nativeSrc": "1454:23:1", "nodeType": "YulAssignment", "src": "1454:23:1", "value": @@ -813,11 +937,13 @@ [ { "name": "size", + "nativeSrc": "1466:4:1", "nodeType": "YulIdentifier", "src": "1466:4:1" }, { "kind": "number", + "nativeSrc": "1472:4:1", "nodeType": "YulLiteral", "src": "1472:4:1", "type": "", @@ -827,9 +953,11 @@ "functionName": { "name": "add", + "nativeSrc": "1462:3:1", "nodeType": "YulIdentifier", "src": "1462:3:1" }, + "nativeSrc": "1462:15:1", "nodeType": "YulFunctionCall", "src": "1462:15:1" }, @@ -837,6 +965,7 @@ [ { "name": "size", + "nativeSrc": "1454:4:1", "nodeType": "YulIdentifier", "src": "1454:4:1" } @@ -845,11 +974,13 @@ ] }, "name": "array_allocation_size_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "1173:311:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "length", + "nativeSrc": "1239:6:1", "nodeType": "YulTypedName", "src": "1239:6:1", "type": "" @@ -859,6 +990,7 @@ [ { "name": "size", + "nativeSrc": "1250:4:1", "nodeType": "YulTypedName", "src": "1250:4:1", "type": "" @@ -869,6 +1001,7 @@ { "body": { + "nativeSrc": "1579:28:1", "nodeType": "YulBlock", "src": "1579:28:1", "statements": @@ -880,6 +1013,7 @@ [ { "kind": "number", + "nativeSrc": "1596:1:1", "nodeType": "YulLiteral", "src": "1596:1:1", "type": "", @@ -887,6 +1021,7 @@ }, { "kind": "number", + "nativeSrc": "1599:1:1", "nodeType": "YulLiteral", "src": "1599:1:1", "type": "", @@ -896,34 +1031,41 @@ "functionName": { "name": "revert", + "nativeSrc": "1589:6:1", "nodeType": "YulIdentifier", "src": "1589:6:1" }, + "nativeSrc": "1589:12:1", "nodeType": "YulFunctionCall", "src": "1589:12:1" }, + "nativeSrc": "1589:12:1", "nodeType": "YulExpressionStatement", "src": "1589:12:1" } ] }, "name": "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef", + "nativeSrc": "1490:117:1", "nodeType": "YulFunctionDefinition", "src": "1490:117:1" }, { "body": { + "nativeSrc": "1658:32:1", "nodeType": "YulBlock", "src": "1658:32:1", "statements": [ { + "nativeSrc": "1668:16:1", "nodeType": "YulAssignment", "src": "1668:16:1", "value": { "name": "value", + "nativeSrc": "1679:5:1", "nodeType": "YulIdentifier", "src": "1679:5:1" }, @@ -931,6 +1073,7 @@ [ { "name": "cleaned", + "nativeSrc": "1668:7:1", "nodeType": "YulIdentifier", "src": "1668:7:1" } @@ -939,11 +1082,13 @@ ] }, "name": "cleanup_t_uint256", + "nativeSrc": "1613:77:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", + "nativeSrc": "1640:5:1", "nodeType": "YulTypedName", "src": "1640:5:1", "type": "" @@ -953,6 +1098,7 @@ [ { "name": "cleaned", + "nativeSrc": "1650:7:1", "nodeType": "YulTypedName", "src": "1650:7:1", "type": "" @@ -963,6 +1109,7 @@ { "body": { + "nativeSrc": "1739:79:1", "nodeType": "YulBlock", "src": "1739:79:1", "statements": @@ -970,6 +1117,7 @@ { "body": { + "nativeSrc": "1796:16:1", "nodeType": "YulBlock", "src": "1796:16:1", "statements": @@ -981,6 +1129,7 @@ [ { "kind": "number", + "nativeSrc": "1805:1:1", "nodeType": "YulLiteral", "src": "1805:1:1", "type": "", @@ -988,6 +1137,7 @@ }, { "kind": "number", + "nativeSrc": "1808:1:1", "nodeType": "YulLiteral", "src": "1808:1:1", "type": "", @@ -997,12 +1147,15 @@ "functionName": { "name": "revert", + "nativeSrc": "1798:6:1", "nodeType": "YulIdentifier", "src": "1798:6:1" }, + "nativeSrc": "1798:12:1", "nodeType": "YulFunctionCall", "src": "1798:12:1" }, + "nativeSrc": "1798:12:1", "nodeType": "YulExpressionStatement", "src": "1798:12:1" } @@ -1017,6 +1170,7 @@ [ { "name": "value", + "nativeSrc": "1762:5:1", "nodeType": "YulIdentifier", "src": "1762:5:1" }, @@ -1025,6 +1179,7 @@ [ { "name": "value", + "nativeSrc": "1787:5:1", "nodeType": "YulIdentifier", "src": "1787:5:1" } @@ -1032,9 +1187,11 @@ "functionName": { "name": "cleanup_t_uint256", + "nativeSrc": "1769:17:1", "nodeType": "YulIdentifier", "src": "1769:17:1" }, + "nativeSrc": "1769:24:1", "nodeType": "YulFunctionCall", "src": "1769:24:1" } @@ -1042,9 +1199,11 @@ "functionName": { "name": "eq", + "nativeSrc": "1759:2:1", "nodeType": "YulIdentifier", "src": "1759:2:1" }, + "nativeSrc": "1759:35:1", "nodeType": "YulFunctionCall", "src": "1759:35:1" } @@ -1052,23 +1211,28 @@ "functionName": { "name": "iszero", + "nativeSrc": "1752:6:1", "nodeType": "YulIdentifier", "src": "1752:6:1" }, + "nativeSrc": "1752:43:1", "nodeType": "YulFunctionCall", "src": "1752:43:1" }, + "nativeSrc": "1749:63:1", "nodeType": "YulIf", "src": "1749:63:1" } ] }, "name": "validator_revert_t_uint256", + "nativeSrc": "1696:122:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", + "nativeSrc": "1732:5:1", "nodeType": "YulTypedName", "src": "1732:5:1", "type": "" @@ -1079,11 +1243,13 @@ { "body": { + "nativeSrc": "1876:87:1", "nodeType": "YulBlock", "src": "1876:87:1", "statements": [ { + "nativeSrc": "1886:29:1", "nodeType": "YulAssignment", "src": "1886:29:1", "value": @@ -1092,6 +1258,7 @@ [ { "name": "offset", + "nativeSrc": "1908:6:1", "nodeType": "YulIdentifier", "src": "1908:6:1" } @@ -1099,9 +1266,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "1895:12:1", "nodeType": "YulIdentifier", "src": "1895:12:1" }, + "nativeSrc": "1895:20:1", "nodeType": "YulFunctionCall", "src": "1895:20:1" }, @@ -1109,6 +1278,7 @@ [ { "name": "value", + "nativeSrc": "1886:5:1", "nodeType": "YulIdentifier", "src": "1886:5:1" } @@ -1121,6 +1291,7 @@ [ { "name": "value", + "nativeSrc": "1951:5:1", "nodeType": "YulIdentifier", "src": "1951:5:1" } @@ -1128,29 +1299,35 @@ "functionName": { "name": "validator_revert_t_uint256", + "nativeSrc": "1924:26:1", "nodeType": "YulIdentifier", "src": "1924:26:1" }, + "nativeSrc": "1924:33:1", "nodeType": "YulFunctionCall", "src": "1924:33:1" }, + "nativeSrc": "1924:33:1", "nodeType": "YulExpressionStatement", "src": "1924:33:1" } ] }, "name": "abi_decode_t_uint256", + "nativeSrc": "1824:139:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "offset", + "nativeSrc": "1854:6:1", "nodeType": "YulTypedName", "src": "1854:6:1", "type": "" }, { "name": "end", + "nativeSrc": "1862:3:1", "nodeType": "YulTypedName", "src": "1862:3:1", "type": "" @@ -1160,6 +1337,7 @@ [ { "name": "value", + "nativeSrc": "1870:5:1", "nodeType": "YulTypedName", "src": "1870:5:1", "type": "" @@ -1170,11 +1348,13 @@ { "body": { + "nativeSrc": "2088:608:1", "nodeType": "YulBlock", "src": "2088:608:1", "statements": [ { + "nativeSrc": "2098:90:1", "nodeType": "YulAssignment", "src": "2098:90:1", "value": @@ -1186,6 +1366,7 @@ [ { "name": "length", + "nativeSrc": "2180:6:1", "nodeType": "YulIdentifier", "src": "2180:6:1" } @@ -1193,9 +1374,11 @@ "functionName": { "name": "array_allocation_size_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "2123:56:1", "nodeType": "YulIdentifier", "src": "2123:56:1" }, + "nativeSrc": "2123:64:1", "nodeType": "YulFunctionCall", "src": "2123:64:1" } @@ -1203,9 +1386,11 @@ "functionName": { "name": "allocate_memory", + "nativeSrc": "2107:15:1", "nodeType": "YulIdentifier", "src": "2107:15:1" }, + "nativeSrc": "2107:81:1", "nodeType": "YulFunctionCall", "src": "2107:81:1" }, @@ -1213,17 +1398,20 @@ [ { "name": "array", + "nativeSrc": "2098:5:1", "nodeType": "YulIdentifier", "src": "2098:5:1" } ] }, { + "nativeSrc": "2197:16:1", "nodeType": "YulVariableDeclaration", "src": "2197:16:1", "value": { "name": "array", + "nativeSrc": "2208:5:1", "nodeType": "YulIdentifier", "src": "2208:5:1" }, @@ -1231,6 +1419,7 @@ [ { "name": "dst", + "nativeSrc": "2201:3:1", "nodeType": "YulTypedName", "src": "2201:3:1", "type": "" @@ -1244,11 +1433,13 @@ [ { "name": "array", + "nativeSrc": "2230:5:1", "nodeType": "YulIdentifier", "src": "2230:5:1" }, { "name": "length", + "nativeSrc": "2237:6:1", "nodeType": "YulIdentifier", "src": "2237:6:1" } @@ -1256,16 +1447,20 @@ "functionName": { "name": "mstore", + "nativeSrc": "2223:6:1", "nodeType": "YulIdentifier", "src": "2223:6:1" }, + "nativeSrc": "2223:21:1", "nodeType": "YulFunctionCall", "src": "2223:21:1" }, + "nativeSrc": "2223:21:1", "nodeType": "YulExpressionStatement", "src": "2223:21:1" }, { + "nativeSrc": "2253:23:1", "nodeType": "YulAssignment", "src": "2253:23:1", "value": @@ -1274,11 +1469,13 @@ [ { "name": "array", + "nativeSrc": "2264:5:1", "nodeType": "YulIdentifier", "src": "2264:5:1" }, { "kind": "number", + "nativeSrc": "2271:4:1", "nodeType": "YulLiteral", "src": "2271:4:1", "type": "", @@ -1288,9 +1485,11 @@ "functionName": { "name": "add", + "nativeSrc": "2260:3:1", "nodeType": "YulIdentifier", "src": "2260:3:1" }, + "nativeSrc": "2260:16:1", "nodeType": "YulFunctionCall", "src": "2260:16:1" }, @@ -1298,12 +1497,14 @@ [ { "name": "dst", + "nativeSrc": "2253:3:1", "nodeType": "YulIdentifier", "src": "2253:3:1" } ] }, { + "nativeSrc": "2286:44:1", "nodeType": "YulVariableDeclaration", "src": "2286:44:1", "value": @@ -1312,6 +1513,7 @@ [ { "name": "offset", + "nativeSrc": "2304:6:1", "nodeType": "YulIdentifier", "src": "2304:6:1" }, @@ -1320,11 +1522,13 @@ [ { "name": "length", + "nativeSrc": "2316:6:1", "nodeType": "YulIdentifier", "src": "2316:6:1" }, { "kind": "number", + "nativeSrc": "2324:4:1", "nodeType": "YulLiteral", "src": "2324:4:1", "type": "", @@ -1334,9 +1538,11 @@ "functionName": { "name": "mul", + "nativeSrc": "2312:3:1", "nodeType": "YulIdentifier", "src": "2312:3:1" }, + "nativeSrc": "2312:17:1", "nodeType": "YulFunctionCall", "src": "2312:17:1" } @@ -1344,9 +1550,11 @@ "functionName": { "name": "add", + "nativeSrc": "2300:3:1", "nodeType": "YulIdentifier", "src": "2300:3:1" }, + "nativeSrc": "2300:30:1", "nodeType": "YulFunctionCall", "src": "2300:30:1" }, @@ -1354,6 +1562,7 @@ [ { "name": "srcEnd", + "nativeSrc": "2290:6:1", "nodeType": "YulTypedName", "src": "2290:6:1", "type": "" @@ -1363,6 +1572,7 @@ { "body": { + "nativeSrc": "2358:103:1", "nodeType": "YulBlock", "src": "2358:103:1", "statements": @@ -1374,12 +1584,15 @@ "functionName": { "name": "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef", + "nativeSrc": "2372:77:1", "nodeType": "YulIdentifier", "src": "2372:77:1" }, + "nativeSrc": "2372:79:1", "nodeType": "YulFunctionCall", "src": "2372:79:1" }, + "nativeSrc": "2372:79:1", "nodeType": "YulExpressionStatement", "src": "2372:79:1" } @@ -1391,11 +1604,13 @@ [ { "name": "srcEnd", + "nativeSrc": "2345:6:1", "nodeType": "YulIdentifier", "src": "2345:6:1" }, { "name": "end", + "nativeSrc": "2353:3:1", "nodeType": "YulIdentifier", "src": "2353:3:1" } @@ -1403,28 +1618,34 @@ "functionName": { "name": "gt", + "nativeSrc": "2342:2:1", "nodeType": "YulIdentifier", "src": "2342:2:1" }, + "nativeSrc": "2342:15:1", "nodeType": "YulFunctionCall", "src": "2342:15:1" }, + "nativeSrc": "2339:122:1", "nodeType": "YulIf", "src": "2339:122:1" }, { "body": { + "nativeSrc": "2546:144:1", "nodeType": "YulBlock", "src": "2546:144:1", "statements": [ { + "nativeSrc": "2561:21:1", "nodeType": "YulVariableDeclaration", "src": "2561:21:1", "value": { "name": "src", + "nativeSrc": "2579:3:1", "nodeType": "YulIdentifier", "src": "2579:3:1" }, @@ -1432,6 +1653,7 @@ [ { "name": "elementPos", + "nativeSrc": "2565:10:1", "nodeType": "YulTypedName", "src": "2565:10:1", "type": "" @@ -1445,6 +1667,7 @@ [ { "name": "dst", + "nativeSrc": "2603:3:1", "nodeType": "YulIdentifier", "src": "2603:3:1" }, @@ -1453,11 +1676,13 @@ [ { "name": "elementPos", + "nativeSrc": "2629:10:1", "nodeType": "YulIdentifier", "src": "2629:10:1" }, { "name": "end", + "nativeSrc": "2641:3:1", "nodeType": "YulIdentifier", "src": "2641:3:1" } @@ -1465,9 +1690,11 @@ "functionName": { "name": "abi_decode_t_uint256", + "nativeSrc": "2608:20:1", "nodeType": "YulIdentifier", "src": "2608:20:1" }, + "nativeSrc": "2608:37:1", "nodeType": "YulFunctionCall", "src": "2608:37:1" } @@ -1475,16 +1702,20 @@ "functionName": { "name": "mstore", + "nativeSrc": "2596:6:1", "nodeType": "YulIdentifier", "src": "2596:6:1" }, + "nativeSrc": "2596:50:1", "nodeType": "YulFunctionCall", "src": "2596:50:1" }, + "nativeSrc": "2596:50:1", "nodeType": "YulExpressionStatement", "src": "2596:50:1" }, { + "nativeSrc": "2659:21:1", "nodeType": "YulAssignment", "src": "2659:21:1", "value": @@ -1493,11 +1724,13 @@ [ { "name": "dst", + "nativeSrc": "2670:3:1", "nodeType": "YulIdentifier", "src": "2670:3:1" }, { "kind": "number", + "nativeSrc": "2675:4:1", "nodeType": "YulLiteral", "src": "2675:4:1", "type": "", @@ -1507,9 +1740,11 @@ "functionName": { "name": "add", + "nativeSrc": "2666:3:1", "nodeType": "YulIdentifier", "src": "2666:3:1" }, + "nativeSrc": "2666:14:1", "nodeType": "YulFunctionCall", "src": "2666:14:1" }, @@ -1517,6 +1752,7 @@ [ { "name": "dst", + "nativeSrc": "2659:3:1", "nodeType": "YulIdentifier", "src": "2659:3:1" } @@ -1530,11 +1766,13 @@ [ { "name": "src", + "nativeSrc": "2499:3:1", "nodeType": "YulIdentifier", "src": "2499:3:1" }, { "name": "srcEnd", + "nativeSrc": "2504:6:1", "nodeType": "YulIdentifier", "src": "2504:6:1" } @@ -1542,20 +1780,25 @@ "functionName": { "name": "lt", + "nativeSrc": "2496:2:1", "nodeType": "YulIdentifier", "src": "2496:2:1" }, + "nativeSrc": "2496:15:1", "nodeType": "YulFunctionCall", "src": "2496:15:1" }, + "nativeSrc": "2470:220:1", "nodeType": "YulForLoop", "post": { + "nativeSrc": "2512:25:1", "nodeType": "YulBlock", "src": "2512:25:1", "statements": [ { + "nativeSrc": "2514:21:1", "nodeType": "YulAssignment", "src": "2514:21:1", "value": @@ -1564,11 +1807,13 @@ [ { "name": "src", + "nativeSrc": "2525:3:1", "nodeType": "YulIdentifier", "src": "2525:3:1" }, { "kind": "number", + "nativeSrc": "2530:4:1", "nodeType": "YulLiteral", "src": "2530:4:1", "type": "", @@ -1578,9 +1823,11 @@ "functionName": { "name": "add", + "nativeSrc": "2521:3:1", "nodeType": "YulIdentifier", "src": "2521:3:1" }, + "nativeSrc": "2521:14:1", "nodeType": "YulFunctionCall", "src": "2521:14:1" }, @@ -1588,6 +1835,7 @@ [ { "name": "src", + "nativeSrc": "2514:3:1", "nodeType": "YulIdentifier", "src": "2514:3:1" } @@ -1597,16 +1845,19 @@ }, "pre": { + "nativeSrc": "2474:21:1", "nodeType": "YulBlock", "src": "2474:21:1", "statements": [ { + "nativeSrc": "2476:17:1", "nodeType": "YulVariableDeclaration", "src": "2476:17:1", "value": { "name": "offset", + "nativeSrc": "2487:6:1", "nodeType": "YulIdentifier", "src": "2487:6:1" }, @@ -1614,6 +1865,7 @@ [ { "name": "src", + "nativeSrc": "2480:3:1", "nodeType": "YulTypedName", "src": "2480:3:1", "type": "" @@ -1627,23 +1879,27 @@ ] }, "name": "abi_decode_available_length_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "1986:710:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "offset", + "nativeSrc": "2058:6:1", "nodeType": "YulTypedName", "src": "2058:6:1", "type": "" }, { "name": "length", + "nativeSrc": "2066:6:1", "nodeType": "YulTypedName", "src": "2066:6:1", "type": "" }, { "name": "end", + "nativeSrc": "2074:3:1", "nodeType": "YulTypedName", "src": "2074:3:1", "type": "" @@ -1653,6 +1909,7 @@ [ { "name": "array", + "nativeSrc": "2082:5:1", "nodeType": "YulTypedName", "src": "2082:5:1", "type": "" @@ -1663,6 +1920,7 @@ { "body": { + "nativeSrc": "2796:293:1", "nodeType": "YulBlock", "src": "2796:293:1", "statements": @@ -1670,6 +1928,7 @@ { "body": { + "nativeSrc": "2845:83:1", "nodeType": "YulBlock", "src": "2845:83:1", "statements": @@ -1681,12 +1940,15 @@ "functionName": { "name": "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d", + "nativeSrc": "2847:77:1", "nodeType": "YulIdentifier", "src": "2847:77:1" }, + "nativeSrc": "2847:79:1", "nodeType": "YulFunctionCall", "src": "2847:79:1" }, + "nativeSrc": "2847:79:1", "nodeType": "YulExpressionStatement", "src": "2847:79:1" } @@ -1704,11 +1966,13 @@ [ { "name": "offset", + "nativeSrc": "2824:6:1", "nodeType": "YulIdentifier", "src": "2824:6:1" }, { "kind": "number", + "nativeSrc": "2832:4:1", "nodeType": "YulLiteral", "src": "2832:4:1", "type": "", @@ -1718,14 +1982,17 @@ "functionName": { "name": "add", + "nativeSrc": "2820:3:1", "nodeType": "YulIdentifier", "src": "2820:3:1" }, + "nativeSrc": "2820:17:1", "nodeType": "YulFunctionCall", "src": "2820:17:1" }, { "name": "end", + "nativeSrc": "2839:3:1", "nodeType": "YulIdentifier", "src": "2839:3:1" } @@ -1733,9 +2000,11 @@ "functionName": { "name": "slt", + "nativeSrc": "2816:3:1", "nodeType": "YulIdentifier", "src": "2816:3:1" }, + "nativeSrc": "2816:27:1", "nodeType": "YulFunctionCall", "src": "2816:27:1" } @@ -1743,16 +2012,20 @@ "functionName": { "name": "iszero", + "nativeSrc": "2809:6:1", "nodeType": "YulIdentifier", "src": "2809:6:1" }, + "nativeSrc": "2809:35:1", "nodeType": "YulFunctionCall", "src": "2809:35:1" }, + "nativeSrc": "2806:122:1", "nodeType": "YulIf", "src": "2806:122:1" }, { + "nativeSrc": "2937:34:1", "nodeType": "YulVariableDeclaration", "src": "2937:34:1", "value": @@ -1761,6 +2034,7 @@ [ { "name": "offset", + "nativeSrc": "2964:6:1", "nodeType": "YulIdentifier", "src": "2964:6:1" } @@ -1768,9 +2042,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "2951:12:1", "nodeType": "YulIdentifier", "src": "2951:12:1" }, + "nativeSrc": "2951:20:1", "nodeType": "YulFunctionCall", "src": "2951:20:1" }, @@ -1778,6 +2054,7 @@ [ { "name": "length", + "nativeSrc": "2941:6:1", "nodeType": "YulTypedName", "src": "2941:6:1", "type": "" @@ -1785,6 +2062,7 @@ ] }, { + "nativeSrc": "2980:103:1", "nodeType": "YulAssignment", "src": "2980:103:1", "value": @@ -1796,11 +2074,13 @@ [ { "name": "offset", + "nativeSrc": "3056:6:1", "nodeType": "YulIdentifier", "src": "3056:6:1" }, { "kind": "number", + "nativeSrc": "3064:4:1", "nodeType": "YulLiteral", "src": "3064:4:1", "type": "", @@ -1810,19 +2090,23 @@ "functionName": { "name": "add", + "nativeSrc": "3052:3:1", "nodeType": "YulIdentifier", "src": "3052:3:1" }, + "nativeSrc": "3052:17:1", "nodeType": "YulFunctionCall", "src": "3052:17:1" }, { "name": "length", + "nativeSrc": "3071:6:1", "nodeType": "YulIdentifier", "src": "3071:6:1" }, { "name": "end", + "nativeSrc": "3079:3:1", "nodeType": "YulIdentifier", "src": "3079:3:1" } @@ -1830,9 +2114,11 @@ "functionName": { "name": "abi_decode_available_length_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "2989:62:1", "nodeType": "YulIdentifier", "src": "2989:62:1" }, + "nativeSrc": "2989:94:1", "nodeType": "YulFunctionCall", "src": "2989:94:1" }, @@ -1840,6 +2126,7 @@ [ { "name": "array", + "nativeSrc": "2980:5:1", "nodeType": "YulIdentifier", "src": "2980:5:1" } @@ -1848,17 +2135,20 @@ ] }, "name": "abi_decode_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "2719:370:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "offset", + "nativeSrc": "2774:6:1", "nodeType": "YulTypedName", "src": "2774:6:1", "type": "" }, { "name": "end", + "nativeSrc": "2782:3:1", "nodeType": "YulTypedName", "src": "2782:3:1", "type": "" @@ -1868,6 +2158,7 @@ [ { "name": "array", + "nativeSrc": "2790:5:1", "nodeType": "YulTypedName", "src": "2790:5:1", "type": "" @@ -1878,6 +2169,7 @@ { "body": { + "nativeSrc": "3186:448:1", "nodeType": "YulBlock", "src": "3186:448:1", "statements": @@ -1885,6 +2177,7 @@ { "body": { + "nativeSrc": "3232:83:1", "nodeType": "YulBlock", "src": "3232:83:1", "statements": @@ -1896,12 +2189,15 @@ "functionName": { "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nativeSrc": "3234:77:1", "nodeType": "YulIdentifier", "src": "3234:77:1" }, + "nativeSrc": "3234:79:1", "nodeType": "YulFunctionCall", "src": "3234:79:1" }, + "nativeSrc": "3234:79:1", "nodeType": "YulExpressionStatement", "src": "3234:79:1" } @@ -1916,11 +2212,13 @@ [ { "name": "dataEnd", + "nativeSrc": "3207:7:1", "nodeType": "YulIdentifier", "src": "3207:7:1" }, { "name": "headStart", + "nativeSrc": "3216:9:1", "nodeType": "YulIdentifier", "src": "3216:9:1" } @@ -1928,14 +2226,17 @@ "functionName": { "name": "sub", + "nativeSrc": "3203:3:1", "nodeType": "YulIdentifier", "src": "3203:3:1" }, + "nativeSrc": "3203:23:1", "nodeType": "YulFunctionCall", "src": "3203:23:1" }, { "kind": "number", + "nativeSrc": "3228:2:1", "nodeType": "YulLiteral", "src": "3228:2:1", "type": "", @@ -1945,21 +2246,26 @@ "functionName": { "name": "slt", + "nativeSrc": "3199:3:1", "nodeType": "YulIdentifier", "src": "3199:3:1" }, + "nativeSrc": "3199:32:1", "nodeType": "YulFunctionCall", "src": "3199:32:1" }, + "nativeSrc": "3196:119:1", "nodeType": "YulIf", "src": "3196:119:1" }, { + "nativeSrc": "3325:302:1", "nodeType": "YulBlock", "src": "3325:302:1", "statements": [ { + "nativeSrc": "3340:45:1", "nodeType": "YulVariableDeclaration", "src": "3340:45:1", "value": @@ -1971,11 +2277,13 @@ [ { "name": "headStart", + "nativeSrc": "3371:9:1", "nodeType": "YulIdentifier", "src": "3371:9:1" }, { "kind": "number", + "nativeSrc": "3382:1:1", "nodeType": "YulLiteral", "src": "3382:1:1", "type": "", @@ -1985,9 +2293,11 @@ "functionName": { "name": "add", + "nativeSrc": "3367:3:1", "nodeType": "YulIdentifier", "src": "3367:3:1" }, + "nativeSrc": "3367:17:1", "nodeType": "YulFunctionCall", "src": "3367:17:1" } @@ -1995,9 +2305,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "3354:12:1", "nodeType": "YulIdentifier", "src": "3354:12:1" }, + "nativeSrc": "3354:31:1", "nodeType": "YulFunctionCall", "src": "3354:31:1" }, @@ -2005,6 +2317,7 @@ [ { "name": "offset", + "nativeSrc": "3344:6:1", "nodeType": "YulTypedName", "src": "3344:6:1", "type": "" @@ -2014,6 +2327,7 @@ { "body": { + "nativeSrc": "3432:83:1", "nodeType": "YulBlock", "src": "3432:83:1", "statements": @@ -2025,12 +2339,15 @@ "functionName": { "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nativeSrc": "3434:77:1", "nodeType": "YulIdentifier", "src": "3434:77:1" }, + "nativeSrc": "3434:79:1", "nodeType": "YulFunctionCall", "src": "3434:79:1" }, + "nativeSrc": "3434:79:1", "nodeType": "YulExpressionStatement", "src": "3434:79:1" } @@ -2042,11 +2359,13 @@ [ { "name": "offset", + "nativeSrc": "3404:6:1", "nodeType": "YulIdentifier", "src": "3404:6:1" }, { "kind": "number", + "nativeSrc": "3412:18:1", "nodeType": "YulLiteral", "src": "3412:18:1", "type": "", @@ -2056,16 +2375,20 @@ "functionName": { "name": "gt", + "nativeSrc": "3401:2:1", "nodeType": "YulIdentifier", "src": "3401:2:1" }, + "nativeSrc": "3401:30:1", "nodeType": "YulFunctionCall", "src": "3401:30:1" }, + "nativeSrc": "3398:117:1", "nodeType": "YulIf", "src": "3398:117:1" }, { + "nativeSrc": "3529:88:1", "nodeType": "YulAssignment", "src": "3529:88:1", "value": @@ -2077,11 +2400,13 @@ [ { "name": "headStart", + "nativeSrc": "3589:9:1", "nodeType": "YulIdentifier", "src": "3589:9:1" }, { "name": "offset", + "nativeSrc": "3600:6:1", "nodeType": "YulIdentifier", "src": "3600:6:1" } @@ -2089,14 +2414,17 @@ "functionName": { "name": "add", + "nativeSrc": "3585:3:1", "nodeType": "YulIdentifier", "src": "3585:3:1" }, + "nativeSrc": "3585:22:1", "nodeType": "YulFunctionCall", "src": "3585:22:1" }, { "name": "dataEnd", + "nativeSrc": "3609:7:1", "nodeType": "YulIdentifier", "src": "3609:7:1" } @@ -2104,9 +2432,11 @@ "functionName": { "name": "abi_decode_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "3539:45:1", "nodeType": "YulIdentifier", "src": "3539:45:1" }, + "nativeSrc": "3539:78:1", "nodeType": "YulFunctionCall", "src": "3539:78:1" }, @@ -2114,6 +2444,7 @@ [ { "name": "value0", + "nativeSrc": "3529:6:1", "nodeType": "YulIdentifier", "src": "3529:6:1" } @@ -2124,17 +2455,20 @@ ] }, "name": "abi_decode_tuple_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "3095:539:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", + "nativeSrc": "3156:9:1", "nodeType": "YulTypedName", "src": "3156:9:1", "type": "" }, { "name": "dataEnd", + "nativeSrc": "3167:7:1", "nodeType": "YulTypedName", "src": "3167:7:1", "type": "" @@ -2144,6 +2478,7 @@ [ { "name": "value0", + "nativeSrc": "3179:6:1", "nodeType": "YulTypedName", "src": "3179:6:1", "type": "" @@ -2154,6 +2489,7 @@ { "body": { + "nativeSrc": "3705:53:1", "nodeType": "YulBlock", "src": "3705:53:1", "statements": @@ -2165,6 +2501,7 @@ [ { "name": "pos", + "nativeSrc": "3722:3:1", "nodeType": "YulIdentifier", "src": "3722:3:1" }, @@ -2173,6 +2510,7 @@ [ { "name": "value", + "nativeSrc": "3745:5:1", "nodeType": "YulIdentifier", "src": "3745:5:1" } @@ -2180,9 +2518,11 @@ "functionName": { "name": "cleanup_t_uint256", + "nativeSrc": "3727:17:1", "nodeType": "YulIdentifier", "src": "3727:17:1" }, + "nativeSrc": "3727:24:1", "nodeType": "YulFunctionCall", "src": "3727:24:1" } @@ -2190,29 +2530,35 @@ "functionName": { "name": "mstore", + "nativeSrc": "3715:6:1", "nodeType": "YulIdentifier", "src": "3715:6:1" }, + "nativeSrc": "3715:37:1", "nodeType": "YulFunctionCall", "src": "3715:37:1" }, + "nativeSrc": "3715:37:1", "nodeType": "YulExpressionStatement", "src": "3715:37:1" } ] }, "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nativeSrc": "3640:118:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", + "nativeSrc": "3693:5:1", "nodeType": "YulTypedName", "src": "3693:5:1", "type": "" }, { "name": "pos", + "nativeSrc": "3700:3:1", "nodeType": "YulTypedName", "src": "3700:3:1", "type": "" @@ -2223,11 +2569,13 @@ { "body": { + "nativeSrc": "3862:124:1", "nodeType": "YulBlock", "src": "3862:124:1", "statements": [ { + "nativeSrc": "3872:26:1", "nodeType": "YulAssignment", "src": "3872:26:1", "value": @@ -2236,11 +2584,13 @@ [ { "name": "headStart", + "nativeSrc": "3884:9:1", "nodeType": "YulIdentifier", "src": "3884:9:1" }, { "kind": "number", + "nativeSrc": "3895:2:1", "nodeType": "YulLiteral", "src": "3895:2:1", "type": "", @@ -2250,9 +2600,11 @@ "functionName": { "name": "add", + "nativeSrc": "3880:3:1", "nodeType": "YulIdentifier", "src": "3880:3:1" }, + "nativeSrc": "3880:18:1", "nodeType": "YulFunctionCall", "src": "3880:18:1" }, @@ -2260,6 +2612,7 @@ [ { "name": "tail", + "nativeSrc": "3872:4:1", "nodeType": "YulIdentifier", "src": "3872:4:1" } @@ -2272,6 +2625,7 @@ [ { "name": "value0", + "nativeSrc": "3952:6:1", "nodeType": "YulIdentifier", "src": "3952:6:1" }, @@ -2280,11 +2634,13 @@ [ { "name": "headStart", + "nativeSrc": "3965:9:1", "nodeType": "YulIdentifier", "src": "3965:9:1" }, { "kind": "number", + "nativeSrc": "3976:1:1", "nodeType": "YulLiteral", "src": "3976:1:1", "type": "", @@ -2294,9 +2650,11 @@ "functionName": { "name": "add", + "nativeSrc": "3961:3:1", "nodeType": "YulIdentifier", "src": "3961:3:1" }, + "nativeSrc": "3961:17:1", "nodeType": "YulFunctionCall", "src": "3961:17:1" } @@ -2304,29 +2662,35 @@ "functionName": { "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nativeSrc": "3908:43:1", "nodeType": "YulIdentifier", "src": "3908:43:1" }, + "nativeSrc": "3908:71:1", "nodeType": "YulFunctionCall", "src": "3908:71:1" }, + "nativeSrc": "3908:71:1", "nodeType": "YulExpressionStatement", "src": "3908:71:1" } ] }, "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nativeSrc": "3764:222:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", + "nativeSrc": "3834:9:1", "nodeType": "YulTypedName", "src": "3834:9:1", "type": "" }, { "name": "value0", + "nativeSrc": "3846:6:1", "nodeType": "YulTypedName", "src": "3846:6:1", "type": "" @@ -2336,6 +2700,7 @@ [ { "name": "tail", + "nativeSrc": "3857:4:1", "nodeType": "YulTypedName", "src": "3857:4:1", "type": "" diff --git a/test/cmdlineTests/standard_irOptimized_ast_requested/in.sol b/test/cmdlineTests/standard_irOptimized_ast_requested/in.sol new file mode 100644 index 000000000000..a3a86cc8d317 --- /dev/null +++ b/test/cmdlineTests/standard_irOptimized_ast_requested/in.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C {} diff --git a/test/cmdlineTests/standard_irOptimized_ast_requested/input.json b/test/cmdlineTests/standard_irOptimized_ast_requested/input.json new file mode 100644 index 000000000000..fd16983068aa --- /dev/null +++ b/test/cmdlineTests/standard_irOptimized_ast_requested/input.json @@ -0,0 +1,9 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_irOptimized_ast_requested/in.sol"]} + }, + "settings": { + "outputSelection": {"*": {"*": ["irOptimizedAst"]}} + } +} diff --git a/test/cmdlineTests/standard_irOptimized_ast_requested/output.json b/test/cmdlineTests/standard_irOptimized_ast_requested/output.json new file mode 100644 index 000000000000..ed7138c8f423 --- /dev/null +++ b/test/cmdlineTests/standard_irOptimized_ast_requested/output.json @@ -0,0 +1,729 @@ +{ + "contracts": + { + "C": + { + "C": + { + "irOptimizedAst": + { + "code": + { + "block": + { + "nativeSrc": "44:790:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "103:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "119:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "107:11:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "107:16:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "96:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "96:28:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "96:28:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "148:83:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "150:77:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "150:79:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "150:79:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + } + ] + }, + "condition": + { + "arguments": [], + "functionName": + { + "name": "callvalue", + "nativeSrc": "136:9:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "136:11:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "133:98:0", + "nodeType": "YulIf", + "src": "56:13:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "constructor_C_2", + "nativeSrc": "241:15:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "241:17:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "241:17:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "nativeSrc": "268:30:0", + "nodeType": "YulVariableDeclaration", + "src": "56:13:0", + "value": + { + "arguments": [], + "functionName": + { + "name": "allocate_unbounded", + "nativeSrc": "278:18:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "278:20:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variables": + [ + { + "name": "_1", + "nativeSrc": "272:2:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "316:2:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "331:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "320:10:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "320:26:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "357:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "348:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "348:24:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "codecopy", + "nativeSrc": "307:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "307:66:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "307:66:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "390:2:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "403:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "394:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "394:24:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "return", + "nativeSrc": "383:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "383:36:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "383:36:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "469:43:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "nativeSrc": "483:19:0", + "nodeType": "YulAssignment", + "src": "56:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "499:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "493:5:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "493:9:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variableNames": + [ + { + "name": "memPtr", + "nativeSrc": "483:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nativeSrc": "429:83:0", + "nodeType": "YulFunctionDefinition", + "returnVariables": + [ + { + "name": "memPtr", + "nativeSrc": "462:6:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "611:36:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "632:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "635:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "625:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "625:12:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "625:12:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + } + ] + }, + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "522:125:0", + "nodeType": "YulFunctionDefinition", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "726:59:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": [] + }, + "name": "constructor_C_2", + "nativeSrc": "699:86:0", + "nodeType": "YulFunctionDefinition", + "src": "56:13:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2", + "nodeType": "YulObject", + "subObjects": + [ + { + "code": + { + "block": + { + "nativeSrc": "899:588:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "966:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "982:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "970:11:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "970:16:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "959:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "959:28:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "959:28:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1001:77:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1001:79:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "1001:79:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "1147:77:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "nativeSrc": "1165:44:0", + "nodeType": "YulAssignment", + "src": "56:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1198:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "224" + }, + { + "name": "value", + "nativeSrc": "1203:5:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "shr", + "nativeSrc": "1194:3:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1194:15:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variableNames": + [ + { + "name": "newValue", + "nativeSrc": "1165:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ] + } + ] + }, + "name": "shift_right_224_unsigned", + "nativeSrc": "1094:130:0", + "nodeType": "YulFunctionDefinition", + "parameters": + [ + { + "name": "value", + "nativeSrc": "1128:5:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "returnVariables": + [ + { + "name": "newValue", + "nativeSrc": "1138:8:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "1278:51:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "nativeSrc": "1296:19:0", + "nodeType": "YulAssignment", + "src": "56:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1312:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "1306:5:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1306:9:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variableNames": + [ + { + "name": "memPtr", + "nativeSrc": "1296:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nativeSrc": "1238:91:0", + "nodeType": "YulFunctionDefinition", + "returnVariables": + [ + { + "name": "memPtr", + "nativeSrc": "1271:6:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "1432:44:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1457:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "1460:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "1450:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1450:12:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "1450:12:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + } + ] + }, + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1343:133:0", + "nodeType": "YulFunctionDefinition", + "src": "56:13:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2_deployed", + "nodeType": "YulObject", + "subObjects": + [ + { + "nodeType": "YulData", + "value": "" + } + ] + } + ] + } + } + } + }, + "sources": + { + "C": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_ir_ast_requested/in.sol b/test/cmdlineTests/standard_ir_ast_requested/in.sol new file mode 100644 index 000000000000..a3a86cc8d317 --- /dev/null +++ b/test/cmdlineTests/standard_ir_ast_requested/in.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C {} diff --git a/test/cmdlineTests/standard_ir_ast_requested/input.json b/test/cmdlineTests/standard_ir_ast_requested/input.json new file mode 100644 index 000000000000..1cb1083a2ef6 --- /dev/null +++ b/test/cmdlineTests/standard_ir_ast_requested/input.json @@ -0,0 +1,9 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_ir_ast_requested/in.sol"]} + }, + "settings": { + "outputSelection": {"*": {"*": ["irAst"]}} + } +} diff --git a/test/cmdlineTests/standard_ir_ast_requested/output.json b/test/cmdlineTests/standard_ir_ast_requested/output.json new file mode 100644 index 000000000000..f949d7b30cb2 --- /dev/null +++ b/test/cmdlineTests/standard_ir_ast_requested/output.json @@ -0,0 +1,729 @@ +{ + "contracts": + { + "C": + { + "C": + { + "irAst": + { + "code": + { + "block": + { + "nativeSrc": "44:790:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "103:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "119:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "107:11:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "107:16:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "96:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "96:28:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "96:28:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "148:83:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "150:77:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "150:79:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "150:79:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + } + ] + }, + "condition": + { + "arguments": [], + "functionName": + { + "name": "callvalue", + "nativeSrc": "136:9:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "136:11:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "133:98:0", + "nodeType": "YulIf", + "src": "56:13:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "constructor_C_2", + "nativeSrc": "241:15:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "241:17:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "241:17:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "nativeSrc": "268:30:0", + "nodeType": "YulVariableDeclaration", + "src": "56:13:0", + "value": + { + "arguments": [], + "functionName": + { + "name": "allocate_unbounded", + "nativeSrc": "278:18:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "278:20:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variables": + [ + { + "name": "_1", + "nativeSrc": "272:2:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "316:2:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "331:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "320:10:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "320:26:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "357:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "348:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "348:24:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "codecopy", + "nativeSrc": "307:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "307:66:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "307:66:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "expression": + { + "arguments": + [ + { + "name": "_1", + "nativeSrc": "390:2:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "403:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "394:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "394:24:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "return", + "nativeSrc": "383:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "383:36:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "383:36:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "469:43:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "nativeSrc": "483:19:0", + "nodeType": "YulAssignment", + "src": "56:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "499:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "493:5:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "493:9:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variableNames": + [ + { + "name": "memPtr", + "nativeSrc": "483:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nativeSrc": "429:83:0", + "nodeType": "YulFunctionDefinition", + "returnVariables": + [ + { + "name": "memPtr", + "nativeSrc": "462:6:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "611:36:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "632:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "635:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "625:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "625:12:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "625:12:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + } + ] + }, + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "522:125:0", + "nodeType": "YulFunctionDefinition", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "726:59:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": [] + }, + "name": "constructor_C_2", + "nativeSrc": "699:86:0", + "nodeType": "YulFunctionDefinition", + "src": "56:13:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2", + "nodeType": "YulObject", + "subObjects": + [ + { + "code": + { + "block": + { + "nativeSrc": "899:588:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "966:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "982:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "970:11:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "970:16:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "959:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "959:28:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "959:28:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1001:77:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1001:79:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "1001:79:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "1147:77:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "nativeSrc": "1165:44:0", + "nodeType": "YulAssignment", + "src": "56:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1198:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "224" + }, + { + "name": "value", + "nativeSrc": "1203:5:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ], + "functionName": + { + "name": "shr", + "nativeSrc": "1194:3:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1194:15:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variableNames": + [ + { + "name": "newValue", + "nativeSrc": "1165:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ] + } + ] + }, + "name": "shift_right_224_unsigned", + "nativeSrc": "1094:130:0", + "nodeType": "YulFunctionDefinition", + "parameters": + [ + { + "name": "value", + "nativeSrc": "1128:5:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "returnVariables": + [ + { + "name": "newValue", + "nativeSrc": "1138:8:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "1278:51:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "nativeSrc": "1296:19:0", + "nodeType": "YulAssignment", + "src": "56:13:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1312:2:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "64" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "1306:5:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1306:9:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "variableNames": + [ + { + "name": "memPtr", + "nativeSrc": "1296:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nativeSrc": "1238:91:0", + "nodeType": "YulFunctionDefinition", + "returnVariables": + [ + { + "name": "memPtr", + "nativeSrc": "1271:6:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ], + "src": "56:13:0" + }, + { + "body": + { + "nativeSrc": "1432:44:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "1457:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "1460:1:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "1450:6:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "1450:12:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "1450:12:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" + } + ] + }, + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1343:133:0", + "nodeType": "YulFunctionDefinition", + "src": "56:13:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_2_deployed", + "nodeType": "YulObject", + "subObjects": + [ + { + "nodeType": "YulData", + "value": "" + } + ] + } + ] + } + } + } + }, + "sources": + { + "C": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_generatedSources/output.json b/test/cmdlineTests/standard_optimizer_generatedSources/output.json index 264241d03685..da2c31cbee25 100644 --- a/test/cmdlineTests/standard_optimizer_generatedSources/output.json +++ b/test/cmdlineTests/standard_optimizer_generatedSources/output.json @@ -19,11 +19,13 @@ { "ast": { + "nativeSrc": "0:1445:1", "nodeType": "YulBlock", "src": "0:1445:1", "statements": [ { + "nativeSrc": "6:3:1", "nodeType": "YulBlock", "src": "6:3:1", "statements": [] @@ -31,6 +33,7 @@ { "body": { + "nativeSrc": "46:95:1", "nodeType": "YulBlock", "src": "46:95:1", "statements": @@ -42,6 +45,7 @@ [ { "kind": "number", + "nativeSrc": "63:1:1", "nodeType": "YulLiteral", "src": "63:1:1", "type": "", @@ -52,6 +56,7 @@ [ { "kind": "number", + "nativeSrc": "70:3:1", "nodeType": "YulLiteral", "src": "70:3:1", "type": "", @@ -59,6 +64,7 @@ }, { "kind": "number", + "nativeSrc": "75:10:1", "nodeType": "YulLiteral", "src": "75:10:1", "type": "", @@ -68,9 +74,11 @@ "functionName": { "name": "shl", + "nativeSrc": "66:3:1", "nodeType": "YulIdentifier", "src": "66:3:1" }, + "nativeSrc": "66:20:1", "nodeType": "YulFunctionCall", "src": "66:20:1" } @@ -78,12 +86,15 @@ "functionName": { "name": "mstore", + "nativeSrc": "56:6:1", "nodeType": "YulIdentifier", "src": "56:6:1" }, + "nativeSrc": "56:31:1", "nodeType": "YulFunctionCall", "src": "56:31:1" }, + "nativeSrc": "56:31:1", "nodeType": "YulExpressionStatement", "src": "56:31:1" }, @@ -94,6 +105,7 @@ [ { "kind": "number", + "nativeSrc": "103:1:1", "nodeType": "YulLiteral", "src": "103:1:1", "type": "", @@ -101,6 +113,7 @@ }, { "kind": "number", + "nativeSrc": "106:4:1", "nodeType": "YulLiteral", "src": "106:4:1", "type": "", @@ -110,12 +123,15 @@ "functionName": { "name": "mstore", + "nativeSrc": "96:6:1", "nodeType": "YulIdentifier", "src": "96:6:1" }, + "nativeSrc": "96:15:1", "nodeType": "YulFunctionCall", "src": "96:15:1" }, + "nativeSrc": "96:15:1", "nodeType": "YulExpressionStatement", "src": "96:15:1" }, @@ -126,6 +142,7 @@ [ { "kind": "number", + "nativeSrc": "127:1:1", "nodeType": "YulLiteral", "src": "127:1:1", "type": "", @@ -133,6 +150,7 @@ }, { "kind": "number", + "nativeSrc": "130:4:1", "nodeType": "YulLiteral", "src": "130:4:1", "type": "", @@ -142,34 +160,41 @@ "functionName": { "name": "revert", + "nativeSrc": "120:6:1", "nodeType": "YulIdentifier", "src": "120:6:1" }, + "nativeSrc": "120:15:1", "nodeType": "YulFunctionCall", "src": "120:15:1" }, + "nativeSrc": "120:15:1", "nodeType": "YulExpressionStatement", "src": "120:15:1" } ] }, "name": "panic_error_0x41", + "nativeSrc": "14:127:1", "nodeType": "YulFunctionDefinition", "src": "14:127:1" }, { "body": { + "nativeSrc": "241:1020:1", "nodeType": "YulBlock", "src": "241:1020:1", "statements": [ { + "nativeSrc": "251:12:1", "nodeType": "YulVariableDeclaration", "src": "251:12:1", "value": { "kind": "number", + "nativeSrc": "261:2:1", "nodeType": "YulLiteral", "src": "261:2:1", "type": "", @@ -179,6 +204,7 @@ [ { "name": "_1", + "nativeSrc": "255:2:1", "nodeType": "YulTypedName", "src": "255:2:1", "type": "" @@ -188,6 +214,7 @@ { "body": { + "nativeSrc": "308:16:1", "nodeType": "YulBlock", "src": "308:16:1", "statements": @@ -199,6 +226,7 @@ [ { "kind": "number", + "nativeSrc": "317:1:1", "nodeType": "YulLiteral", "src": "317:1:1", "type": "", @@ -206,6 +234,7 @@ }, { "kind": "number", + "nativeSrc": "320:1:1", "nodeType": "YulLiteral", "src": "320:1:1", "type": "", @@ -215,12 +244,15 @@ "functionName": { "name": "revert", + "nativeSrc": "310:6:1", "nodeType": "YulIdentifier", "src": "310:6:1" }, + "nativeSrc": "310:12:1", "nodeType": "YulFunctionCall", "src": "310:12:1" }, + "nativeSrc": "310:12:1", "nodeType": "YulExpressionStatement", "src": "310:12:1" } @@ -235,11 +267,13 @@ [ { "name": "dataEnd", + "nativeSrc": "283:7:1", "nodeType": "YulIdentifier", "src": "283:7:1" }, { "name": "headStart", + "nativeSrc": "292:9:1", "nodeType": "YulIdentifier", "src": "292:9:1" } @@ -247,14 +281,17 @@ "functionName": { "name": "sub", + "nativeSrc": "279:3:1", "nodeType": "YulIdentifier", "src": "279:3:1" }, + "nativeSrc": "279:23:1", "nodeType": "YulFunctionCall", "src": "279:23:1" }, { "name": "_1", + "nativeSrc": "304:2:1", "nodeType": "YulIdentifier", "src": "304:2:1" } @@ -262,16 +299,20 @@ "functionName": { "name": "slt", + "nativeSrc": "275:3:1", "nodeType": "YulIdentifier", "src": "275:3:1" }, + "nativeSrc": "275:32:1", "nodeType": "YulFunctionCall", "src": "275:32:1" }, + "nativeSrc": "272:52:1", "nodeType": "YulIf", "src": "272:52:1" }, { + "nativeSrc": "333:37:1", "nodeType": "YulVariableDeclaration", "src": "333:37:1", "value": @@ -280,6 +321,7 @@ [ { "name": "headStart", + "nativeSrc": "360:9:1", "nodeType": "YulIdentifier", "src": "360:9:1" } @@ -287,9 +329,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "347:12:1", "nodeType": "YulIdentifier", "src": "347:12:1" }, + "nativeSrc": "347:23:1", "nodeType": "YulFunctionCall", "src": "347:23:1" }, @@ -297,6 +341,7 @@ [ { "name": "offset", + "nativeSrc": "337:6:1", "nodeType": "YulTypedName", "src": "337:6:1", "type": "" @@ -304,11 +349,13 @@ ] }, { + "nativeSrc": "379:28:1", "nodeType": "YulVariableDeclaration", "src": "379:28:1", "value": { "kind": "number", + "nativeSrc": "389:18:1", "nodeType": "YulLiteral", "src": "389:18:1", "type": "", @@ -318,6 +365,7 @@ [ { "name": "_2", + "nativeSrc": "383:2:1", "nodeType": "YulTypedName", "src": "383:2:1", "type": "" @@ -327,6 +375,7 @@ { "body": { + "nativeSrc": "434:16:1", "nodeType": "YulBlock", "src": "434:16:1", "statements": @@ -338,6 +387,7 @@ [ { "kind": "number", + "nativeSrc": "443:1:1", "nodeType": "YulLiteral", "src": "443:1:1", "type": "", @@ -345,6 +395,7 @@ }, { "kind": "number", + "nativeSrc": "446:1:1", "nodeType": "YulLiteral", "src": "446:1:1", "type": "", @@ -354,12 +405,15 @@ "functionName": { "name": "revert", + "nativeSrc": "436:6:1", "nodeType": "YulIdentifier", "src": "436:6:1" }, + "nativeSrc": "436:12:1", "nodeType": "YulFunctionCall", "src": "436:12:1" }, + "nativeSrc": "436:12:1", "nodeType": "YulExpressionStatement", "src": "436:12:1" } @@ -371,11 +425,13 @@ [ { "name": "offset", + "nativeSrc": "422:6:1", "nodeType": "YulIdentifier", "src": "422:6:1" }, { "name": "_2", + "nativeSrc": "430:2:1", "nodeType": "YulIdentifier", "src": "430:2:1" } @@ -383,16 +439,20 @@ "functionName": { "name": "gt", + "nativeSrc": "419:2:1", "nodeType": "YulIdentifier", "src": "419:2:1" }, + "nativeSrc": "419:14:1", "nodeType": "YulFunctionCall", "src": "419:14:1" }, + "nativeSrc": "416:34:1", "nodeType": "YulIf", "src": "416:34:1" }, { + "nativeSrc": "459:32:1", "nodeType": "YulVariableDeclaration", "src": "459:32:1", "value": @@ -401,11 +461,13 @@ [ { "name": "headStart", + "nativeSrc": "473:9:1", "nodeType": "YulIdentifier", "src": "473:9:1" }, { "name": "offset", + "nativeSrc": "484:6:1", "nodeType": "YulIdentifier", "src": "484:6:1" } @@ -413,9 +475,11 @@ "functionName": { "name": "add", + "nativeSrc": "469:3:1", "nodeType": "YulIdentifier", "src": "469:3:1" }, + "nativeSrc": "469:22:1", "nodeType": "YulFunctionCall", "src": "469:22:1" }, @@ -423,6 +487,7 @@ [ { "name": "_3", + "nativeSrc": "463:2:1", "nodeType": "YulTypedName", "src": "463:2:1", "type": "" @@ -432,6 +497,7 @@ { "body": { + "nativeSrc": "539:16:1", "nodeType": "YulBlock", "src": "539:16:1", "statements": @@ -443,6 +509,7 @@ [ { "kind": "number", + "nativeSrc": "548:1:1", "nodeType": "YulLiteral", "src": "548:1:1", "type": "", @@ -450,6 +517,7 @@ }, { "kind": "number", + "nativeSrc": "551:1:1", "nodeType": "YulLiteral", "src": "551:1:1", "type": "", @@ -459,12 +527,15 @@ "functionName": { "name": "revert", + "nativeSrc": "541:6:1", "nodeType": "YulIdentifier", "src": "541:6:1" }, + "nativeSrc": "541:12:1", "nodeType": "YulFunctionCall", "src": "541:12:1" }, + "nativeSrc": "541:12:1", "nodeType": "YulExpressionStatement", "src": "541:12:1" } @@ -482,11 +553,13 @@ [ { "name": "_3", + "nativeSrc": "518:2:1", "nodeType": "YulIdentifier", "src": "518:2:1" }, { "kind": "number", + "nativeSrc": "522:4:1", "nodeType": "YulLiteral", "src": "522:4:1", "type": "", @@ -496,14 +569,17 @@ "functionName": { "name": "add", + "nativeSrc": "514:3:1", "nodeType": "YulIdentifier", "src": "514:3:1" }, + "nativeSrc": "514:13:1", "nodeType": "YulFunctionCall", "src": "514:13:1" }, { "name": "dataEnd", + "nativeSrc": "529:7:1", "nodeType": "YulIdentifier", "src": "529:7:1" } @@ -511,9 +587,11 @@ "functionName": { "name": "slt", + "nativeSrc": "510:3:1", "nodeType": "YulIdentifier", "src": "510:3:1" }, + "nativeSrc": "510:27:1", "nodeType": "YulFunctionCall", "src": "510:27:1" } @@ -521,16 +599,20 @@ "functionName": { "name": "iszero", + "nativeSrc": "503:6:1", "nodeType": "YulIdentifier", "src": "503:6:1" }, + "nativeSrc": "503:35:1", "nodeType": "YulFunctionCall", "src": "503:35:1" }, + "nativeSrc": "500:55:1", "nodeType": "YulIf", "src": "500:55:1" }, { + "nativeSrc": "564:26:1", "nodeType": "YulVariableDeclaration", "src": "564:26:1", "value": @@ -539,6 +621,7 @@ [ { "name": "_3", + "nativeSrc": "587:2:1", "nodeType": "YulIdentifier", "src": "587:2:1" } @@ -546,9 +629,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "574:12:1", "nodeType": "YulIdentifier", "src": "574:12:1" }, + "nativeSrc": "574:16:1", "nodeType": "YulFunctionCall", "src": "574:16:1" }, @@ -556,6 +641,7 @@ [ { "name": "_4", + "nativeSrc": "568:2:1", "nodeType": "YulTypedName", "src": "568:2:1", "type": "" @@ -565,6 +651,7 @@ { "body": { + "nativeSrc": "613:22:1", "nodeType": "YulBlock", "src": "613:22:1", "statements": @@ -576,12 +663,15 @@ "functionName": { "name": "panic_error_0x41", + "nativeSrc": "615:16:1", "nodeType": "YulIdentifier", "src": "615:16:1" }, + "nativeSrc": "615:18:1", "nodeType": "YulFunctionCall", "src": "615:18:1" }, + "nativeSrc": "615:18:1", "nodeType": "YulExpressionStatement", "src": "615:18:1" } @@ -593,11 +683,13 @@ [ { "name": "_4", + "nativeSrc": "605:2:1", "nodeType": "YulIdentifier", "src": "605:2:1" }, { "name": "_2", + "nativeSrc": "609:2:1", "nodeType": "YulIdentifier", "src": "609:2:1" } @@ -605,16 +697,20 @@ "functionName": { "name": "gt", + "nativeSrc": "602:2:1", "nodeType": "YulIdentifier", "src": "602:2:1" }, + "nativeSrc": "602:10:1", "nodeType": "YulFunctionCall", "src": "602:10:1" }, + "nativeSrc": "599:36:1", "nodeType": "YulIf", "src": "599:36:1" }, { + "nativeSrc": "644:20:1", "nodeType": "YulVariableDeclaration", "src": "644:20:1", "value": @@ -623,6 +719,7 @@ [ { "kind": "number", + "nativeSrc": "658:1:1", "nodeType": "YulLiteral", "src": "658:1:1", "type": "", @@ -630,6 +727,7 @@ }, { "name": "_4", + "nativeSrc": "661:2:1", "nodeType": "YulIdentifier", "src": "661:2:1" } @@ -637,9 +735,11 @@ "functionName": { "name": "shl", + "nativeSrc": "654:3:1", "nodeType": "YulIdentifier", "src": "654:3:1" }, + "nativeSrc": "654:10:1", "nodeType": "YulFunctionCall", "src": "654:10:1" }, @@ -647,6 +747,7 @@ [ { "name": "_5", + "nativeSrc": "648:2:1", "nodeType": "YulTypedName", "src": "648:2:1", "type": "" @@ -654,6 +755,7 @@ ] }, { + "nativeSrc": "673:23:1", "nodeType": "YulVariableDeclaration", "src": "673:23:1", "value": @@ -662,6 +764,7 @@ [ { "kind": "number", + "nativeSrc": "693:2:1", "nodeType": "YulLiteral", "src": "693:2:1", "type": "", @@ -671,9 +774,11 @@ "functionName": { "name": "mload", + "nativeSrc": "687:5:1", "nodeType": "YulIdentifier", "src": "687:5:1" }, + "nativeSrc": "687:9:1", "nodeType": "YulFunctionCall", "src": "687:9:1" }, @@ -681,6 +786,7 @@ [ { "name": "memPtr", + "nativeSrc": "677:6:1", "nodeType": "YulTypedName", "src": "677:6:1", "type": "" @@ -688,6 +794,7 @@ ] }, { + "nativeSrc": "705:56:1", "nodeType": "YulVariableDeclaration", "src": "705:56:1", "value": @@ -696,6 +803,7 @@ [ { "name": "memPtr", + "nativeSrc": "727:6:1", "nodeType": "YulIdentifier", "src": "727:6:1" }, @@ -707,11 +815,13 @@ [ { "name": "_5", + "nativeSrc": "743:2:1", "nodeType": "YulIdentifier", "src": "743:2:1" }, { "kind": "number", + "nativeSrc": "747:2:1", "nodeType": "YulLiteral", "src": "747:2:1", "type": "", @@ -721,9 +831,11 @@ "functionName": { "name": "add", + "nativeSrc": "739:3:1", "nodeType": "YulIdentifier", "src": "739:3:1" }, + "nativeSrc": "739:11:1", "nodeType": "YulFunctionCall", "src": "739:11:1" }, @@ -732,6 +844,7 @@ [ { "kind": "number", + "nativeSrc": "756:2:1", "nodeType": "YulLiteral", "src": "756:2:1", "type": "", @@ -741,9 +854,11 @@ "functionName": { "name": "not", + "nativeSrc": "752:3:1", "nodeType": "YulIdentifier", "src": "752:3:1" }, + "nativeSrc": "752:7:1", "nodeType": "YulFunctionCall", "src": "752:7:1" } @@ -751,9 +866,11 @@ "functionName": { "name": "and", + "nativeSrc": "735:3:1", "nodeType": "YulIdentifier", "src": "735:3:1" }, + "nativeSrc": "735:25:1", "nodeType": "YulFunctionCall", "src": "735:25:1" } @@ -761,9 +878,11 @@ "functionName": { "name": "add", + "nativeSrc": "723:3:1", "nodeType": "YulIdentifier", "src": "723:3:1" }, + "nativeSrc": "723:38:1", "nodeType": "YulFunctionCall", "src": "723:38:1" }, @@ -771,6 +890,7 @@ [ { "name": "newFreePtr", + "nativeSrc": "709:10:1", "nodeType": "YulTypedName", "src": "709:10:1", "type": "" @@ -780,6 +900,7 @@ { "body": { + "nativeSrc": "820:22:1", "nodeType": "YulBlock", "src": "820:22:1", "statements": @@ -791,12 +912,15 @@ "functionName": { "name": "panic_error_0x41", + "nativeSrc": "822:16:1", "nodeType": "YulIdentifier", "src": "822:16:1" }, + "nativeSrc": "822:18:1", "nodeType": "YulFunctionCall", "src": "822:18:1" }, + "nativeSrc": "822:18:1", "nodeType": "YulExpressionStatement", "src": "822:18:1" } @@ -811,11 +935,13 @@ [ { "name": "newFreePtr", + "nativeSrc": "779:10:1", "nodeType": "YulIdentifier", "src": "779:10:1" }, { "name": "_2", + "nativeSrc": "791:2:1", "nodeType": "YulIdentifier", "src": "791:2:1" } @@ -823,9 +949,11 @@ "functionName": { "name": "gt", + "nativeSrc": "776:2:1", "nodeType": "YulIdentifier", "src": "776:2:1" }, + "nativeSrc": "776:18:1", "nodeType": "YulFunctionCall", "src": "776:18:1" }, @@ -834,11 +962,13 @@ [ { "name": "newFreePtr", + "nativeSrc": "799:10:1", "nodeType": "YulIdentifier", "src": "799:10:1" }, { "name": "memPtr", + "nativeSrc": "811:6:1", "nodeType": "YulIdentifier", "src": "811:6:1" } @@ -846,9 +976,11 @@ "functionName": { "name": "lt", + "nativeSrc": "796:2:1", "nodeType": "YulIdentifier", "src": "796:2:1" }, + "nativeSrc": "796:22:1", "nodeType": "YulFunctionCall", "src": "796:22:1" } @@ -856,12 +988,15 @@ "functionName": { "name": "or", + "nativeSrc": "773:2:1", "nodeType": "YulIdentifier", "src": "773:2:1" }, + "nativeSrc": "773:46:1", "nodeType": "YulFunctionCall", "src": "773:46:1" }, + "nativeSrc": "770:72:1", "nodeType": "YulIf", "src": "770:72:1" }, @@ -872,6 +1007,7 @@ [ { "kind": "number", + "nativeSrc": "858:2:1", "nodeType": "YulLiteral", "src": "858:2:1", "type": "", @@ -879,6 +1015,7 @@ }, { "name": "newFreePtr", + "nativeSrc": "862:10:1", "nodeType": "YulIdentifier", "src": "862:10:1" } @@ -886,21 +1023,26 @@ "functionName": { "name": "mstore", + "nativeSrc": "851:6:1", "nodeType": "YulIdentifier", "src": "851:6:1" }, + "nativeSrc": "851:22:1", "nodeType": "YulFunctionCall", "src": "851:22:1" }, + "nativeSrc": "851:22:1", "nodeType": "YulExpressionStatement", "src": "851:22:1" }, { + "nativeSrc": "882:17:1", "nodeType": "YulVariableDeclaration", "src": "882:17:1", "value": { "name": "memPtr", + "nativeSrc": "893:6:1", "nodeType": "YulIdentifier", "src": "893:6:1" }, @@ -908,6 +1050,7 @@ [ { "name": "dst", + "nativeSrc": "886:3:1", "nodeType": "YulTypedName", "src": "886:3:1", "type": "" @@ -921,11 +1064,13 @@ [ { "name": "memPtr", + "nativeSrc": "915:6:1", "nodeType": "YulIdentifier", "src": "915:6:1" }, { "name": "_4", + "nativeSrc": "923:2:1", "nodeType": "YulIdentifier", "src": "923:2:1" } @@ -933,16 +1078,20 @@ "functionName": { "name": "mstore", + "nativeSrc": "908:6:1", "nodeType": "YulIdentifier", "src": "908:6:1" }, + "nativeSrc": "908:18:1", "nodeType": "YulFunctionCall", "src": "908:18:1" }, + "nativeSrc": "908:18:1", "nodeType": "YulExpressionStatement", "src": "908:18:1" }, { + "nativeSrc": "935:22:1", "nodeType": "YulAssignment", "src": "935:22:1", "value": @@ -951,11 +1100,13 @@ [ { "name": "memPtr", + "nativeSrc": "946:6:1", "nodeType": "YulIdentifier", "src": "946:6:1" }, { "name": "_1", + "nativeSrc": "954:2:1", "nodeType": "YulIdentifier", "src": "954:2:1" } @@ -963,9 +1114,11 @@ "functionName": { "name": "add", + "nativeSrc": "942:3:1", "nodeType": "YulIdentifier", "src": "942:3:1" }, + "nativeSrc": "942:15:1", "nodeType": "YulFunctionCall", "src": "942:15:1" }, @@ -973,12 +1126,14 @@ [ { "name": "dst", + "nativeSrc": "935:3:1", "nodeType": "YulIdentifier", "src": "935:3:1" } ] }, { + "nativeSrc": "966:34:1", "nodeType": "YulVariableDeclaration", "src": "966:34:1", "value": @@ -990,11 +1145,13 @@ [ { "name": "_3", + "nativeSrc": "988:2:1", "nodeType": "YulIdentifier", "src": "988:2:1" }, { "name": "_5", + "nativeSrc": "992:2:1", "nodeType": "YulIdentifier", "src": "992:2:1" } @@ -1002,14 +1159,17 @@ "functionName": { "name": "add", + "nativeSrc": "984:3:1", "nodeType": "YulIdentifier", "src": "984:3:1" }, + "nativeSrc": "984:11:1", "nodeType": "YulFunctionCall", "src": "984:11:1" }, { "name": "_1", + "nativeSrc": "997:2:1", "nodeType": "YulIdentifier", "src": "997:2:1" } @@ -1017,9 +1177,11 @@ "functionName": { "name": "add", + "nativeSrc": "980:3:1", "nodeType": "YulIdentifier", "src": "980:3:1" }, + "nativeSrc": "980:20:1", "nodeType": "YulFunctionCall", "src": "980:20:1" }, @@ -1027,6 +1189,7 @@ [ { "name": "srcEnd", + "nativeSrc": "970:6:1", "nodeType": "YulTypedName", "src": "970:6:1", "type": "" @@ -1036,6 +1199,7 @@ { "body": { + "nativeSrc": "1032:16:1", "nodeType": "YulBlock", "src": "1032:16:1", "statements": @@ -1047,6 +1211,7 @@ [ { "kind": "number", + "nativeSrc": "1041:1:1", "nodeType": "YulLiteral", "src": "1041:1:1", "type": "", @@ -1054,6 +1219,7 @@ }, { "kind": "number", + "nativeSrc": "1044:1:1", "nodeType": "YulLiteral", "src": "1044:1:1", "type": "", @@ -1063,12 +1229,15 @@ "functionName": { "name": "revert", + "nativeSrc": "1034:6:1", "nodeType": "YulIdentifier", "src": "1034:6:1" }, + "nativeSrc": "1034:12:1", "nodeType": "YulFunctionCall", "src": "1034:12:1" }, + "nativeSrc": "1034:12:1", "nodeType": "YulExpressionStatement", "src": "1034:12:1" } @@ -1080,11 +1249,13 @@ [ { "name": "srcEnd", + "nativeSrc": "1015:6:1", "nodeType": "YulIdentifier", "src": "1015:6:1" }, { "name": "dataEnd", + "nativeSrc": "1023:7:1", "nodeType": "YulIdentifier", "src": "1023:7:1" } @@ -1092,16 +1263,20 @@ "functionName": { "name": "gt", + "nativeSrc": "1012:2:1", "nodeType": "YulIdentifier", "src": "1012:2:1" }, + "nativeSrc": "1012:19:1", "nodeType": "YulFunctionCall", "src": "1012:19:1" }, + "nativeSrc": "1009:39:1", "nodeType": "YulIf", "src": "1009:39:1" }, { + "nativeSrc": "1057:22:1", "nodeType": "YulVariableDeclaration", "src": "1057:22:1", "value": @@ -1110,11 +1285,13 @@ [ { "name": "_3", + "nativeSrc": "1072:2:1", "nodeType": "YulIdentifier", "src": "1072:2:1" }, { "name": "_1", + "nativeSrc": "1076:2:1", "nodeType": "YulIdentifier", "src": "1076:2:1" } @@ -1122,9 +1299,11 @@ "functionName": { "name": "add", + "nativeSrc": "1068:3:1", "nodeType": "YulIdentifier", "src": "1068:3:1" }, + "nativeSrc": "1068:11:1", "nodeType": "YulFunctionCall", "src": "1068:11:1" }, @@ -1132,6 +1311,7 @@ [ { "name": "src", + "nativeSrc": "1061:3:1", "nodeType": "YulTypedName", "src": "1061:3:1", "type": "" @@ -1141,6 +1321,7 @@ { "body": { + "nativeSrc": "1144:86:1", "nodeType": "YulBlock", "src": "1144:86:1", "statements": @@ -1152,6 +1333,7 @@ [ { "name": "dst", + "nativeSrc": "1165:3:1", "nodeType": "YulIdentifier", "src": "1165:3:1" }, @@ -1160,6 +1342,7 @@ [ { "name": "src", + "nativeSrc": "1183:3:1", "nodeType": "YulIdentifier", "src": "1183:3:1" } @@ -1167,9 +1350,11 @@ "functionName": { "name": "calldataload", + "nativeSrc": "1170:12:1", "nodeType": "YulIdentifier", "src": "1170:12:1" }, + "nativeSrc": "1170:17:1", "nodeType": "YulFunctionCall", "src": "1170:17:1" } @@ -1177,16 +1362,20 @@ "functionName": { "name": "mstore", + "nativeSrc": "1158:6:1", "nodeType": "YulIdentifier", "src": "1158:6:1" }, + "nativeSrc": "1158:30:1", "nodeType": "YulFunctionCall", "src": "1158:30:1" }, + "nativeSrc": "1158:30:1", "nodeType": "YulExpressionStatement", "src": "1158:30:1" }, { + "nativeSrc": "1201:19:1", "nodeType": "YulAssignment", "src": "1201:19:1", "value": @@ -1195,11 +1384,13 @@ [ { "name": "dst", + "nativeSrc": "1212:3:1", "nodeType": "YulIdentifier", "src": "1212:3:1" }, { "name": "_1", + "nativeSrc": "1217:2:1", "nodeType": "YulIdentifier", "src": "1217:2:1" } @@ -1207,9 +1398,11 @@ "functionName": { "name": "add", + "nativeSrc": "1208:3:1", "nodeType": "YulIdentifier", "src": "1208:3:1" }, + "nativeSrc": "1208:12:1", "nodeType": "YulFunctionCall", "src": "1208:12:1" }, @@ -1217,6 +1410,7 @@ [ { "name": "dst", + "nativeSrc": "1201:3:1", "nodeType": "YulIdentifier", "src": "1201:3:1" } @@ -1230,11 +1424,13 @@ [ { "name": "src", + "nativeSrc": "1099:3:1", "nodeType": "YulIdentifier", "src": "1099:3:1" }, { "name": "srcEnd", + "nativeSrc": "1104:6:1", "nodeType": "YulIdentifier", "src": "1104:6:1" } @@ -1242,20 +1438,25 @@ "functionName": { "name": "lt", + "nativeSrc": "1096:2:1", "nodeType": "YulIdentifier", "src": "1096:2:1" }, + "nativeSrc": "1096:15:1", "nodeType": "YulFunctionCall", "src": "1096:15:1" }, + "nativeSrc": "1088:142:1", "nodeType": "YulForLoop", "post": { + "nativeSrc": "1112:23:1", "nodeType": "YulBlock", "src": "1112:23:1", "statements": [ { + "nativeSrc": "1114:19:1", "nodeType": "YulAssignment", "src": "1114:19:1", "value": @@ -1264,11 +1465,13 @@ [ { "name": "src", + "nativeSrc": "1125:3:1", "nodeType": "YulIdentifier", "src": "1125:3:1" }, { "name": "_1", + "nativeSrc": "1130:2:1", "nodeType": "YulIdentifier", "src": "1130:2:1" } @@ -1276,9 +1479,11 @@ "functionName": { "name": "add", + "nativeSrc": "1121:3:1", "nodeType": "YulIdentifier", "src": "1121:3:1" }, + "nativeSrc": "1121:12:1", "nodeType": "YulFunctionCall", "src": "1121:12:1" }, @@ -1286,6 +1491,7 @@ [ { "name": "src", + "nativeSrc": "1114:3:1", "nodeType": "YulIdentifier", "src": "1114:3:1" } @@ -1295,6 +1501,7 @@ }, "pre": { + "nativeSrc": "1092:3:1", "nodeType": "YulBlock", "src": "1092:3:1", "statements": [] @@ -1302,11 +1509,13 @@ "src": "1088:142:1" }, { + "nativeSrc": "1239:16:1", "nodeType": "YulAssignment", "src": "1239:16:1", "value": { "name": "memPtr", + "nativeSrc": "1249:6:1", "nodeType": "YulIdentifier", "src": "1249:6:1" }, @@ -1314,6 +1523,7 @@ [ { "name": "value0", + "nativeSrc": "1239:6:1", "nodeType": "YulIdentifier", "src": "1239:6:1" } @@ -1322,17 +1532,20 @@ ] }, "name": "abi_decode_tuple_t_array$_t_uint256_$dyn_memory_ptr", + "nativeSrc": "146:1115:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", + "nativeSrc": "207:9:1", "nodeType": "YulTypedName", "src": "207:9:1", "type": "" }, { "name": "dataEnd", + "nativeSrc": "218:7:1", "nodeType": "YulTypedName", "src": "218:7:1", "type": "" @@ -1342,6 +1555,7 @@ [ { "name": "value0", + "nativeSrc": "230:6:1", "nodeType": "YulTypedName", "src": "230:6:1", "type": "" @@ -1352,11 +1566,13 @@ { "body": { + "nativeSrc": "1367:76:1", "nodeType": "YulBlock", "src": "1367:76:1", "statements": [ { + "nativeSrc": "1377:26:1", "nodeType": "YulAssignment", "src": "1377:26:1", "value": @@ -1365,11 +1581,13 @@ [ { "name": "headStart", + "nativeSrc": "1389:9:1", "nodeType": "YulIdentifier", "src": "1389:9:1" }, { "kind": "number", + "nativeSrc": "1400:2:1", "nodeType": "YulLiteral", "src": "1400:2:1", "type": "", @@ -1379,9 +1597,11 @@ "functionName": { "name": "add", + "nativeSrc": "1385:3:1", "nodeType": "YulIdentifier", "src": "1385:3:1" }, + "nativeSrc": "1385:18:1", "nodeType": "YulFunctionCall", "src": "1385:18:1" }, @@ -1389,6 +1609,7 @@ [ { "name": "tail", + "nativeSrc": "1377:4:1", "nodeType": "YulIdentifier", "src": "1377:4:1" } @@ -1401,11 +1622,13 @@ [ { "name": "headStart", + "nativeSrc": "1419:9:1", "nodeType": "YulIdentifier", "src": "1419:9:1" }, { "name": "value0", + "nativeSrc": "1430:6:1", "nodeType": "YulIdentifier", "src": "1430:6:1" } @@ -1413,29 +1636,35 @@ "functionName": { "name": "mstore", + "nativeSrc": "1412:6:1", "nodeType": "YulIdentifier", "src": "1412:6:1" }, + "nativeSrc": "1412:25:1", "nodeType": "YulFunctionCall", "src": "1412:25:1" }, + "nativeSrc": "1412:25:1", "nodeType": "YulExpressionStatement", "src": "1412:25:1" } ] }, "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nativeSrc": "1266:177:1", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "headStart", + "nativeSrc": "1336:9:1", "nodeType": "YulTypedName", "src": "1336:9:1", "type": "" }, { "name": "value0", + "nativeSrc": "1347:6:1", "nodeType": "YulTypedName", "src": "1347:6:1", "type": "" @@ -1445,6 +1674,7 @@ [ { "name": "tail", + "nativeSrc": "1358:4:1", "nodeType": "YulTypedName", "src": "1358:4:1", "type": "" diff --git a/test/cmdlineTests/standard_yul/output.json b/test/cmdlineTests/standard_yul/output.json index 33d5fc0bd37b..d335c3a96691 100644 --- a/test/cmdlineTests/standard_yul/output.json +++ b/test/cmdlineTests/standard_yul/output.json @@ -50,5 +50,128 @@ " } } + }, + "sources": + { + "A": + { + "ast": + { + "code": + { + "block": + { + "nativeSrc": "0:42:0", + "nodeType": "YulBlock", + "src": "0:42:0", + "statements": + [ + { + "nativeSrc": "2:17:0", + "nodeType": "YulVariableDeclaration", + "src": "2:17:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "17:1:0", + "nodeType": "YulLiteral", + "src": "17:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "11:5:0", + "nodeType": "YulIdentifier", + "src": "11:5:0" + }, + "nativeSrc": "11:8:0", + "nodeType": "YulFunctionCall", + "src": "11:8:0" + }, + "variables": + [ + { + "name": "x", + "nativeSrc": "6:1:0", + "nodeType": "YulTypedName", + "src": "6:1:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "arguments": + [ + { + "name": "x", + "nativeSrc": "31:1:0", + "nodeType": "YulIdentifier", + "src": "31:1:0" + }, + { + "kind": "number", + "nativeSrc": "34:1:0", + "nodeType": "YulLiteral", + "src": "34:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "add", + "nativeSrc": "27:3:0", + "nodeType": "YulIdentifier", + "src": "27:3:0" + }, + "nativeSrc": "27:9:0", + "nodeType": "YulFunctionCall", + "src": "27:9:0" + }, + { + "kind": "number", + "nativeSrc": "38:1:0", + "nodeType": "YulLiteral", + "src": "38:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "sstore", + "nativeSrc": "20:6:0", + "nodeType": "YulIdentifier", + "src": "20:6:0" + }, + "nativeSrc": "20:20:0", + "nodeType": "YulFunctionCall", + "src": "20:20:0" + }, + "nativeSrc": "20:20:0", + "nodeType": "YulExpressionStatement", + "src": "20:20:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "object", + "nodeType": "YulObject", + "subObjects": [] + }, + "id": 1 + } } } diff --git a/test/cmdlineTests/standard_yul_object/output.json b/test/cmdlineTests/standard_yul_object/output.json index e5a5dadac509..af55758f4d1c 100644 --- a/test/cmdlineTests/standard_yul_object/output.json +++ b/test/cmdlineTests/standard_yul_object/output.json @@ -52,5 +52,135 @@ data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 616263 " } } + }, + "sources": + { + "A": + { + "ast": + { + "code": + { + "block": + { + "nativeSrc": "28:56:0", + "nodeType": "YulBlock", + "src": "28:56:0", + "statements": + [ + { + "nativeSrc": "30:31:0", + "nodeType": "YulVariableDeclaration", + "src": "30:31:0", + "value": + { + "arguments": + [ + { + "hexValue": "446174614e616d65", + "kind": "string", + "nativeSrc": "50:10:0", + "nodeType": "YulLiteral", + "src": "50:10:0", + "type": "", + "value": "DataName" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "39:10:0", + "nodeType": "YulIdentifier", + "src": "39:10:0" + }, + "nativeSrc": "39:22:0", + "nodeType": "YulFunctionCall", + "src": "39:22:0" + }, + "variables": + [ + { + "name": "x", + "nativeSrc": "34:1:0", + "nodeType": "YulTypedName", + "src": "34:1:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "arguments": + [ + { + "name": "x", + "nativeSrc": "73:1:0", + "nodeType": "YulIdentifier", + "src": "73:1:0" + }, + { + "kind": "number", + "nativeSrc": "76:1:0", + "nodeType": "YulLiteral", + "src": "76:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "add", + "nativeSrc": "69:3:0", + "nodeType": "YulIdentifier", + "src": "69:3:0" + }, + "nativeSrc": "69:9:0", + "nodeType": "YulFunctionCall", + "src": "69:9:0" + }, + { + "kind": "number", + "nativeSrc": "80:1:0", + "nodeType": "YulLiteral", + "src": "80:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "sstore", + "nativeSrc": "62:6:0", + "nodeType": "YulIdentifier", + "src": "62:6:0" + }, + "nativeSrc": "62:20:0", + "nodeType": "YulFunctionCall", + "src": "62:20:0" + }, + "nativeSrc": "62:20:0", + "nodeType": "YulExpressionStatement", + "src": "62:20:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "NamedObject", + "nodeType": "YulObject", + "subObjects": + [ + { + "nodeType": "YulData", + "value": "616263" + } + ] + }, + "id": 1 + } } } diff --git a/test/cmdlineTests/standard_yul_object_name/output.json b/test/cmdlineTests/standard_yul_object_name/output.json index 57c7ce709d5b..e94a9bc6acdb 100644 --- a/test/cmdlineTests/standard_yul_object_name/output.json +++ b/test/cmdlineTests/standard_yul_object_name/output.json @@ -77,5 +77,190 @@ sub_0: assembly { " } } + }, + "sources": + { + "A": + { + "ast": + { + "code": + { + "block": + { + "nativeSrc": "28:56:0", + "nodeType": "YulBlock", + "src": "28:56:0", + "statements": + [ + { + "nativeSrc": "30:31:0", + "nodeType": "YulVariableDeclaration", + "src": "30:31:0", + "value": + { + "arguments": + [ + { + "hexValue": "446174614e616d65", + "kind": "string", + "nativeSrc": "50:10:0", + "nodeType": "YulLiteral", + "src": "50:10:0", + "type": "", + "value": "DataName" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "39:10:0", + "nodeType": "YulIdentifier", + "src": "39:10:0" + }, + "nativeSrc": "39:22:0", + "nodeType": "YulFunctionCall", + "src": "39:22:0" + }, + "variables": + [ + { + "name": "x", + "nativeSrc": "34:1:0", + "nodeType": "YulTypedName", + "src": "34:1:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "arguments": + [ + { + "name": "x", + "nativeSrc": "73:1:0", + "nodeType": "YulIdentifier", + "src": "73:1:0" + }, + { + "kind": "number", + "nativeSrc": "76:1:0", + "nodeType": "YulLiteral", + "src": "76:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "add", + "nativeSrc": "69:3:0", + "nodeType": "YulIdentifier", + "src": "69:3:0" + }, + "nativeSrc": "69:9:0", + "nodeType": "YulFunctionCall", + "src": "69:9:0" + }, + { + "kind": "number", + "nativeSrc": "80:1:0", + "nodeType": "YulLiteral", + "src": "80:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "sstore", + "nativeSrc": "62:6:0", + "nodeType": "YulIdentifier", + "src": "62:6:0" + }, + "nativeSrc": "62:20:0", + "nodeType": "YulFunctionCall", + "src": "62:20:0" + }, + "nativeSrc": "62:20:0", + "nodeType": "YulExpressionStatement", + "src": "62:20:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "NamedObject", + "nodeType": "YulObject", + "subObjects": + [ + { + "nodeType": "YulData", + "value": "616263" + }, + { + "code": + { + "block": + { + "nativeSrc": "135:16:0", + "nodeType": "YulBlock", + "src": "135:16:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "144:1:0", + "nodeType": "YulLiteral", + "src": "144:1:0", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nativeSrc": "147:1:0", + "nodeType": "YulLiteral", + "src": "147:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "revert", + "nativeSrc": "137:6:0", + "nodeType": "YulIdentifier", + "src": "137:6:0" + }, + "nativeSrc": "137:12:0", + "nodeType": "YulFunctionCall", + "src": "137:12:0" + }, + "nativeSrc": "137:12:0", + "nodeType": "YulExpressionStatement", + "src": "137:12:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "OtherObject", + "nodeType": "YulObject", + "subObjects": [] + } + ] + }, + "id": 1 + } } } diff --git a/test/cmdlineTests/standard_yul_optimiserSteps/output.json b/test/cmdlineTests/standard_yul_optimiserSteps/output.json index 7df2f7695237..54dd24ac6814 100644 --- a/test/cmdlineTests/standard_yul_optimiserSteps/output.json +++ b/test/cmdlineTests/standard_yul_optimiserSteps/output.json @@ -45,5 +45,128 @@ " } } + }, + "sources": + { + "A": + { + "ast": + { + "code": + { + "block": + { + "nativeSrc": "0:42:0", + "nodeType": "YulBlock", + "src": "0:42:0", + "statements": + [ + { + "nativeSrc": "2:17:0", + "nodeType": "YulVariableDeclaration", + "src": "2:17:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "17:1:0", + "nodeType": "YulLiteral", + "src": "17:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "11:5:0", + "nodeType": "YulIdentifier", + "src": "11:5:0" + }, + "nativeSrc": "11:8:0", + "nodeType": "YulFunctionCall", + "src": "11:8:0" + }, + "variables": + [ + { + "name": "x", + "nativeSrc": "6:1:0", + "nodeType": "YulTypedName", + "src": "6:1:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "arguments": + [ + { + "name": "x", + "nativeSrc": "31:1:0", + "nodeType": "YulIdentifier", + "src": "31:1:0" + }, + { + "kind": "number", + "nativeSrc": "34:1:0", + "nodeType": "YulLiteral", + "src": "34:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "add", + "nativeSrc": "27:3:0", + "nodeType": "YulIdentifier", + "src": "27:3:0" + }, + "nativeSrc": "27:9:0", + "nodeType": "YulFunctionCall", + "src": "27:9:0" + }, + { + "kind": "number", + "nativeSrc": "38:1:0", + "nodeType": "YulLiteral", + "src": "38:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "sstore", + "nativeSrc": "20:6:0", + "nodeType": "YulIdentifier", + "src": "20:6:0" + }, + "nativeSrc": "20:20:0", + "nodeType": "YulFunctionCall", + "src": "20:20:0" + }, + "nativeSrc": "20:20:0", + "nodeType": "YulExpressionStatement", + "src": "20:20:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "object", + "nodeType": "YulObject", + "subObjects": [] + }, + "id": 1 + } } } diff --git a/test/cmdlineTests/standard_yul_optimized/output.json b/test/cmdlineTests/standard_yul_optimized/output.json index f5524c6df750..b260f72edc66 100644 --- a/test/cmdlineTests/standard_yul_optimized/output.json +++ b/test/cmdlineTests/standard_yul_optimized/output.json @@ -40,5 +40,128 @@ " } } + }, + "sources": + { + "A": + { + "ast": + { + "code": + { + "block": + { + "nativeSrc": "0:42:0", + "nodeType": "YulBlock", + "src": "0:42:0", + "statements": + [ + { + "nativeSrc": "2:17:0", + "nodeType": "YulVariableDeclaration", + "src": "2:17:0", + "value": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "17:1:0", + "nodeType": "YulLiteral", + "src": "17:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "mload", + "nativeSrc": "11:5:0", + "nodeType": "YulIdentifier", + "src": "11:5:0" + }, + "nativeSrc": "11:8:0", + "nodeType": "YulFunctionCall", + "src": "11:8:0" + }, + "variables": + [ + { + "name": "x", + "nativeSrc": "6:1:0", + "nodeType": "YulTypedName", + "src": "6:1:0", + "type": "" + } + ] + }, + { + "expression": + { + "arguments": + [ + { + "arguments": + [ + { + "name": "x", + "nativeSrc": "31:1:0", + "nodeType": "YulIdentifier", + "src": "31:1:0" + }, + { + "kind": "number", + "nativeSrc": "34:1:0", + "nodeType": "YulLiteral", + "src": "34:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "add", + "nativeSrc": "27:3:0", + "nodeType": "YulIdentifier", + "src": "27:3:0" + }, + "nativeSrc": "27:9:0", + "nodeType": "YulFunctionCall", + "src": "27:9:0" + }, + { + "kind": "number", + "nativeSrc": "38:1:0", + "nodeType": "YulLiteral", + "src": "38:1:0", + "type": "", + "value": "0" + } + ], + "functionName": + { + "name": "sstore", + "nativeSrc": "20:6:0", + "nodeType": "YulIdentifier", + "src": "20:6:0" + }, + "nativeSrc": "20:20:0", + "nodeType": "YulFunctionCall", + "src": "20:20:0" + }, + "nativeSrc": "20:20:0", + "nodeType": "YulExpressionStatement", + "src": "20:20:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "object", + "nodeType": "YulObject", + "subObjects": [] + }, + "id": 1 + } } } diff --git a/test/cmdlineTests/strict_asm_ast_compact_json/args b/test/cmdlineTests/strict_asm_ast_compact_json/args new file mode 100644 index 000000000000..091ceb769aa2 --- /dev/null +++ b/test/cmdlineTests/strict_asm_ast_compact_json/args @@ -0,0 +1 @@ +--strict-assembly --ast-compact-json --pretty-json --json-indent 4 diff --git a/test/cmdlineTests/strict_asm_ast_compact_json/input.yul b/test/cmdlineTests/strict_asm_ast_compact_json/input.yul new file mode 100644 index 000000000000..6d1ebe21b989 --- /dev/null +++ b/test/cmdlineTests/strict_asm_ast_compact_json/input.yul @@ -0,0 +1,15 @@ +/// @use-src 0:"input.sol" +object "C_6_deployed" { + code { + /// @src 0:60:101 "contract C {..." + mstore(64, 128) + + // f() + fun_f_5() + + /// @src 0:77:99 "function f() public {}" + function fun_f_5() { + } + /// @src 0:60:101 "contract C {..." + } +} diff --git a/test/cmdlineTests/strict_asm_ast_compact_json/output b/test/cmdlineTests/strict_asm_ast_compact_json/output new file mode 100644 index 000000000000..ff944e8e471b --- /dev/null +++ b/test/cmdlineTests/strict_asm_ast_compact_json/output @@ -0,0 +1,91 @@ + +======= strict_asm_ast_compact_json/input.yul (EVM) ======= +AST: + +{ + "code": + { + "block": + { + "nativeSrc": "60:246:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "122:2:0", + "nodeType": "YulLiteral", + "src": "60:41:0", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "126:3:0", + "nodeType": "YulLiteral", + "src": "60:41:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "115:6:0", + "nodeType": "YulIdentifier", + "src": "60:41:0" + }, + "nativeSrc": "115:15:0", + "nodeType": "YulFunctionCall", + "src": "60:41:0" + }, + "nativeSrc": "115:15:0", + "nodeType": "YulExpressionStatement", + "src": "60:41:0" + }, + { + "expression": + { + "arguments": [], + "functionName": + { + "name": "fun_f_5", + "nativeSrc": "155:7:0", + "nodeType": "YulIdentifier", + "src": "60:41:0" + }, + "nativeSrc": "155:9:0", + "nodeType": "YulFunctionCall", + "src": "60:41:0" + }, + "nativeSrc": "155:9:0", + "nodeType": "YulExpressionStatement", + "src": "60:41:0" + }, + { + "body": + { + "nativeSrc": "244:11:0", + "nodeType": "YulBlock", + "src": "77:22:0", + "statements": [] + }, + "name": "fun_f_5", + "nativeSrc": "225:30:0", + "nodeType": "YulFunctionDefinition", + "src": "77:22:0" + } + ] + }, + "nodeType": "YulCode" + }, + "name": "C_6_deployed", + "nodeType": "YulObject", + "subObjects": [] +} diff --git a/test/libsolidity/ASTJSON/assembly/call.json b/test/libsolidity/ASTJSON/assembly/call.json index 7081d2f983fc..d92cf05fe8e4 100644 --- a/test/libsolidity/ASTJSON/assembly/call.json +++ b/test/libsolidity/ASTJSON/assembly/call.json @@ -39,6 +39,7 @@ { "AST": { + "nativeSrc": "56:34:1", "nodeType": "YulBlock", "src": "56:34:1", "statements": @@ -53,6 +54,7 @@ [ { "kind": "number", + "nativeSrc": "67:1:1", "nodeType": "YulLiteral", "src": "67:1:1", "type": "", @@ -60,6 +62,7 @@ }, { "kind": "number", + "nativeSrc": "70:1:1", "nodeType": "YulLiteral", "src": "70:1:1", "type": "", @@ -67,6 +70,7 @@ }, { "kind": "number", + "nativeSrc": "73:1:1", "nodeType": "YulLiteral", "src": "73:1:1", "type": "", @@ -74,6 +78,7 @@ }, { "kind": "number", + "nativeSrc": "76:1:1", "nodeType": "YulLiteral", "src": "76:1:1", "type": "", @@ -81,6 +86,7 @@ }, { "kind": "number", + "nativeSrc": "79:1:1", "nodeType": "YulLiteral", "src": "79:1:1", "type": "", @@ -88,6 +94,7 @@ }, { "kind": "number", + "nativeSrc": "82:1:1", "nodeType": "YulLiteral", "src": "82:1:1", "type": "", @@ -95,6 +102,7 @@ }, { "kind": "number", + "nativeSrc": "85:1:1", "nodeType": "YulLiteral", "src": "85:1:1", "type": "", @@ -104,9 +112,11 @@ "functionName": { "name": "call", + "nativeSrc": "62:4:1", "nodeType": "YulIdentifier", "src": "62:4:1" }, + "nativeSrc": "62:25:1", "nodeType": "YulFunctionCall", "src": "62:25:1" } @@ -114,12 +124,15 @@ "functionName": { "name": "pop", + "nativeSrc": "58:3:1", "nodeType": "YulIdentifier", "src": "58:3:1" }, + "nativeSrc": "58:30:1", "nodeType": "YulFunctionCall", "src": "58:30:1" }, + "nativeSrc": "58:30:1", "nodeType": "YulExpressionStatement", "src": "58:30:1" } diff --git a/test/libsolidity/ASTJSON/assembly/call_parseOnly.json b/test/libsolidity/ASTJSON/assembly/call_parseOnly.json index 1a9dc74a2839..803a1e4f5f1e 100644 --- a/test/libsolidity/ASTJSON/assembly/call_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/call_parseOnly.json @@ -26,6 +26,7 @@ { "AST": { + "nativeSrc": "56:34:1", "nodeType": "YulBlock", "src": "56:34:1", "statements": @@ -40,6 +41,7 @@ [ { "kind": "number", + "nativeSrc": "67:1:1", "nodeType": "YulLiteral", "src": "67:1:1", "type": "", @@ -47,6 +49,7 @@ }, { "kind": "number", + "nativeSrc": "70:1:1", "nodeType": "YulLiteral", "src": "70:1:1", "type": "", @@ -54,6 +57,7 @@ }, { "kind": "number", + "nativeSrc": "73:1:1", "nodeType": "YulLiteral", "src": "73:1:1", "type": "", @@ -61,6 +65,7 @@ }, { "kind": "number", + "nativeSrc": "76:1:1", "nodeType": "YulLiteral", "src": "76:1:1", "type": "", @@ -68,6 +73,7 @@ }, { "kind": "number", + "nativeSrc": "79:1:1", "nodeType": "YulLiteral", "src": "79:1:1", "type": "", @@ -75,6 +81,7 @@ }, { "kind": "number", + "nativeSrc": "82:1:1", "nodeType": "YulLiteral", "src": "82:1:1", "type": "", @@ -82,6 +89,7 @@ }, { "kind": "number", + "nativeSrc": "85:1:1", "nodeType": "YulLiteral", "src": "85:1:1", "type": "", @@ -91,9 +99,11 @@ "functionName": { "name": "call", + "nativeSrc": "62:4:1", "nodeType": "YulIdentifier", "src": "62:4:1" }, + "nativeSrc": "62:25:1", "nodeType": "YulFunctionCall", "src": "62:25:1" } @@ -101,12 +111,15 @@ "functionName": { "name": "pop", + "nativeSrc": "58:3:1", "nodeType": "YulIdentifier", "src": "58:3:1" }, + "nativeSrc": "58:30:1", "nodeType": "YulFunctionCall", "src": "58:30:1" }, + "nativeSrc": "58:30:1", "nodeType": "YulExpressionStatement", "src": "58:30:1" } diff --git a/test/libsolidity/ASTJSON/assembly/empty_block.json b/test/libsolidity/ASTJSON/assembly/empty_block.json index 05dc8c0c059a..3ec3c2eec018 100644 --- a/test/libsolidity/ASTJSON/assembly/empty_block.json +++ b/test/libsolidity/ASTJSON/assembly/empty_block.json @@ -39,11 +39,13 @@ { "AST": { + "nativeSrc": "61:6:1", "nodeType": "YulBlock", "src": "61:6:1", "statements": [ { + "nativeSrc": "63:2:1", "nodeType": "YulBlock", "src": "63:2:1", "statements": [] diff --git a/test/libsolidity/ASTJSON/assembly/empty_block_parseOnly.json b/test/libsolidity/ASTJSON/assembly/empty_block_parseOnly.json index 4a1d1f61474a..ee8e7b7330fb 100644 --- a/test/libsolidity/ASTJSON/assembly/empty_block_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/empty_block_parseOnly.json @@ -26,11 +26,13 @@ { "AST": { + "nativeSrc": "61:6:1", "nodeType": "YulBlock", "src": "61:6:1", "statements": [ { + "nativeSrc": "63:2:1", "nodeType": "YulBlock", "src": "63:2:1", "statements": [] diff --git a/test/libsolidity/ASTJSON/assembly/function.json b/test/libsolidity/ASTJSON/assembly/function.json index d8822183c28c..a3b908ac18b9 100644 --- a/test/libsolidity/ASTJSON/assembly/function.json +++ b/test/libsolidity/ASTJSON/assembly/function.json @@ -39,6 +39,7 @@ { "AST": { + "nativeSrc": "61:43:1", "nodeType": "YulBlock", "src": "61:43:1", "statements": @@ -46,6 +47,7 @@ { "body": { + "nativeSrc": "76:22:1", "nodeType": "YulBlock", "src": "76:22:1", "statements": @@ -60,6 +62,7 @@ [ { "kind": "number", + "nativeSrc": "92:2:1", "nodeType": "YulLiteral", "src": "92:2:1", "type": "", @@ -69,9 +72,11 @@ "functionName": { "name": "blockhash", + "nativeSrc": "82:9:1", "nodeType": "YulIdentifier", "src": "82:9:1" }, + "nativeSrc": "82:13:1", "nodeType": "YulFunctionCall", "src": "82:13:1" } @@ -79,18 +84,22 @@ "functionName": { "name": "pop", + "nativeSrc": "78:3:1", "nodeType": "YulIdentifier", "src": "78:3:1" }, + "nativeSrc": "78:18:1", "nodeType": "YulFunctionCall", "src": "78:18:1" }, + "nativeSrc": "78:18:1", "nodeType": "YulExpressionStatement", "src": "78:18:1" } ] }, "name": "g", + "nativeSrc": "63:35:1", "nodeType": "YulFunctionDefinition", "src": "63:35:1" }, @@ -101,12 +110,15 @@ "functionName": { "name": "g", + "nativeSrc": "99:1:1", "nodeType": "YulIdentifier", "src": "99:1:1" }, + "nativeSrc": "99:3:1", "nodeType": "YulFunctionCall", "src": "99:3:1" }, + "nativeSrc": "99:3:1", "nodeType": "YulExpressionStatement", "src": "99:3:1" } diff --git a/test/libsolidity/ASTJSON/assembly/function_parseOnly.json b/test/libsolidity/ASTJSON/assembly/function_parseOnly.json index 8115fc0aecbf..04f5c2721b70 100644 --- a/test/libsolidity/ASTJSON/assembly/function_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/function_parseOnly.json @@ -26,6 +26,7 @@ { "AST": { + "nativeSrc": "61:43:1", "nodeType": "YulBlock", "src": "61:43:1", "statements": @@ -33,6 +34,7 @@ { "body": { + "nativeSrc": "76:22:1", "nodeType": "YulBlock", "src": "76:22:1", "statements": @@ -47,6 +49,7 @@ [ { "kind": "number", + "nativeSrc": "92:2:1", "nodeType": "YulLiteral", "src": "92:2:1", "type": "", @@ -56,9 +59,11 @@ "functionName": { "name": "blockhash", + "nativeSrc": "82:9:1", "nodeType": "YulIdentifier", "src": "82:9:1" }, + "nativeSrc": "82:13:1", "nodeType": "YulFunctionCall", "src": "82:13:1" } @@ -66,18 +71,22 @@ "functionName": { "name": "pop", + "nativeSrc": "78:3:1", "nodeType": "YulIdentifier", "src": "78:3:1" }, + "nativeSrc": "78:18:1", "nodeType": "YulFunctionCall", "src": "78:18:1" }, + "nativeSrc": "78:18:1", "nodeType": "YulExpressionStatement", "src": "78:18:1" } ] }, "name": "g", + "nativeSrc": "63:35:1", "nodeType": "YulFunctionDefinition", "src": "63:35:1" }, @@ -88,12 +97,15 @@ "functionName": { "name": "g", + "nativeSrc": "99:1:1", "nodeType": "YulIdentifier", "src": "99:1:1" }, + "nativeSrc": "99:3:1", "nodeType": "YulFunctionCall", "src": "99:3:1" }, + "nativeSrc": "99:3:1", "nodeType": "YulExpressionStatement", "src": "99:3:1" } diff --git a/test/libsolidity/ASTJSON/assembly/leave.json b/test/libsolidity/ASTJSON/assembly/leave.json index 23ac98ccb34a..51c94f542c76 100644 --- a/test/libsolidity/ASTJSON/assembly/leave.json +++ b/test/libsolidity/ASTJSON/assembly/leave.json @@ -39,6 +39,7 @@ { "AST": { + "nativeSrc": "56:26:1", "nodeType": "YulBlock", "src": "56:26:1", "statements": @@ -46,17 +47,20 @@ { "body": { + "nativeSrc": "71:9:1", "nodeType": "YulBlock", "src": "71:9:1", "statements": [ { + "nativeSrc": "73:5:1", "nodeType": "YulLeave", "src": "73:5:1" } ] }, "name": "f", + "nativeSrc": "58:22:1", "nodeType": "YulFunctionDefinition", "src": "58:22:1" } diff --git a/test/libsolidity/ASTJSON/assembly/leave_parseOnly.json b/test/libsolidity/ASTJSON/assembly/leave_parseOnly.json index 215266456d17..ee34743eac32 100644 --- a/test/libsolidity/ASTJSON/assembly/leave_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/leave_parseOnly.json @@ -26,6 +26,7 @@ { "AST": { + "nativeSrc": "56:26:1", "nodeType": "YulBlock", "src": "56:26:1", "statements": @@ -33,17 +34,20 @@ { "body": { + "nativeSrc": "71:9:1", "nodeType": "YulBlock", "src": "71:9:1", "statements": [ { + "nativeSrc": "73:5:1", "nodeType": "YulLeave", "src": "73:5:1" } ] }, "name": "f", + "nativeSrc": "58:22:1", "nodeType": "YulFunctionDefinition", "src": "58:22:1" } diff --git a/test/libsolidity/ASTJSON/assembly/loop.json b/test/libsolidity/ASTJSON/assembly/loop.json index 7e684b4a34a6..d3d20992d772 100644 --- a/test/libsolidity/ASTJSON/assembly/loop.json +++ b/test/libsolidity/ASTJSON/assembly/loop.json @@ -39,6 +39,7 @@ { "AST": { + "nativeSrc": "61:49:1", "nodeType": "YulBlock", "src": "61:49:1", "statements": @@ -46,15 +47,18 @@ { "body": { + "nativeSrc": "90:18:1", "nodeType": "YulBlock", "src": "90:18:1", "statements": [ { + "nativeSrc": "92:5:1", "nodeType": "YulBreak", "src": "92:5:1" }, { + "nativeSrc": "98:8:1", "nodeType": "YulContinue", "src": "98:8:1" } @@ -63,14 +67,17 @@ "condition": { "kind": "number", + "nativeSrc": "70:1:1", "nodeType": "YulLiteral", "src": "70:1:1", "type": "", "value": "1" }, + "nativeSrc": "63:45:1", "nodeType": "YulForLoop", "post": { + "nativeSrc": "72:17:1", "nodeType": "YulBlock", "src": "72:17:1", "statements": @@ -85,6 +92,7 @@ [ { "kind": "number", + "nativeSrc": "84:1:1", "nodeType": "YulLiteral", "src": "84:1:1", "type": "", @@ -94,9 +102,11 @@ "functionName": { "name": "sload", + "nativeSrc": "78:5:1", "nodeType": "YulIdentifier", "src": "78:5:1" }, + "nativeSrc": "78:8:1", "nodeType": "YulFunctionCall", "src": "78:8:1" } @@ -104,12 +114,15 @@ "functionName": { "name": "pop", + "nativeSrc": "74:3:1", "nodeType": "YulIdentifier", "src": "74:3:1" }, + "nativeSrc": "74:13:1", "nodeType": "YulFunctionCall", "src": "74:13:1" }, + "nativeSrc": "74:13:1", "nodeType": "YulExpressionStatement", "src": "74:13:1" } @@ -117,6 +130,7 @@ }, "pre": { + "nativeSrc": "67:2:1", "nodeType": "YulBlock", "src": "67:2:1", "statements": [] diff --git a/test/libsolidity/ASTJSON/assembly/loop_parseOnly.json b/test/libsolidity/ASTJSON/assembly/loop_parseOnly.json index 934afdf42e65..24dbbdc4eaf8 100644 --- a/test/libsolidity/ASTJSON/assembly/loop_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/loop_parseOnly.json @@ -26,6 +26,7 @@ { "AST": { + "nativeSrc": "61:49:1", "nodeType": "YulBlock", "src": "61:49:1", "statements": @@ -33,15 +34,18 @@ { "body": { + "nativeSrc": "90:18:1", "nodeType": "YulBlock", "src": "90:18:1", "statements": [ { + "nativeSrc": "92:5:1", "nodeType": "YulBreak", "src": "92:5:1" }, { + "nativeSrc": "98:8:1", "nodeType": "YulContinue", "src": "98:8:1" } @@ -50,14 +54,17 @@ "condition": { "kind": "number", + "nativeSrc": "70:1:1", "nodeType": "YulLiteral", "src": "70:1:1", "type": "", "value": "1" }, + "nativeSrc": "63:45:1", "nodeType": "YulForLoop", "post": { + "nativeSrc": "72:17:1", "nodeType": "YulBlock", "src": "72:17:1", "statements": @@ -72,6 +79,7 @@ [ { "kind": "number", + "nativeSrc": "84:1:1", "nodeType": "YulLiteral", "src": "84:1:1", "type": "", @@ -81,9 +89,11 @@ "functionName": { "name": "sload", + "nativeSrc": "78:5:1", "nodeType": "YulIdentifier", "src": "78:5:1" }, + "nativeSrc": "78:8:1", "nodeType": "YulFunctionCall", "src": "78:8:1" } @@ -91,12 +101,15 @@ "functionName": { "name": "pop", + "nativeSrc": "74:3:1", "nodeType": "YulIdentifier", "src": "74:3:1" }, + "nativeSrc": "74:13:1", "nodeType": "YulFunctionCall", "src": "74:13:1" }, + "nativeSrc": "74:13:1", "nodeType": "YulExpressionStatement", "src": "74:13:1" } @@ -104,6 +117,7 @@ }, "pre": { + "nativeSrc": "67:2:1", "nodeType": "YulBlock", "src": "67:2:1", "statements": [] diff --git a/test/libsolidity/ASTJSON/assembly/nested_functions.json b/test/libsolidity/ASTJSON/assembly/nested_functions.json index 881e7456f1cb..3c9fd53ec03c 100644 --- a/test/libsolidity/ASTJSON/assembly/nested_functions.json +++ b/test/libsolidity/ASTJSON/assembly/nested_functions.json @@ -39,6 +39,7 @@ { "AST": { + "nativeSrc": "72:76:1", "nodeType": "YulBlock", "src": "72:76:1", "statements": @@ -46,6 +47,7 @@ { "body": { + "nativeSrc": "94:35:1", "nodeType": "YulBlock", "src": "94:35:1", "statements": @@ -53,26 +55,31 @@ { "body": { + "nativeSrc": "118:3:1", "nodeType": "YulBlock", "src": "118:3:1", "statements": [] }, "name": "f2", + "nativeSrc": "104:17:1", "nodeType": "YulFunctionDefinition", "src": "104:17:1" } ] }, "name": "f1", + "nativeSrc": "80:49:1", "nodeType": "YulFunctionDefinition", "src": "80:49:1" }, { + "nativeSrc": "136:6:1", "nodeType": "YulAssignment", "src": "136:6:1", "value": { "kind": "number", + "nativeSrc": "141:1:1", "nodeType": "YulLiteral", "src": "141:1:1", "type": "", @@ -82,6 +89,7 @@ [ { "name": "x", + "nativeSrc": "136:1:1", "nodeType": "YulIdentifier", "src": "136:1:1" } diff --git a/test/libsolidity/ASTJSON/assembly/nested_functions_parseOnly.json b/test/libsolidity/ASTJSON/assembly/nested_functions_parseOnly.json index a9ac0965aa88..b924b42cfd0e 100644 --- a/test/libsolidity/ASTJSON/assembly/nested_functions_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/nested_functions_parseOnly.json @@ -26,6 +26,7 @@ { "AST": { + "nativeSrc": "72:76:1", "nodeType": "YulBlock", "src": "72:76:1", "statements": @@ -33,6 +34,7 @@ { "body": { + "nativeSrc": "94:35:1", "nodeType": "YulBlock", "src": "94:35:1", "statements": @@ -40,26 +42,31 @@ { "body": { + "nativeSrc": "118:3:1", "nodeType": "YulBlock", "src": "118:3:1", "statements": [] }, "name": "f2", + "nativeSrc": "104:17:1", "nodeType": "YulFunctionDefinition", "src": "104:17:1" } ] }, "name": "f1", + "nativeSrc": "80:49:1", "nodeType": "YulFunctionDefinition", "src": "80:49:1" }, { + "nativeSrc": "136:6:1", "nodeType": "YulAssignment", "src": "136:6:1", "value": { "kind": "number", + "nativeSrc": "141:1:1", "nodeType": "YulLiteral", "src": "141:1:1", "type": "", @@ -69,6 +76,7 @@ [ { "name": "x", + "nativeSrc": "136:1:1", "nodeType": "YulIdentifier", "src": "136:1:1" } diff --git a/test/libsolidity/ASTJSON/assembly/slot_offset.json b/test/libsolidity/ASTJSON/assembly/slot_offset.json index e61125cbdb31..799239b3afc6 100644 --- a/test/libsolidity/ASTJSON/assembly/slot_offset.json +++ b/test/libsolidity/ASTJSON/assembly/slot_offset.json @@ -124,16 +124,19 @@ { "AST": { + "nativeSrc": "95:45:1", "nodeType": "YulBlock", "src": "95:45:1", "statements": [ { + "nativeSrc": "97:17:1", "nodeType": "YulVariableDeclaration", "src": "97:17:1", "value": { "name": "s.offset", + "nativeSrc": "106:8:1", "nodeType": "YulIdentifier", "src": "106:8:1" }, @@ -141,6 +144,7 @@ [ { "name": "x", + "nativeSrc": "101:1:1", "nodeType": "YulTypedName", "src": "101:1:1", "type": "" @@ -148,6 +152,7 @@ ] }, { + "nativeSrc": "115:23:1", "nodeType": "YulVariableDeclaration", "src": "115:23:1", "value": @@ -156,11 +161,13 @@ [ { "name": "s.slot", + "nativeSrc": "128:6:1", "nodeType": "YulIdentifier", "src": "128:6:1" }, { "kind": "number", + "nativeSrc": "136:1:1", "nodeType": "YulLiteral", "src": "136:1:1", "type": "", @@ -170,9 +177,11 @@ "functionName": { "name": "mul", + "nativeSrc": "124:3:1", "nodeType": "YulIdentifier", "src": "124:3:1" }, + "nativeSrc": "124:14:1", "nodeType": "YulFunctionCall", "src": "124:14:1" }, @@ -180,6 +189,7 @@ [ { "name": "y", + "nativeSrc": "119:1:1", "nodeType": "YulTypedName", "src": "119:1:1", "type": "" diff --git a/test/libsolidity/ASTJSON/assembly/slot_offset_parseOnly.json b/test/libsolidity/ASTJSON/assembly/slot_offset_parseOnly.json index ccf9c53fe133..ef8dc8b0adb8 100644 --- a/test/libsolidity/ASTJSON/assembly/slot_offset_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/slot_offset_parseOnly.json @@ -89,16 +89,19 @@ { "AST": { + "nativeSrc": "95:45:1", "nodeType": "YulBlock", "src": "95:45:1", "statements": [ { + "nativeSrc": "97:17:1", "nodeType": "YulVariableDeclaration", "src": "97:17:1", "value": { "name": "s.offset", + "nativeSrc": "106:8:1", "nodeType": "YulIdentifier", "src": "106:8:1" }, @@ -106,6 +109,7 @@ [ { "name": "x", + "nativeSrc": "101:1:1", "nodeType": "YulTypedName", "src": "101:1:1", "type": "" @@ -113,6 +117,7 @@ ] }, { + "nativeSrc": "115:23:1", "nodeType": "YulVariableDeclaration", "src": "115:23:1", "value": @@ -121,11 +126,13 @@ [ { "name": "s.slot", + "nativeSrc": "128:6:1", "nodeType": "YulIdentifier", "src": "128:6:1" }, { "kind": "number", + "nativeSrc": "136:1:1", "nodeType": "YulLiteral", "src": "136:1:1", "type": "", @@ -135,9 +142,11 @@ "functionName": { "name": "mul", + "nativeSrc": "124:3:1", "nodeType": "YulIdentifier", "src": "124:3:1" }, + "nativeSrc": "124:14:1", "nodeType": "YulFunctionCall", "src": "124:14:1" }, @@ -145,6 +154,7 @@ [ { "name": "y", + "nativeSrc": "119:1:1", "nodeType": "YulTypedName", "src": "119:1:1", "type": "" diff --git a/test/libsolidity/ASTJSON/assembly/stringlit.json b/test/libsolidity/ASTJSON/assembly/stringlit.json index 33211190e5ae..ab27a3d16ff6 100644 --- a/test/libsolidity/ASTJSON/assembly/stringlit.json +++ b/test/libsolidity/ASTJSON/assembly/stringlit.json @@ -39,17 +39,20 @@ { "AST": { + "nativeSrc": "56:18:1", "nodeType": "YulBlock", "src": "56:18:1", "statements": [ { + "nativeSrc": "58:14:1", "nodeType": "YulVariableDeclaration", "src": "58:14:1", "value": { "hexValue": "616263", "kind": "string", + "nativeSrc": "67:5:1", "nodeType": "YulLiteral", "src": "67:5:1", "type": "", @@ -59,6 +62,7 @@ [ { "name": "x", + "nativeSrc": "62:1:1", "nodeType": "YulTypedName", "src": "62:1:1", "type": "" diff --git a/test/libsolidity/ASTJSON/assembly/stringlit_parseOnly.json b/test/libsolidity/ASTJSON/assembly/stringlit_parseOnly.json index dd4e1d0610ff..3cb2a907287d 100644 --- a/test/libsolidity/ASTJSON/assembly/stringlit_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/stringlit_parseOnly.json @@ -26,17 +26,20 @@ { "AST": { + "nativeSrc": "56:18:1", "nodeType": "YulBlock", "src": "56:18:1", "statements": [ { + "nativeSrc": "58:14:1", "nodeType": "YulVariableDeclaration", "src": "58:14:1", "value": { "hexValue": "616263", "kind": "string", + "nativeSrc": "67:5:1", "nodeType": "YulLiteral", "src": "67:5:1", "type": "", @@ -46,6 +49,7 @@ [ { "name": "x", + "nativeSrc": "62:1:1", "nodeType": "YulTypedName", "src": "62:1:1", "type": "" diff --git a/test/libsolidity/ASTJSON/assembly/switch.json b/test/libsolidity/ASTJSON/assembly/switch.json index 26874da0e978..99c69e048bfb 100644 --- a/test/libsolidity/ASTJSON/assembly/switch.json +++ b/test/libsolidity/ASTJSON/assembly/switch.json @@ -39,16 +39,19 @@ { "AST": { + "nativeSrc": "61:129:1", "nodeType": "YulBlock", "src": "61:129:1", "statements": [ { + "nativeSrc": "75:10:1", "nodeType": "YulVariableDeclaration", "src": "75:10:1", "value": { "kind": "number", + "nativeSrc": "84:1:1", "nodeType": "YulLiteral", "src": "84:1:1", "type": "", @@ -58,6 +61,7 @@ [ { "name": "v", + "nativeSrc": "79:1:1", "nodeType": "YulTypedName", "src": "79:1:1", "type": "" @@ -70,16 +74,19 @@ { "body": { + "nativeSrc": "139:10:1", "nodeType": "YulBlock", "src": "139:10:1", "statements": [ { + "nativeSrc": "141:6:1", "nodeType": "YulAssignment", "src": "141:6:1", "value": { "kind": "number", + "nativeSrc": "146:1:1", "nodeType": "YulLiteral", "src": "146:1:1", "type": "", @@ -89,6 +96,7 @@ [ { "name": "v", + "nativeSrc": "141:1:1", "nodeType": "YulIdentifier", "src": "141:1:1" } @@ -96,11 +104,13 @@ } ] }, + "nativeSrc": "132:17:1", "nodeType": "YulCase", "src": "132:17:1", "value": { "kind": "number", + "nativeSrc": "137:1:1", "nodeType": "YulLiteral", "src": "137:1:1", "type": "", @@ -110,16 +120,19 @@ { "body": { + "nativeSrc": "170:10:1", "nodeType": "YulBlock", "src": "170:10:1", "statements": [ { + "nativeSrc": "172:6:1", "nodeType": "YulAssignment", "src": "172:6:1", "value": { "kind": "number", + "nativeSrc": "177:1:1", "nodeType": "YulLiteral", "src": "177:1:1", "type": "", @@ -129,6 +142,7 @@ [ { "name": "v", + "nativeSrc": "172:1:1", "nodeType": "YulIdentifier", "src": "172:1:1" } @@ -136,6 +150,7 @@ } ] }, + "nativeSrc": "162:18:1", "nodeType": "YulCase", "src": "162:18:1", "value": "default" @@ -147,12 +162,15 @@ "functionName": { "name": "calldatasize", + "nativeSrc": "105:12:1", "nodeType": "YulIdentifier", "src": "105:12:1" }, + "nativeSrc": "105:14:1", "nodeType": "YulFunctionCall", "src": "105:14:1" }, + "nativeSrc": "98:82:1", "nodeType": "YulSwitch", "src": "98:82:1" } diff --git a/test/libsolidity/ASTJSON/assembly/switch_default.json b/test/libsolidity/ASTJSON/assembly/switch_default.json index d472ea0183a1..07f804f3cb74 100644 --- a/test/libsolidity/ASTJSON/assembly/switch_default.json +++ b/test/libsolidity/ASTJSON/assembly/switch_default.json @@ -39,6 +39,7 @@ { "AST": { + "nativeSrc": "61:33:1", "nodeType": "YulBlock", "src": "61:33:1", "statements": @@ -49,15 +50,18 @@ { "body": { + "nativeSrc": "79:2:1", "nodeType": "YulBlock", "src": "79:2:1", "statements": [] }, + "nativeSrc": "72:9:1", "nodeType": "YulCase", "src": "72:9:1", "value": { "kind": "number", + "nativeSrc": "77:1:1", "nodeType": "YulLiteral", "src": "77:1:1", "type": "", @@ -67,10 +71,12 @@ { "body": { + "nativeSrc": "90:2:1", "nodeType": "YulBlock", "src": "90:2:1", "statements": [] }, + "nativeSrc": "82:10:1", "nodeType": "YulCase", "src": "82:10:1", "value": "default" @@ -79,11 +85,13 @@ "expression": { "kind": "number", + "nativeSrc": "70:1:1", "nodeType": "YulLiteral", "src": "70:1:1", "type": "", "value": "0" }, + "nativeSrc": "63:29:1", "nodeType": "YulSwitch", "src": "63:29:1" } diff --git a/test/libsolidity/ASTJSON/assembly/switch_default_parseOnly.json b/test/libsolidity/ASTJSON/assembly/switch_default_parseOnly.json index e4a3e1b40c77..2ec302770814 100644 --- a/test/libsolidity/ASTJSON/assembly/switch_default_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/switch_default_parseOnly.json @@ -26,6 +26,7 @@ { "AST": { + "nativeSrc": "61:33:1", "nodeType": "YulBlock", "src": "61:33:1", "statements": @@ -36,15 +37,18 @@ { "body": { + "nativeSrc": "79:2:1", "nodeType": "YulBlock", "src": "79:2:1", "statements": [] }, + "nativeSrc": "72:9:1", "nodeType": "YulCase", "src": "72:9:1", "value": { "kind": "number", + "nativeSrc": "77:1:1", "nodeType": "YulLiteral", "src": "77:1:1", "type": "", @@ -54,10 +58,12 @@ { "body": { + "nativeSrc": "90:2:1", "nodeType": "YulBlock", "src": "90:2:1", "statements": [] }, + "nativeSrc": "82:10:1", "nodeType": "YulCase", "src": "82:10:1", "value": "default" @@ -66,11 +72,13 @@ "expression": { "kind": "number", + "nativeSrc": "70:1:1", "nodeType": "YulLiteral", "src": "70:1:1", "type": "", "value": "0" }, + "nativeSrc": "63:29:1", "nodeType": "YulSwitch", "src": "63:29:1" } diff --git a/test/libsolidity/ASTJSON/assembly/switch_parseOnly.json b/test/libsolidity/ASTJSON/assembly/switch_parseOnly.json index d7392a8c8c63..2412ea48dd0c 100644 --- a/test/libsolidity/ASTJSON/assembly/switch_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/switch_parseOnly.json @@ -26,16 +26,19 @@ { "AST": { + "nativeSrc": "61:129:1", "nodeType": "YulBlock", "src": "61:129:1", "statements": [ { + "nativeSrc": "75:10:1", "nodeType": "YulVariableDeclaration", "src": "75:10:1", "value": { "kind": "number", + "nativeSrc": "84:1:1", "nodeType": "YulLiteral", "src": "84:1:1", "type": "", @@ -45,6 +48,7 @@ [ { "name": "v", + "nativeSrc": "79:1:1", "nodeType": "YulTypedName", "src": "79:1:1", "type": "" @@ -57,16 +61,19 @@ { "body": { + "nativeSrc": "139:10:1", "nodeType": "YulBlock", "src": "139:10:1", "statements": [ { + "nativeSrc": "141:6:1", "nodeType": "YulAssignment", "src": "141:6:1", "value": { "kind": "number", + "nativeSrc": "146:1:1", "nodeType": "YulLiteral", "src": "146:1:1", "type": "", @@ -76,6 +83,7 @@ [ { "name": "v", + "nativeSrc": "141:1:1", "nodeType": "YulIdentifier", "src": "141:1:1" } @@ -83,11 +91,13 @@ } ] }, + "nativeSrc": "132:17:1", "nodeType": "YulCase", "src": "132:17:1", "value": { "kind": "number", + "nativeSrc": "137:1:1", "nodeType": "YulLiteral", "src": "137:1:1", "type": "", @@ -97,16 +107,19 @@ { "body": { + "nativeSrc": "170:10:1", "nodeType": "YulBlock", "src": "170:10:1", "statements": [ { + "nativeSrc": "172:6:1", "nodeType": "YulAssignment", "src": "172:6:1", "value": { "kind": "number", + "nativeSrc": "177:1:1", "nodeType": "YulLiteral", "src": "177:1:1", "type": "", @@ -116,6 +129,7 @@ [ { "name": "v", + "nativeSrc": "172:1:1", "nodeType": "YulIdentifier", "src": "172:1:1" } @@ -123,6 +137,7 @@ } ] }, + "nativeSrc": "162:18:1", "nodeType": "YulCase", "src": "162:18:1", "value": "default" @@ -134,12 +149,15 @@ "functionName": { "name": "calldatasize", + "nativeSrc": "105:12:1", "nodeType": "YulIdentifier", "src": "105:12:1" }, + "nativeSrc": "105:14:1", "nodeType": "YulFunctionCall", "src": "105:14:1" }, + "nativeSrc": "98:82:1", "nodeType": "YulSwitch", "src": "98:82:1" } diff --git a/test/libsolidity/ASTJSON/assembly/var_access.json b/test/libsolidity/ASTJSON/assembly/var_access.json index c93667df2aa3..ae7845815fa2 100644 --- a/test/libsolidity/ASTJSON/assembly/var_access.json +++ b/test/libsolidity/ASTJSON/assembly/var_access.json @@ -81,16 +81,19 @@ { "AST": { + "nativeSrc": "77:10:1", "nodeType": "YulBlock", "src": "77:10:1", "statements": [ { + "nativeSrc": "79:6:1", "nodeType": "YulAssignment", "src": "79:6:1", "value": { "kind": "number", + "nativeSrc": "84:1:1", "nodeType": "YulLiteral", "src": "84:1:1", "type": "", @@ -100,6 +103,7 @@ [ { "name": "x", + "nativeSrc": "79:1:1", "nodeType": "YulIdentifier", "src": "79:1:1" } diff --git a/test/libsolidity/ASTJSON/assembly/var_access_parseOnly.json b/test/libsolidity/ASTJSON/assembly/var_access_parseOnly.json index b56324944f26..ca3fcf92c91e 100644 --- a/test/libsolidity/ASTJSON/assembly/var_access_parseOnly.json +++ b/test/libsolidity/ASTJSON/assembly/var_access_parseOnly.json @@ -59,16 +59,19 @@ { "AST": { + "nativeSrc": "77:10:1", "nodeType": "YulBlock", "src": "77:10:1", "statements": [ { + "nativeSrc": "79:6:1", "nodeType": "YulAssignment", "src": "79:6:1", "value": { "kind": "number", + "nativeSrc": "84:1:1", "nodeType": "YulLiteral", "src": "84:1:1", "type": "", @@ -78,6 +81,7 @@ [ { "name": "x", + "nativeSrc": "79:1:1", "nodeType": "YulIdentifier", "src": "79:1:1" } diff --git a/test/libsolidity/ASTJSON/yul_hex_literal.json b/test/libsolidity/ASTJSON/yul_hex_literal.json index 0b3fa41741b3..0498289c6729 100644 --- a/test/libsolidity/ASTJSON/yul_hex_literal.json +++ b/test/libsolidity/ASTJSON/yul_hex_literal.json @@ -39,17 +39,20 @@ { "AST": { + "nativeSrc": "66:142:1", "nodeType": "YulBlock", "src": "66:142:1", "statements": [ { + "nativeSrc": "80:15:1", "nodeType": "YulVariableDeclaration", "src": "80:15:1", "value": { "hexValue": "74657374", "kind": "string", + "nativeSrc": "89:6:1", "nodeType": "YulLiteral", "src": "89:6:1", "type": "", @@ -59,6 +62,7 @@ [ { "name": "a", + "nativeSrc": "84:1:1", "nodeType": "YulTypedName", "src": "84:1:1", "type": "" @@ -66,12 +70,14 @@ ] }, { + "nativeSrc": "108:54:1", "nodeType": "YulVariableDeclaration", "src": "108:54:1", "value": { "hexValue": "112233445566778899aabbccddeeff6677889900", "kind": "string", + "nativeSrc": "117:45:1", "nodeType": "YulLiteral", "src": "117:45:1", "type": "" @@ -80,6 +86,7 @@ [ { "name": "b", + "nativeSrc": "112:1:1", "nodeType": "YulTypedName", "src": "112:1:1", "type": "" @@ -87,12 +94,14 @@ ] }, { + "nativeSrc": "175:23:1", "nodeType": "YulVariableDeclaration", "src": "175:23:1", "value": { "hexValue": "1234abcd", "kind": "string", + "nativeSrc": "184:14:1", "nodeType": "YulLiteral", "src": "184:14:1", "type": "" @@ -101,6 +110,7 @@ [ { "name": "c", + "nativeSrc": "179:1:1", "nodeType": "YulTypedName", "src": "179:1:1", "type": "" diff --git a/test/libsolidity/ASTJSON/yul_hex_literal_parseOnly.json b/test/libsolidity/ASTJSON/yul_hex_literal_parseOnly.json index 3551ac2d99a4..023c13cc7423 100644 --- a/test/libsolidity/ASTJSON/yul_hex_literal_parseOnly.json +++ b/test/libsolidity/ASTJSON/yul_hex_literal_parseOnly.json @@ -26,17 +26,20 @@ { "AST": { + "nativeSrc": "66:142:1", "nodeType": "YulBlock", "src": "66:142:1", "statements": [ { + "nativeSrc": "80:15:1", "nodeType": "YulVariableDeclaration", "src": "80:15:1", "value": { "hexValue": "74657374", "kind": "string", + "nativeSrc": "89:6:1", "nodeType": "YulLiteral", "src": "89:6:1", "type": "", @@ -46,6 +49,7 @@ [ { "name": "a", + "nativeSrc": "84:1:1", "nodeType": "YulTypedName", "src": "84:1:1", "type": "" @@ -53,12 +57,14 @@ ] }, { + "nativeSrc": "108:54:1", "nodeType": "YulVariableDeclaration", "src": "108:54:1", "value": { "hexValue": "112233445566778899aabbccddeeff6677889900", "kind": "string", + "nativeSrc": "117:45:1", "nodeType": "YulLiteral", "src": "117:45:1", "type": "" @@ -67,6 +73,7 @@ [ { "name": "b", + "nativeSrc": "112:1:1", "nodeType": "YulTypedName", "src": "112:1:1", "type": "" @@ -74,12 +81,14 @@ ] }, { + "nativeSrc": "175:23:1", "nodeType": "YulVariableDeclaration", "src": "175:23:1", "value": { "hexValue": "1234abcd", "kind": "string", + "nativeSrc": "184:14:1", "nodeType": "YulLiteral", "src": "184:14:1", "type": "" @@ -88,6 +97,7 @@ [ { "name": "c", + "nativeSrc": "179:1:1", "nodeType": "YulTypedName", "src": "179:1:1", "type": "" diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 2883f5c51f09..1b5d8da49d70 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) "dir1/file1.sol:L=0x1234567890123456789012345678901234567890," "dir2/file2.sol:L=0x1111122222333334444455555666667777788888", "--ast-compact-json", "--asm", "--asm-json", "--opcodes", "--bin", "--bin-runtime", "--abi", - "--ir", "--ir-optimized", "--hashes", "--userdoc", "--devdoc", "--metadata", "--storage-layout", + "--ir", "--ir-ast-json", "--ir-optimized", "--ir-optimized-ast-json", "--hashes", "--userdoc", "--devdoc", "--metadata", "--storage-layout", "--gas", "--combined-json=" "abi,metadata,bin,bin-runtime,opcodes,asm,storage-layout,generated-sources,generated-sources-runtime," @@ -192,7 +192,8 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) expectedOptions.compiler.outputs = { true, true, true, true, true, true, true, true, true, true, - true, true, true, true, + true, true, true, true, true, + true, }; expectedOptions.compiler.estimateGas = true; expectedOptions.compiler.combinedJsonRequests = { @@ -290,6 +291,7 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options) "--asm", "--bin", "--ir-optimized", + "--ast-compact-json", }; commandLine += assemblyOptions; if (expectedLanguage == YulStack::Language::StrictAssembly) @@ -329,6 +331,7 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options) expectedOptions.compiler.outputs.asm_ = true; expectedOptions.compiler.outputs.binary = true; expectedOptions.compiler.outputs.irOptimized = true; + expectedOptions.compiler.outputs.astCompactJson = true; if (expectedLanguage == YulStack::Language::StrictAssembly) { expectedOptions.optimizer.enabled = true; From 5893e099fee735b8602cf8429d2a65164955407a Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Fri, 26 May 2023 11:08:34 +0200 Subject: [PATCH 032/138] Allow qualified access to events from other contracts --- Changelog.md | 2 +- libsolidity/ast/AST.h | 2 +- .../semanticTests/events/event_selector.sol | 29 +++++++++++++++---- ...event_selector_access_foreign_contract.sol | 1 - .../event_selector_access_interface.sol | 1 - .../events/event_selector_syntax.sol | 15 ++++++++++ 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Changelog.md b/Changelog.md index 159ec5187a9a..79c8a634f9d0 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,7 +1,7 @@ ### 0.8.21 (unreleased) Language Features: - + * Allow qualified access to events from other contracts. Compiler Features: * EWasm: Remove EWasm backend. diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 494cbeac2123..9d754202da59 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -1261,7 +1261,7 @@ class EventDefinition: public CallableDeclaration, public StructurallyDocumented FunctionTypePointer functionType(bool /*_internal*/) const override; bool isVisibleInDerivedContracts() const override { return true; } - bool isVisibleViaContractTypeAccess() const override { return false; /* TODO */ } + bool isVisibleViaContractTypeAccess() const override { return true; } EventDefinitionAnnotation& annotation() const override; diff --git a/test/libsolidity/semanticTests/events/event_selector.sol b/test/libsolidity/semanticTests/events/event_selector.sol index 116e2329e649..b42ba490838b 100644 --- a/test/libsolidity/semanticTests/events/event_selector.sol +++ b/test/libsolidity/semanticTests/events/event_selector.sol @@ -1,32 +1,49 @@ library L { event E(); } + library S { event E(uint); } + library T { event E(); } +interface I { + event E(); +} + +contract B { + event E(); +} + contract D { event F(); } contract C is D { - function test1() external pure returns (bytes32, bytes32) { + function test1() external pure returns (bytes32, bytes32, bytes32, bytes32) { assert(L.E.selector == T.E.selector); + assert(I.E.selector == L.E.selector); + assert(T.E.selector == I.E.selector); + assert(B.E.selector == T.E.selector); assert(L.E.selector != S.E.selector); assert(T.E.selector != S.E.selector); + assert(I.E.selector != S.E.selector); + assert(B.E.selector != S.E.selector); - return (L.E.selector, S.E.selector); + return (L.E.selector, S.E.selector, I.E.selector, B.E.selector); } bytes32 s1 = L.E.selector; bytes32 s2 = S.E.selector; bytes32 s3 = T.E.selector; - function test2() external returns (bytes32, bytes32, bytes32) { - return (s1, s2, s3); + bytes32 s4 = I.E.selector; + bytes32 s5 = B.E.selector; + function test2() external returns (bytes32, bytes32, bytes32, bytes32, bytes32) { + return (s1, s2, s3, s4, s5); } function test3() external returns (bytes32) { @@ -36,6 +53,6 @@ contract C is D { // ==== // compileViaYul: also // ---- -// test1() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0 -// test2() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028 +// test1() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028 +// test2() -> 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x2ff0672f372fbe844b353429d4510ea5e43683af134c54f75f789ff57bc0c0, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028, 0x92bbf6e823a631f3c8e09b1c8df90f378fb56f7fbc9701827e1ff8aad7f6a028 // test3() -> 0x28811f5935c16a099486acb976b3a6b4942950a1425a74e9eb3e9b7f7135e12a diff --git a/test/libsolidity/syntaxTests/events/event_selector_access_foreign_contract.sol b/test/libsolidity/syntaxTests/events/event_selector_access_foreign_contract.sol index b878543fc07f..ccc2b199cff9 100644 --- a/test/libsolidity/syntaxTests/events/event_selector_access_foreign_contract.sol +++ b/test/libsolidity/syntaxTests/events/event_selector_access_foreign_contract.sol @@ -8,4 +8,3 @@ contract C { } } // ---- -// TypeError 9582: (110-113): Member "E" not found or not visible after argument-dependent lookup in type(contract D). diff --git a/test/libsolidity/syntaxTests/events/event_selector_access_interface.sol b/test/libsolidity/syntaxTests/events/event_selector_access_interface.sol index 2877fee5659b..2b4cd4e92992 100644 --- a/test/libsolidity/syntaxTests/events/event_selector_access_interface.sol +++ b/test/libsolidity/syntaxTests/events/event_selector_access_interface.sol @@ -8,4 +8,3 @@ contract C { } } // ---- -// TypeError 9582: (111-114): Member "E" not found or not visible after argument-dependent lookup in type(contract I). diff --git a/test/libsolidity/syntaxTests/events/event_selector_syntax.sol b/test/libsolidity/syntaxTests/events/event_selector_syntax.sol index ecbfe9bc51c5..fec21b55f53b 100644 --- a/test/libsolidity/syntaxTests/events/event_selector_syntax.sol +++ b/test/libsolidity/syntaxTests/events/event_selector_syntax.sol @@ -2,19 +2,34 @@ library L { event E(bytes32, bool, bytes indexed); } +interface I { + event E(bytes32, bool, bytes indexed); +} + +contract A { + event E(bytes32, bool, bytes indexed); +} + contract B { event E(bytes32, bool, bytes indexed); } contract C is B { bytes32 public librarySelector = L.E.selector; + bytes32 public interfaceSelector = I.E.selector; + bytes32 public foreignContractSelector = A.E.selector; bytes32 inheritedSelector = E.selector; function f() public { assert(librarySelector == L.E.selector); + assert(interfaceSelector == I.E.selector); + assert(foreignContractSelector == A.E.selector); assert(E.selector == B.E.selector); emit E(E.selector, true, "123"); + emit I.E((B.E.selector), true, "123"); + emit A.E((B.E.selector), true, "123"); emit L.E((B.E.selector), true, "123"); } } +// ---- From b0419da65480b7fc3b35fac4d6b59826767786d5 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Thu, 25 May 2023 11:56:47 +0200 Subject: [PATCH 033/138] [SMTChecker] Remember verification targets from trusted external calls Previously, we did not remember trusted external calls for later phase when we compute possible verification targets for each function. This led to false negative in cases where verification target can be violated, but not by calling a public function directly, but only when it is called as an external function from other function. The added test cases witnesses this behaviour. The underflow in `dec` cannot happen in any other way except what the `dec` is called from `f`. The same problem did not occur when the functions are called internally, because for such cases, we have already been remembering these calls in the callgraph in the CHC engine. --- Changelog.md | 2 +- libsolidity/formal/CHC.cpp | 6 +++++ .../deployment/deploy_trusted_flow.sol | 5 +--- .../underflow_only_in_external_call.sol | 23 +++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol diff --git a/Changelog.md b/Changelog.md index 159ec5187a9a..6746c24e4241 100644 --- a/Changelog.md +++ b/Changelog.md @@ -11,7 +11,7 @@ Compiler Features: Bugfixes: * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. - + * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. AST Changes: * AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``. diff --git a/libsolidity/formal/CHC.cpp b/libsolidity/formal/CHC.cpp index c6e737dbe62c..1f7fc8bade58 100644 --- a/libsolidity/formal/CHC.cpp +++ b/libsolidity/formal/CHC.cpp @@ -1000,6 +1000,12 @@ void CHC::externalFunctionCallToTrustedCode(FunctionCall const& _funCall) if (!function) return; + // Remember the external call in the call graph to properly detect verification targets for the current function + if (m_currentFunction && !m_currentFunction->isConstructor()) + m_callGraph[m_currentFunction].insert(function); + else + m_callGraph[m_currentContract].insert(function); + // External call creates a new transaction. auto originalTx = state().tx(); Expression const* value = valueOption(callOptions); diff --git a/test/libsolidity/smtCheckerTests/deployment/deploy_trusted_flow.sol b/test/libsolidity/smtCheckerTests/deployment/deploy_trusted_flow.sol index dcc81be6432e..eb0a0c0498ae 100644 --- a/test/libsolidity/smtCheckerTests/deployment/deploy_trusted_flow.sol +++ b/test/libsolidity/smtCheckerTests/deployment/deploy_trusted_flow.sol @@ -21,11 +21,8 @@ contract C { // SMTIgnoreOS: macos // ---- // Warning 4984: (47-50): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here. -// Warning 6328: (167-185): CHC: Assertion violation might happen here. // Warning 6328: (215-233): CHC: Assertion violation might happen here. -// Warning 6328: (267-285): CHC: Assertion violation might happen here. // Warning 6328: (304-322): CHC: Assertion violation happens here. +// Info 1391: CHC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. // Warning 2661: (47-50): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. -// Warning 4661: (167-185): BMC: Assertion violation happens here. // Warning 4661: (215-233): BMC: Assertion violation happens here. -// Warning 4661: (267-285): BMC: Assertion violation happens here. diff --git a/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol b/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol new file mode 100644 index 000000000000..a0c3a06b4d9a --- /dev/null +++ b/test/libsolidity/smtCheckerTests/external_calls/underflow_only_in_external_call.sol @@ -0,0 +1,23 @@ +contract C { + + uint v; + bool guard = true; + + function dec() public returns (uint) { + if (guard) return 0; + --v; + return v; + } + + function f() public returns (uint) { + guard = false; + uint ret = this.dec(); + guard = true; + return ret; + } +} +// ==== +// SMTEngine: chc +// SMTTargets: underflow +// ---- +// Warning 3944: (109-112): CHC: Underflow (resulting value less than 0) happens here. From 8ca453f82ec2a37f808129501fbe0edee30b2431 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Fri, 26 May 2023 14:10:33 +0200 Subject: [PATCH 034/138] SMTChecker: External function call with struct member is not getter if a struct has a member that is a function pointer with `external` attribute, and such a member is called, it is currently incorrectly treated as a public getter in SMTEncoder. The proposed fix is to make SMTEncoder::publicGetter more strict in deciding whether an expression is a public getter. The added condition, that the access happens on a state variable, is exactly what is checked later with an assertion that is currently failing. --- libsolidity/formal/SMTEncoder.cpp | 3 +- .../struct_external_function_pointer.sol | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/libsolidity/smtCheckerTests/types/struct/struct_external_function_pointer.sol diff --git a/libsolidity/formal/SMTEncoder.cpp b/libsolidity/formal/SMTEncoder.cpp index 8f22ab824991..818efac5cbb1 100644 --- a/libsolidity/formal/SMTEncoder.cpp +++ b/libsolidity/formal/SMTEncoder.cpp @@ -2839,7 +2839,8 @@ smtutil::Expression SMTEncoder::contractAddressValue(FunctionCall const& _f) VariableDeclaration const* SMTEncoder::publicGetter(Expression const& _expr) const { if (auto memberAccess = dynamic_cast(&_expr)) - return dynamic_cast(memberAccess->annotation().referencedDeclaration); + if (auto variableDeclaration = dynamic_cast(memberAccess->annotation().referencedDeclaration)) + return variableDeclaration->isStateVariable() ? variableDeclaration : nullptr; return nullptr; } diff --git a/test/libsolidity/smtCheckerTests/types/struct/struct_external_function_pointer.sol b/test/libsolidity/smtCheckerTests/types/struct/struct_external_function_pointer.sol new file mode 100644 index 000000000000..494d2dcf2b6f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/types/struct/struct_external_function_pointer.sol @@ -0,0 +1,33 @@ +struct S { + function() external returns (uint) x; +} +contract C { + + function X() public pure returns (uint) { + return 1; + } + + uint y; + uint z; + + function setZ(uint _z) public { + z = _z; + } + + + function f() public returns (uint) { + S memory s; + s.x = this.X; + require(y == 0); + require(z == 0); + uint ret = s.x(); + assert(y == 0); // should hold + assert(z == 0); // can report violation due to overapproximation after externall call s.x() + return ret; + } +} + + +// ---- +// Warning 6328: (431-445): CHC: Assertion violation happens here. +// Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. From 2260c23ce1895344ac3088a8a8f1bf4f9238961e Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Thu, 25 May 2023 15:22:35 -0300 Subject: [PATCH 035/138] Fix mistake about default value for inliner setting --- docs/internals/optimizer.rst | 2 +- docs/metadata.rst | 4 ++-- docs/using-the-compiler.rst | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/internals/optimizer.rst b/docs/internals/optimizer.rst index 7d168d2209cd..d3df1b60094b 100644 --- a/docs/internals/optimizer.rst +++ b/docs/internals/optimizer.rst @@ -27,7 +27,7 @@ optimized Yul IR for a Solidity source. Similarly, one can use ``solc --strict-a for a stand-alone Yul mode. .. note:: - The `peephole optimizer `_ and the inliner are always + The `peephole optimizer `_ is always enabled by default and can only be turned off via the :ref:`Standard JSON `. You can find more details on both optimizer modules and their optimization steps below. diff --git a/docs/metadata.rst b/docs/metadata.rst index d71235653fd8..c87722bb26c7 100644 --- a/docs/metadata.rst +++ b/docs/metadata.rst @@ -153,8 +153,8 @@ explanatory purposes. "constantOptimizer": false, "cse": false, "deduplicate": false, - // inliner defaults to "true" - "inliner": true, + // inliner defaults to "false" + "inliner": false, // jumpdestRemover defaults to "true" "jumpdestRemover": true, "orderLiterals": false, diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 4c94923e0651..d43c78e7c033 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -272,9 +272,9 @@ Input Description // The peephole optimizer is always on if no details are given, // use details to switch it off. "peephole": true, - // The inliner is always on if no details are given, - // use details to switch it off. - "inliner": true, + // The inliner is always off if no details are given, + // use details to switch it on. + "inliner": false, // The unused jumpdest remover is always on if no details are given, // use details to switch it off. "jumpdestRemover": true, @@ -647,4 +647,4 @@ Error Types 12. ``FatalError``: Fatal error not processed correctly - this should be reported as an issue. 13. ``YulException``: Error during Yul code generation - this should be reported as an issue. 14. ``Warning``: A warning, which didn't stop the compilation, but should be addressed if possible. -15. ``Info``: Information that the compiler thinks the user might find useful, but is not dangerous and does not necessarily need to be addressed. \ No newline at end of file +15. ``Info``: Information that the compiler thinks the user might find useful, but is not dangerous and does not necessarily need to be addressed. From cf106c44fef79631a2f4c6568310c6bae613fc35 Mon Sep 17 00:00:00 2001 From: David Bar-On Date: Wed, 24 May 2023 10:23:53 +0300 Subject: [PATCH 036/138] Fix issue 14259 - help text about standard input usage --- solc/CommandLineParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 514073389048..da818411ec84 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -522,8 +522,8 @@ are welcome to redistribute it under certain conditions. See 'solc --)" + g_strL for details. Usage: solc [options] [input_file...] -Compiles the given Solidity input files (or the standard input if none given or -"-" is used as a file name) and outputs the components specified in the options +Compiles the given Solidity input files (or the standard input if "-" is +used as a file name) and outputs the components specified in the options at standard output or in files in the output directory, if specified. Imports are automatically read from the filesystem, but it is also possible to remap paths using the context:prefix=path syntax. From 3eedc635c44771a643a8e8e11fc77f7137129d1b Mon Sep 17 00:00:00 2001 From: Nuno Santos Date: Tue, 30 May 2023 20:49:25 +0100 Subject: [PATCH 037/138] Misspelling and terms inconsistencies (#14280) * Installing solidity tweeks * A few more misspells * More inconsistencies fixed * Removed contractions according to our guide. --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- CODING_STYLE.md | 2 +- ReleaseChecklist.md | 2 +- docs/050-breaking-changes.rst | 10 ++--- docs/060-breaking-changes.rst | 12 +++--- docs/080-breaking-changes.rst | 10 ++--- docs/abi-spec.rst | 2 +- docs/assembly.rst | 4 +- docs/cheatsheet.rst | 4 +- docs/contracts/function-modifiers.rst | 2 +- docs/contracts/functions.rst | 2 +- docs/contracts/inheritance.rst | 8 ++-- docs/contributing.rst | 8 ++-- docs/control-structures.rst | 8 ++-- docs/examples/micropayment.rst | 2 +- docs/examples/modular.rst | 2 +- docs/installing-solidity.rst | 53 ++++++++++++------------ docs/introduction-to-smart-contracts.rst | 4 +- docs/ir-breaking-changes.rst | 4 +- docs/metadata.rst | 4 +- docs/path-resolution.rst | 14 +++---- docs/resources.rst | 2 +- docs/smtchecker.rst | 6 +-- docs/style-guide.rst | 4 +- docs/types/conversion.rst | 2 +- docs/types/reference-types.rst | 12 +++--- docs/types/value-types.rst | 2 +- docs/units-and-global-variables.rst | 2 +- docs/using-the-compiler.rst | 10 ++--- docs/yul.rst | 8 ++-- tools/yulPhaser/README.md | 4 +- 31 files changed, 105 insertions(+), 106 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 49acab231fa4..30c09039ef79 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -36,7 +36,7 @@ assignees: '' version is bumped to 0.5.0. 5. The 0.5.0 release is made. -This behaviour works well with the :ref:`version pragma `. +This behavior works well with the :ref:`version pragma `. diff --git a/docs/introduction-to-smart-contracts.rst b/docs/introduction-to-smart-contracts.rst index 5595a2fed888..c4cc1201b02a 100644 --- a/docs/introduction-to-smart-contracts.rst +++ b/docs/introduction-to-smart-contracts.rst @@ -564,7 +564,7 @@ contracts, the Ether is forever lost. .. warning:: From version 0.8.18 and up, the use of ``selfdestruct`` in both Solidity and Yul will trigger a - deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behaviour + deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behavior as stated in `EIP-6049 `_. .. warning:: @@ -591,7 +591,7 @@ Precompiled Contracts There is a small set of contract addresses that are special: The address range between ``1`` and (including) ``8`` contains "precompiled contracts" that can be called as any other contract -but their behaviour (and their gas consumption) is not defined +but their behavior (and their gas consumption) is not defined by EVM code stored at that address (they do not contain code) but instead is implemented in the EVM execution environment itself. diff --git a/docs/ir-breaking-changes.rst b/docs/ir-breaking-changes.rst index 9cee46793284..38e6b552f35d 100644 --- a/docs/ir-breaking-changes.rst +++ b/docs/ir-breaking-changes.rst @@ -15,13 +15,13 @@ The IR-based code generator was introduced with an aim to not only allow code generation to be more transparent and auditable but also to enable more powerful optimization passes that span across functions. -You can enable it on the command line using ``--via-ir`` +You can enable it on the command-line using ``--via-ir`` or with the option ``{"viaIR": true}`` in standard-json and we encourage everyone to try it out! For several reasons, there are tiny semantic differences between the old and the IR-based code generator, mostly in areas where we would not -expect people to rely on this behaviour anyway. +expect people to rely on this behavior anyway. This section highlights the main differences between the old and the IR-based codegen. Semantic Only Changes diff --git a/docs/metadata.rst b/docs/metadata.rst index c87722bb26c7..ede16a73fd8e 100644 --- a/docs/metadata.rst +++ b/docs/metadata.rst @@ -147,7 +147,7 @@ explanatory purposes. "useLiteralContent": true }, // Optional: Optimizer settings. The fields "enabled" and "runs" are deprecated - // and are only given for backwards-compatibility. + // and are only given for backward-compatibility. "optimizer": { "details": { "constantOptimizer": false, @@ -241,7 +241,7 @@ relevant part of the bytecode can be decoded with a CBOR decoder. Check the `Metadata Playground `_ to see it in action. Whereas release builds of solc use a 3 byte encoding of the version as shown -above (one byte each for major, minor and patch version number), prerelease builds +above (one byte each for major, minor and patch version number), pre-release builds will instead use a complete version string including commit hash and build date. The commandline flag ``--no-cbor-metadata`` can be used to skip metadata diff --git a/docs/path-resolution.rst b/docs/path-resolution.rst index f63f5e79d07e..00831e609aa6 100644 --- a/docs/path-resolution.rst +++ b/docs/path-resolution.rst @@ -139,7 +139,7 @@ The initial content of the VFS depends on how you invoke the compiler: #. **Standard input** - On the command line it is also possible to provide the source by sending it to compiler's + On the command-line it is also possible to provide the source by sending it to compiler's standard input: .. code-block:: bash @@ -345,13 +345,13 @@ of the compiler. CLI Path Normalization and Stripping ------------------------------------ -On the command line the compiler behaves just as you would expect from any other program: +On the command-line the compiler behaves just as you would expect from any other program: it accepts paths in a format native to the platform and relative paths are relative to the current working directory. -The source unit names assigned to files whose paths are specified on the command line, however, +The source unit names assigned to files whose paths are specified on the command-line, however, should not change just because the project is being compiled on a different platform or because the compiler happens to have been invoked from a different directory. -To achieve this, paths to source files coming from the command line must be converted to a canonical +To achieve this, paths to source files coming from the command-line must be converted to a canonical form, and, if possible, made relative to the base path or one of the include paths. The normalization rules are as follows: @@ -408,7 +408,7 @@ The resulting file path becomes the source unit name. Prior to version 0.8.8, CLI path stripping was not performed and the only normalization applied was the conversion of path separators. When working with older versions of the compiler it is recommended to invoke the compiler from - the base path and to only use relative paths on the command line. + the base path and to only use relative paths on the command-line. .. index:: ! allowed paths, ! --allow-paths, remapping; target .. _allowed-paths: @@ -421,7 +421,7 @@ locations that are considered safe by default: - Outside of Standard JSON mode: - - The directories containing input files listed on the command line. + - The directories containing input files listed on the command-line. - The directories used as :ref:`remapping ` targets. If the target is not a directory (i.e does not end with ``/``, ``/.`` or ``/..``) the directory containing the target is used instead. @@ -551,7 +551,7 @@ you checked out to ``/project/dapp-bin_old``, then you can run: This means that all imports in ``module2`` point to the old version but imports in ``module1`` point to the new version. -Here are the detailed rules governing the behaviour of remappings: +Here are the detailed rules governing the behavior of remappings: #. **Remappings only affect the translation between import paths and source unit names.** diff --git a/docs/resources.rst b/docs/resources.rst index df0e45019747..f51dba4bd925 100644 --- a/docs/resources.rst +++ b/docs/resources.rst @@ -23,7 +23,7 @@ Integrated (Ethereum) Development Environments Python-based development and testing framework for smart contracts targeting the Ethereum Virtual Machine. * `Dapp `_ - Tool for building, testing and deploying smart contracts from the command line. + Tool for building, testing and deploying smart contracts from the command-line. * `Embark `_ Developer platform for building and deploying decentralized applications. diff --git a/docs/smtchecker.rst b/docs/smtchecker.rst index 9c862e5309fa..b68d58ed331a 100644 --- a/docs/smtchecker.rst +++ b/docs/smtchecker.rst @@ -97,7 +97,7 @@ Overflow The contract above shows an overflow check example. The SMTChecker does not check underflow and overflow by default for Solidity >=0.8.7, -so we need to use the command line option ``--model-checker-targets "underflow,overflow"`` +so we need to use the command-line option ``--model-checker-targets "underflow,overflow"`` or the JSON option ``settings.modelChecker.targets = ["underflow", "overflow"]``. See :ref:`this section for targets configuration`. Here, it reports the following: @@ -412,7 +412,7 @@ is already "locked", so it would not be possible to change the value of ``x``, regardless of what the unknown called code does. If we "forget" to use the ``mutex`` modifier on function ``set``, the -SMTChecker is able to synthesize the behaviour of the externally called code so +SMTChecker is able to synthesize the behavior of the externally called code so that the assertion fails: .. code-block:: text @@ -750,7 +750,7 @@ and modulo operations inside Horn rules. Because of that, by default the Solidity division and modulo operations are encoded using the constraint ``a = b * d + m`` where ``d = a / b`` and ``m = a % b``. However, other solvers, such as Eldarica, prefer the syntactically precise operations. -The command line flag ``--model-checker-div-mod-no-slacks`` and the JSON option +The command-line flag ``--model-checker-div-mod-no-slacks`` and the JSON option ``settings.modelChecker.divModNoSlacks`` can be used to toggle the encoding depending on the used solver preferences. diff --git a/docs/style-guide.rst b/docs/style-guide.rst index 6173aecc6e72..266c1817f4f0 100644 --- a/docs/style-guide.rst +++ b/docs/style-guide.rst @@ -28,7 +28,7 @@ captures this concept well. A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is most important. - But most importantly: **know when to be inconsistent** -- sometimes the style guide just doesn't apply. When in doubt, use your best judgment. Look at other examples and decide what looks best. And don't hesitate to ask! + But most importantly: **know when to be inconsistent** -- sometimes the style guide just doesn't apply. When in doubt, use your best judgment. Look at other examples and decide what looks best. And do not hesitate to ask! *********** @@ -448,7 +448,7 @@ No: y = 2; longVariable = 3; -Don't include a whitespace in the receive and fallback functions: +Do not include a whitespace in the receive and fallback functions: Yes: diff --git a/docs/types/conversion.rst b/docs/types/conversion.rst index 02b1f2cb9241..dafb336bd01e 100644 --- a/docs/types/conversion.rst +++ b/docs/types/conversion.rst @@ -44,7 +44,7 @@ Explicit Conversions If the compiler does not allow implicit conversion but you are confident a conversion will work, an explicit type conversion is sometimes possible. This may -result in unexpected behaviour and allows you to bypass some security +result in unexpected behavior and allows you to bypass some security features of the compiler, so be sure to test that the result is what you want and expect! diff --git a/docs/types/reference-types.rst b/docs/types/reference-types.rst index 4ba2a65b1ce5..a136497e63aa 100644 --- a/docs/types/reference-types.rst +++ b/docs/types/reference-types.rst @@ -47,8 +47,8 @@ non-persistent area where function arguments are stored, and behaves mostly like .. _data-location-assignment: -Data location and assignment behaviour -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Data location and assignment behavior +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Data locations are not only relevant for persistency of data, but also for the semantics of assignments: @@ -582,10 +582,10 @@ and the assignment will effectively garble the length of ``x``. To be safe, only enlarge bytes arrays by at most one element during a single assignment and do not simultaneously index-access the array in the same statement. -While the above describes the behaviour of dangling storage references in the +While the above describes the behavior of dangling storage references in the current version of the compiler, any code with dangling references should be -considered to have *undefined behaviour*. In particular, this means that -any future version of the compiler may change the behaviour of code that +considered to have *undefined behavior*. In particular, this means that +any future version of the compiler may change the behavior of code that involves dangling references. Be sure to avoid dangling references in your code! @@ -641,7 +641,7 @@ Array slices are useful to ABI-decode secondary data passed in function paramete /// after doing basic validation on the address argument. function forward(bytes calldata payload) external { bytes4 sig = bytes4(payload[:4]); - // Due to truncating behaviour, bytes4(payload) performs identically. + // Due to truncating behavior, bytes4(payload) performs identically. // bytes4 sig = bytes4(payload); if (sig == bytes4(keccak256("setOwner(address)"))) { address owner = abi.decode(payload[4:], (address)); diff --git a/docs/types/value-types.rst b/docs/types/value-types.rst index 872f54b0edeb..9fcb49b2131a 100644 --- a/docs/types/value-types.rst +++ b/docs/types/value-types.rst @@ -140,7 +140,7 @@ Exponentiation Exponentiation is only available for unsigned types in the exponent. The resulting type of an exponentiation is always equal to the type of the base. Please take care that it is -large enough to hold the result and prepare for potential assertion failures or wrapping behaviour. +large enough to hold the result and prepare for potential assertion failures or wrapping behavior. .. note:: In checked mode, exponentiation only uses the comparatively cheap ``exp`` opcode for small bases. diff --git a/docs/units-and-global-variables.rst b/docs/units-and-global-variables.rst index a9b29d6ba2ec..e7029967953b 100644 --- a/docs/units-and-global-variables.rst +++ b/docs/units-and-global-variables.rst @@ -336,7 +336,7 @@ Furthermore, all functions of the current contract are callable directly includi .. warning:: From version 0.8.18 and up, the use of ``selfdestruct`` in both Solidity and Yul will trigger a - deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behaviour + deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behavior as stated in `EIP-6049 `_. .. note:: diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index d43c78e7c033..3ef280a10566 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -54,7 +54,7 @@ or ../ ` are treated as relative to the directories specified us Furthermore, the part of the path added via these options will not appear in the contract metadata. For security reasons the compiler has :ref:`restrictions on what directories it can access `. -Directories of source files specified on the command line and target paths of +Directories of source files specified on the command-line and target paths of remappings are automatically allowed to be accessed by the file reader, but everything else is rejected by default. Additional paths (and their subdirectories) can be allowed via the @@ -114,15 +114,15 @@ Setting the EVM Version to Target ********************************* When you compile your contract code you can specify the Ethereum virtual machine -version to compile for to avoid particular features or behaviours. +version to compile for to avoid particular features or behaviors. .. warning:: Compiling for the wrong EVM version can result in wrong, strange and failing - behaviour. Please ensure, especially if running a private chain, that you + behavior. Please ensure, especially if running a private chain, that you use matching EVM versions. -On the command line, you can select the EVM version as follows: +On the command-line, you can select the EVM version as follows: .. code-block:: shell @@ -227,7 +227,7 @@ Input Description "bzzr://56ab...", "ipfs://Qma...", "/tmp/path/to/file.sol" - // If files are used, their directories should be added to the command line via + // If files are used, their directories should be added to the command-line via // `--allow-paths `. ] // If language is set to "SolidityAST", an AST needs to be supplied under the "ast" key. diff --git a/docs/yul.rst b/docs/yul.rst index 8a500c6145dc..436d0b146240 100644 --- a/docs/yul.rst +++ b/docs/yul.rst @@ -960,7 +960,7 @@ the ``dup`` and ``swap`` instructions as well as ``jump`` instructions, labels a .. warning:: From version 0.8.18 and up, the use of ``selfdestruct`` in both Solidity and Yul will trigger a - deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behaviour + deprecation warning, since the ``SELFDESTRUCT`` opcode will eventually undergo breaking changes in behavior as stated in `EIP-6049 `_. In some internal dialects, there are additional functions: @@ -995,7 +995,7 @@ Its first and only argument must be a string literal and uniquely represents the Identifiers can be arbitrary but when the compiler produces Yul code from Solidity sources, it uses a library name qualified with the name of the source unit that defines that library. To link the code with a particular library address, the same identifier must be provided to the -``--libraries`` option on the command line. +``--libraries`` option on the command-line. For example this code @@ -1076,12 +1076,12 @@ or even opcodes unknown to the Solidity compiler, care has to be taken when using ``verbatim`` together with the optimizer. Even when the optimizer is switched off, the code generator has to determine the stack layout, which means that e.g. using ``verbatim`` to modify -the stack height can lead to undefined behaviour. +the stack height can lead to undefined behavior. The following is a non-exhaustive list of restrictions on verbatim bytecode that are not checked by the compiler. Violations of these restrictions can result in -undefined behaviour. +undefined behavior. - Control-flow should not jump into or out of verbatim blocks, but it can jump within the same verbatim block. diff --git a/tools/yulPhaser/README.md b/tools/yulPhaser/README.md index 3bc72b5379df..99004d4c93cc 100644 --- a/tools/yulPhaser/README.md +++ b/tools/yulPhaser/README.md @@ -82,7 +82,7 @@ solc/solc --optimize --ir-optimized --yul-optimizations ### How to choose good parameters Choosing good parameters for a genetic algorithm is not a trivial task but phaser's defaults are generally enough to find a sequence that gives results comparable or better than one hand-crafted by an experienced developer for a given set of programs. The difficult part is providing a fairly representative set of input files. -If the files you give don't need certain optimisations the tool will find sequences that don't use these optimisations and perform badly for programs that could benefit from them. +If the files you give do not need certain optimisations the tool will find sequences that do not use these optimisations and perform badly for programs that could benefit from them. If all the provided files greatly benefit from a specific optimisation, the sequence may not work well for programs that do not. We have conducted [a set of rough experiments](https://github.com/ethereum/solidity/issues/7806#issuecomment-598644491) to evaluate some combinations of parameter values. @@ -91,5 +91,5 @@ The conclusions were used to adjust the defaults but you might still benefit fro 1. The algorithm that performed the best was `GEWEP`. 2. Using longer sequences in the initial population yields better results. The algorithm is good at removing superfluous steps. 3. Preserving the top sequences from previous rounds improves results. Elite should contain at least a few individuals, especially when using the `classic` algorithm. -4. Don't set mutation/deletion/addition chance too high. It makes results worse because it destroys the good patterns preserved by crossover. Values around 1-5% seem to work best. +4. Do not set mutation/deletion/addition chance too high. It makes results worse because it destroys the good patterns preserved by crossover. Values around 1-5% seem to work best. 5. Keep the algorithm running for 1000 rounds or more. It usually finds good sequences faster than that but it can shorten them significantly if you let it run longer. This is especially important when starting with long sequences. From d657e77f1ef757ada7c581e4101073a8f5db5273 Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Wed, 31 May 2023 02:11:33 -0300 Subject: [PATCH 038/138] Remove problematic sed commands in openzeppelin external test --- test/externalTests/zeppelin.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index 46b3f2d89886..a023af290731 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -74,26 +74,14 @@ function zeppelin_test sed -i "s|it(\('prevent unauthorized maintenance'\)|it.skip(\1|g" test/governance/TimelockController.test.js sed -i "s|it(\('cannot cancel invalid operation'\)|it.skip(\1|g" test/governance/TimelockController.test.js sed -i "s|it(\('cannot call onlyInitializable function outside the scope of an initializable function'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js - sed -i "s|it(\('other accounts cannot unpause'\)|it.skip(\1|g" test/token/ERC20/presets/ERC20PresetMinterPauser.test.js - sed -i "s|it(\('other accounts cannot unpause'\)|it.skip(\1|g" test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js - sed -i "s|it(\('other accounts cannot pause'\)|it.skip(\1|g" test/token/ERC20/presets/ERC20PresetMinterPauser.test.js - sed -i "s|it(\('other accounts cannot pause'\)|it.skip(\1|g" test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js - sed -i "s|it(\('cannot be released before time limit'\)|it.skip(\1|g" test/token/ERC20/utils/TokenTimelock.test.js - sed -i "s|it(\('cannot be released just before time limit'\)|it.skip(\1|g" test/token/ERC20/utils/TokenTimelock.test.js sed -i "s|it(\('reverts when sending non-zero amounts'\)|it.skip(\1|g" test/utils/Address.test.js sed -i "s|it(\('reverts when sending more than the balance'\)|it.skip(\1|g" test/utils/Address.test.js sed -i "s|it(\('fails deploying a contract if the bytecode length is zero'\)|it.skip(\1|g" test/utils/Create2.test.js sed -i "s|it(\('fails deploying a contract if factory contract does not have sufficient balance'\)|it.skip(\1|g" test/utils/Create2.test.js - sed -i "s|it(\('reverts on withdrawals'\)|it.skip(\1|g" test/utils/escrow/ConditionalEscrow.test.js - sed -i "s|it(\('does not allow beneficiary withdrawal'\)|it.skip(\1|g" test/utils/escrow/RefundEscrow.test.js - sed -i "s|it(\('rejects deposits'\)|it.skip(\1|g" test/utils/escrow/RefundEscrow.test.js - sed -i "s|it(\('does not allow 0xffffffff'\)|it.skip(\1|g" test/utils/introspection/ERC165Storage.test.js sed -i "s|it(\('reverts when casting -1'\)|it.skip(\1|g" test/utils/math/SafeCast.test.js sed -i 's|it(\(`reverts when casting [^`]\+`\)|it.skip(\1|g' test/utils/math/SafeCast.test.js sed -i "s|it(\('reverts if index is greater than supply'\)|it.skip(\1|g" test/token/ERC721/ERC721.behavior.js sed -i "s|it(\('burns all tokens'\)|it.skip(\1|g" test/token/ERC721/ERC721.behavior.js - sed -i "s|it(\('other accounts cannot pause'\)|it.skip(\1|g" test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js - sed -i "s|it(\('other accounts cannot unpause'\)|it.skip(\1|g" test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js sed -i "s|it(\('guards transfer against invalid user'\)|it.skip(\1|g" test/access/Ownable2Step.test.js sed -i "s|it(\('reverting initialization'\)|it.skip(\1|g" test/proxy/beacon/BeaconProxy.test.js sed -i "s|describe(\('reverting initialization'\)|describe.skip(\1|g" test/proxy/Proxy.behaviour.js From 824e59dec2bc9fb128ffdce6e34c4fab648208b2 Mon Sep 17 00:00:00 2001 From: r0qs Date: Fri, 2 Jun 2023 12:09:53 +0200 Subject: [PATCH 039/138] Remove unnecessary line from OZ external test script --- test/externalTests/zeppelin.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index a023af290731..4ac04a66d188 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -70,7 +70,6 @@ function zeppelin_test sed -i "s|describe(\('when the given implementation is the zero address'\)|describe.skip(\1|g" test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js sed -i "s|describe(\('when the new proposed admin is the zero address'\)|describe.skip(\1|g" test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js # In some cases Hardhat does not detect revert reasons properly via IR. - sed -i "s|it(\('reverts if the current value is 0'\)|it.skip(\1|g" test/utils/Counters.test.js sed -i "s|it(\('prevent unauthorized maintenance'\)|it.skip(\1|g" test/governance/TimelockController.test.js sed -i "s|it(\('cannot cancel invalid operation'\)|it.skip(\1|g" test/governance/TimelockController.test.js sed -i "s|it(\('cannot call onlyInitializable function outside the scope of an initializable function'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js From a518310af95dead3fc40cecf279384953f2efea1 Mon Sep 17 00:00:00 2001 From: r0qs Date: Fri, 2 Jun 2023 12:50:28 +0200 Subject: [PATCH 040/138] Disable gp2 tests --- .circleci/config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6db33891a353..68092cc98fac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1681,7 +1681,8 @@ workflows: - t_ext: *job_native_test_ext_prb_math - t_ext: *job_native_test_ext_elementfi - t_ext: *job_native_test_ext_brink - - t_ext: *job_native_test_ext_gp2 + # NOTE: We are disabling gp2 tests due to constant failures. + # - t_ext: *job_native_test_ext_gp2 # NOTE: The external tests below were commented because they # depend on a specific version of hardhat which does not support shanghai EVM. #- t_ext: *job_native_test_ext_trident @@ -1703,7 +1704,8 @@ workflows: - t_native_test_ext_prb_math - t_native_test_ext_elementfi - t_native_test_ext_brink - - t_native_test_ext_gp2 + # NOTE: We are disabling gp2 tests due to constant failures. + #- t_native_test_ext_gp2 # NOTE: The external tests below were commented because they # depend on a specific version of hardhat which does not support shanghai EVM. #- t_native_test_ext_trident From 72a384f4fe064f9ea377644d57858d38f5febb66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 19 Nov 2021 14:30:32 +0100 Subject: [PATCH 041/138] cmdlineTests: Ensure that leading symbols in names affect the sort order --- test/cmdlineTests.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 416b97b32a5b..4c54291c99fc 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -54,7 +54,7 @@ do shift ;; *) - matching_tests=$(find . -mindepth 1 -maxdepth 1 -type d -name "$1" | cut -c 3- | sort) + matching_tests=$(find . -mindepth 1 -maxdepth 1 -type d -name "$1" | cut -c 3- | LC_COLLATE=C sort) if [[ $matching_tests == "" ]] then @@ -72,7 +72,11 @@ done if (( ${#selected_tests[@]} == 0 && ${#patterns_with_no_matches[@]} == 0 )) then - selected_tests=(*) + # NOTE: We want leading symbols in names to affect the sort order but without + # LC_COLLATE=C sort seems to ignore them. + all_tests=$(echo * | tr '[:space:]' '\n' | LC_COLLATE=C sort) + # shellcheck disable=SC2206 # We do not support test names containing spaces. + selected_tests=($all_tests) fi popd > /dev/null From dd10334754ca5db54e84bbbc6117a1959749f451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 19 Nov 2021 14:51:28 +0100 Subject: [PATCH 042/138] cmdlineTests: Support tests that contain a script to run as an alternative to input.* files --- test/cmdlineTests.sh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 4c54291c99fc..41d6ff40a944 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -32,6 +32,8 @@ set -eo pipefail REPO_ROOT=$(cd "$(dirname "$0")/.." && pwd) SOLIDITY_BUILD_DIR=${SOLIDITY_BUILD_DIR:-${REPO_ROOT}/build} +export REPO_ROOT SOLIDITY_BUILD_DIR + # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" # shellcheck source=scripts/common_cmdline.sh @@ -92,6 +94,7 @@ case "$OSTYPE" in ;; esac echo "Using solc binary at ${SOLC}" +export SOLC INTERACTIVE=true if ! tty -s || [ "$CI" ] @@ -441,13 +444,23 @@ printTask "Running general commandline tests..." fi fi + scriptFiles="$(ls -1 "${tdir}/test."* 2> /dev/null || true)" + scriptCount="$(echo "${scriptFiles}" | wc -w)" + inputFiles="$(ls -1 "${tdir}/input."* 2> /dev/null || true)" inputCount="$(echo "${inputFiles}" | wc -w)" - if (( inputCount > 1 )) + (( inputCount <= 1 )) || fail "Ambiguous input. Found input files in multiple formats:"$'\n'"${inputFiles}" + (( scriptCount <= 1 )) || fail "Ambiguous input. Found script files in multiple formats:"$'\n'"${scriptFiles}" + (( inputCount == 0 || scriptCount == 0 )) || fail "Ambiguous input. Found both input and script files:"$'\n'"${inputFiles}"$'\n'"${scriptFiles}" + + if (( scriptCount == 1 )) then - printError "Ambiguous input. Found input files in multiple formats:" - echo -e "${inputFiles}" - fail + if ! "$scriptFiles" + then + fail "Test script ${scriptFiles} failed." + fi + + continue fi # Use printf to get rid of the trailing newline From 6b061ba69629ef02c8984530a0ef2bd9e63547b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 19 Nov 2021 14:56:30 +0100 Subject: [PATCH 043/138] cmdlineTests: Extract script-based test out of cmdlineTests.sh - Just extraction, with as few changes to the code as possible. --- test/cmdlineTests.sh | 307 ------------------ test/cmdlineTests/~assembler_modes/test.sh | 46 +++ .../test.sh | 8 + test/cmdlineTests/~ast_import_export/test.sh | 17 + test/cmdlineTests/~compilation_tests/test.sh | 20 ++ .../~documentation_examples/test.sh | 51 +++ test/cmdlineTests/~library_checksum/test.sh | 12 + test/cmdlineTests/~library_long_names/test.sh | 8 + test/cmdlineTests/~linking/test.sh | 22 ++ test/cmdlineTests/~overwriting_files/test.sh | 18 + test/cmdlineTests/~soljson_via_fuzzer/test.sh | 18 + test/cmdlineTests/~standard_input/test.sh | 31 ++ test/cmdlineTests/~unknown_options/test.sh | 20 ++ .../~update_bugs_by_version/test.sh | 13 + test/cmdlineTests/~via_ir_equivalence/test.sh | 98 ++++++ 15 files changed, 382 insertions(+), 307 deletions(-) create mode 100755 test/cmdlineTests/~assembler_modes/test.sh create mode 100755 test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh create mode 100755 test/cmdlineTests/~ast_import_export/test.sh create mode 100755 test/cmdlineTests/~compilation_tests/test.sh create mode 100755 test/cmdlineTests/~documentation_examples/test.sh create mode 100755 test/cmdlineTests/~library_checksum/test.sh create mode 100755 test/cmdlineTests/~library_long_names/test.sh create mode 100755 test/cmdlineTests/~linking/test.sh create mode 100755 test/cmdlineTests/~overwriting_files/test.sh create mode 100755 test/cmdlineTests/~soljson_via_fuzzer/test.sh create mode 100755 test/cmdlineTests/~standard_input/test.sh create mode 100755 test/cmdlineTests/~unknown_options/test.sh create mode 100755 test/cmdlineTests/~update_bugs_by_version/test.sh create mode 100755 test/cmdlineTests/~via_ir_equivalence/test.sh diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 41d6ff40a944..fb346f71d1fa 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -298,113 +298,8 @@ EOF } -function test_solc_assembly_output -{ - local input="${1}" - local expected="${2}" - IFS=" " read -r -a solc_args <<< "${3}" - - local expected_object="object \"object\" { code ${expected} }" - - output=$(echo "${input}" | msg_on_error --no-stderr "$SOLC" - "${solc_args[@]}") - empty=$(echo "$output" | tr '\n' ' ' | tr -s ' ' | sed -ne "/${expected_object}/p") - if [ -z "$empty" ] - then - printError "Incorrect assembly output. Expected: " - >&2 echo -e "${expected}" - printError "with arguments ${solc_args[*]}, but got:" - >&2 echo "${output}" - fail - fi -} - -function test_via_ir_equivalence() -{ - SOLTMPDIR=$(mktemp -d) - pushd "$SOLTMPDIR" > /dev/null - - (( $# <= 2 )) || fail "This function accepts at most two arguments." - local solidity_file="$1" - local optimize_flag="$2" - [[ $optimize_flag == --optimize || $optimize_flag == "" ]] || assertFail "The second argument must be --optimize if present." - - local output_file_prefix - output_file_prefix=$(basename "$1" .sol) - - local optimizer_flags=() - [[ $optimize_flag == "" ]] || optimizer_flags+=("$optimize_flag") - [[ $optimize_flag == "" ]] || output_file_prefix+="_optimize" - - msg_on_error --no-stderr "$SOLC" --ir-optimized --debug-info location "${optimizer_flags[@]}" "$solidity_file" | - sed '/^Optimized IR:$/d' | - split_on_empty_lines_into_numbered_files "$output_file_prefix" ".yul" - - local asm_output_two_stage asm_output_via_ir - - for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do - asm_output_two_stage+=$( - msg_on_error --no-stderr "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | - sed '/^Text representation:$/d' | - sed '/^=======/d' - ) - done - - asm_output_via_ir=$( - msg_on_error --no-stderr "$SOLC" --via-ir --asm --debug-info location "${optimizer_flags[@]}" "$solidity_file" | - sed '/^EVM assembly:$/d' | - sed '/^=======/d' - ) - - diff_values "$asm_output_two_stage" "$asm_output_via_ir" --ignore-space-change --ignore-blank-lines - - local bin_output_two_stage bin_output_via_ir - - for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do - bin_output_two_stage+=$( - msg_on_error --no-stderr "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | - sed '/^Binary representation:$/d' | - sed '/^=======/d' - ) - done - - bin_output_via_ir=$( - msg_on_error --no-stderr "$SOLC" --via-ir --bin "${optimizer_flags[@]}" "$solidity_file" | - sed '/^Binary:$/d' | - sed '/^=======/d' - ) - - diff_values "$bin_output_two_stage" "$bin_output_via_ir" --ignore-space-change --ignore-blank-lines - - popd > /dev/null - rm -r "$SOLTMPDIR" -} - ## RUN -SOLTMPDIR=$(mktemp -d) -printTask "Checking that the bug list is up to date..." -cp "${REPO_ROOT}/docs/bugs_by_version.json" "${SOLTMPDIR}/original_bugs_by_version.json" -"${REPO_ROOT}/scripts/update_bugs_by_version.py" -diff --unified "${SOLTMPDIR}/original_bugs_by_version.json" "${REPO_ROOT}/docs/bugs_by_version.json" || \ - fail "The bug list in bugs_by_version.json was out of date and has been updated. Please investigate and submit a bugfix if necessary." -rm -r "$SOLTMPDIR" - -printTask "Testing unknown options..." -( - set +e - output=$("$SOLC" --allow=test 2>&1) - failed=$? - set -e - - if [ "$output" == "unrecognised option '--allow=test'" ] && [ $failed -ne 0 ] - then - echo "Passed" - else - fail "Incorrect response to unknown options: $output" - fi -) - - printTask "Testing passing files that are not found..." test_solc_behaviour "file_not_found.sol" "" "" "" 1 "" "\"file_not_found.sol\" is not found." "" "" @@ -510,206 +405,4 @@ printTask "Running general commandline tests..." done ) -printTask "Compiling various other contracts and libraries..." -( - cd "$REPO_ROOT"/test/compilationTests/ - for dir in */ - do - echo " - $dir" - cd "$dir" - # shellcheck disable=SC2046 # These file names are not supposed to contain spaces. - compileFull --expect-warnings $(find . -name '*.sol') - cd .. - done -) - -printTask "Compiling all examples from the documentation..." -SOLTMPDIR=$(mktemp -d) -( - set -e - cd "$SOLTMPDIR" - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ - developmentVersion=$("$REPO_ROOT/scripts/get_version.sh") - - for f in *.yul *.sol - do - # The contributors guide uses syntax tests, but we cannot - # really handle them here. - if grep -E 'DeclarationError:|// ----' "$f" >/dev/null - then - continue - fi - echo "$f" - - opts=() - # We expect errors if explicitly stated, or if imports - # are used (in the style guide) - if grep -E "// This will not compile" "$f" >/dev/null || - sed -e 's|//.*||g' "$f" | grep -E "import \"" >/dev/null - then - opts=(--expect-errors) - fi - if grep "// This will report a warning" "$f" >/dev/null - then - opts+=(--expect-warnings) - fi - if grep "// This may report a warning" "$f" >/dev/null - then - opts+=(--ignore-warnings) - fi - - # Disable the version pragma in code snippets that only work with the current development version. - # It's necessary because x.y.z won't match `^x.y.z` or `>=x.y.z` pragmas until it's officially released. - sed -i.bak -E -e 's/pragma[[:space:]]+solidity[[:space:]]*(\^|>=)[[:space:]]*'"$developmentVersion"'/pragma solidity >0.0.1/' "$f" - compileFull "${opts[@]}" "$SOLTMPDIR/$f" - done -) -rm -r "$SOLTMPDIR" -echo "Done." - -printTask "Testing library checksum..." -echo '' | msg_on_error --no-stdout "$SOLC" - --link --libraries a=0x90f20564390eAe531E810af625A22f51385Cd222 -echo '' | "$SOLC" - --link --libraries a=0x80f20564390eAe531E810af625A22f51385Cd222 &>/dev/null && \ - fail "solc --link did not reject a library address with an invalid checksum." - -printTask "Testing long library names..." -echo '' | msg_on_error --no-stdout "$SOLC" - --link --libraries aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylonglibraryname=0x90f20564390eAe531E810af625A22f51385Cd222 - -printTask "Testing linking itself..." -SOLTMPDIR=$(mktemp -d) -( - cd "$SOLTMPDIR" - echo 'library L { function f() public pure {} } contract C { function f() public pure { L.f(); } }' > x.sol - msg_on_error --no-stderr "$SOLC" --bin -o . x.sol - # Explanation and placeholder should be there - grep -q '//' C.bin && grep -q '__' C.bin - # But not in library file. - grep -q -v '[/_]' L.bin - # Now link - msg_on_error "$SOLC" --link --libraries x.sol:L=0x90f20564390eAe531E810af625A22f51385Cd222 C.bin - # Now the placeholder and explanation should be gone. - grep -q -v '[/_]' C.bin -) -rm -r "$SOLTMPDIR" - -printTask "Testing overwriting files..." -SOLTMPDIR=$(mktemp -d) -( - # First time it works - echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" - # Second time it fails - echo 'contract C {}' | "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null && \ - fail "solc did not refuse to overwrite $SOLTMPDIR/non-existing-stuff-to-create." - # Unless we force - echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --overwrite --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" -) -rm -r "$SOLTMPDIR" - -printTask "Testing assemble, yul, strict-assembly and optimize..." -( - echo '{}' | msg_on_error --silent "$SOLC" - --assemble - echo '{}' | msg_on_error --silent "$SOLC" - --yul - echo '{}' | msg_on_error --silent "$SOLC" - --strict-assembly - - # Test options above in conjunction with --optimize. - # Using both, --assemble and --optimize should fail. - echo '{}' | "$SOLC" - --assemble --optimize &>/dev/null && fail "solc --assemble --optimize did not fail as expected." - echo '{}' | "$SOLC" - --yul --optimize &>/dev/null && fail "solc --yul --optimize did not fail as expected." - - # Test yul and strict assembly output - # Non-empty code results in non-empty binary representation with optimizations turned off, - # while it results in empty binary representation with optimizations turned on. - test_solc_assembly_output "{ let x:u256 := 0:u256 }" "{ let x := 0 }" "--yul" - test_solc_assembly_output "{ let x:u256 := bitnot(7:u256) }" "{ let x := bitnot(7) }" "--yul" - test_solc_assembly_output "{ let t:bool := not(true) }" "{ let t:bool := not(true) }" "--yul" - test_solc_assembly_output "{ let x := 0 }" "{ let x := 0 }" "--strict-assembly" - test_solc_assembly_output "{ let x := 0 }" "{ { } }" "--strict-assembly --optimize" -) - -printTask "Testing the eqivalence of --via-ir and a two-stage compilation..." -( - externalContracts=( - externalTests/solc-js/DAO/TokenCreation.sol - libsolidity/semanticTests/externalContracts/_prbmath/PRBMathSD59x18.sol - libsolidity/semanticTests/externalContracts/_prbmath/PRBMathUD60x18.sol - libsolidity/semanticTests/externalContracts/_stringutils/stringutils.sol - libsolidity/semanticTests/externalContracts/deposit_contract.sol - libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol - libsolidity/semanticTests/externalContracts/snark.sol - ) - - requiresOptimizer=( - externalTests/solc-js/DAO/TokenCreation.sol - libsolidity/semanticTests/externalContracts/deposit_contract.sol - libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol - libsolidity/semanticTests/externalContracts/snark.sol - ) - - for contractFile in "${externalContracts[@]}" - do - if ! [[ "${requiresOptimizer[*]}" =~ $contractFile ]] - then - printTask " - ${contractFile}" - test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" - fi - - printTask " - ${contractFile} (optimized)" - test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" --optimize - done -) - -printTask "Testing standard input..." -SOLTMPDIR=$(mktemp -d) -( - set +e - output=$("$SOLC" --bin 2>&1) - result=$? - set -e - - # This should fail - if [[ ! ("$output" =~ "No input files given") || ($result == 0) ]] - then - fail "Incorrect response to empty input arg list: $output" - fi - - # The contract should be compiled - if ! echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin | grep -q ":C" - then - fail "Failed to compile a simple contract from standard input" - fi - - # This should not fail - echo '' | msg_on_error --silent --msg "Incorrect response to --ast-compact-json option with empty stdin" \ - "$SOLC" --ast-compact-json - -) -rm -r "$SOLTMPDIR" - -printTask "Testing AST import/export..." -SOLTMPDIR=$(mktemp -d) -( - cd "$SOLTMPDIR" - if ! "$REPO_ROOT/scripts/ASTImportTest.sh" ast - then - rm -r "$SOLTMPDIR" - fail - fi -) -rm -r "$SOLTMPDIR" - -printTask "Testing AST export with stop-after=parsing..." -"$REPO_ROOT/test/stopAfterParseTests.sh" - -printTask "Testing soljson via the fuzzer..." -SOLTMPDIR=$(mktemp -d) -( - set -e - cd "$SOLTMPDIR" - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ - - echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --quiet --input-files - echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --without-optimizer --quiet --input-files -) -rm -r "$SOLTMPDIR" - echo "Commandline tests successful." diff --git a/test/cmdlineTests/~assembler_modes/test.sh b/test/cmdlineTests/~assembler_modes/test.sh new file mode 100755 index 000000000000..099a32444090 --- /dev/null +++ b/test/cmdlineTests/~assembler_modes/test.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +function test_solc_assembly_output +{ + local input="${1}" + local expected="${2}" + IFS=" " read -r -a solc_args <<< "${3}" + + local expected_object="object \"object\" { code ${expected} }" + + output=$(echo "${input}" | msg_on_error --no-stderr "$SOLC" - "${solc_args[@]}") + empty=$(echo "$output" | tr '\n' ' ' | tr -s ' ' | sed -ne "/${expected_object}/p") + if [ -z "$empty" ] + then + printError "Incorrect assembly output. Expected: " + >&2 echo -e "${expected}" + printError "with arguments ${solc_args[*]}, but got:" + >&2 echo "${output}" + fail + fi +} + +printTask "Testing assemble, yul, strict-assembly and optimize..." +( + echo '{}' | msg_on_error --silent "$SOLC" - --assemble + echo '{}' | msg_on_error --silent "$SOLC" - --yul + echo '{}' | msg_on_error --silent "$SOLC" - --strict-assembly + + # Test options above in conjunction with --optimize. + # Using both, --assemble and --optimize should fail. + echo '{}' | "$SOLC" - --assemble --optimize &>/dev/null && fail "solc --assemble --optimize did not fail as expected." + echo '{}' | "$SOLC" - --yul --optimize &>/dev/null && fail "solc --yul --optimize did not fail as expected." + + # Test yul and strict assembly output + # Non-empty code results in non-empty binary representation with optimizations turned off, + # while it results in empty binary representation with optimizations turned on. + test_solc_assembly_output "{ let x:u256 := 0:u256 }" "{ let x := 0 }" "--yul" + test_solc_assembly_output "{ let x:u256 := bitnot(7:u256) }" "{ let x := bitnot(7) }" "--yul" + test_solc_assembly_output "{ let t:bool := not(true) }" "{ let t:bool := not(true) }" "--yul" + test_solc_assembly_output "{ let x := 0 }" "{ let x := 0 }" "--strict-assembly" + test_solc_assembly_output "{ let x := 0 }" "{ { } }" "--strict-assembly --optimize" +) diff --git a/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh b/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh new file mode 100755 index 000000000000..d023d13e05cd --- /dev/null +++ b/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing AST export with stop-after=parsing..." +"$REPO_ROOT/test/stopAfterParseTests.sh" diff --git a/test/cmdlineTests/~ast_import_export/test.sh b/test/cmdlineTests/~ast_import_export/test.sh new file mode 100755 index 000000000000..d7250ce66568 --- /dev/null +++ b/test/cmdlineTests/~ast_import_export/test.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing AST import/export..." +SOLTMPDIR=$(mktemp -d) +( + cd "$SOLTMPDIR" + if ! "$REPO_ROOT/scripts/ASTImportTest.sh" ast + then + rm -r "$SOLTMPDIR" + fail + fi +) +rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~compilation_tests/test.sh b/test/cmdlineTests/~compilation_tests/test.sh new file mode 100755 index 000000000000..5793b17c1a1f --- /dev/null +++ b/test/cmdlineTests/~compilation_tests/test.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" +# shellcheck source=scripts/common_cmdline.sh +source "${REPO_ROOT}/scripts/common_cmdline.sh" + +printTask "Compiling various other contracts and libraries..." +( + cd "$REPO_ROOT"/test/compilationTests/ + for dir in */ + do + echo " - $dir" + cd "$dir" + # shellcheck disable=SC2046 # These file names are not supposed to contain spaces. + compileFull --expect-warnings $(find . -name '*.sol') + cd .. + done +) diff --git a/test/cmdlineTests/~documentation_examples/test.sh b/test/cmdlineTests/~documentation_examples/test.sh new file mode 100755 index 000000000000..d3bc8c1b1806 --- /dev/null +++ b/test/cmdlineTests/~documentation_examples/test.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +set -eo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" +# shellcheck source=scripts/common_cmdline.sh +source "${REPO_ROOT}/scripts/common_cmdline.sh" + +printTask "Compiling all examples from the documentation..." +SOLTMPDIR=$(mktemp -d) +( + set -e + cd "$SOLTMPDIR" + "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ + developmentVersion=$("$REPO_ROOT/scripts/get_version.sh") + + for f in *.yul *.sol + do + # The contributors guide uses syntax tests, but we cannot + # really handle them here. + if grep -E 'DeclarationError:|// ----' "$f" >/dev/null + then + continue + fi + echo "$f" + + opts=() + # We expect errors if explicitly stated, or if imports + # are used (in the style guide) + if grep -E "// This will not compile" "$f" >/dev/null || + sed -e 's|//.*||g' "$f" | grep -E "import \"" >/dev/null + then + opts=(--expect-errors) + fi + if grep "// This will report a warning" "$f" >/dev/null + then + opts+=(--expect-warnings) + fi + if grep "// This may report a warning" "$f" >/dev/null + then + opts+=(--ignore-warnings) + fi + + # Disable the version pragma in code snippets that only work with the current development version. + # It's necessary because x.y.z won't match `^x.y.z` or `>=x.y.z` pragmas until it's officially released. + sed -i.bak -E -e 's/pragma[[:space:]]+solidity[[:space:]]*(\^|>=)[[:space:]]*'"$developmentVersion"'/pragma solidity >0.0.1/' "$f" + compileFull "${opts[@]}" "$SOLTMPDIR/$f" + done +) +rm -r "$SOLTMPDIR" +echo "Done." diff --git a/test/cmdlineTests/~library_checksum/test.sh b/test/cmdlineTests/~library_checksum/test.sh new file mode 100755 index 000000000000..c6d52fa4524f --- /dev/null +++ b/test/cmdlineTests/~library_checksum/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing library checksum..." +echo '' | msg_on_error --no-stdout "$SOLC" - --link --libraries a=0x90f20564390eAe531E810af625A22f51385Cd222 +echo '' | "$SOLC" - --link --libraries a=0x80f20564390eAe531E810af625A22f51385Cd222 &>/dev/null && \ + fail "solc --link did not reject a library address with an invalid checksum." + +exit 0 diff --git a/test/cmdlineTests/~library_long_names/test.sh b/test/cmdlineTests/~library_long_names/test.sh new file mode 100755 index 000000000000..59f179232ad3 --- /dev/null +++ b/test/cmdlineTests/~library_long_names/test.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing long library names..." +echo '' | msg_on_error --no-stdout "$SOLC" - --link --libraries aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylonglibraryname=0x90f20564390eAe531E810af625A22f51385Cd222 diff --git a/test/cmdlineTests/~linking/test.sh b/test/cmdlineTests/~linking/test.sh new file mode 100755 index 000000000000..d9b0c867bfe0 --- /dev/null +++ b/test/cmdlineTests/~linking/test.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing linking itself..." +SOLTMPDIR=$(mktemp -d) +( + cd "$SOLTMPDIR" + echo 'library L { function f() public pure {} } contract C { function f() public pure { L.f(); } }' > x.sol + msg_on_error --no-stderr "$SOLC" --bin -o . x.sol + # Explanation and placeholder should be there + grep -q '//' C.bin && grep -q '__' C.bin + # But not in library file. + grep -q -v '[/_]' L.bin + # Now link + msg_on_error "$SOLC" --link --libraries x.sol:L=0x90f20564390eAe531E810af625A22f51385Cd222 C.bin + # Now the placeholder and explanation should be gone. + grep -q -v '[/_]' C.bin +) +rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~overwriting_files/test.sh b/test/cmdlineTests/~overwriting_files/test.sh new file mode 100755 index 000000000000..23599c52f08b --- /dev/null +++ b/test/cmdlineTests/~overwriting_files/test.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing overwriting files..." +SOLTMPDIR=$(mktemp -d) +( + # First time it works + echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" + # Second time it fails + echo 'contract C {}' | "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null && \ + fail "solc did not refuse to overwrite $SOLTMPDIR/non-existing-stuff-to-create." + # Unless we force + echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --overwrite --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" +) +rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~soljson_via_fuzzer/test.sh b/test/cmdlineTests/~soljson_via_fuzzer/test.sh new file mode 100755 index 000000000000..69fa6d84d1be --- /dev/null +++ b/test/cmdlineTests/~soljson_via_fuzzer/test.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing soljson via the fuzzer..." +SOLTMPDIR=$(mktemp -d) +( + set -e + cd "$SOLTMPDIR" + "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ + "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ + + echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --quiet --input-files + echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --without-optimizer --quiet --input-files +) +rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~standard_input/test.sh b/test/cmdlineTests/~standard_input/test.sh new file mode 100755 index 000000000000..03da67737463 --- /dev/null +++ b/test/cmdlineTests/~standard_input/test.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing standard input..." +SOLTMPDIR=$(mktemp -d) +( + set +e + output=$("$SOLC" --bin 2>&1) + result=$? + set -e + + # This should fail + if [[ ! ("$output" =~ "No input files given") || ($result == 0) ]] + then + fail "Incorrect response to empty input arg list: $output" + fi + + # The contract should be compiled + if ! echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin | grep -q ":C" + then + fail "Failed to compile a simple contract from standard input" + fi + + # This should not fail + echo '' | msg_on_error --silent --msg "Incorrect response to --ast-compact-json option with empty stdin" \ + "$SOLC" --ast-compact-json - +) +rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~unknown_options/test.sh b/test/cmdlineTests/~unknown_options/test.sh new file mode 100755 index 000000000000..dde9fc9c1481 --- /dev/null +++ b/test/cmdlineTests/~unknown_options/test.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +printTask "Testing unknown options..." +( + set +e + output=$("$SOLC" --allow=test 2>&1) + failed=$? + set -e + + if [ "$output" == "unrecognised option '--allow=test'" ] && [ $failed -ne 0 ] + then + echo "Passed" + else + fail "Incorrect response to unknown options: $output" + fi +) diff --git a/test/cmdlineTests/~update_bugs_by_version/test.sh b/test/cmdlineTests/~update_bugs_by_version/test.sh new file mode 100755 index 000000000000..fdeafd5a7465 --- /dev/null +++ b/test/cmdlineTests/~update_bugs_by_version/test.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +SOLTMPDIR=$(mktemp -d) +printTask "Checking that the bug list is up to date..." +cp "${REPO_ROOT}/docs/bugs_by_version.json" "${SOLTMPDIR}/original_bugs_by_version.json" +"${REPO_ROOT}/scripts/update_bugs_by_version.py" +diff --unified "${SOLTMPDIR}/original_bugs_by_version.json" "${REPO_ROOT}/docs/bugs_by_version.json" || \ + fail "The bug list in bugs_by_version.json was out of date and has been updated. Please investigate and submit a bugfix if necessary." +rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~via_ir_equivalence/test.sh b/test/cmdlineTests/~via_ir_equivalence/test.sh new file mode 100755 index 000000000000..9a3030d1d25d --- /dev/null +++ b/test/cmdlineTests/~via_ir_equivalence/test.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +set -eo pipefail + +# shellcheck source=scripts/common.sh +source "${REPO_ROOT}/scripts/common.sh" + +function test_via_ir_equivalence() +{ + SOLTMPDIR=$(mktemp -d) + pushd "$SOLTMPDIR" > /dev/null + + (( $# <= 2 )) || fail "This function accepts at most two arguments." + local solidity_file="$1" + local optimize_flag="$2" + [[ $optimize_flag == --optimize || $optimize_flag == "" ]] || assertFail "The second argument must be --optimize if present." + + local output_file_prefix + output_file_prefix=$(basename "$1" .sol) + + local optimizer_flags=() + [[ $optimize_flag == "" ]] || optimizer_flags+=("$optimize_flag") + [[ $optimize_flag == "" ]] || output_file_prefix+="_optimize" + + msg_on_error --no-stderr "$SOLC" --ir-optimized --debug-info location "${optimizer_flags[@]}" "$solidity_file" | + sed '/^Optimized IR:$/d' | + split_on_empty_lines_into_numbered_files "$output_file_prefix" ".yul" + + local asm_output_two_stage asm_output_via_ir + + for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do + asm_output_two_stage+=$( + msg_on_error --no-stderr "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | + sed '/^Text representation:$/d' | + sed '/^=======/d' + ) + done + + asm_output_via_ir=$( + msg_on_error --no-stderr "$SOLC" --via-ir --asm --debug-info location "${optimizer_flags[@]}" "$solidity_file" | + sed '/^EVM assembly:$/d' | + sed '/^=======/d' + ) + + diff_values "$asm_output_two_stage" "$asm_output_via_ir" --ignore-space-change --ignore-blank-lines + + local bin_output_two_stage bin_output_via_ir + + for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do + bin_output_two_stage+=$( + msg_on_error --no-stderr "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | + sed '/^Binary representation:$/d' | + sed '/^=======/d' + ) + done + + bin_output_via_ir=$( + msg_on_error --no-stderr "$SOLC" --via-ir --bin "${optimizer_flags[@]}" "$solidity_file" | + sed '/^Binary:$/d' | + sed '/^=======/d' + ) + + diff_values "$bin_output_two_stage" "$bin_output_via_ir" --ignore-space-change --ignore-blank-lines + + popd > /dev/null + rm -r "$SOLTMPDIR" +} + +printTask "Testing the eqivalence of --via-ir and a two-stage compilation..." +( + externalContracts=( + externalTests/solc-js/DAO/TokenCreation.sol + libsolidity/semanticTests/externalContracts/_prbmath/PRBMathSD59x18.sol + libsolidity/semanticTests/externalContracts/_prbmath/PRBMathUD60x18.sol + libsolidity/semanticTests/externalContracts/_stringutils/stringutils.sol + libsolidity/semanticTests/externalContracts/deposit_contract.sol + libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol + libsolidity/semanticTests/externalContracts/snark.sol + ) + + requiresOptimizer=( + externalTests/solc-js/DAO/TokenCreation.sol + libsolidity/semanticTests/externalContracts/deposit_contract.sol + libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol + libsolidity/semanticTests/externalContracts/snark.sol + ) + + for contractFile in "${externalContracts[@]}" + do + if ! [[ "${requiresOptimizer[*]}" =~ $contractFile ]] + then + printTask " - ${contractFile}" + test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" + fi + + printTask " - ${contractFile} (optimized)" + test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" --optimize + done +) From c1df8ed5637b03880459a6b94fa14811f19f34ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 1 Jun 2023 18:44:23 +0200 Subject: [PATCH 044/138] cmdlineTests: Remove unnecessary subshells - Whitespace-only change, separated out to make it easy to diff. --- test/cmdlineTests/~assembler_modes/test.sh | 32 ++++---- test/cmdlineTests/~ast_import_export/test.sh | 14 ++-- test/cmdlineTests/~compilation_tests/test.sh | 20 +++-- .../~documentation_examples/test.sh | 79 ++++++++++--------- test/cmdlineTests/~linking/test.sh | 30 ++++--- test/cmdlineTests/~overwriting_files/test.sh | 20 ++--- test/cmdlineTests/~soljson_via_fuzzer/test.sh | 17 ++-- test/cmdlineTests/~standard_input/test.sh | 36 ++++----- test/cmdlineTests/~unknown_options/test.sh | 22 +++--- .../~update_bugs_by_version/test.sh | 3 + test/cmdlineTests/~via_ir_equivalence/test.sh | 54 ++++++------- 11 files changed, 163 insertions(+), 164 deletions(-) diff --git a/test/cmdlineTests/~assembler_modes/test.sh b/test/cmdlineTests/~assembler_modes/test.sh index 099a32444090..21947304aad4 100755 --- a/test/cmdlineTests/~assembler_modes/test.sh +++ b/test/cmdlineTests/~assembler_modes/test.sh @@ -25,22 +25,20 @@ function test_solc_assembly_output } printTask "Testing assemble, yul, strict-assembly and optimize..." -( - echo '{}' | msg_on_error --silent "$SOLC" - --assemble - echo '{}' | msg_on_error --silent "$SOLC" - --yul - echo '{}' | msg_on_error --silent "$SOLC" - --strict-assembly +echo '{}' | msg_on_error --silent "$SOLC" - --assemble +echo '{}' | msg_on_error --silent "$SOLC" - --yul +echo '{}' | msg_on_error --silent "$SOLC" - --strict-assembly - # Test options above in conjunction with --optimize. - # Using both, --assemble and --optimize should fail. - echo '{}' | "$SOLC" - --assemble --optimize &>/dev/null && fail "solc --assemble --optimize did not fail as expected." - echo '{}' | "$SOLC" - --yul --optimize &>/dev/null && fail "solc --yul --optimize did not fail as expected." +# Test options above in conjunction with --optimize. +# Using both, --assemble and --optimize should fail. +echo '{}' | "$SOLC" - --assemble --optimize &>/dev/null && fail "solc --assemble --optimize did not fail as expected." +echo '{}' | "$SOLC" - --yul --optimize &>/dev/null && fail "solc --yul --optimize did not fail as expected." - # Test yul and strict assembly output - # Non-empty code results in non-empty binary representation with optimizations turned off, - # while it results in empty binary representation with optimizations turned on. - test_solc_assembly_output "{ let x:u256 := 0:u256 }" "{ let x := 0 }" "--yul" - test_solc_assembly_output "{ let x:u256 := bitnot(7:u256) }" "{ let x := bitnot(7) }" "--yul" - test_solc_assembly_output "{ let t:bool := not(true) }" "{ let t:bool := not(true) }" "--yul" - test_solc_assembly_output "{ let x := 0 }" "{ let x := 0 }" "--strict-assembly" - test_solc_assembly_output "{ let x := 0 }" "{ { } }" "--strict-assembly --optimize" -) +# Test yul and strict assembly output +# Non-empty code results in non-empty binary representation with optimizations turned off, +# while it results in empty binary representation with optimizations turned on. +test_solc_assembly_output "{ let x:u256 := 0:u256 }" "{ let x := 0 }" "--yul" +test_solc_assembly_output "{ let x:u256 := bitnot(7:u256) }" "{ let x := bitnot(7) }" "--yul" +test_solc_assembly_output "{ let t:bool := not(true) }" "{ let t:bool := not(true) }" "--yul" +test_solc_assembly_output "{ let x := 0 }" "{ let x := 0 }" "--strict-assembly" +test_solc_assembly_output "{ let x := 0 }" "{ { } }" "--strict-assembly --optimize" diff --git a/test/cmdlineTests/~ast_import_export/test.sh b/test/cmdlineTests/~ast_import_export/test.sh index d7250ce66568..11ef33de897d 100755 --- a/test/cmdlineTests/~ast_import_export/test.sh +++ b/test/cmdlineTests/~ast_import_export/test.sh @@ -6,12 +6,10 @@ source "${REPO_ROOT}/scripts/common.sh" printTask "Testing AST import/export..." SOLTMPDIR=$(mktemp -d) -( - cd "$SOLTMPDIR" - if ! "$REPO_ROOT/scripts/ASTImportTest.sh" ast - then - rm -r "$SOLTMPDIR" - fail - fi -) +cd "$SOLTMPDIR" +if ! "$REPO_ROOT/scripts/ASTImportTest.sh" ast +then + rm -r "$SOLTMPDIR" + fail +fi rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~compilation_tests/test.sh b/test/cmdlineTests/~compilation_tests/test.sh index 5793b17c1a1f..9dc7f9ca8d70 100755 --- a/test/cmdlineTests/~compilation_tests/test.sh +++ b/test/cmdlineTests/~compilation_tests/test.sh @@ -7,14 +7,12 @@ source "${REPO_ROOT}/scripts/common.sh" source "${REPO_ROOT}/scripts/common_cmdline.sh" printTask "Compiling various other contracts and libraries..." -( - cd "$REPO_ROOT"/test/compilationTests/ - for dir in */ - do - echo " - $dir" - cd "$dir" - # shellcheck disable=SC2046 # These file names are not supposed to contain spaces. - compileFull --expect-warnings $(find . -name '*.sol') - cd .. - done -) +cd "$REPO_ROOT"/test/compilationTests/ +for dir in */ +do + echo " - $dir" + cd "$dir" + # shellcheck disable=SC2046 # These file names are not supposed to contain spaces. + compileFull --expect-warnings $(find . -name '*.sol') + cd .. +done diff --git a/test/cmdlineTests/~documentation_examples/test.sh b/test/cmdlineTests/~documentation_examples/test.sh index d3bc8c1b1806..8e5984d19546 100755 --- a/test/cmdlineTests/~documentation_examples/test.sh +++ b/test/cmdlineTests/~documentation_examples/test.sh @@ -8,44 +8,45 @@ source "${REPO_ROOT}/scripts/common_cmdline.sh" printTask "Compiling all examples from the documentation..." SOLTMPDIR=$(mktemp -d) -( - set -e - cd "$SOLTMPDIR" - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ - developmentVersion=$("$REPO_ROOT/scripts/get_version.sh") - - for f in *.yul *.sol - do - # The contributors guide uses syntax tests, but we cannot - # really handle them here. - if grep -E 'DeclarationError:|// ----' "$f" >/dev/null - then - continue - fi - echo "$f" - - opts=() - # We expect errors if explicitly stated, or if imports - # are used (in the style guide) - if grep -E "// This will not compile" "$f" >/dev/null || - sed -e 's|//.*||g' "$f" | grep -E "import \"" >/dev/null - then - opts=(--expect-errors) - fi - if grep "// This will report a warning" "$f" >/dev/null - then - opts+=(--expect-warnings) - fi - if grep "// This may report a warning" "$f" >/dev/null - then - opts+=(--ignore-warnings) - fi - - # Disable the version pragma in code snippets that only work with the current development version. - # It's necessary because x.y.z won't match `^x.y.z` or `>=x.y.z` pragmas until it's officially released. - sed -i.bak -E -e 's/pragma[[:space:]]+solidity[[:space:]]*(\^|>=)[[:space:]]*'"$developmentVersion"'/pragma solidity >0.0.1/' "$f" - compileFull "${opts[@]}" "$SOLTMPDIR/$f" - done -) + +set -e +cd "$SOLTMPDIR" + +"$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ + +developmentVersion=$("$REPO_ROOT/scripts/get_version.sh") + +for f in *.yul *.sol +do + # The contributors guide uses syntax tests, but we cannot + # really handle them here. + if grep -E 'DeclarationError:|// ----' "$f" >/dev/null + then + continue + fi + echo "$f" + + opts=() + # We expect errors if explicitly stated, or if imports + # are used (in the style guide) + if grep -E "// This will not compile" "$f" >/dev/null || + sed -e 's|//.*||g' "$f" | grep -E "import \"" >/dev/null + then + opts=(--expect-errors) + fi + if grep "// This will report a warning" "$f" >/dev/null + then + opts+=(--expect-warnings) + fi + if grep "// This may report a warning" "$f" >/dev/null + then + opts+=(--ignore-warnings) + fi + + # Disable the version pragma in code snippets that only work with the current development version. + # It's necessary because x.y.z won't match `^x.y.z` or `>=x.y.z` pragmas until it's officially released. + sed -i.bak -E -e 's/pragma[[:space:]]+solidity[[:space:]]*(\^|>=)[[:space:]]*'"$developmentVersion"'/pragma solidity >0.0.1/' "$f" + compileFull "${opts[@]}" "$SOLTMPDIR/$f" +done rm -r "$SOLTMPDIR" echo "Done." diff --git a/test/cmdlineTests/~linking/test.sh b/test/cmdlineTests/~linking/test.sh index d9b0c867bfe0..aaa0169efd7d 100755 --- a/test/cmdlineTests/~linking/test.sh +++ b/test/cmdlineTests/~linking/test.sh @@ -6,17 +6,21 @@ source "${REPO_ROOT}/scripts/common.sh" printTask "Testing linking itself..." SOLTMPDIR=$(mktemp -d) -( - cd "$SOLTMPDIR" - echo 'library L { function f() public pure {} } contract C { function f() public pure { L.f(); } }' > x.sol - msg_on_error --no-stderr "$SOLC" --bin -o . x.sol - # Explanation and placeholder should be there - grep -q '//' C.bin && grep -q '__' C.bin - # But not in library file. - grep -q -v '[/_]' L.bin - # Now link - msg_on_error "$SOLC" --link --libraries x.sol:L=0x90f20564390eAe531E810af625A22f51385Cd222 C.bin - # Now the placeholder and explanation should be gone. - grep -q -v '[/_]' C.bin -) +cd "$SOLTMPDIR" + +echo 'library L { function f() public pure {} } contract C { function f() public pure { L.f(); } }' > x.sol +msg_on_error --no-stderr "$SOLC" --bin -o . x.sol + +# Explanation and placeholder should be there +grep -q '//' C.bin && grep -q '__' C.bin + +# But not in library file. +grep -q -v '[/_]' L.bin + +# Now link +msg_on_error "$SOLC" --link --libraries x.sol:L=0x90f20564390eAe531E810af625A22f51385Cd222 C.bin + +# Now the placeholder and explanation should be gone. +grep -q -v '[/_]' C.bin + rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~overwriting_files/test.sh b/test/cmdlineTests/~overwriting_files/test.sh index 23599c52f08b..afede543cb66 100755 --- a/test/cmdlineTests/~overwriting_files/test.sh +++ b/test/cmdlineTests/~overwriting_files/test.sh @@ -6,13 +6,15 @@ source "${REPO_ROOT}/scripts/common.sh" printTask "Testing overwriting files..." SOLTMPDIR=$(mktemp -d) -( - # First time it works - echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" - # Second time it fails - echo 'contract C {}' | "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null && \ - fail "solc did not refuse to overwrite $SOLTMPDIR/non-existing-stuff-to-create." - # Unless we force - echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --overwrite --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" -) + +# First time it works +echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" + +# Second time it fails +echo 'contract C {}' | "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null && \ + fail "solc did not refuse to overwrite $SOLTMPDIR/non-existing-stuff-to-create." + +# Unless we force +echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --overwrite --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" + rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~soljson_via_fuzzer/test.sh b/test/cmdlineTests/~soljson_via_fuzzer/test.sh index 69fa6d84d1be..585a540c5d96 100755 --- a/test/cmdlineTests/~soljson_via_fuzzer/test.sh +++ b/test/cmdlineTests/~soljson_via_fuzzer/test.sh @@ -6,13 +6,14 @@ source "${REPO_ROOT}/scripts/common.sh" printTask "Testing soljson via the fuzzer..." SOLTMPDIR=$(mktemp -d) -( - set -e - cd "$SOLTMPDIR" - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ - echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --quiet --input-files - echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --without-optimizer --quiet --input-files -) +set -e +cd "$SOLTMPDIR" + +"$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ +"$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ + +echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --quiet --input-files +echo ./*.sol | xargs -P 4 -n 50 "${SOLIDITY_BUILD_DIR}/test/tools/solfuzzer" --without-optimizer --quiet --input-files + rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~standard_input/test.sh b/test/cmdlineTests/~standard_input/test.sh index 03da67737463..dde9dfedb108 100755 --- a/test/cmdlineTests/~standard_input/test.sh +++ b/test/cmdlineTests/~standard_input/test.sh @@ -6,26 +6,24 @@ source "${REPO_ROOT}/scripts/common.sh" printTask "Testing standard input..." SOLTMPDIR=$(mktemp -d) -( - set +e - output=$("$SOLC" --bin 2>&1) - result=$? - set -e +set +e +output=$("$SOLC" --bin 2>&1) +result=$? +set -e - # This should fail - if [[ ! ("$output" =~ "No input files given") || ($result == 0) ]] - then - fail "Incorrect response to empty input arg list: $output" - fi +# This should fail +if [[ ! ("$output" =~ "No input files given") || ($result == 0) ]] +then + fail "Incorrect response to empty input arg list: $output" +fi - # The contract should be compiled - if ! echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin | grep -q ":C" - then - fail "Failed to compile a simple contract from standard input" - fi +# The contract should be compiled +if ! echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin | grep -q ":C" +then + fail "Failed to compile a simple contract from standard input" +fi - # This should not fail - echo '' | msg_on_error --silent --msg "Incorrect response to --ast-compact-json option with empty stdin" \ - "$SOLC" --ast-compact-json - -) +# This should not fail +echo '' | msg_on_error --silent --msg "Incorrect response to --ast-compact-json option with empty stdin" \ + "$SOLC" --ast-compact-json - rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~unknown_options/test.sh b/test/cmdlineTests/~unknown_options/test.sh index dde9fc9c1481..b0f25b2cfbad 100755 --- a/test/cmdlineTests/~unknown_options/test.sh +++ b/test/cmdlineTests/~unknown_options/test.sh @@ -5,16 +5,14 @@ set -euo pipefail source "${REPO_ROOT}/scripts/common.sh" printTask "Testing unknown options..." -( - set +e - output=$("$SOLC" --allow=test 2>&1) - failed=$? - set -e +set +e +output=$("$SOLC" --allow=test 2>&1) +failed=$? +set -e - if [ "$output" == "unrecognised option '--allow=test'" ] && [ $failed -ne 0 ] - then - echo "Passed" - else - fail "Incorrect response to unknown options: $output" - fi -) +if [ "$output" == "unrecognised option '--allow=test'" ] && [ $failed -ne 0 ] +then + echo "Passed" +else + fail "Incorrect response to unknown options: $output" +fi diff --git a/test/cmdlineTests/~update_bugs_by_version/test.sh b/test/cmdlineTests/~update_bugs_by_version/test.sh index fdeafd5a7465..78fa8a80f030 100755 --- a/test/cmdlineTests/~update_bugs_by_version/test.sh +++ b/test/cmdlineTests/~update_bugs_by_version/test.sh @@ -6,8 +6,11 @@ source "${REPO_ROOT}/scripts/common.sh" SOLTMPDIR=$(mktemp -d) printTask "Checking that the bug list is up to date..." + cp "${REPO_ROOT}/docs/bugs_by_version.json" "${SOLTMPDIR}/original_bugs_by_version.json" "${REPO_ROOT}/scripts/update_bugs_by_version.py" + diff --unified "${SOLTMPDIR}/original_bugs_by_version.json" "${REPO_ROOT}/docs/bugs_by_version.json" || \ fail "The bug list in bugs_by_version.json was out of date and has been updated. Please investigate and submit a bugfix if necessary." + rm -r "$SOLTMPDIR" diff --git a/test/cmdlineTests/~via_ir_equivalence/test.sh b/test/cmdlineTests/~via_ir_equivalence/test.sh index 9a3030d1d25d..65cdf7fe2d1f 100755 --- a/test/cmdlineTests/~via_ir_equivalence/test.sh +++ b/test/cmdlineTests/~via_ir_equivalence/test.sh @@ -66,33 +66,31 @@ function test_via_ir_equivalence() } printTask "Testing the eqivalence of --via-ir and a two-stage compilation..." -( - externalContracts=( - externalTests/solc-js/DAO/TokenCreation.sol - libsolidity/semanticTests/externalContracts/_prbmath/PRBMathSD59x18.sol - libsolidity/semanticTests/externalContracts/_prbmath/PRBMathUD60x18.sol - libsolidity/semanticTests/externalContracts/_stringutils/stringutils.sol - libsolidity/semanticTests/externalContracts/deposit_contract.sol - libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol - libsolidity/semanticTests/externalContracts/snark.sol - ) - - requiresOptimizer=( - externalTests/solc-js/DAO/TokenCreation.sol - libsolidity/semanticTests/externalContracts/deposit_contract.sol - libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol - libsolidity/semanticTests/externalContracts/snark.sol - ) - - for contractFile in "${externalContracts[@]}" - do - if ! [[ "${requiresOptimizer[*]}" =~ $contractFile ]] - then - printTask " - ${contractFile}" - test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" - fi +externalContracts=( + externalTests/solc-js/DAO/TokenCreation.sol + libsolidity/semanticTests/externalContracts/_prbmath/PRBMathSD59x18.sol + libsolidity/semanticTests/externalContracts/_prbmath/PRBMathUD60x18.sol + libsolidity/semanticTests/externalContracts/_stringutils/stringutils.sol + libsolidity/semanticTests/externalContracts/deposit_contract.sol + libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol + libsolidity/semanticTests/externalContracts/snark.sol +) - printTask " - ${contractFile} (optimized)" - test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" --optimize - done +requiresOptimizer=( + externalTests/solc-js/DAO/TokenCreation.sol + libsolidity/semanticTests/externalContracts/deposit_contract.sol + libsolidity/semanticTests/externalContracts/FixedFeeRegistrar.sol + libsolidity/semanticTests/externalContracts/snark.sol ) + +for contractFile in "${externalContracts[@]}" +do + if ! [[ "${requiresOptimizer[*]}" =~ $contractFile ]] + then + printTask " - ${contractFile}" + test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" + fi + + printTask " - ${contractFile} (optimized)" + test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" --optimize +done From 00c2f511d3fd57fa16cccf56789942617ff8fcca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 1 Jun 2023 20:10:42 +0200 Subject: [PATCH 045/138] cmdlineTests: Remove superfluous output from script-based tests and adjust the rest --- test/cmdlineTests/~assembler_modes/test.sh | 1 - .../~ast_export_with_stop_after_parsing/test.sh | 1 - test/cmdlineTests/~ast_import_export/test.sh | 1 - test/cmdlineTests/~compilation_tests/test.sh | 3 +-- test/cmdlineTests/~documentation_examples/test.sh | 4 +--- test/cmdlineTests/~library_checksum/test.sh | 1 - test/cmdlineTests/~library_long_names/test.sh | 1 - test/cmdlineTests/~linking/test.sh | 2 +- test/cmdlineTests/~overwriting_files/test.sh | 1 - test/cmdlineTests/~soljson_via_fuzzer/test.sh | 1 - test/cmdlineTests/~standard_input/test.sh | 1 - test/cmdlineTests/~unknown_options/test.sh | 5 +---- test/cmdlineTests/~update_bugs_by_version/test.sh | 1 - test/cmdlineTests/~via_ir_equivalence/test.sh | 7 +++---- 14 files changed, 7 insertions(+), 23 deletions(-) diff --git a/test/cmdlineTests/~assembler_modes/test.sh b/test/cmdlineTests/~assembler_modes/test.sh index 21947304aad4..34e899328604 100755 --- a/test/cmdlineTests/~assembler_modes/test.sh +++ b/test/cmdlineTests/~assembler_modes/test.sh @@ -24,7 +24,6 @@ function test_solc_assembly_output fi } -printTask "Testing assemble, yul, strict-assembly and optimize..." echo '{}' | msg_on_error --silent "$SOLC" - --assemble echo '{}' | msg_on_error --silent "$SOLC" - --yul echo '{}' | msg_on_error --silent "$SOLC" - --strict-assembly diff --git a/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh b/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh index d023d13e05cd..e6a69d28b249 100755 --- a/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh +++ b/test/cmdlineTests/~ast_export_with_stop_after_parsing/test.sh @@ -4,5 +4,4 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing AST export with stop-after=parsing..." "$REPO_ROOT/test/stopAfterParseTests.sh" diff --git a/test/cmdlineTests/~ast_import_export/test.sh b/test/cmdlineTests/~ast_import_export/test.sh index 11ef33de897d..d85d55b964fd 100755 --- a/test/cmdlineTests/~ast_import_export/test.sh +++ b/test/cmdlineTests/~ast_import_export/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing AST import/export..." SOLTMPDIR=$(mktemp -d) cd "$SOLTMPDIR" if ! "$REPO_ROOT/scripts/ASTImportTest.sh" ast diff --git a/test/cmdlineTests/~compilation_tests/test.sh b/test/cmdlineTests/~compilation_tests/test.sh index 9dc7f9ca8d70..d411c5ce85e5 100755 --- a/test/cmdlineTests/~compilation_tests/test.sh +++ b/test/cmdlineTests/~compilation_tests/test.sh @@ -6,11 +6,10 @@ source "${REPO_ROOT}/scripts/common.sh" # shellcheck source=scripts/common_cmdline.sh source "${REPO_ROOT}/scripts/common_cmdline.sh" -printTask "Compiling various other contracts and libraries..." cd "$REPO_ROOT"/test/compilationTests/ for dir in */ do - echo " - $dir" + echo " - $dir" cd "$dir" # shellcheck disable=SC2046 # These file names are not supposed to contain spaces. compileFull --expect-warnings $(find . -name '*.sol') diff --git a/test/cmdlineTests/~documentation_examples/test.sh b/test/cmdlineTests/~documentation_examples/test.sh index 8e5984d19546..4d90acaf449e 100755 --- a/test/cmdlineTests/~documentation_examples/test.sh +++ b/test/cmdlineTests/~documentation_examples/test.sh @@ -6,7 +6,6 @@ source "${REPO_ROOT}/scripts/common.sh" # shellcheck source=scripts/common_cmdline.sh source "${REPO_ROOT}/scripts/common_cmdline.sh" -printTask "Compiling all examples from the documentation..." SOLTMPDIR=$(mktemp -d) set -e @@ -24,7 +23,7 @@ do then continue fi - echo "$f" + echo " - Compiling example $f" opts=() # We expect errors if explicitly stated, or if imports @@ -49,4 +48,3 @@ do compileFull "${opts[@]}" "$SOLTMPDIR/$f" done rm -r "$SOLTMPDIR" -echo "Done." diff --git a/test/cmdlineTests/~library_checksum/test.sh b/test/cmdlineTests/~library_checksum/test.sh index c6d52fa4524f..bb5fbf51de2f 100755 --- a/test/cmdlineTests/~library_checksum/test.sh +++ b/test/cmdlineTests/~library_checksum/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing library checksum..." echo '' | msg_on_error --no-stdout "$SOLC" - --link --libraries a=0x90f20564390eAe531E810af625A22f51385Cd222 echo '' | "$SOLC" - --link --libraries a=0x80f20564390eAe531E810af625A22f51385Cd222 &>/dev/null && \ fail "solc --link did not reject a library address with an invalid checksum." diff --git a/test/cmdlineTests/~library_long_names/test.sh b/test/cmdlineTests/~library_long_names/test.sh index 59f179232ad3..ad3008cdd5ea 100755 --- a/test/cmdlineTests/~library_long_names/test.sh +++ b/test/cmdlineTests/~library_long_names/test.sh @@ -4,5 +4,4 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing long library names..." echo '' | msg_on_error --no-stdout "$SOLC" - --link --libraries aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylonglibraryname=0x90f20564390eAe531E810af625A22f51385Cd222 diff --git a/test/cmdlineTests/~linking/test.sh b/test/cmdlineTests/~linking/test.sh index aaa0169efd7d..a87dccdccaec 100755 --- a/test/cmdlineTests/~linking/test.sh +++ b/test/cmdlineTests/~linking/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing linking itself..." SOLTMPDIR=$(mktemp -d) cd "$SOLTMPDIR" @@ -18,6 +17,7 @@ grep -q '//' C.bin && grep -q '__' C.bin grep -q -v '[/_]' L.bin # Now link +printf " " msg_on_error "$SOLC" --link --libraries x.sol:L=0x90f20564390eAe531E810af625A22f51385Cd222 C.bin # Now the placeholder and explanation should be gone. diff --git a/test/cmdlineTests/~overwriting_files/test.sh b/test/cmdlineTests/~overwriting_files/test.sh index afede543cb66..0fba60e06e07 100755 --- a/test/cmdlineTests/~overwriting_files/test.sh +++ b/test/cmdlineTests/~overwriting_files/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing overwriting files..." SOLTMPDIR=$(mktemp -d) # First time it works diff --git a/test/cmdlineTests/~soljson_via_fuzzer/test.sh b/test/cmdlineTests/~soljson_via_fuzzer/test.sh index 585a540c5d96..ae52a8bc36e5 100755 --- a/test/cmdlineTests/~soljson_via_fuzzer/test.sh +++ b/test/cmdlineTests/~soljson_via_fuzzer/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing soljson via the fuzzer..." SOLTMPDIR=$(mktemp -d) set -e diff --git a/test/cmdlineTests/~standard_input/test.sh b/test/cmdlineTests/~standard_input/test.sh index dde9dfedb108..243e74a710c9 100755 --- a/test/cmdlineTests/~standard_input/test.sh +++ b/test/cmdlineTests/~standard_input/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing standard input..." SOLTMPDIR=$(mktemp -d) set +e output=$("$SOLC" --bin 2>&1) diff --git a/test/cmdlineTests/~unknown_options/test.sh b/test/cmdlineTests/~unknown_options/test.sh index b0f25b2cfbad..923a36be6007 100755 --- a/test/cmdlineTests/~unknown_options/test.sh +++ b/test/cmdlineTests/~unknown_options/test.sh @@ -4,15 +4,12 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -printTask "Testing unknown options..." set +e output=$("$SOLC" --allow=test 2>&1) failed=$? set -e -if [ "$output" == "unrecognised option '--allow=test'" ] && [ $failed -ne 0 ] +if [[ $output != "unrecognised option '--allow=test'" ]] || (( failed == 0 )) then - echo "Passed" -else fail "Incorrect response to unknown options: $output" fi diff --git a/test/cmdlineTests/~update_bugs_by_version/test.sh b/test/cmdlineTests/~update_bugs_by_version/test.sh index 78fa8a80f030..9d07f4c17662 100755 --- a/test/cmdlineTests/~update_bugs_by_version/test.sh +++ b/test/cmdlineTests/~update_bugs_by_version/test.sh @@ -5,7 +5,6 @@ set -euo pipefail source "${REPO_ROOT}/scripts/common.sh" SOLTMPDIR=$(mktemp -d) -printTask "Checking that the bug list is up to date..." cp "${REPO_ROOT}/docs/bugs_by_version.json" "${SOLTMPDIR}/original_bugs_by_version.json" "${REPO_ROOT}/scripts/update_bugs_by_version.py" diff --git a/test/cmdlineTests/~via_ir_equivalence/test.sh b/test/cmdlineTests/~via_ir_equivalence/test.sh index 65cdf7fe2d1f..24c784bb83c7 100755 --- a/test/cmdlineTests/~via_ir_equivalence/test.sh +++ b/test/cmdlineTests/~via_ir_equivalence/test.sh @@ -15,7 +15,7 @@ function test_via_ir_equivalence() [[ $optimize_flag == --optimize || $optimize_flag == "" ]] || assertFail "The second argument must be --optimize if present." local output_file_prefix - output_file_prefix=$(basename "$1" .sol) + output_file_prefix=$(basename "$solidity_file" .sol) local optimizer_flags=() [[ $optimize_flag == "" ]] || optimizer_flags+=("$optimize_flag") @@ -65,7 +65,6 @@ function test_via_ir_equivalence() rm -r "$SOLTMPDIR" } -printTask "Testing the eqivalence of --via-ir and a two-stage compilation..." externalContracts=( externalTests/solc-js/DAO/TokenCreation.sol libsolidity/semanticTests/externalContracts/_prbmath/PRBMathSD59x18.sol @@ -87,10 +86,10 @@ for contractFile in "${externalContracts[@]}" do if ! [[ "${requiresOptimizer[*]}" =~ $contractFile ]] then - printTask " - ${contractFile}" + printTask " - ${contractFile}" test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" fi - printTask " - ${contractFile} (optimized)" + printTask " - ${contractFile} (optimized)" test_via_ir_equivalence "${REPO_ROOT}/test/${contractFile}" --optimize done From 5c5f8e8dad9024de15e091bd5639eabb48648c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 1 Jun 2023 20:13:35 +0200 Subject: [PATCH 046/138] cmdlineTests: Remove superfluous set and temporary dirs --- test/cmdlineTests/~documentation_examples/test.sh | 2 -- test/cmdlineTests/~soljson_via_fuzzer/test.sh | 2 -- test/cmdlineTests/~standard_input/test.sh | 2 -- 3 files changed, 6 deletions(-) diff --git a/test/cmdlineTests/~documentation_examples/test.sh b/test/cmdlineTests/~documentation_examples/test.sh index 4d90acaf449e..7d7b7fa7d389 100755 --- a/test/cmdlineTests/~documentation_examples/test.sh +++ b/test/cmdlineTests/~documentation_examples/test.sh @@ -7,8 +7,6 @@ source "${REPO_ROOT}/scripts/common.sh" source "${REPO_ROOT}/scripts/common_cmdline.sh" SOLTMPDIR=$(mktemp -d) - -set -e cd "$SOLTMPDIR" "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ diff --git a/test/cmdlineTests/~soljson_via_fuzzer/test.sh b/test/cmdlineTests/~soljson_via_fuzzer/test.sh index ae52a8bc36e5..42410947f040 100755 --- a/test/cmdlineTests/~soljson_via_fuzzer/test.sh +++ b/test/cmdlineTests/~soljson_via_fuzzer/test.sh @@ -5,8 +5,6 @@ set -euo pipefail source "${REPO_ROOT}/scripts/common.sh" SOLTMPDIR=$(mktemp -d) - -set -e cd "$SOLTMPDIR" "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ diff --git a/test/cmdlineTests/~standard_input/test.sh b/test/cmdlineTests/~standard_input/test.sh index 243e74a710c9..4aab34be1fee 100755 --- a/test/cmdlineTests/~standard_input/test.sh +++ b/test/cmdlineTests/~standard_input/test.sh @@ -4,7 +4,6 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -SOLTMPDIR=$(mktemp -d) set +e output=$("$SOLC" --bin 2>&1) result=$? @@ -25,4 +24,3 @@ fi # This should not fail echo '' | msg_on_error --silent --msg "Incorrect response to --ast-compact-json option with empty stdin" \ "$SOLC" --ast-compact-json - -rm -r "$SOLTMPDIR" From f397b9a083e77306da6369ae10e5991883449c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 1 Jun 2023 18:51:42 +0200 Subject: [PATCH 047/138] cmdlineTests: Add prefixes for temporary files/dirs --- test/cmdlineTests.sh | 4 ++-- test/cmdlineTests/~ast_import_export/test.sh | 2 +- test/cmdlineTests/~documentation_examples/test.sh | 2 +- test/cmdlineTests/~linking/test.sh | 2 +- test/cmdlineTests/~overwriting_files/test.sh | 2 +- test/cmdlineTests/~soljson_via_fuzzer/test.sh | 2 +- test/cmdlineTests/~update_bugs_by_version/test.sh | 2 +- test/cmdlineTests/~via_ir_equivalence/test.sh | 6 +++--- test/stopAfterParseTests.sh | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index fb346f71d1fa..0731fc5b2c05 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -174,8 +174,8 @@ function test_solc_behaviour local stderr_expected="${7}" local stdout_expectation_file="${8}" # the file to write to when user chooses to update stdout expectation local stderr_expectation_file="${9}" # the file to write to when user chooses to update stderr expectation - local stdout_path; stdout_path=$(mktemp) - local stderr_path; stderr_path=$(mktemp) + local stdout_path; stdout_path=$(mktemp -t "cmdline-test-stdout-XXXXXX") + local stderr_path; stderr_path=$(mktemp -t "cmdline-test-stderr-XXXXXX") # shellcheck disable=SC2064 trap "rm -f $stdout_path $stderr_path" EXIT diff --git a/test/cmdlineTests/~ast_import_export/test.sh b/test/cmdlineTests/~ast_import_export/test.sh index d85d55b964fd..ff3ab8811387 100755 --- a/test/cmdlineTests/~ast_import_export/test.sh +++ b/test/cmdlineTests/~ast_import_export/test.sh @@ -4,7 +4,7 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -SOLTMPDIR=$(mktemp -d) +SOLTMPDIR=$(mktemp -d -t "cmdline-test-ast-import-export-XXXXXX") cd "$SOLTMPDIR" if ! "$REPO_ROOT/scripts/ASTImportTest.sh" ast then diff --git a/test/cmdlineTests/~documentation_examples/test.sh b/test/cmdlineTests/~documentation_examples/test.sh index 7d7b7fa7d389..1acf5e8a7a4f 100755 --- a/test/cmdlineTests/~documentation_examples/test.sh +++ b/test/cmdlineTests/~documentation_examples/test.sh @@ -6,7 +6,7 @@ source "${REPO_ROOT}/scripts/common.sh" # shellcheck source=scripts/common_cmdline.sh source "${REPO_ROOT}/scripts/common_cmdline.sh" -SOLTMPDIR=$(mktemp -d) +SOLTMPDIR=$(mktemp -d -t "cmdline-test-docs-examples-XXXXXX") cd "$SOLTMPDIR" "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ diff --git a/test/cmdlineTests/~linking/test.sh b/test/cmdlineTests/~linking/test.sh index a87dccdccaec..ad7d9e173614 100755 --- a/test/cmdlineTests/~linking/test.sh +++ b/test/cmdlineTests/~linking/test.sh @@ -4,7 +4,7 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -SOLTMPDIR=$(mktemp -d) +SOLTMPDIR=$(mktemp -d -t "cmdline-test-linking-XXXXXX") cd "$SOLTMPDIR" echo 'library L { function f() public pure {} } contract C { function f() public pure { L.f(); } }' > x.sol diff --git a/test/cmdlineTests/~overwriting_files/test.sh b/test/cmdlineTests/~overwriting_files/test.sh index 0fba60e06e07..acb8a7aca29e 100755 --- a/test/cmdlineTests/~overwriting_files/test.sh +++ b/test/cmdlineTests/~overwriting_files/test.sh @@ -4,7 +4,7 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -SOLTMPDIR=$(mktemp -d) +SOLTMPDIR=$(mktemp -d -t "cmdline-test-overwriting-files-XXXXXX") # First time it works echo 'contract C {}' | msg_on_error --no-stderr "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" diff --git a/test/cmdlineTests/~soljson_via_fuzzer/test.sh b/test/cmdlineTests/~soljson_via_fuzzer/test.sh index 42410947f040..2d2312fd1586 100755 --- a/test/cmdlineTests/~soljson_via_fuzzer/test.sh +++ b/test/cmdlineTests/~soljson_via_fuzzer/test.sh @@ -4,7 +4,7 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -SOLTMPDIR=$(mktemp -d) +SOLTMPDIR=$(mktemp -d -t "cmdline-test-soljson-via-fuzzer-XXXXXX") cd "$SOLTMPDIR" "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ diff --git a/test/cmdlineTests/~update_bugs_by_version/test.sh b/test/cmdlineTests/~update_bugs_by_version/test.sh index 9d07f4c17662..6ec1d069bcba 100755 --- a/test/cmdlineTests/~update_bugs_by_version/test.sh +++ b/test/cmdlineTests/~update_bugs_by_version/test.sh @@ -4,7 +4,7 @@ set -euo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" -SOLTMPDIR=$(mktemp -d) +SOLTMPDIR=$(mktemp -d -t "cmdline-test-update-bugs-by-version-XXXXXX") cp "${REPO_ROOT}/docs/bugs_by_version.json" "${SOLTMPDIR}/original_bugs_by_version.json" "${REPO_ROOT}/scripts/update_bugs_by_version.py" diff --git a/test/cmdlineTests/~via_ir_equivalence/test.sh b/test/cmdlineTests/~via_ir_equivalence/test.sh index 24c784bb83c7..4da72d15186b 100755 --- a/test/cmdlineTests/~via_ir_equivalence/test.sh +++ b/test/cmdlineTests/~via_ir_equivalence/test.sh @@ -6,9 +6,6 @@ source "${REPO_ROOT}/scripts/common.sh" function test_via_ir_equivalence() { - SOLTMPDIR=$(mktemp -d) - pushd "$SOLTMPDIR" > /dev/null - (( $# <= 2 )) || fail "This function accepts at most two arguments." local solidity_file="$1" local optimize_flag="$2" @@ -17,6 +14,9 @@ function test_via_ir_equivalence() local output_file_prefix output_file_prefix=$(basename "$solidity_file" .sol) + SOLTMPDIR=$(mktemp -d -t "cmdline-test-via-ir-equivalence-${output_file_prefix}-XXXXXX") + pushd "$SOLTMPDIR" > /dev/null + local optimizer_flags=() [[ $optimize_flag == "" ]] || optimizer_flags+=("$optimize_flag") [[ $optimize_flag == "" ]] || output_file_prefix+="_optimize" diff --git a/test/stopAfterParseTests.sh b/test/stopAfterParseTests.sh index 503c4357924d..7d74704c5e38 100755 --- a/test/stopAfterParseTests.sh +++ b/test/stopAfterParseTests.sh @@ -11,7 +11,7 @@ SOLIDITY_BUILD_DIR=${SOLIDITY_BUILD_DIR:-${REPO_ROOT}/build} SOLC=${SOLIDITY_BUILD_DIR}/solc/solc SPLITSOURCES=${REPO_ROOT}/scripts/splitSources.py -FILETMP=$(mktemp -d) +FILETMP=$(mktemp -d -t "stop-after-parse-tests-XXXXXX") cd "$FILETMP" || exit 1 From 0e48e1251deaca25e3366bd2ecb24e52f7b9a3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 2 Jun 2023 16:07:28 +0200 Subject: [PATCH 048/138] Document the command-line tests --- docs/contributing.rst | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/docs/contributing.rst b/docs/contributing.rst index 00e0decb60a7..02ca00455b91 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -269,6 +269,60 @@ and re-run the test. It now passes again: Do not put more than one contract into a single file, unless you are testing inheritance or cross-contract calls. Each file should test one aspect of your new feature. +Command-line Tests +------------------ + +Our suite of end-to-end command-line tests checks the behaviour of the compiler binary as a whole +in various scenarios. +These tests are located in `test/cmdlineTests/ `_, +one per subdirectory, and can be executed using the ``cmdlineTests.sh`` script. + +By default the script runs all available tests. +You can also provide one or more `file name patterns `_, +in which case only the tests matching at least one pattern will be executed. + +By default the script assumes that a ``solc`` binary is available inside the ``build/`` subdirectory +inside the working copy. +If you build the compiler outside of the source tree, you can use the ``SOLIDITY_BUILD_DIR`` environment +variable to specify a different location for the build directory. + +Example: + +.. code-block:: bash + + export SOLIDITY_BUILD_DIR=~/solidity/build/ + test/cmdlineTests.sh "standard_*" "*_yul_*" + +The commands above will run tests from directories starting with ``test/cmdlineTests/standard_`` and +subdirectories of ``test/cmdlineTests/`` that have ``_yul_`` somewhere in the name. +It will also assume that the file ``solidity/build/solc/solc`` inside your home directory is the +compiler binary (unless you are on Windows -- then ``solidity/build/solc/Release/solc.exe``). + +There are several kinds of command-line tests: + +- *Standard JSON test*: contains at least an ``input.json`` file. + In general may contain: + + - ``input.json``: input file to be passed to the ``--standard-json`` option on the command line. + - ``output.json``: expected Standard JSON output. + - ``args``: extra command-line arguments passed to ``solc``. + +- *CLI test*: contains at least an ``input.*`` file (other than ``input.json``). + In general may contain: + + - ``input.*``: a single input file, whose name will be supplied to ``solc`` on the command line. + Usually ``input.sol`` or ``input.yul``. + - ``args``: extra command-line arguments passed to ``solc``. + - ``stdin``: content to be passed to ``solc`` via standard input. + - ``output``: expected content of the standard output. + - ``err``: expected content of the standard error output. + - ``exit``: expected exit code. If not provided, zero is expected. + +- *Script test*: contains a ``test.*`` file. + In general may contain: + + - ``test.*``: a single script to run, usually ``test.sh`` or ``test.py``. + The script must be executable. Running the Fuzzer via AFL ========================== From f15b82643193ce05e41c0e602bb8cfbcb140f857 Mon Sep 17 00:00:00 2001 From: Pawel Gebal Date: Thu, 23 Feb 2023 19:22:46 +0100 Subject: [PATCH 049/138] Add optional bounds to unroll loops in BMC model checker --- Changelog.md | 1 + libsolidity/formal/BMC.cpp | 253 ++++++++++++------ libsolidity/formal/BMC.h | 22 +- libsolidity/formal/ModelCheckerSettings.h | 2 + libsolidity/formal/SMTEncoder.h | 2 + libsolidity/interface/StandardCompiler.cpp | 12 +- solc/CommandLineParser.cpp | 21 +- .../model_checker_bmc_loop_iterations/args | 1 + .../model_checker_bmc_loop_iterations/err | 11 + .../input.sol | 12 + .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 0 .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 0 .../input.json | 29 ++ .../output.json | 22 ++ .../input.json | 29 ++ .../output.json | 12 + test/libsolidity/SMTCheckerTest.cpp | 3 + test/libsolidity/SMTCheckerTest.h | 2 + .../functions_trivial_condition_for.sol | 8 - .../functions_trivial_condition_while.sol | 8 - ...e_1_false_positives.sol => do_while_1.sol} | 0 .../loops/do_while_bmc_iterations_1.sol | 16 ++ .../loops/do_while_bmc_iterations_2.sol | 20 ++ .../loops/do_while_bmc_iterations_3.sol | 18 ++ .../loops/do_while_bmc_iterations_4.sol | 15 ++ .../loops/do_while_bmc_iterations_5.sol | 22 ++ ...while_bmc_iterations_assertion_fails_1.sol | 17 ++ ...while_bmc_iterations_assertion_fails_2.sol | 19 ++ ...while_bmc_iterations_assertion_fails_3.sol | 17 ++ .../loops/do_while_bmc_iterations_break_1.sol | 17 ++ .../loops/do_while_bmc_iterations_break_2.sol | 17 ++ .../loops/do_while_bmc_iterations_break_3.sol | 19 ++ .../loops/do_while_bmc_iterations_break_4.sol | 19 ++ .../loops/do_while_bmc_iterations_break_5.sol | 19 ++ .../loops/do_while_bmc_iterations_break_6.sol | 23 ++ .../loops/do_while_bmc_iterations_break_7.sol | 23 ++ .../loops/do_while_bmc_iterations_break_8.sol | 17 ++ ..._while_bmc_iterations_break_continue_1.sol | 21 ++ ..._while_bmc_iterations_break_continue_2.sol | 22 ++ .../do_while_bmc_iterations_continue_1.sol | 19 ++ .../do_while_bmc_iterations_continue_2.sol | 25 ++ .../do_while_bmc_iterations_continue_3.sol | 24 ++ .../do_while_bmc_iterations_continue_4.sol | 25 ++ .../loops/do_while_bmc_iterations_nested.sol | 22 ++ .../do_while_bmc_iterations_nested_break.sol | 24 ++ ...o_while_bmc_iterations_nested_continue.sol | 24 ++ .../do_while_bmc_iterations_semantics_1.sol | 20 ++ .../do_while_bmc_iterations_semantics_2.sol | 20 ++ .../do_while_bmc_iterations_semantics_3.sol | 20 ++ ...do_while_bmc_iterations_shallow_unroll.sol | 19 ++ .../smtCheckerTests/loops/for_1_fail.sol | 19 -- .../loops/for_1_false_positive.sol | 2 +- .../loops/for_loop_bmc_iterations_1.sol | 15 ++ .../loops/for_loop_bmc_iterations_2.sol | 15 ++ .../loops/for_loop_bmc_iterations_3.sol | 16 ++ .../loops/for_loop_bmc_iterations_4.sol | 15 ++ .../loops/for_loop_bmc_iterations_5.sol | 14 + .../loops/for_loop_bmc_iterations_6.sol | 16 ++ .../loops/for_loop_bmc_iterations_7.sol | 23 ++ .../loops/for_loop_bmc_iterations_8.sol | 31 +++ ..._loop_bmc_iterations_assertion_fails_1.sol | 16 ++ ..._loop_bmc_iterations_assertion_fails_2.sol | 19 ++ ..._loop_bmc_iterations_assertion_fails_3.sol | 17 ++ .../loops/for_loop_bmc_iterations_break_1.sol | 19 ++ .../loops/for_loop_bmc_iterations_break_2.sol | 18 ++ .../loops/for_loop_bmc_iterations_break_3.sol | 18 ++ .../loops/for_loop_bmc_iterations_break_4.sol | 18 ++ .../loops/for_loop_bmc_iterations_break_5.sol | 23 ++ .../loops/for_loop_bmc_iterations_break_6.sol | 23 ++ .../loops/for_loop_bmc_iterations_break_7.sol | 17 ++ .../loops/for_loop_bmc_iterations_break_8.sol | 18 ++ .../loops/for_loop_bmc_iterations_break_9.sol | 17 ++ ...r_loop_bmc_iterations_break_continue_1.sol | 22 ++ ...r_loop_bmc_iterations_break_continue_2.sol | 23 ++ ...r_loop_bmc_iterations_break_continue_3.sol | 22 ++ .../for_loop_bmc_iterations_continue_1.sol | 18 ++ .../for_loop_bmc_iterations_continue_2.sol | 23 ++ .../for_loop_bmc_iterations_continue_3.sol | 24 ++ .../for_loop_bmc_iterations_continue_4.sol | 24 ++ .../for_loop_bmc_iterations_continue_5.sol | 17 ++ ...for_loop_bmc_iterations_false_positive.sol | 16 ++ .../loops/for_loop_bmc_iterations_nested.sol | 17 ++ .../for_loop_bmc_iterations_nested_break.sol | 22 ++ ...or_loop_bmc_iterations_nested_continue.sol | 20 ++ .../for_loop_bmc_iterations_semantics_1.sol | 19 ++ .../for_loop_bmc_iterations_semantics_2.sol | 19 ++ .../for_loop_bmc_iterations_semantics_3.sol | 19 ++ ...for_loop_bmc_iterations_shallow_unroll.sol | 17 ++ .../loops/for_loop_trivial_condition_1.sol | 1 - .../loops/for_loop_trivial_condition_2.sol | 1 - .../loops/for_loop_unreachable_1.sol | 13 - .../loops/while_bmc_iterations_1.sol | 18 ++ .../loops/while_bmc_iterations_2.sol | 19 ++ .../loops/while_bmc_iterations_3.sol | 17 ++ .../loops/while_bmc_iterations_4.sol | 15 ++ .../loops/while_bmc_iterations_5.sol | 15 ++ .../loops/while_bmc_iterations_7.sol | 22 ++ ...while_bmc_iterations_assertion_fails_1.sol | 17 ++ ...while_bmc_iterations_assertion_fails_2.sol | 18 ++ ...while_bmc_iterations_assertion_fails_3.sol | 17 ++ .../loops/while_bmc_iterations_break_1.sol | 16 ++ .../loops/while_bmc_iterations_break_2.sol | 17 ++ .../loops/while_bmc_iterations_break_3.sol | 19 ++ .../loops/while_bmc_iterations_break_4.sol | 19 ++ .../loops/while_bmc_iterations_break_5.sol | 19 ++ .../loops/while_bmc_iterations_break_6.sol | 23 ++ .../loops/while_bmc_iterations_break_7.sol | 23 ++ .../loops/while_bmc_iterations_break_8.sol | 19 ++ .../loops/while_bmc_iterations_break_9.sol | 18 ++ .../while_bmc_iterations_break_continue_1.sol | 21 ++ .../while_bmc_iterations_break_continue_2.sol | 22 ++ .../loops/while_bmc_iterations_continue_1.sol | 19 ++ .../loops/while_bmc_iterations_continue_2.sol | 24 ++ .../loops/while_bmc_iterations_nested.sol | 22 ++ .../while_bmc_iterations_nested_break.sol | 23 ++ .../while_bmc_iterations_nested_continue.sol | 23 ++ .../while_bmc_iterations_semantics_1.sol | 20 ++ .../while_bmc_iterations_semantics_2.sol | 21 ++ .../while_bmc_iterations_semantics_3.sol | 20 ++ .../while_bmc_iterations_shallow_unroll.sol | 17 ++ .../loops/while_break_direct.sol | 4 +- .../out_of_bounds/array_2d_4.sol | 2 +- .../try_catch/try_inside_while.sol | 1 - test/solc/CommandLineParser.cpp | 4 +- test/tools/fuzzer_common.cpp | 1 + 131 files changed, 2197 insertions(+), 143 deletions(-) create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations/args create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations/err create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations/input.sol create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/args create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/err create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/exit create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/input.sol create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/args create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/exit create mode 100644 test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/input.sol create mode 100644 test/cmdlineTests/standard_model_checker_bmc_loop_iterations/input.json create mode 100644 test/cmdlineTests/standard_model_checker_bmc_loop_iterations/output.json create mode 100644 test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/input.json create mode 100644 test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/output.json delete mode 100644 test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_for.sol delete mode 100644 test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_while.sol rename test/libsolidity/smtCheckerTests/loops/{do_while_1_false_positives.sol => do_while_1.sol} (100%) create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_6.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_7.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_8.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_break.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_continue.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_shallow_unroll.sol delete mode 100644 test/libsolidity/smtCheckerTests/loops/for_1_fail.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_6.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_7.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_8.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_6.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_7.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_8.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_9.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_false_positive.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_break.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_continue.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_shallow_unroll.sol delete mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_unreachable_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_7.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_4.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_5.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_6.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_7.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_8.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_9.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_break.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_continue.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_shallow_unroll.sol diff --git a/Changelog.md b/Changelog.md index 7624358eebac..62806a5e1d62 100644 --- a/Changelog.md +++ b/Changelog.md @@ -32,6 +32,7 @@ Compiler Features: * NatSpec: Include NatSpec from events that are emitted by a contract but defined outside of it in userdoc and devdoc output. * Optimizer: Re-implement simplified version of ``UnusedAssignEliminator`` and ``UnusedStoreEliminator``. It can correctly remove some unused assignments in deeply nested loops that were ignored by the old version. * Parser: Unary plus is no longer recognized as a unary operator in the AST and triggers an error at the parsing stage (rather than later during the analysis). + * SMTChecker: Add CLI option ``--model-checker-bmc-loop-iterations`` and a JSON option ``settings.modelChecker.bmcLoopIterations`` that specify how many loop iterations the BMC engine should unroll. Note that false negatives are possible when unrolling loops. This is due to the possibility that bmc loop iteration setting is less than actual number of iterations needed to complete a loop. * SMTChecker: Group all messages about unsupported language features in a single warning. The CLI option ``--model-checker-show-unsupported`` and the JSON option ``settings.modelChecker.showUnsupported`` can be enabled to show the full list. * SMTChecker: Properties that are proved safe are now reported explicitly at the end of analysis. By default, only the number of safe properties is shown. The CLI option ``--model-checker-show-proved-safe`` and the JSON option ``settings.modelChecker.showProvedSafe`` can be enabled to show the full list of safe properties. * Standard JSON Interface: Add experimental support for importing ASTs via Standard JSON. diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index b72e8451a3b3..be29000fed91 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -18,7 +18,6 @@ #include -#include #include #include @@ -26,6 +25,8 @@ #include #include +#include + #ifdef HAVE_Z3_DLOPEN #include #endif @@ -245,7 +246,7 @@ bool BMC::visit(IfStatement const& _node) // We ignore called functions here because they have // specific input values. - if (isRootFunction()) + if (isRootFunction() && !isInsideLoop()) addVerificationTarget( VerificationTargetType::ConstantCondition, expr(_node.condition()), @@ -280,7 +281,7 @@ bool BMC::visit(Conditional const& _op) m_context.pushSolver(); _op.condition().accept(*this); - if (isRootFunction()) + if (isRootFunction() && !isInsideLoop()) addVerificationTarget( VerificationTargetType::ConstantCondition, expr(_op.condition()), @@ -294,109 +295,172 @@ bool BMC::visit(Conditional const& _op) return false; } -// Here we consider the execution of two branches: -// Branch 1 assumes the loop condition to be true and executes the loop once, -// after resetting touched variables. -// Branch 2 assumes the loop condition to be false and skips the loop after -// visiting the condition (it might contain side-effects, they need to be considered) -// and does not erase knowledge. -// If the loop is a do-while, condition side-effects are lost since the body, -// executed once before the condition, might reassign variables. -// Variables touched by the loop are merged with Branch 2. +// Unrolls while or do-while loop bool BMC::visit(WhileStatement const& _node) { - auto indicesBeforeLoop = copyVariableIndices(); - m_context.resetVariables(touchedVariables(_node)); - decltype(indicesBeforeLoop) indicesAfterLoop; + unsigned int bmcLoopIterations = m_settings.bmcLoopIterations.value_or(1); + smtutil::Expression broke(false); + smtutil::Expression loopCondition(true); if (_node.isDoWhile()) { - indicesAfterLoop = visitBranch(&_node.body()).first; - // TODO the assertions generated in the body should still be active in the condition - _node.condition().accept(*this); - if (isRootFunction()) - addVerificationTarget( - VerificationTargetType::ConstantCondition, - expr(_node.condition()), - &_node.condition() - ); - } - else - { - _node.condition().accept(*this); - if (isRootFunction()) - addVerificationTarget( - VerificationTargetType::ConstantCondition, - expr(_node.condition()), - &_node.condition() + for (unsigned int i = 0; i < bmcLoopIterations; ++i) + { + m_loopCheckpoints.emplace(); + + auto indicesBefore = copyVariableIndices(); + _node.body().accept(*this); + + auto [continues, brokeInCurrentIteration] = mergeVariablesFromLoopCheckpoints(); + + auto indicesBreak = copyVariableIndices(); + _node.condition().accept(*this); + mergeVariables( + !brokeInCurrentIteration, + copyVariableIndices(), + indicesBreak ); - indicesAfterLoop = visitBranch(&_node.body(), expr(_node.condition())).first; + mergeVariables( + broke || !loopCondition, + indicesBefore, + copyVariableIndices() + ); + loopCondition = expr(_node.condition()); + broke = broke || brokeInCurrentIteration; + m_loopCheckpoints.pop(); + } } + else { + smtutil::Expression loopConditionOnPreviousIteration(true); + for (unsigned int i = 0; i < bmcLoopIterations; ++i) + { + m_loopCheckpoints.emplace(); + auto indicesBefore = copyVariableIndices(); + _node.condition().accept(*this); + loopCondition = expr(_node.condition()); - // We reset the execution to before the loop - // and visit the condition in case it's not a do-while. - // A do-while's body might have non-precise information - // in its first run about variables that are touched. - resetVariableIndices(indicesBeforeLoop); - if (!_node.isDoWhile()) - _node.condition().accept(*this); + auto indicesAfterCondition = copyVariableIndices(); - mergeVariables(expr(_node.condition()), indicesAfterLoop, copyVariableIndices()); + pushPathCondition(loopCondition); + _node.body().accept(*this); + popPathCondition(); + auto [continues, brokeInCurrentIteration] = mergeVariablesFromLoopCheckpoints(); + + // merges indices modified when accepting loop condition that no longer holds + mergeVariables( + !loopCondition, + indicesAfterCondition, + copyVariableIndices() + ); + + // handles breaks in previous iterations + // breaks in current iterations are handled when traversing loop checkpoints + // handles case when the loop condition no longer holds but bmc loop iterations still unrolls the loop + mergeVariables( + broke || !loopConditionOnPreviousIteration, + indicesBefore, + copyVariableIndices() + ); + m_loopCheckpoints.pop(); + broke = broke || brokeInCurrentIteration; + loopConditionOnPreviousIteration = loopCondition; + } + } + if (bmcLoopIterations > 0) + m_context.addAssertion(not(loopCondition) || broke); m_loopExecutionHappened = true; return false; } -// Here we consider the execution of two branches similar to WhileStatement. +// Unrolls for loop bool BMC::visit(ForStatement const& _node) { if (_node.initializationExpression()) _node.initializationExpression()->accept(*this); - auto indicesBeforeLoop = copyVariableIndices(); + smtutil::Expression broke(false); + smtutil::Expression forCondition(true); + smtutil::Expression forConditionOnPreviousIteration(true); + unsigned int bmcLoopIterations = m_settings.bmcLoopIterations.value_or(1); + for (unsigned int i = 0; i < bmcLoopIterations; ++i) + { + auto indicesBefore = copyVariableIndices(); + if (_node.condition()) + { + _node.condition()->accept(*this); + // values in loop condition might change during loop iteration + forCondition = expr(*_node.condition()); + } + m_loopCheckpoints.emplace(); + auto indicesAfterCondition = copyVariableIndices(); - // Do not reset the init expression part. - auto touchedVars = touchedVariables(_node.body()); - if (_node.condition()) - touchedVars += touchedVariables(*_node.condition()); - if (_node.loopExpression()) - touchedVars += touchedVariables(*_node.loopExpression()); + pushPathCondition(forCondition); + _node.body().accept(*this); - m_context.resetVariables(touchedVars); + auto [continues, brokeInCurrentIteration] = mergeVariablesFromLoopCheckpoints(); - if (_node.condition()) - { - _node.condition()->accept(*this); - if (isRootFunction()) - addVerificationTarget( - VerificationTargetType::ConstantCondition, - expr(*_node.condition()), - _node.condition() + // accept loop expression if there was no break + if (_node.loopExpression()) + { + auto indicesBreak = copyVariableIndices(); + _node.loopExpression()->accept(*this); + mergeVariables( + !brokeInCurrentIteration, + copyVariableIndices(), + indicesBreak ); - } - - m_context.pushSolver(); - if (_node.condition()) - m_context.addAssertion(expr(*_node.condition())); - _node.body().accept(*this); - if (_node.loopExpression()) - _node.loopExpression()->accept(*this); - m_context.popSolver(); - - auto indicesAfterLoop = copyVariableIndices(); - // We reset the execution to before the loop - // and visit the condition. - resetVariableIndices(indicesBeforeLoop); - if (_node.condition()) - _node.condition()->accept(*this); + } + popPathCondition(); - auto forCondition = _node.condition() ? expr(*_node.condition()) : smtutil::Expression(true); - mergeVariables(forCondition, indicesAfterLoop, copyVariableIndices()); + // merges indices modified when accepting loop condition that does no longer hold + mergeVariables( + !forCondition, + indicesAfterCondition, + copyVariableIndices() + ); + // handles breaks in previous iterations + // breaks in current iterations are handled when traversing loop checkpoints + // handles case when the loop condition no longer holds but bmc loop iterations still unrolls the loop + mergeVariables( + broke || !forConditionOnPreviousIteration, + indicesBefore, + copyVariableIndices() + ); + m_loopCheckpoints.pop(); + broke = broke || brokeInCurrentIteration; + forConditionOnPreviousIteration = forCondition; + } + if (bmcLoopIterations > 0) + m_context.addAssertion(not(forCondition) || broke); m_loopExecutionHappened = true; return false; } +std::tuple BMC::mergeVariablesFromLoopCheckpoints() +{ + smtutil::Expression continues(false); + smtutil::Expression brokeInCurrentIteration(false); + for (auto const& loopControl: m_loopCheckpoints.top()) + { + // use SSAs associated with this break statement only if + // loop didn't break or continue earlier in the iteration + // loop condition is included in break path conditions + mergeVariables( + !brokeInCurrentIteration && !continues && loopControl.pathConditions, + loopControl.variableIndices, + copyVariableIndices() + ); + if (loopControl.kind == LoopControlKind::Break) + brokeInCurrentIteration = + brokeInCurrentIteration || loopControl.pathConditions; + else if (loopControl.kind == LoopControlKind::Continue) + continues = continues || loopControl.pathConditions; + } + return std::pair(continues, brokeInCurrentIteration); +} + bool BMC::visit(TryStatement const& _tryStatement) { FunctionCall const* externalCall = dynamic_cast(&_tryStatement.externalCall()); @@ -428,6 +492,28 @@ bool BMC::visit(TryStatement const& _tryStatement) return false; } +bool BMC::visit(Break const&) +{ + LoopControl control = { + LoopControlKind::Break, + currentPathConditions(), + copyVariableIndices() + }; + m_loopCheckpoints.top().emplace_back(control); + return false; +} + +bool BMC::visit(Continue const&) +{ + LoopControl control = { + LoopControlKind::Continue, + currentPathConditions(), + copyVariableIndices() + }; + m_loopCheckpoints.top().emplace_back(control); + return false; +} + void BMC::endVisit(UnaryOperation const& _op) { SMTEncoder::endVisit(_op); @@ -535,7 +621,7 @@ void BMC::visitRequire(FunctionCall const& _funCall) auto const& args = _funCall.arguments(); solAssert(args.size() >= 1, ""); solAssert(args.front()->annotation().type->category() == Type::Category::Bool, ""); - if (isRootFunction()) + if (isRootFunction() && !isInsideLoop()) addVerificationTarget( VerificationTargetType::ConstantCondition, expr(*args.front()), @@ -960,7 +1046,7 @@ void BMC::checkCondition( vector expressionsToEvaluate; vector expressionNames; tie(expressionsToEvaluate, expressionNames) = _modelExpressions; - if (_callStack.size()) + if (!_callStack.empty()) if (_additionalValue) { expressionsToEvaluate.emplace_back(*_additionalValue); @@ -973,8 +1059,9 @@ void BMC::checkCondition( string extraComment = SMTEncoder::extraComment(); if (m_loopExecutionHappened) extraComment += - "\nNote that some information is erased after the execution of loops.\n" - "You can re-introduce information using require()."; + "False negatives are possible when unrolling loops.\n" + "This is due to the possibility that the BMC loop iteration setting is" + " smaller than the actual number of iterations needed to complete a loop."; if (m_externalFunctionCallHappened) extraComment += "\nNote that external function calls are not inlined," @@ -1145,3 +1232,7 @@ void BMC::assignment(smt::SymbolicVariable& _symVar, smtutil::Expression const& )); } +bool BMC::isInsideLoop() const +{ + return !m_loopCheckpoints.empty(); +} diff --git a/libsolidity/formal/BMC.h b/libsolidity/formal/BMC.h index 9a8242047ebc..3abaac1bd2d3 100644 --- a/libsolidity/formal/BMC.h +++ b/libsolidity/formal/BMC.h @@ -100,6 +100,8 @@ class BMC: public SMTEncoder void endVisit(FunctionCall const& _node) override; void endVisit(Return const& _node) override; bool visit(TryStatement const& _node) override; + bool visit(Break const& _node) override; + bool visit(Continue const& _node) override; //@} /// Visitor helpers. @@ -188,6 +190,9 @@ class BMC: public SMTEncoder smtutil::CheckResult checkSatisfiable(); //@} + std::tuple mergeVariablesFromLoopCheckpoints(); + bool isInsideLoop() const; + std::unique_ptr m_interface; /// Flags used for better warning messages. @@ -204,6 +209,21 @@ class BMC: public SMTEncoder /// Number of verification conditions that could not be proved. size_t m_unprovedAmt = 0; -}; + enum class LoopControlKind + { + Continue, + Break + }; + + // Current path conditions and SSA indices for break or continue statement + struct LoopControl { + LoopControlKind kind; + smtutil::Expression pathConditions; + VariableIndices variableIndices; + }; + + // Loop control statements for every loop + std::stack> m_loopCheckpoints; +}; } diff --git a/libsolidity/formal/ModelCheckerSettings.h b/libsolidity/formal/ModelCheckerSettings.h index fafb2cdaced7..d190116d96c2 100644 --- a/libsolidity/formal/ModelCheckerSettings.h +++ b/libsolidity/formal/ModelCheckerSettings.h @@ -157,6 +157,7 @@ struct ModelCheckerExtCalls struct ModelCheckerSettings { + std::optional bmcLoopIterations; ModelCheckerContracts contracts = ModelCheckerContracts::Default(); /// Currently division and modulo are replaced by multiplication with slack vars, such that /// a / b <=> a = b * k + m @@ -179,6 +180,7 @@ struct ModelCheckerSettings bool operator==(ModelCheckerSettings const& _other) const noexcept { return + bmcLoopIterations == _other.bmcLoopIterations && contracts == _other.contracts && divModNoSlacks == _other.divModNoSlacks && engine == _other.engine && diff --git a/libsolidity/formal/SMTEncoder.h b/libsolidity/formal/SMTEncoder.h index c16569686ae6..726f16ef6bc9 100644 --- a/libsolidity/formal/SMTEncoder.h +++ b/libsolidity/formal/SMTEncoder.h @@ -168,7 +168,9 @@ class SMTEncoder: public ASTConstVisitor void endVisit(IndexAccess const& _node) override; void endVisit(IndexRangeAccess const& _node) override; bool visit(InlineAssembly const& _node) override; + bool visit(Break const&) override { return false; } void endVisit(Break const&) override {} + bool visit(Continue const&) override { return false; } void endVisit(Continue const&) override {} bool visit(TryCatchClause const&) override { return true; } void endVisit(TryCatchClause const&) override {} diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index 972c04ba9763..f18c618e9c6f 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -430,7 +430,7 @@ std::optional checkSettingsKeys(Json::Value const& _input) std::optional checkModelCheckerSettingsKeys(Json::Value const& _input) { - static set keys{"contracts", "divModNoSlacks", "engine", "extCalls", "invariants", "showProvedSafe", "showUnproved", "showUnsupported", "solvers", "targets", "timeout"}; + static set keys{"bmcLoopIterations", "contracts", "divModNoSlacks", "engine", "extCalls", "invariants", "showProvedSafe", "showUnproved", "showUnsupported", "solvers", "targets", "timeout"}; return checkKeys(_input, keys, "modelChecker"); } @@ -1013,6 +1013,16 @@ std::variant StandardCompiler: ret.modelCheckerSettings.engine = *engine; } + if (modelCheckerSettings.isMember("bmcLoopIterations")) + { + if (!ret.modelCheckerSettings.engine.bmc) + return formatFatalError(Error::Type::JSONError, "settings.modelChecker.bmcLoopIterations requires the BMC engine to be enabled."); + if (modelCheckerSettings["bmcLoopIterations"].isUInt()) + ret.modelCheckerSettings.bmcLoopIterations = modelCheckerSettings["bmcLoopIterations"].asUInt(); + else + return formatFatalError(Error::Type::JSONError, "settings.modelChecker.bmcLoopIterations must be an unsigned integer."); + } + if (modelCheckerSettings.isMember("extCalls")) { if (!modelCheckerSettings["extCalls"].isString()) diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index da818411ec84..aab6b67104d3 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -76,6 +76,7 @@ static string const g_strModelCheckerShowUnsupported = "model-checker-show-unsup static string const g_strModelCheckerSolvers = "model-checker-solvers"; static string const g_strModelCheckerTargets = "model-checker-targets"; static string const g_strModelCheckerTimeout = "model-checker-timeout"; +static string const g_strModelCheckerBMCLoopIterations = "model-checker-bmc-loop-iterations"; static string const g_strNone = "none"; static string const g_strNoOptimizeYul = "no-optimize-yul"; static string const g_strOptimize = "optimize"; @@ -861,17 +862,23 @@ General Information)").c_str(), ( g_strModelCheckerTargets.c_str(), po::value()->value_name("default,all,constantCondition,underflow,overflow,divByZero,balance,assert,popEmptyArray,outOfBounds")->default_value("default"), - "Select model checker verification targets. " + "Select model checker verification targets." "Multiple targets can be selected at the same time, separated by a comma and no spaces." " By default all targets except underflow and overflow are selected." ) ( g_strModelCheckerTimeout.c_str(), po::value()->value_name("ms"), - "Set model checker timeout per query in milliseconds. " - "The default is a deterministic resource limit. " + "Set model checker timeout per query in milliseconds." + "The default is a deterministic resource limit." "A timeout of 0 means no resource/time restrictions for any query." ) + ( + g_strModelCheckerBMCLoopIterations.c_str(), + po::value(), + "Set loop unrolling depth for BMC engine." + "Default is 1." + ) ; desc.add(smtCheckerOptions); @@ -965,6 +972,7 @@ void CommandLineParser::processArgs() {g_strModelCheckerInvariants, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerSolvers, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerTimeout, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strModelCheckerBMCLoopIterations, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerContracts, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerTargets, {InputMode::Compiler, InputMode::CompilerWithASTImport}} }; @@ -1337,6 +1345,13 @@ void CommandLineParser::processArgs() if (m_args.count(g_strModelCheckerTimeout)) m_options.modelChecker.settings.timeout = m_args[g_strModelCheckerTimeout].as(); + if (m_args.count(g_strModelCheckerBMCLoopIterations)) + { + if (!m_options.modelChecker.settings.engine.bmc) + solThrow(CommandLineValidationError, "BMC loop unrolling requires the BMC engine to be enabled"); + m_options.modelChecker.settings.bmcLoopIterations = m_args[g_strModelCheckerBMCLoopIterations].as(); + } + m_options.metadata.literalSources = (m_args.count(g_strMetadataLiteral) > 0); m_options.modelChecker.initialize = m_args.count(g_strModelCheckerContracts) || diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations/args b/test/cmdlineTests/model_checker_bmc_loop_iterations/args new file mode 100644 index 000000000000..3761421e91b8 --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations/args @@ -0,0 +1 @@ +--model-checker-engine bmc --model-checker-bmc-loop-iterations 3 \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations/err b/test/cmdlineTests/model_checker_bmc_loop_iterations/err new file mode 100644 index 000000000000..cbb2b0f9daca --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations/err @@ -0,0 +1,11 @@ +Warning: BMC: Assertion violation happens here. + --> model_checker_bmc_loop_iterations/input.sol:10:3: + | +10 | assert(x == 3); + | ^^^^^^^^^^^^^^ +Note: Counterexample: + x = 2 + +Note: Callstack: +Note: False negatives are possible when unrolling loops. +This is due to the possibility that the BMC loop iteration setting is smaller than the actual number of iterations needed to complete a loop. diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations/input.sol b/test/cmdlineTests/model_checker_bmc_loop_iterations/input.sol new file mode 100644 index 000000000000..3722e46cfcef --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations/input.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f(uint x) public pure { + require(x == 0); + do { + ++x; + } while (x < 2); + assert(x == 3); + } +} \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/args b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/args new file mode 100644 index 000000000000..32b6eb05b088 --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/args @@ -0,0 +1 @@ +--model-checker-engine bmc --model-checker-bmc-loop-iterations bmc \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/err b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/err new file mode 100644 index 000000000000..0f0fbaf8b284 --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/err @@ -0,0 +1 @@ +the argument ('bmc') for option '--model-checker-bmc-loop-iterations' is invalid \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/exit b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/exit new file mode 100644 index 000000000000..56a6051ca2b0 --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/exit @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/input.sol b/test/cmdlineTests/model_checker_bmc_loop_iterations_invalid_arg/input.sol new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/args b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/args new file mode 100644 index 000000000000..aad7e026c645 --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/args @@ -0,0 +1 @@ +--model-checker-engine bmc --model-checker-bmc-loop-iterations \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err new file mode 100644 index 000000000000..9b59a4eb870e --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err @@ -0,0 +1 @@ +the argument ('model_checker_bmc_loop_iterations_no_argument/input.sol') for option '--model-checker-bmc-loop-iterations' is invalid diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/exit b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/exit new file mode 100644 index 000000000000..56a6051ca2b0 --- /dev/null +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/exit @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/input.sol b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/input.sol new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/test/cmdlineTests/standard_model_checker_bmc_loop_iterations/input.json b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations/input.json new file mode 100644 index 000000000000..e7d2d09bb5ae --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations/input.json @@ -0,0 +1,29 @@ +{ + "language": "Solidity", + "sources": + { + "Source": + { + "content": "// SPDX-License-Identifier: GPL-3.0 + pragma solidity >=0.0; + contract C + { + function f(uint x) public pure { + require(x == 0); + do { + ++x; + } while (x < 2); + assert(x == 2); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "bmc", + "bmcLoopIterations": 3 + } + } +} \ No newline at end of file diff --git a/test/cmdlineTests/standard_model_checker_bmc_loop_iterations/output.json b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations/output.json new file mode 100644 index 000000000000..139b0825bc47 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations/output.json @@ -0,0 +1,22 @@ +{ + "errors": + [ + { + "component": "general", + "errorCode": "6002", + "formattedMessage": "Info: BMC: 1 verification condition(s) proved safe! Enable the model checker option \"show proved safe\" to see all of them. + +", + "message": "BMC: 1 verification condition(s) proved safe! Enable the model checker option \"show proved safe\" to see all of them.", + "severity": "info", + "type": "Info" + } + ], + "sources": + { + "Source": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/input.json b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/input.json new file mode 100644 index 000000000000..8c5fa65cd906 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/input.json @@ -0,0 +1,29 @@ +{ + "language": "Solidity", + "sources": + { + "Source": + { + "content": "// SPDX-License-Identifier: GPL-3.0 + pragma solidity >=0.0; + contract C + { + function f(uint x) public pure { + require(x == 0); + do { + ++x; + } while (x < 2); + assert(x == 2); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "bmc", + "bmcLoopIterations": "bmc" + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/output.json b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/output.json new file mode 100644 index 000000000000..971973d85c0c --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_bmc_loop_iterations_invalid_arg/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "settings.modelChecker.bmcLoopIterations must be an unsigned integer.", + "message": "settings.modelChecker.bmcLoopIterations must be an unsigned integer.", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/libsolidity/SMTCheckerTest.cpp b/test/libsolidity/SMTCheckerTest.cpp index 9495895278ab..288527e04899 100644 --- a/test/libsolidity/SMTCheckerTest.cpp +++ b/test/libsolidity/SMTCheckerTest.cpp @@ -122,6 +122,9 @@ SMTCheckerTest::SMTCheckerTest(string const& _filename): SyntaxTest(_filename, E m_shouldRun = false; #endif } + + auto const& bmcLoopIterations = m_reader.sizetSetting("BMCLoopIterations", 1); + m_modelCheckerSettings.bmcLoopIterations = std::optional{bmcLoopIterations}; } TestCase::TestResult SMTCheckerTest::run(ostream& _stream, string const& _linePrefix, bool _formatted) diff --git a/test/libsolidity/SMTCheckerTest.h b/test/libsolidity/SMTCheckerTest.h index 54d23c74fbcc..965705f30c77 100644 --- a/test/libsolidity/SMTCheckerTest.h +++ b/test/libsolidity/SMTCheckerTest.h @@ -55,6 +55,8 @@ class SMTCheckerTest: public SyntaxTest Set in m_modelCheckerSettings. SMTSolvers: `all`, `cvc4`, `z3`, `none`, where the default is `all`. Set in m_modelCheckerSettings. + BMCLoopIterations: number of loop iterations for BMC engine, the default is 1. + Set in m_modelCheckerSettings. */ ModelCheckerSettings m_modelCheckerSettings; diff --git a/test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_for.sol b/test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_for.sol deleted file mode 100644 index 681d42aefcb5..000000000000 --- a/test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_for.sol +++ /dev/null @@ -1,8 +0,0 @@ -contract C -{ - function f(bool x) public pure { require(x); for (;x;) {} } -} -// ==== -// SMTEngine: all -// ---- -// Warning 6838: (65-66): BMC: Condition is always true. diff --git a/test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_while.sol b/test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_while.sol deleted file mode 100644 index 91bfd981c119..000000000000 --- a/test/libsolidity/smtCheckerTests/functions/functions_trivial_condition_while.sol +++ /dev/null @@ -1,8 +0,0 @@ -contract C -{ - function f(bool x) public pure { require(x); while (x) {} } -} -// ==== -// SMTEngine: all -// ---- -// Warning 6838: (66-67): BMC: Condition is always true. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_1_false_positives.sol b/test/libsolidity/smtCheckerTests/loops/do_while_1.sol similarity index 100% rename from test/libsolidity/smtCheckerTests/loops/do_while_1_false_positives.sol rename to test/libsolidity/smtCheckerTests/loops/do_while_1.sol diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_1.sol new file mode 100644 index 000000000000..bff046b06332 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_1.sol @@ -0,0 +1,16 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + do { + ++x; + } while (x < 2); + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_2.sol new file mode 100644 index 000000000000..92cbc1bea18f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_2.sol @@ -0,0 +1,20 @@ +contract C +{ + function f() public pure { + uint x; + do { + ++x; + { + ++x; + ++x; + } + } while (x < 3); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_3.sol new file mode 100644 index 000000000000..d4a37786c236 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_3.sol @@ -0,0 +1,18 @@ +contract C +{ + function f() public pure { + uint x; + do { + if (x >= 2) + ++x; + ++x; + } while (x < 3); + assert(x == 4); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_4.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_4.sol new file mode 100644 index 000000000000..cce896b70c7f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_4.sol @@ -0,0 +1,15 @@ +contract C { + function f() public pure { + uint x; + do { + ++x; + } while (true); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_5.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_5.sol new file mode 100644 index 000000000000..6f25a4f5c124 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_5.sol @@ -0,0 +1,22 @@ +contract C { + uint x; + + function condition() private returns(bool) { + ++x; + return x < 3; + } + + function f() public { + require(x == 0); + do { + } while (condition()); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (77-80): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_1.sol new file mode 100644 index 000000000000..54ede91c2df6 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_1.sol @@ -0,0 +1,17 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + do { + ++x; + } while (x < 2); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 4661: (102-116): BMC: Assertion violation happens here. +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_2.sol new file mode 100644 index 000000000000..8c742b749d0c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_2.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + do { + ++x; + break; + } while (x < 3); + assert(x == 0); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 2 +// ---- +// Warning 5740: (87-92): Unreachable code. +// Warning 4661: (97-111): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_3.sol new file mode 100644 index 000000000000..0742c5cdc211 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_assertion_fails_3.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + do { + ++x; + continue; + } while (x < 2); + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 2 +// ---- +// Warning 4661: (100-114): BMC: Assertion violation happens here. +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_1.sol new file mode 100644 index 000000000000..e7bb9d145ce2 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_1.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + do { + ++x; + break; + } while (x < 3); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Warning 5740: (87-92): Unreachable code. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_2.sol new file mode 100644 index 000000000000..9dec60544d1e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_2.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x = 0; + do { + if (x > 0) + break; + ++x; + } while (x < 3); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_3.sol new file mode 100644 index 000000000000..0f1c7d033024 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_3.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + do { + if (x >= 0) { + ++x; + break; + } + ++x; + } while (x < 3); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_4.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_4.sol new file mode 100644 index 000000000000..c2c046809ff4 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_4.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + do { + if (x > 0) { + ++x; + break; + } + ++x; + } while (x < 3); + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_5.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_5.sol new file mode 100644 index 000000000000..4379d4f61362 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_5.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + do { + ++x; + if (x > 1) { + ++x; + break; + } + } while (x < 3); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_6.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_6.sol new file mode 100644 index 000000000000..d0a917fa915c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_6.sol @@ -0,0 +1,23 @@ +contract C { + function f() public pure { + uint x; + do { + ++x; + if (x > 0) { + x = 2; + break; + } + if (x > 1) { + x = 3; + break; + } + } while (x < 3); + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_7.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_7.sol new file mode 100644 index 000000000000..52c3270ba7ea --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_7.sol @@ -0,0 +1,23 @@ +contract C { + function f() public pure { + uint x; + do { + ++x; + if (x > 1) { + x = 3; + break; + } + if (x > 0) { + x = 2; + break; + } + } while (x < 3); + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_8.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_8.sol new file mode 100644 index 000000000000..c25f982126df --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_8.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + do { + break; + } while (++x < 2); + // loop condition is not executed after break + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 5740: (79-86): Unreachable code. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_1.sol new file mode 100644 index 000000000000..53ce958fab1a --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_1.sol @@ -0,0 +1,21 @@ +contract C { + function f() public pure { + uint x; + do { + if (x > 1) { + break; + } + if (x >= 0) { + x = 10; + continue; + } + } while (x < 3); + assert(x == 10); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_2.sol new file mode 100644 index 000000000000..12d6fff6f5a8 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_break_continue_2.sol @@ -0,0 +1,22 @@ +contract C { + function f() public pure { + uint x; + do { + if (x > 1) { + x = 3; + break; + } + if (x >= 0) { + x = 2; + continue; + } + } while (x < 4); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_1.sol new file mode 100644 index 000000000000..aa69cb90cc4a --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_1.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + do { + ++x; + if (x == 3) { + continue; + } + ++x; + } while (x < 3); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_2.sol new file mode 100644 index 000000000000..83826575de5e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_2.sol @@ -0,0 +1,25 @@ +contract C { + function f() public pure { + uint x = 0; + uint y = 0; + do { + ++x; + if (x == 2) { + ++x; + y = 1; + continue; + } + if (x == 3) { + y = 2; + continue; + } + } while (x < 3); + assert(y == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_3.sol new file mode 100644 index 000000000000..1afe9034e0d7 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_3.sol @@ -0,0 +1,24 @@ +contract C { + function f() public pure { + uint x = 0; + uint y = 0; + do { + ++x; + if (x > 0) { + y = 1; + continue; + } + if (x > 0) { + y = 2; + continue; + } + } while (x < 3); + assert(y == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_4.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_4.sol new file mode 100644 index 000000000000..69ad6529c62f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_continue_4.sol @@ -0,0 +1,25 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + uint i; + do { + ++i; + if (i == 2) { + x = 2; + continue; + } + if (i == 1) { + x = 1; + continue; + } + } while (i < 3); + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested.sol new file mode 100644 index 000000000000..62d1b793df5c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested.sol @@ -0,0 +1,22 @@ +contract C +{ + function f(uint z) public pure { + uint x = 0; + require(z == 0); + do { + uint y = 0; + do { + ++z; + ++y; + } while (y < 2); + ++x; + } while (x < 2); + assert(z == 4); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_break.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_break.sol new file mode 100644 index 000000000000..267e18ec64d8 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_break.sol @@ -0,0 +1,24 @@ +contract C +{ + function f(uint z) public pure { + uint x = 0; + require(z == 0); + do { + uint y = 0; + do { + if (y > 0) + break; + ++z; + ++y; + } while (y < 2); + ++x; + } while (x < 2); + assert(z == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_continue.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_continue.sol new file mode 100644 index 000000000000..42ef9bccc5a0 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_nested_continue.sol @@ -0,0 +1,24 @@ +contract C +{ + function f(uint z) public pure { + uint x = 0; + require(z == 0); + do { + uint y = 0; + do { + ++y; + if (y > 0) + continue; + ++z; + } while (y < 2); + ++x; + } while (x < 2); + assert(z == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol new file mode 100644 index 000000000000..6656817809b5 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_1.sol @@ -0,0 +1,20 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + do { + if (x >= 3) + y = 1; + ++x; + } while (x < 3 || y == 1); + // BMC loop iteration setting is not enough to leave the loop + assert(x == 0); // should hold - no assumptions on value if didn't complete loop + assert(y == 0); // should hold - no assumptions on value if didn't complete loop + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol new file mode 100644 index 000000000000..b98bba18a0cb --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_2.sol @@ -0,0 +1,20 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + do { + if (x >= 3) + y = 1; + ++x; + } while (x < 3 || y == 1); + // BMC loop iteration setting is just enough to leave the loop + assert(x == 3); // should hold + assert(y == 1); // should hold + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol new file mode 100644 index 000000000000..2a5866e162cf --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_semantics_3.sol @@ -0,0 +1,20 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + do { + if (x >= 3) + y = 1; + ++x; + } while (x < 3 || y == 1); + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); // should hold + assert(y == 1); // should hold + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_shallow_unroll.sol b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_shallow_unroll.sol new file mode 100644 index 000000000000..449d41c67cb9 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/do_while_bmc_iterations_shallow_unroll.sol @@ -0,0 +1,19 @@ +contract C { + function f(uint x) public pure { + require(x == 0); + uint y; + do { + ++y; + if (y == 2) + x = 3; + } while (y < 3); + // nothing is reported because loop condition is true after unrolling the loop one time + assert(x == 4); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_1_fail.sol b/test/libsolidity/smtCheckerTests/loops/for_1_fail.sol deleted file mode 100644 index 7d179aa101d9..000000000000 --- a/test/libsolidity/smtCheckerTests/loops/for_1_fail.sol +++ /dev/null @@ -1,19 +0,0 @@ -contract C -{ - function f(uint x) public pure { - require(x < 100); - for(uint i = 0; i < 10; ++i) { - // Overflows due to resetting x. - x = x + 1; - } - assert(x < 14); - } -} -// ==== -// SMTEngine: all -// SMTSolvers: z3 -// ---- -// Warning 4984: (143-148): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here. -// Warning 6328: (156-170): CHC: Assertion violation happens here. -// Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -// Warning 2661: (143-148): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. diff --git a/test/libsolidity/smtCheckerTests/loops/for_1_false_positive.sol b/test/libsolidity/smtCheckerTests/loops/for_1_false_positive.sol index 46694d785a62..0b4ac7e68824 100644 --- a/test/libsolidity/smtCheckerTests/loops/for_1_false_positive.sol +++ b/test/libsolidity/smtCheckerTests/loops/for_1_false_positive.sol @@ -14,4 +14,4 @@ contract C // ---- // Warning 4984: (106-111): CHC: Overflow (resulting value larger than 2**256 - 1) might happen here. // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -// Warning 2661: (106-111): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_1.sol new file mode 100644 index 000000000000..a352b6e38fab --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_1.sol @@ -0,0 +1,15 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) + ++x; + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_2.sol new file mode 100644 index 000000000000..d460ea770c49 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_2.sol @@ -0,0 +1,15 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) + x = i; + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_3.sol new file mode 100644 index 000000000000..63b43466895e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_3.sol @@ -0,0 +1,16 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) + if (i > 1) + x = 10; + assert(x == 10); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_4.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_4.sol new file mode 100644 index 000000000000..e3fea509a579 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_4.sol @@ -0,0 +1,15 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 0; ++i) + ++x; + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_5.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_5.sol new file mode 100644 index 000000000000..38437fce2496 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_5.sol @@ -0,0 +1,14 @@ +contract C +{ + function f() public pure { + uint x; + for (; x < 0; ++x) {} + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_6.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_6.sol new file mode 100644 index 000000000000..cdbc41485164 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_6.sol @@ -0,0 +1,16 @@ +contract C +{ + function f() public pure { + uint x = 0; + for (uint i = 1; i < 3;) { + x = i; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_7.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_7.sol new file mode 100644 index 000000000000..834529b32a5c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_7.sol @@ -0,0 +1,23 @@ +contract C +{ + uint x; + + function condition() private returns(bool) { + ++x; + return x < 3; + } + + function f() public { + require(x == 0); + for (; condition();) { + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (71-74): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_8.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_8.sol new file mode 100644 index 000000000000..421c965e1c57 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_8.sol @@ -0,0 +1,31 @@ +contract C +{ + uint x; + uint y; + + function condition() private returns(bool) { + ++x; + return x < 3; + } + + function expression() private { + ++y; + } + + function f() public { + require(x == 0); + require(y == 0); + for (; condition(); expression()) { + } + assert(x == 3); + assert(y == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (80-83): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Warning 2661: (140-143): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_1.sol new file mode 100644 index 000000000000..67290785b060 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_1.sol @@ -0,0 +1,16 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) + ++x; + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 4661: (92-106): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_2.sol new file mode 100644 index 000000000000..cd1ae918f591 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_2.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) { + ++x; + break; + } + assert(x == 0); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 5740: (77-80): Unreachable code. +// Warning 4661: (108-122): BMC: Assertion violation happens here. +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_3.sol new file mode 100644 index 000000000000..8e1cb97bc8a1 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_assertion_fails_3.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) { + ++x; + continue; + } + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 4661: (111-125): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_1.sol new file mode 100644 index 000000000000..26958bf1d254 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_1.sol @@ -0,0 +1,19 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + break; + ++x; + } + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Warning 5740: (77-80): Unreachable code. +// Warning 5740: (97-100): Unreachable code. +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_2.sol new file mode 100644 index 000000000000..cada2d85195e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_2.sol @@ -0,0 +1,18 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + ++x; + break; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Warning 5740: (77-80): Unreachable code. +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_3.sol new file mode 100644 index 000000000000..eb947d555feb --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_3.sol @@ -0,0 +1,18 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + if (i > 0) + break; + ++x; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_4.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_4.sol new file mode 100644 index 000000000000..3d4855abfab1 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_4.sol @@ -0,0 +1,18 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + ++x; + if (i > 0) + break; + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_5.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_5.sol new file mode 100644 index 000000000000..f21255502a75 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_5.sol @@ -0,0 +1,23 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + if (i > 1) { + x = 1; + break; + } + if (i > 1) { + x = 2; + break; + } + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_6.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_6.sol new file mode 100644 index 000000000000..401491e9049b --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_6.sol @@ -0,0 +1,23 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + if (i > 1) { + x = 1; + break; + } + if (i >= 1) { + x = 2; + break; + } + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_7.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_7.sol new file mode 100644 index 000000000000..4bb4ffdf0408 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_7.sol @@ -0,0 +1,17 @@ +contract C +{ + function f() public pure { + uint x; + for (;;) { + ++x; + break; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_8.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_8.sol new file mode 100644 index 000000000000..a88a031e75e1 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_8.sol @@ -0,0 +1,18 @@ +contract C +{ + function f() public pure { + uint x; + for (;;) { + break; + ++x; + } + assert(x == 0); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Warning 5740: (78-81): Unreachable code. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_9.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_9.sol new file mode 100644 index 000000000000..4ce3d9268e89 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_9.sol @@ -0,0 +1,17 @@ +contract C +{ + function f() public pure { + uint x; + for (;x < 2;) { + ++x; + break; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_1.sol new file mode 100644 index 000000000000..b999f9cf6176 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_1.sol @@ -0,0 +1,22 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + if (i > 1) { + break; + } + if (i >= 0) { + x = 10; + continue; + } + } + assert(x == 10); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_2.sol new file mode 100644 index 000000000000..0da0f5d9940f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_2.sol @@ -0,0 +1,23 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) { + if (i > 0) { + x = 1; + break; + } + if (i >= 0) { + x = 2; + continue; + } + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 2 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_3.sol new file mode 100644 index 000000000000..9f762bb43674 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_break_continue_3.sol @@ -0,0 +1,22 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 3; ++i) { + if (i > 0) { + x = 1; + break; + } else { + x = 2; + continue; + } + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_1.sol new file mode 100644 index 000000000000..44983ecddc11 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_1.sol @@ -0,0 +1,18 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + for (uint i = 0; i < 3; ++i) { + if (i > 1) + continue; + ++x; + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_2.sol new file mode 100644 index 000000000000..2c7fc1236755 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_2.sol @@ -0,0 +1,23 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) { + if (i == 1) { + x = 1; + continue; + } + if (i == 0) { + x = 2; + continue; + } + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_3.sol new file mode 100644 index 000000000000..b74709e484fd --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_3.sol @@ -0,0 +1,24 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + for (uint i = 0; i < 3; ++i) { + if (x > 1) { + x = 10; + continue; + } + if (x > 0) { + x = 11; + continue; + } + ++x; + } + assert(x == 10); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_4.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_4.sol new file mode 100644 index 000000000000..246aa74c9710 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_4.sol @@ -0,0 +1,24 @@ +contract C +{ + function f() public pure { + uint x; + for (; x < 2; ++x) { + if (x > 1) { + x = 10; + continue; + } + if (x > 0) { + x = 11; + continue; + } + } + // x > 0 branch triggers x = 11 and continue triggers ++x loop expression + assert(x == 12); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_5.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_5.sol new file mode 100644 index 000000000000..270d8d4df8a1 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_continue_5.sol @@ -0,0 +1,17 @@ +contract C +{ + function f() public pure { + uint x; + for (; x < 2; ++x) { + continue; + } + // loop expression is executed after continue + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_false_positive.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_false_positive.sol new file mode 100644 index 000000000000..20071a64aaba --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_false_positive.sol @@ -0,0 +1,16 @@ +contract C +{ + function f() public pure { + uint x = 0; + for (;;) { + x = 1; + } + assert(x == 1000); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested.sol new file mode 100644 index 000000000000..d63e2ca5c697 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested.sol @@ -0,0 +1,17 @@ +contract C +{ + function f() public pure { + uint x; + for (uint i = 0; i < 2; ++i) { + for (uint j = 0; j < 2; ++j) + ++x; + } + assert(x == 4); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_break.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_break.sol new file mode 100644 index 000000000000..c302decafec8 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_break.sol @@ -0,0 +1,22 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + for (uint i = 0; i < 2; ++i) { + for (uint j = 0; j < 2; ++j) { + x = x + 1; + break; + } + break; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 5740: (92-95): Unreachable code. +// Warning 5740: (126-129): Unreachable code. +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_continue.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_continue.sol new file mode 100644 index 000000000000..8c07d096a772 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_nested_continue.sol @@ -0,0 +1,20 @@ +contract C +{ + function f() public pure { + uint x = 0; + for (uint i = 0; i < 2; ++i) { + for (uint j = 0; j < 2; ++j) { + if (i > 0) + continue; + ++x; + } + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol new file mode 100644 index 000000000000..915c0e6908ee --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_1.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + for (; x < 3 || y == 1; ++x) { + if (x >= 3) + y = 1; + } + // BMC loop iteration setting is not enough to leave the loop + assert(x == 0); // should hold - no assumptions on value if didn't complete loop + assert(y == 0); // should hold - no assumptions on value if didn't complete loop + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol new file mode 100644 index 000000000000..337515c9a03c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_2.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + for (; x < 3 || y == 1; ++x) { + if (x >= 3) + y = 1; + } + // BMC loop iteration setting is just enough to leave the loop + assert(x == 3); // should hold - no assumptions on value if didn't complete loop + assert(y == 0); // should hold - no assumptions on value if didn't complete loop + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol new file mode 100644 index 000000000000..5ff9d17782a8 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_semantics_3.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + for (; x < 3 || y == 1; ++x) { + if (x >= 3) + y = 1; + } + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); // should hold - no assumptions on value if didn't complete loop + assert(y == 0); // should hold - no assumptions on value if didn't complete loop + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_shallow_unroll.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_shallow_unroll.sol new file mode 100644 index 000000000000..8bfecdfa59ce --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_bmc_iterations_shallow_unroll.sol @@ -0,0 +1,17 @@ +contract C +{ + function f() public pure { + uint x = 0; + for (uint i = 0; i < 2; ++i) { + ++x; + } + // nothing is reported because loop condition is still true after BMCLoopIterations + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_1.sol index d667a55c854d..36af4f9b4155 100644 --- a/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_1.sol +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_1.sol @@ -10,4 +10,3 @@ contract C { // SMTSolvers: z3 // ---- // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -// Warning 6838: (90-96): BMC: Condition is always true. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_2.sol index 65caca9826b3..0847066a0536 100644 --- a/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_2.sol +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_trivial_condition_2.sol @@ -13,4 +13,3 @@ contract C { // SMTSolvers: z3 // ---- // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -// Warning 6838: (106-112): BMC: Condition is always true. diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_unreachable_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_unreachable_1.sol deleted file mode 100644 index 4fdaa6bcf059..000000000000 --- a/test/libsolidity/smtCheckerTests/loops/for_loop_unreachable_1.sol +++ /dev/null @@ -1,13 +0,0 @@ -contract C { - function f(uint x) public pure { - require(x == 2); - for (; x > 2;) {} - assert(x == 2); - } -} -// ==== -// SMTEngine: all -// SMTSolvers: z3 -// ---- -// Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -// Warning 6838: (90-95): BMC: Condition is always false. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_1.sol new file mode 100644 index 000000000000..11a4e7587b08 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_1.sol @@ -0,0 +1,18 @@ +contract C { + function f(uint x) public pure { + require(x == 0); + uint y; + while (y < 3) { + ++y; + if (y == 2) + x = 3; + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 2 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_2.sol new file mode 100644 index 000000000000..075e342eae58 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_2.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + ++x; + { + ++x; + ++x; + } + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_3.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_3.sol new file mode 100644 index 000000000000..2596af24f79a --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_3.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + if (x >= 2) + ++x; + ++x; + } + assert(x == 4); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_4.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_4.sol new file mode 100644 index 000000000000..8bfbe32d1a15 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_4.sol @@ -0,0 +1,15 @@ +contract C { + function f(uint x) public pure { + x = 0; + while (x < 1) { + ++x; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_5.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_5.sol new file mode 100644 index 000000000000..f3166cee8633 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_5.sol @@ -0,0 +1,15 @@ +contract C { + function f() public pure { + uint x; + while (true) { + ++x; + } + assert(x == 1000); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_7.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_7.sol new file mode 100644 index 000000000000..3f6a5b4bfa34 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_7.sol @@ -0,0 +1,22 @@ +contract C { + uint x; + + function condition() private returns(bool) { + ++x; + return x < 3; + } + + function f() public { + require(x == 0); + while (condition()) { + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Warning 2661: (77-80): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_1.sol new file mode 100644 index 000000000000..a43c7489e78f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_1.sol @@ -0,0 +1,17 @@ +contract C +{ + function f(uint x) public pure { + require(x == 0); + while (x < 2) { + ++x; + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 4661: (98-112): BMC: Assertion violation happens here. +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_2.sol new file mode 100644 index 000000000000..c16f755b663a --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_2.sol @@ -0,0 +1,18 @@ +contract C { + function f() public pure { + uint x; + while (x < 2) { + ++x; + break; + } + assert(x == 0); + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 2 +// ---- +// Warning 4661: (93-107): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_3.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_3.sol new file mode 100644 index 000000000000..acaf4f9a3ec5 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_assertion_fails_3.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + while (x < 2) { + ++x; + continue; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Warning 4661: (96-110): BMC: Assertion violation happens here. +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_1.sol new file mode 100644 index 000000000000..c8b45bac04fd --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_1.sol @@ -0,0 +1,16 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + ++x; + break; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_2.sol new file mode 100644 index 000000000000..c4a8c2f39bc3 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_2.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + if (x > 0) + break; + ++x; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_3.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_3.sol new file mode 100644 index 000000000000..c089b906bc86 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_3.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + if (x > 0) { + ++x; + break; + } + ++x; + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_4.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_4.sol new file mode 100644 index 000000000000..d1939871bf39 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_4.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + ++x; + if (x > 0) { + ++x; + break; + } + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_5.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_5.sol new file mode 100644 index 000000000000..f7ba610a69d2 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_5.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + ++x; + if (x > 1) { + ++x; + break; + } + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_6.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_6.sol new file mode 100644 index 000000000000..0546e48c0ddb --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_6.sol @@ -0,0 +1,23 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + ++x; + if (x > 0) { + x = 2; + break; + } + if (x > 1) { + x = 3; + break; + } + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_7.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_7.sol new file mode 100644 index 000000000000..8e4d3b6261d0 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_7.sol @@ -0,0 +1,23 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + ++x; + if (x > 1) { + x = 3; + break; + } + if (x > 0) { + x = 2; + break; + } + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_8.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_8.sol new file mode 100644 index 000000000000..be6b04bb2728 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_8.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x = 0; + while (x < 3) { + if (x >= 0) { + ++x; + break; + } + ++x; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_9.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_9.sol new file mode 100644 index 000000000000..caaa4f570ac5 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_9.sol @@ -0,0 +1,18 @@ +contract C { + function f() public pure { + uint x = 0; + while (x < 3) { + ++x; + break; + ++x; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Warning 5740: (94-97): Unreachable code. +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_1.sol new file mode 100644 index 000000000000..bb9554523453 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_1.sol @@ -0,0 +1,21 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + if (x > 1) { + break; + } + if (x >= 0) { + x = 10; + continue; + } + } + assert(x == 10); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_2.sol new file mode 100644 index 000000000000..b65404e22f76 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_break_continue_2.sol @@ -0,0 +1,22 @@ +contract C { + function f() public pure { + uint x; + while (x < 3) { + if (x > 1) { + x = 3; + break; + } + if (x >= 0) { + x = 2; + continue; + } + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_1.sol new file mode 100644 index 000000000000..e17fa303734b --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_1.sol @@ -0,0 +1,19 @@ +contract C { + function f() public pure { + uint x; + uint i; + while (i < 3) { + ++i; + if (i > 1) + continue; + ++x; + } + assert(x == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_2.sol new file mode 100644 index 000000000000..3670f8dacb4e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_continue_2.sol @@ -0,0 +1,24 @@ +contract C { + function f(uint x) public pure { + require(x == 0); + uint i; + while (i < 3) { + ++i; + if (i == 2) { + x = 2; + continue; + } + if (i == 1) { + x = 1; + continue; + } + } + assert(x == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested.sol new file mode 100644 index 000000000000..887ce60f7dff --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested.sol @@ -0,0 +1,22 @@ +contract C { + function f(uint z) public pure { + uint x = 0; + require(z == 0); + while (x < 2) { + uint y = 0; + while (y < 2) { + ++z; + ++y; + } + ++x; + } + assert(z == 4); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. + diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_break.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_break.sol new file mode 100644 index 000000000000..170c5a3c3c9f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_break.sol @@ -0,0 +1,23 @@ +contract C { + function f(uint z) public pure { + uint x = 0; + require(z == 0); + while (x < 2) { + uint y = 0; + while (y < 2) { + if (y > 0) + break; + ++z; + ++y; + } + ++x; + } + assert(z == 2); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_continue.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_continue.sol new file mode 100644 index 000000000000..66ad2081b45f --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_nested_continue.sol @@ -0,0 +1,23 @@ +contract C { + function f() public pure { + uint x; + uint i; + while (i < 3) { + ++i; + uint j; + while (j < 3) { + ++j; + if (i > 1) + continue; + ++x; + } + } + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol new file mode 100644 index 000000000000..eb497be7cb81 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_1.sol @@ -0,0 +1,20 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + while (x < 3 || y == 1) { + if (x >= 3) + y = 1; + ++x; + } + // BMC loop iteration setting is not enough to leave the loop + assert(x == 3); + assert(y == 1); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 3 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol new file mode 100644 index 000000000000..90682c7f77ec --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_2.sol @@ -0,0 +1,21 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + while (x < 3 || y == 1) { + if (x >= 3) + y = 1; + ++x; + } + // BMC loop iteration setting is just enough to leave the loop + assert(x == 3); // should hold + assert(y == 1); // should fail + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 4 +// ---- +// Warning 4661: (240-254): BMC: Assertion violation happens here. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol new file mode 100644 index 000000000000..992ac7f802f8 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_semantics_3.sol @@ -0,0 +1,20 @@ +contract C { + function f() public pure { + uint x = 0; + int y = 0; + while (x < 3 || y == 1) { + if (x >= 3) + y = 1; + ++x; + } + // BMC loop iteration setting is more than enough to leave the loop + assert(x == 3); // should hold + assert(y == 0); // should hold + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 5 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_shallow_unroll.sol b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_shallow_unroll.sol new file mode 100644 index 000000000000..3134e35c47b2 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_bmc_iterations_shallow_unroll.sol @@ -0,0 +1,17 @@ +contract C { + function f() public pure { + uint x = 0; + while (x < 5) { + x = x + 1; + } + // nothing is reported because loop condition is true after unrolling the loop one time + assert(x == 5); + assert(x == 3); + } +} +// ==== +// SMTEngine: bmc +// SMTSolvers: z3 +// BMCLoopIterations: 1 +// ---- +// Info 6002: BMC: 3 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/loops/while_break_direct.sol b/test/libsolidity/smtCheckerTests/loops/while_break_direct.sol index 783a2f268936..4a6245b0fdec 100644 --- a/test/libsolidity/smtCheckerTests/loops/while_break_direct.sol +++ b/test/libsolidity/smtCheckerTests/loops/while_break_direct.sol @@ -1,5 +1,4 @@ -contract C -{ +contract C { function f(uint x) public pure { x = 0; while (x < 10) @@ -12,4 +11,3 @@ contract C // SMTSolvers: z3 // ---- // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -// Warning 6838: (65-71): BMC: Condition is always true. diff --git a/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol b/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol index 2a9f39d1a2fa..ee7ab8bcc739 100644 --- a/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol +++ b/test/libsolidity/smtCheckerTests/out_of_bounds/array_2d_4.sol @@ -24,4 +24,4 @@ contract C { // Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. // Warning 2661: (184-197): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. // Warning 2661: (228-244): BMC: Overflow (resulting value larger than 2**256 - 1) happens here. -// Info 6002: BMC: 4 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. +// Info 6002: BMC: 2 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. diff --git a/test/libsolidity/smtCheckerTests/try_catch/try_inside_while.sol b/test/libsolidity/smtCheckerTests/try_catch/try_inside_while.sol index 8d54f103f90b..63976d59f9cc 100644 --- a/test/libsolidity/smtCheckerTests/try_catch/try_inside_while.sol +++ b/test/libsolidity/smtCheckerTests/try_catch/try_inside_while.sol @@ -11,4 +11,3 @@ contract C { // SMTEngine: all // ---- // Warning 6321: (43-47): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable. -// Warning 6838: (59-63): BMC: Condition is always true. diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 1b5d8da49d70..30a8b2830752 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -142,6 +142,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) "--optimize", "--optimize-runs=1000", "--yul-optimizations=agf", + "--model-checker-bmc-loop-iterations=2", "--model-checker-contracts=contract1.yul:A,contract2.yul:B", "--model-checker-div-mod-no-slacks", "--model-checker-engine=bmc", @@ -152,7 +153,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) "--model-checker-show-unsupported", "--model-checker-solvers=z3,smtlib2", "--model-checker-targets=underflow,divByZero", - "--model-checker-timeout=5", + "--model-checker-timeout=5" }; if (inputMode == InputMode::CompilerWithASTImport) @@ -210,6 +211,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) expectedOptions.modelChecker.initialize = true; expectedOptions.modelChecker.settings = { + 2, {{{"contract1.yul", {"A"}}, {"contract2.yul", {"B"}}}}, true, {true, false}, diff --git a/test/tools/fuzzer_common.cpp b/test/tools/fuzzer_common.cpp index 60b871cf7935..531fc3c177b5 100644 --- a/test/tools/fuzzer_common.cpp +++ b/test/tools/fuzzer_common.cpp @@ -105,6 +105,7 @@ void FuzzerUtil::testCompiler( { forceSMT(_input); compiler.setModelCheckerSettings({ + /*bmcLoopIterations*/1, frontend::ModelCheckerContracts::Default(), /*divModWithSlacks*/true, frontend::ModelCheckerEngine::All(), From 42a068b44997e3b56b7266b65806f4a1246f47ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 24 May 2023 14:22:18 +0200 Subject: [PATCH 050/138] CommandLineParser: Store the state of EVM assembly and Yul optimizer explicitly - Does not change the meaning of CLI options, just the way we map them to internal variables. --- solc/CommandLineInterface.cpp | 3 --- solc/CommandLineParser.cpp | 19 +++++++++++------- solc/CommandLineParser.h | 4 ++-- test/solc/CommandLineParser.cpp | 35 +++++++++++++++++++++++++++++++-- test/solc/Common.h | 1 + 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 0d0f4c5f9cbc..ae6888dfd204 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -1074,9 +1074,6 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y map yulStacks; for (auto const& src: m_fileReader.sourceUnits()) { - // --no-optimize-yul option is not accepted in assembly mode. - solAssert(!m_options.optimizer.noOptimizeYul); - auto& stack = yulStacks[src.first] = yul::YulStack( m_options.output.evmVersion, m_options.output.eofVersion, diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index aab6b67104d3..5dbee10cd8e3 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -247,9 +247,9 @@ bool CommandLineOptions::operator==(CommandLineOptions const& _other) const noex metadata.format == _other.metadata.format && metadata.hash == _other.metadata.hash && metadata.literalSources == _other.metadata.literalSources && - optimizer.enabled == _other.optimizer.enabled && + optimizer.optimizeEvmasm == _other.optimizer.optimizeEvmasm && + optimizer.optimizeYul == _other.optimizer.optimizeYul && optimizer.expectedExecutionsPerDeployment == _other.optimizer.expectedExecutionsPerDeployment && - optimizer.noOptimizeYul == _other.optimizer.noOptimizeYul && optimizer.yulSteps == _other.optimizer.yulSteps && modelChecker.initialize == _other.modelChecker.initialize && modelChecker.settings == _other.modelChecker.settings; @@ -259,12 +259,12 @@ OptimiserSettings CommandLineOptions::optimiserSettings() const { OptimiserSettings settings; - if (optimizer.enabled) + if (optimizer.optimizeEvmasm || optimizer.optimizeYul) settings = OptimiserSettings::standard(); else settings = OptimiserSettings::minimal(); - if (optimizer.noOptimizeYul) + if (!optimizer.optimizeYul) settings.runYulOptimiser = false; if (optimizer.expectedExecutionsPerDeployment.has_value()) @@ -1166,8 +1166,10 @@ void CommandLineParser::processArgs() ); // We deliberately ignore --optimize-yul - m_options.optimizer.enabled = (m_args.count(g_strOptimize) > 0); - m_options.optimizer.noOptimizeYul = (m_args.count(g_strNoOptimizeYul) > 0); + m_options.optimizer.optimizeEvmasm = (m_args.count(g_strOptimize) > 0); + m_options.optimizer.optimizeYul = ( + m_args.count(g_strOptimize) > 0 && m_args.count(g_strNoOptimizeYul) == 0 + ); if (!m_args[g_strOptimizeRuns].defaulted()) m_options.optimizer.expectedExecutionsPerDeployment = m_args.at(g_strOptimizeRuns).as(); @@ -1235,7 +1237,10 @@ void CommandLineParser::processArgs() else solThrow(CommandLineValidationError, "Invalid option for --" + g_strYulDialect + ": " + dialect); } - if (m_options.optimizer.enabled && (m_options.assembly.inputLanguage != Input::StrictAssembly)) + if ( + (m_options.optimizer.optimizeEvmasm || m_options.optimizer.optimizeYul) && + m_options.assembly.inputLanguage != Input::StrictAssembly + ) solThrow( CommandLineValidationError, "Optimizer can only be used for strict assembly. Use --" + g_strStrictAssembly + "." diff --git a/solc/CommandLineParser.h b/solc/CommandLineParser.h index a4c5a77194b7..6b391e724096 100644 --- a/solc/CommandLineParser.h +++ b/solc/CommandLineParser.h @@ -223,9 +223,9 @@ struct CommandLineOptions struct { - bool enabled = false; + bool optimizeEvmasm = false; + bool optimizeYul = false; std::optional expectedExecutionsPerDeployment; - bool noOptimizeYul = false; std::optional yulSteps; } optimizer; diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 30a8b2830752..54cc054178e1 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -140,6 +140,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) "--metadata-hash=swarm", "--metadata-literal", "--optimize", + "--optimize-yul", "--optimize-runs=1000", "--yul-optimizations=agf", "--model-checker-bmc-loop-iterations=2", @@ -205,7 +206,8 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) }; expectedOptions.metadata.hash = CompilerStack::MetadataHash::Bzzr1; expectedOptions.metadata.literalSources = true; - expectedOptions.optimizer.enabled = true; + expectedOptions.optimizer.optimizeEvmasm = true; + expectedOptions.optimizer.optimizeYul = true; expectedOptions.optimizer.expectedExecutionsPerDeployment = 1000; expectedOptions.optimizer.yulSteps = "agf"; @@ -336,7 +338,8 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options) expectedOptions.compiler.outputs.astCompactJson = true; if (expectedLanguage == YulStack::Language::StrictAssembly) { - expectedOptions.optimizer.enabled = true; + expectedOptions.optimizer.optimizeEvmasm = true; + expectedOptions.optimizer.optimizeYul = true; expectedOptions.optimizer.yulSteps = "agf"; expectedOptions.optimizer.expectedExecutionsPerDeployment = 1000; } @@ -435,6 +438,34 @@ BOOST_AUTO_TEST_CASE(invalid_options_input_modes_combinations) } } +BOOST_AUTO_TEST_CASE(optimizer_flags) +{ + OptimiserSettings evmasmOnly = OptimiserSettings::standard(); + evmasmOnly.runYulOptimiser = false; + + map, OptimiserSettings> settingsMap = { + {{}, OptimiserSettings::minimal()}, + {{"--optimize"}, OptimiserSettings::standard()}, + {{"--no-optimize-yul"}, OptimiserSettings::minimal()}, + {{"--optimize-yul"}, OptimiserSettings::minimal()}, + {{"--optimize", "--no-optimize-yul"}, evmasmOnly}, + {{"--optimize", "--optimize-yul"}, OptimiserSettings::standard()}, + }; + + map inputModeFlagMap = { + {InputMode::Compiler, ""}, + {InputMode::CompilerWithASTImport, "--import-ast"}, + }; + + for (auto const& [inputMode, inputModeFlag]: inputModeFlagMap) + for (auto const& [optimizerFlags, expectedOptimizerSettings]: settingsMap) + { + vector commandLine = {"solc", inputModeFlag, "file"}; + commandLine += optimizerFlags; + BOOST_CHECK(parseCommandLine(commandLine).optimiserSettings() == expectedOptimizerSettings); + } +} + BOOST_AUTO_TEST_CASE(default_optimiser_sequence) { CommandLineOptions const& commandLineOptions = parseCommandLine({"solc", "contract.sol", "--optimize"}); diff --git a/test/solc/Common.h b/test/solc/Common.h index 3575bea74e96..69131bf2caa0 100644 --- a/test/solc/Common.h +++ b/test/solc/Common.h @@ -28,6 +28,7 @@ BOOST_TEST_DONT_PRINT_LOG_VALUE(solidity::frontend::CommandLineOptions) BOOST_TEST_DONT_PRINT_LOG_VALUE(solidity::frontend::InputMode) +BOOST_TEST_DONT_PRINT_LOG_VALUE(solidity::frontend::OptimiserSettings) namespace solidity::frontend::test { From 2769bb52f65c5d6d3ff6150499fe8ece79b43047 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 23 May 2023 14:59:54 +0200 Subject: [PATCH 051/138] Make --optimize-yul work again --- Changelog.md | 1 + solc/CommandLineParser.cpp | 40 ++++++++----------- .../args | 1 - .../err | 1 - .../exit | 1 - .../input.yul | 3 -- test/solc/CommandLineParser.cpp | 7 +++- 7 files changed, 24 insertions(+), 30 deletions(-) delete mode 100644 test/cmdlineTests/strict_asm_invalid_option_optimize_yul/args delete mode 100644 test/cmdlineTests/strict_asm_invalid_option_optimize_yul/err delete mode 100644 test/cmdlineTests/strict_asm_invalid_option_optimize_yul/exit delete mode 100644 test/cmdlineTests/strict_asm_invalid_option_optimize_yul/input.yul diff --git a/Changelog.md b/Changelog.md index 62806a5e1d62..c47ac3e47d46 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ Language Features: Compiler Features: * Commandline Interface: Add ``--ast-compact-json`` output in assembler mode. * Commandline Interface: Add ``--ir-ast-json`` and ``--ir-optimized-ast-json`` outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. + * Commandline Interface: Respect ``--optimize-yul`` and ``--no-optimize-yul`` in compiler mode and accept them in assembler mode as well. ``--optimize --no-optimize-yul`` combination now allows enabling EVM assembly optimizer without enabling Yul optimizer. * EWasm: Remove EWasm backend. * Parser: Introduce ``pragma experimental solidity``, which will enable an experimental language mode that in particular has no stability guarantees between non-breaking releases and is not suited for production use. * Standard JSON Interface: Add ``ast`` file-level output for Yul input. diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 5dbee10cd8e3..9cc93d78da3b 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -259,13 +259,16 @@ OptimiserSettings CommandLineOptions::optimiserSettings() const { OptimiserSettings settings; - if (optimizer.optimizeEvmasm || optimizer.optimizeYul) + if (optimizer.optimizeEvmasm) settings = OptimiserSettings::standard(); else settings = OptimiserSettings::minimal(); - if (!optimizer.optimizeYul) - settings.runYulOptimiser = false; + settings.runYulOptimiser = optimizer.optimizeYul; + if (optimizer.optimizeYul) + // NOTE: Standard JSON disables optimizeStackAllocation by default when yul optimizer is disabled. + // --optimize --no-optimize-yul on the CLI does not have that effect. + settings.optimizeStackAllocation = true; if (optimizer.expectedExecutionsPerDeployment.has_value()) settings.expectedExecutionsPerDeployment = optimizer.expectedExecutionsPerDeployment.value(); @@ -644,21 +647,15 @@ General Information)").c_str(), ) ( g_strAssemble.c_str(), - ("Switch to assembly mode, ignoring all options except " - "--" + g_strMachine + ", --" + g_strYulDialect + ", --" + g_strOptimize + " and --" + g_strYulOptimizations + " " - "and assumes input is assembly.").c_str() + "Switch to assembly mode and assume input is assembly." ) ( g_strYul.c_str(), - ("Switch to Yul mode, ignoring all options except " - "--" + g_strMachine + ", --" + g_strYulDialect + ", --" + g_strOptimize + " and --" + g_strYulOptimizations + " " - "and assumes input is Yul.").c_str() + "Switch to Yul mode and assume input is Yul." ) ( g_strStrictAssembly.c_str(), - ("Switch to strict assembly mode, ignoring all options except " - "--" + g_strMachine + ", --" + g_strYulDialect + ", --" + g_strOptimize + " and --" + g_strYulOptimizations + " " - "and assumes input is strict assembly.").c_str() + "Switch to strict assembly mode and assume input is strict assembly." ) ( g_strImportAst.c_str(), @@ -784,7 +781,7 @@ General Information)").c_str(), optimizerOptions.add_options() ( g_strOptimize.c_str(), - "Enable bytecode optimizer." + "Enable optimizer." ) ( g_strOptimizeRuns.c_str(), @@ -796,16 +793,18 @@ General Information)").c_str(), ) ( g_strOptimizeYul.c_str(), - ("Legacy option, ignored. Use the general --" + g_strOptimize + " to enable Yul optimizer.").c_str() + ("Enable Yul optimizer (independently of the EVM assembly optimizer). " + "The general --" + g_strOptimize + " option automatically enables this unless --" + + g_strNoOptimizeYul + " is specified.").c_str() ) ( g_strNoOptimizeYul.c_str(), - "Disable Yul optimizer in Solidity." + "Disable Yul optimizer (independently of the EVM assembly optimizer)." ) ( g_strYulOptimizations.c_str(), po::value()->value_name("steps"), - "Forces yul optimizer to use the specified sequence of optimization steps instead of the built-in one." + "Forces Yul optimizer to use the specified sequence of optimization steps instead of the built-in one." ) ; desc.add(optimizerOptions); @@ -1165,10 +1164,10 @@ void CommandLineParser::processArgs() "Options --" + g_strOptimizeYul + " and --" + g_strNoOptimizeYul + " cannot be used together." ); - // We deliberately ignore --optimize-yul m_options.optimizer.optimizeEvmasm = (m_args.count(g_strOptimize) > 0); m_options.optimizer.optimizeYul = ( - m_args.count(g_strOptimize) > 0 && m_args.count(g_strNoOptimizeYul) == 0 + (m_args.count(g_strOptimize) > 0 && m_args.count(g_strNoOptimizeYul) == 0) || + m_args.count(g_strOptimizeYul) > 0 ); if (!m_args[g_strOptimizeRuns].defaulted()) m_options.optimizer.expectedExecutionsPerDeployment = m_args.at(g_strOptimizeRuns).as(); @@ -1201,8 +1200,6 @@ void CommandLineParser::processArgs() g_strOutputDir, g_strGas, g_strCombinedJson, - g_strOptimizeYul, - g_strNoOptimizeYul, }; if (countEnabledOptions(nonAssemblyModeOptions) >= 1) { @@ -1210,9 +1207,6 @@ void CommandLineParser::processArgs() auto enabledOptions = nonAssemblyModeOptions | ranges::views::filter(optionEnabled) | ranges::to_vector; string message = "The following options are invalid in assembly mode: " + joinOptionNames(enabledOptions) + "."; - if (m_args.count(g_strOptimizeYul) || m_args.count(g_strNoOptimizeYul)) - message += " Optimization is disabled by default and can be enabled with --" + g_strOptimize + "."; - solThrow(CommandLineValidationError, message); } diff --git a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/args b/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/args deleted file mode 100644 index 827d998294b2..000000000000 --- a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/args +++ /dev/null @@ -1 +0,0 @@ ---strict-assembly --optimize-yul diff --git a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/err b/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/err deleted file mode 100644 index a6378a665ec1..000000000000 --- a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/err +++ /dev/null @@ -1 +0,0 @@ -The following options are invalid in assembly mode: --optimize-yul. Optimization is disabled by default and can be enabled with --optimize. diff --git a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/exit b/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/exit deleted file mode 100644 index d00491fd7e5b..000000000000 --- a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/exit +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/input.yul b/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/input.yul deleted file mode 100644 index f21cd2b7e038..000000000000 --- a/test/cmdlineTests/strict_asm_invalid_option_optimize_yul/input.yul +++ /dev/null @@ -1,3 +0,0 @@ -{ - sstore(0, 1) -} diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 54cc054178e1..1fc033533d9c 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -440,6 +440,10 @@ BOOST_AUTO_TEST_CASE(invalid_options_input_modes_combinations) BOOST_AUTO_TEST_CASE(optimizer_flags) { + OptimiserSettings yulOnly = OptimiserSettings::minimal(); + yulOnly.runYulOptimiser = true; + yulOnly.optimizeStackAllocation = true; + OptimiserSettings evmasmOnly = OptimiserSettings::standard(); evmasmOnly.runYulOptimiser = false; @@ -447,7 +451,7 @@ BOOST_AUTO_TEST_CASE(optimizer_flags) {{}, OptimiserSettings::minimal()}, {{"--optimize"}, OptimiserSettings::standard()}, {{"--no-optimize-yul"}, OptimiserSettings::minimal()}, - {{"--optimize-yul"}, OptimiserSettings::minimal()}, + {{"--optimize-yul"}, yulOnly}, {{"--optimize", "--no-optimize-yul"}, evmasmOnly}, {{"--optimize", "--optimize-yul"}, OptimiserSettings::standard()}, }; @@ -455,6 +459,7 @@ BOOST_AUTO_TEST_CASE(optimizer_flags) map inputModeFlagMap = { {InputMode::Compiler, ""}, {InputMode::CompilerWithASTImport, "--import-ast"}, + {InputMode::Assembler, "--strict-assembly"}, }; for (auto const& [inputMode, inputModeFlag]: inputModeFlagMap) From 47969adf91dc3952592f473e4afbe5e306e477aa Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Thu, 18 May 2023 15:22:09 +0200 Subject: [PATCH 052/138] Experimental standard library Change import syntax and cover with tests --- CMakeLists.txt | 1 + libsolidity/interface/CompilerStack.cpp | 12 +++++++ libsolidity/parsing/Parser.cpp | 29 ++++++++++++--- libsolidity/parsing/Parser.h | 5 +++ libstdlib/CMakeLists.txt | 18 ++++++++++ libstdlib/src/stub.sol | 9 +++++ libstdlib/stdlib.h.in | 15 ++++++++ libstdlib/stdlib.src.h.in | 13 +++++++ scripts/ASTImportTest.sh | 2 +- scripts/test_antlr_grammar.sh | 2 +- test/libsolidity/SyntaxTest.cpp | 35 ++++++++++--------- .../experimental/parsing_stdlib_import_1.sol | 8 +++++ .../experimental/parsing_stdlib_import_2.sol | 8 +++++ .../experimental/parsing_stdlib_import_3.sol | 8 +++++ .../experimental/parsing_stdlib_import_4.sol | 8 +++++ ...parsing_stdlib_import_without_pragma_1.sol | 3 ++ ...parsing_stdlib_import_without_pragma_2.sol | 3 ++ 17 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 libstdlib/CMakeLists.txt create mode 100644 libstdlib/src/stub.sol create mode 100644 libstdlib/stdlib.h.in create mode 100644 libstdlib/stdlib.src.h.in create mode 100644 test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_1.sol create mode 100644 test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_2.sol create mode 100644 test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_3.sol create mode 100644 test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_4.sol create mode 100644 test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_1.sol create mode 100644 test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_2.sol diff --git a/CMakeLists.txt b/CMakeLists.txt index c9a7a1876140..85d2f64ce810 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,6 +140,7 @@ add_subdirectory(libevmasm) add_subdirectory(libyul) add_subdirectory(libsolidity) add_subdirectory(libsolc) +add_subdirectory(libstdlib) add_subdirectory(tools) if (NOT EMSCRIPTEN) diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index f8a5fed6ecb0..aad2bc2baf2d 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -59,6 +59,8 @@ #include #include +#include + #include #include #include @@ -95,6 +97,7 @@ using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::frontend; +using namespace solidity::stdlib; using solidity::util::errinfo_comment; @@ -369,6 +372,15 @@ bool CompilerStack::parse() for (auto const& import: ASTNode::filteredNodes(source.ast->nodes())) { solAssert(!import->path().empty(), "Import path cannot be empty."); + // Check whether the import directive is for the standard library, + // and if yes, add specified file to source units to be parsed. + auto it = stdlib::sources.find(import->path()); + if (it != stdlib::sources.end()) + { + auto [name, content] = *it; + m_sources[name].charStream = make_unique(content, name); + sourcesToParse.push_back(name); + } // The current value of `path` is the absolute path as seen from this source file. // We first have to apply remappings before we can store the actual absolute path diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 34fc9644e8d8..efbe854482ce 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -271,9 +271,9 @@ ASTPointer Parser::parseImportDirective() SourceLocation unitAliasLocation{}; ImportDirective::SymbolAliasList symbolAliases; - if (m_scanner->currentToken() == Token::StringLiteral) + if (isQuotedPath() || isStdlibPath()) { - path = getLiteralAndAdvance(); + path = isQuotedPath() ? getLiteralAndAdvance() : getStdlibImportPathAndAdvance(); if (m_scanner->currentToken() == Token::As) { advance(); @@ -315,9 +315,9 @@ ASTPointer Parser::parseImportDirective() if (m_scanner->currentToken() != Token::Identifier || m_scanner->currentLiteral() != "from") fatalParserError(8208_error, "Expected \"from\"."); advance(); - if (m_scanner->currentToken() != Token::StringLiteral) + if (!isQuotedPath() && !isStdlibPath()) fatalParserError(6845_error, "Expected import path."); - path = getLiteralAndAdvance(); + path = isQuotedPath() ? getLiteralAndAdvance() : getStdlibImportPathAndAdvance(); } if (path->empty()) fatalParserError(6326_error, "Import path cannot be empty."); @@ -2486,4 +2486,25 @@ ASTPointer Parser::getLiteralAndAdvance() return identifier; } +bool Parser::isQuotedPath() const +{ + return m_scanner->currentToken() == Token::StringLiteral; +} + +bool Parser::isStdlibPath() const +{ + return m_experimentalSolidityEnabledInCurrentSourceUnit + && m_scanner->currentToken() == Token::Identifier + && m_scanner->currentLiteral() == "std"; +} + +ASTPointer Parser::getStdlibImportPathAndAdvance() +{ + ASTPointer std = expectIdentifierToken(); + if (m_scanner->currentToken() == Token::Period) + advance(); + ASTPointer library = expectIdentifierToken(); + return make_shared(*std + "." + *library); +} + } diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h index c83b307b8557..65e8f61f311d 100644 --- a/libsolidity/parsing/Parser.h +++ b/libsolidity/parsing/Parser.h @@ -219,6 +219,11 @@ class Parser: public langutil::ParserBase ASTPointer getLiteralAndAdvance(); ///@} + bool isQuotedPath() const; + bool isStdlibPath() const; + + ASTPointer getStdlibImportPathAndAdvance(); + /// Creates an empty ParameterList at the current location (used if parameters can be omitted). ASTPointer createEmptyParameterList(); diff --git a/libstdlib/CMakeLists.txt b/libstdlib/CMakeLists.txt new file mode 100644 index 000000000000..a4523b99ebe9 --- /dev/null +++ b/libstdlib/CMakeLists.txt @@ -0,0 +1,18 @@ +# This will re-generate the headers if any file within src was modified. +set_directory_properties(PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/stdlib/src/) + +set(STDLIB stub) +set(GENERATED_STDLIB_HEADERS) +foreach(src IN LISTS STDLIB) + set(STDLIB_FILE ${CMAKE_SOURCE_DIR}/libstdlib/src/${src}.sol) + file(READ ${STDLIB_FILE} STDLIB_FILE_CONTENT HEX) + string(REGEX MATCHALL ".." STDLIB_FILE_CONTENT "${STDLIB_FILE_CONTENT}") + list(REMOVE_ITEM STDLIB_FILE_CONTENT "0d") + string(REGEX REPLACE ";" ",\n\t0x" STDLIB_FILE_CONTENT "${STDLIB_FILE_CONTENT}") + set(STDLIB_FILE_CONTENT "0x${STDLIB_FILE_CONTENT}") + set(STDLIB_FILE_NAME ${src}) + configure_file("${CMAKE_SOURCE_DIR}/libstdlib/stdlib.src.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h NEWLINE_STYLE LF @ONLY) + list(APPEND GENERATED_STDLIB_HEADERS ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h) +endforeach() + +configure_file("${CMAKE_SOURCE_DIR}/libstdlib/stdlib.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/stdlib.h NEWLINE_STYLE LF @ONLY) diff --git a/libstdlib/src/stub.sol b/libstdlib/src/stub.sol new file mode 100644 index 000000000000..46ae21dcf5a2 --- /dev/null +++ b/libstdlib/src/stub.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.0; + +pragma experimental solidity; + +function identity(uint256 x) pure returns (uint256) +{ + return x; +} diff --git a/libstdlib/stdlib.h.in b/libstdlib/stdlib.h.in new file mode 100644 index 000000000000..3b86029dc6e1 --- /dev/null +++ b/libstdlib/stdlib.h.in @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include "libstdlib/stub.h" + +namespace solidity::stdlib +{ + +static std::map sources = { + { "std.stub", stub } +}; + +} // namespace solidity::stdlib diff --git a/libstdlib/stdlib.src.h.in b/libstdlib/stdlib.src.h.in new file mode 100644 index 000000000000..0407663d6b4d --- /dev/null +++ b/libstdlib/stdlib.src.h.in @@ -0,0 +1,13 @@ +// The generation of this file is defined in stdlib/CMakeLists.txt. +// This file was generated by using the content of stdlib/src/@STDLIB_FILE_NAME@.sol. + +#pragma once + +namespace solidity::stdlib +{ + +static char const @STDLIB_FILE_NAME@[] = { + @STDLIB_FILE_CONTENT@, 0 +}; + +} // namespace solidity::stdlib diff --git a/scripts/ASTImportTest.sh b/scripts/ASTImportTest.sh index faf98c19267b..c245261951de 100755 --- a/scripts/ASTImportTest.sh +++ b/scripts/ASTImportTest.sh @@ -209,7 +209,7 @@ esac # boost_filesystem_bug specifically tests a local fix for a boost::filesystem # bug. Since the test involves a malformed path, there is no point in running # tests on it. See https://github.com/boostorg/filesystem/issues/176 -IMPORT_TEST_FILES=$(find "${TEST_DIRS[@]}" -name "*.sol" -and -not -name "boost_filesystem_bug.sol") +IMPORT_TEST_FILES=$(find "${TEST_DIRS[@]}" -name "*.sol" -and -not -name "boost_filesystem_bug.sol" -not -path "*/experimental/*") NSOURCES="$(echo "${IMPORT_TEST_FILES}" | wc -l)" echo "Looking at ${NSOURCES} .sol files..." diff --git a/scripts/test_antlr_grammar.sh b/scripts/test_antlr_grammar.sh index e84f9b064a1c..4dde11bf7dac 100755 --- a/scripts/test_antlr_grammar.sh +++ b/scripts/test_antlr_grammar.sh @@ -110,7 +110,7 @@ do SOL_FILES+=("$line") done < <( grep --include "*.sol" -riL -E \ - "^\/\/ (Syntax|Type|Declaration)Error|^\/\/ ParserError (1684|2837|3716|3997|5333|6275|6281|6933|7319|8185|7637)|^==== Source:" \ + "^\/\/ (Syntax|Type|Declaration)Error|^\/\/ ParserError (1684|2837|3716|3997|5333|6275|6281|6933|7319|8185|7637)|^==== Source:|^pragma experimental solidity;" \ "${ROOT_DIR}/test/libsolidity/syntaxTests" \ "${ROOT_DIR}/test/libsolidity/semanticTests" | # Skipping the unicode tests as I couldn't adapt the lexical grammar to recursively counting RLO/LRO/PDF's. diff --git a/test/libsolidity/SyntaxTest.cpp b/test/libsolidity/SyntaxTest.cpp index ee3c4b4b06b3..159f9dcb12a0 100644 --- a/test/libsolidity/SyntaxTest.cpp +++ b/test/libsolidity/SyntaxTest.cpp @@ -123,25 +123,28 @@ void SyntaxTest::filterObtainedErrors() string sourceName; if (SourceLocation const* location = currentError->sourceLocation()) { + locationStart = location->start; + locationEnd = location->end; solAssert(location->sourceName, ""); sourceName = *location->sourceName; - solAssert(m_sources.sources.count(sourceName) == 1, ""); - - int preambleSize = - static_cast(compiler().charStream(sourceName).size()) - - static_cast(m_sources.sources[sourceName].size()); - solAssert(preambleSize >= 0, ""); - - // ignore the version & license pragma inserted by the testing tool when calculating locations. - if (location->start != -1) - { - solAssert(location->start >= preambleSize, ""); - locationStart = location->start - preambleSize; - } - if (location->end != -1) + if(m_sources.sources.count(sourceName) == 1) { - solAssert(location->end >= preambleSize, ""); - locationEnd = location->end - preambleSize; + int preambleSize = + static_cast(compiler().charStream(sourceName).size()) - + static_cast(m_sources.sources[sourceName].size()); + solAssert(preambleSize >= 0, ""); + + // ignore the version & license pragma inserted by the testing tool when calculating locations. + if (location->start != -1) + { + solAssert(location->start >= preambleSize, ""); + locationStart = location->start - preambleSize; + } + if (location->end != -1) + { + solAssert(location->end >= preambleSize, ""); + locationEnd = location->end - preambleSize; + } } } m_errorList.emplace_back(SyntaxTestError{ diff --git a/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_1.sol b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_1.sol new file mode 100644 index 000000000000..beec24c1e4d3 --- /dev/null +++ b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_1.sol @@ -0,0 +1,8 @@ +pragma experimental solidity; + +import std.stub; +// ==== +// EVMVersion: >=constantinople +// ---- +// Warning 2264: (std.stub:63-92): Experimental features are turned on. Do not use experimental features on live deployments. +// Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_2.sol b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_2.sol new file mode 100644 index 000000000000..85d3a4ac7baf --- /dev/null +++ b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_2.sol @@ -0,0 +1,8 @@ +pragma experimental solidity; + +import std.stub as stub; +// ==== +// EVMVersion: >=constantinople +// ---- +// Warning 2264: (std.stub:63-92): Experimental features are turned on. Do not use experimental features on live deployments. +// Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_3.sol b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_3.sol new file mode 100644 index 000000000000..7e51a73b1017 --- /dev/null +++ b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_3.sol @@ -0,0 +1,8 @@ +pragma experimental solidity; + +import { identity } from std.stub; +// ==== +// EVMVersion: >=constantinople +// ---- +// Warning 2264: (std.stub:63-92): Experimental features are turned on. Do not use experimental features on live deployments. +// Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_4.sol b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_4.sol new file mode 100644 index 000000000000..3c4ff41d6c73 --- /dev/null +++ b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_4.sol @@ -0,0 +1,8 @@ +pragma experimental solidity; + +import * as stub from std.stub; +// ==== +// EVMVersion: >=constantinople +// ---- +// Warning 2264: (std.stub:63-92): Experimental features are turned on. Do not use experimental features on live deployments. +// Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. diff --git a/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_1.sol b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_1.sol new file mode 100644 index 000000000000..0106846f98e2 --- /dev/null +++ b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_1.sol @@ -0,0 +1,3 @@ +import std.stub; +// ---- +// ParserError 9478: (7-10): Expected string literal (path), "*" or alias list. diff --git a/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_2.sol b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_2.sol new file mode 100644 index 000000000000..3a6c1848bab9 --- /dev/null +++ b/test/libsolidity/syntaxTests/experimental/parsing_stdlib_import_without_pragma_2.sol @@ -0,0 +1,3 @@ +import { identity } from std.stub; +// ---- +// ParserError 6845: (25-28): Expected import path. From 25c78be73e7f077e1c750ed65b8004938f5f5cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 6 Jun 2023 10:07:31 +0200 Subject: [PATCH 053/138] Give error_message in msg_on_error an initial value to make it compatible with set -u --- scripts/common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/common.sh b/scripts/common.sh index b5c6ada91465..da8726f3fa0d 100644 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -121,7 +121,7 @@ function assertFail function msg_on_error { - local error_message + local error_message="" local no_stdout=false local no_stderr=false From e6716e320805416ee17d64a136de0912eefeb0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 1 Jun 2023 16:39:11 +0200 Subject: [PATCH 054/138] Helpers for removing decorations form solc output --- scripts/common_cmdline.sh | 27 +++++++++++++++++ test/cmdlineTests/~via_ir_equivalence/test.sh | 30 +++++++++---------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/scripts/common_cmdline.sh b/scripts/common_cmdline.sh index d364f644488f..1b40f50d537c 100644 --- a/scripts/common_cmdline.sh +++ b/scripts/common_cmdline.sh @@ -103,3 +103,30 @@ function compileFull false fi } + +function stripCLIDecorations +{ + sed -e '/^=======.*=======$/d' \ + -e '/^Binary:$/d' \ + -e '/^Binary of the runtime part:$/d' \ + -e '/^Opcodes:$/d' \ + -e '/^IR:$/d' \ + -e '/^Optimized IR:$/d' \ + -e '/^EVM assembly:$/d' \ + -e '/^JSON AST (compact format):$/d' \ + -e '/^Function signatures:$/d' \ + -e '/^Contract Storage Layout:$/d' \ + -e '/^Developer Documentation$/d' \ + -e '/^User Documentation$/d' \ + -e '/^Contract JSON ABI$/d' \ + -e '/^Metadata:$/d' \ + -e '/^EVM$/d' \ + -e '/^Pretty printed source:$/d' \ + -e '/^Text representation:$/d' \ + -e '/^Binary representation:$/d' +} + +function stripEmptyLines +{ + sed -e '/^\s*$/d' +} diff --git a/test/cmdlineTests/~via_ir_equivalence/test.sh b/test/cmdlineTests/~via_ir_equivalence/test.sh index 4da72d15186b..c318f262a088 100755 --- a/test/cmdlineTests/~via_ir_equivalence/test.sh +++ b/test/cmdlineTests/~via_ir_equivalence/test.sh @@ -3,6 +3,8 @@ set -eo pipefail # shellcheck source=scripts/common.sh source "${REPO_ROOT}/scripts/common.sh" +# shellcheck source=scripts/common_cmdline.sh +source "${REPO_ROOT}/scripts/common_cmdline.sh" function test_via_ir_equivalence() { @@ -21,24 +23,24 @@ function test_via_ir_equivalence() [[ $optimize_flag == "" ]] || optimizer_flags+=("$optimize_flag") [[ $optimize_flag == "" ]] || output_file_prefix+="_optimize" - msg_on_error --no-stderr "$SOLC" --ir-optimized --debug-info location "${optimizer_flags[@]}" "$solidity_file" | - sed '/^Optimized IR:$/d' | - split_on_empty_lines_into_numbered_files "$output_file_prefix" ".yul" + msg_on_error --no-stderr \ + "$SOLC" --ir-optimized --debug-info location "${optimizer_flags[@]}" "$solidity_file" | + stripCLIDecorations | + split_on_empty_lines_into_numbered_files "$output_file_prefix" ".yul" local asm_output_two_stage asm_output_via_ir for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do asm_output_two_stage+=$( - msg_on_error --no-stderr "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | - sed '/^Text representation:$/d' | - sed '/^=======/d' + msg_on_error --no-stderr \ + "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | stripCLIDecorations ) done asm_output_via_ir=$( - msg_on_error --no-stderr "$SOLC" --via-ir --asm --debug-info location "${optimizer_flags[@]}" "$solidity_file" | - sed '/^EVM assembly:$/d' | - sed '/^=======/d' + msg_on_error --no-stderr \ + "$SOLC" --via-ir --asm --debug-info location "${optimizer_flags[@]}" "$solidity_file" | + stripCLIDecorations ) diff_values "$asm_output_two_stage" "$asm_output_via_ir" --ignore-space-change --ignore-blank-lines @@ -47,16 +49,14 @@ function test_via_ir_equivalence() for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do bin_output_two_stage+=$( - msg_on_error --no-stderr "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | - sed '/^Binary representation:$/d' | - sed '/^=======/d' + msg_on_error --no-stderr \ + "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | stripCLIDecorations ) done bin_output_via_ir=$( - msg_on_error --no-stderr "$SOLC" --via-ir --bin "${optimizer_flags[@]}" "$solidity_file" | - sed '/^Binary:$/d' | - sed '/^=======/d' + msg_on_error --no-stderr \ + "$SOLC" --via-ir --bin "${optimizer_flags[@]}" "$solidity_file" | stripCLIDecorations ) diff_values "$bin_output_two_stage" "$bin_output_via_ir" --ignore-space-change --ignore-blank-lines From 64ef9d581bb2d526dac1a3f21b7b22b21673eee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 1 Jun 2023 16:42:45 +0200 Subject: [PATCH 055/138] Command-line test for equivalence of optimizer options on the CLI and in Standard JSON --- scripts/common_cmdline.sh | 39 ++++++++++++ .../test.sh | 61 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100755 test/cmdlineTests/~cli_and_standard_json_equivalence/test.sh diff --git a/scripts/common_cmdline.sh b/scripts/common_cmdline.sh index 1b40f50d537c..5e32a76dc9ed 100644 --- a/scripts/common_cmdline.sh +++ b/scripts/common_cmdline.sh @@ -104,6 +104,45 @@ function compileFull fi } +function singleContractOutputViaStandardJSON +{ + (( $# == 4 )) || assertFail + local language="$1" + local selected_output="$2" + local extra_settings="$3" + local input_file="$4" + [[ $selected_output != "*" ]] || assertFail + + json_output=$( + "$SOLC" --standard-json --allow-paths "$(basename "$input_file")" - < Date: Tue, 16 May 2023 11:05:09 +0200 Subject: [PATCH 056/138] Update tests that would become ineffective with minimal optimizations applied --- .../standard_yul_debug_info_print_all/in.yul | 1 + .../standard_yul_debug_info_print_all/output.json | 1 + .../in.yul | 1 + .../output.json | 1 + .../standard_yul_debug_info_print_none/in.yul | 1 + .../standard_yul_debug_info_print_none/output.json | 1 + .../in.yul | 1 + .../strict_asm_debug_info_print_all/input.yul | 1 + .../strict_asm_debug_info_print_all/output | 5 +++-- .../input.yul | 1 + .../output | 5 +++-- .../strict_asm_debug_info_print_none/input.yul | 1 + .../strict_asm_debug_info_print_none/output | 5 +++-- .../input.yul | 1 + test/libyul/objectCompiler/function_series.yul | 14 +++++++++++--- test/libyul/objectCompiler/jump_tags.yul | 14 +++++++++++--- 16 files changed, 42 insertions(+), 12 deletions(-) diff --git a/test/cmdlineTests/standard_yul_debug_info_print_all/in.yul b/test/cmdlineTests/standard_yul_debug_info_print_all/in.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_all/in.yul +++ b/test/cmdlineTests/standard_yul_debug_info_print_all/in.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/standard_yul_debug_info_print_all/output.json b/test/cmdlineTests/standard_yul_debug_info_print_all/output.json index 78f14c08da2f..0c78efb80004 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_all/output.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_all/output.json @@ -16,6 +16,7 @@ tag_2: /* \"input.sol\":77:99 */ jump(tag_3) tag_1: + sstore(0x00, 0x2a) jump\t// out tag_3: " diff --git a/test/cmdlineTests/standard_yul_debug_info_print_location_only/in.yul b/test/cmdlineTests/standard_yul_debug_info_print_location_only/in.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_location_only/in.yul +++ b/test/cmdlineTests/standard_yul_debug_info_print_location_only/in.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json b/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json index 526a6a5c637a..53be3d073bbf 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json @@ -16,6 +16,7 @@ tag_2: /* \"input.sol\":77:99 */ jump(tag_3) tag_1: + sstore(0x00, 0x2a) jump\t// out tag_3: " diff --git a/test/cmdlineTests/standard_yul_debug_info_print_none/in.yul b/test/cmdlineTests/standard_yul_debug_info_print_none/in.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_none/in.yul +++ b/test/cmdlineTests/standard_yul_debug_info_print_none/in.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/standard_yul_debug_info_print_none/output.json b/test/cmdlineTests/standard_yul_debug_info_print_none/output.json index f5b5c636448b..ac2a93b0f264 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_none/output.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_none/output.json @@ -14,6 +14,7 @@ tag_2: jump(tag_3) tag_1: + sstore(0x00, 0x2a) jump\t// out tag_3: " diff --git a/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/in.yul b/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/in.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/in.yul +++ b/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/in.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/strict_asm_debug_info_print_all/input.yul b/test/cmdlineTests/strict_asm_debug_info_print_all/input.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_all/input.yul +++ b/test/cmdlineTests/strict_asm_debug_info_print_all/input.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/strict_asm_debug_info_print_all/output b/test/cmdlineTests/strict_asm_debug_info_print_all/output index e83614b62ac0..2242e6630eaf 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_all/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_all/output @@ -10,13 +10,13 @@ object "C_6_deployed" { fun_f_5() /// @src 0:77:99 function fun_f_5() - { } + { sstore(0, 42) } } } Binary representation: -6080604052600a600e565b6010565b565b +6080604052600a600e565b6014565b602a5f55565b Text representation: /* "input.sol":60:101 */ @@ -28,5 +28,6 @@ tag_2: /* "input.sol":77:99 */ jump(tag_3) tag_1: + sstore(0x00, 0x2a) jump // out tag_3: diff --git a/test/cmdlineTests/strict_asm_debug_info_print_location_only/input.yul b/test/cmdlineTests/strict_asm_debug_info_print_location_only/input.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_location_only/input.yul +++ b/test/cmdlineTests/strict_asm_debug_info_print_location_only/input.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/strict_asm_debug_info_print_location_only/output b/test/cmdlineTests/strict_asm_debug_info_print_location_only/output index a4fd0e4940ed..c5de7c43990d 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_location_only/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_location_only/output @@ -10,13 +10,13 @@ object "C_6_deployed" { fun_f_5() /// @src 0:77:99 function fun_f_5() - { } + { sstore(0, 42) } } } Binary representation: -6080604052600a600e565b6010565b565b +6080604052600a600e565b6014565b602a5f55565b Text representation: /* "input.sol":60:101 */ @@ -28,5 +28,6 @@ tag_2: /* "input.sol":77:99 */ jump(tag_3) tag_1: + sstore(0x00, 0x2a) jump // out tag_3: diff --git a/test/cmdlineTests/strict_asm_debug_info_print_none/input.yul b/test/cmdlineTests/strict_asm_debug_info_print_none/input.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_none/input.yul +++ b/test/cmdlineTests/strict_asm_debug_info_print_none/input.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/cmdlineTests/strict_asm_debug_info_print_none/output b/test/cmdlineTests/strict_asm_debug_info_print_none/output index fc8841c9a843..3db44c1f5b15 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_none/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_none/output @@ -8,13 +8,13 @@ object "C_6_deployed" { mstore(64, 128) fun_f_5() function fun_f_5() - { } + { sstore(0, 42) } } } Binary representation: -6080604052600a600e565b6010565b565b +6080604052600a600e565b6014565b602a5f55565b Text representation: mstore(0x40, 0x80) @@ -24,5 +24,6 @@ Text representation: tag_2: jump(tag_3) tag_1: + sstore(0x00, 0x2a) jump // out tag_3: diff --git a/test/cmdlineTests/strict_asm_debug_info_print_snippet_only/input.yul b/test/cmdlineTests/strict_asm_debug_info_print_snippet_only/input.yul index 6d1ebe21b989..aa564d00ce86 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_snippet_only/input.yul +++ b/test/cmdlineTests/strict_asm_debug_info_print_snippet_only/input.yul @@ -9,6 +9,7 @@ object "C_6_deployed" { /// @src 0:77:99 "function f() public {}" function fun_f_5() { + sstore(0, 42) } /// @src 0:60:101 "contract C {..." } diff --git a/test/libyul/objectCompiler/function_series.yul b/test/libyul/objectCompiler/function_series.yul index 10a018160a81..7be2db96b923 100644 --- a/test/libyul/objectCompiler/function_series.yul +++ b/test/libyul/objectCompiler/function_series.yul @@ -3,6 +3,10 @@ object "Contract" { function f() {} function g() {} sstore(0, 1) + + // NOTE: msize forces the compiler to completely disable the Yul optimizer. + // Otherwise the functions would get optimized out. + pop(msize()) } } @@ -26,6 +30,10 @@ object "Contract" { // 0x00 // /* "source":73:85 */ // sstore -// Bytecode: 6009565b5b565b5b565b60015f55 -// Opcodes: PUSH1 0x9 JUMP JUMPDEST JUMPDEST JUMP JUMPDEST JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH0 SSTORE -// SourceMappings: 33:15:0:-:0;;;;:::o;53:::-;;:::o;:::-;83:1;80;73:12 +// /* "source":231:238 */ +// msize +// /* "source":227:239 */ +// pop +// Bytecode: 6009565b5b565b5b565b60015f555950 +// Opcodes: PUSH1 0x9 JUMP JUMPDEST JUMPDEST JUMP JUMPDEST JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH0 SSTORE MSIZE POP +// SourceMappings: 33:15:0:-:0;;;;:::o;53:::-;;:::o;:::-;83:1;80;73:12;231:7;227:12 diff --git a/test/libyul/objectCompiler/jump_tags.yul b/test/libyul/objectCompiler/jump_tags.yul index ba0984b1022e..0d1f1ff791ab 100644 --- a/test/libyul/objectCompiler/jump_tags.yul +++ b/test/libyul/objectCompiler/jump_tags.yul @@ -3,6 +3,10 @@ object "Contract" { function f() { g(1) } function g(x) { if x { leave } g(add(x, 2)) } g(1) + + // NOTE: msize forces the compiler to completely disable the Yul optimizer. + // Otherwise f() would get optimized out. + pop(msize()) } } @@ -62,6 +66,10 @@ object "Contract" { // tag_2 // jump // in // tag_9: -// Bytecode: 6026565b600b6001600e565b5b565b8015601857506024565b602260028201600e565b505b565b602e6001600e565b -// Opcodes: PUSH1 0x26 JUMP JUMPDEST PUSH1 0xB PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST JUMPDEST JUMP JUMPDEST DUP1 ISZERO PUSH1 0x18 JUMPI POP PUSH1 0x24 JUMP JUMPDEST PUSH1 0x22 PUSH1 0x2 DUP3 ADD PUSH1 0xE JUMP JUMPDEST POP JUMPDEST JUMP JUMPDEST PUSH1 0x2E PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST -// SourceMappings: 33:21:0:-:0;;;48:4;50:1;48:4;:::i;:::-;33:21;:::o;59:45::-;78:1;75:14;;;82:5;;;75:14;90:12;99:1;96;92:9;90:12;:::i;:::-;59:45;;:::o;:::-;109:4;111:1;109:4;:::i;:::- +// /* "source":249:256 */ +// msize +// /* "source":245:257 */ +// pop +// Bytecode: 6026565b600b6001600e565b5b565b8015601857506024565b602260028201600e565b505b565b602e6001600e565b5950 +// Opcodes: PUSH1 0x26 JUMP JUMPDEST PUSH1 0xB PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST JUMPDEST JUMP JUMPDEST DUP1 ISZERO PUSH1 0x18 JUMPI POP PUSH1 0x24 JUMP JUMPDEST PUSH1 0x22 PUSH1 0x2 DUP3 ADD PUSH1 0xE JUMP JUMPDEST POP JUMPDEST JUMP JUMPDEST PUSH1 0x2E PUSH1 0x1 PUSH1 0xE JUMP JUMPDEST MSIZE POP +// SourceMappings: 33:21:0:-:0;;;48:4;50:1;48:4;:::i;:::-;33:21;:::o;59:45::-;78:1;75:14;;;82:5;;;75:14;90:12;99:1;96;92:9;90:12;:::i;:::-;59:45;;:::o;:::-;109:4;111:1;109:4;:::i;:::-;249:7;245:12 From 8e35e8dd8e90b883a61cd845c3d351c3c0303373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Sat, 29 Apr 2023 01:40:36 +0200 Subject: [PATCH 057/138] Command-line tests checking behavior of msize without optimizer --- .../strict_asm_msize_with_optimizer/args | 1 + .../strict_asm_msize_with_optimizer/input.yul | 13 + .../strict_asm_msize_with_optimizer/output | 14 + .../strict_asm_msize_without_optimizer/args | 1 + .../input.yul | 13 + .../strict_asm_msize_without_optimizer/output | 40 +++ .../viair_msize_without_optimizer/args | 1 + .../viair_msize_without_optimizer/input.sol | 21 ++ .../viair_msize_without_optimizer/output | 261 ++++++++++++++++++ 9 files changed, 365 insertions(+) create mode 100644 test/cmdlineTests/strict_asm_msize_with_optimizer/args create mode 100644 test/cmdlineTests/strict_asm_msize_with_optimizer/input.yul create mode 100644 test/cmdlineTests/strict_asm_msize_with_optimizer/output create mode 100644 test/cmdlineTests/strict_asm_msize_without_optimizer/args create mode 100644 test/cmdlineTests/strict_asm_msize_without_optimizer/input.yul create mode 100644 test/cmdlineTests/strict_asm_msize_without_optimizer/output create mode 100644 test/cmdlineTests/viair_msize_without_optimizer/args create mode 100644 test/cmdlineTests/viair_msize_without_optimizer/input.sol create mode 100644 test/cmdlineTests/viair_msize_without_optimizer/output diff --git a/test/cmdlineTests/strict_asm_msize_with_optimizer/args b/test/cmdlineTests/strict_asm_msize_with_optimizer/args new file mode 100644 index 000000000000..f1cb61514f3b --- /dev/null +++ b/test/cmdlineTests/strict_asm_msize_with_optimizer/args @@ -0,0 +1 @@ +--strict-assembly --debug-info none --optimize diff --git a/test/cmdlineTests/strict_asm_msize_with_optimizer/input.yul b/test/cmdlineTests/strict_asm_msize_with_optimizer/input.yul new file mode 100644 index 000000000000..ccff7a32f45b --- /dev/null +++ b/test/cmdlineTests/strict_asm_msize_with_optimizer/input.yul @@ -0,0 +1,13 @@ +{ + function f() -> x { + x := mload(0) + } + + // In pure Yul optimization in presence of msize is allowed. + // Everything in this file should get optimized out. + pop(msize()) + + let x := 0 + let y := x + mstore(0, f()) +} diff --git a/test/cmdlineTests/strict_asm_msize_with_optimizer/output b/test/cmdlineTests/strict_asm_msize_with_optimizer/output new file mode 100644 index 000000000000..fbc1e69fac24 --- /dev/null +++ b/test/cmdlineTests/strict_asm_msize_with_optimizer/output @@ -0,0 +1,14 @@ + +======= strict_asm_msize_with_optimizer/input.yul (EVM) ======= + +Pretty printed source: +object "object" { + code { { } } +} + + +Binary representation: +00 + +Text representation: + stop diff --git a/test/cmdlineTests/strict_asm_msize_without_optimizer/args b/test/cmdlineTests/strict_asm_msize_without_optimizer/args new file mode 100644 index 000000000000..7e891dd86b95 --- /dev/null +++ b/test/cmdlineTests/strict_asm_msize_without_optimizer/args @@ -0,0 +1 @@ +--strict-assembly --debug-info none diff --git a/test/cmdlineTests/strict_asm_msize_without_optimizer/input.yul b/test/cmdlineTests/strict_asm_msize_without_optimizer/input.yul new file mode 100644 index 000000000000..e787c40097c2 --- /dev/null +++ b/test/cmdlineTests/strict_asm_msize_without_optimizer/input.yul @@ -0,0 +1,13 @@ +{ + function f() -> x { + x := mload(0) + } + + // In pure Yul without optimizer presence of msize disables stack optimization. + // This file should remain untouched when passed through the optimizer. + pop(msize()) + + let x := 0 + let y := x + mstore(0, f()) +} diff --git a/test/cmdlineTests/strict_asm_msize_without_optimizer/output b/test/cmdlineTests/strict_asm_msize_without_optimizer/output new file mode 100644 index 000000000000..fabd2e874a5b --- /dev/null +++ b/test/cmdlineTests/strict_asm_msize_without_optimizer/output @@ -0,0 +1,40 @@ + +======= strict_asm_msize_without_optimizer/input.yul (EVM) ======= + +Pretty printed source: +object "object" { + code { + function f() -> x + { x := mload(0) } + pop(msize()) + let x := 0 + let y := x + mstore(0, f()) + } +} + + +Binary representation: +600b565b5f8051905090565b5f8060136003565b5f525050 + +Text representation: + jump(tag_2) +tag_1: + 0x00 + dup1 + mload + swap1 + pop + swap1 + jump // out +tag_2: + 0x00 + dup1 + tag_4 + tag_1 + jump // in +tag_4: + 0x00 + mstore + pop + pop diff --git a/test/cmdlineTests/viair_msize_without_optimizer/args b/test/cmdlineTests/viair_msize_without_optimizer/args new file mode 100644 index 000000000000..3b9da15f9798 --- /dev/null +++ b/test/cmdlineTests/viair_msize_without_optimizer/args @@ -0,0 +1 @@ +--via-ir --ir-optimized --asm --debug-info none diff --git a/test/cmdlineTests/viair_msize_without_optimizer/input.sol b/test/cmdlineTests/viair_msize_without_optimizer/input.sol new file mode 100644 index 000000000000..e70ba17fb224 --- /dev/null +++ b/test/cmdlineTests/viair_msize_without_optimizer/input.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C { + function f() pure public { + assembly ("memory-safe") { + function f() -> x { + x := mload(0) + } + + // Presence of msize disables all Yul optimizations, including the minimal steps or + // stack optimization that would normally be performed even with the optimizer nominally disabled. + // This block should remain untouched when passed through the optimizer. + pop(msize()) + + let x := 0 + let y := x + mstore(0, f()) + } + } +} diff --git a/test/cmdlineTests/viair_msize_without_optimizer/output b/test/cmdlineTests/viair_msize_without_optimizer/output new file mode 100644 index 000000000000..b54f8a3f5647 --- /dev/null +++ b/test/cmdlineTests/viair_msize_without_optimizer/output @@ -0,0 +1,261 @@ + +======= viair_msize_without_optimizer/input.sol:C ======= +EVM assembly: + mstore(0x40, 0x80) + jumpi(tag_4, iszero(callvalue)) + tag_5 + tag_2 + jump // in +tag_5: +tag_4: + tag_6 + tag_3 + jump // in +tag_6: + tag_7 + tag_1 + jump // in +tag_7: + dataSize(sub_0) + dataOffset(sub_0) + dup3 + codecopy + dataSize(sub_0) + dup2 + return +tag_1: + 0x00 + mload(0x40) + swap1 + pop + swap1 + jump // out +tag_2: + 0x00 + dup1 + revert +tag_3: + jump // out +stop + +sub_0: assembly { + mstore(0x40, 0x80) + jumpi(tag_10, lt(calldatasize, 0x04)) + tag_11 + calldataload(0x00) + tag_1 + jump // in + tag_11: + dup1 + 0x26121ff0 + dup2 + sub + tag_12 + jumpi + tag_14 + tag_7 + jump // in + tag_14: + tag_12: + pop + pop + tag_10: + tag_15 + tag_8 + jump // in + tag_15: + jump(tag_16) + tag_1: + 0x00 + dup2 + 0xe0 + shr + swap1 + pop + swap2 + swap1 + pop + jump // out + tag_2: + 0x00 + mload(0x40) + swap1 + pop + swap1 + jump // out + tag_3: + 0x00 + dup1 + revert + tag_4: + 0x00 + dup1 + revert + tag_5: + 0x00 + dup2 + dup4 + sub + slt + iszero + tag_22 + jumpi + tag_23 + tag_4 + jump // in + tag_23: + tag_22: + pop + pop + jump // out + tag_6: + 0x00 + dup1 + dup3 + add + swap1 + pop + swap2 + swap1 + pop + jump // out + tag_7: + jumpi(tag_26, iszero(callvalue)) + tag_27 + tag_3 + jump // in + tag_27: + tag_26: + tag_28 + calldatasize + 0x04 + tag_5 + jump // in + tag_28: + tag_29 + tag_9 + jump // in + tag_29: + tag_30 + tag_2 + jump // in + tag_30: + tag_31 + dup2 + tag_6 + jump // in + tag_31: + dup2 + dup2 + sub + dup3 + return + tag_8: + 0x00 + dup1 + revert + tag_9: + jump(tag_35) + tag_34: + 0x00 + dup1 + mload + swap1 + pop + swap1 + jump // out + tag_35: + 0x00 + dup1 + tag_37 + tag_34 + jump // in + tag_37: + 0x00 + mstore + pop + pop + jump // out + tag_16: + + auxdata: +} + +Optimized IR: +/// @use-src 0:"viair_msize_without_optimizer/input.sol" +object "C_7" { + code { + mstore(64, memoryguard(128)) + if callvalue() + { + revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + } + constructor_C_7() + let _1 := allocate_unbounded() + codecopy(_1, dataoffset("C_7_deployed"), datasize("C_7_deployed")) + return(_1, datasize("C_7_deployed")) + function allocate_unbounded() -> memPtr + { memPtr := mload(64) } + function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + { revert(0, 0) } + function constructor_C_7() + { } + } + /// @use-src 0:"viair_msize_without_optimizer/input.sol" + object "C_7_deployed" { + code { + mstore(64, memoryguard(128)) + if iszero(lt(calldatasize(), 4)) + { + let selector := shift_right_224_unsigned(calldataload(0)) + switch selector + case 0x26121ff0 { external_fun_f_6() } + default { } + } + revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() + function shift_right_224_unsigned(value) -> newValue + { newValue := shr(224, value) } + function allocate_unbounded() -> memPtr + { memPtr := mload(64) } + function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + { revert(0, 0) } + function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() + { revert(0, 0) } + function abi_decode_tuple_(headStart, dataEnd) + { + if slt(sub(dataEnd, headStart), 0) + { + revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() + } + } + function abi_encode_tuple__to__fromStack(headStart) -> tail + { tail := add(headStart, 0) } + function external_fun_f_6() + { + if callvalue() + { + revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + } + abi_decode_tuple_(4, calldatasize()) + fun_f_6() + let memPos := allocate_unbounded() + let memEnd := abi_encode_tuple__to__fromStack(memPos) + return(memPos, sub(memEnd, memPos)) + } + function revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() + { revert(0, 0) } + function fun_f_6() + { + { + function usr$f() -> usr$x + { usr$x := mload(0) } + pop(msize()) + let usr$x := 0 + let usr$y := usr$x + mstore(0, usr$f()) + } + } + } + data ".metadata" hex"" + } +} From dff774d82fcc045fbc4ae847f14e98162367ffcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 15 May 2023 14:19:40 +0200 Subject: [PATCH 058/138] Overload MSizeFinder::containsMSize() for Yul objects --- libyul/optimiser/Semantics.cpp | 13 +++++++++++++ libyul/optimiser/Semantics.h | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libyul/optimiser/Semantics.cpp b/libyul/optimiser/Semantics.cpp index 12349394a047..d87c20574382 100644 --- a/libyul/optimiser/Semantics.cpp +++ b/libyul/optimiser/Semantics.cpp @@ -94,6 +94,19 @@ bool MSizeFinder::containsMSize(Dialect const& _dialect, Block const& _ast) return finder.m_msizeFound; } +bool MSizeFinder::containsMSize(Dialect const& _dialect, Object const& _object) +{ + if (containsMSize(_dialect, *_object.code)) + return true; + + for (shared_ptr const& node: _object.subObjects) + if (auto const* object = dynamic_cast(node.get())) + if (containsMSize(_dialect, *object)) + return true; + + return false; +} + void MSizeFinder::operator()(FunctionCall const& _functionCall) { ASTWalker::operator()(_functionCall); diff --git a/libyul/optimiser/Semantics.h b/libyul/optimiser/Semantics.h index 32b9c9b582bc..762c80110618 100644 --- a/libyul/optimiser/Semantics.h +++ b/libyul/optimiser/Semantics.h @@ -21,10 +21,11 @@ #pragma once -#include +#include +#include #include +#include #include -#include #include @@ -143,6 +144,7 @@ class MSizeFinder: public ASTWalker { public: static bool containsMSize(Dialect const& _dialect, Block const& _ast); + static bool containsMSize(Dialect const& _dialect, Object const& _object); using ASTWalker::operator(); void operator()(FunctionCall const& _funCall) override; From 25be38905f78d52ebf06a2a42dfdeb7966eee523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 21 Apr 2023 15:14:03 +0200 Subject: [PATCH 059/138] YulStack: When Yul optimization is not requested, run Yul optimizer with a minimal sequence instead of disabling it --- Changelog.md | 1 + docs/using-the-compiler.rst | 2 +- libsolidity/interface/OptimiserSettings.h | 2 +- libyul/YulStack.cpp | 18 +++++++++++------- test/cmdlineTests/~assembler_modes/test.sh | 10 +++++----- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Changelog.md b/Changelog.md index c47ac3e47d46..9b70219969a9 100644 --- a/Changelog.md +++ b/Changelog.md @@ -11,6 +11,7 @@ Compiler Features: * Parser: Introduce ``pragma experimental solidity``, which will enable an experimental language mode that in particular has no stability guarantees between non-breaking releases and is not suited for production use. * Standard JSON Interface: Add ``ast`` file-level output for Yul input. * Standard JSON Interface: Add ``irAst`` and ``irOptimizedAst`` contract-level outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. + * Yul Optimizer: Stack-to-memory mover is now enabled by default whenever possible for via IR code generation and pure Yul compilation. Bugfixes: diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 3ef280a10566..6fb32871c8d6 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -304,7 +304,7 @@ Input Description // optimization-sequence:clean-up-sequence. For more information see // "The Optimizer > Selecting Optimizations". // This field is optional, and if not provided, the default sequences for both - // optimization and clean-up are used. If only one of the options is provivded + // optimization and clean-up are used. If only one of the sequences is provided // the other will not be run. // If only the delimiter ":" is provided then neither the optimization nor the clean-up // sequence will be run. diff --git a/libsolidity/interface/OptimiserSettings.h b/libsolidity/interface/OptimiserSettings.h index bae343f2d13d..8b0299c47dac 100644 --- a/libsolidity/interface/OptimiserSettings.h +++ b/libsolidity/interface/OptimiserSettings.h @@ -103,8 +103,8 @@ struct OptimiserSettings case OptimisationPreset::Minimal: return minimal(); case OptimisationPreset::Standard: return standard(); case OptimisationPreset::Full: return full(); - default: solAssert(false, ""); } + util::unreachable(); } bool operator==(OptimiserSettings const& _other) const diff --git a/libyul/YulStack.cpp b/libyul/YulStack.cpp index a4f9615646be..cc8fbc589d81 100644 --- a/libyul/YulStack.cpp +++ b/libyul/YulStack.cpp @@ -86,9 +86,6 @@ bool YulStack::parseAndAnalyze(std::string const& _sourceName, std::string const void YulStack::optimize() { - if (!m_optimiserSettings.runYulOptimiser) - return; - yulAssert(m_analysisSuccessful, "Analysis was not successful."); m_analysisSuccessful = false; @@ -159,13 +156,15 @@ void YulStack::optimize(Object& _object, bool _isCreation) unique_ptr meter; if (EVMDialect const* evmDialect = dynamic_cast(&dialect)) meter = make_unique(*evmDialect, _isCreation, m_optimiserSettings.expectedExecutionsPerDeployment); + OptimiserSuite::run( dialect, meter.get(), _object, - m_optimiserSettings.optimizeStackAllocation, - m_optimiserSettings.yulOptimiserSteps, - m_optimiserSettings.yulOptimiserCleanupSteps, + // Defaults are the minimum necessary to avoid running into "Stack too deep" constantly. + m_optimiserSettings.runYulOptimiser ? m_optimiserSettings.optimizeStackAllocation : true, + m_optimiserSettings.runYulOptimiser ? m_optimiserSettings.yulOptimiserSteps : "u", + m_optimiserSettings.runYulOptimiser ? m_optimiserSettings.yulOptimiserCleanupSteps : "", _isCreation ? nullopt : make_optional(m_optimiserSettings.expectedExecutionsPerDeployment), {} ); @@ -231,7 +230,12 @@ YulStack::assembleEVMWithDeployed(optional _deployName) const evmasm::Assembly assembly(m_evmVersion, true, {}); EthAssemblyAdapter adapter(assembly); - compileEVM(adapter, m_optimiserSettings.optimizeStackAllocation); + + // NOTE: We always need stack optimization when Yul optimizer is disabled. It being disabled + // just means that we don't use the full step sequence. We still run it with the minimal steps + // required to avoid "stack too deep". + bool optimize = m_optimiserSettings.optimizeStackAllocation || !m_optimiserSettings.runYulOptimiser; + compileEVM(adapter, optimize); assembly.optimise(evmasm::Assembly::OptimiserSettings::translateSettings(m_optimiserSettings, m_evmVersion)); diff --git a/test/cmdlineTests/~assembler_modes/test.sh b/test/cmdlineTests/~assembler_modes/test.sh index 34e899328604..5ca1bb40f82b 100755 --- a/test/cmdlineTests/~assembler_modes/test.sh +++ b/test/cmdlineTests/~assembler_modes/test.sh @@ -36,8 +36,8 @@ echo '{}' | "$SOLC" - --yul --optimize &>/dev/null && fail "solc --yul --optimiz # Test yul and strict assembly output # Non-empty code results in non-empty binary representation with optimizations turned off, # while it results in empty binary representation with optimizations turned on. -test_solc_assembly_output "{ let x:u256 := 0:u256 }" "{ let x := 0 }" "--yul" -test_solc_assembly_output "{ let x:u256 := bitnot(7:u256) }" "{ let x := bitnot(7) }" "--yul" -test_solc_assembly_output "{ let t:bool := not(true) }" "{ let t:bool := not(true) }" "--yul" -test_solc_assembly_output "{ let x := 0 }" "{ let x := 0 }" "--strict-assembly" -test_solc_assembly_output "{ let x := 0 }" "{ { } }" "--strict-assembly --optimize" +test_solc_assembly_output "{ let x:u256 := 0:u256 mstore(0, x) }" "{ { let x := 0 mstore(0, x) } }" "--yul" +test_solc_assembly_output "{ let x:u256 := bitnot(7:u256) mstore(0, x) }" "{ { let x := bitnot(7) mstore(0, x) } }" "--yul" +test_solc_assembly_output "{ let t:bool := not(true) if t { mstore(0, 1) } }" "{ { let t:bool := not(true) if t { mstore(0, 1) } } }" "--yul" +test_solc_assembly_output "{ let x := 0 mstore(0, x) }" "{ { let x := 0 mstore(0, x) } }" "--strict-assembly" +test_solc_assembly_output "{ let x := 0 mstore(0, x) }" "{ { } }" "--strict-assembly --optimize" From 51cd87c94d0fa2374551e92a0368db60891491e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 15 May 2023 14:20:56 +0200 Subject: [PATCH 060/138] YulStack: Don't enable stack optimizations in unoptimized mode when msize is present --- libyul/YulStack.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libyul/YulStack.cpp b/libyul/YulStack.cpp index cc8fbc589d81..66acc3f60eb6 100644 --- a/libyul/YulStack.cpp +++ b/libyul/YulStack.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -87,6 +88,13 @@ bool YulStack::parseAndAnalyze(std::string const& _sourceName, std::string const void YulStack::optimize() { yulAssert(m_analysisSuccessful, "Analysis was not successful."); + yulAssert(m_parserResult); + + if ( + !m_optimiserSettings.runYulOptimiser && + yul::MSizeFinder::containsMSize(languageToDialect(m_language, m_evmVersion), *m_parserResult) + ) + return; m_analysisSuccessful = false; yulAssert(m_parserResult, ""); @@ -231,10 +239,13 @@ YulStack::assembleEVMWithDeployed(optional _deployName) const evmasm::Assembly assembly(m_evmVersion, true, {}); EthAssemblyAdapter adapter(assembly); - // NOTE: We always need stack optimization when Yul optimizer is disabled. It being disabled - // just means that we don't use the full step sequence. We still run it with the minimal steps - // required to avoid "stack too deep". - bool optimize = m_optimiserSettings.optimizeStackAllocation || !m_optimiserSettings.runYulOptimiser; + // NOTE: We always need stack optimization when Yul optimizer is disabled (unless code contains + // msize). It being disabled just means that we don't use the full step sequence. We still run + // it with the minimal steps required to avoid "stack too deep". + bool optimize = m_optimiserSettings.optimizeStackAllocation || ( + !m_optimiserSettings.runYulOptimiser && + !yul::MSizeFinder::containsMSize(languageToDialect(m_language, m_evmVersion), *m_parserResult) + ); compileEVM(adapter, optimize); assembly.optimise(evmasm::Assembly::OptimiserSettings::translateSettings(m_optimiserSettings, m_evmVersion)); From 5e32a728fe796111146322e63906c39739d7a24a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 16 May 2023 11:40:04 +0200 Subject: [PATCH 061/138] Update test expectations --- .../output | 130 ++-- .../linking_strict_assembly/output | 12 +- .../output | 11 +- .../output | 11 +- .../output | 21 +- .../output | 21 +- .../output | 11 +- .../output | 11 +- .../output | 21 +- .../output.json | 648 +++++++----------- .../output.json | 53 +- test/cmdlineTests/standard_yul/output.json | 18 +- .../output.json | 3 +- .../output.json | 3 +- .../output.json | 3 +- .../standard_yul_object/output.json | 17 +- .../standard_yul_object_name/output.json | 22 +- .../strict_asm_ast_compact_json/output | 104 ++- .../strict_asm_debug_info_print_all/output | 15 +- .../output | 15 +- .../strict_asm_debug_info_print_none/output | 13 +- .../yul_function_name_clashes/output | 60 +- .../output | 92 +-- test/libyul/objectCompiler/data.yul | 8 +- test/libyul/objectCompiler/datacopy.yul | 6 +- .../libyul/objectCompiler/dataoffset_code.yul | 10 +- .../libyul/objectCompiler/dataoffset_data.yul | 8 +- .../libyul/objectCompiler/dataoffset_self.yul | 8 +- test/libyul/objectCompiler/datasize_code.yul | 10 +- test/libyul/objectCompiler/datasize_data.yul | 8 +- test/libyul/objectCompiler/datasize_self.yul | 8 +- ..._long_name_does_not_end_up_in_bytecode.yul | 8 +- test/libyul/objectCompiler/linkersymbol.yul | 34 +- test/libyul/objectCompiler/metadata.yul | 19 +- test/libyul/objectCompiler/namedObject.yul | 6 +- .../libyul/objectCompiler/namedObjectCode.yul | 8 +- test/libyul/objectCompiler/simple.yul | 8 +- test/libyul/objectCompiler/smoke.yul | 6 +- .../libyul/objectCompiler/sourceLocations.yul | 5 +- test/libyul/objectCompiler/subObject.yul | 10 +- .../libyul/objectCompiler/subObjectAccess.yul | 54 +- test/libyul/objectCompiler/subSubObject.yul | 12 +- 42 files changed, 674 insertions(+), 877 deletions(-) diff --git a/test/cmdlineTests/inline_assembly_function_name_clash/output b/test/cmdlineTests/inline_assembly_function_name_clash/output index 889514d96a32..8becb87ae06f 100644 --- a/test/cmdlineTests/inline_assembly_function_name_clash/output +++ b/test/cmdlineTests/inline_assembly_function_name_clash/output @@ -5,171 +5,201 @@ { "function-debug-runtime": { - "abi_decode_tuple_": + "abi_decode": { - "entryPoint": 117, + "entryPoint": 80, "parameterSlots": 2, "returnSlots": 0 }, - "abi_encode_t_uint256_to_t_uint256_fromStack": + "abi_encode_uint256": { - "entryPoint": 149, + "entryPoint": 111, "parameterSlots": 2, - "returnSlots": 0 + "returnSlots": 1 }, - "abi_encode_tuple_t_uint256__to_t_uint256__fromStack": + "abi_encode_uint256_to_uint256": { - "entryPoint": 164, + "entryPoint": 98, "parameterSlots": 2, - "returnSlots": 1 + "returnSlots": 0 }, "allocate_unbounded": { - "entryPoint": 100, + "entryPoint": 66, "parameterSlots": 0, "returnSlots": 1 }, - "cleanup_t_uint256": + "cleanup_uint256": { - "entryPoint": 140, + "entryPoint": 95, "parameterSlots": 1, "returnSlots": 1 }, - "convert_t_uint256_to_t_uint256": + "convert_uint256_to_uint256": { - "entryPoint": 398, + "entryPoint": 276, "parameterSlots": 1, "returnSlots": 1 }, - "external_fun_f_25": + "external_fun_f": { - "entryPoint": 189, + "entryPoint": 132, "parameterSlots": 0, "returnSlots": 0 }, - "external_fun_g_36": + "external_fun_g": { - "entryPoint": 247, + "entryPoint": 185, "parameterSlots": 0, "returnSlots": 0 }, - "fun_f_25": + "fun_f": { - "entryPoint": 653, + "entryPoint": 442, "id": 25, "parameterSlots": 0, "returnSlots": 1 }, - "fun_f_25_inner": + "fun_f_inner": { - "entryPoint": 621, + "entryPoint": 430, "parameterSlots": 1, "returnSlots": 1 }, - "fun_g_36": + "fun_g": { - "entryPoint": 858, + "entryPoint": 564, "id": 36, "parameterSlots": 0, "returnSlots": 1 }, - "fun_g_36_inner": + "fun_g_inner": { - "entryPoint": 826, + "entryPoint": 552, "parameterSlots": 1, "returnSlots": 1 }, "identity": { - "entryPoint": 389, + "entryPoint": 273, "parameterSlots": 1, "returnSlots": 1 }, - "modifier_m_17": + "modifier_m": { - "entryPoint": 475, + "entryPoint": 509, "id": 14, "parameterSlots": 1, "returnSlots": 1 }, - "modifier_m_19": + "modifier_m_17": { - "entryPoint": 548, + "entryPoint": 344, "id": 14, "parameterSlots": 1, "returnSlots": 1 }, - "modifier_m_28": + "modifier_m_19": { - "entryPoint": 680, + "entryPoint": 387, "id": 14, "parameterSlots": 1, "returnSlots": 1 }, - "modifier_m_30": + "modifier_m_28": { - "entryPoint": 753, + "entryPoint": 466, "id": 14, "parameterSlots": 1, "returnSlots": 1 }, - "prepare_store_t_uint256": + "prepare_store_uint256": { - "entryPoint": 431, + "entryPoint": 304, "parameterSlots": 1, "returnSlots": 1 }, "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { - "entryPoint": 305, + "entryPoint": 238, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { - "entryPoint": 109, + "entryPoint": 72, "parameterSlots": 0, "returnSlots": 0 }, "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { - "entryPoint": 113, + "entryPoint": 76, "parameterSlots": 0, "returnSlots": 0 }, - "shift_left_0": + "shift_left": { - "entryPoint": 313, + "entryPoint": 246, "parameterSlots": 1, "returnSlots": 1 }, - "shift_right_224_unsigned": + "shift_right_unsigned": { - "entryPoint": 88, + "entryPoint": 60, "parameterSlots": 1, "returnSlots": 1 }, - "update_byte_slice_32_shift_0": + "update_byte_slice_shift": { - "entryPoint": 324, + "entryPoint": 251, "parameterSlots": 2, "returnSlots": 1 }, - "update_storage_value_offset_0t_uint256_to_t_uint256": + "update_storage_value_offsett_uint256_to_uint256": { - "entryPoint": 440, + "entryPoint": 307, "parameterSlots": 2, "returnSlots": 0 }, "usr$f": { - "entryPoint": 496, + "entryPoint": 339, + "parameterSlots": 0, + "returnSlots": 1 + }, + "usr$f_17": + { + "entryPoint": 382, + "parameterSlots": 0, + "returnSlots": 1 + }, + "usr$f_22": + { + "entryPoint": 425, + "parameterSlots": 0, + "returnSlots": 1 + }, + "usr$f_26": + { + "entryPoint": 461, + "parameterSlots": 0, + "returnSlots": 1 + }, + "usr$f_32": + { + "entryPoint": 504, + "parameterSlots": 0, + "returnSlots": 1 + }, + "usr$f_37": + { + "entryPoint": 547, "parameterSlots": 0, "returnSlots": 1 }, - "zero_value_for_split_t_uint256": + "zero_value_for_split_uint256": { - "entryPoint": 309, + "entryPoint": 242, "parameterSlots": 0, "returnSlots": 1 } diff --git a/test/cmdlineTests/linking_strict_assembly/output b/test/cmdlineTests/linking_strict_assembly/output index 520b3cf7bb39..29a8abdfaea8 100644 --- a/test/cmdlineTests/linking_strict_assembly/output +++ b/test/cmdlineTests/linking_strict_assembly/output @@ -4,23 +4,23 @@ Pretty printed source: object "a" { code { - let addr := linkersymbol("contract/test.sol:L") - sstore(0, addr) + { + let addr := linkersymbol("contract/test.sol:L") + sstore(0, addr) + } } } Binary representation: -731234567890123456789012345678901234567890805f5550 +7312345678901234567890123456789012345678905f5500 Text representation: /* "linking_strict_assembly/input.yul":44:79 */ linkerSymbol("f919ba91ac99f96129544b80b9516b27a80e376b9dc693819d0b18b7e0395612") - /* "linking_strict_assembly/input.yul":98:102 */ - dup1 /* "linking_strict_assembly/input.yul":95:96 */ 0x00 /* "linking_strict_assembly/input.yul":88:103 */ sstore /* "linking_strict_assembly/input.yul":22:109 */ - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_qualified_library_qualified_reference/output b/test/cmdlineTests/linking_strict_assembly_qualified_library_qualified_reference/output index a919ba72ec52..e4fa4fcbd9ab 100644 --- a/test/cmdlineTests/linking_strict_assembly_qualified_library_qualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_qualified_library_qualified_reference/output @@ -4,18 +4,19 @@ Pretty printed source: object "a" { code { - let addr := linkersymbol(":L") - sstore(0, addr) + { + let addr := linkersymbol(":L") + sstore(0, addr) + } } } Binary representation: -731234567890123456789012345678901234567890805f5550 +7312345678901234567890123456789012345678905f5500 Text representation: linkerSymbol("20a18a9bf97d889dcf77111b674da319a4e9e3e05d3f4df9e0bf5c588dd4f0f8") - dup1 0x00 sstore - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_qualified_library_unqualified_reference/output b/test/cmdlineTests/linking_strict_assembly_qualified_library_unqualified_reference/output index 660876888abe..ebf7f6542c52 100644 --- a/test/cmdlineTests/linking_strict_assembly_qualified_library_unqualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_qualified_library_unqualified_reference/output @@ -4,18 +4,19 @@ Pretty printed source: object "a" { code { - let addr := linkersymbol("L") - sstore(0, addr) + { + let addr := linkersymbol("L") + sstore(0, addr) + } } } Binary representation: -73__$8aa64f937099b65a4febc243a5ae0f2d64$__805f5550 +73__$8aa64f937099b65a4febc243a5ae0f2d64$__5f5500 Text representation: linkerSymbol("8aa64f937099b65a4febc243a5ae0f2d6416bb9e473c30dd29c1ee498fb7c5a8") - dup1 0x00 sstore - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files/output b/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files/output index 5babd2279d86..4aecfc6b26b1 100644 --- a/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files/output +++ b/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files/output @@ -4,34 +4,33 @@ Pretty printed source: object "a" { code { - let addr1 := linkersymbol("library1.sol:L") - let addr2 := linkersymbol("library2.sol:L") - sstore(0, addr1) - sstore(1, addr2) + { + let addr1 := linkersymbol("library1.sol:L") + let addr2 := linkersymbol("library2.sol:L") + sstore(0, addr1) + sstore(1, addr2) + } } } Binary representation: -731111111111111111111111111111111111111111732222222222222222222222222222222222222222815f55806001555050 +731111111111111111111111111111111111111111732222222222222222222222222222222222222222905f5560015500 Text representation: /* "linking_strict_assembly_same_library_name_different_files/input.yul":45:75 */ linkerSymbol("f3ffc10c396a7cc41ae954b050792839d20947bf73497d30c49a9fda1ea477ec") /* "linking_strict_assembly_same_library_name_different_files/input.yul":97:127 */ linkerSymbol("c3523432985587641d17c68161d2f700c57aaf4ed21cda4f25d76193c831f97f") - /* "linking_strict_assembly_same_library_name_different_files/input.yul":146:151 */ - dup2 + /* "linking_strict_assembly_same_library_name_different_files/input.yul":136:152 */ + swap1 /* "linking_strict_assembly_same_library_name_different_files/input.yul":143:144 */ 0x00 /* "linking_strict_assembly_same_library_name_different_files/input.yul":136:152 */ sstore - /* "linking_strict_assembly_same_library_name_different_files/input.yul":171:176 */ - dup1 /* "linking_strict_assembly_same_library_name_different_files/input.yul":168:169 */ 0x01 /* "linking_strict_assembly_same_library_name_different_files/input.yul":161:177 */ sstore /* "linking_strict_assembly_same_library_name_different_files/input.yul":22:183 */ - pop - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files_in_link_references/output b/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files_in_link_references/output index 0eba8cf84852..10a7fe7fe067 100644 --- a/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files_in_link_references/output +++ b/test/cmdlineTests/linking_strict_assembly_same_library_name_different_files_in_link_references/output @@ -4,34 +4,33 @@ Pretty printed source: object "a" { code { - let addr1 := linkersymbol("library1.sol:L") - let addr2 := linkersymbol("library2.sol:L") - sstore(0, addr1) - sstore(1, addr2) + { + let addr1 := linkersymbol("library1.sol:L") + let addr2 := linkersymbol("library2.sol:L") + sstore(0, addr1) + sstore(1, addr2) + } } } Binary representation: -73123456789012345678901234567890123456789073__$c3523432985587641d17c68161d2f700c5$__815f55806001555050 +73123456789012345678901234567890123456789073__$c3523432985587641d17c68161d2f700c5$__905f5560015500 Text representation: /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":45:75 */ linkerSymbol("f3ffc10c396a7cc41ae954b050792839d20947bf73497d30c49a9fda1ea477ec") /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":97:127 */ linkerSymbol("c3523432985587641d17c68161d2f700c57aaf4ed21cda4f25d76193c831f97f") - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":146:151 */ - dup2 + /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":136:152 */ + swap1 /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":143:144 */ 0x00 /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":136:152 */ sstore - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":171:176 */ - dup1 /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":168:169 */ 0x01 /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":161:177 */ sstore /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":22:183 */ - pop - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_unqualified_library_qualified_reference/output b/test/cmdlineTests/linking_strict_assembly_unqualified_library_qualified_reference/output index 71d19f7aeb83..aaf03d0733b4 100644 --- a/test/cmdlineTests/linking_strict_assembly_unqualified_library_qualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_unqualified_library_qualified_reference/output @@ -4,18 +4,19 @@ Pretty printed source: object "a" { code { - let addr := linkersymbol(":L") - sstore(0, addr) + { + let addr := linkersymbol(":L") + sstore(0, addr) + } } } Binary representation: -73__$20a18a9bf97d889dcf77111b674da319a4$__805f5550 +73__$20a18a9bf97d889dcf77111b674da319a4$__5f5500 Text representation: linkerSymbol("20a18a9bf97d889dcf77111b674da319a4e9e3e05d3f4df9e0bf5c588dd4f0f8") - dup1 0x00 sstore - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_unqualified_library_unqualified_reference/output b/test/cmdlineTests/linking_strict_assembly_unqualified_library_unqualified_reference/output index 6f3ee5eb75e0..d91d89f5ca69 100644 --- a/test/cmdlineTests/linking_strict_assembly_unqualified_library_unqualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_unqualified_library_unqualified_reference/output @@ -4,18 +4,19 @@ Pretty printed source: object "a" { code { - let addr := linkersymbol("L") - sstore(0, addr) + { + let addr := linkersymbol("L") + sstore(0, addr) + } } } Binary representation: -731234567890123456789012345678901234567890805f5550 +7312345678901234567890123456789012345678905f5500 Text representation: linkerSymbol("8aa64f937099b65a4febc243a5ae0f2d6416bb9e473c30dd29c1ee498fb7c5a8") - dup1 0x00 sstore - pop + stop diff --git a/test/cmdlineTests/linking_strict_assembly_unresolved_references/output b/test/cmdlineTests/linking_strict_assembly_unresolved_references/output index bc2e167b3351..a110db5a3e4e 100644 --- a/test/cmdlineTests/linking_strict_assembly_unresolved_references/output +++ b/test/cmdlineTests/linking_strict_assembly_unresolved_references/output @@ -4,34 +4,33 @@ Pretty printed source: object "a" { code { - let addr1 := linkersymbol("contract/test.sol:L1") - let addr2 := linkersymbol("contract/test.sol:L2") - sstore(0, addr1) - sstore(1, addr2) + { + let addr1 := linkersymbol("contract/test.sol:L1") + let addr2 := linkersymbol("contract/test.sol:L2") + sstore(0, addr1) + sstore(1, addr2) + } } } Binary representation: -73123456789012345678901234567890123456789073__$fb58009a6b1ecea3b9d99bedd645df4ec3$__815f55806001555050 +73123456789012345678901234567890123456789073__$fb58009a6b1ecea3b9d99bedd645df4ec3$__905f5560015500 Text representation: /* "linking_strict_assembly_unresolved_references/input.yul":45:81 */ linkerSymbol("05b0326038374a21e0895480a58bda0768cdcc04c8d18f154362d1ca5223d245") /* "linking_strict_assembly_unresolved_references/input.yul":103:139 */ linkerSymbol("fb58009a6b1ecea3b9d99bedd645df4ec308f17bc0087e5f39d078f77f809177") - /* "linking_strict_assembly_unresolved_references/input.yul":158:163 */ - dup2 + /* "linking_strict_assembly_unresolved_references/input.yul":148:164 */ + swap1 /* "linking_strict_assembly_unresolved_references/input.yul":155:156 */ 0x00 /* "linking_strict_assembly_unresolved_references/input.yul":148:164 */ sstore - /* "linking_strict_assembly_unresolved_references/input.yul":183:188 */ - dup1 /* "linking_strict_assembly_unresolved_references/input.yul":180:181 */ 0x01 /* "linking_strict_assembly_unresolved_references/input.yul":173:189 */ sstore /* "linking_strict_assembly_unresolved_references/input.yul":22:195 */ - pop - pop + stop diff --git a/test/cmdlineTests/standard_irOptimized_ast_requested/output.json b/test/cmdlineTests/standard_irOptimized_ast_requested/output.json index ed7138c8f423..200b653ff443 100644 --- a/test/cmdlineTests/standard_irOptimized_ast_requested/output.json +++ b/test/cmdlineTests/standard_irOptimized_ast_requested/output.json @@ -17,277 +17,266 @@ "statements": [ { - "expression": - { - "arguments": - [ - { - "kind": "number", - "nativeSrc": "103:2:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "64" - }, + "nativeSrc": "44:790:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": { "arguments": [ { "kind": "number", - "nativeSrc": "119:3:0", + "nativeSrc": "103:2:0", "nodeType": "YulLiteral", "src": "56:13:0", "type": "", - "value": "128" + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "119:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0x80" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "107:11:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "107:16:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" } ], "functionName": { - "name": "memoryguard", - "nativeSrc": "107:11:0", + "name": "mstore", + "nativeSrc": "96:6:0", "nodeType": "YulIdentifier", "src": "56:13:0" }, - "nativeSrc": "107:16:0", + "nativeSrc": "96:28:0", "nodeType": "YulFunctionCall", "src": "56:13:0" - } - ], - "functionName": - { - "name": "mstore", - "nativeSrc": "96:6:0", - "nodeType": "YulIdentifier", + }, + "nativeSrc": "96:28:0", + "nodeType": "YulExpressionStatement", "src": "56:13:0" }, - "nativeSrc": "96:28:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "96:28:0", - "nodeType": "YulExpressionStatement", - "src": "56:13:0" - }, - { - "body": - { - "nativeSrc": "148:83:0", - "nodeType": "YulBlock", - "src": "56:13:0", - "statements": - [ + { + "body": { - "expression": - { - "arguments": [], - "functionName": + "nativeSrc": "148:83:0", + "nodeType": "YulBlock", + "src": "56:13:0", + "statements": + [ { - "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", - "nativeSrc": "150:77:0", - "nodeType": "YulIdentifier", + "expression": + { + "arguments": [], + "functionName": + { + "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", + "nativeSrc": "150:77:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "150:79:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "150:79:0", + "nodeType": "YulExpressionStatement", "src": "56:13:0" - }, - "nativeSrc": "150:79:0", - "nodeType": "YulFunctionCall", + } + ] + }, + "condition": + { + "arguments": [], + "functionName": + { + "name": "callvalue", + "nativeSrc": "136:9:0", + "nodeType": "YulIdentifier", "src": "56:13:0" }, - "nativeSrc": "150:79:0", - "nodeType": "YulExpressionStatement", + "nativeSrc": "136:11:0", + "nodeType": "YulFunctionCall", "src": "56:13:0" - } - ] - }, - "condition": - { - "arguments": [], - "functionName": - { - "name": "callvalue", - "nativeSrc": "136:9:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, - "nativeSrc": "136:11:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "133:98:0", - "nodeType": "YulIf", - "src": "56:13:0" - }, - { - "expression": - { - "arguments": [], - "functionName": - { - "name": "constructor_C_2", - "nativeSrc": "241:15:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, - "nativeSrc": "241:17:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "241:17:0", - "nodeType": "YulExpressionStatement", - "src": "56:13:0" - }, - { - "nativeSrc": "268:30:0", - "nodeType": "YulVariableDeclaration", - "src": "56:13:0", - "value": - { - "arguments": [], - "functionName": - { - "name": "allocate_unbounded", - "nativeSrc": "278:18:0", - "nodeType": "YulIdentifier", + }, + "nativeSrc": "133:98:0", + "nodeType": "YulIf", "src": "56:13:0" }, - "nativeSrc": "278:20:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "variables": - [ { - "name": "_1", - "nativeSrc": "272:2:0", - "nodeType": "YulTypedName", + "nativeSrc": "268:30:0", + "nodeType": "YulVariableDeclaration", "src": "56:13:0", - "type": "" - } - ] - }, - { - "expression": - { - "arguments": - [ + "value": { - "name": "_1", - "nativeSrc": "316:2:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, - { - "arguments": - [ - { - "hexValue": "435f325f6465706c6f796564", - "kind": "string", - "nativeSrc": "331:14:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "C_2_deployed" - } - ], + "arguments": [], "functionName": { - "name": "dataoffset", - "nativeSrc": "320:10:0", + "name": "allocate_unbounded", + "nativeSrc": "278:18:0", "nodeType": "YulIdentifier", "src": "56:13:0" }, - "nativeSrc": "320:26:0", + "nativeSrc": "278:20:0", "nodeType": "YulFunctionCall", "src": "56:13:0" }, + "variables": + [ + { + "name": "_1", + "nativeSrc": "272:2:0", + "nodeType": "YulTypedName", + "src": "56:13:0", + "type": "" + } + ] + }, + { + "expression": { "arguments": [ { - "hexValue": "435f325f6465706c6f796564", - "kind": "string", - "nativeSrc": "357:14:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "C_2_deployed" + "name": "_1", + "nativeSrc": "316:2:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "331:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "dataoffset", + "nativeSrc": "320:10:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "320:26:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "357:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "348:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "348:24:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" } ], "functionName": { - "name": "datasize", - "nativeSrc": "348:8:0", + "name": "codecopy", + "nativeSrc": "307:8:0", "nodeType": "YulIdentifier", "src": "56:13:0" }, - "nativeSrc": "348:24:0", + "nativeSrc": "307:66:0", "nodeType": "YulFunctionCall", "src": "56:13:0" - } - ], - "functionName": - { - "name": "codecopy", - "nativeSrc": "307:8:0", - "nodeType": "YulIdentifier", + }, + "nativeSrc": "307:66:0", + "nodeType": "YulExpressionStatement", "src": "56:13:0" }, - "nativeSrc": "307:66:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "307:66:0", - "nodeType": "YulExpressionStatement", - "src": "56:13:0" - }, - { - "expression": - { - "arguments": - [ - { - "name": "_1", - "nativeSrc": "390:2:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, + { + "expression": { "arguments": [ { - "hexValue": "435f325f6465706c6f796564", - "kind": "string", - "nativeSrc": "403:14:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "C_2_deployed" + "name": "_1", + "nativeSrc": "390:2:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + { + "arguments": + [ + { + "hexValue": "435f325f6465706c6f796564", + "kind": "string", + "nativeSrc": "403:14:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "C_2_deployed" + } + ], + "functionName": + { + "name": "datasize", + "nativeSrc": "394:8:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "394:24:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" } ], "functionName": { - "name": "datasize", - "nativeSrc": "394:8:0", + "name": "return", + "nativeSrc": "383:6:0", "nodeType": "YulIdentifier", "src": "56:13:0" }, - "nativeSrc": "394:24:0", + "nativeSrc": "383:36:0", "nodeType": "YulFunctionCall", "src": "56:13:0" - } - ], - "functionName": - { - "name": "return", - "nativeSrc": "383:6:0", - "nodeType": "YulIdentifier", + }, + "nativeSrc": "383:36:0", + "nodeType": "YulExpressionStatement", "src": "56:13:0" - }, - "nativeSrc": "383:36:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "383:36:0", - "nodeType": "YulExpressionStatement", - "src": "56:13:0" + } + ] }, { "body": @@ -403,19 +392,6 @@ "nativeSrc": "522:125:0", "nodeType": "YulFunctionDefinition", "src": "56:13:0" - }, - { - "body": - { - "nativeSrc": "726:59:0", - "nodeType": "YulBlock", - "src": "56:13:0", - "statements": [] - }, - "name": "constructor_C_2", - "nativeSrc": "699:86:0", - "nodeType": "YulFunctionDefinition", - "src": "56:13:0" } ] }, @@ -436,217 +412,83 @@ "statements": [ { - "expression": - { - "arguments": - [ - { - "kind": "number", - "nativeSrc": "966:2:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "64" - }, + "nativeSrc": "899:588:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": { "arguments": [ { "kind": "number", - "nativeSrc": "982:3:0", + "nativeSrc": "966:2:0", "nodeType": "YulLiteral", "src": "56:13:0", "type": "", - "value": "128" + "value": "64" + }, + { + "arguments": + [ + { + "kind": "number", + "nativeSrc": "982:3:0", + "nodeType": "YulLiteral", + "src": "56:13:0", + "type": "", + "value": "0x80" + } + ], + "functionName": + { + "name": "memoryguard", + "nativeSrc": "970:11:0", + "nodeType": "YulIdentifier", + "src": "56:13:0" + }, + "nativeSrc": "970:16:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" } ], "functionName": { - "name": "memoryguard", - "nativeSrc": "970:11:0", + "name": "mstore", + "nativeSrc": "959:6:0", "nodeType": "YulIdentifier", "src": "56:13:0" }, - "nativeSrc": "970:16:0", + "nativeSrc": "959:28:0", "nodeType": "YulFunctionCall", "src": "56:13:0" - } - ], - "functionName": - { - "name": "mstore", - "nativeSrc": "959:6:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, - "nativeSrc": "959:28:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "959:28:0", - "nodeType": "YulExpressionStatement", - "src": "56:13:0" - }, - { - "expression": - { - "arguments": [], - "functionName": - { - "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", - "nativeSrc": "1001:77:0", - "nodeType": "YulIdentifier", + }, + "nativeSrc": "959:28:0", + "nodeType": "YulExpressionStatement", "src": "56:13:0" }, - "nativeSrc": "1001:79:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "nativeSrc": "1001:79:0", - "nodeType": "YulExpressionStatement", - "src": "56:13:0" - }, - { - "body": - { - "nativeSrc": "1147:77:0", - "nodeType": "YulBlock", - "src": "56:13:0", - "statements": - [ - { - "nativeSrc": "1165:44:0", - "nodeType": "YulAssignment", - "src": "56:13:0", - "value": - { - "arguments": - [ - { - "kind": "number", - "nativeSrc": "1198:3:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "224" - }, - { - "name": "value", - "nativeSrc": "1203:5:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - } - ], - "functionName": - { - "name": "shr", - "nativeSrc": "1194:3:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, - "nativeSrc": "1194:15:0", - "nodeType": "YulFunctionCall", - "src": "56:13:0" - }, - "variableNames": - [ - { - "name": "newValue", - "nativeSrc": "1165:8:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - } - ] - } - ] - }, - "name": "shift_right_224_unsigned", - "nativeSrc": "1094:130:0", - "nodeType": "YulFunctionDefinition", - "parameters": - [ { - "name": "value", - "nativeSrc": "1128:5:0", - "nodeType": "YulTypedName", - "src": "56:13:0", - "type": "" - } - ], - "returnVariables": - [ - { - "name": "newValue", - "nativeSrc": "1138:8:0", - "nodeType": "YulTypedName", - "src": "56:13:0", - "type": "" - } - ], - "src": "56:13:0" - }, - { - "body": - { - "nativeSrc": "1278:51:0", - "nodeType": "YulBlock", - "src": "56:13:0", - "statements": - [ + "expression": { - "nativeSrc": "1296:19:0", - "nodeType": "YulAssignment", - "src": "56:13:0", - "value": + "arguments": [], + "functionName": { - "arguments": - [ - { - "kind": "number", - "nativeSrc": "1312:2:0", - "nodeType": "YulLiteral", - "src": "56:13:0", - "type": "", - "value": "64" - } - ], - "functionName": - { - "name": "mload", - "nativeSrc": "1306:5:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - }, - "nativeSrc": "1306:9:0", - "nodeType": "YulFunctionCall", + "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", + "nativeSrc": "1001:77:0", + "nodeType": "YulIdentifier", "src": "56:13:0" }, - "variableNames": - [ - { - "name": "memPtr", - "nativeSrc": "1296:6:0", - "nodeType": "YulIdentifier", - "src": "56:13:0" - } - ] - } - ] - }, - "name": "allocate_unbounded", - "nativeSrc": "1238:91:0", - "nodeType": "YulFunctionDefinition", - "returnVariables": - [ - { - "name": "memPtr", - "nativeSrc": "1271:6:0", - "nodeType": "YulTypedName", - "src": "56:13:0", - "type": "" + "nativeSrc": "1001:79:0", + "nodeType": "YulFunctionCall", + "src": "56:13:0" + }, + "nativeSrc": "1001:79:0", + "nodeType": "YulExpressionStatement", + "src": "56:13:0" } - ], - "src": "56:13:0" + ] }, { "body": diff --git a/test/cmdlineTests/standard_irOptimized_requested/output.json b/test/cmdlineTests/standard_irOptimized_requested/output.json index b3a27c5ca57c..88ce6489578e 100644 --- a/test/cmdlineTests/standard_irOptimized_requested/output.json +++ b/test/cmdlineTests/standard_irOptimized_requested/output.json @@ -8,37 +8,38 @@ "irOptimized": "/// @use-src 0:\"A\" object \"C_7\" { code { - /// @src 0:79:121 \"contract C { function f() public pure {} }\" - mstore(64, memoryguard(128)) - if callvalue() { - revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + /// @src 0:79:121 \"contract C { function f() public pure {} }\" + mstore(64, memoryguard(0x80)) + if callvalue() + { + revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + } + let _1 := allocate_unbounded() + codecopy(_1, dataoffset(\"C_7_deployed\"), datasize(\"C_7_deployed\")) + return(_1, datasize(\"C_7_deployed\")) } - constructor_C_7() - let _1 := allocate_unbounded() - codecopy(_1, dataoffset(\"C_7_deployed\"), datasize(\"C_7_deployed\")) - return(_1, datasize(\"C_7_deployed\")) function allocate_unbounded() -> memPtr { memPtr := mload(64) } function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() { revert(0, 0) } - function constructor_C_7() - { } } /// @use-src 0:\"A\" object \"C_7_deployed\" { code { - /// @src 0:79:121 \"contract C { function f() public pure {} }\" - mstore(64, memoryguard(128)) - if iszero(lt(calldatasize(), 4)) { - let selector := shift_right_224_unsigned(calldataload(0)) - switch selector - case 0x26121ff0 { external_fun_f_6() } - default { } + /// @src 0:79:121 \"contract C { function f() public pure {} }\" + mstore(64, memoryguard(0x80)) + if iszero(lt(calldatasize(), 4)) + { + let selector := shift_right_unsigned(calldataload(0)) + switch selector + case 0x26121ff0 { external_fun_f() } + default { } + } + revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() } - revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() - function shift_right_224_unsigned(value) -> newValue + function shift_right_unsigned(value) -> newValue { newValue := shr(224, value) } function allocate_unbounded() -> memPtr { memPtr := mload(64) } @@ -46,32 +47,28 @@ object \"C_7\" { { revert(0, 0) } function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() { revert(0, 0) } - function abi_decode_tuple_(headStart, dataEnd) + function abi_decode(headStart, dataEnd) { if slt(sub(dataEnd, headStart), 0) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() } } - function abi_encode_tuple__to__fromStack(headStart) -> tail + function abi_encode_tuple(headStart) -> tail { tail := add(headStart, 0) } - function external_fun_f_6() + function external_fun_f() { if callvalue() { revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() } - abi_decode_tuple_(4, calldatasize()) - fun_f_6() + abi_decode(4, calldatasize()) let memPos := allocate_unbounded() - let memEnd := abi_encode_tuple__to__fromStack(memPos) + let memEnd := abi_encode_tuple(memPos) return(memPos, sub(memEnd, memPos)) } function revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() { revert(0, 0) } - /// @ast-id 6 @src 0:92:119 \"function f() public pure {}\" - function fun_f_6() - { } } data \".metadata\" hex\"\" } diff --git a/test/cmdlineTests/standard_yul/output.json b/test/cmdlineTests/standard_yul/output.json index d335c3a96691..9dcf201139f4 100644 --- a/test/cmdlineTests/standard_yul/output.json +++ b/test/cmdlineTests/standard_yul/output.json @@ -7,22 +7,18 @@ { "evm": { - "assembly": " /* \"A\":17:18 */ + "assembly": " /* \"A\":38:39 */ 0x00 /* \"A\":11:19 */ - mload - /* \"A\":38:39 */ - 0x00 - /* \"A\":34:35 */ dup1 - /* \"A\":31:32 */ - dup3 + dup1 + mload /* \"A\":27:36 */ add /* \"A\":20:40 */ sstore /* \"A\":0:42 */ - pop + stop ", "bytecode": { @@ -43,8 +39,10 @@ ", "irOptimized": "object \"object\" { code { - let x := mload(0) - sstore(add(x, 0), 0) + { + let x := mload(0) + sstore(add(x, 0), 0) + } } } " diff --git a/test/cmdlineTests/standard_yul_debug_info_print_all/output.json b/test/cmdlineTests/standard_yul_debug_info_print_all/output.json index 0c78efb80004..9d675a06918d 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_all/output.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_all/output.json @@ -13,12 +13,11 @@ tag_1 jump\t// in tag_2: + stop /* \"input.sol\":77:99 */ - jump(tag_3) tag_1: sstore(0x00, 0x2a) jump\t// out -tag_3: " } } diff --git a/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json b/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json index 53be3d073bbf..8cbbd326c71e 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_location_only/output.json @@ -13,12 +13,11 @@ tag_1 jump\t// in tag_2: + stop /* \"input.sol\":77:99 */ - jump(tag_3) tag_1: sstore(0x00, 0x2a) jump\t// out -tag_3: " } } diff --git a/test/cmdlineTests/standard_yul_debug_info_print_none/output.json b/test/cmdlineTests/standard_yul_debug_info_print_none/output.json index ac2a93b0f264..d1e4cff4cb3d 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_none/output.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_none/output.json @@ -12,11 +12,10 @@ tag_1 jump\t// in tag_2: - jump(tag_3) + stop tag_1: sstore(0x00, 0x2a) jump\t// out -tag_3: " } } diff --git a/test/cmdlineTests/standard_yul_object/output.json b/test/cmdlineTests/standard_yul_object/output.json index af55758f4d1c..edf139dc0de2 100644 --- a/test/cmdlineTests/standard_yul_object/output.json +++ b/test/cmdlineTests/standard_yul_object/output.json @@ -7,20 +7,17 @@ { "evm": { - "assembly": " /* \"A\":39:61 */ - data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 - /* \"A\":80:81 */ + "assembly": " /* \"A\":80:81 */ 0x00 - /* \"A\":76:77 */ + /* \"A\":39:61 */ dup1 - /* \"A\":73:74 */ - dup3 + data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 /* \"A\":69:78 */ add /* \"A\":62:82 */ sstore /* \"A\":28:84 */ - pop + stop stop data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 616263 ", @@ -44,8 +41,10 @@ data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 616263 ", "irOptimized": "object \"NamedObject\" { code { - let x := dataoffset(\"DataName\") - sstore(add(x, 0), 0) + { + let x := dataoffset(\"DataName\") + sstore(add(x, 0), 0) + } } data \"DataName\" hex\"616263\" } diff --git a/test/cmdlineTests/standard_yul_object_name/output.json b/test/cmdlineTests/standard_yul_object_name/output.json index e94a9bc6acdb..7faeed3c3223 100644 --- a/test/cmdlineTests/standard_yul_object_name/output.json +++ b/test/cmdlineTests/standard_yul_object_name/output.json @@ -7,29 +7,25 @@ { "evm": { - "assembly": " /* \"A\":39:61 */ - data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 - /* \"A\":80:81 */ + "assembly": " /* \"A\":80:81 */ 0x00 - /* \"A\":76:77 */ + /* \"A\":39:61 */ dup1 - /* \"A\":73:74 */ - dup3 + data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 /* \"A\":69:78 */ add /* \"A\":62:82 */ sstore /* \"A\":28:84 */ - pop + stop stop data_4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45 616263 sub_0: assembly { /* \"A\":147:148 */ 0x00 - /* \"A\":144:145 */ - dup1 /* \"A\":137:149 */ + dup1 revert } ", @@ -66,12 +62,14 @@ sub_0: assembly { ", "irOptimized": "object \"NamedObject\" { code { - let x := dataoffset(\"DataName\") - sstore(add(x, 0), 0) + { + let x := dataoffset(\"DataName\") + sstore(add(x, 0), 0) + } } data \"DataName\" hex\"616263\" object \"OtherObject\" { - code { revert(0, 0) } + code { { revert(0, 0) } } } } " diff --git a/test/cmdlineTests/strict_asm_ast_compact_json/output b/test/cmdlineTests/strict_asm_ast_compact_json/output index ff944e8e471b..98afddcfa9d7 100644 --- a/test/cmdlineTests/strict_asm_ast_compact_json/output +++ b/test/cmdlineTests/strict_asm_ast_compact_json/output @@ -13,73 +13,49 @@ AST: "statements": [ { - "expression": - { - "arguments": - [ + "nativeSrc": "60:246:0", + "nodeType": "YulBlock", + "src": "-1:-1:0", + "statements": + [ + { + "expression": { - "kind": "number", - "nativeSrc": "122:2:0", - "nodeType": "YulLiteral", - "src": "60:41:0", - "type": "", - "value": "64" + "arguments": + [ + { + "kind": "number", + "nativeSrc": "122:2:0", + "nodeType": "YulLiteral", + "src": "60:41:0", + "type": "", + "value": "64" + }, + { + "kind": "number", + "nativeSrc": "126:3:0", + "nodeType": "YulLiteral", + "src": "60:41:0", + "type": "", + "value": "128" + } + ], + "functionName": + { + "name": "mstore", + "nativeSrc": "115:6:0", + "nodeType": "YulIdentifier", + "src": "60:41:0" + }, + "nativeSrc": "115:15:0", + "nodeType": "YulFunctionCall", + "src": "60:41:0" }, - { - "kind": "number", - "nativeSrc": "126:3:0", - "nodeType": "YulLiteral", - "src": "60:41:0", - "type": "", - "value": "128" - } - ], - "functionName": - { - "name": "mstore", - "nativeSrc": "115:6:0", - "nodeType": "YulIdentifier", + "nativeSrc": "115:15:0", + "nodeType": "YulExpressionStatement", "src": "60:41:0" - }, - "nativeSrc": "115:15:0", - "nodeType": "YulFunctionCall", - "src": "60:41:0" - }, - "nativeSrc": "115:15:0", - "nodeType": "YulExpressionStatement", - "src": "60:41:0" - }, - { - "expression": - { - "arguments": [], - "functionName": - { - "name": "fun_f_5", - "nativeSrc": "155:7:0", - "nodeType": "YulIdentifier", - "src": "60:41:0" - }, - "nativeSrc": "155:9:0", - "nodeType": "YulFunctionCall", - "src": "60:41:0" - }, - "nativeSrc": "155:9:0", - "nodeType": "YulExpressionStatement", - "src": "60:41:0" - }, - { - "body": - { - "nativeSrc": "244:11:0", - "nodeType": "YulBlock", - "src": "77:22:0", - "statements": [] - }, - "name": "fun_f_5", - "nativeSrc": "225:30:0", - "nodeType": "YulFunctionDefinition", - "src": "77:22:0" + } + ] } ] }, diff --git a/test/cmdlineTests/strict_asm_debug_info_print_all/output b/test/cmdlineTests/strict_asm_debug_info_print_all/output index 2242e6630eaf..0e58baf578e6 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_all/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_all/output @@ -5,18 +5,20 @@ Pretty printed source: /// @use-src 0:"input.sol" object "C_6_deployed" { code { - /// @src 0:60:101 - mstore(64, 128) - fun_f_5() + { + /// @src 0:60:101 + mstore(64, 128) + fun_f() + } /// @src 0:77:99 - function fun_f_5() + function fun_f() { sstore(0, 42) } } } Binary representation: -6080604052600a600e565b6014565b602a5f55565b +6080604052600a600c565b005b602a5f5556 Text representation: /* "input.sol":60:101 */ @@ -25,9 +27,8 @@ Text representation: tag_1 jump // in tag_2: + stop /* "input.sol":77:99 */ - jump(tag_3) tag_1: sstore(0x00, 0x2a) jump // out -tag_3: diff --git a/test/cmdlineTests/strict_asm_debug_info_print_location_only/output b/test/cmdlineTests/strict_asm_debug_info_print_location_only/output index c5de7c43990d..17d2f50e2e15 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_location_only/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_location_only/output @@ -5,18 +5,20 @@ Pretty printed source: /// @use-src 0:"input.sol" object "C_6_deployed" { code { - /// @src 0:60:101 - mstore(64, 128) - fun_f_5() + { + /// @src 0:60:101 + mstore(64, 128) + fun_f() + } /// @src 0:77:99 - function fun_f_5() + function fun_f() { sstore(0, 42) } } } Binary representation: -6080604052600a600e565b6014565b602a5f55565b +6080604052600a600c565b005b602a5f5556 Text representation: /* "input.sol":60:101 */ @@ -25,9 +27,8 @@ Text representation: tag_1 jump // in tag_2: + stop /* "input.sol":77:99 */ - jump(tag_3) tag_1: sstore(0x00, 0x2a) jump // out -tag_3: diff --git a/test/cmdlineTests/strict_asm_debug_info_print_none/output b/test/cmdlineTests/strict_asm_debug_info_print_none/output index 3db44c1f5b15..51f779490ab7 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_none/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_none/output @@ -5,16 +5,18 @@ Pretty printed source: /// @use-src 0:"input.sol" object "C_6_deployed" { code { - mstore(64, 128) - fun_f_5() - function fun_f_5() + { + mstore(64, 128) + fun_f() + } + function fun_f() { sstore(0, 42) } } } Binary representation: -6080604052600a600e565b6014565b602a5f55565b +6080604052600a600c565b005b602a5f5556 Text representation: mstore(0x40, 0x80) @@ -22,8 +24,7 @@ Text representation: tag_1 jump // in tag_2: - jump(tag_3) + stop tag_1: sstore(0x00, 0x2a) jump // out -tag_3: diff --git a/test/cmdlineTests/yul_function_name_clashes/output b/test/cmdlineTests/yul_function_name_clashes/output index cfbb96bfa842..2c54b6f50893 100644 --- a/test/cmdlineTests/yul_function_name_clashes/output +++ b/test/cmdlineTests/yul_function_name_clashes/output @@ -4,63 +4,43 @@ Pretty printed source: object "object" { code { - let a - let b { - function z() -> y - { y := calldataload(0) } + let a + let b a := z() + b := z_1() + sstore(a, b) } - { - function z() -> y - { y := calldataload(0x20) } - b := z() - } - sstore(a, b) + function z() -> y + { y := calldataload(0) } + function z_1() -> y + { y := calldataload(0x20) } } } Binary representation: -5f80600d565b5f8035905090565b60136005565b91506022565b5f602035905090565b60286019565b90508082555050 +6005600f565b600b6014565b9055005b5f3590565b6020359056 Text representation: - 0x00 - dup1 - jump(tag_2) + tag_3 + tag_1 + jump // in +tag_3: + tag_4 + tag_2 + jump // in +tag_4: + swap1 + sstore + stop tag_1: 0x00 - dup1 calldataload swap1 - pop - swap1 jump // out tag_2: - tag_4 - tag_1 - jump // in -tag_4: - swap2 - pop - jump(tag_6) -tag_5: - 0x00 0x20 calldataload swap1 - pop - swap1 jump // out -tag_6: - tag_8 - tag_5 - jump // in -tag_8: - swap1 - pop - dup1 - dup3 - sstore - pop - pop diff --git a/test/cmdlineTests/yul_function_name_clashes_different_params/output b/test/cmdlineTests/yul_function_name_clashes_different_params/output index cd0dce30c479..22cee64c1f48 100644 --- a/test/cmdlineTests/yul_function_name_clashes_different_params/output +++ b/test/cmdlineTests/yul_function_name_clashes_different_params/output @@ -4,90 +4,56 @@ Pretty printed source: object "object" { code { - let a - let b { - function z() -> y - { y := calldataload(0) } + let a + let b a := z() + b := z_1(0x70) + sstore(a, b) } - { - function z(r) -> y - { y := calldataload(r) } - b := z(0x70) - } - sstore(a, b) + function z() -> y + { y := calldataload(0) } + function z_1(r) -> y + { y := calldataload(r) } } } Binary representation: -5f80600d565b5f8035905090565b60136005565b91506023565b5f81359050919050565b602b60706019565b90508082555050 +60056011565b600d60706016565b9055005b5f3590565b359056 Text representation: - /* "yul_function_name_clashes_different_params/input.yul":37:42 */ - 0x00 - /* "yul_function_name_clashes_different_params/input.yul":51:56 */ - dup1 + /* "yul_function_name_clashes_different_params/input.yul":151:154 */ + tag_3 + tag_1 + jump // in +tag_3: + /* "yul_function_name_clashes_different_params/input.yul":260:267 */ + tag_4 + /* "yul_function_name_clashes_different_params/input.yul":262:266 */ + 0x70 + /* "yul_function_name_clashes_different_params/input.yul":260:267 */ + tag_2 + jump // in +tag_4: + /* "yul_function_name_clashes_different_params/input.yul":286:298 */ + swap1 + sstore + /* "yul_function_name_clashes_different_params/input.yul":27:304 */ + stop /* "yul_function_name_clashes_different_params/input.yul":79:133 */ - jump(tag_2) tag_1: - /* "yul_function_name_clashes_different_params/input.yul":95:96 */ - 0x00 /* "yul_function_name_clashes_different_params/input.yul":129:130 */ - dup1 + 0x00 /* "yul_function_name_clashes_different_params/input.yul":116:131 */ calldataload - /* "yul_function_name_clashes_different_params/input.yul":111:131 */ - swap1 - pop /* "yul_function_name_clashes_different_params/input.yul":79:133 */ swap1 jump // out -tag_2: - /* "yul_function_name_clashes_different_params/input.yul":151:154 */ - tag_4 - tag_1 - jump // in -tag_4: - /* "yul_function_name_clashes_different_params/input.yul":146:154 */ - swap2 - pop /* "yul_function_name_clashes_different_params/input.yul":187:242 */ - jump(tag_6) -tag_5: - /* "yul_function_name_clashes_different_params/input.yul":204:205 */ - 0x00 - /* "yul_function_name_clashes_different_params/input.yul":238:239 */ - dup2 +tag_2: /* "yul_function_name_clashes_different_params/input.yul":225:240 */ calldataload - /* "yul_function_name_clashes_different_params/input.yul":220:240 */ - swap1 - pop /* "yul_function_name_clashes_different_params/input.yul":187:242 */ - swap2 swap1 - pop jump // out -tag_6: - /* "yul_function_name_clashes_different_params/input.yul":260:267 */ - tag_8 - /* "yul_function_name_clashes_different_params/input.yul":262:266 */ - 0x70 - /* "yul_function_name_clashes_different_params/input.yul":260:267 */ - tag_5 - jump // in -tag_8: - /* "yul_function_name_clashes_different_params/input.yul":255:267 */ - swap1 - pop - /* "yul_function_name_clashes_different_params/input.yul":296:297 */ - dup1 - /* "yul_function_name_clashes_different_params/input.yul":293:294 */ - dup3 - /* "yul_function_name_clashes_different_params/input.yul":286:298 */ - sstore - /* "yul_function_name_clashes_different_params/input.yul":27:304 */ - pop - pop diff --git a/test/libyul/objectCompiler/data.yul b/test/libyul/objectCompiler/data.yul index 611715b6535d..caa6499218db 100644 --- a/test/libyul/objectCompiler/data.yul +++ b/test/libyul/objectCompiler/data.yul @@ -5,8 +5,10 @@ object "a" { } // ---- // Assembly: +// /* "source":20:22 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 -// Bytecode: fe -// Opcodes: INVALID -// SourceMappings: +// Bytecode: 00fe +// Opcodes: STOP INVALID +// SourceMappings: 20:2:0:-:0 diff --git a/test/libyul/objectCompiler/datacopy.yul b/test/libyul/objectCompiler/datacopy.yul index a5fbfb7b0bcb..cb9fbcb18ba2 100644 --- a/test/libyul/objectCompiler/datacopy.yul +++ b/test/libyul/objectCompiler/datacopy.yul @@ -42,9 +42,11 @@ object "a" { // 0x00 // /* "source":178:206 */ // mstore +// /* "source":135:212 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 // } -// Bytecode: 6008600b5f3960085ff3fe5f8055600d5f52fe -// Opcodes: PUSH1 0x8 PUSH1 0xB PUSH0 CODECOPY PUSH1 0x8 PUSH0 RETURN INVALID PUSH0 DUP1 SSTORE PUSH1 0xD PUSH0 MSTORE INVALID +// Bytecode: 6009600b5f3960095ff3fe5f8055600d5f5200fe +// Opcodes: PUSH1 0x9 PUSH1 0xB PUSH0 CODECOPY PUSH1 0x9 PUSH0 RETURN INVALID PUSH0 DUP1 SSTORE PUSH1 0xD PUSH0 MSTORE STOP INVALID // SourceMappings: 57:15:0:-:0;38:17;35:1;26:47;88:15;85:1;78:26 diff --git a/test/libyul/objectCompiler/dataoffset_code.yul b/test/libyul/objectCompiler/dataoffset_code.yul index e363ec7c6129..58521c87f9be 100644 --- a/test/libyul/objectCompiler/dataoffset_code.yul +++ b/test/libyul/objectCompiler/dataoffset_code.yul @@ -13,6 +13,8 @@ object "a" { // 0x00 // /* "source":22:50 */ // sstore +// /* "source":20:52 */ +// stop // stop // // sub_0: assembly { @@ -22,9 +24,11 @@ object "a" { // 0x00 // /* "source":81:93 */ // sstore +// /* "source":79:95 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 // } -// Bytecode: 60055f55fe60085f55fe -// Opcodes: PUSH1 0x5 PUSH0 SSTORE INVALID PUSH1 0x8 PUSH0 SSTORE INVALID -// SourceMappings: 32:17:0:-:0;29:1;22:28 +// Bytecode: 60065f5500fe60085f5500fe +// Opcodes: PUSH1 0x6 PUSH0 SSTORE STOP INVALID PUSH1 0x8 PUSH0 SSTORE STOP INVALID +// SourceMappings: 32:17:0:-:0;29:1;22:28;20:32 diff --git a/test/libyul/objectCompiler/dataoffset_data.yul b/test/libyul/objectCompiler/dataoffset_data.yul index 2bb68e8a8a90..61f0c4418957 100644 --- a/test/libyul/objectCompiler/dataoffset_data.yul +++ b/test/libyul/objectCompiler/dataoffset_data.yul @@ -10,8 +10,10 @@ object "a" { // 0x00 // /* "source":22:52 */ // sstore +// /* "source":20:54 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 -// Bytecode: 60055f55fe48656c6c6f2c20576f726c6421 -// Opcodes: PUSH1 0x5 PUSH0 SSTORE INVALID BASEFEE PUSH6 0x6C6C6F2C2057 PUSH16 0x726C6421000000000000000000000000 -// SourceMappings: 32:19:0:-:0;29:1;22:30 +// Bytecode: 60065f5500fe48656c6c6f2c20576f726c6421 +// Opcodes: PUSH1 0x6 PUSH0 SSTORE STOP INVALID BASEFEE PUSH6 0x6C6C6F2C2057 PUSH16 0x726C6421000000000000000000000000 +// SourceMappings: 32:19:0:-:0;29:1;22:30;20:34 diff --git a/test/libyul/objectCompiler/dataoffset_self.yul b/test/libyul/objectCompiler/dataoffset_self.yul index e56097ab573c..7c38b9502a1b 100644 --- a/test/libyul/objectCompiler/dataoffset_self.yul +++ b/test/libyul/objectCompiler/dataoffset_self.yul @@ -10,8 +10,10 @@ object "a" { // dup1 // /* "source":22:48 */ // sstore +// /* "source":20:50 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 -// Bytecode: 5f8055fe -// Opcodes: PUSH0 DUP1 SSTORE INVALID -// SourceMappings: 32:15:0:-:0;29:1;22:26 +// Bytecode: 5f805500fe +// Opcodes: PUSH0 DUP1 SSTORE STOP INVALID +// SourceMappings: 32:15:0:-:0;29:1;22:26;20:30 diff --git a/test/libyul/objectCompiler/datasize_code.yul b/test/libyul/objectCompiler/datasize_code.yul index 0a379cb33aa8..4e559ab895c6 100644 --- a/test/libyul/objectCompiler/datasize_code.yul +++ b/test/libyul/objectCompiler/datasize_code.yul @@ -13,6 +13,8 @@ object "a" { // 0x00 // /* "source":22:48 */ // sstore +// /* "source":20:50 */ +// stop // stop // // sub_0: assembly { @@ -22,9 +24,11 @@ object "a" { // 0x00 // /* "source":79:91 */ // sstore +// /* "source":77:93 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 // } -// Bytecode: 60055f55fe -// Opcodes: PUSH1 0x5 PUSH0 SSTORE INVALID -// SourceMappings: 32:15:0:-:0;29:1;22:26 +// Bytecode: 60065f5500fe +// Opcodes: PUSH1 0x6 PUSH0 SSTORE STOP INVALID +// SourceMappings: 32:15:0:-:0;29:1;22:26;20:30 diff --git a/test/libyul/objectCompiler/datasize_data.yul b/test/libyul/objectCompiler/datasize_data.yul index 815e78fe4fa4..3281bd9ba7c3 100644 --- a/test/libyul/objectCompiler/datasize_data.yul +++ b/test/libyul/objectCompiler/datasize_data.yul @@ -10,8 +10,10 @@ object "a" { // 0x00 // /* "source":22:50 */ // sstore +// /* "source":20:52 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 -// Bytecode: 600d5f55fe -// Opcodes: PUSH1 0xD PUSH0 SSTORE INVALID -// SourceMappings: 32:17:0:-:0;29:1;22:28 +// Bytecode: 600d5f5500fe +// Opcodes: PUSH1 0xD PUSH0 SSTORE STOP INVALID +// SourceMappings: 32:17:0:-:0;29:1;22:28;20:32 diff --git a/test/libyul/objectCompiler/datasize_self.yul b/test/libyul/objectCompiler/datasize_self.yul index 178e3a948246..6bc520af58e7 100644 --- a/test/libyul/objectCompiler/datasize_self.yul +++ b/test/libyul/objectCompiler/datasize_self.yul @@ -10,8 +10,10 @@ object "a" { // 0x00 // /* "source":22:46 */ // sstore +// /* "source":20:48 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 -// Bytecode: 60055f55fe -// Opcodes: PUSH1 0x5 PUSH0 SSTORE INVALID -// SourceMappings: 32:13:0:-:0;29:1;22:24 +// Bytecode: 60065f5500fe +// Opcodes: PUSH1 0x6 PUSH0 SSTORE STOP INVALID +// SourceMappings: 32:13:0:-:0;29:1;22:24;20:28 diff --git a/test/libyul/objectCompiler/immutable_long_name_does_not_end_up_in_bytecode.yul b/test/libyul/objectCompiler/immutable_long_name_does_not_end_up_in_bytecode.yul index e991dc6b7bd1..285a8a8d548d 100644 --- a/test/libyul/objectCompiler/immutable_long_name_does_not_end_up_in_bytecode.yul +++ b/test/libyul/objectCompiler/immutable_long_name_does_not_end_up_in_bytecode.yul @@ -15,6 +15,8 @@ object "a" { // 0x00 // /* "source":32:219 */ // assignImmutable("0x85a5b1db611c82c46f5fa18e39ae218397536256c451e5de155a86de843a9ad6") -// Bytecode: 7312345678901234567890123456789012345678905f5050 -// Opcodes: PUSH20 0x1234567890123456789012345678901234567890 PUSH0 POP POP -// SourceMappings: 167:42:0:-:0;58:1;32:187; +// /* "source":22:225 */ +// stop +// Bytecode: 7312345678901234567890123456789012345678905f505000 +// Opcodes: PUSH20 0x1234567890123456789012345678901234567890 PUSH0 POP POP STOP +// SourceMappings: 167:42:0:-:0;58:1;32:187;;22:203 diff --git a/test/libyul/objectCompiler/linkersymbol.yul b/test/libyul/objectCompiler/linkersymbol.yul index a28ee23e23e0..c4da288e618f 100644 --- a/test/libyul/objectCompiler/linkersymbol.yul +++ b/test/libyul/objectCompiler/linkersymbol.yul @@ -7,7 +7,15 @@ object "a" { } // ---- // Assembly: +// /* "source":179:180 */ +// 0x00 +// /* "source":174:177 */ +// 0x80 +// /* "source":171:172 */ +// 0x04 // /* "source":44:79 */ +// dup2 +// dup4 // linkerSymbol("f919ba91ac99f96129544b80b9516b27a80e376b9dc693819d0b18b7e0395612") // /* "source":109:119 */ // 0x18530aaf @@ -15,29 +23,15 @@ object "a" { // 0xe3 // /* "source":100:120 */ // shl -// /* "source":95:98 */ -// 0x80 // /* "source":88:121 */ +// dup4 // mstore -// /* "source":179:180 */ -// 0x00 -// /* "source":174:177 */ -// 0x80 -// /* "source":171:172 */ -// 0x04 -// /* "source":166:169 */ -// 0x80 -// /* "source":163:164 */ -// 0x00 -// /* "source":157:161 */ -// dup6 // /* "source":150:155 */ // gas // /* "source":145:181 */ // call -// /* "source":22:187 */ -// pop -// pop -// Bytecode: 7300000000000000000000000000000000000000006318530aaf60e31b6080525f6080600460805f855af15050 -// Opcodes: PUSH20 0x0 PUSH4 0x18530AAF PUSH1 0xE3 SHL PUSH1 0x80 MSTORE PUSH0 PUSH1 0x80 PUSH1 0x4 PUSH1 0x80 PUSH0 DUP6 GAS CALL POP POP -// SourceMappings: 44:35:0:-:0;109:10;104:3;100:20;95:3;88:33;179:1;174:3;171:1;166:3;163:1;157:4;150:5;145:36;22:165; +// /* "source":130:181 */ +// stop +// Bytecode: 5f6080600481837300000000000000000000000000000000000000006318530aaf60e31b83525af100 +// Opcodes: PUSH0 PUSH1 0x80 PUSH1 0x4 DUP2 DUP4 PUSH20 0x0 PUSH4 0x18530AAF PUSH1 0xE3 SHL DUP4 MSTORE GAS CALL STOP +// SourceMappings: 179:1:0:-:0;174:3;171:1;44:35;;;109:10;104:3;100:20;88:33;;150:5;145:36;130:51 diff --git a/test/libyul/objectCompiler/metadata.yul b/test/libyul/objectCompiler/metadata.yul index 5a75507ba129..335522d04d2b 100644 --- a/test/libyul/objectCompiler/metadata.yul +++ b/test/libyul/objectCompiler/metadata.yul @@ -25,21 +25,18 @@ object "A" { // 0x0e // /* "source":62:75 */ // 0x03 -// /* "source":90:91 */ -// dup2 +// /* "source":80:92 */ +// swap1 // /* "source":87:88 */ // 0x00 // /* "source":80:92 */ // sstore -// /* "source":108:109 */ -// dup1 // /* "source":104:106 */ // 0x20 // /* "source":97:110 */ // sstore // /* "source":20:114 */ -// pop -// pop +// stop // stop // data_211450822d7f8c345093893187e7e1fbebc4ec67af72601920194be14104e336 48656c6c6f2c20576f726c643221 // data_e1629b9dda060bb30c7908346f6af189c16773fa148d3366701fbaa35d54f3c8 414243 @@ -47,14 +44,12 @@ object "A" { // sub_0: assembly { // /* "source":157:176 */ // data_211450822d7f8c345093893187e7e1fbebc4ec67af72601920194be14104e336 -// /* "source":193:194 */ -// dup1 // /* "source":190:191 */ // 0x00 // /* "source":183:195 */ // sstore // /* "source":140:201 */ -// pop +// stop // stop // data_211450822d7f8c345093893187e7e1fbebc4ec67af72601920194be14104e336 48656c6c6f2c20576f726c643221 // @@ -62,6 +57,6 @@ object "A" { // } // // auxdata: 0x4d32 -// Bytecode: 600e6003815f55806020555050fe4d32 -// Opcodes: PUSH1 0xE PUSH1 0x3 DUP2 PUSH0 SSTORE DUP1 PUSH1 0x20 SSTORE POP POP INVALID 0x4D ORIGIN -// SourceMappings: 35:13:0:-:0;62;90:1;87;80:12;108:1;104:2;97:13;20:94; +// Bytecode: 600e6003905f5560205500fe4d32 +// Opcodes: PUSH1 0xE PUSH1 0x3 SWAP1 PUSH0 SSTORE PUSH1 0x20 SSTORE STOP INVALID 0x4D ORIGIN +// SourceMappings: 35:13:0:-:0;62;80:12;87:1;80:12;104:2;97:13;20:94 diff --git a/test/libyul/objectCompiler/namedObject.yul b/test/libyul/objectCompiler/namedObject.yul index 940160fd26e1..d55c3ca25335 100644 --- a/test/libyul/objectCompiler/namedObject.yul +++ b/test/libyul/objectCompiler/namedObject.yul @@ -3,4 +3,8 @@ object "a" { } // ---- // Assembly: -// -- empty bytecode -- +// /* "source":20:22 */ +// stop +// Bytecode: 00 +// Opcodes: STOP +// SourceMappings: 20:2:0:-:0 diff --git a/test/libyul/objectCompiler/namedObjectCode.yul b/test/libyul/objectCompiler/namedObjectCode.yul index f9e97bec4af3..5936aa744337 100644 --- a/test/libyul/objectCompiler/namedObjectCode.yul +++ b/test/libyul/objectCompiler/namedObjectCode.yul @@ -9,6 +9,8 @@ object "a" { // 0x00 // /* "source":22:34 */ // sstore -// Bytecode: 60015f55 -// Opcodes: PUSH1 0x1 PUSH0 SSTORE -// SourceMappings: 32:1:0:-:0;29;22:12 +// /* "source":20:36 */ +// stop +// Bytecode: 60015f5500 +// Opcodes: PUSH1 0x1 PUSH0 SSTORE STOP +// SourceMappings: 32:1:0:-:0;29;22:12;20:16 diff --git a/test/libyul/objectCompiler/simple.yul b/test/libyul/objectCompiler/simple.yul index d94b53de9020..b84c49a5a43d 100644 --- a/test/libyul/objectCompiler/simple.yul +++ b/test/libyul/objectCompiler/simple.yul @@ -9,6 +9,8 @@ // 0x00 // /* "source":4:16 */ // sstore -// Bytecode: 60015f55 -// Opcodes: PUSH1 0x1 PUSH0 SSTORE -// SourceMappings: 14:1:0:-:0;11;4:12 +// /* "source":0:18 */ +// stop +// Bytecode: 60015f5500 +// Opcodes: PUSH1 0x1 PUSH0 SSTORE STOP +// SourceMappings: 14:1:0:-:0;11;4:12;0:18 diff --git a/test/libyul/objectCompiler/smoke.yul b/test/libyul/objectCompiler/smoke.yul index b2e44d4dcd82..3f1079aa7090 100644 --- a/test/libyul/objectCompiler/smoke.yul +++ b/test/libyul/objectCompiler/smoke.yul @@ -2,4 +2,8 @@ } // ---- // Assembly: -// -- empty bytecode -- +// /* "source":0:3 */ +// stop +// Bytecode: 00 +// Opcodes: STOP +// SourceMappings: 0:3:0:-:0 diff --git a/test/libyul/objectCompiler/sourceLocations.yul b/test/libyul/objectCompiler/sourceLocations.yul index 849d275fec2e..1c84773249d7 100644 --- a/test/libyul/objectCompiler/sourceLocations.yul +++ b/test/libyul/objectCompiler/sourceLocations.yul @@ -46,9 +46,10 @@ object "a" { // sstore // /* "abc.sol":2:5 */ // mstore(0x00, 0x0d) +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 // } -// Bytecode: 6008600b5f3960085ff3fe5f8055600d5f52fe -// Opcodes: PUSH1 0x8 PUSH1 0xB PUSH0 CODECOPY PUSH1 0x8 PUSH0 RETURN INVALID PUSH0 DUP1 SSTORE PUSH1 0xD PUSH0 MSTORE INVALID +// Bytecode: 6009600b5f3960095ff3fe5f8055600d5f5200fe +// Opcodes: PUSH1 0x9 PUSH1 0xB PUSH0 CODECOPY PUSH1 0x9 PUSH0 RETURN INVALID PUSH0 DUP1 SSTORE PUSH1 0xD PUSH0 MSTORE STOP INVALID // SourceMappings: 0:2::-:0;;;;5:1;0:2; diff --git a/test/libyul/objectCompiler/subObject.yul b/test/libyul/objectCompiler/subObject.yul index f99b071af5cb..46fc03f10ea8 100644 --- a/test/libyul/objectCompiler/subObject.yul +++ b/test/libyul/objectCompiler/subObject.yul @@ -6,6 +6,8 @@ object "a" { } // ---- // Assembly: +// /* "source":20:22 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 // @@ -16,7 +18,9 @@ object "a" { // 0x00 // /* "source":139:151 */ // sstore +// /* "source":137:153 */ +// stop // } -// Bytecode: fe -// Opcodes: INVALID -// SourceMappings: +// Bytecode: 00fe +// Opcodes: STOP INVALID +// SourceMappings: 20:2:0:-:0 diff --git a/test/libyul/objectCompiler/subObjectAccess.yul b/test/libyul/objectCompiler/subObjectAccess.yul index e8bf0bcafc2c..291749220a45 100644 --- a/test/libyul/objectCompiler/subObjectAccess.yul +++ b/test/libyul/objectCompiler/subObjectAccess.yul @@ -80,69 +80,55 @@ object "A" { // /* "source":192:207 */ // dataSize(sub_0.sub_0) // /* "source":224:241 */ +// swap1 // dataOffset(sub_0.sub_1) // /* "source":258:273 */ +// swap3 // dataSize(sub_0.sub_1) // /* "source":291:310 */ +// swap5 // dataOffset(sub_0.sub_0.sub_0) // /* "source":328:345 */ +// swap7 // dataSize(sub_0.sub_0.sub_0) -// /* "source":361:364 */ -// dup10 +// /* "source":351:365 */ +// swap9 // /* "source":358:359 */ // 0x00 // /* "source":351:365 */ // sstore -// /* "source":381:384 */ -// dup9 // /* "source":377:379 */ // 0x20 // /* "source":370:385 */ // sstore -// /* "source":401:404 */ -// dup8 // /* "source":397:399 */ // 0x40 // /* "source":390:405 */ // sstore -// /* "source":421:424 */ -// dup7 // /* "source":417:419 */ // 0x60 // /* "source":410:425 */ // sstore -// /* "source":442:446 */ -// dup6 // /* "source":437:440 */ // 0x80 // /* "source":430:447 */ // sstore -// /* "source":464:468 */ -// dup5 // /* "source":459:462 */ // 0xa0 // /* "source":452:469 */ // sstore -// /* "source":486:490 */ -// dup4 // /* "source":481:484 */ // 0xc0 // /* "source":474:491 */ // sstore -// /* "source":508:512 */ -// dup3 // /* "source":503:506 */ // 0xe0 // /* "source":496:513 */ // sstore -// /* "source":530:535 */ -// dup2 // /* "source":525:528 */ // 0x0100 // /* "source":518:536 */ // sstore -// /* "source":553:558 */ -// dup1 // /* "source":548:551 */ // 0x0120 // /* "source":541:559 */ @@ -166,41 +152,33 @@ object "A" { // /* "source":756:769 */ // dataSize(sub_1) // /* "source":788:805 */ +// swap1 // dataOffset(sub_0.sub_0) // /* "source":824:839 */ +// swap3 // dataSize(sub_0.sub_0) -// /* "source":857:860 */ -// dup6 +// /* "source":847:861 */ +// swap5 // /* "source":854:855 */ // 0x00 // /* "source":847:861 */ // sstore -// /* "source":879:882 */ -// dup5 // /* "source":875:877 */ // 0x20 // /* "source":868:883 */ // sstore -// /* "source":901:904 */ -// dup4 // /* "source":897:899 */ // 0x40 // /* "source":890:905 */ // sstore -// /* "source":923:926 */ -// dup3 // /* "source":919:921 */ // 0x60 // /* "source":912:927 */ // sstore -// /* "source":946:950 */ -// dup2 // /* "source":941:944 */ // 0x80 // /* "source":934:951 */ // sstore -// /* "source":970:974 */ -// dup1 // /* "source":965:968 */ // 0xa0 // /* "source":958:975 */ @@ -218,14 +196,12 @@ object "A" { // dataOffset(sub_0) // /* "source":1087:1100 */ // dataSize(sub_0) -// /* "source":1120:1123 */ -// dup2 +// /* "source":1110:1124 */ +// swap1 // /* "source":1117:1118 */ // 0x00 // /* "source":1110:1124 */ // sstore -// /* "source":1144:1147 */ -// dup1 // /* "source":1140:1142 */ // 0x20 // /* "source":1133:1148 */ @@ -249,6 +225,6 @@ object "A" { // invalid // } // } -// Bytecode: 5f608e6042603a607d6011607c6001607c6001895f55886020558760405586606055856080558460a0558360c0558260e055816101005580610120556101405ff3fe602860116039600160396001855f55846020558360405582606055816080558060a05560c05ff3fe60106001815f558060205560405ff3fefefefe60106001815f558060205560405ff3fefe -// Opcodes: PUSH0 PUSH1 0x8E PUSH1 0x42 PUSH1 0x3A PUSH1 0x7D PUSH1 0x11 PUSH1 0x7C PUSH1 0x1 PUSH1 0x7C PUSH1 0x1 DUP10 PUSH0 SSTORE DUP9 PUSH1 0x20 SSTORE DUP8 PUSH1 0x40 SSTORE DUP7 PUSH1 0x60 SSTORE DUP6 PUSH1 0x80 SSTORE DUP5 PUSH1 0xA0 SSTORE DUP4 PUSH1 0xC0 SSTORE DUP3 PUSH1 0xE0 SSTORE DUP2 PUSH2 0x100 SSTORE DUP1 PUSH2 0x120 SSTORE PUSH2 0x140 PUSH0 RETURN INVALID PUSH1 0x28 PUSH1 0x11 PUSH1 0x39 PUSH1 0x1 PUSH1 0x39 PUSH1 0x1 DUP6 PUSH0 SSTORE DUP5 PUSH1 0x20 SSTORE DUP4 PUSH1 0x40 SSTORE DUP3 PUSH1 0x60 SSTORE DUP2 PUSH1 0x80 SSTORE DUP1 PUSH1 0xA0 SSTORE PUSH1 0xC0 PUSH0 RETURN INVALID PUSH1 0x10 PUSH1 0x1 DUP2 PUSH0 SSTORE DUP1 PUSH1 0x20 SSTORE PUSH1 0x40 PUSH0 RETURN INVALID INVALID INVALID INVALID PUSH1 0x10 PUSH1 0x1 DUP2 PUSH0 SSTORE DUP1 PUSH1 0x20 SSTORE PUSH1 0x40 PUSH0 RETURN INVALID INVALID -// SourceMappings: 37:15:0:-:0;68:13;97:15;128:13;158:17;192:15;224:17;258:15;291:19;328:17;361:3;358:1;351:14;381:3;377:2;370:15;401:3;397:2;390:15;421:3;417:2;410:15;442:4;437:3;430:17;464:4;459:3;452:17;486:4;481:3;474:17;508:4;503:3;496:17;530:5;525:3;518:18;553:5;548:3;541:18;574:3;571:1;564:14 +// Bytecode: 5f6084603d603660746010906073926001946073966001985f5560205560405560605560805560a05560c05560e05561010055610120556101405ff3fe6025601060356001906035926001945f5560205560405560605560805560a05560c05ff3fe600f6001905f5560205560405ff3fefefefe600f6001905f5560205560405ff3fefe +// Opcodes: PUSH0 PUSH1 0x84 PUSH1 0x3D PUSH1 0x36 PUSH1 0x74 PUSH1 0x10 SWAP1 PUSH1 0x73 SWAP3 PUSH1 0x1 SWAP5 PUSH1 0x73 SWAP7 PUSH1 0x1 SWAP9 PUSH0 SSTORE PUSH1 0x20 SSTORE PUSH1 0x40 SSTORE PUSH1 0x60 SSTORE PUSH1 0x80 SSTORE PUSH1 0xA0 SSTORE PUSH1 0xC0 SSTORE PUSH1 0xE0 SSTORE PUSH2 0x100 SSTORE PUSH2 0x120 SSTORE PUSH2 0x140 PUSH0 RETURN INVALID PUSH1 0x25 PUSH1 0x10 PUSH1 0x35 PUSH1 0x1 SWAP1 PUSH1 0x35 SWAP3 PUSH1 0x1 SWAP5 PUSH0 SSTORE PUSH1 0x20 SSTORE PUSH1 0x40 SSTORE PUSH1 0x60 SSTORE PUSH1 0x80 SSTORE PUSH1 0xA0 SSTORE PUSH1 0xC0 PUSH0 RETURN INVALID PUSH1 0xF PUSH1 0x1 SWAP1 PUSH0 SSTORE PUSH1 0x20 SSTORE PUSH1 0x40 PUSH0 RETURN INVALID INVALID INVALID INVALID PUSH1 0xF PUSH1 0x1 SWAP1 PUSH0 SSTORE PUSH1 0x20 SSTORE PUSH1 0x40 PUSH0 RETURN INVALID INVALID +// SourceMappings: 37:15:0:-:0;68:13;97:15;128:13;158:17;192:15;224:17;;258:15;;291:19;;328:17;;351:14;358:1;351:14;377:2;370:15;397:2;390:15;417:2;410:15;437:3;430:17;459:3;452:17;481:3;474:17;503:3;496:17;525:3;518:18;548:3;541:18;574:3;571:1;564:14 diff --git a/test/libyul/objectCompiler/subSubObject.yul b/test/libyul/objectCompiler/subSubObject.yul index a36f97619e94..a9936d58fbdb 100644 --- a/test/libyul/objectCompiler/subSubObject.yul +++ b/test/libyul/objectCompiler/subSubObject.yul @@ -12,6 +12,8 @@ object "a" { } // ---- // Assembly: +// /* "source":20:22 */ +// stop // stop // data_acaf3289d7b601cbd114fb36c4d29c85bbfd5e133f14cb355c3fd8d99367964f 48656c6c6f2c20576f726c6421 // @@ -22,6 +24,8 @@ object "a" { // 0x00 // /* "source":143:155 */ // sstore +// /* "source":141:157 */ +// stop // stop // // sub_0: assembly { @@ -31,10 +35,12 @@ object "a" { // 0x02 // /* "source":193:205 */ // sstore +// /* "source":191:207 */ +// stop // stop // data_6adf031833174bbe4c85eafe59ddb54e6584648c2c962c6f94791ab49caa0ad4 123456 // } // } -// Bytecode: fe -// Opcodes: INVALID -// SourceMappings: +// Bytecode: 00fe +// Opcodes: STOP INVALID +// SourceMappings: 20:2:0:-:0 From 0ea06e1c710c7cfb112e8c91d8aa2e9fe3c69b86 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 7 Jun 2023 13:40:14 +0200 Subject: [PATCH 062/138] Do not let low-level semantic test calls depend on a well-defined contract ABI. --- test/libsolidity/SemanticTest.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/libsolidity/SemanticTest.cpp b/test/libsolidity/SemanticTest.cpp index 1d8a9c9c09ce..50f2a3cf1028 100644 --- a/test/libsolidity/SemanticTest.cpp +++ b/test/libsolidity/SemanticTest.cpp @@ -410,7 +410,8 @@ TestCase::TestResult SemanticTest::runTest( test.setFailure(!m_transactionSuccessful); test.setRawBytes(std::move(output)); - test.setContractABI(m_compiler.contractABI(m_compiler.lastContractName(m_sources.mainSourceFile))); + if (test.call().kind != FunctionCall::Kind::LowLevel) + test.setContractABI(m_compiler.contractABI(m_compiler.lastContractName(m_sources.mainSourceFile))); } vector effects; From 3aaa207162424ee15e6b8bda32d2bbfa91d700c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 21 Apr 2023 15:14:35 +0200 Subject: [PATCH 063/138] Enable unoptimized presets in those external tests where they now pass --- test/externalTests/bleeps.sh | 4 ++-- test/externalTests/brink.sh | 4 ++-- test/externalTests/chainlink.sh | 4 ++-- test/externalTests/elementfi.sh | 4 ++-- test/externalTests/ens.sh | 6 +++--- test/externalTests/euler.sh | 4 ++-- test/externalTests/gnosis.sh | 4 ++-- test/externalTests/gp2.sh | 6 +++--- test/externalTests/perpetual-pools.sh | 4 ++-- test/externalTests/pool-together.sh | 4 ++-- test/externalTests/prb-math.sh | 7 ++++--- test/externalTests/trident.sh | 6 +++--- test/externalTests/uniswap.sh | 4 ++-- test/externalTests/yield-liquidator.sh | 4 ++-- test/externalTests/zeppelin.sh | 7 ++++--- 15 files changed, 37 insertions(+), 35 deletions(-) diff --git a/test/externalTests/bleeps.sh b/test/externalTests/bleeps.sh index 939552100495..30f0ec9240b9 100755 --- a/test/externalTests/bleeps.sh +++ b/test/externalTests/bleeps.sh @@ -46,8 +46,8 @@ function bleeps_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with: "YulException: Variable param_0 is 2 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with: "YulException: Variable param_0 is 2 slot(s) too deep inside the stack." + #ir-no-optimize # Compilation fails with: "YulException: Variable expr_15509_mpos is 4 too deep in the stack". No memoryguard was present. + #ir-optimize-evm-only # Compilation fails with: "YulException: Variable expr_15260_mpos is 4 too deep in the stack". No memoryguard was present. ir-optimize-evm+yul #legacy-no-optimize # Compilation fails with: "CompilerError: Stack too deep, try removing local variables." #legacy-optimize-evm-only # Compilation fails with: "CompilerError: Stack too deep, try removing local variables." diff --git a/test/externalTests/brink.sh b/test/externalTests/brink.sh index 77dd62f940f8..06e2207bd09f 100755 --- a/test/externalTests/brink.sh +++ b/test/externalTests/brink.sh @@ -45,8 +45,8 @@ function brink_test local extra_optimizer_settings="runs: 800" local compile_only_presets=( - #ir-no-optimize # Compilation fails with "YulException: Variable var_signature_127_offset is 2 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_signature_127_offset is 2 slot(s) too deep inside the stack." + ir-no-optimize # Lots of test failures. Tests depend on constants.js, which seems to be calculated specifically for 0.8.10. + ir-optimize-evm-only # Lots of test failures. Tests depend on constants.js, which seems to be calculated specifically for 0.8.10. ir-optimize-evm+yul # Lots of test failures. Tests depend on constants.js, which seems to be calculated specifically for 0.8.10. legacy-optimize-evm+yul # Lots of test failures. Tests depend on constants.js, which seems to be calculated specifically for 0.8.10. legacy-no-optimize # Lots of test failures. Tests depend on constants.js, which seems to be calculated specifically for 0.8.10. diff --git a/test/externalTests/chainlink.sh b/test/externalTests/chainlink.sh index a11266c3b84b..4d5080730f80 100755 --- a/test/externalTests/chainlink.sh +++ b/test/externalTests/chainlink.sh @@ -47,8 +47,8 @@ function chainlink_test ) local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var__value_775 is 1 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var__value_10 is 1 slot(s) too deep inside the stack" + #ir-no-optimize # Compilation fails with "YulException: Variable expr_10724_mpos is 2 too deep in the stack". No memoryguard was present. + #ir-optimize-evm-only # Compilation fails with "YulException: Variable expr_1891_mpos is 2 too deep in the stack". No memoryguard was present. ir-optimize-evm+yul legacy-optimize-evm-only # NOTE: This requires >= 4 GB RAM in CI not to crash legacy-optimize-evm+yul # NOTE: This requires >= 4 GB RAM in CI not to crash diff --git a/test/externalTests/elementfi.sh b/test/externalTests/elementfi.sh index b3348e339c9a..94e622d10c5a 100755 --- a/test/externalTests/elementfi.sh +++ b/test/externalTests/elementfi.sh @@ -45,8 +45,8 @@ function elementfi_test local compile_only_presets=( # ElementFi's test suite is hard-coded for Mainnet forked via alchemy.io. # Locally we can only compile. - #ir-no-optimize # Compilation fails with "YulException: Variable var_amount_9311 is 10 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_amount_9311 is 10 slot(s) too deep inside the stack." + ir-no-optimize + ir-optimize-evm-only ir-optimize-evm+yul legacy-no-optimize legacy-optimize-evm-only diff --git a/test/externalTests/ens.sh b/test/externalTests/ens.sh index 7f713f4abd81..aee291a1a468 100755 --- a/test/externalTests/ens.sh +++ b/test/externalTests/ens.sh @@ -42,13 +42,13 @@ function ens_test local config_file="hardhat.config.js" local compile_only_presets=( + ir-no-optimize # FIXME: Tests fail with "Error: cannot estimate gas; transaction may fail or may require manual gas limit" legacy-no-optimize # Compiles but tests fail to deploy GovernorCompatibilityBravo (code too large). ) local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var__945 is 1 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var__945 is 1 slot(s) too deep inside the stack." - ir-optimize-evm+yul # Needs memory-safe inline assembly patch + ir-optimize-evm-only + ir-optimize-evm+yul # Needs memory-safe inline assembly patch legacy-optimize-evm-only legacy-optimize-evm+yul ) diff --git a/test/externalTests/euler.sh b/test/externalTests/euler.sh index 586526124f31..80f18e702d92 100755 --- a/test/externalTests/euler.sh +++ b/test/externalTests/euler.sh @@ -47,8 +47,8 @@ function euler_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_utilisation_307 is 6 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_utilisation_307 is 6 slot(s) too deep inside the stack." + #ir-no-optimize # Compilation fails with "YulException: Variable var_v_mpos is 4 too deep in the stack". No memoryguard was present. + #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_v_mpos is 4 too deep in the stack". No memoryguard was present. ir-optimize-evm+yul legacy-optimize-evm-only legacy-optimize-evm+yul diff --git a/test/externalTests/gnosis.sh b/test/externalTests/gnosis.sh index de0624c06c57..5f7ea4876527 100755 --- a/test/externalTests/gnosis.sh +++ b/test/externalTests/gnosis.sh @@ -45,8 +45,8 @@ function gnosis_safe_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_call_430_mpos is 1 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_call_430_mpos is 1 slot(s) too deep inside the stack." + #ir-no-optimize # Compilation fails with "YulException: Variable var_txHash is 1 too deep in the stack". No memoryguard was present. + #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_txHash is 1 too deep in the stack". No memoryguard was present. # TODO: Uncomment the preset below when the issue: https://github.com/safe-global/safe-contracts/issues/544 is solved. #ir-optimize-evm+yul # Compilation fails with "YulException: Cannot swap Variable var_operation with Variable _1: too deep in the stack by 4 slots." legacy-no-optimize diff --git a/test/externalTests/gp2.sh b/test/externalTests/gp2.sh index 25403a879caa..bbb442226f62 100755 --- a/test/externalTests/gp2.sh +++ b/test/externalTests/gp2.sh @@ -43,12 +43,12 @@ function gp2_test local config_var="config" local compile_only_presets=( - legacy-no-optimize # Tests doing `new GPv2VaultRelayer` fail with "Error: Transaction reverted: trying to deploy a contract whose code is too large" + ir-no-optimize # Tests fail with "Error: Transaction reverted: trying to deploy a contract whose code is too large" + legacy-no-optimize # Tests fail with "Error: Transaction reverted: trying to deploy a contract whose code is too large" ) local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_amount_1468 is 10 slot(s) too deep inside the stack." - #ir-no-optimize # Compilation fails with "YulException: Variable var_offset_3451 is 1 slot(s) too deep inside the stack." + ir-optimize-evm-only ir-optimize-evm+yul legacy-optimize-evm-only legacy-optimize-evm+yul diff --git a/test/externalTests/perpetual-pools.sh b/test/externalTests/perpetual-pools.sh index 70a14c499338..8d8dc34e212d 100755 --- a/test/externalTests/perpetual-pools.sh +++ b/test/externalTests/perpetual-pools.sh @@ -45,8 +45,8 @@ function perpetual_pools_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_amount_527 is 9 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_amount_527 is 9 slot(s) too deep inside the stack." + ir-no-optimize + ir-optimize-evm-only ir-optimize-evm+yul legacy-no-optimize legacy-optimize-evm-only diff --git a/test/externalTests/pool-together.sh b/test/externalTests/pool-together.sh index 77b3ad1499b2..3f7141d9bade 100755 --- a/test/externalTests/pool-together.sh +++ b/test/externalTests/pool-together.sh @@ -45,8 +45,8 @@ function pool_together_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_amount_205 is 9 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_amount_205 is 9 slot(s) too deep inside the stack." + ir-no-optimize + ir-optimize-evm-only ir-optimize-evm+yul legacy-no-optimize legacy-optimize-evm-only diff --git a/test/externalTests/prb-math.sh b/test/externalTests/prb-math.sh index 614c285f72f5..fcf1aa208ee9 100755 --- a/test/externalTests/prb-math.sh +++ b/test/externalTests/prb-math.sh @@ -45,11 +45,12 @@ function prb_math_test local config_file="hardhat.config.ts" local config_var="config" - local compile_only_presets=() + local compile_only_presets=( + ir-no-optimize # Tests fail with "Error: Transaction reverted: trying to deploy a contract whose code is too large" + ) local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_y_1960 is 8 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_y_1960 is 8 slot(s) too deep inside the stack." + ir-optimize-evm-only ir-optimize-evm+yul legacy-optimize-evm-only legacy-optimize-evm+yul diff --git a/test/externalTests/trident.sh b/test/externalTests/trident.sh index f02123217a2b..d8d94eb3c101 100755 --- a/test/externalTests/trident.sh +++ b/test/externalTests/trident.sh @@ -54,9 +54,9 @@ function trident_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with: "YulException: Variable var_amount_165 is 9 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with: "YulException: Variable var_amount_165 is 9 slot(s) too deep inside the stack." - ir-optimize-evm+yul # Needs memory-safe inline assembly patch + ir-no-optimize + ir-optimize-evm-only + ir-optimize-evm+yul # Needs memory-safe inline assembly patch legacy-no-optimize legacy-optimize-evm-only legacy-optimize-evm+yul diff --git a/test/externalTests/uniswap.sh b/test/externalTests/uniswap.sh index 37fed8644310..8d2551b61920 100755 --- a/test/externalTests/uniswap.sh +++ b/test/externalTests/uniswap.sh @@ -45,8 +45,8 @@ function uniswap_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with: "YulException: Variable ret_0 is 1 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with: "YulException: Variable ret_0 is 1 slot(s) too deep inside the stack." + ir-no-optimize + ir-optimize-evm-only ir-optimize-evm+yul legacy-no-optimize legacy-optimize-evm-only diff --git a/test/externalTests/yield-liquidator.sh b/test/externalTests/yield-liquidator.sh index 3c7137f7377b..7a4353af578e 100755 --- a/test/externalTests/yield-liquidator.sh +++ b/test/externalTests/yield-liquidator.sh @@ -45,8 +45,8 @@ function yield_liquidator_test local compile_only_presets=() local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_roles_168_mpos is 2 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var__33 is 6 slot(s) too deep inside the stack." + ir-no-optimize + ir-optimize-evm-only ir-optimize-evm+yul legacy-optimize-evm-only legacy-optimize-evm+yul diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index 4ac04a66d188..a8d72e82a22e 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -46,11 +46,12 @@ function zeppelin_test local ref="master" local config_file="hardhat.config.js" - local compile_only_presets=() + local compile_only_presets=( + #ir-no-optimize # Compilation fails with "Contract initcode size is 49410 bytes and exceeds 49152 bytes (a limit introduced in Shanghai)." + ir-optimize-evm-only # FIXME: A few tests fail with "Transaction: ... exited with an error (status 0) after consuming all gas." +) local settings_presets=( "${compile_only_presets[@]}" - #ir-no-optimize # Compilation fails with "YulException: Variable var_account_852 is 4 slot(s) too deep inside the stack." - #ir-optimize-evm-only # Compilation fails with "YulException: Variable var_account_852 is 4 slot(s) too deep inside the stack." ir-optimize-evm+yul legacy-no-optimize legacy-optimize-evm-only From b1a773be2fd0bda89b6fe7084e8c9e78f4e7984f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 17 May 2023 14:03:16 +0200 Subject: [PATCH 064/138] IRGenerator: Leave IR optimization up to the caller to avoid unnecessarily doing it twice --- Changelog.md | 1 + libsolidity/codegen/ir/IRGenerationContext.h | 4 -- libsolidity/codegen/ir/IRGenerator.cpp | 28 +------------- libsolidity/codegen/ir/IRGenerator.h | 10 +---- libsolidity/interface/CompilerStack.cpp | 37 ++++++++++++++----- test/cmdlineTests/~via_ir_equivalence/test.sh | 6 ++- 6 files changed, 36 insertions(+), 50 deletions(-) diff --git a/Changelog.md b/Changelog.md index 9b70219969a9..c5625d9dbca9 100644 --- a/Changelog.md +++ b/Changelog.md @@ -18,6 +18,7 @@ Bugfixes: * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. + * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. AST Changes: * AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``. diff --git a/libsolidity/codegen/ir/IRGenerationContext.h b/libsolidity/codegen/ir/IRGenerationContext.h index 14a70a8a6c09..833b768a313e 100644 --- a/libsolidity/codegen/ir/IRGenerationContext.h +++ b/libsolidity/codegen/ir/IRGenerationContext.h @@ -23,7 +23,6 @@ #include #include -#include #include #include @@ -73,7 +72,6 @@ class IRGenerationContext langutil::EVMVersion _evmVersion, ExecutionContext _executionContext, RevertStrings _revertStrings, - OptimiserSettings _optimiserSettings, std::map _sourceIndices, langutil::DebugInfoSelection const& _debugInfoSelection, langutil::CharStreamProvider const* _soliditySourceProvider @@ -81,7 +79,6 @@ class IRGenerationContext m_evmVersion(_evmVersion), m_executionContext(_executionContext), m_revertStrings(_revertStrings), - m_optimiserSettings(std::move(_optimiserSettings)), m_sourceIndices(std::move(_sourceIndices)), m_debugInfoSelection(_debugInfoSelection), m_soliditySourceProvider(_soliditySourceProvider) @@ -176,7 +173,6 @@ class IRGenerationContext langutil::EVMVersion m_evmVersion; ExecutionContext m_executionContext; RevertStrings m_revertStrings; - OptimiserSettings m_optimiserSettings; std::map m_sourceIndices; std::set m_usedSourceNames; ContractDefinition const* m_mostDerivedContract = nullptr; diff --git a/libsolidity/codegen/ir/IRGenerator.cpp b/libsolidity/codegen/ir/IRGenerator.cpp index bbc5ef3ac7b5..223d712f0ded 100644 --- a/libsolidity/codegen/ir/IRGenerator.cpp +++ b/libsolidity/codegen/ir/IRGenerator.cpp @@ -89,36 +89,13 @@ set collectReachableCallables( } -tuple IRGenerator::run( +string IRGenerator::run( ContractDefinition const& _contract, bytes const& _cborMetadata, map const& _otherYulSources ) { - string ir = yul::reindent(generate(_contract, _cborMetadata, _otherYulSources)); - - yul::YulStack asmStack( - m_evmVersion, - m_eofVersion, - yul::YulStack::Language::StrictAssembly, - m_optimiserSettings, - m_context.debugInfoSelection() - ); - if (!asmStack.parseAndAnalyze("", ir)) - { - string errorMessage; - for (auto const& error: asmStack.errors()) - errorMessage += langutil::SourceReferenceFormatter::formatErrorInformation( - *error, - asmStack.charStream("") - ); - solAssert(false, ir + "\n\nInvalid IR generated:\n" + errorMessage + "\n"); - } - Json::Value irAst = asmStack.astJson(); - asmStack.optimize(); - Json::Value irOptAst = asmStack.astJson(); - - return {std::move(ir), std::move(irAst), asmStack.print(m_context.soliditySourceProvider()), std::move(irOptAst)}; + return yul::reindent(generate(_contract, _cborMetadata, _otherYulSources)); } string IRGenerator::generate( @@ -1116,7 +1093,6 @@ void IRGenerator::resetContext(ContractDefinition const& _contract, ExecutionCon m_evmVersion, _context, m_context.revertStrings(), - m_optimiserSettings, m_context.sourceIndices(), m_context.debugInfoSelection(), m_context.soliditySourceProvider() diff --git a/libsolidity/codegen/ir/IRGenerator.h b/libsolidity/codegen/ir/IRGenerator.h index 9001244b2cd3..fafe47128035 100644 --- a/libsolidity/codegen/ir/IRGenerator.h +++ b/libsolidity/codegen/ir/IRGenerator.h @@ -23,7 +23,6 @@ #pragma once -#include #include #include #include @@ -50,19 +49,16 @@ class IRGenerator langutil::EVMVersion _evmVersion, std::optional _eofVersion, RevertStrings _revertStrings, - OptimiserSettings _optimiserSettings, std::map _sourceIndices, langutil::DebugInfoSelection const& _debugInfoSelection, langutil::CharStreamProvider const* _soliditySourceProvider ): m_evmVersion(_evmVersion), m_eofVersion(_eofVersion), - m_optimiserSettings(_optimiserSettings), m_context( _evmVersion, ExecutionContext::Creation, _revertStrings, - std::move(_optimiserSettings), std::move(_sourceIndices), _debugInfoSelection, _soliditySourceProvider @@ -70,9 +66,8 @@ class IRGenerator m_utils(_evmVersion, m_context.revertStrings(), m_context.functionCollector()) {} - /// Generates and returns the IR code, in unoptimized and optimized form - /// (or just pretty-printed, depending on the optimizer settings). - std::tuple run( + /// Generates and returns (unoptimized) IR code. + std::string run( ContractDefinition const& _contract, bytes const& _cborMetadata, std::map const& _otherYulSources @@ -143,7 +138,6 @@ class IRGenerator langutil::EVMVersion const m_evmVersion; std::optional const m_eofVersion; - OptimiserSettings const m_optimiserSettings; IRGenerationContext m_context; YulUtilFunctions m_utils; diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index aad2bc2baf2d..bbebc25085cc 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -70,6 +70,7 @@ #include #include +#include #include @@ -1468,22 +1469,38 @@ void CompilerStack::generateIR(ContractDefinition const& _contract) m_evmVersion, m_eofVersion, m_revertStrings, - m_optimiserSettings, sourceIndices(), m_debugInfoSelection, this ); - - tie( - compiledContract.yulIR, - compiledContract.yulIRAst, - compiledContract.yulIROptimized, - compiledContract.yulIROptimizedAst - ) = generator.run( + compiledContract.yulIR = generator.run( _contract, createCBORMetadata(compiledContract, /* _forIR */ true), otherYulSources ); + + yul::YulStack stack( + m_evmVersion, + m_eofVersion, + yul::YulStack::Language::StrictAssembly, + m_optimiserSettings, + m_debugInfoSelection + ); + if (!stack.parseAndAnalyze("", compiledContract.yulIR)) + { + string errorMessage; + for (auto const& error: stack.errors()) + errorMessage += langutil::SourceReferenceFormatter::formatErrorInformation( + *error, + stack.charStream("") + ); + solAssert(false, compiledContract.yulIR + "\n\nInvalid IR generated:\n" + errorMessage + "\n"); + } + + compiledContract.yulIRAst = stack.astJson(); + stack.optimize(); + compiledContract.yulIROptimized = stack.print(this); + compiledContract.yulIROptimizedAst = stack.astJson(); } void CompilerStack::generateEVMFromIR(ContractDefinition const& _contract) @@ -1508,8 +1525,8 @@ void CompilerStack::generateEVMFromIR(ContractDefinition const& _contract) m_optimiserSettings, m_debugInfoSelection ); - stack.parseAndAnalyze("", compiledContract.yulIROptimized); - stack.optimize(); + bool analysisSuccessful = stack.parseAndAnalyze("", compiledContract.yulIROptimized); + solAssert(analysisSuccessful); //cout << yul::AsmPrinter{}(*stack.parserResult()->code) << endl; diff --git a/test/cmdlineTests/~via_ir_equivalence/test.sh b/test/cmdlineTests/~via_ir_equivalence/test.sh index c318f262a088..d663bef858c5 100755 --- a/test/cmdlineTests/~via_ir_equivalence/test.sh +++ b/test/cmdlineTests/~via_ir_equivalence/test.sh @@ -33,7 +33,8 @@ function test_via_ir_equivalence() for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do asm_output_two_stage+=$( msg_on_error --no-stderr \ - "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" "$yul_file" | stripCLIDecorations + "$SOLC" --strict-assembly --asm "${optimizer_flags[@]}" --no-optimize-yul "$yul_file" | + stripCLIDecorations ) done @@ -50,7 +51,8 @@ function test_via_ir_equivalence() for yul_file in $(find . -name "${output_file_prefix}*.yul" | sort -V); do bin_output_two_stage+=$( msg_on_error --no-stderr \ - "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" | stripCLIDecorations + "$SOLC" --strict-assembly --bin "${optimizer_flags[@]}" "$yul_file" --no-optimize-yul | + stripCLIDecorations ) done From 74a38fc3d837d276cdf1aa0eb217e69f2890f8ec Mon Sep 17 00:00:00 2001 From: Jun Zhang Date: Thu, 8 Jun 2023 19:03:59 +0800 Subject: [PATCH 065/138] Fix incorrect CMAKE_SOURCE_DIR usage When using solidity as a third-party library (include it into our project using FetchContent), we encountered a strange compilation error. For some reason, cmake considers the root directory of the project as the root directory of the dependency (solidity). This is because solidity is incorrectly using CMAKE_SOURCE_DIR variable, which should be PROJECT_SOURCE_DIR (The former one refers to the top-level source directory that contains a CMakeLists.txt, while the latter refers to the source directory of the most recent project() command) I've created a repo for demonstration (https://github.com/junaire/test-solidity-fetch-content) Signed-off-by: Jun Zhang --- CMakeLists.txt | 6 +++--- cmake/EthCompilerSettings.cmake | 2 +- cmake/fmtlib.cmake | 2 +- cmake/jsoncpp.cmake | 2 +- cmake/range-v3.cmake | 2 +- libsolutil/CMakeLists.txt | 2 +- libstdlib/CMakeLists.txt | 8 ++++---- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85d2f64ce810..6583f7cd4742 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ list(APPEND CMAKE_MODULE_PATH ${ETH_CMAKE_DIR}) # Set the build type, if none was specified. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + if(EXISTS "${PROJECT_SOURCE_DIR}/.git") set(DEFAULT_BUILD_TYPE "RelWithDebInfo") else() set(DEFAULT_BUILD_TYPE "Release") @@ -66,12 +66,12 @@ include(EthUtils) # Create license.h from LICENSE.txt and template # Converting to char array is required due to MSVC's string size limit. -file(READ ${CMAKE_SOURCE_DIR}/LICENSE.txt LICENSE_TEXT HEX) +file(READ ${PROJECT_SOURCE_DIR}/LICENSE.txt LICENSE_TEXT HEX) string(REGEX MATCHALL ".." LICENSE_TEXT "${LICENSE_TEXT}") string(REGEX REPLACE ";" ",\n\t0x" LICENSE_TEXT "${LICENSE_TEXT}") set(LICENSE_TEXT "0x${LICENSE_TEXT}") -configure_file("${CMAKE_SOURCE_DIR}/cmake/templates/license.h.in" include/license.h) +configure_file("${PROJECT_SOURCE_DIR}/cmake/templates/license.h.in" include/license.h) include(EthOptions) configure_project(TESTS) diff --git a/cmake/EthCompilerSettings.cmake b/cmake/EthCompilerSettings.cmake index 4dd593458459..6cfa864c1d1a 100644 --- a/cmake/EthCompilerSettings.cmake +++ b/cmake/EthCompilerSettings.cmake @@ -28,7 +28,7 @@ if(PEDANTIC) endif() # Prevent the path of the source directory from ending up in the binary via __FILE__ macros. -eth_add_cxx_compiler_flag_if_supported("-fmacro-prefix-map=${CMAKE_SOURCE_DIR}=/solidity") +eth_add_cxx_compiler_flag_if_supported("-fmacro-prefix-map=${PROJECT_SOURCE_DIR}=/solidity") # -Wpessimizing-move warns when a call to std::move would prevent copy elision # if the argument was not wrapped in a call. This happens when moving a local diff --git a/cmake/fmtlib.cmake b/cmake/fmtlib.cmake index 5ed196cea04d..2610424f606a 100644 --- a/cmake/fmtlib.cmake +++ b/cmake/fmtlib.cmake @@ -3,7 +3,7 @@ include(FetchContent) FetchContent_Declare( fmtlib PREFIX "${CMAKE_BINARY_DIR}/deps" - DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/deps/downloads" + DOWNLOAD_DIR "${PROJECT_SOURCE_DIR}/deps/downloads" DOWNLOAD_NAME fmt-8.0.1.tar.gz URL https://github.com/fmtlib/fmt/archive/8.0.1.tar.gz URL_HASH SHA256=b06ca3130158c625848f3fb7418f235155a4d389b2abc3a6245fb01cb0eb1e01 diff --git a/cmake/jsoncpp.cmake b/cmake/jsoncpp.cmake index 29b8f5f05138..48a9d2b4935b 100644 --- a/cmake/jsoncpp.cmake +++ b/cmake/jsoncpp.cmake @@ -42,7 +42,7 @@ endif() ExternalProject_Add(jsoncpp-project PREFIX "${prefix}" - DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/deps/downloads" + DOWNLOAD_DIR "${PROJECT_SOURCE_DIR}/deps/downloads" DOWNLOAD_NAME jsoncpp-1.9.3.tar.gz URL https://github.com/open-source-parsers/jsoncpp/archive/1.9.3.tar.gz URL_HASH SHA256=8593c1d69e703563d94d8c12244e2e18893eeb9a8a9f8aa3d09a327aa45c8f7d diff --git a/cmake/range-v3.cmake b/cmake/range-v3.cmake index 75ed5a92e372..4f3225420e11 100644 --- a/cmake/range-v3.cmake +++ b/cmake/range-v3.cmake @@ -11,7 +11,7 @@ set(RANGE_V3_INCLUDE_DIR "${prefix}/include") ExternalProject_Add(range-v3-project PREFIX "${prefix}" - DOWNLOAD_DIR "${CMAKE_SOURCE_DIR}/deps/downloads" + DOWNLOAD_DIR "${PROJECT_SOURCE_DIR}/deps/downloads" DOWNLOAD_NAME range-v3-0.12.0.tar.gz URL https://github.com/ericniebler/range-v3/archive/0.12.0.tar.gz URL_HASH SHA256=015adb2300a98edfceaf0725beec3337f542af4915cec4d0b89fa0886f4ba9cb diff --git a/libsolutil/CMakeLists.txt b/libsolutil/CMakeLists.txt index b368e12f9dab..201429bb75e9 100644 --- a/libsolutil/CMakeLists.txt +++ b/libsolutil/CMakeLists.txt @@ -46,7 +46,7 @@ set(sources add_library(solutil ${sources}) target_link_libraries(solutil PUBLIC jsoncpp Boost::boost Boost::filesystem Boost::system range-v3 fmt::fmt-header-only) -target_include_directories(solutil PUBLIC "${CMAKE_SOURCE_DIR}") +target_include_directories(solutil PUBLIC "${PROJECT_SOURCE_DIR}") add_dependencies(solutil solidity_BuildInfo.h) if(SOLC_LINK_STATIC) diff --git a/libstdlib/CMakeLists.txt b/libstdlib/CMakeLists.txt index a4523b99ebe9..4a995c78f149 100644 --- a/libstdlib/CMakeLists.txt +++ b/libstdlib/CMakeLists.txt @@ -1,18 +1,18 @@ # This will re-generate the headers if any file within src was modified. -set_directory_properties(PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/stdlib/src/) +set_directory_properties(PROPERTY CMAKE_CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/stdlib/src/) set(STDLIB stub) set(GENERATED_STDLIB_HEADERS) foreach(src IN LISTS STDLIB) - set(STDLIB_FILE ${CMAKE_SOURCE_DIR}/libstdlib/src/${src}.sol) + set(STDLIB_FILE ${PROJECT_SOURCE_DIR}/libstdlib/src/${src}.sol) file(READ ${STDLIB_FILE} STDLIB_FILE_CONTENT HEX) string(REGEX MATCHALL ".." STDLIB_FILE_CONTENT "${STDLIB_FILE_CONTENT}") list(REMOVE_ITEM STDLIB_FILE_CONTENT "0d") string(REGEX REPLACE ";" ",\n\t0x" STDLIB_FILE_CONTENT "${STDLIB_FILE_CONTENT}") set(STDLIB_FILE_CONTENT "0x${STDLIB_FILE_CONTENT}") set(STDLIB_FILE_NAME ${src}) - configure_file("${CMAKE_SOURCE_DIR}/libstdlib/stdlib.src.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h NEWLINE_STYLE LF @ONLY) + configure_file("${PROJECT_SOURCE_DIR}/libstdlib/stdlib.src.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h NEWLINE_STYLE LF @ONLY) list(APPEND GENERATED_STDLIB_HEADERS ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h) endforeach() -configure_file("${CMAKE_SOURCE_DIR}/libstdlib/stdlib.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/stdlib.h NEWLINE_STYLE LF @ONLY) +configure_file("${PROJECT_SOURCE_DIR}/libstdlib/stdlib.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/stdlib.h NEWLINE_STYLE LF @ONLY) From 8c5ecd1c0114aeb5e0ac24dc58218220d858237b Mon Sep 17 00:00:00 2001 From: Jun Zhang Date: Sat, 10 Jun 2023 00:21:55 +0800 Subject: [PATCH 066/138] Fix incorrectly CMAKE_BINARY_DIR usage Similiar to CMAKE_SOURCE_DIR. Using CMAKE_BINARY_DIR will put the generated header (stdlib.h) in build/include/solidity/libstdlib but it should start with build/third-party/solidity or the library can't find the header. Signed-off-by: Jun Zhang --- cmake/fmtlib.cmake | 2 +- cmake/jsoncpp.cmake | 2 +- cmake/range-v3.cmake | 2 +- libstdlib/CMakeLists.txt | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/fmtlib.cmake b/cmake/fmtlib.cmake index 2610424f606a..792bf3b0279a 100644 --- a/cmake/fmtlib.cmake +++ b/cmake/fmtlib.cmake @@ -2,7 +2,7 @@ include(FetchContent) FetchContent_Declare( fmtlib - PREFIX "${CMAKE_BINARY_DIR}/deps" + PREFIX "${PROJECT_BINARY_DIR}/deps" DOWNLOAD_DIR "${PROJECT_SOURCE_DIR}/deps/downloads" DOWNLOAD_NAME fmt-8.0.1.tar.gz URL https://github.com/fmtlib/fmt/archive/8.0.1.tar.gz diff --git a/cmake/jsoncpp.cmake b/cmake/jsoncpp.cmake index 48a9d2b4935b..cf1cc656b3b0 100644 --- a/cmake/jsoncpp.cmake +++ b/cmake/jsoncpp.cmake @@ -6,7 +6,7 @@ else() set(JSONCPP_CMAKE_COMMAND ${CMAKE_COMMAND}) endif() -set(prefix "${CMAKE_BINARY_DIR}/deps") +set(prefix "${PROJECT_BINARY_DIR}/deps") set(JSONCPP_LIBRARY "${prefix}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}jsoncpp${CMAKE_STATIC_LIBRARY_SUFFIX}") set(JSONCPP_INCLUDE_DIR "${prefix}/include") diff --git a/cmake/range-v3.cmake b/cmake/range-v3.cmake index 4f3225420e11..d2f54452b319 100644 --- a/cmake/range-v3.cmake +++ b/cmake/range-v3.cmake @@ -6,7 +6,7 @@ else() set(RANGE_V3_CMAKE_COMMAND ${CMAKE_COMMAND}) endif() -set(prefix "${CMAKE_BINARY_DIR}/deps") +set(prefix "${PROJECT_BINARY_DIR}/deps") set(RANGE_V3_INCLUDE_DIR "${prefix}/include") ExternalProject_Add(range-v3-project diff --git a/libstdlib/CMakeLists.txt b/libstdlib/CMakeLists.txt index 4a995c78f149..65a3a1cda16b 100644 --- a/libstdlib/CMakeLists.txt +++ b/libstdlib/CMakeLists.txt @@ -11,8 +11,8 @@ foreach(src IN LISTS STDLIB) string(REGEX REPLACE ";" ",\n\t0x" STDLIB_FILE_CONTENT "${STDLIB_FILE_CONTENT}") set(STDLIB_FILE_CONTENT "0x${STDLIB_FILE_CONTENT}") set(STDLIB_FILE_NAME ${src}) - configure_file("${PROJECT_SOURCE_DIR}/libstdlib/stdlib.src.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h NEWLINE_STYLE LF @ONLY) - list(APPEND GENERATED_STDLIB_HEADERS ${CMAKE_BINARY_DIR}/include/libstdlib/${src}.h) + configure_file("${PROJECT_SOURCE_DIR}/libstdlib/stdlib.src.h.in" ${PROJECT_BINARY_DIR}/include/libstdlib/${src}.h NEWLINE_STYLE LF @ONLY) + list(APPEND GENERATED_STDLIB_HEADERS ${PROJECT_BINARY_DIR}/include/libstdlib/${src}.h) endforeach() -configure_file("${PROJECT_SOURCE_DIR}/libstdlib/stdlib.h.in" ${CMAKE_BINARY_DIR}/include/libstdlib/stdlib.h NEWLINE_STYLE LF @ONLY) +configure_file("${PROJECT_SOURCE_DIR}/libstdlib/stdlib.h.in" ${PROJECT_BINARY_DIR}/include/libstdlib/stdlib.h NEWLINE_STYLE LF @ONLY) From 54c0ca99c3978ac4dc5fe28317f3110c15158ad8 Mon Sep 17 00:00:00 2001 From: r0qs Date: Mon, 12 Jun 2023 14:49:11 +0200 Subject: [PATCH 067/138] Bump circleci cimg/node version --- .circleci/config.yml | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 68092cc98fac..d5ea61ad264e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -592,13 +592,14 @@ defaults: name: t_native_test_ext_gnosis project: gnosis binary_type: native - image: cimg/node:16.18 + image: cimg/node:18.16 - job_native_test_ext_zeppelin: &job_native_test_ext_zeppelin <<: *requires_b_ubu_static name: t_native_test_ext_zeppelin project: zeppelin binary_type: native + image: cimg/node:18.16 resource_class: large - job_native_test_ext_ens: &job_native_test_ext_ens @@ -606,14 +607,14 @@ defaults: name: t_native_test_ext_ens project: ens binary_type: native - image: cimg/node:18.11 + image: cimg/node:18.16 - job_native_test_ext_trident: &job_native_test_ext_trident <<: *requires_b_ubu_static name: t_native_test_ext_trident project: trident binary_type: native - image: cimg/node:16.18 + image: cimg/node:18.16 - job_native_test_ext_euler: &job_native_test_ext_euler <<: *requires_b_ubu_static @@ -627,6 +628,7 @@ defaults: name: t_native_test_ext_yield_liquidator project: yield-liquidator binary_type: native + image: cimg/node:18.16 - job_native_test_ext_bleeps: &job_native_test_ext_bleeps <<: *requires_b_ubu_static @@ -640,34 +642,35 @@ defaults: name: t_native_test_ext_pool_together project: pool-together binary_type: native - image: cimg/node:16.18 + image: cimg/node:18.16 - job_native_test_ext_perpetual_pools: &job_native_test_ext_perpetual_pools <<: *requires_b_ubu_static name: t_native_test_ext_perpetual_pools project: perpetual-pools binary_type: native - image: cimg/node:18.11 + image: cimg/node:18.16 - job_native_test_ext_uniswap: &job_native_test_ext_uniswap <<: *requires_b_ubu_static name: t_native_test_ext_uniswap project: uniswap binary_type: native - image: cimg/node:16.18 + image: cimg/node:18.16 - job_native_test_ext_prb_math: &job_native_test_ext_prb_math <<: *requires_b_ubu_static name: t_native_test_ext_prb_math project: prb-math binary_type: native - image: cimg/node:18.11 + image: cimg/node:18.16 - job_native_test_ext_elementfi: &job_native_test_ext_elementfi <<: *requires_b_ubu_static name: t_native_test_ext_elementfi project: elementfi binary_type: native + image: cimg/node:18.16 resource_class: medium - job_native_test_ext_brink: &job_native_test_ext_brink @@ -675,14 +678,14 @@ defaults: name: t_native_test_ext_brink project: brink binary_type: native - image: cimg/node:18.11 + image: cimg/node:18.16 - job_native_test_ext_chainlink: &job_native_test_ext_chainlink <<: *requires_b_ubu_static name: t_native_test_ext_chainlink project: chainlink binary_type: native - image: cimg/node:16.18 + image: cimg/node:18.16 resource_class: large # Tests run out of memory on a smaller machine - job_native_test_ext_gp2: &job_native_test_ext_gp2 @@ -690,7 +693,7 @@ defaults: name: t_native_test_ext_gp2 project: gp2 binary_type: native - image: cimg/node:18.11 + image: cimg/node:18.16 - job_b_ubu_asan_clang: &job_b_ubu_asan_clang <<: *on_all_tags_and_branches @@ -1228,7 +1231,7 @@ jobs: t_ems_ext_hardhat: <<: *base_node_small docker: - - image: cimg/node:18.11 + - image: cimg/node:18.16 environment: TERM: xterm HARDHAT_TESTS_SOLC_PATH: /tmp/workspace/soljson.js From b7abd9bba47d9fad50cc196ed7b16b92c4f5b309 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 7 Jun 2023 15:55:22 +0200 Subject: [PATCH 068/138] Deterministically choose memory slots for variables independently of names that may depend on AST IDs. --- Changelog.md | 1 + libyul/CompilabilityChecker.cpp | 4 +- libyul/CompilabilityChecker.h | 2 +- libyul/optimiser/CallGraphGenerator.cpp | 5 ++- libyul/optimiser/CallGraphGenerator.h | 2 +- libyul/optimiser/FullInliner.cpp | 5 ++- libyul/optimiser/StackLimitEvader.cpp | 15 ++++--- libyul/optimiser/StackLimitEvader.h | 2 +- test/libyul/YulOptimizerTestCommon.cpp | 5 ++- .../fakeStackLimitEvader/connected.yul | 10 ++--- .../fakeStackLimitEvader/stub.yul | 14 +++---- .../stackLimitEvader/too_many_args_14.yul | 18 ++++----- .../stackLimitEvader/too_many_args_15.yul | 24 +++++------ .../stackLimitEvader/too_many_args_16.yul | 26 ++++++------ .../verbatim_many_arguments.yul | 6 +-- .../verbatim_many_arguments_and_returns.yul | 40 +++++++++---------- 16 files changed, 97 insertions(+), 82 deletions(-) diff --git a/Changelog.md b/Changelog.md index c5625d9dbca9..75d1cf773f3a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -18,6 +18,7 @@ Bugfixes: * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. + * Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation. * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. AST Changes: diff --git a/libyul/CompilabilityChecker.cpp b/libyul/CompilabilityChecker.cpp index acb48cfa5488..b9b51731b1ea 100644 --- a/libyul/CompilabilityChecker.cpp +++ b/libyul/CompilabilityChecker.cpp @@ -63,7 +63,9 @@ CompilabilityChecker::CompilabilityChecker( for (StackTooDeepError const& error: transform.stackErrors()) { - unreachableVariables[error.functionName].emplace(error.variable); + auto& unreachables = unreachableVariables[error.functionName]; + if (!util::contains(unreachables, error.variable)) + unreachables.emplace_back(error.variable); int& deficit = stackDeficit[error.functionName]; deficit = std::max(error.depth, deficit); } diff --git a/libyul/CompilabilityChecker.h b/libyul/CompilabilityChecker.h index 307d719e4b0e..c046df94ffb9 100644 --- a/libyul/CompilabilityChecker.h +++ b/libyul/CompilabilityChecker.h @@ -45,7 +45,7 @@ namespace solidity::yul struct CompilabilityChecker { CompilabilityChecker(Dialect const& _dialect, Object const& _object, bool _optimizeStackAllocation); - std::map> unreachableVariables; + std::map> unreachableVariables; std::map stackDeficit; }; diff --git a/libyul/optimiser/CallGraphGenerator.cpp b/libyul/optimiser/CallGraphGenerator.cpp index 5aeff50be5e7..66f740391dc1 100644 --- a/libyul/optimiser/CallGraphGenerator.cpp +++ b/libyul/optimiser/CallGraphGenerator.cpp @@ -22,6 +22,7 @@ #include #include +#include #include using namespace std; @@ -79,7 +80,9 @@ CallGraph CallGraphGenerator::callGraph(Block const& _ast) void CallGraphGenerator::operator()(FunctionCall const& _functionCall) { - m_callGraph.functionCalls[m_currentFunction].insert(_functionCall.functionName.name); + auto& functionCalls = m_callGraph.functionCalls[m_currentFunction]; + if (!util::contains(functionCalls, _functionCall.functionName.name)) + functionCalls.emplace_back(_functionCall.functionName.name); ASTWalker::operator()(_functionCall); } diff --git a/libyul/optimiser/CallGraphGenerator.h b/libyul/optimiser/CallGraphGenerator.h index a581df018202..ad19878b6892 100644 --- a/libyul/optimiser/CallGraphGenerator.h +++ b/libyul/optimiser/CallGraphGenerator.h @@ -32,7 +32,7 @@ namespace solidity::yul struct CallGraph { - std::map> functionCalls; + std::map> functionCalls; std::set functionsWithLoops; /// @returns the set of functions contained in cycles in the call graph, i.e. /// functions that are part of a (mutual) recursion. diff --git a/libyul/optimiser/FullInliner.cpp b/libyul/optimiser/FullInliner.cpp index 9ffe871faf08..0482e20d62e4 100644 --- a/libyul/optimiser/FullInliner.cpp +++ b/libyul/optimiser/FullInliner.cpp @@ -37,6 +37,8 @@ #include #include +#include + using namespace std; using namespace solidity; using namespace solidity::yul; @@ -156,7 +158,8 @@ map FullInliner::callDepths() const } for (auto& call: cg.functionCalls) - call.second -= removed; + for (YulString toBeRemoved: removed) + ranges::actions::remove(call.second, toBeRemoved); currentDepth++; diff --git a/libyul/optimiser/StackLimitEvader.cpp b/libyul/optimiser/StackLimitEvader.cpp index b4b9d5469a48..4c84f5155d41 100644 --- a/libyul/optimiser/StackLimitEvader.cpp +++ b/libyul/optimiser/StackLimitEvader.cpp @@ -97,9 +97,9 @@ struct MemoryOffsetAllocator /// Maps function names to the set of unreachable variables in that function. /// An empty variable name means that the function has too many arguments or return variables. - map> const& unreachableVariables; + map> const& unreachableVariables; /// The graph of immediate function calls of all functions. - map> const& callGraph; + map> const& callGraph; /// Maps the name of each user-defined function to its definition. map const& functionDefinitions; @@ -149,18 +149,23 @@ void StackLimitEvader::run( map> const& _stackTooDeepErrors ) { - map> unreachableVariables; + map> unreachableVariables; for (auto&& [function, stackTooDeepErrors]: _stackTooDeepErrors) + { + auto& unreachables = unreachableVariables[function]; // TODO: choose wisely. for (auto const& stackTooDeepError: stackTooDeepErrors) - unreachableVariables[function] += stackTooDeepError.variableChoices | ranges::views::take(stackTooDeepError.deficit) | ranges::to>; + for (auto variable: stackTooDeepError.variableChoices | ranges::views::take(stackTooDeepError.deficit)) + if (!util::contains(unreachables, variable)) + unreachables.emplace_back(variable); + } run(_context, _object, unreachableVariables); } void StackLimitEvader::run( OptimiserStepContext& _context, Object& _object, - map> const& _unreachableVariables + map> const& _unreachableVariables ) { yulAssert(_object.code, ""); diff --git a/libyul/optimiser/StackLimitEvader.h b/libyul/optimiser/StackLimitEvader.h index ae2d31c37591..025553200f05 100644 --- a/libyul/optimiser/StackLimitEvader.h +++ b/libyul/optimiser/StackLimitEvader.h @@ -60,7 +60,7 @@ class StackLimitEvader static void run( OptimiserStepContext& _context, Object& _object, - std::map> const& _unreachableVariables + std::map> const& _unreachableVariables ); /// @a _stackTooDeepErrors can be determined by the StackLayoutGenerator. /// Can only be run on the EVM dialect with objects. diff --git a/test/libyul/YulOptimizerTestCommon.cpp b/test/libyul/YulOptimizerTestCommon.cpp index 7e5f324305ed..48c7ea403850 100644 --- a/test/libyul/YulOptimizerTestCommon.cpp +++ b/test/libyul/YulOptimizerTestCommon.cpp @@ -349,7 +349,7 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( // Mark all variables with a name starting with "$" for escalation to memory. struct FakeUnreachableGenerator: ASTWalker { - map> fakeUnreachables; + map> fakeUnreachables; using ASTWalker::operator(); void operator()(FunctionDefinition const& _function) override { @@ -365,7 +365,8 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( void visitVariableName(YulString _var) { if (!_var.empty() && _var.str().front() == '$') - fakeUnreachables[m_currentFunction].insert(_var); + if (!util::contains(fakeUnreachables[m_currentFunction], _var)) + fakeUnreachables[m_currentFunction].emplace_back(_var); } void operator()(VariableDeclaration const& _varDecl) override { diff --git a/test/libyul/yulOptimizerTests/fakeStackLimitEvader/connected.yul b/test/libyul/yulOptimizerTests/fakeStackLimitEvader/connected.yul index 82ab48a513b2..99e92c183edc 100644 --- a/test/libyul/yulOptimizerTests/fakeStackLimitEvader/connected.yul +++ b/test/libyul/yulOptimizerTests/fakeStackLimitEvader/connected.yul @@ -36,13 +36,13 @@ // } // function f() -> x // { -// mstore(0x20, 0) -// mstore(0x20, 42) +// mstore(0x40, 0) +// mstore(0x40, 42) // let $x3_4, $x4_5 := g() // mstore(0x00, $x4_5) -// mstore(0x40, $x3_4) -// x := mul(add(mload(0x20), mload(0x40)), h(mload(0x00))) -// sstore(mload(0x40), mload(0x00)) +// mstore(0x20, $x3_4) +// x := mul(add(mload(0x40), mload(0x20)), h(mload(0x00))) +// sstore(mload(0x20), mload(0x00)) // } // function h(v) -> a_1 // { diff --git a/test/libyul/yulOptimizerTests/fakeStackLimitEvader/stub.yul b/test/libyul/yulOptimizerTests/fakeStackLimitEvader/stub.yul index d2fcb116ea74..e86619e464b2 100644 --- a/test/libyul/yulOptimizerTests/fakeStackLimitEvader/stub.yul +++ b/test/libyul/yulOptimizerTests/fakeStackLimitEvader/stub.yul @@ -30,10 +30,10 @@ // mstore(0x40, memoryguard(0x80)) // function f() // { -// mstore(0x40, 0) -// mstore(0x60, 42) -// sstore(mload(0x40), mload(0x60)) -// mstore(0x40, 21) +// mstore(0x60, 0) +// mstore(0x40, 42) +// sstore(mload(0x60), mload(0x40)) +// mstore(0x60, 21) // } // function g(gx) // { @@ -60,9 +60,9 @@ // { // let $hx_9, $hy_10, $hz_11, $hw_12 := tuple4() // mstore(0x00, $hw_12) -// mstore(0x60, $hz_11) +// mstore(0x20, $hz_11) // mstore(0x40, $hy_10) -// mstore(0x20, $hx_9) +// mstore(0x60, $hx_9) // { // let hx_13, $hy_14, hz_15, $hw_16 := tuple4() // mstore(0x00, $hw_16) @@ -73,7 +73,7 @@ // { // let $hx_17, $hy_18, hz_19, hw_20 := tuple4() // mstore(0x40, $hy_18) -// mstore(0x20, $hx_17) +// mstore(0x60, $hx_17) // hw := hw_20 // hz := hz_19 // } diff --git a/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_14.yul b/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_14.yul index 74c74e36f301..02614c492db8 100644 --- a/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_14.yul +++ b/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_14.yul @@ -39,17 +39,17 @@ // mstore(0x0140, b12) // mstore(0x0120, b13) // mstore(0x0100, b14) -// mstore(0xc0, b17) -// mstore(0xa0, b18) -// mstore(0x80, b19) -// mstore(0xe0, b29) +// mstore(0xe0, b17) +// mstore(0xc0, b18) +// mstore(0xa0, b19) +// mstore(0x80, b29) // sstore(0, mload(0x0100)) // sstore(1, b15) // sstore(2, b16) -// sstore(3, mload(0xc0)) -// sstore(4, mload(0xa0)) -// sstore(5, mload(0x80)) -// sstore(6, mload(0xe0)) -// v := add(mload(0x02a0), mload(0xe0)) +// sstore(3, mload(0xe0)) +// sstore(4, mload(0xc0)) +// sstore(5, mload(0xa0)) +// sstore(6, mload(0x80)) +// v := add(mload(0x02a0), mload(0x80)) // } // } diff --git a/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_15.yul b/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_15.yul index 8df48f3768eb..9ce9be70ab88 100644 --- a/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_15.yul +++ b/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_15.yul @@ -42,20 +42,20 @@ // mstore(0x0160, b13) // mstore(0x0140, b14) // mstore(0x0120, b15) -// mstore(0xc0, b17) -// mstore(0xa0, b18) -// mstore(0x80, b19) -// mstore(0xe0, b29) -// mstore(0x0100, b30) +// mstore(0x0100, b17) +// mstore(0xe0, b18) +// mstore(0xc0, b19) +// mstore(0xa0, b29) +// mstore(0x80, b30) // sstore(0, mload(0x0140)) // sstore(1, mload(0x0120)) // sstore(2, b16) -// sstore(3, mload(0xc0)) -// sstore(4, mload(0xa0)) -// sstore(5, mload(0x80)) -// sstore(6, mload(0xe0)) -// sstore(7, mload(0x0100)) -// v := mload(0x0100) -// sstore(mload(0x02e0), mload(0x0100)) +// sstore(3, mload(0x0100)) +// sstore(4, mload(0xe0)) +// sstore(5, mload(0xc0)) +// sstore(6, mload(0xa0)) +// sstore(7, mload(0x80)) +// v := mload(0x80) +// sstore(mload(0x02e0), mload(0x80)) // } // } diff --git a/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_16.yul b/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_16.yul index 42e1aabc2663..5a3b3454c591 100644 --- a/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_16.yul +++ b/test/libyul/yulOptimizerTests/stackLimitEvader/too_many_args_16.yul @@ -43,21 +43,21 @@ // mstore(0x0180, b14) // mstore(0x0160, b15) // mstore(0x0140, b16) -// mstore(0xc0, b17) -// mstore(0xa0, b18) -// mstore(0x80, b19) -// mstore(0xe0, b29) -// mstore(0x0120, b30) -// mstore(0x0100, b31) +// mstore(0x0120, b17) +// mstore(0x0100, b18) +// mstore(0xe0, b19) +// mstore(0xc0, b29) +// mstore(0xa0, b30) +// mstore(0x80, b31) // sstore(0, mload(0x0180)) // sstore(1, mload(0x0160)) // sstore(2, mload(0x0140)) -// sstore(3, mload(0xc0)) -// sstore(4, mload(0xa0)) -// sstore(5, mload(0x80)) -// sstore(6, mload(0xe0)) -// sstore(7, mload(0x0120)) -// sstore(8, mload(0x0100)) -// v := add(mload(0x0320), mload(0x0100)) +// sstore(3, mload(0x0120)) +// sstore(4, mload(0x0100)) +// sstore(5, mload(0xe0)) +// sstore(6, mload(0xc0)) +// sstore(7, mload(0xa0)) +// sstore(8, mload(0x80)) +// v := add(mload(0x0320), mload(0x80)) // } // } diff --git a/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments.yul b/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments.yul index cb4d69269025..bde030f68ec3 100644 --- a/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments.yul +++ b/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments.yul @@ -39,8 +39,8 @@ // mstore(0x0140, 7) // mstore(0x0160, 8) // mstore(0x0180, 9) -// mstore(0x01c0, 10) -// mstore(0x01a0, 11) +// mstore(0x01a0, 10) +// mstore(0x01c0, 11) // mstore(0x01e0, 12) // let a_13 := 13 // let a_14 := 14 @@ -50,6 +50,6 @@ // let a_18 := 18 // let a_19 := 19 // let a_20 := 20 -// verbatim_20i_0o("test", mload(0x80), mload(0xa0), mload(0xc0), mload(0xe0), mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x01c0), mload(0x01a0), mload(0x01e0), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20) +// verbatim_20i_0o("test", mload(0x80), mload(0xa0), mload(0xc0), mload(0xe0), mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x01a0), mload(0x01c0), mload(0x01e0), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20) // } // } diff --git a/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments_and_returns.yul b/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments_and_returns.yul index de023e9190b7..46435dd210dc 100644 --- a/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments_and_returns.yul +++ b/test/libyul/yulOptimizerTests/stackLimitEvader/verbatim_many_arguments_and_returns.yul @@ -51,17 +51,17 @@ // { // { // mstore(0x40, memoryguard(0x0280)) -// mstore(0x80, 1) -// mstore(0xa0, 2) -// mstore(0xc0, 3) -// mstore(0xe0, 4) -// mstore(0x0100, 5) -// mstore(0x0120, 6) -// mstore(0x0140, 7) -// mstore(0x0160, 8) -// mstore(0x0180, 9) -// mstore(0x0240, 10) -// mstore(0x0220, 11) +// mstore(0x0100, 1) +// mstore(0x0120, 2) +// mstore(0x0140, 3) +// mstore(0x0160, 4) +// mstore(0x0180, 5) +// mstore(0x01a0, 6) +// mstore(0x01c0, 7) +// mstore(0x01e0, 8) +// mstore(0x0200, 9) +// mstore(0x0220, 10) +// mstore(0x0240, 11) // mstore(0x0260, 12) // let a_13 := 13 // let a_14 := 14 @@ -71,11 +71,11 @@ // let a_18 := 18 // let a_19 := 19 // let a_20 := 20 -// let b_1_1, b_2_2, b_3_3, b_4_4, b_5_5, b_6_6, b_7_7, b_8_8, b_9_9, b_10_10, b_11_11, b_12_12, b_13_13, b_14_14, b_15_15, b_16_16, b_17_17, b_18_18, b_19_19, b_20_20 := verbatim_20i_20o("test", mload(0x80), mload(0xa0), mload(0xc0), mload(0xe0), mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x0240), mload(0x0220), mload(0x0260), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20) -// mstore(0x01a0, b_4_4) -// mstore(0x01c0, b_3_3) -// mstore(0x01e0, b_2_2) -// mstore(0x0200, b_1_1) +// let b_1_1, b_2_2, b_3_3, b_4_4, b_5_5, b_6_6, b_7_7, b_8_8, b_9_9, b_10_10, b_11_11, b_12_12, b_13_13, b_14_14, b_15_15, b_16_16, b_17_17, b_18_18, b_19_19, b_20_20 := verbatim_20i_20o("test", mload(0x0100), mload(0x0120), mload(0x0140), mload(0x0160), mload(0x0180), mload(0x01a0), mload(0x01c0), mload(0x01e0), mload(0x0200), mload(0x0220), mload(0x0240), mload(0x0260), a_13, a_14, a_15, a_16, a_17, a_18, a_19, a_20) +// mstore(0x80, b_4_4) +// mstore(0xa0, b_3_3) +// mstore(0xc0, b_2_2) +// mstore(0xe0, b_1_1) // let b_20 := b_20_20 // let b_19 := b_19_19 // let b_18 := b_18_18 @@ -92,10 +92,10 @@ // let b_7 := b_7_7 // let b_6 := b_6_6 // let b_5 := b_5_5 -// sstore(1, mload(0x0200)) -// sstore(2, mload(0x01e0)) -// sstore(3, mload(0x01c0)) -// sstore(4, mload(0x01a0)) +// sstore(1, mload(0xe0)) +// sstore(2, mload(0xc0)) +// sstore(3, mload(0xa0)) +// sstore(4, mload(0x80)) // sstore(5, b_5) // sstore(6, b_6) // sstore(7, b_7) From 28573dc71b01275a11914260c3a203b5070b5fc4 Mon Sep 17 00:00:00 2001 From: r0qs Date: Wed, 14 Jun 2023 09:36:40 +0200 Subject: [PATCH 069/138] Workaround open-zeppelin expectRevertCustomError bug --- test/externalTests/zeppelin.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index a8d72e82a22e..5c0271125197 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -88,6 +88,12 @@ function zeppelin_test sed -i "s|it(\('does not allow remote callback'\)|it.skip(\1|g" test/security/ReentrancyGuard.test.js sed -i "s|shouldBehaveLikeAccessControlDefaultAdminRules|\/\/&|" test/access/AccessControlDefaultAdminRules.test.js + # TODO: Remove when hardhat properly handle reverts of custom errors with via-ir enabled + # and/or open-zeppelin fix https://github.com/OpenZeppelin/openzeppelin-contracts/issues/4349 + sed -i "s|it(\('cannot nest reinitializers'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js + sed -i "s|it(\('prevents re-initialization'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js + sed -i "s|it(\('can lock contract after initialization'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js + # Here only the testToInt(248) and testToInt(256) cases fail so change the loop range to skip them sed -i "s|range(8, 256, 8)\(.forEach(bits => testToInt(bits));\)|range(8, 240, 8)\1|" test/utils/math/SafeCast.test.js From aa012233987ec493a979fe8cc73081262e75b1f0 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Tue, 13 Jun 2023 15:21:26 +0200 Subject: [PATCH 070/138] Account for unassigned return variables in stack layout generation. --- libyul/backends/evm/StackLayoutGenerator.cpp | 33 +++++++++++++------ libyul/backends/evm/StackLayoutGenerator.h | 3 +- .../unassigned_return_variable.yul | 19 +++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 test/libyul/evmCodeTransform/unassigned_return_variable.yul diff --git a/libyul/backends/evm/StackLayoutGenerator.cpp b/libyul/backends/evm/StackLayoutGenerator.cpp index 2d5cdde87fd0..71bf19458b86 100644 --- a/libyul/backends/evm/StackLayoutGenerator.cpp +++ b/libyul/backends/evm/StackLayoutGenerator.cpp @@ -51,10 +51,10 @@ using namespace std; StackLayout StackLayoutGenerator::run(CFG const& _cfg) { StackLayout stackLayout; - StackLayoutGenerator{stackLayout}.processEntryPoint(*_cfg.entry); + StackLayoutGenerator{stackLayout, nullptr}.processEntryPoint(*_cfg.entry); for (auto& functionInfo: _cfg.functionInfo | ranges::views::values) - StackLayoutGenerator{stackLayout}.processEntryPoint(*functionInfo.entry, &functionInfo); + StackLayoutGenerator{stackLayout, &functionInfo}.processEntryPoint(*functionInfo.entry, &functionInfo); return stackLayout; } @@ -83,13 +83,15 @@ vector StackLayoutGenerator::reportStackTooD yulAssert(functionInfo, "Function not found."); } - StackLayoutGenerator generator{stackLayout}; + StackLayoutGenerator generator{stackLayout, functionInfo}; CFG::BasicBlock const* entry = functionInfo ? functionInfo->entry : _cfg.entry; generator.processEntryPoint(*entry); return generator.reportStackTooDeep(*entry); } -StackLayoutGenerator::StackLayoutGenerator(StackLayout& _layout): m_layout(_layout) +StackLayoutGenerator::StackLayoutGenerator(StackLayout& _layout, CFG::FunctionInfo const* _functionInfo): + m_layout(_layout), + m_currentFunctionInfo(_functionInfo) { } @@ -740,7 +742,7 @@ void StackLayoutGenerator::fillInJunk(CFG::BasicBlock const& _block, CFG::Functi }); }; /// @returns the number of operations required to transform @a _source to @a _target. - auto evaluateTransform = [](Stack _source, Stack const& _target) -> size_t { + auto evaluateTransform = [&](Stack _source, Stack const& _target) -> size_t { size_t opGas = 0; auto swap = [&](unsigned _swapDepth) { @@ -755,12 +757,23 @@ void StackLayoutGenerator::fillInJunk(CFG::BasicBlock const& _block, CFG::Functi opGas += evmasm::GasMeter::runGas(evmasm::pushInstruction(32), langutil::EVMVersion()); else { - auto depth = util::findOffset(_source | ranges::views::reverse, _slot); - yulAssert(depth); - if (*depth < 16) - opGas += evmasm::GasMeter::runGas(evmasm::dupInstruction(static_cast(*depth + 1)), langutil::EVMVersion()); + if (auto depth = util::findOffset(_source | ranges::views::reverse, _slot)) + { + if (*depth < 16) + opGas += evmasm::GasMeter::runGas(evmasm::dupInstruction(static_cast(*depth + 1)), langutil::EVMVersion()); + else + opGas += 1000; + } else - opGas += 1000; + { + // This has to be a previously unassigned return variable. + // We at least sanity-check that it is among the return variables at all. + yulAssert(m_currentFunctionInfo && holds_alternative(_slot)); + yulAssert(util::contains(m_currentFunctionInfo->returnVariables, get(_slot))); + // Strictly speaking the cost of the PUSH0 depends on the targeted EVM version, but the difference + // will not matter here. + opGas += evmasm::GasMeter::runGas(evmasm::pushInstruction(0), langutil::EVMVersion());; + } } }; auto pop = [&]() { opGas += evmasm::GasMeter::runGas(evmasm::Instruction::POP,langutil::EVMVersion()); }; diff --git a/libyul/backends/evm/StackLayoutGenerator.h b/libyul/backends/evm/StackLayoutGenerator.h index 40b554cd6038..d04b80bdc02a 100644 --- a/libyul/backends/evm/StackLayoutGenerator.h +++ b/libyul/backends/evm/StackLayoutGenerator.h @@ -66,7 +66,7 @@ class StackLayoutGenerator static std::vector reportStackTooDeep(CFG const& _cfg, YulString _functionName); private: - StackLayoutGenerator(StackLayout& _context); + StackLayoutGenerator(StackLayout& _context, CFG::FunctionInfo const* _functionInfo); /// @returns the optimal entry stack layout, s.t. @a _operation can be applied to it and /// the result can be transformed to @a _exitStack with minimal stack shuffling. @@ -115,6 +115,7 @@ class StackLayoutGenerator void fillInJunk(CFG::BasicBlock const& _block, CFG::FunctionInfo const* _functionInfo = nullptr); StackLayout& m_layout; + CFG::FunctionInfo const* m_currentFunctionInfo = nullptr; }; } diff --git a/test/libyul/evmCodeTransform/unassigned_return_variable.yul b/test/libyul/evmCodeTransform/unassigned_return_variable.yul new file mode 100644 index 000000000000..666fefe1aa64 --- /dev/null +++ b/test/libyul/evmCodeTransform/unassigned_return_variable.yul @@ -0,0 +1,19 @@ +{ + // This used to throw during stack layout generation. + function g(b,s) -> y { + y := g(b, g(y, s)) + } +} +// ==== +// stackOptimization: true +// ---- +// /* "":0:111 */ +// stop +// /* "":60:109 */ +// tag_1: +// pop +// /* "":99:100 */ +// 0x00 +// /* "":97:104 */ +// tag_1 +// jump // in From f4217bdc2c566ee986a622f7acfb0b97df101dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 13 Jun 2023 13:09:28 +0200 Subject: [PATCH 071/138] Fix Bash syntax error that shows up in CLI tests when updating expectations --- test/cmdlineTests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 0731fc5b2c05..3edcc5db371f 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -115,7 +115,7 @@ function update_expectation { local newExpectation="${1}" local expectationFile="${2}" - if [[ $newExpectation == "" || $newExpectation -eq 0 && $expectationFile == */exit ]] + if [[ $newExpectation == '' || $newExpectation == '0' && $expectationFile == */exit ]] then if [[ -f $expectationFile ]] then From 0713adde0454af92bb8ac052050f6df682976c6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 13 Jun 2023 11:27:35 +0200 Subject: [PATCH 072/138] Fix bad indentation in handleCombinedJSON() --- solc/CommandLineInterface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index ae6888dfd204..7a28900b3203 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -914,9 +914,9 @@ void CommandLineInterface::handleCombinedJSON() { output[g_strSources][sourceCode.first] = Json::Value(Json::objectValue); output[g_strSources][sourceCode.first]["AST"] = ASTJsonExporter( - m_compiler->state(), - m_compiler->sourceIndices() - ).toJson(m_compiler->ast(sourceCode.first)); + m_compiler->state(), + m_compiler->sourceIndices() + ).toJson(m_compiler->ast(sourceCode.first)); output[g_strSources][sourceCode.first]["id"] = m_compiler->sourceIndices().at(sourceCode.first); } } From f8a1af8bd539cd4d72c233403c38b1822e7daf7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 13 Jun 2023 15:47:03 +0200 Subject: [PATCH 073/138] CommandLineParser: Fix some outputs not being properly disallowed with --stop-after parsing --- Changelog.md | 1 + solc/CommandLineParser.cpp | 18 ++++-------------- test/cmdlineTests/stop_after_parsing_abi/args | 1 + test/cmdlineTests/stop_after_parsing_abi/err | 1 + test/cmdlineTests/stop_after_parsing_abi/exit | 1 + .../stop_after_parsing_abi/input.sol | 8 ++++++++ 6 files changed, 16 insertions(+), 14 deletions(-) create mode 100644 test/cmdlineTests/stop_after_parsing_abi/args create mode 100644 test/cmdlineTests/stop_after_parsing_abi/err create mode 100644 test/cmdlineTests/stop_after_parsing_abi/exit create mode 100644 test/cmdlineTests/stop_after_parsing_abi/input.sol diff --git a/Changelog.md b/Changelog.md index c5625d9dbca9..c8f0789f8ee2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -15,6 +15,7 @@ Compiler Features: Bugfixes: + * Commandline Interface: Fix internal error when using ``--stop-after parsing`` and requesting some of the outputs that require full analysis or compilation. * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 9cc93d78da3b..dda7a6ba2b2a 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -997,21 +997,11 @@ void CommandLineParser::processArgs() return; checkMutuallyExclusive({g_strColor, g_strNoColor}); + checkMutuallyExclusive({g_strStopAfter, g_strGas}); - array const conflictingWithStopAfter{ - CompilerOutputs::componentName(&CompilerOutputs::binary), - CompilerOutputs::componentName(&CompilerOutputs::ir), - CompilerOutputs::componentName(&CompilerOutputs::irAstJson), - CompilerOutputs::componentName(&CompilerOutputs::irOptimized), - CompilerOutputs::componentName(&CompilerOutputs::irOptimizedAstJson), - g_strGas, - CompilerOutputs::componentName(&CompilerOutputs::asm_), - CompilerOutputs::componentName(&CompilerOutputs::asmJson), - CompilerOutputs::componentName(&CompilerOutputs::opcodes), - }; - - for (auto& option: conflictingWithStopAfter) - checkMutuallyExclusive({g_strStopAfter, option}); + for (string const& option: CompilerOutputs::componentMap() | ranges::views::keys) + if (option != CompilerOutputs::componentName(&CompilerOutputs::astCompactJson)) + checkMutuallyExclusive({g_strStopAfter, option}); if ( m_options.input.mode != InputMode::Compiler && diff --git a/test/cmdlineTests/stop_after_parsing_abi/args b/test/cmdlineTests/stop_after_parsing_abi/args new file mode 100644 index 000000000000..9ec9f63e43f1 --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_abi/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 --stop-after parsing --abi diff --git a/test/cmdlineTests/stop_after_parsing_abi/err b/test/cmdlineTests/stop_after_parsing_abi/err new file mode 100644 index 000000000000..9beceafe7b32 --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_abi/err @@ -0,0 +1 @@ +The following options are mutually exclusive: --stop-after, --abi. Select at most one. diff --git a/test/cmdlineTests/stop_after_parsing_abi/exit b/test/cmdlineTests/stop_after_parsing_abi/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_abi/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/stop_after_parsing_abi/input.sol b/test/cmdlineTests/stop_after_parsing_abi/input.sol new file mode 100644 index 000000000000..978517b3c23f --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_abi/input.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +import "A"; + +contract C { + function f() public {} +} From e87333f20f729df2a1c6f398708bfc9f6b8e5138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 13 Jun 2023 12:33:05 +0200 Subject: [PATCH 074/138] More CLI tests for --stop-after parsing --- .../args | 1 + .../in.sol | 6 +++ .../input.json | 12 +++++ .../output.json | 54 +++++++++++++++++++ .../args | 1 + .../in.sol | 6 +++ .../input.json | 12 +++++ .../output.json | 12 +++++ .../args | 1 + .../in.sol | 8 +++ .../input.json | 19 +++++++ .../output.json | 9 ++++ test/cmdlineTests/stop_after_parsing_ast/args | 1 + .../stop_after_parsing_ast/input.sol | 6 +++ .../stop_after_parsing_ast/output | 48 +++++++++++++++++ 15 files changed, 196 insertions(+) create mode 100644 test/cmdlineTests/standard_stop_after_parsing_ast_requested/args create mode 100644 test/cmdlineTests/standard_stop_after_parsing_ast_requested/in.sol create mode 100644 test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json create mode 100644 test/cmdlineTests/standard_stop_after_parsing_ast_requested/output.json create mode 100644 test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/args create mode 100644 test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/in.sol create mode 100644 test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json create mode 100644 test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/output.json create mode 100644 test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/args create mode 100644 test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/in.sol create mode 100644 test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/input.json create mode 100644 test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/output.json create mode 100644 test/cmdlineTests/stop_after_parsing_ast/args create mode 100644 test/cmdlineTests/stop_after_parsing_ast/input.sol create mode 100644 test/cmdlineTests/stop_after_parsing_ast/output diff --git a/test/cmdlineTests/standard_stop_after_parsing_ast_requested/args b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_stop_after_parsing_ast_requested/in.sol b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/in.sol new file mode 100644 index 000000000000..e78a24ff786e --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +import "A"; + +contract C {} diff --git a/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json new file mode 100644 index 000000000000..34f157495034 --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json @@ -0,0 +1,12 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_stop_after_parsing_ast_requested/in.sol"]} + }, + "settings": { + "stopAfter": "parsing", + "outputSelection": { + "*": {"": ["ast"]} + } + } +} diff --git a/test/cmdlineTests/standard_stop_after_parsing_ast_requested/output.json b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/output.json new file mode 100644 index 000000000000..6907d4780f58 --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/output.json @@ -0,0 +1,54 @@ +{ + "sources": + { + "C": + { + "ast": + { + "absolutePath": "C", + "id": 4, + "license": "GPL-3.0", + "nodeType": "SourceUnit", + "nodes": + [ + { + "id": 1, + "literals": + [ + "solidity", + "*" + ], + "nodeType": "PragmaDirective", + "src": "36:18:0" + }, + { + "absolutePath": "A", + "file": "A", + "id": 2, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "src": "56:11:0", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "id": 3, + "name": "C", + "nameLocation": "78:1:0", + "nodeType": "ContractDefinition", + "nodes": [], + "src": "69:13:0", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "36:47:0" + }, + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/args b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/in.sol b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/in.sol new file mode 100644 index 000000000000..e78a24ff786e --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +import "A"; + +contract C {} diff --git a/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json new file mode 100644 index 000000000000..7ef3d37fd305 --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json @@ -0,0 +1,12 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_stop_after_parsing_bytecode_requested/in.sol"]} + }, + "settings": { + "stopAfter": "parsing", + "outputSelection": { + "*": {"*": ["evm.bytecode.object"]} + } + } +} diff --git a/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/output.json b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/output.json new file mode 100644 index 000000000000..37195309631d --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "Requested output selection conflicts with \"settings.stopAfter\".", + "message": "Requested output selection conflicts with \"settings.stopAfter\".", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/args b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/in.sol b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/in.sol new file mode 100644 index 000000000000..978517b3c23f --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/in.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +import "A"; + +contract C { + function f() public {} +} diff --git a/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/input.json b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/input.json new file mode 100644 index 000000000000..ac4d623c7103 --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/input.json @@ -0,0 +1,19 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_stop_after_parsing_non_binary_output_requested/in.sol"]} + }, + "settings": { + "stopAfter": "parsing", + "outputSelection": { + "*": {"*": [ + "abi", + "devdoc", + "userdoc", + "metadata", + "storageLayout", + "evm.methodIdentifiers" + ]} + } + } +} diff --git a/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/output.json b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/output.json new file mode 100644 index 000000000000..5b64763be82f --- /dev/null +++ b/test/cmdlineTests/standard_stop_after_parsing_non_binary_output_requested/output.json @@ -0,0 +1,9 @@ +{ + "sources": + { + "C": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/stop_after_parsing_ast/args b/test/cmdlineTests/stop_after_parsing_ast/args new file mode 100644 index 000000000000..72df9974ab43 --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_ast/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 --stop-after parsing --ast-compact-json diff --git a/test/cmdlineTests/stop_after_parsing_ast/input.sol b/test/cmdlineTests/stop_after_parsing_ast/input.sol new file mode 100644 index 000000000000..e78a24ff786e --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_ast/input.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +import "A"; + +contract C {} diff --git a/test/cmdlineTests/stop_after_parsing_ast/output b/test/cmdlineTests/stop_after_parsing_ast/output new file mode 100644 index 000000000000..163941860401 --- /dev/null +++ b/test/cmdlineTests/stop_after_parsing_ast/output @@ -0,0 +1,48 @@ +JSON AST (compact format): + + +======= stop_after_parsing_ast/input.sol ======= +{ + "absolutePath": "stop_after_parsing_ast/input.sol", + "id": 4, + "license": "GPL-3.0", + "nodeType": "SourceUnit", + "nodes": + [ + { + "id": 1, + "literals": + [ + "solidity", + "*" + ], + "nodeType": "PragmaDirective", + "src": "36:18:0" + }, + { + "absolutePath": "A", + "file": "A", + "id": 2, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "src": "56:11:0", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "id": 3, + "name": "C", + "nameLocation": "78:1:0", + "nodeType": "ContractDefinition", + "nodes": [], + "src": "69:13:0", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "36:47:0" +} From e6b1f5ccee25d47567b1aa03093b43abd03d3a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 14 Jun 2023 09:19:37 +0200 Subject: [PATCH 075/138] cmdlineTest.sh: Remove compiler version from metadata in Standard JSON output as well --- test/cmdlineTests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 3edcc5db371f..e1d8a5746875 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -221,6 +221,7 @@ EOF # shellcheck disable=SC1003 sed -i.bak -E -e 's/\\n/\'$'\n/g' "$stdout_path" sed -i.bak -e 's/\(^[ ]*auxdata:[[:space:]]\)0x[0-9a-f]*$/\1/' "$stdout_path" + sed -i.bak -e 's/\(\\"version\\":[ ]*\\"\)[^"\\]*\(\\"\)/\1\2/' "$stdout_path" rm "$stdout_path.bak" else sed -i.bak -e '/^Warning: This is a pre-release compiler version, please do not use it in production./d' "$stderr_path" From e45e6cc31dfbdf6479112a8b5f182002f28be6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 14 Jun 2023 09:11:36 +0200 Subject: [PATCH 076/138] CLI tests for metadata output --- test/cmdlineTests/metadata/args | 1 + test/cmdlineTests/metadata/input.sol | 4 ++++ test/cmdlineTests/metadata/output | 4 ++++ test/cmdlineTests/standard_metadata/args | 1 + test/cmdlineTests/standard_metadata/in.sol | 4 ++++ .../cmdlineTests/standard_metadata/input.json | 11 +++++++++++ .../standard_metadata/output.json | 19 +++++++++++++++++++ 7 files changed, 44 insertions(+) create mode 100644 test/cmdlineTests/metadata/args create mode 100644 test/cmdlineTests/metadata/input.sol create mode 100644 test/cmdlineTests/metadata/output create mode 100644 test/cmdlineTests/standard_metadata/args create mode 100644 test/cmdlineTests/standard_metadata/in.sol create mode 100644 test/cmdlineTests/standard_metadata/input.json create mode 100644 test/cmdlineTests/standard_metadata/output.json diff --git a/test/cmdlineTests/metadata/args b/test/cmdlineTests/metadata/args new file mode 100644 index 000000000000..5cbfceb4723f --- /dev/null +++ b/test/cmdlineTests/metadata/args @@ -0,0 +1 @@ +--metadata diff --git a/test/cmdlineTests/metadata/input.sol b/test/cmdlineTests/metadata/input.sol new file mode 100644 index 000000000000..a3a86cc8d317 --- /dev/null +++ b/test/cmdlineTests/metadata/input.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C {} diff --git a/test/cmdlineTests/metadata/output b/test/cmdlineTests/metadata/output new file mode 100644 index 000000000000..bf1e750c95f0 --- /dev/null +++ b/test/cmdlineTests/metadata/output @@ -0,0 +1,4 @@ + +======= metadata/input.sol:C ======= +Metadata: +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"metadata/input.sol":"C"},"evmVersion":"shanghai","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"metadata/input.sol":{"keccak256":"0x5cf617b1707a484e3c4bd59643013dec76ab7d75900b46855214729ae3e0ceb0","license":"GPL-3.0","urls":["bzz-raw://ac418a02dfadf87234150d3568f33269e3f49460345cb39300e017a6d755eff2","dweb:/ipfs/QmQq3owBu25x2WV46HB1WyKzJpxiAPecU7eMKqtXCF7eeS"]}},"version":1} diff --git a/test/cmdlineTests/standard_metadata/args b/test/cmdlineTests/standard_metadata/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_metadata/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_metadata/in.sol b/test/cmdlineTests/standard_metadata/in.sol new file mode 100644 index 000000000000..a3a86cc8d317 --- /dev/null +++ b/test/cmdlineTests/standard_metadata/in.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C {} diff --git a/test/cmdlineTests/standard_metadata/input.json b/test/cmdlineTests/standard_metadata/input.json new file mode 100644 index 000000000000..ae4bfe8f5965 --- /dev/null +++ b/test/cmdlineTests/standard_metadata/input.json @@ -0,0 +1,11 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_metadata/in.sol"]} + }, + "settings": { + "outputSelection": { + "*": {"*": ["metadata"]} + } + } +} diff --git a/test/cmdlineTests/standard_metadata/output.json b/test/cmdlineTests/standard_metadata/output.json new file mode 100644 index 000000000000..4429466676d1 --- /dev/null +++ b/test/cmdlineTests/standard_metadata/output.json @@ -0,0 +1,19 @@ +{ + "contracts": + { + "C": + { + "C": + { + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"C\":{\"keccak256\":\"0x5cf617b1707a484e3c4bd59643013dec76ab7d75900b46855214729ae3e0ceb0\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://ac418a02dfadf87234150d3568f33269e3f49460345cb39300e017a6d755eff2\",\"dweb:/ipfs/QmQq3owBu25x2WV46HB1WyKzJpxiAPecU7eMKqtXCF7eeS\"]}},\"version\":1}" + } + } + }, + "sources": + { + "C": + { + "id": 0 + } + } +} From f50820fcae4a387f1c74d0b55ac2afc6adde2f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 14 Jun 2023 08:47:45 +0200 Subject: [PATCH 077/138] Tests checking outputs produced in presence of errors --- .../args | 1 + .../in.sol | 8 + .../input.json | 14 + .../output.json | 26 ++ .../args | 1 + .../in.sol | 6 + .../input.json | 14 + .../output.json | 127 ++++++++ .../args | 1 + .../in.sol | 9 + .../input.json | 14 + .../output.json | 26 ++ .../args | 1 + .../in.sol | 13 + .../input.json | 15 + .../output.json | 280 ++++++++++++++++++ .../standard_outputs_on_parsing_error/args | 1 + .../standard_outputs_on_parsing_error/in.sol | 5 + .../input.json | 14 + .../output.json | 26 ++ 20 files changed, 602 insertions(+) create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal/args create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal/in.sol create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal/output.json create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/args create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/in.sol create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/input.json create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/args create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/in.sol create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/input.json create mode 100644 test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/output.json create mode 100644 test/cmdlineTests/standard_outputs_on_compilation_error/args create mode 100644 test/cmdlineTests/standard_outputs_on_compilation_error/in.sol create mode 100644 test/cmdlineTests/standard_outputs_on_compilation_error/input.json create mode 100644 test/cmdlineTests/standard_outputs_on_compilation_error/output.json create mode 100644 test/cmdlineTests/standard_outputs_on_parsing_error/args create mode 100644 test/cmdlineTests/standard_outputs_on_parsing_error/in.sol create mode 100644 test/cmdlineTests/standard_outputs_on_parsing_error/input.json create mode 100644 test/cmdlineTests/standard_outputs_on_parsing_error/output.json diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/args b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/in.sol b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/in.sol new file mode 100644 index 000000000000..b31d640322ad --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/in.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C { + // This will trigger a fatal error at the analysis stage, of the kind that terminates analysis + // immediately without letting the current step finish. + constructor(uint[] storage) {} +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json new file mode 100644 index 000000000000..b640f033dc46 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json @@ -0,0 +1,14 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_outputs_on_analysis_error_fatal/in.sol"]} + }, + "settings": { + "outputSelection": { + "*": { + "*": ["*"], + "": ["*"] + } + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/output.json b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/output.json new file mode 100644 index 000000000000..51d12668fb13 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/output.json @@ -0,0 +1,26 @@ +{ + "errors": + [ + { + "component": "general", + "errorCode": "3644", + "formattedMessage": "TypeError: This parameter has a type that can only be used internally. You can make the contract abstract to avoid this problem. + --> C:7:17: + | +7 | constructor(uint[] storage) {} + | ^^^^^^^^^^^^^^ + +", + "message": "This parameter has a type that can only be used internally. You can make the contract abstract to avoid this problem.", + "severity": "error", + "sourceLocation": + { + "end": 258, + "file": "C", + "start": 244 + }, + "type": "TypeError" + } + ], + "sources": {} +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/args b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/in.sol b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/in.sol new file mode 100644 index 000000000000..6c8bb3938b76 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +// This will trigger a fatal error at the analysis stage, of the kind that lets the current +// analysis steps finish but terminates analysis after immediately after that step. +function f(uint immutable x) {} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/input.json b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/input.json new file mode 100644 index 000000000000..0214e00e8406 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/input.json @@ -0,0 +1,14 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_outputs_on_analysis_error_fatal_after_current_step/in.sol"]} + }, + "settings": { + "outputSelection": { + "*": { + "*": ["*"], + "": ["*"] + } + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json new file mode 100644 index 000000000000..29f3228a7ddd --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json @@ -0,0 +1,127 @@ +{ + "errors": + [ + { + "component": "general", + "errorCode": "8297", + "formattedMessage": "DeclarationError: The \"immutable\" keyword can only be used for state variables. + --> C:6:12: + | +6 | function f(uint immutable x) {} + | ^^^^^^^^^^^^^^^^ + +", + "message": "The \"immutable\" keyword can only be used for state variables.", + "severity": "error", + "sourceLocation": + { + "end": 259, + "file": "C", + "start": 243 + }, + "type": "DeclarationError" + } + ], + "sources": + { + "C": + { + "ast": + { + "absolutePath": "C", + "exportedSymbols": + { + "f": + [ + 7 + ] + }, + "id": 8, + "license": "GPL-3.0", + "nodeType": "SourceUnit", + "nodes": + [ + { + "id": 1, + "literals": + [ + "solidity", + "*" + ], + "nodeType": "PragmaDirective", + "src": "36:18:0" + }, + { + "body": + { + "id": 6, + "nodeType": "Block", + "src": "261:2:0", + "statements": [] + }, + "id": 7, + "implemented": true, + "kind": "freeFunction", + "modifiers": [], + "name": "f", + "nameLocation": "241:1:0", + "nodeType": "FunctionDefinition", + "parameters": + { + "id": 4, + "nodeType": "ParameterList", + "parameters": + [ + { + "constant": false, + "id": 3, + "mutability": "immutable", + "name": "x", + "nameLocation": "258:1:0", + "nodeType": "VariableDeclaration", + "scope": 7, + "src": "243:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": + { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "243:4:0", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "242:18:0" + }, + "returnParameters": + { + "id": 5, + "nodeType": "ParameterList", + "parameters": [], + "src": "261:0:0" + }, + "scope": 8, + "src": "232:31:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "src": "36:228:0" + }, + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/args b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/in.sol b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/in.sol new file mode 100644 index 000000000000..050f5ad43673 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/in.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C { + // This will trigger a non-fatal error at the analysis stage. + // With this kind of error we still run subsequent analysis stages. + uint x; + string y = x; +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/input.json b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/input.json new file mode 100644 index 000000000000..904ebc5bf287 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/input.json @@ -0,0 +1,14 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_outputs_on_analysis_error_non_fatal/in.sol"]} + }, + "settings": { + "outputSelection": { + "*": { + "*": ["*"], + "": ["*"] + } + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/output.json b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/output.json new file mode 100644 index 000000000000..2f3aaae4420c --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/output.json @@ -0,0 +1,26 @@ +{ + "errors": + [ + { + "component": "general", + "errorCode": "7407", + "formattedMessage": "TypeError: Type uint256 is not implicitly convertible to expected type string storage ref. + --> C:8:16: + | +8 | string y = x; + | ^ + +", + "message": "Type uint256 is not implicitly convertible to expected type string storage ref.", + "severity": "error", + "sourceLocation": + { + "end": 235, + "file": "C", + "start": 234 + }, + "type": "TypeError" + } + ], + "sources": {} +} diff --git a/test/cmdlineTests/standard_outputs_on_compilation_error/args b/test/cmdlineTests/standard_outputs_on_compilation_error/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_compilation_error/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_outputs_on_compilation_error/in.sol b/test/cmdlineTests/standard_outputs_on_compilation_error/in.sol new file mode 100644 index 000000000000..1d5118b87287 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_compilation_error/in.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +contract C { + // This will trigger an error at the compilation stage. + // CodeGenerationError due to immutable initialization in constructor being optimized out. + uint immutable public x; + + constructor() { + x = 0; + while (true) {} + } +} diff --git a/test/cmdlineTests/standard_outputs_on_compilation_error/input.json b/test/cmdlineTests/standard_outputs_on_compilation_error/input.json new file mode 100644 index 000000000000..855f007689b8 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_compilation_error/input.json @@ -0,0 +1,15 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_outputs_on_compilation_error/in.sol"]} + }, + "settings": { + "optimizer": {"enabled": true}, + "outputSelection": { + "*": { + "*": ["*"], + "": ["*"] + } + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_compilation_error/output.json b/test/cmdlineTests/standard_outputs_on_compilation_error/output.json new file mode 100644 index 000000000000..ac01fb1eba9c --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_compilation_error/output.json @@ -0,0 +1,280 @@ +{ + "contracts": + { + "C": + { + "C": + { + "abi": + [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "x", + "outputs": + [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": + { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": + { + "methodIdentifiers": + { + "x()": "0c55699c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"C\":{\"keccak256\":\"0x67a13ebd685e4c6f792e71eb747dac57edb99e94d04d841ee6c979ae517934ce\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://665b000da768823654f680d02686c1e59d682a0b3882e43a77fed9f80ce64ae8\",\"dweb:/ipfs/QmVnKvuidH6KiCdNQpoAQUtDbB8hXkafVLXWMNitUcxnqC\"]}},\"version\":1}", + "storageLayout": + { + "storage": [], + "types": null + }, + "userdoc": + { + "kind": "user", + "methods": {}, + "version": 1 + } + } + } + }, + "errors": + [ + { + "component": "general", + "errorCode": "1284", + "formattedMessage": "CodeGenerationError: Some immutables were read from but never assigned, possibly because of optimization. + +", + "message": "Some immutables were read from but never assigned, possibly because of optimization.", + "severity": "error", + "type": "CodeGenerationError" + } + ], + "sources": + { + "C": + { + "ast": + { + "absolutePath": "C", + "exportedSymbols": + { + "C": + [ + 15 + ] + }, + "id": 16, + "license": "GPL-3.0", + "nodeType": "SourceUnit", + "nodes": + [ + { + "id": 1, + "literals": + [ + "solidity", + "*" + ], + "nodeType": "PragmaDirective", + "src": "36:18:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "C", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 15, + "linearizedBaseContracts": + [ + 15 + ], + "name": "C", + "nameLocation": "65:1:0", + "nodeType": "ContractDefinition", + "nodes": + [ + { + "constant": false, + "functionSelector": "0c55699c", + "id": 3, + "mutability": "immutable", + "name": "x", + "nameLocation": "250:1:0", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "228:23:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": + { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "228:4:0", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "body": + { + "id": 13, + "nodeType": "Block", + "src": "272:46:0", + "statements": + [ + { + "expression": + { + "id": 8, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": + { + "id": 6, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "282:1:0", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": + { + "hexValue": "30", + "id": 7, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "286:1:0", + "typeDescriptions": + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "282:5:0", + "typeDescriptions": + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 9, + "nodeType": "ExpressionStatement", + "src": "282:5:0" + }, + { + "body": + { + "id": 11, + "nodeType": "Block", + "src": "310:2:0", + "statements": [] + }, + "condition": + { + "hexValue": "74727565", + "id": 10, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "304:4:0", + "typeDescriptions": + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "id": 12, + "nodeType": "WhileStatement", + "src": "297:15:0" + } + ] + }, + "id": 14, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": + { + "id": 4, + "nodeType": "ParameterList", + "parameters": [], + "src": "269:2:0" + }, + "returnParameters": + { + "id": 5, + "nodeType": "ParameterList", + "parameters": [], + "src": "272:0:0" + }, + "scope": 15, + "src": "258:60:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 16, + "src": "56:264:0", + "usedErrors": [], + "usedEvents": [] + } + ], + "src": "36:285:0" + }, + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_parsing_error/args b/test/cmdlineTests/standard_outputs_on_parsing_error/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_parsing_error/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_outputs_on_parsing_error/in.sol b/test/cmdlineTests/standard_outputs_on_parsing_error/in.sol new file mode 100644 index 000000000000..a4d891c1b25a --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_parsing_error/in.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity *; + +// This will trigger an error at the parsing stage +contract C {}} diff --git a/test/cmdlineTests/standard_outputs_on_parsing_error/input.json b/test/cmdlineTests/standard_outputs_on_parsing_error/input.json new file mode 100644 index 000000000000..a0d00c4e9e39 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_parsing_error/input.json @@ -0,0 +1,14 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_outputs_on_parsing_error/in.sol"]} + }, + "settings": { + "outputSelection": { + "*": { + "*": ["*"], + "": ["*"] + } + } + } +} diff --git a/test/cmdlineTests/standard_outputs_on_parsing_error/output.json b/test/cmdlineTests/standard_outputs_on_parsing_error/output.json new file mode 100644 index 000000000000..8c1f6c0dbe28 --- /dev/null +++ b/test/cmdlineTests/standard_outputs_on_parsing_error/output.json @@ -0,0 +1,26 @@ +{ + "errors": + [ + { + "component": "general", + "errorCode": "7858", + "formattedMessage": "ParserError: Expected pragma, import directive or contract/interface/library/struct/enum/constant/function/error definition. + --> C:5:14: + | +5 | contract C {}} + | ^ + +", + "message": "Expected pragma, import directive or contract/interface/library/struct/enum/constant/function/error definition.", + "severity": "error", + "sourceLocation": + { + "end": 121, + "file": "C", + "start": 120 + }, + "type": "ParserError" + } + ], + "sources": {} +} From 712229a5c6e1c7a0c072343d7516b3c5f7b05890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 14 Jun 2023 12:02:24 +0200 Subject: [PATCH 078/138] Fix StandardCompiler returning an incomplete AST in Standard JSON in case of an early exit during analysis --- Changelog.md | 1 + libsolidity/interface/StandardCompiler.cpp | 12 +- .../standard_empty_file_name/output.json | 8 +- .../output.json | 103 +----------------- 4 files changed, 12 insertions(+), 112 deletions(-) diff --git a/Changelog.md b/Changelog.md index aac8ab8b2895..efca354e724b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -19,6 +19,7 @@ Bugfixes: * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. + * Standard JSON Interface: Fix an incomplete AST being returned when analysis is interrupted by certain kinds of fatal errors. * Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation. * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index f18c618e9c6f..9d1ac1f1f3c2 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -1305,15 +1305,21 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting )); } + bool parsingSuccess = compilerStack.state() >= CompilerStack::State::Parsed; bool analysisPerformed = compilerStack.state() >= CompilerStack::State::AnalysisPerformed; - bool const compilationSuccess = compilerStack.state() == CompilerStack::State::CompilationSuccessful; + bool compilationSuccess = compilerStack.state() == CompilerStack::State::CompilationSuccessful; if (compilerStack.hasError() && !_inputsAndSettings.parserErrorRecovery) analysisPerformed = false; + // If analysis fails, the artifacts inside CompilerStack are potentially incomplete and must not be returned. + // Note that not completing analysis due to stopAfter does not count as a failure. It's neither failure nor success. + bool analysisFailed = !analysisPerformed && _inputsAndSettings.stopAfter >= CompilerStack::State::AnalysisPerformed; + bool compilationFailed = !compilationSuccess && binariesRequested; + /// Inconsistent state - stop here to receive error reports from users if ( - ((binariesRequested && !compilationSuccess) || !analysisPerformed) && + (compilationFailed || !analysisPerformed) && (errors.empty() && _inputsAndSettings.stopAfter >= CompilerStack::State::AnalysisPerformed) ) return formatFatalError(Error::Type::InternalCompilerError, "No error reported, but compilation failed."); @@ -1331,7 +1337,7 @@ Json::Value StandardCompiler::compileSolidity(StandardCompiler::InputsAndSetting output["sources"] = Json::objectValue; unsigned sourceIndex = 0; - if (compilerStack.state() >= CompilerStack::State::Parsed && (!compilerStack.hasError() || _inputsAndSettings.parserErrorRecovery)) + if (parsingSuccess && !analysisFailed && (!compilerStack.hasError() || _inputsAndSettings.parserErrorRecovery)) for (string const& sourceName: compilerStack.sourceNames()) { Json::Value sourceResult = Json::objectValue; diff --git a/test/cmdlineTests/standard_empty_file_name/output.json b/test/cmdlineTests/standard_empty_file_name/output.json index e419d0a5eec0..4e4d84c41c75 100644 --- a/test/cmdlineTests/standard_empty_file_name/output.json +++ b/test/cmdlineTests/standard_empty_file_name/output.json @@ -18,11 +18,5 @@ "type": "DeclarationError" } ], - "sources": - { - "": - { - "id": 0 - } - } + "sources": {} } diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json index 29f3228a7ddd..d47ded5d4018 100644 --- a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal_after_current_step/output.json @@ -22,106 +22,5 @@ "type": "DeclarationError" } ], - "sources": - { - "C": - { - "ast": - { - "absolutePath": "C", - "exportedSymbols": - { - "f": - [ - 7 - ] - }, - "id": 8, - "license": "GPL-3.0", - "nodeType": "SourceUnit", - "nodes": - [ - { - "id": 1, - "literals": - [ - "solidity", - "*" - ], - "nodeType": "PragmaDirective", - "src": "36:18:0" - }, - { - "body": - { - "id": 6, - "nodeType": "Block", - "src": "261:2:0", - "statements": [] - }, - "id": 7, - "implemented": true, - "kind": "freeFunction", - "modifiers": [], - "name": "f", - "nameLocation": "241:1:0", - "nodeType": "FunctionDefinition", - "parameters": - { - "id": 4, - "nodeType": "ParameterList", - "parameters": - [ - { - "constant": false, - "id": 3, - "mutability": "immutable", - "name": "x", - "nameLocation": "258:1:0", - "nodeType": "VariableDeclaration", - "scope": 7, - "src": "243:16:0", - "stateVariable": false, - "storageLocation": "default", - "typeDescriptions": - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - }, - "typeName": - { - "id": 2, - "name": "uint", - "nodeType": "ElementaryTypeName", - "src": "243:4:0", - "typeDescriptions": - { - "typeIdentifier": "t_uint256", - "typeString": "uint256" - } - }, - "visibility": "internal" - } - ], - "src": "242:18:0" - }, - "returnParameters": - { - "id": 5, - "nodeType": "ParameterList", - "parameters": [], - "src": "261:0:0" - }, - "scope": 8, - "src": "232:31:0", - "stateMutability": "nonpayable", - "virtual": false, - "visibility": "internal" - } - ], - "src": "36:228:0" - }, - "id": 0 - } - } + "sources": {} } From d4be1d9c2fc70bc3549f92143faaae9f97d81d97 Mon Sep 17 00:00:00 2001 From: Pawel Gebal Date: Wed, 26 Apr 2023 12:50:36 +0200 Subject: [PATCH 079/138] Add --print-smt flag to output SMTChecker SMTLIB code --- Changelog.md | 1 + libsmtutil/CHCSmtLib2Interface.cpp | 55 +- libsmtutil/CHCSmtLib2Interface.h | 5 + libsmtutil/SMTLib2Interface.cpp | 6 + libsmtutil/SMTLib2Interface.h | 2 + libsmtutil/SMTPortfolio.cpp | 13 +- libsmtutil/SMTPortfolio.h | 6 +- libsolidity/formal/BMC.cpp | 14 +- libsolidity/formal/CHC.cpp | 11 + libsolidity/formal/ModelCheckerSettings.h | 2 + libsolidity/interface/StandardCompiler.cpp | 14 +- scripts/error_codes.py | 2 + solc/CommandLineParser.cpp | 20 +- .../model_checker_print_query_all/args | 1 + .../model_checker_print_query_all/err | 165 ++++++ .../model_checker_print_query_all/input.sol | 9 + .../model_checker_print_query_bmc/args | 1 + .../model_checker_print_query_bmc/err | 32 ++ .../model_checker_print_query_bmc/input.sol | 9 + .../model_checker_print_query_chc/args | 1 + .../model_checker_print_query_chc/err | 129 +++++ .../model_checker_print_query_chc/input.sol | 9 + .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 9 + .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 9 + .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 9 + .../input.json | 27 + .../output.json | 540 ++++++++++++++++++ .../input.json | 26 + .../output.json | 129 +++++ .../input.json | 27 + .../output.json | 420 ++++++++++++++ .../input.json | 25 + .../output.json | 12 + .../input.json | 25 + .../output.json | 12 + .../input.json | 26 + .../output.json | 12 + .../output.json | 7 +- test/solc/CommandLineParser.cpp | 1 + test/tools/fuzzer_common.cpp | 1 + 49 files changed, 1799 insertions(+), 34 deletions(-) create mode 100644 test/cmdlineTests/model_checker_print_query_all/args create mode 100644 test/cmdlineTests/model_checker_print_query_all/err create mode 100644 test/cmdlineTests/model_checker_print_query_all/input.sol create mode 100644 test/cmdlineTests/model_checker_print_query_bmc/args create mode 100644 test/cmdlineTests/model_checker_print_query_bmc/err create mode 100644 test/cmdlineTests/model_checker_print_query_bmc/input.sol create mode 100644 test/cmdlineTests/model_checker_print_query_chc/args create mode 100644 test/cmdlineTests/model_checker_print_query_chc/err create mode 100644 test/cmdlineTests/model_checker_print_query_chc/input.sol create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/args create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/err create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/exit create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/input.sol create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/args create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/err create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/exit create mode 100644 test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/input.sol create mode 100644 test/cmdlineTests/model_checker_print_query_superflous_solver/args create mode 100644 test/cmdlineTests/model_checker_print_query_superflous_solver/err create mode 100644 test/cmdlineTests/model_checker_print_query_superflous_solver/exit create mode 100644 test/cmdlineTests/model_checker_print_query_superflous_solver/input.sol create mode 100644 test/cmdlineTests/standard_model_checker_print_query_all/input.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_all/output.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_bmc/input.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_bmc/output.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_chc/input.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_chc/output.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_invalid_arg/input.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_invalid_arg/output.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/input.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/output.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_superflous_solver/input.json create mode 100644 test/cmdlineTests/standard_model_checker_print_query_superflous_solver/output.json diff --git a/Changelog.md b/Changelog.md index aac8ab8b2895..d843aeb85ed1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,6 +9,7 @@ Compiler Features: * Commandline Interface: Respect ``--optimize-yul`` and ``--no-optimize-yul`` in compiler mode and accept them in assembler mode as well. ``--optimize --no-optimize-yul`` combination now allows enabling EVM assembly optimizer without enabling Yul optimizer. * EWasm: Remove EWasm backend. * Parser: Introduce ``pragma experimental solidity``, which will enable an experimental language mode that in particular has no stability guarantees between non-breaking releases and is not suited for production use. + * SMTChecker: Add ``--model-checker-print-query`` CLI option and ``settings.modelChecker.printQuery`` JSON option to output the SMTChecker queries in the SMTLIB2 format. This requires using `smtlib2` solver only. * Standard JSON Interface: Add ``ast`` file-level output for Yul input. * Standard JSON Interface: Add ``irAst`` and ``irOptimizedAst`` contract-level outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. * Yul Optimizer: Stack-to-memory mover is now enabled by default whenever possible for via IR code generation and pure Yul compilation. diff --git a/libsmtutil/CHCSmtLib2Interface.cpp b/libsmtutil/CHCSmtLib2Interface.cpp index e1f80e62bd92..4229cf5d6680 100644 --- a/libsmtutil/CHCSmtLib2Interface.cpp +++ b/libsmtutil/CHCSmtLib2Interface.cpp @@ -91,23 +91,8 @@ void CHCSmtLib2Interface::addRule(Expression const& _expr, std::string const& /* tuple CHCSmtLib2Interface::query(Expression const& _block) { - string accumulated{}; - swap(m_accumulatedOutput, accumulated); - solAssert(m_smtlib2, ""); - writeHeader(); - for (auto const& decl: m_smtlib2->userSorts() | ranges::views::values) - write(decl); - m_accumulatedOutput += accumulated; - - string queryRule = "(assert\n(forall " + forall() + "\n" + - "(=> " + _block.name + " false)" - "))"; - string response = querySolver( - m_accumulatedOutput + - queryRule + - "\n(check-sat)" - ); - swap(m_accumulatedOutput, accumulated); + string query = dumpQuery(_block); + string response = querySolver(query); CheckResult result; // TODO proper parsing @@ -151,13 +136,6 @@ string CHCSmtLib2Interface::toSmtLibSort(vector const& _sorts) return ssort; } -void CHCSmtLib2Interface::writeHeader() -{ - if (m_queryTimeout) - write("(set-option :timeout " + to_string(*m_queryTimeout) + ")"); - write("(set-logic HORN)\n"); -} - string CHCSmtLib2Interface::forall() { string vars("("); @@ -217,3 +195,32 @@ string CHCSmtLib2Interface::querySolver(string const& _input) m_unhandledQueries.push_back(_input); return "unknown\n"; } + +std::string CHCSmtLib2Interface::dumpQuery(Expression const& _expr) +{ + std::stringstream s; + + s + << createHeaderAndDeclarations() + << m_accumulatedOutput << std::endl + << createQueryAssertion(_expr.name) << std::endl + << "(check-sat)" << std::endl; + + return s.str(); +} + +std::string CHCSmtLib2Interface::createHeaderAndDeclarations() { + std::stringstream s; + if (m_queryTimeout) + s << "(set-option :timeout " + to_string(*m_queryTimeout) + ")\n"; + s << "(set-logic HORN)" << std::endl; + + for (auto const& decl: m_smtlib2->userSorts() | ranges::views::values) + s << decl << std::endl; + + return s.str(); +} + +std::string CHCSmtLib2Interface::createQueryAssertion(std::string name) { + return "(assert\n(forall " + forall() + "\n" + "(=> " + name + " false)))"; +} diff --git a/libsmtutil/CHCSmtLib2Interface.h b/libsmtutil/CHCSmtLib2Interface.h index 4748af8da6c6..0f3a68ee405d 100644 --- a/libsmtutil/CHCSmtLib2Interface.h +++ b/libsmtutil/CHCSmtLib2Interface.h @@ -51,6 +51,8 @@ class CHCSmtLib2Interface: public CHCSolverInterface void declareVariable(std::string const& _name, SortPointer const& _sort) override; + std::string dumpQuery(Expression const& _expr); + std::vector unhandledQueries() const { return m_unhandledQueries; } SMTLib2Interface* smtlib2Interface() const { return m_smtlib2.get(); } @@ -66,6 +68,9 @@ class CHCSmtLib2Interface: public CHCSolverInterface void write(std::string _data); + std::string createQueryAssertion(std::string name); + std::string createHeaderAndDeclarations(); + /// Communicates with the solver via the callback. Throws SMTSolverError on error. std::string querySolver(std::string const& _input); diff --git a/libsmtutil/SMTLib2Interface.cpp b/libsmtutil/SMTLib2Interface.cpp index 3e117913aa0c..85103d00ebc3 100644 --- a/libsmtutil/SMTLib2Interface.cpp +++ b/libsmtutil/SMTLib2Interface.cpp @@ -322,3 +322,9 @@ string SMTLib2Interface::querySolver(string const& _input) m_unhandledQueries.push_back(_input); return "unknown\n"; } + +string SMTLib2Interface::dumpQuery(vector const& _expressionsToEvaluate) +{ + return boost::algorithm::join(m_accumulatedOutput, "\n") + + checkSatAndGetValuesCommand(_expressionsToEvaluate); +} diff --git a/libsmtutil/SMTLib2Interface.h b/libsmtutil/SMTLib2Interface.h index 9454d551f30f..9ef8e94a8c0a 100644 --- a/libsmtutil/SMTLib2Interface.h +++ b/libsmtutil/SMTLib2Interface.h @@ -68,6 +68,8 @@ class SMTLib2Interface: public SolverInterface std::vector> const& userSorts() const { return m_userSorts; } + std::string dumpQuery(std::vector const& _expressionsToEvaluate); + private: void declareFunction(std::string const& _name, SortPointer const& _sort); diff --git a/libsmtutil/SMTPortfolio.cpp b/libsmtutil/SMTPortfolio.cpp index 77a404a4752f..be961d01f6c2 100644 --- a/libsmtutil/SMTPortfolio.cpp +++ b/libsmtutil/SMTPortfolio.cpp @@ -36,10 +36,12 @@ SMTPortfolio::SMTPortfolio( map _smtlib2Responses, frontend::ReadCallback::Callback _smtCallback, [[maybe_unused]] SMTSolverChoice _enabledSolvers, - optional _queryTimeout + optional _queryTimeout, + bool _printQuery ): SolverInterface(_queryTimeout) { + solAssert(!_printQuery || _enabledSolvers == smtutil::SMTSolverChoice::SMTLIB2(), "Only SMTLib2 solver can be enabled to print queries"); if (_enabledSolvers.smtlib2) m_solvers.emplace_back(make_unique(std::move(_smtlib2Responses), std::move(_smtCallback), m_queryTimeout)); #ifdef HAVE_Z3 @@ -155,3 +157,12 @@ bool SMTPortfolio::solverAnswered(CheckResult result) { return result == CheckResult::SATISFIABLE || result == CheckResult::UNSATISFIABLE; } + +string SMTPortfolio::dumpQuery(vector const& _expressionsToEvaluate) +{ + // This code assumes that the constructor guarantees that + // SmtLib2Interface is in position 0, if enabled. + auto smtlib2 = dynamic_cast(m_solvers.front().get()); + solAssert(smtlib2, "Must use SMTLib2 solver to dump queries"); + return smtlib2->dumpQuery(_expressionsToEvaluate); +} diff --git a/libsmtutil/SMTPortfolio.h b/libsmtutil/SMTPortfolio.h index 3d82756c3560..cdb33368e80a 100644 --- a/libsmtutil/SMTPortfolio.h +++ b/libsmtutil/SMTPortfolio.h @@ -46,7 +46,8 @@ class SMTPortfolio: public SolverInterface std::map _smtlib2Responses = {}, frontend::ReadCallback::Callback _smtCallback = {}, SMTSolverChoice _enabledSolvers = SMTSolverChoice::All(), - std::optional _queryTimeout = {} + std::optional _queryTimeout = {}, + bool _printQuery = false ); void reset() override; @@ -62,6 +63,9 @@ class SMTPortfolio: public SolverInterface std::vector unhandledQueries() override; size_t solvers() override { return m_solvers.size(); } + + std::string dumpQuery(std::vector const& _expressionsToEvaluate); + private: static bool solverAnswered(CheckResult result); diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index be29000fed91..d38f27b6ad22 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -47,8 +47,11 @@ BMC::BMC( CharStreamProvider const& _charStreamProvider ): SMTEncoder(_context, _settings, _errorReporter, _unsupportedErrorReporter, _charStreamProvider), - m_interface(make_unique(_smtlib2Responses, _smtCallback, _settings.solvers, _settings.timeout)) + m_interface(make_unique( + _smtlib2Responses, _smtCallback, _settings.solvers, _settings.timeout, _settings.printQuery + )) { + solAssert(!_settings.printQuery || _settings.solvers == smtutil::SMTSolverChoice::SMTLIB2(), "Only SMTLib2 solver can be enabled to print queries"); #if defined (HAVE_Z3) || defined (HAVE_CVC4) if (m_settings.solvers.cvc4 || m_settings.solvers.z3) if (!_smtlib2Responses.empty()) @@ -1192,6 +1195,15 @@ BMC::checkSatisfiableAndGenerateModel(vector const& _expres vector values; try { + if (m_settings.printQuery) + { + auto portfolio = dynamic_cast(m_interface.get()); + string smtlibCode = portfolio->dumpQuery(_expressionsToEvaluate); + m_errorReporter.info( + 6240_error, + "BMC: Requested query:\n" + smtlibCode + ); + } tie(result, values) = m_interface->check(_expressionsToEvaluate); } catch (smtutil::SolverError const& _e) diff --git a/libsolidity/formal/CHC.cpp b/libsolidity/formal/CHC.cpp index 1f7fc8bade58..30c3bb0e9844 100644 --- a/libsolidity/formal/CHC.cpp +++ b/libsolidity/formal/CHC.cpp @@ -72,6 +72,7 @@ CHC::CHC( m_smtlib2Responses(_smtlib2Responses), m_smtCallback(_smtCallback) { + solAssert(!_settings.printQuery || _settings.solvers == smtutil::SMTSolverChoice::SMTLIB2(), "Only SMTLib2 solver can be enabled to print queries"); } void CHC::analyze(SourceUnit const& _source) @@ -1807,6 +1808,16 @@ tuple CHC::query CheckResult result; smtutil::Expression invariant(true); CHCSolverInterface::CexGraph cex; + if (m_settings.printQuery) + { + auto smtLibInterface = dynamic_cast(m_interface.get()); + solAssert(smtLibInterface, "Requested to print queries but CHCSmtLib2Interface not available"); + string smtLibCode = smtLibInterface->dumpQuery(_query); + m_errorReporter.info( + 2339_error, + "CHC: Requested query:\n" + smtLibCode + ); + } tie(result, invariant, cex) = m_interface->query(_query); switch (result) { diff --git a/libsolidity/formal/ModelCheckerSettings.h b/libsolidity/formal/ModelCheckerSettings.h index d190116d96c2..b645f7c3b6e7 100644 --- a/libsolidity/formal/ModelCheckerSettings.h +++ b/libsolidity/formal/ModelCheckerSettings.h @@ -169,6 +169,7 @@ struct ModelCheckerSettings ModelCheckerEngine engine = ModelCheckerEngine::None(); ModelCheckerExtCalls externalCalls = {}; ModelCheckerInvariants invariants = ModelCheckerInvariants::Default(); + bool printQuery = false; bool showProvedSafe = false; bool showUnproved = false; bool showUnsupported = false; @@ -186,6 +187,7 @@ struct ModelCheckerSettings engine == _other.engine && externalCalls.mode == _other.externalCalls.mode && invariants == _other.invariants && + printQuery == _other.printQuery && showProvedSafe == _other.showProvedSafe && showUnproved == _other.showUnproved && showUnsupported == _other.showUnsupported && diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index f18c618e9c6f..77f5581be694 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -430,7 +430,7 @@ std::optional checkSettingsKeys(Json::Value const& _input) std::optional checkModelCheckerSettingsKeys(Json::Value const& _input) { - static set keys{"bmcLoopIterations", "contracts", "divModNoSlacks", "engine", "extCalls", "invariants", "showProvedSafe", "showUnproved", "showUnsupported", "solvers", "targets", "timeout"}; + static set keys{"bmcLoopIterations", "contracts", "divModNoSlacks", "engine", "extCalls", "invariants", "printQuery", "showProvedSafe", "showUnproved", "showUnsupported", "solvers", "targets", "timeout"}; return checkKeys(_input, keys, "modelChecker"); } @@ -1096,6 +1096,18 @@ std::variant StandardCompiler: ret.modelCheckerSettings.solvers = solvers; } + if (modelCheckerSettings.isMember("printQuery")) + { + auto const& printQuery = modelCheckerSettings["printQuery"]; + if (!printQuery.isBool()) + return formatFatalError(Error::Type::JSONError, "settings.modelChecker.printQuery must be a Boolean value."); + + if (!(ret.modelCheckerSettings.solvers == smtutil::SMTSolverChoice::SMTLIB2())) + return formatFatalError(Error::Type::JSONError, "Only SMTLib2 solver can be enabled to print queries"); + + ret.modelCheckerSettings.printQuery = printQuery.asBool(); + } + if (modelCheckerSettings.isMember("targets")) { auto const& targetsArray = modelCheckerSettings["targets"]; diff --git a/scripts/error_codes.py b/scripts/error_codes.py index 890d90ecb3a1..d5b7ed76e279 100755 --- a/scripts/error_codes.py +++ b/scripts/error_codes.py @@ -204,7 +204,9 @@ def examine_id_coverage(top_dir, source_id_to_file_names, new_ids_only=False): "1834", # Unimplemented feature error, as we do not test it anymore via cmdLineTests "5430", # basefee being used in inline assembly for EVMVersion < london "1180", # SMTChecker, covered by CL tests + "2339", # SMTChecker, covered by CL tests "2961", # SMTChecker, covered by CL tests + "6240", # SMTChecker, covered by CL tests "9576", # SMTChecker, covered by CL tests } assert len(test_ids & white_ids) == 0, "The sets are not supposed to intersect" diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index dda7a6ba2b2a..060c1ad8fe0e 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -70,6 +70,7 @@ static string const g_strModelCheckerDivModNoSlacks = "model-checker-div-mod-no- static string const g_strModelCheckerEngine = "model-checker-engine"; static string const g_strModelCheckerExtCalls = "model-checker-ext-calls"; static string const g_strModelCheckerInvariants = "model-checker-invariants"; +static string const g_strModelCheckerPrintQuery = "model-checker-print-query"; static string const g_strModelCheckerShowProvedSafe = "model-checker-show-proved-safe"; static string const g_strModelCheckerShowUnproved = "model-checker-show-unproved"; static string const g_strModelCheckerShowUnsupported = "model-checker-show-unsupported"; @@ -841,6 +842,10 @@ General Information)").c_str(), " Multiple types of invariants can be selected at the same time, separated by a comma and no spaces." " By default no invariants are reported." ) + ( + g_strModelCheckerPrintQuery.c_str(), + "Print the queries created by the SMTChecker in the SMTLIB2 format." + ) ( g_strModelCheckerShowProvedSafe.c_str(), "Show all targets that were proved safe separately." @@ -963,12 +968,14 @@ void CommandLineParser::processArgs() {g_strMetadataLiteral, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strNoCBORMetadata, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strMetadataHash, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, - {g_strModelCheckerShowProvedSafe, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, - {g_strModelCheckerShowUnproved, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, - {g_strModelCheckerShowUnsupported, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strModelCheckerContracts, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerDivModNoSlacks, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerEngine, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerInvariants, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strModelCheckerPrintQuery, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strModelCheckerShowProvedSafe, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strModelCheckerShowUnproved, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strModelCheckerShowUnsupported, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerSolvers, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerTimeout, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, {g_strModelCheckerBMCLoopIterations, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, @@ -1322,6 +1329,13 @@ void CommandLineParser::processArgs() m_options.modelChecker.settings.solvers = *solvers; } + if (m_args.count(g_strModelCheckerPrintQuery)) + { + if (!(m_options.modelChecker.settings.solvers == smtutil::SMTSolverChoice::SMTLIB2())) + solThrow(CommandLineValidationError, "Only SMTLib2 solver can be enabled to print queries"); + m_options.modelChecker.settings.printQuery = true; + } + if (m_args.count(g_strModelCheckerTargets)) { string targetsStr = m_args[g_strModelCheckerTargets].as(); diff --git a/test/cmdlineTests/model_checker_print_query_all/args b/test/cmdlineTests/model_checker_print_query_all/args new file mode 100644 index 000000000000..d0b07d5aff9b --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_all/args @@ -0,0 +1 @@ +--model-checker-engine all --model-checker-print-query --model-checker-solvers smtlib2 --model-checker-timeout 1000 diff --git a/test/cmdlineTests/model_checker_print_query_all/err b/test/cmdlineTests/model_checker_print_query_all/err new file mode 100644 index 000000000000..1a04042cd778 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_all/err @@ -0,0 +1,165 @@ +Info: CHC: Requested query: +(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) + + +Warning: CHC: 1 verification condition(s) could not be proved. Enable the model checker option "show unproved" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +Warning: CHC analysis was not possible. No Horn solver was available. None of the installed solvers was enabled. + +Info: BMC: Requested query: +(set-option :produce-models true) +(set-option :timeout 1000) +(set-logic ALL) +(declare-fun |x_5_3| () Int) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_4| () Int) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) + + +Warning: BMC: 1 verification condition(s) could not be proved. Enable the model checker option "show unproved" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +Warning: BMC analysis was not possible. No SMT solver (Z3 or CVC4) was available. None of the installed solvers was enabled. diff --git a/test/cmdlineTests/model_checker_print_query_all/input.sol b/test/cmdlineTests/model_checker_print_query_all/input.sol new file mode 100644 index 000000000000..eb4cd572ae22 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_all/input.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f() public pure { + uint x = 0; + assert(x == 0); + } +} diff --git a/test/cmdlineTests/model_checker_print_query_bmc/args b/test/cmdlineTests/model_checker_print_query_bmc/args new file mode 100644 index 000000000000..d13bdc43b3b3 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_bmc/args @@ -0,0 +1 @@ +--model-checker-engine bmc --model-checker-print-query --model-checker-solvers smtlib2 diff --git a/test/cmdlineTests/model_checker_print_query_bmc/err b/test/cmdlineTests/model_checker_print_query_bmc/err new file mode 100644 index 000000000000..1a59f87b0d95 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_bmc/err @@ -0,0 +1,32 @@ +Info: BMC: Requested query: +(set-option :produce-models true) +(set-logic ALL) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) + + +Warning: BMC: 1 verification condition(s) could not be proved. Enable the model checker option "show unproved" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +Warning: BMC analysis was not possible. No SMT solver (Z3 or CVC4) was available. None of the installed solvers was enabled. diff --git a/test/cmdlineTests/model_checker_print_query_bmc/input.sol b/test/cmdlineTests/model_checker_print_query_bmc/input.sol new file mode 100644 index 000000000000..eb4cd572ae22 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_bmc/input.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f() public pure { + uint x = 0; + assert(x == 0); + } +} diff --git a/test/cmdlineTests/model_checker_print_query_chc/args b/test/cmdlineTests/model_checker_print_query_chc/args new file mode 100644 index 000000000000..752709efbb5c --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_chc/args @@ -0,0 +1 @@ +--model-checker-engine chc --model-checker-print-query --model-checker-solvers smtlib2 --model-checker-timeout 1000 diff --git a/test/cmdlineTests/model_checker_print_query_chc/err b/test/cmdlineTests/model_checker_print_query_chc/err new file mode 100644 index 000000000000..1dd7f0c98828 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_chc/err @@ -0,0 +1,129 @@ +Info: CHC: Requested query: +(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) + + +Warning: CHC: 1 verification condition(s) could not be proved. Enable the model checker option "show unproved" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +Warning: CHC analysis was not possible. No Horn solver was available. None of the installed solvers was enabled. diff --git a/test/cmdlineTests/model_checker_print_query_chc/input.sol b/test/cmdlineTests/model_checker_print_query_chc/input.sol new file mode 100644 index 000000000000..eb4cd572ae22 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_chc/input.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f() public pure { + uint x = 0; + assert(x == 0); + } +} diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/args b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/args new file mode 100644 index 000000000000..12b7c324584b --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/args @@ -0,0 +1 @@ +--model-checker-engine bmc --model-checker-print-query --model-checker-solvers z3 diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/err b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/err new file mode 100644 index 000000000000..db94bc9ba505 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/err @@ -0,0 +1 @@ +Only SMTLib2 solver can be enabled to print queries diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/exit b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/input.sol b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/input.sol new file mode 100644 index 000000000000..eb4cd572ae22 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_bmc/input.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f() public pure { + uint x = 0; + assert(x == 0); + } +} diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/args b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/args new file mode 100644 index 000000000000..e3a8c32d4716 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/args @@ -0,0 +1 @@ +--model-checker-engine chc --model-checker-print-query --model-checker-solvers z3 diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/err b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/err new file mode 100644 index 000000000000..db94bc9ba505 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/err @@ -0,0 +1 @@ +Only SMTLib2 solver can be enabled to print queries diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/exit b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/input.sol b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/input.sol new file mode 100644 index 000000000000..eb4cd572ae22 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_no_smtlib2_solver_chc/input.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f() public pure { + uint x = 0; + assert(x == 0); + } +} diff --git a/test/cmdlineTests/model_checker_print_query_superflous_solver/args b/test/cmdlineTests/model_checker_print_query_superflous_solver/args new file mode 100644 index 000000000000..64e5d88728ea --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_superflous_solver/args @@ -0,0 +1 @@ +--model-checker-engine bmc --model-checker-print-query --model-checker-solvers z3,smtlib2 diff --git a/test/cmdlineTests/model_checker_print_query_superflous_solver/err b/test/cmdlineTests/model_checker_print_query_superflous_solver/err new file mode 100644 index 000000000000..db94bc9ba505 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_superflous_solver/err @@ -0,0 +1 @@ +Only SMTLib2 solver can be enabled to print queries diff --git a/test/cmdlineTests/model_checker_print_query_superflous_solver/exit b/test/cmdlineTests/model_checker_print_query_superflous_solver/exit new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_superflous_solver/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/model_checker_print_query_superflous_solver/input.sol b/test/cmdlineTests/model_checker_print_query_superflous_solver/input.sol new file mode 100644 index 000000000000..eb4cd572ae22 --- /dev/null +++ b/test/cmdlineTests/model_checker_print_query_superflous_solver/input.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +contract C +{ + function f() public pure { + uint x = 0; + assert(x == 0); + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_all/input.json b/test/cmdlineTests/standard_model_checker_print_query_all/input.json new file mode 100644 index 000000000000..67fc5d8c792c --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_all/input.json @@ -0,0 +1,27 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0;\n + contract C + { + function f() public pure { + uint x = 0; + assert(x == 0); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "all", + "printQuery": true, + "solvers": ["smtlib2"], + "timeout": 1000 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_all/output.json b/test/cmdlineTests/standard_model_checker_print_query_all/output.json new file mode 100644 index 000000000000..b8e11ced7301 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_all/output.json @@ -0,0 +1,540 @@ +{ + "auxiliaryInputRequested": + { + "smtlib2queries": + { + "0x1880095c52d8681601c6821e4a5c29740649509af99947bce54102546dd3376a": "(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) +", + "0xcbfcc2413b217c6564ee01f322c9ca1f34fd79d19961dc3e62aa9c2e5dcb6efc": "(set-option :produce-models true) +(set-option :timeout 1000) +(set-logic ALL) +(declare-fun |x_5_3| () Int) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_4| () Int) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) +" + } + }, + "errors": + [ + { + "component": "general", + "errorCode": "2339", + "formattedMessage": "Info: CHC: Requested query: +(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) + + +", + "message": "CHC: Requested query: +(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) +", + "severity": "info", + "type": "Info" + }, + { + "component": "general", + "errorCode": "5840", + "formattedMessage": "Warning: CHC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +", + "message": "CHC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query.", + "severity": "warning", + "type": "Warning" + }, + { + "component": "general", + "errorCode": "3996", + "formattedMessage": "Warning: CHC analysis was not possible. No Horn solver was available. None of the installed solvers was enabled. + +", + "message": "CHC analysis was not possible. No Horn solver was available. None of the installed solvers was enabled.", + "severity": "warning", + "type": "Warning" + }, + { + "component": "general", + "errorCode": "6240", + "formattedMessage": "Info: BMC: Requested query: +(set-option :produce-models true) +(set-option :timeout 1000) +(set-logic ALL) +(declare-fun |x_5_3| () Int) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_4| () Int) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) + + +", + "message": "BMC: Requested query: +(set-option :produce-models true) +(set-option :timeout 1000) +(set-logic ALL) +(declare-fun |x_5_3| () Int) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_4| () Int) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) +", + "severity": "info", + "type": "Info" + }, + { + "component": "general", + "errorCode": "2788", + "formattedMessage": "Warning: BMC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +", + "message": "BMC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query.", + "severity": "warning", + "type": "Warning" + }, + { + "component": "general", + "errorCode": "8084", + "formattedMessage": "Warning: BMC analysis was not possible. No SMT solver (Z3 or CVC4) was available. None of the installed solvers was enabled. + +", + "message": "BMC analysis was not possible. No SMT solver (Z3 or CVC4) was available. None of the installed solvers was enabled.", + "severity": "warning", + "type": "Warning" + } + ], + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_bmc/input.json b/test/cmdlineTests/standard_model_checker_print_query_bmc/input.json new file mode 100644 index 000000000000..7957a58e3e4f --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_bmc/input.json @@ -0,0 +1,26 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0;\n + contract C + { + function f() public pure { + uint x = 0; + assert(x == 0); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "bmc", + "printQuery": true, + "solvers": ["smtlib2"] + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_bmc/output.json b/test/cmdlineTests/standard_model_checker_print_query_bmc/output.json new file mode 100644 index 000000000000..f7b4dc7e2871 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_bmc/output.json @@ -0,0 +1,129 @@ +{ + "auxiliaryInputRequested": + { + "smtlib2queries": + { + "0x8704a7b848b706ef33cbfc06e4f185636f568a29621126b7244355dd0de956bb": "(set-option :produce-models true) +(set-logic ALL) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) +" + } + }, + "errors": + [ + { + "component": "general", + "errorCode": "6240", + "formattedMessage": "Info: BMC: Requested query: +(set-option :produce-models true) +(set-logic ALL) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) + + +", + "message": "BMC: Requested query: +(set-option :produce-models true) +(set-logic ALL) +(declare-fun |error_0| () Int) +(declare-fun |this_0| () Int) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-fun |tx_0| () |tx_type|) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-fun |crypto_0| () |crypto_type|) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-fun |abi_0| () |abi_type|) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |state_0| () |state_type|) +(declare-fun |x_5_0| () Int) +(declare-fun |expr_6_0| () Int) +(declare-fun |x_5_1| () Int) +(declare-fun |expr_9_0| () Int) +(declare-fun |expr_10_0| () Int) +(declare-fun |expr_11_1| () Bool) + +(assert (and (and (and true true) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> (and true true) true) (and (= expr_10_0 0) (and (=> (and true true) (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_1) (and (ite (and true true) (= x_5_1 expr_6_0) (= x_5_1 x_5_0)) (and (=> (and true true) true) (and (= expr_6_0 0) (and (= x_5_0 0) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) true))))))))))) (not expr_11_1))) +(declare-const |EVALEXPR_0| Int) +(assert (= |EVALEXPR_0| x_5_1)) +(check-sat) +(get-value (|EVALEXPR_0| )) +", + "severity": "info", + "type": "Info" + }, + { + "component": "general", + "errorCode": "2788", + "formattedMessage": "Warning: BMC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +", + "message": "BMC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query.", + "severity": "warning", + "type": "Warning" + }, + { + "component": "general", + "errorCode": "8084", + "formattedMessage": "Warning: BMC analysis was not possible. No SMT solver (Z3 or CVC4) was available. None of the installed solvers was enabled. + +", + "message": "BMC analysis was not possible. No SMT solver (Z3 or CVC4) was available. None of the installed solvers was enabled.", + "severity": "warning", + "type": "Warning" + } + ], + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_chc/input.json b/test/cmdlineTests/standard_model_checker_print_query_chc/input.json new file mode 100644 index 000000000000..d5801ef260fd --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_chc/input.json @@ -0,0 +1,27 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0;\n + contract C + { + function f() public pure { + uint x = 0; + assert(x == 0); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "chc", + "printQuery": true, + "solvers": ["smtlib2"], + "timeout": 1000 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_chc/output.json b/test/cmdlineTests/standard_model_checker_print_query_chc/output.json new file mode 100644 index 000000000000..9ef925b205a2 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_chc/output.json @@ -0,0 +1,420 @@ +{ + "auxiliaryInputRequested": + { + "smtlib2queries": + { + "0x1880095c52d8681601c6821e4a5c29740649509af99947bce54102546dd3376a": "(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) +" + } + }, + "errors": + [ + { + "component": "general", + "errorCode": "2339", + "formattedMessage": "Info: CHC: Requested query: +(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) + + +", + "message": "CHC: Requested query: +(set-option :timeout 1000) +(set-logic HORN) +(declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) +(declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) +(declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) +(declare-datatypes ((|crypto_type| 0)) (((|crypto_type| (|ecrecover| (Array |ecrecover_input_type| Int)) (|keccak256| (Array |bytes_tuple| Int)) (|ripemd160| (Array |bytes_tuple| Int)) (|sha256| (Array |bytes_tuple| Int)))))) +(declare-datatypes ((|abi_type| 0)) (((|abi_type|)))) +(declare-datatypes ((|state_type| 0)) (((|state_type| (|balances| (Array Int Int)))))) +(declare-fun |interface_0_C_16_0| (Int |abi_type| |crypto_type| |state_type| ) Bool) +(declare-fun |nondet_interface_1_C_16_0| (Int Int |abi_type| |crypto_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_constructor_2_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (state_0 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (= error_0 0) (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_0)))) + + +(declare-fun |summary_3_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |summary_4_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|)) +(=> (and (and (nondet_interface_1_C_16_0 error_0 this_0 abi_0 crypto_0 state_0 state_1) true) (and (= error_0 0) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2))) (nondet_interface_1_C_16_0 error_1 this_0 abi_0 crypto_0 state_0 state_2)))) + + +(declare-fun |block_5_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_6_f_14_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int)) +(=> (and (and (block_5_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true)) true) (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1)))) + + +(declare-fun |block_7_return_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(declare-fun |block_8_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true)))))))))) (and (and true (not expr_11_1)) (= error_1 1))) (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (block_8_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2) (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_6_f_14_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (= error_1 error_0) (and (= expr_11_1 (= expr_9_0 expr_10_0)) (and (=> true true) (and (= expr_10_0 0) (and (=> true (and (>= expr_9_0 0) (<= expr_9_0 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (= expr_9_0 x_5_2) (and (= x_5_2 expr_6_0) (and (=> true true) (and (= expr_6_0 0) (and (= x_5_1 0) true))))))))))) true) (block_7_return_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_7_return_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) true) true) (summary_3_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |block_9_function_f__15_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| Int ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (block_9_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1 x_5_1) (and (summary_3_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_2 state_3) (and (= state_2 (|state_type| (store (|balances| state_1) this_0 (+ (select (|balances| state_1) this_0) funds_2_0)))) (and (and (>= (+ (select (|balances| state_1) this_0) funds_2_0) 0) (<= (+ (select (|balances| state_1) this_0) funds_2_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935)) (and (>= funds_2_0 (|msg.value| tx_0)) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (and (and (and (and (and (= (|msg.value| tx_0) 0) (= (|msg.sig| tx_0) 638722032)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 0) 38)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 1) 18)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 2) 31)) (= (select (|bytes_tuple_accessor_array| (|msg.data| tx_0)) 3) 240)) (>= (|bytes_tuple_accessor_length| (|msg.data| tx_0)) 4))) (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true))))))) true) (summary_4_function_f__15_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_3)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |contract_initializer_10_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(declare-fun |contract_initializer_entry_11_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (= state_1 state_0) (= error_0 0)) true) (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |contract_initializer_after_init_12_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_entry_11_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (contract_initializer_after_init_12_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) true) (contract_initializer_10_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(declare-fun |implicit_constructor_entry_13_C_16_0| (Int Int |abi_type| |crypto_type| |tx_type| |state_type| |state_type| ) Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (and (and (and (= state_1 state_0) (= error_0 0)) true) true) true) (>= (select (|balances| state_1) this_0) (|msg.value| tx_0))) (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true)) (> error_1 0)) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (implicit_constructor_entry_13_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (and (= error_1 0) (and (contract_initializer_10_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_1 state_2) true))) true) (summary_constructor_2_C_16_0 error_1 this_0 abi_0 crypto_0 tx_0 state_0 state_2)))) + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (summary_constructor_2_C_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) true) (and (and (and (and (and (and (and (and (and (and (and (and (and (> (|block.prevrandao| tx_0) 18446744073709551616) (and (>= (|block.basefee| tx_0) 0) (<= (|block.basefee| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.chainid| tx_0) 0) (<= (|block.chainid| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.coinbase| tx_0) 0) (<= (|block.coinbase| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|block.prevrandao| tx_0) 0) (<= (|block.prevrandao| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.gaslimit| tx_0) 0) (<= (|block.gaslimit| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.number| tx_0) 0) (<= (|block.number| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|block.timestamp| tx_0) 0) (<= (|block.timestamp| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|msg.sender| tx_0) 0) (<= (|msg.sender| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|msg.value| tx_0) 0) (<= (|msg.value| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (and (>= (|tx.origin| tx_0) 0) (<= (|tx.origin| tx_0) 1461501637330902918203684832716283019655932542975))) (and (>= (|tx.gasprice| tx_0) 0) (<= (|tx.gasprice| tx_0) 115792089237316195423570985008687907853269984665640564039457584007913129639935))) (= (|msg.value| tx_0) 0)) (= error_0 0))) (interface_0_C_16_0 this_0 abi_0 crypto_0 state_1)))) + + +(declare-fun |error_target_3_0| () Bool) +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> (and (and (interface_0_C_16_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__15_16_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 state_1) (= error_0 1))) error_target_3_0))) + + + +(assert +(forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_10_0 Int) (expr_11_1 Bool) (expr_6_0 Int) (expr_9_0 Int) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_5_0 Int) (x_5_1 Int) (x_5_2 Int)) +(=> error_target_3_0 false))) +(check-sat) +", + "severity": "info", + "type": "Info" + }, + { + "component": "general", + "errorCode": "5840", + "formattedMessage": "Warning: CHC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query. + +", + "message": "CHC: 1 verification condition(s) could not be proved. Enable the model checker option \"show unproved\" to see all of them. Consider choosing a specific contract to be verified in order to reduce the solving problems. Consider increasing the timeout per query.", + "severity": "warning", + "type": "Warning" + }, + { + "component": "general", + "errorCode": "3996", + "formattedMessage": "Warning: CHC analysis was not possible. No Horn solver was available. None of the installed solvers was enabled. + +", + "message": "CHC analysis was not possible. No Horn solver was available. None of the installed solvers was enabled.", + "severity": "warning", + "type": "Warning" + } + ], + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_invalid_arg/input.json b/test/cmdlineTests/standard_model_checker_print_query_invalid_arg/input.json new file mode 100644 index 000000000000..97822c2bde6f --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_invalid_arg/input.json @@ -0,0 +1,25 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0;\n + contract C + { + function f() public pure { + uint x = 0; + assert(x == 0); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "all", + "printQuery": 17 + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_invalid_arg/output.json b/test/cmdlineTests/standard_model_checker_print_query_invalid_arg/output.json new file mode 100644 index 000000000000..00c389f7a433 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_invalid_arg/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "settings.modelChecker.printQuery must be a Boolean value.", + "message": "settings.modelChecker.printQuery must be a Boolean value.", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/input.json b/test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/input.json new file mode 100644 index 000000000000..0159c256e6ed --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/input.json @@ -0,0 +1,25 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0;\n + contract C + { + function f() public pure { + uint x = 0; + assert(x == 0); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "all", + "printQuery": true + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/output.json b/test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/output.json new file mode 100644 index 000000000000..42d4b5b2db8a --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_no_smtlib2_solver/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "Only SMTLib2 solver can be enabled to print queries", + "message": "Only SMTLib2 solver can be enabled to print queries", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_superflous_solver/input.json b/test/cmdlineTests/standard_model_checker_print_query_superflous_solver/input.json new file mode 100644 index 000000000000..9ebda00174b4 --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_superflous_solver/input.json @@ -0,0 +1,26 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.0;\n + contract C + { + function f() public pure { + uint x = 0; + assert(x == 0); + } + }" + } + }, + "settings": + { + "modelChecker": + { + "engine": "all", + "printQuery": true, + "solvers": ["smtlib2", "z3"] + } + } +} diff --git a/test/cmdlineTests/standard_model_checker_print_query_superflous_solver/output.json b/test/cmdlineTests/standard_model_checker_print_query_superflous_solver/output.json new file mode 100644 index 000000000000..42d4b5b2db8a --- /dev/null +++ b/test/cmdlineTests/standard_model_checker_print_query_superflous_solver/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "Only SMTLib2 solver can be enabled to print queries", + "message": "Only SMTLib2 solver can be enabled to print queries", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/cmdlineTests/standard_model_checker_solvers_smtlib2/output.json b/test/cmdlineTests/standard_model_checker_solvers_smtlib2/output.json index bf59a0d9daa1..ebeca53f5ba3 100644 --- a/test/cmdlineTests/standard_model_checker_solvers_smtlib2/output.json +++ b/test/cmdlineTests/standard_model_checker_solvers_smtlib2/output.json @@ -30,8 +30,7 @@ (check-sat) (get-value (|EVALEXPR_0| )) ", - "0xa991e3c158410479bc0a0540fb60ce7010aec315a5b0010d254f12f3d1f0a4e5": "(set-logic HORN) - + "0xe3dc20257e2b1bd9c6eb77b75913ec3a5752be174e0fd56af16d9fc95afa1b15": "(set-logic HORN) (declare-datatypes ((|bytes_tuple| 0)) (((|bytes_tuple| (|bytes_tuple_accessor_array| (Array Int Int)) (|bytes_tuple_accessor_length| Int))))) (declare-datatypes ((|tx_type| 0)) (((|tx_type| (|block.basefee| Int) (|block.chainid| Int) (|block.coinbase| Int) (|block.gaslimit| Int) (|block.number| Int) (|block.prevrandao| Int) (|block.timestamp| Int) (|blockhash| (Array Int Int)) (|msg.data| |bytes_tuple|) (|msg.sender| Int) (|msg.sig| Int) (|msg.value| Int) (|tx.gasprice| Int) (|tx.origin| Int))))) (declare-datatypes ((|ecrecover_input_type| 0)) (((|ecrecover_input_type| (|hash| Int) (|v| Int) (|r| Int) (|s| Int))))) @@ -148,10 +147,12 @@ (=> (and (and (interface_0_C_14_0 this_0 abi_0 crypto_0 state_0) true) (and (summary_4_function_f__13_14_0 error_0 this_0 abi_0 crypto_0 tx_0 state_0 x_3_0 state_1 x_3_1) (= error_0 1))) error_target_3_0))) + (assert (forall ( (abi_0 |abi_type|) (crypto_0 |crypto_type|) (error_0 Int) (error_1 Int) (expr_7_0 Int) (expr_8_0 Int) (expr_9_1 Bool) (funds_2_0 Int) (state_0 |state_type|) (state_1 |state_type|) (state_2 |state_type|) (state_3 |state_type|) (this_0 Int) (tx_0 |tx_type|) (x_3_0 Int) (x_3_1 Int) (x_3_2 Int)) (=> error_target_3_0 false))) -(check-sat)" +(check-sat) +" } }, "errors": diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index 1fc033533d9c..4a76ce4f1593 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -219,6 +219,7 @@ BOOST_AUTO_TEST_CASE(cli_mode_options) {true, false}, {ModelCheckerExtCalls::Mode::TRUSTED}, {{InvariantType::Contract, InvariantType::Reentrancy}}, + false, // --model-checker-print-query true, true, true, diff --git a/test/tools/fuzzer_common.cpp b/test/tools/fuzzer_common.cpp index 531fc3c177b5..1bb04bf66aad 100644 --- a/test/tools/fuzzer_common.cpp +++ b/test/tools/fuzzer_common.cpp @@ -111,6 +111,7 @@ void FuzzerUtil::testCompiler( frontend::ModelCheckerEngine::All(), frontend::ModelCheckerExtCalls{}, frontend::ModelCheckerInvariants::All(), + /*printQuery=*/false, /*showProvedSafe=*/false, /*showUnproved=*/false, /*showUnsupported=*/false, From 32e82970489b3c408a08b0d5361a2038ec92a79b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 19 Jun 2023 14:16:20 +0200 Subject: [PATCH 080/138] Remove unused bytecodecompare/deploy_key.enc --- scripts/bytecodecompare/deploy_key.enc | Bin 1680 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 scripts/bytecodecompare/deploy_key.enc diff --git a/scripts/bytecodecompare/deploy_key.enc b/scripts/bytecodecompare/deploy_key.enc deleted file mode 100644 index acab2a279151f2cfb5f33c8d4cd9614a1898db4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmV;B25M&y_3#~ zO$2Da40ir47W)~E1u$9J@nPNd`i=5@xw?Pt6^2`iLVpz8)cXC)5>bwAJo*(iErtwA zoUiW0lc^!N=&TBGKpHqbrFuB2DKUonKG3=04Kr`|Gg`im4aqCQna zvb-POlEBMW8F!|gZZ#)=uU00vtn!LZO#;rR$TAmRvd{b|;#wn=SK4qc@y@j#Z!6#B(Ow_DpW&B;qj!kKq&^~|noGj9xx)EJk*#1Lk+gjxmC%WP= zT{%nMcF%?E9f029=Y+(X9g-Kv!MZaPScB5c{S84GnG@8V$N~-t*Z+xx1Sqr2z5BYN z2-q)a6+@qvy=QB@z4Hy5AelD|y^jA~q%pns?}NzG+`5J>c(D*R_F-GCCb`2{e)2-- z2l0;7n6IAhdnzFcs<}#GdT3J`!Y8Hu4x@6wd9cmLpb~@Jv@K!E6R1wyyy&OYx`qzO zZgL9fPpfyTfz0s`=YA>bu)qu-Cijf0nDA|(*Hs!=gd)_h+We(b35=621XU=NhP5T7 z#Pjr{5g(9az5eLI@4C}7N40^P(?N8PFz*~&+0p3%YX`%bkA(fbkqVXS#&nBYHRdWW zuTg5DOVH7PEAm4%iXz#)T5#8S-{oMZ8YQ@a^-=~>-I2BKOb*LXYq}YU>hHb1#2wYL|iL*z95?QFwYJ9H|aS7H<&7*>pY+Nt=M;tSz zX32{PQ0^^cjq4!&_WkKfV)}qt=yZ!@MP0dYg!heMg<>b1zApEic<&>>dntMg$WAT83RnT06}W%iCsb34=py+ESksiocK z>yq{}K8DyET!;*u1W0G*KW8an561@jFW+jYQ1^zO9Jo5_#5H@z?gt>GS@D3re#YKD zw+O_ei%TDSMG84%7<`Ju+>p{YzdM2nF`}(NnedrSb_RSb64B_JR@3^+Mv?Yuq<`0X++?uk9d zQf{t^6hEVy5kr05<-DXi( zqeqv2x3}Bv;Hdq%1s4GjHVhajwUm6J7QdIFCX5p{tR(2_WR?_L07TR*-Q-|N=~9+p z++;3n(T!EJI-8pF(&3L44p>l+ioc5G`2@!7kh!{J2_aL2y8u6`bV{vtE?)wmJP zu1)~eF|bEF{z*vHB+$L+_gw-3qM5N&)ErXkXtT1zHS_B+eKRKqxr-SvY8M!jmvyc9 zO{R;F3IyIr!b(tIb$@O{iU{5knJYb2ZTHx8#p=XpZ0l^9>|1@0{|Kw0_kfph^|^IiTqV zgC9VI0yZK@`u*Ww1u%P(NB;U*N~Sf_)DT-Zcx_>-KtQYgxihY_si0BFG@nnsv0+P6VvZr{$FubD($ zBYJp`IpcGSKlYqFY+BGf)D?klCoKCUNaLLhEG<7FgY7Y{|Jh9^QE4p!G3)hdH|U(C a)1IY2pV51-`N#7&Y02#vV+C5FawJKy>q|%g From 4752b31e6c2e2d9f7cdfd7822d86ce69814a326d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 16 Jun 2023 14:29:18 +0200 Subject: [PATCH 081/138] cmdlineTests.sh: Rewrite test selection to use find --- test/cmdlineTests.sh | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index e1d8a5746875..7a219a1a9806 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -42,8 +42,7 @@ source "${REPO_ROOT}/scripts/common_cmdline.sh" pushd "${REPO_ROOT}/test/cmdlineTests" > /dev/null autoupdate=false no_smt=false -declare -a selected_tests -declare -a patterns_with_no_matches +declare -a included_test_patterns while [[ $# -gt 0 ]] do case "$1" in @@ -56,30 +55,35 @@ do shift ;; *) - matching_tests=$(find . -mindepth 1 -maxdepth 1 -type d -name "$1" | cut -c 3- | LC_COLLATE=C sort) - - if [[ $matching_tests == "" ]] - then - patterns_with_no_matches+=("$1") - printWarning "No tests matching pattern '$1' found." - else - # shellcheck disable=SC2206 # We do not support test names containing spaces. - selected_tests+=($matching_tests) - fi - + included_test_patterns+=("$1") shift ;; esac done -if (( ${#selected_tests[@]} == 0 && ${#patterns_with_no_matches[@]} == 0 )) +(( ${#included_test_patterns[@]} > 0 )) || included_test_patterns+=('*') + +test_name_filter=('(' -name "${included_test_patterns[0]}") +for pattern in "${included_test_patterns[@]:1}" +do + test_name_filter+=(-or -name "$pattern") +done +test_name_filter+=(')') + +# NOTE: We want leading symbols in names to affect the sort order but without +# LC_COLLATE=C sort seems to ignore them. +# shellcheck disable=SC2207 # We do not support test names containing spaces. +selected_tests=($(find . -mindepth 1 -maxdepth 1 -type d "${test_name_filter[@]}" | cut -c 3- | LC_COLLATE=C sort)) + +if (( ${#selected_tests[@]} == 0 )) then - # NOTE: We want leading symbols in names to affect the sort order but without - # LC_COLLATE=C sort seems to ignore them. - all_tests=$(echo * | tr '[:space:]' '\n' | LC_COLLATE=C sort) - # shellcheck disable=SC2206 # We do not support test names containing spaces. - selected_tests=($all_tests) + printWarning "The pattern '${test_name_filter[*]}' did not match any tests." + exit 0; +else + test_count=$(find . -mindepth 1 -maxdepth 1 -type d | wc -l) + printLog "Selected ${#selected_tests[@]} out of ${test_count} tests." fi + popd > /dev/null case "$OSTYPE" in From 399457d74b8953457db206d937a2ae11654a6cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 16 Jun 2023 14:36:24 +0200 Subject: [PATCH 082/138] cmdlineTests.sh: Add --exclude option --- docs/contributing.rst | 6 ++++-- test/cmdlineTests.sh | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/contributing.rst b/docs/contributing.rst index 02ca00455b91..7f444871d546 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -280,6 +280,7 @@ one per subdirectory, and can be executed using the ``cmdlineTests.sh`` script. By default the script runs all available tests. You can also provide one or more `file name patterns `_, in which case only the tests matching at least one pattern will be executed. +It is also possible to exclude files matching a specific pattern by prefixing it with ``--exclude``. By default the script assumes that a ``solc`` binary is available inside the ``build/`` subdirectory inside the working copy. @@ -291,10 +292,11 @@ Example: .. code-block:: bash export SOLIDITY_BUILD_DIR=~/solidity/build/ - test/cmdlineTests.sh "standard_*" "*_yul_*" + test/cmdlineTests.sh "standard_*" "*_yul_*" --exclude "standard_yul_*" The commands above will run tests from directories starting with ``test/cmdlineTests/standard_`` and -subdirectories of ``test/cmdlineTests/`` that have ``_yul_`` somewhere in the name. +subdirectories of ``test/cmdlineTests/`` that have ``_yul_`` somewhere in the name, +but no test whose name starts with ``standard_yul_`` will be executed. It will also assume that the file ``solidity/build/solc/solc`` inside your home directory is the compiler binary (unless you are on Windows -- then ``solidity/build/solc/Release/solc.exe``). diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 7a219a1a9806..b02880557c71 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -43,6 +43,7 @@ pushd "${REPO_ROOT}/test/cmdlineTests" > /dev/null autoupdate=false no_smt=false declare -a included_test_patterns +declare -a excluded_test_patterns while [[ $# -gt 0 ]] do case "$1" in @@ -54,6 +55,12 @@ do no_smt=true shift ;; + --exclude) + [[ $2 != '' ]] || fail "No pattern given to --exclude option or the pattern is empty." + excluded_test_patterns+=("$2") + shift + shift + ;; *) included_test_patterns+=("$1") shift @@ -70,6 +77,11 @@ do done test_name_filter+=(')') +for pattern in "${excluded_test_patterns[@]}" +do + test_name_filter+=(-and -not -name "$pattern") +done + # NOTE: We want leading symbols in names to affect the sort order but without # LC_COLLATE=C sort seems to ignore them. # shellcheck disable=SC2207 # We do not support test names containing spaces. From fac7ca943bb1db8d5b8afab61d73f8b03e2bbe5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 16 Jun 2023 19:37:53 +0200 Subject: [PATCH 083/138] Parallelize CLI tests --- .circleci/config.yml | 6 ++++- .circleci/parallel_cli_tests.py | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100755 .circleci/parallel_cli_tests.py diff --git a/.circleci/config.yml b/.circleci/config.yml index d5ea61ad264e..65222f082749 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -202,7 +202,7 @@ defaults: - run_cmdline_tests: &run_cmdline_tests name: command line tests no_output_timeout: 30m - command: ./test/cmdlineTests.sh + command: .circleci/parallel_cli_tests.py - run_docs_pragma_min_version: &run_docs_pragma_min_version name: docs pragma version check @@ -1053,6 +1053,7 @@ jobs: t_osx_cli: <<: *base_osx + parallelism: 7 # Should match number of tests in .circleci/cli.sh steps: - checkout - when: @@ -1147,6 +1148,7 @@ jobs: t_ubu_cli: &t_ubu_cli <<: *base_ubuntu2204_small + parallelism: 7 # Should match number of tests in .circleci/cli.sh <<: *steps_cmdline_tests t_ubu_force_release_cli: &t_ubu_force_release_cli @@ -1164,6 +1166,7 @@ jobs: t_ubu_asan_cli: # Runs slightly faster on medium but we only run it nightly so efficiency matters more. <<: *base_ubuntu2204 + parallelism: 7 # Should match number of tests in .circleci/cli.sh environment: TERM: xterm ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 @@ -1205,6 +1208,7 @@ jobs: t_ubu_ubsan_clang_cli: <<: *base_ubuntu2204_clang + parallelism: 7 # Should match number of tests in .circleci/cli.sh <<: *steps_cmdline_tests t_ems_solcjs: diff --git a/.circleci/parallel_cli_tests.py b/.circleci/parallel_cli_tests.py new file mode 100755 index 000000000000..ef789218063a --- /dev/null +++ b/.circleci/parallel_cli_tests.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 + +import subprocess +import sys + +# Slowest CLI tests, whose execution takes time on the order of minutes (as of June 2023). +# When adding/removing items here, remember to update `parallelism` value in jobs that run this script. +# TODO: We should switch to time-based splitting but that requires JUnit XML report support in cmdlineTests.sh. +tests_to_run_in_parallel = [ + '~ast_import_export', # ~7 min + '~ast_export_with_stop_after_parsing', # ~4 min + '~soljson_via_fuzzer', # ~3 min + '~via_ir_equivalence', # ~1 min + '~compilation_tests', # ~1 min + '~documentation_examples', # ~1 min + '*', # This item represents all the remaining tests +] + +# Ask CircleCI to select a subset of tests for this parallel execution. +# If `parallelism` in CI config is set correctly, we should get just one but we can handle any split. +selected_tests = subprocess.check_output( + ['circleci', 'tests', 'split'], + input='\n'.join(tests_to_run_in_parallel), + encoding='ascii', +).strip().split('\n') +selected_tests = set(selected_tests) - {''} +excluded_tests = set(tests_to_run_in_parallel) - selected_tests +assert selected_tests.issubset(set(tests_to_run_in_parallel)) + +if len(selected_tests) == 0: + print("No tests to run.") + sys.exit(0) + +if '*' in selected_tests: + filters = [arg for test_name in excluded_tests for arg in ['--exclude', test_name]] +else: + filters = list(selected_tests) + +subprocess.run( + ['test/cmdlineTests.sh'] + filters, + stdin=sys.stdin, + stdout=sys.stdout, + stderr=sys.stderr, + check=True, +) From edd99b07fe947a133fac6039680c5282ee239801 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 21 Jun 2023 12:19:55 +0200 Subject: [PATCH 084/138] Disable failing OZ tests --- test/externalTests/zeppelin.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index 5c0271125197..cf8df4363e13 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -93,6 +93,10 @@ function zeppelin_test sed -i "s|it(\('cannot nest reinitializers'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js sed -i "s|it(\('prevents re-initialization'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js sed -i "s|it(\('can lock contract after initialization'\)|it.skip(\1|g" test/proxy/utils/Initializable.test.js + sed -i "s|it(\('calling upgradeTo on the implementation reverts'\)|it.skip(\1|g" test/proxy/utils/UUPSUpgradeable.test.js + sed -i "s|it(\('calling upgradeToAndCall on the implementation reverts'\)|it.skip(\1|g" test/proxy/utils/UUPSUpgradeable.test.js + sed -i "s|it(\('calling upgradeTo from a contract that is not an ERC1967 proxy\)|it.skip(\1|g" test/proxy/utils/UUPSUpgradeable.test.js + sed -i "s|it(\('calling upgradeToAndCall from a contract that is not an ERC1967 proxy\)|it.skip(\1|g" test/proxy/utils/UUPSUpgradeable.test.js # Here only the testToInt(248) and testToInt(256) cases fail so change the loop range to skip them sed -i "s|range(8, 256, 8)\(.forEach(bits => testToInt(bits));\)|range(8, 240, 8)\1|" test/utils/math/SafeCast.test.js From e8c4d0e324fc86b60da3d27918b8a0de6f8d91fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 15 Jun 2023 12:43:37 +0200 Subject: [PATCH 085/138] More consistent file naming for bytecode compare artifacts - This will make it easier to have a single variable specifying the interface. --- .circleci/config.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 65222f082749..f0af5e7a9d15 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -81,17 +81,16 @@ commands: steps: - run: mkdir test-cases/ - run: cd test-cases && python3 ../scripts/isolate_tests.py ../test/ - - run: cd test-cases && python3 ../scripts/bytecodecompare/prepare_report.py << parameters.binary_path >> --interface standard-json --report-file "../bytecode-report-<< parameters.label >>-json.txt" + - run: cd test-cases && python3 ../scripts/bytecodecompare/prepare_report.py << parameters.binary_path >> --interface standard-json --report-file "../bytecode-report-<< parameters.label >>-standard-json.txt" - run: cd test-cases && python3 ../scripts/bytecodecompare/prepare_report.py << parameters.binary_path >> --interface cli --report-file "../bytecode-report-<< parameters.label >>-cli.txt" - store_artifacts: - path: bytecode-report-<< parameters.label >>-json.txt + path: bytecode-report-<< parameters.label >>-standard-json.txt - store_artifacts: path: bytecode-report-<< parameters.label >>-cli.txt - persist_to_workspace: root: . paths: - - bytecode-report-<< parameters.label >>-json.txt - - bytecode-report-<< parameters.label >>-cli.txt + - bytecode-report-<< parameters.label >>-*.txt - matrix_notify_failure_unless_pr install_python3: @@ -1553,13 +1552,13 @@ jobs: environment: REPORT_FILES: | bytecode-report-emscripten.txt - bytecode-report-ubuntu2004-static-json.txt + bytecode-report-ubuntu2004-static-standard-json.txt bytecode-report-ubuntu2004-static-cli.txt - bytecode-report-ubuntu-json.txt + bytecode-report-ubuntu-standard-json.txt bytecode-report-ubuntu-cli.txt - bytecode-report-osx-json.txt + bytecode-report-osx-standard-json.txt bytecode-report-osx-cli.txt - bytecode-report-windows-json.txt + bytecode-report-windows-standard-json.txt bytecode-report-windows-cli.txt steps: - attach_workspace: From 3b80aa2ea401ba70f50d9f6be23c74bd280a2191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 15 Jun 2023 14:06:32 +0200 Subject: [PATCH 086/138] Run Standard JSON and CLI bytecode report generation in parallel --- .circleci/config.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0af5e7a9d15..7e568f9d1365 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -80,9 +80,22 @@ commands: type: string steps: - run: mkdir test-cases/ - - run: cd test-cases && python3 ../scripts/isolate_tests.py ../test/ - - run: cd test-cases && python3 ../scripts/bytecodecompare/prepare_report.py << parameters.binary_path >> --interface standard-json --report-file "../bytecode-report-<< parameters.label >>-standard-json.txt" - - run: cd test-cases && python3 ../scripts/bytecodecompare/prepare_report.py << parameters.binary_path >> --interface cli --report-file "../bytecode-report-<< parameters.label >>-cli.txt" + - run: + name: Prepare input files + command: | + cd test-cases/ + python3 ../scripts/isolate_tests.py ../test/ + - run: + name: Generate bytecode report + command: | + cd test-cases/ + interface=$(echo -e "standard-json\ncli" | circleci tests split) + echo "Selected interface: ${interface}" + + python3 ../scripts/bytecodecompare/prepare_report.py \ + << parameters.binary_path >> \ + --interface "$interface" \ + --report-file "../bytecode-report-<< parameters.label >>-${interface}.txt" - store_artifacts: path: bytecode-report-<< parameters.label >>-standard-json.txt - store_artifacts: @@ -1476,6 +1489,7 @@ jobs: TERM: xterm MAKEFLAGS: -j 2 LC_ALL: C + parallelism: 2 # For prepare_bytecode_report steps: - checkout - attach_workspace: @@ -1490,6 +1504,7 @@ jobs: TERM: xterm MAKEFLAGS: -j 2 LC_ALL: C + parallelism: 2 # For prepare_bytecode_report steps: - checkout - attach_workspace: @@ -1504,6 +1519,7 @@ jobs: TERM: xterm MAKEFLAGS: -j 5 LC_ALL: C + parallelism: 2 # For prepare_bytecode_report steps: - checkout - attach_workspace: @@ -1516,6 +1532,7 @@ jobs: <<: *base_win environment: LC_ALL: C + parallelism: 2 # For prepare_bytecode_report steps: # NOTE: For bytecode generation we need the input files to be byte-for-byte identical on all # platforms so line ending conversions must absolutely be disabled. From 826fd90dcf51a8b89dda5362dd686159d0bd6a55 Mon Sep 17 00:00:00 2001 From: Pawel Gebal Date: Tue, 20 Jun 2023 19:38:30 +0200 Subject: [PATCH 087/138] Fix error in SMTChecker: Use rich indentifier instead of external identifier to ecnode member access to functions --- Changelog.md | 1 + libsolidity/formal/SMTEncoder.cpp | 6 +++++- .../functions/functions_library_internal.sol | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/libsolidity/smtCheckerTests/functions/functions_library_internal.sol diff --git a/Changelog.md b/Changelog.md index 7456a8a46e71..69bd02624e3f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -20,6 +20,7 @@ Bugfixes: * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. + * SMTChecker: Fix internal error caused by using external identifier to encode member access to functions that take an internal function as a parameter. * Standard JSON Interface: Fix an incomplete AST being returned when analysis is interrupted by certain kinds of fatal errors. * Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation. * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. diff --git a/libsolidity/formal/SMTEncoder.cpp b/libsolidity/formal/SMTEncoder.cpp index 818efac5cbb1..a328a7781a22 100644 --- a/libsolidity/formal/SMTEncoder.cpp +++ b/libsolidity/formal/SMTEncoder.cpp @@ -33,6 +33,7 @@ #include #include +#include #include @@ -1358,7 +1359,10 @@ bool SMTEncoder::visit(MemberAccess const& _memberAccess) { auto const* functionType = dynamic_cast(_memberAccess.annotation().type); if (functionType && functionType->hasDeclaration()) - defineExpr(_memberAccess, functionType->externalIdentifier()); + defineExpr( + _memberAccess, + util::selectorFromSignatureU32(functionType->richIdentifier()) + ); return true; } diff --git a/test/libsolidity/smtCheckerTests/functions/functions_library_internal.sol b/test/libsolidity/smtCheckerTests/functions/functions_library_internal.sol new file mode 100644 index 000000000000..405c3f71507e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/functions/functions_library_internal.sol @@ -0,0 +1,14 @@ +library L { + function value(function()internal a, uint256 b) internal {} +} +contract C { + using L for function()internal; + + function f() public { + function()internal x; + x.value(42); + } +} +// ==== +// SMTEngine: all +// ---- From 10670d62864791dff542025c610f027f9ca7c07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 19 Jun 2023 11:28:40 +0200 Subject: [PATCH 088/138] prepare_report: Replace hard-coded optimize setting with selectable presets --- scripts/bytecodecompare/prepare_report.js | 174 ++++++++++-------- scripts/bytecodecompare/prepare_report.py | 58 +++++- .../test_bytecodecompare_prepare_report.py | 14 +- 3 files changed, 152 insertions(+), 94 deletions(-) diff --git a/scripts/bytecodecompare/prepare_report.js b/scripts/bytecodecompare/prepare_report.js index 36acfbb35853..8c714679beff 100755 --- a/scripts/bytecodecompare/prepare_report.js +++ b/scripts/bytecodecompare/prepare_report.js @@ -4,6 +4,10 @@ const fs = require('fs') const compiler = require('solc') +SETTINGS_PRESETS = { + 'legacy-optimize': {optimize: true}, + 'legacy-no-optimize': {optimize: false}, +} function loadSource(sourceFileName, stripSMTPragmas) { @@ -23,96 +27,112 @@ function cleanString(string) return (string !== '' ? string : undefined) } - +let inputFiles = [] let stripSMTPragmas = false -let firstFileArgumentIndex = 2 +let presets = [] -if (process.argv.length >= 3 && process.argv[2] === '--strip-smt-pragmas') +for (let i = 2; i < process.argv.length; ++i) { - stripSMTPragmas = true - firstFileArgumentIndex = 3 -} - -for (const optimize of [false, true]) -{ - for (const filename of process.argv.slice(firstFileArgumentIndex)) + if (process.argv[i] === '--strip-smt-pragmas') + stripSMTPragmas = true + else if (process.argv[i] === '--preset') { - if (filename !== undefined) - { - let input = { - language: 'Solidity', - sources: { - [filename]: {content: loadSource(filename, stripSMTPragmas)} - }, - settings: { - optimizer: {enabled: optimize}, - outputSelection: {'*': {'*': ['evm.bytecode.object', 'metadata']}} - } - } - if (!stripSMTPragmas) - input['settings']['modelChecker'] = {engine: 'none'} + if (i + 1 === process.argv.length) + throw Error("Option --preset was used, but no preset name given.") - let serializedOutput - let result - const serializedInput = JSON.stringify(input) + presets.push(process.argv[i + 1]) + ++i; + } + else + inputFiles.push(process.argv[i]) +} - let internalCompilerError = false - try - { - serializedOutput = compiler.compile(serializedInput) - } - catch (exception) - { - internalCompilerError = true - } +if (presets.length === 0) + presets = ['legacy-no-optimize', 'legacy-optimize'] - if (!internalCompilerError) - { - result = JSON.parse(serializedOutput) - - if ('errors' in result) - for (const error of result['errors']) - // JSON interface still returns contract metadata in case of an internal compiler error while - // CLI interface does not. To make reports comparable we must force this case to be detected as - // an error in both cases. - if (['UnimplementedFeatureError', 'CompilerError', 'CodeGenerationError'].includes(error['type'])) - { - internalCompilerError = true - break - } - } +for (const preset of presets) + if (!(preset in SETTINGS_PRESETS)) + throw Error(`Invalid preset name: ${preset}.`) - if ( - internalCompilerError || - !('contracts' in result) || - Object.keys(result['contracts']).length === 0 || - Object.keys(result['contracts']).every(file => Object.keys(result['contracts'][file]).length === 0) - ) - // NOTE: do not exit here because this may be run on source which cannot be compiled - console.log(filename + ': ') - else - for (const contractFile in result['contracts']) - for (const contractName in result['contracts'][contractFile]) - { - const contractResults = result['contracts'][contractFile][contractName] +for (const preset of presets) +{ + settings = SETTINGS_PRESETS[preset] - let bytecode = '' - let metadata = '' + for (const filename of inputFiles) + { + let input = { + language: 'Solidity', + sources: { + [filename]: {content: loadSource(filename, stripSMTPragmas)} + }, + settings: { + optimizer: {enabled: settings.optimize}, + outputSelection: {'*': {'*': ['evm.bytecode.object', 'metadata']}} + } + } + if (!stripSMTPragmas) + input['settings']['modelChecker'] = {engine: 'none'} - if ( - 'evm' in contractResults && - 'bytecode' in contractResults['evm'] && - 'object' in contractResults['evm']['bytecode'] && - cleanString(contractResults.evm.bytecode.object) !== undefined - ) - bytecode = cleanString(contractResults.evm.bytecode.object) + let serializedOutput + let result + const serializedInput = JSON.stringify(input) - if ('metadata' in contractResults && cleanString(contractResults.metadata) !== undefined) - metadata = contractResults.metadata + let internalCompilerError = false + try + { + serializedOutput = compiler.compile(serializedInput) + } + catch (exception) + { + internalCompilerError = true + } - console.log(filename + ':' + contractName + ' ' + bytecode) - console.log(filename + ':' + contractName + ' ' + metadata) + if (!internalCompilerError) + { + result = JSON.parse(serializedOutput) + + if ('errors' in result) + for (const error of result['errors']) + // JSON interface still returns contract metadata in case of an internal compiler error while + // CLI interface does not. To make reports comparable we must force this case to be detected as + // an error in both cases. + if (['UnimplementedFeatureError', 'CompilerError', 'CodeGenerationError'].includes(error['type'])) + { + internalCompilerError = true + break } } + + if ( + internalCompilerError || + !('contracts' in result) || + Object.keys(result['contracts']).length === 0 || + Object.keys(result['contracts']).every(file => Object.keys(result['contracts'][file]).length === 0) + ) + // NOTE: do not exit here because this may be run on source which cannot be compiled + console.log(filename + ': ') + else + for (const contractFile in result['contracts']) + for (const contractName in result['contracts'][contractFile]) + { + const contractResults = result['contracts'][contractFile][contractName] + + let bytecode = '' + let metadata = '' + + if ( + 'evm' in contractResults && + 'bytecode' in contractResults['evm'] && + 'object' in contractResults['evm']['bytecode'] && + cleanString(contractResults.evm.bytecode.object) !== undefined + ) + bytecode = cleanString(contractResults.evm.bytecode.object) + + if ('metadata' in contractResults && cleanString(contractResults.metadata) !== undefined) + metadata = contractResults.metadata + + console.log(filename + ':' + contractName + ' ' + bytecode) + console.log(filename + ':' + contractName + ' ' + metadata) + } } } diff --git a/scripts/bytecodecompare/prepare_report.py b/scripts/bytecodecompare/prepare_report.py index 90901e8b79ed..6ec80e753ab5 100755 --- a/scripts/bytecodecompare/prepare_report.py +++ b/scripts/bytecodecompare/prepare_report.py @@ -26,12 +26,29 @@ class CompilerInterface(Enum): STANDARD_JSON = 'standard-json' +class SettingsPreset(Enum): + LEGACY_OPTIMIZE = 'legacy-optimize' + LEGACY_NO_OPTIMIZE = 'legacy-no-optimize' + + class SMTUse(Enum): PRESERVE = 'preserve' DISABLE = 'disable' STRIP_PRAGMAS = 'strip-pragmas' +@dataclass(frozen=True) +class CompilerSettings: + optimize: bool + + @staticmethod + def from_preset(preset: SettingsPreset): + return { + SettingsPreset.LEGACY_OPTIMIZE: CompilerSettings(optimize=True), + SettingsPreset.LEGACY_NO_OPTIMIZE: CompilerSettings(optimize=False), + }[preset] + + @dataclass(frozen=True) class ContractReport: contract_name: str @@ -190,13 +207,15 @@ def parse_cli_output(source_file_name: Path, cli_output: str) -> FileReport: def prepare_compiler_input( compiler_path: Path, source_file_name: Path, - optimize: bool, force_no_optimize_yul: bool, interface: CompilerInterface, + preset: SettingsPreset, smt_use: SMTUse, metadata_option_supported: bool, ) -> Tuple[List[str], str]: + settings = CompilerSettings.from_preset(preset) + if interface == CompilerInterface.STANDARD_JSON: json_input: dict = { 'language': 'Solidity', @@ -204,7 +223,7 @@ def prepare_compiler_input( str(source_file_name): {'content': load_source(source_file_name, smt_use)} }, 'settings': { - 'optimizer': {'enabled': optimize}, + 'optimizer': {'enabled': settings.optimize}, 'outputSelection': {'*': {'*': ['evm.bytecode.object', 'metadata']}}, } } @@ -220,7 +239,7 @@ def prepare_compiler_input( compiler_options = [str(source_file_name), '--bin'] if metadata_option_supported: compiler_options.append('--metadata') - if optimize: + if settings.optimize: compiler_options.append('--optimize') elif force_no_optimize_yul: compiler_options.append('--no-optimize-yul') @@ -259,9 +278,9 @@ def detect_metadata_cli_option_support(compiler_path: Path): def run_compiler( compiler_path: Path, source_file_name: Path, - optimize: bool, force_no_optimize_yul: bool, interface: CompilerInterface, + preset: SettingsPreset, smt_use: SMTUse, metadata_option_supported: bool, tmp_dir: Path, @@ -272,9 +291,9 @@ def run_compiler( (command_line, compiler_input) = prepare_compiler_input( compiler_path, Path(source_file_name.name), - optimize, force_no_optimize_yul, interface, + preset, smt_use, metadata_option_supported, ) @@ -295,9 +314,9 @@ def run_compiler( (command_line, compiler_input) = prepare_compiler_input( compiler_path.absolute(), Path(source_file_name.name), - optimize, force_no_optimize_yul, interface, + preset, smt_use, metadata_option_supported, ) @@ -324,6 +343,7 @@ def generate_report( source_file_names: List[str], compiler_path: Path, interface: CompilerInterface, + presets: List[SettingsPreset], smt_use: SMTUse, force_no_optimize_yul: bool, report_file_path: Path, @@ -335,16 +355,16 @@ def generate_report( try: with open(report_file_path, mode='w', encoding='utf8', newline='\n') as report_file: - for optimize in [False, True]: + for preset in presets: with TemporaryDirectory(prefix='prepare_report-') as tmp_dir: for source_file_name in sorted(source_file_names): try: report = run_compiler( compiler_path, Path(source_file_name), - optimize, force_no_optimize_yul, interface, + preset, smt_use, metadata_option_supported, Path(tmp_dir), @@ -358,7 +378,7 @@ def generate_report( except subprocess.CalledProcessError as exception: print( f"\n\nInterrupted by an exception while processing file " - f"'{source_file_name}' with optimize={optimize}\n\n" + f"'{source_file_name}' with preset={preset}\n\n" f"COMPILER STDOUT:\n{exception.stdout}\n" f"COMPILER STDERR:\n{exception.stderr}\n", file=sys.stderr @@ -367,7 +387,7 @@ def generate_report( except: print( f"\n\nInterrupted by an exception while processing file " - f"'{source_file_name}' with optimize={optimize}\n", + f"'{source_file_name}' with preset={preset}\n\n", file=sys.stderr ) raise @@ -390,6 +410,15 @@ def commandline_parser() -> ArgumentParser: choices=[c.value for c in CompilerInterface], help="Compiler interface to use.", ) + parser.add_argument( + '--preset', + dest='presets', + default=None, + nargs='+', + action='append', + choices=[p.value for p in SettingsPreset], + help="Predefined set of settings to pass to the compiler. More than one can be selected.", + ) parser.add_argument( '--smt-use', dest='smt_use', @@ -418,10 +447,19 @@ def commandline_parser() -> ArgumentParser: if __name__ == "__main__": options = commandline_parser().parse_args() + + if options.presets is None: + # NOTE: Can't put it in add_argument()'s default because then it would be always present. + # See https://github.com/python/cpython/issues/60603 + presets = [[SettingsPreset.LEGACY_NO_OPTIMIZE.value, SettingsPreset.LEGACY_OPTIMIZE.value]] + else: + presets = options.presets + generate_report( glob("*.sol"), Path(options.compiler_path), CompilerInterface(options.interface), + [SettingsPreset(p) for preset_group in presets for p in preset_group], SMTUse(options.smt_use), options.force_no_optimize_yul, Path(options.report_file), diff --git a/test/scripts/test_bytecodecompare_prepare_report.py b/test/scripts/test_bytecodecompare_prepare_report.py index e0a8ca76a6d9..16d73ee39acd 100644 --- a/test/scripts/test_bytecodecompare_prepare_report.py +++ b/test/scripts/test_bytecodecompare_prepare_report.py @@ -9,7 +9,7 @@ # NOTE: This test file file only works with scripts/ added to PYTHONPATH so pylint can't find the imports # pragma pylint: disable=import-error -from bytecodecompare.prepare_report import CompilerInterface, FileReport, ContractReport, SMTUse, Statistics +from bytecodecompare.prepare_report import CompilerInterface, FileReport, ContractReport, SettingsPreset, SMTUse, Statistics from bytecodecompare.prepare_report import load_source, parse_cli_output, parse_standard_json_output, prepare_compiler_input # pragma pylint: enable=import-error @@ -224,7 +224,7 @@ def test_prepare_compiler_input_should_work_with_standard_json_interface(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_SMOKE_TEST_SOL_PATH, - optimize=True, + preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=False, interface=CompilerInterface.STANDARD_JSON, smt_use=SMTUse.DISABLE, @@ -238,7 +238,7 @@ def test_prepare_compiler_input_should_work_with_cli_interface(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_SMOKE_TEST_SOL_PATH, - optimize=True, + preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=False, interface=CompilerInterface.CLI, smt_use=SMTUse.DISABLE, @@ -273,7 +273,7 @@ def test_prepare_compiler_input_for_json_preserves_newlines(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_CONTRACT_WITH_MIXED_NEWLINES_SOL_PATH, - optimize=True, + preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=False, interface=CompilerInterface.STANDARD_JSON, smt_use=SMTUse.DISABLE, @@ -287,7 +287,7 @@ def test_prepare_compiler_input_for_cli_preserves_newlines(self): (_command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_CONTRACT_WITH_MIXED_NEWLINES_SOL_PATH, - optimize=True, + preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=True, interface=CompilerInterface.CLI, smt_use=SMTUse.DISABLE, @@ -300,7 +300,7 @@ def test_prepare_compiler_input_for_cli_should_handle_force_no_optimize_yul_flag (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_SMOKE_TEST_SOL_PATH, - optimize=False, + preset=SettingsPreset.LEGACY_NO_OPTIMIZE, force_no_optimize_yul=True, interface=CompilerInterface.CLI, smt_use=SMTUse.DISABLE, @@ -317,7 +317,7 @@ def test_prepare_compiler_input_for_cli_should_not_use_metadata_option_if_not_su (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_SMOKE_TEST_SOL_PATH, - optimize=True, + preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=False, interface=CompilerInterface.CLI, smt_use=SMTUse.PRESERVE, From ea1327707b12c906103a0e037da312052f23e992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 22 Jun 2023 19:00:12 +0200 Subject: [PATCH 089/138] CI: Don't use requires_nothing for jobs that explicitly state what they require --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7e568f9d1365..c8fcac73ed91 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1743,27 +1743,27 @@ workflows: # Bytecode comparison: - b_bytecode_ubu_static: - <<: *requires_nothing + <<: *on_all_tags_and_branches requires: - b_ubu_static - b_bytecode_ubu: - <<: *requires_nothing + <<: *on_all_tags_and_branches requires: - b_ubu - b_bytecode_win: - <<: *requires_nothing + <<: *on_all_tags_and_branches requires: - b_win - b_bytecode_osx: - <<: *requires_nothing + <<: *on_all_tags_and_branches requires: - b_osx - b_bytecode_ems: - <<: *requires_nothing + <<: *on_all_tags_and_branches requires: - b_ems - t_bytecode_compare: - <<: *requires_nothing + <<: *on_all_tags_and_branches requires: - b_bytecode_ubu_static - b_bytecode_ubu From 69ffcfc24237f9dda59d426780808c0b2c9939a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 19 Jun 2023 14:19:06 +0200 Subject: [PATCH 090/138] CI: Move bytecode report comparison logic to a script --- .circleci/compare_bytecode_reports.sh | 57 +++++++++++++++++++++++++++ .circleci/config.yml | 24 +---------- 2 files changed, 59 insertions(+), 22 deletions(-) create mode 100755 .circleci/compare_bytecode_reports.sh diff --git a/.circleci/compare_bytecode_reports.sh b/.circleci/compare_bytecode_reports.sh new file mode 100755 index 000000000000..adff761b62e0 --- /dev/null +++ b/.circleci/compare_bytecode_reports.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -euo pipefail + +#------------------------------------------------------------------------------ +# Compares bytecode reports generated by prepare_report.py/.js. +# +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2023 solidity contributors. +#------------------------------------------------------------------------------ + +no_cli_platforms=( + emscripten +) +native_platforms=( + ubuntu2004-static + ubuntu + osx + windows +) +interfaces=( + cli + standard-json +) + +report_files=() +for platform in "${no_cli_platforms[@]}"; do + report_files+=("bytecode-report-${platform}.txt") +done +for platform in "${native_platforms[@]}"; do + for interface in "${interfaces[@]}"; do + report_files+=("bytecode-report-${platform}-${interface}.txt") + done +done + +echo "Reports to compare:" +printf -- "- %s\n" "${report_files[@]}" + +if ! diff --brief --report-identical-files --from-file "${report_files[@]}"; then + diff --unified=0 --report-identical-files --from-file "${report_files[@]}" | head --lines 50 + zip "all-bytecode-reports.zip" "${report_files[@]}" + exit 1 +fi diff --git a/.circleci/config.yml b/.circleci/config.yml index c8fcac73ed91..eb2709a63849 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1566,31 +1566,11 @@ jobs: t_bytecode_compare: <<: *base_ubuntu2204_small - environment: - REPORT_FILES: | - bytecode-report-emscripten.txt - bytecode-report-ubuntu2004-static-standard-json.txt - bytecode-report-ubuntu2004-static-cli.txt - bytecode-report-ubuntu-standard-json.txt - bytecode-report-ubuntu-cli.txt - bytecode-report-osx-standard-json.txt - bytecode-report-osx-cli.txt - bytecode-report-windows-standard-json.txt - bytecode-report-windows-cli.txt steps: + - checkout - attach_workspace: at: . - - run: - name: Compare reports - command: diff --brief --report-identical-files --from-file $REPORT_FILES - - run: - name: Print diff - when: on_fail - command: diff --unified=0 --report-identical-files --from-file $REPORT_FILES | head --lines 50 - - run: - name: Bundle reports into a single package - when: on_fail - command: zip all-bytecode-reports.zip $REPORT_FILES + - run: .circleci/compare_bytecode_reports.sh - store_artifacts: # NOTE: store_artifacts does not support the 'when' attribute. # Fortunately when the artifact does not exist it just says "No artifact files found" and ignores it. From 45c2ffcd55cb1cca8e570d0432eb4041082e7464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 23 Jun 2023 10:24:15 +0200 Subject: [PATCH 091/138] CI: Merge prepare_bytecode_report and storebytecode.sh script into a new script and use it for all platforms in CI --- .circleci/config.yml | 70 ++++++++--------------- .circleci/parallel_bytecode_report.sh | 73 ++++++++++++++++++++++++ scripts/bytecodecompare/storebytecode.sh | 73 ------------------------ 3 files changed, 98 insertions(+), 118 deletions(-) create mode 100755 .circleci/parallel_bytecode_report.sh delete mode 100755 scripts/bytecodecompare/storebytecode.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index eb2709a63849..b618d1574827 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -76,34 +76,31 @@ commands: parameters: label: type: string + binary_type: + type: enum + enum: + - solcjs + - native binary_path: type: string steps: - - run: mkdir test-cases/ - - run: - name: Prepare input files - command: | - cd test-cases/ - python3 ../scripts/isolate_tests.py ../test/ - run: - name: Generate bytecode report + name: Generate bytecode reports for the selected preset command: | - cd test-cases/ - interface=$(echo -e "standard-json\ncli" | circleci tests split) - echo "Selected interface: ${interface}" - - python3 ../scripts/bytecodecompare/prepare_report.py \ - << parameters.binary_path >> \ - --interface "$interface" \ - --report-file "../bytecode-report-<< parameters.label >>-${interface}.txt" + .circleci/parallel_bytecode_report.sh \ + "<< parameters.label >>" \ + "<< parameters.binary_type >>" \ + "${PWD}/<< parameters.binary_path >>" - store_artifacts: path: bytecode-report-<< parameters.label >>-standard-json.txt - store_artifacts: path: bytecode-report-<< parameters.label >>-cli.txt + - store_artifacts: + path: bytecode-report-<< parameters.label >>.txt - persist_to_workspace: root: . paths: - - bytecode-report-<< parameters.label >>-*.txt + - bytecode-report-<< parameters.label >>*.txt - matrix_notify_failure_unless_pr install_python3: @@ -1485,10 +1482,6 @@ jobs: # It can be safely removed once we move both to the same Ubuntu version. b_bytecode_ubu_static: <<: *base_ubuntu2004_small - environment: - TERM: xterm - MAKEFLAGS: -j 2 - LC_ALL: C parallelism: 2 # For prepare_bytecode_report steps: - checkout @@ -1496,14 +1489,11 @@ jobs: at: build - prepare_bytecode_report: label: "ubuntu2004-static" - binary_path: "../build/solc/solc-static-linux" + binary_type: native + binary_path: "build/solc/solc-static-linux" b_bytecode_ubu: <<: *base_ubuntu2204_small - environment: - TERM: xterm - MAKEFLAGS: -j 2 - LC_ALL: C parallelism: 2 # For prepare_bytecode_report steps: - checkout @@ -1511,14 +1501,11 @@ jobs: at: build - prepare_bytecode_report: label: "ubuntu" - binary_path: "../build/solc/solc" + binary_type: native + binary_path: "build/solc/solc" b_bytecode_osx: <<: *base_osx - environment: - TERM: xterm - MAKEFLAGS: -j 5 - LC_ALL: C parallelism: 2 # For prepare_bytecode_report steps: - checkout @@ -1526,12 +1513,11 @@ jobs: at: . - prepare_bytecode_report: label: "osx" - binary_path: "../build/solc/solc" + binary_type: native + binary_path: "build/solc/solc" b_bytecode_win: <<: *base_win - environment: - LC_ALL: C parallelism: 2 # For prepare_bytecode_report steps: # NOTE: For bytecode generation we need the input files to be byte-for-byte identical on all @@ -1544,25 +1530,19 @@ jobs: at: build - prepare_bytecode_report: label: "windows" - binary_path: "../build/solc/Release/solc.exe" + binary_type: native + binary_path: "build/solc/Release/solc.exe" b_bytecode_ems: <<: *base_node_small - environment: - SOLC_EMSCRIPTEN: "On" - LC_ALL: C steps: - checkout - attach_workspace: at: emscripten_build/libsolc - - run: scripts/bytecodecompare/storebytecode.sh && mv -v report.txt bytecode-report-emscripten.txt - - store_artifacts: - path: bytecode-report-emscripten.txt - - persist_to_workspace: - root: . - paths: - - bytecode-report-emscripten.txt - - matrix_notify_failure_unless_pr + - prepare_bytecode_report: + label: "emscripten" + binary_type: solcjs + binary_path: "emscripten_build/libsolc/soljson.js" t_bytecode_compare: <<: *base_ubuntu2204_small diff --git a/.circleci/parallel_bytecode_report.sh b/.circleci/parallel_bytecode_report.sh new file mode 100755 index 000000000000..fd435bf61d2c --- /dev/null +++ b/.circleci/parallel_bytecode_report.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +set -euo pipefail + +#------------------------------------------------------------------------------ +# Splits all test source code into multiple files, generates bytecode and metadata +# for each file and combines it into a single report.txt file. +# +# The script is meant to be executed in CI on all supported platforms. All generated +# reports must be identical for a given compiler version. +# +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2023 solidity contributors. +#------------------------------------------------------------------------------ + +(( $# == 3 )) || { >&2 echo "Wrong number of arguments."; exit 1; } +label="$1" +binary_type="$2" +binary_path="$3" # This path must be absolute + +[[ $binary_type == native || $binary_type == solcjs ]] || { >&2 echo "Invalid binary type: ${binary_type}"; exit 1; } + +# NOTE: Locale affects the order of the globbed files. +export LC_ALL=C + +mkdir test-cases/ +cd test-cases/ + +echo "Preparing input files" +python3 ../scripts/isolate_tests.py ../test/ + +if [[ $binary_type == native ]]; then + interface=$(echo -e "standard-json\ncli" | circleci tests split) + echo "Selected interface: ${interface}" + + echo "Generating bytecode reports" + python3 ../scripts/bytecodecompare/prepare_report.py \ + "$binary_path" \ + --interface "$interface" \ + --report-file "../bytecode-report-${label}-${interface}.txt" +else + echo "Installing solc-js" + git clone --depth 1 https://github.com/ethereum/solc-js.git solc-js + cp "$binary_path" solc-js/soljson.js + + cd solc-js/ + npm install + npm run build + + cd .. + npm install ./solc-js/dist + + cp ../scripts/bytecodecompare/prepare_report.js . + + echo "Generating bytecode reports" + # shellcheck disable=SC2035 + ./prepare_report.js \ + *.sol > "../bytecode-report-${label}.txt" +fi diff --git a/scripts/bytecodecompare/storebytecode.sh b/scripts/bytecodecompare/storebytecode.sh deleted file mode 100755 index beeb79d0932b..000000000000 --- a/scripts/bytecodecompare/storebytecode.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash - -#------------------------------------------------------------------------------ -# Script used for cross-platform comparison of the bytecode generated by the compiler. -# Splits all test source code into multiple files, generates bytecode and metadata -# for each file and combines it into a single report.txt file. -# -# The script is meant to be executed in CI on all supported platforms. All generated -# reports must be identical for a given compiler version. -# -# ------------------------------------------------------------------------------ -# This file is part of solidity. -# -# solidity is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# solidity is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with solidity. If not, see -# -# (c) 2017 solidity contributors. -#------------------------------------------------------------------------------ - -set -e - -REPO_ROOT="$(dirname "$0")"/../.. -cd "$REPO_ROOT" -REPO_ROOT=$(pwd) # make it absolute - -BUILD_DIR="${1:-${REPO_ROOT}/build}" - -# Set locale to C to prevent it from affecting glob sort order. -export LC_ALL=C - -echo "Compiling all test contracts into bytecode..." -TMPDIR=$(mktemp -d) -( - cd "$TMPDIR" - - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ - - if [[ "$SOLC_EMSCRIPTEN" = "On" ]] - then - echo "Installing solc-js..." - # npm install solc - git clone --depth 1 https://github.com/ethereum/solc-js.git solc-js - cp "$REPO_ROOT/emscripten_build/libsolc/soljson.js" solc-js/ - pushd solc-js/ - npm install - npm run build - popd - - cp "$REPO_ROOT/scripts/bytecodecompare/prepare_report.js" . - npm install ./solc-js/dist - - echo "Running the compiler..." - # shellcheck disable=SC2035 - ./prepare_report.js *.sol > report.txt - echo "Finished running the compiler." - else - "$REPO_ROOT/scripts/bytecodecompare/prepare_report.py" "$BUILD_DIR/solc/solc" - fi - - cp report.txt "$REPO_ROOT" -) -rm -rf "$TMPDIR" -echo "Storebytecode finished." From 92816eb6c508926ec0b5fd9769283ab42ee722ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 23 Jun 2023 10:27:21 +0200 Subject: [PATCH 092/138] CI: Generate optimized and unoptimized bytecode reports in parallel --- .circleci/compare_bytecode_reports.sh | 32 ++++++++------- .circleci/config.yml | 59 ++++++++++++++++++++++++--- .circleci/parallel_bytecode_report.sh | 9 ++-- 3 files changed, 76 insertions(+), 24 deletions(-) diff --git a/.circleci/compare_bytecode_reports.sh b/.circleci/compare_bytecode_reports.sh index adff761b62e0..7b62656bf24e 100755 --- a/.circleci/compare_bytecode_reports.sh +++ b/.circleci/compare_bytecode_reports.sh @@ -37,21 +37,23 @@ interfaces=( standard-json ) -report_files=() -for platform in "${no_cli_platforms[@]}"; do - report_files+=("bytecode-report-${platform}.txt") -done -for platform in "${native_platforms[@]}"; do - for interface in "${interfaces[@]}"; do - report_files+=("bytecode-report-${platform}-${interface}.txt") +for preset in "$@"; do + report_files=() + for platform in "${no_cli_platforms[@]}"; do + report_files+=("bytecode-report-${platform}-${preset}.txt") + done + for platform in "${native_platforms[@]}"; do + for interface in "${interfaces[@]}"; do + report_files+=("bytecode-report-${platform}-${interface}-${preset}.txt") + done done -done -echo "Reports to compare:" -printf -- "- %s\n" "${report_files[@]}" + echo "Reports to compare:" + printf -- "- %s\n" "${report_files[@]}" -if ! diff --brief --report-identical-files --from-file "${report_files[@]}"; then - diff --unified=0 --report-identical-files --from-file "${report_files[@]}" | head --lines 50 - zip "all-bytecode-reports.zip" "${report_files[@]}" - exit 1 -fi + if ! diff --brief --report-identical-files --from-file "${report_files[@]}"; then + diff --unified=0 --report-identical-files --from-file "${report_files[@]}" | head --lines 50 + zip "bytecode-reports-${preset}.zip" "${report_files[@]}" + exit 1 + fi +done diff --git a/.circleci/config.yml b/.circleci/config.yml index b618d1574827..bbf52f9747c6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -83,6 +83,8 @@ commands: - native binary_path: type: string + preset: + type: string steps: - run: name: Generate bytecode reports for the selected preset @@ -90,13 +92,14 @@ commands: .circleci/parallel_bytecode_report.sh \ "<< parameters.label >>" \ "<< parameters.binary_type >>" \ - "${PWD}/<< parameters.binary_path >>" + "${PWD}/<< parameters.binary_path >>" \ + "<< parameters.preset >>" - store_artifacts: - path: bytecode-report-<< parameters.label >>-standard-json.txt + path: bytecode-report-<< parameters.label >>-standard-json-<< parameters.preset >>.txt - store_artifacts: - path: bytecode-report-<< parameters.label >>-cli.txt + path: bytecode-report-<< parameters.label >>-cli-<< parameters.preset >>.txt - store_artifacts: - path: bytecode-report-<< parameters.label >>.txt + path: bytecode-report-<< parameters.label >>-<< parameters.preset >>.txt - persist_to_workspace: root: . paths: @@ -217,6 +220,21 @@ defaults: name: docs pragma version check command: ./scripts/docs_version_pragma_check.sh + # -------------------------------------------------------------------------- + # Matrix templates + + - bytecode_compare_env_presets: &bytecode_compare_env_presets + PRESETS: + legacy-optimize + legacy-no-optimize + + - bytecode_compare_preset_matrix: &bytecode_compare_preset_matrix + parameters: + preset: + # NOTE: Keep in sync with preset list in bytecode_compare_env_presets + - legacy-optimize + - legacy-no-optimize + # -------------------------------------------------------------------------- # Artifacts Templates @@ -1481,6 +1499,9 @@ jobs: # are currently built on different Ubuntu base images. # It can be safely removed once we move both to the same Ubuntu version. b_bytecode_ubu_static: + parameters: + preset: + type: string <<: *base_ubuntu2004_small parallelism: 2 # For prepare_bytecode_report steps: @@ -1491,8 +1512,12 @@ jobs: label: "ubuntu2004-static" binary_type: native binary_path: "build/solc/solc-static-linux" + preset: "<< parameters.preset >>" b_bytecode_ubu: + parameters: + preset: + type: string <<: *base_ubuntu2204_small parallelism: 2 # For prepare_bytecode_report steps: @@ -1503,8 +1528,12 @@ jobs: label: "ubuntu" binary_type: native binary_path: "build/solc/solc" + preset: "<< parameters.preset >>" b_bytecode_osx: + parameters: + preset: + type: string <<: *base_osx parallelism: 2 # For prepare_bytecode_report steps: @@ -1515,8 +1544,12 @@ jobs: label: "osx" binary_type: native binary_path: "build/solc/solc" + preset: "<< parameters.preset >>" b_bytecode_win: + parameters: + preset: + type: string <<: *base_win parallelism: 2 # For prepare_bytecode_report steps: @@ -1532,8 +1565,12 @@ jobs: label: "windows" binary_type: native binary_path: "build/solc/Release/solc.exe" + preset: "<< parameters.preset >>" b_bytecode_ems: + parameters: + preset: + type: string <<: *base_node_small steps: - checkout @@ -1543,18 +1580,23 @@ jobs: label: "emscripten" binary_type: solcjs binary_path: "emscripten_build/libsolc/soljson.js" + preset: "<< parameters.preset >>" t_bytecode_compare: <<: *base_ubuntu2204_small + environment: + <<: *bytecode_compare_env_presets + TERM: xterm + MAKEFLAGS: -j 2 steps: - checkout - attach_workspace: at: . - - run: .circleci/compare_bytecode_reports.sh + - run: .circleci/compare_bytecode_reports.sh $PRESETS - store_artifacts: # NOTE: store_artifacts does not support the 'when' attribute. # Fortunately when the artifact does not exist it just says "No artifact files found" and ignores it. - path: all-bytecode-reports.zip + path: bytecode-reports-*.zip - matrix_notify_failure_unless_pr c_release_binaries: @@ -1704,22 +1746,27 @@ workflows: # Bytecode comparison: - b_bytecode_ubu_static: <<: *on_all_tags_and_branches + matrix: *bytecode_compare_preset_matrix requires: - b_ubu_static - b_bytecode_ubu: <<: *on_all_tags_and_branches + matrix: *bytecode_compare_preset_matrix requires: - b_ubu - b_bytecode_win: <<: *on_all_tags_and_branches + matrix: *bytecode_compare_preset_matrix requires: - b_win - b_bytecode_osx: <<: *on_all_tags_and_branches + matrix: *bytecode_compare_preset_matrix requires: - b_osx - b_bytecode_ems: <<: *on_all_tags_and_branches + matrix: *bytecode_compare_preset_matrix requires: - b_ems - t_bytecode_compare: diff --git a/.circleci/parallel_bytecode_report.sh b/.circleci/parallel_bytecode_report.sh index fd435bf61d2c..208230622107 100755 --- a/.circleci/parallel_bytecode_report.sh +++ b/.circleci/parallel_bytecode_report.sh @@ -27,10 +27,11 @@ set -euo pipefail # (c) 2023 solidity contributors. #------------------------------------------------------------------------------ -(( $# == 3 )) || { >&2 echo "Wrong number of arguments."; exit 1; } +(( $# == 4 )) || { >&2 echo "Wrong number of arguments."; exit 1; } label="$1" binary_type="$2" binary_path="$3" # This path must be absolute +preset="$4" [[ $binary_type == native || $binary_type == solcjs ]] || { >&2 echo "Invalid binary type: ${binary_type}"; exit 1; } @@ -51,7 +52,8 @@ if [[ $binary_type == native ]]; then python3 ../scripts/bytecodecompare/prepare_report.py \ "$binary_path" \ --interface "$interface" \ - --report-file "../bytecode-report-${label}-${interface}.txt" + --preset "$preset" \ + --report-file "../bytecode-report-${label}-${interface}-${preset}.txt" else echo "Installing solc-js" git clone --depth 1 https://github.com/ethereum/solc-js.git solc-js @@ -69,5 +71,6 @@ else echo "Generating bytecode reports" # shellcheck disable=SC2035 ./prepare_report.js \ - *.sol > "../bytecode-report-${label}.txt" + --preset "$preset" \ + *.sol > "../bytecode-report-${label}-${preset}.txt" fi From b70477d7956133b7b1ed529938b092c308ffdce0 Mon Sep 17 00:00:00 2001 From: Alexandre Ferreira Date: Thu, 1 Jun 2023 19:22:21 +0100 Subject: [PATCH 093/138] Change installation documentation for Arch Linux Correct inline code with double backquotes Add more information Add external links to packages; Add a note to inform that packages don't have official support. --- docs/installing-solidity.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/installing-solidity.rst b/docs/installing-solidity.rst index bd954ece053d..9eb0ee76f070 100644 --- a/docs/installing-solidity.rst +++ b/docs/installing-solidity.rst @@ -132,11 +132,13 @@ The nightly version can be installed using these commands: Furthermore, some Linux distributions provide their own packages. These packages are not directly maintained by us but usually kept up-to-date by the respective package maintainers. -For example, Arch Linux has packages for the latest development version: +For example, Arch Linux has packages for the latest development version as AUR packages: `solidity `_ +and `solidity-bin `_. -.. code-block:: bash +.. note:: - pacman -S solidity + Please be aware that `AUR `_ packages + are user-produced content and unofficial packages. Exercise caution when using them. There is also a `snap package `_, however, it is **currently unmaintained**. It is installable in all the `supported Linux distros `_. To From a4777937ed20c2dcbe822523ebef75421aaec309 Mon Sep 17 00:00:00 2001 From: r0qs Date: Mon, 26 Jun 2023 20:08:20 +0200 Subject: [PATCH 094/138] Remove triage workflow in favor of github built-in automation --- .github/workflows/triage.yml | 127 ----------------------------------- 1 file changed, 127 deletions(-) delete mode 100644 .github/workflows/triage.yml diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml deleted file mode 100644 index a20ea57145e2..000000000000 --- a/.github/workflows/triage.yml +++ /dev/null @@ -1,127 +0,0 @@ -name: Add new issues to triage column - -on: - issues: - types: - - opened - -env: - GH_TOKEN: ${{ secrets.PROJECT_BOARD_AUTOMATION }} - ORGANIZATION: ethereum - PROJECT_NUMBER: 27 # Solidity Bug Triaging Board - # See: https://github.com/orgs/ethereum/projects/27/settings/fields/Status - COLUMN_FIELD_NAME: "Status" - TRIAGE_COLUMN_NAME: "To Triage" - DRY_RUN: false - -jobs: - triage_issues: - runs-on: ubuntu-latest - steps: - - name: Retrieve the content of selected field on the project board - run: | - gh api graphql \ - --raw-field organization="$ORGANIZATION" \ - --field project_number="$PROJECT_NUMBER" \ - --raw-field query=' - query($organization: String!, $project_number: Int!) { - organization(login: $organization) { - projectV2(number: $project_number) { - id - fields(first: 20) { - nodes { - ... on ProjectV2Field { - id - name - } - ... on ProjectV2SingleSelectField { - id - name - options { - id - name - } - } - } - } - } - } - }' > single_select_fields.json - echo 'PROJECT_ID='$( - jq \ - '.data.organization.projectV2.id' \ - single_select_fields.json - ) >> $GITHUB_ENV - echo 'COLUMN_FIELD_ID='$( - jq \ - --arg column_field_name "$COLUMN_FIELD_NAME" \ - '.data.organization.projectV2.fields.nodes[] - | select(.name == $column_field_name) - | .id' \ - single_select_fields.json - ) >> $GITHUB_ENV - echo 'TRIAGE_COLUMN_ID='$( - jq --raw-output \ - --arg column_field_name "$COLUMN_FIELD_NAME" \ - --arg triage_column_name "$TRIAGE_COLUMN_NAME" \ - '.data.organization.projectV2.fields.nodes[] - | select(.name == $column_field_name) - | .options[] - | select(.name == $triage_column_name) - | .id' \ - single_select_fields.json - ) >> $GITHUB_ENV - - - name: Add issue#${{ github.event.issue.number }} to project - env: - ISSUE_ID: ${{ github.event.issue.node_id }} - run: | - echo "Adding issue: ${{ github.event.issue.number }} to project ${{ env.PROJECT_NUMBER }}" - if [[ $DRY_RUN == 'false' ]]; then - echo 'ITEM_ID='$( - gh api graphql \ - --jq '.data.addProjectV2ItemById.item.id' \ - --raw-field project_id="$PROJECT_ID" \ - --raw-field issue_id="$ISSUE_ID" \ - --raw-field query=' - mutation($project_id: ID!, $issue_id: ID!) { - addProjectV2ItemById(input: {projectId: $project_id, contentId: $issue_id}) { - item { - id - } - } - }' - ) >> $GITHUB_ENV - fi - - - name: Move issue#${{ github.event.issue.number }} to Triage column - run: | - echo "Moving issue: ${{ github.event.issue.number }} to Triage column in project ${{ env.PROJECT_NUMBER }}" - if [[ $DRY_RUN == 'false' ]]; then - gh api graphql \ - --silent \ - --raw-field project_id="$PROJECT_ID" \ - --raw-field item_id="$ITEM_ID" \ - --raw-field column_field_id="$COLUMN_FIELD_ID" \ - --raw-field column_value_id="$TRIAGE_COLUMN_ID" \ - --raw-field query=' - mutation ( - $project_id: ID! - $item_id: ID! - $column_field_id: ID! - $column_value_id: String! - ) { - updateProjectV2ItemFieldValue(input: { - projectId: $project_id - itemId: $item_id - fieldId: $column_field_id - value: { - singleSelectOptionId: $column_value_id - } - }) { - projectV2Item { - id - } - } - }' - fi From 87d0c849608d50ed9f6eb5bcfac9353d8d5e9eef Mon Sep 17 00:00:00 2001 From: Bhargava Shastry Date: Mon, 15 May 2023 16:54:06 +0200 Subject: [PATCH 095/138] Stack optimizer fuzzer: Detect stack-too-deep during optimization Co-authored-by: r0qs --- test/libyul/YulOptimizerTestCommon.cpp | 1 + .../tools/ossfuzz/StackReuseCodegenFuzzer.cpp | 114 ++++++++++++------ test/tools/ossfuzz/YulEvmoneInterface.cpp | 5 + test/tools/ossfuzz/YulEvmoneInterface.h | 1 + test/tools/ossfuzz/protoToYul.cpp | 17 ++- test/tools/ossfuzz/protoToYul.h | 9 +- 6 files changed, 105 insertions(+), 42 deletions(-) diff --git a/test/libyul/YulOptimizerTestCommon.cpp b/test/libyul/YulOptimizerTestCommon.cpp index 48c7ea403850..92482814b1ca 100644 --- a/test/libyul/YulOptimizerTestCommon.cpp +++ b/test/libyul/YulOptimizerTestCommon.cpp @@ -97,6 +97,7 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( }}, {"blockFlattener", [&]() { disambiguate(); + FunctionGrouper::run(*m_context, *m_ast); BlockFlattener::run(*m_context, *m_ast); }}, {"constantOptimiser", [&]() { diff --git a/test/tools/ossfuzz/StackReuseCodegenFuzzer.cpp b/test/tools/ossfuzz/StackReuseCodegenFuzzer.cpp index d7779a58d914..fb502af52778 100644 --- a/test/tools/ossfuzz/StackReuseCodegenFuzzer.cpp +++ b/test/tools/ossfuzz/StackReuseCodegenFuzzer.cpp @@ -27,6 +27,9 @@ #include #include +#include +#include + #include #include @@ -47,6 +50,24 @@ using namespace std; static evmc::VM evmone = evmc::VM{evmc_create_evmone()}; +namespace +{ +/// @returns true if there are recursive functions, false otherwise. +bool recursiveFunctionExists(Dialect const& _dialect, yul::Object& _object) +{ + auto recursiveFunctions = CallGraphGenerator::callGraph(*_object.code).recursiveFunctions(); + for(auto&& [function, variables]: CompilabilityChecker{ + _dialect, + _object, + true + }.unreachableVariables + ) + if(recursiveFunctions.count(function)) + return true; + return false; +} +} + DEFINE_PROTO_FUZZER(Program const& _input) { // Solidity creates an invalid instruction for subobjects, so we simply @@ -78,45 +99,58 @@ DEFINE_PROTO_FUZZER(Program const& _input) settings.runYulOptimiser = false; settings.optimizeStackAllocation = false; bytes unoptimisedByteCode; + bool recursiveFunction = false; + bool unoptimizedStackTooDeep = false; try { - unoptimisedByteCode = YulAssembler{version, nullopt, settings, yul_source}.assemble(); + YulAssembler assembler{version, nullopt, settings, yul_source}; + unoptimisedByteCode = assembler.assemble(); + auto yulObject = assembler.object(); + recursiveFunction = recursiveFunctionExists( + EVMDialect::strictAssemblyForEVMObjects(version), + *yulObject + ); } catch (solidity::yul::StackTooDeepError const&) { - return; + unoptimizedStackTooDeep = true; } - evmc::Result deployResult = YulEvmoneUtility{}.deployCode(unoptimisedByteCode, hostContext); - if (deployResult.status_code != EVMC_SUCCESS) - return; - auto callMessage = YulEvmoneUtility{}.callMessage(deployResult.create_address); - evmc::Result callResult = hostContext.call(callMessage); - // If the fuzzer synthesized input does not contain the revert opcode which - // we lazily check by string find, the EVM call should not revert. - bool noRevertInSource = yul_source.find("revert") == string::npos; - bool noInvalidInSource = yul_source.find("invalid") == string::npos; - if (noInvalidInSource) - solAssert( - callResult.status_code != EVMC_INVALID_INSTRUCTION, - "Invalid instruction." - ); - if (noRevertInSource) + ostringstream unoptimizedState; + bool noRevertInSource = true; + bool noInvalidInSource = true; + if (!unoptimizedStackTooDeep) + { + evmc::Result deployResult = YulEvmoneUtility{}.deployCode(unoptimisedByteCode, hostContext); + if (deployResult.status_code != EVMC_SUCCESS) + return; + auto callMessage = YulEvmoneUtility{}.callMessage(deployResult.create_address); + evmc::Result callResult = hostContext.call(callMessage); + // If the fuzzer synthesized input does not contain the revert opcode which + // we lazily check by string find, the EVM call should not revert. + noRevertInSource = yul_source.find("revert") == string::npos; + noInvalidInSource = yul_source.find("invalid") == string::npos; + if (noInvalidInSource) + solAssert( + callResult.status_code != EVMC_INVALID_INSTRUCTION, + "Invalid instruction." + ); + if (noRevertInSource) + solAssert( + callResult.status_code != EVMC_REVERT, + "SolidityEvmoneInterface: EVM One reverted" + ); + // Bail out on serious errors encountered during a call. + if (YulEvmoneUtility{}.seriousCallError(callResult.status_code)) + return; solAssert( - callResult.status_code != EVMC_REVERT, - "SolidityEvmoneInterface: EVM One reverted" + (callResult.status_code == EVMC_SUCCESS || + (!noRevertInSource && callResult.status_code == EVMC_REVERT) || + (!noInvalidInSource && callResult.status_code == EVMC_INVALID_INSTRUCTION)), + "Unoptimised call failed." ); - // Bail out on serious errors encountered during a call. - if (YulEvmoneUtility{}.seriousCallError(callResult.status_code)) - return; - solAssert( - (callResult.status_code == EVMC_SUCCESS || - (!noRevertInSource && callResult.status_code == EVMC_REVERT) || - (!noInvalidInSource && callResult.status_code == EVMC_INVALID_INSTRUCTION)), - "Unoptimised call failed." - ); - ostringstream unoptimizedState; - unoptimizedState << EVMHostPrinter{hostContext, deployResult.create_address}.state(); + unoptimizedState << EVMHostPrinter{hostContext, deployResult.create_address}.state(); + } settings.runYulOptimiser = true; settings.optimizeStackAllocation = true; @@ -127,9 +161,14 @@ DEFINE_PROTO_FUZZER(Program const& _input) } catch (solidity::yul::StackTooDeepError const&) { - return; + if (!recursiveFunction) + throw; + else + return; } + if (unoptimizedStackTooDeep) + return; // Reset host before running optimised code. hostContext.reset(); evmc::Result deployResultOpt = YulEvmoneUtility{}.deployCode(optimisedByteCode, hostContext); @@ -158,8 +197,13 @@ DEFINE_PROTO_FUZZER(Program const& _input) ostringstream optimizedState; optimizedState << EVMHostPrinter{hostContext, deployResultOpt.create_address}.state(); - solAssert( - unoptimizedState.str() == optimizedState.str(), - "State of unoptimised and optimised stack reused code do not match." - ); + if (unoptimizedState.str() != optimizedState.str()) + { + cout << unoptimizedState.str() << endl; + cout << optimizedState.str() << endl; + solAssert( + false, + "State of unoptimised and optimised stack reused code do not match." + ); + } } diff --git a/test/tools/ossfuzz/YulEvmoneInterface.cpp b/test/tools/ossfuzz/YulEvmoneInterface.cpp index f3a9f74453d5..b89245443049 100644 --- a/test/tools/ossfuzz/YulEvmoneInterface.cpp +++ b/test/tools/ossfuzz/YulEvmoneInterface.cpp @@ -38,6 +38,11 @@ bytes YulAssembler::assemble() return m_stack.assemble(YulStack::Machine::EVM).bytecode->bytecode; } +std::shared_ptr YulAssembler::object() +{ + return m_stack.parserResult(); +} + evmc::Result YulEvmoneUtility::deployCode(bytes const& _input, EVMHost& _host) { // Zero initialize all message fields diff --git a/test/tools/ossfuzz/YulEvmoneInterface.h b/test/tools/ossfuzz/YulEvmoneInterface.h index 9224a949dea1..71a47507e817 100644 --- a/test/tools/ossfuzz/YulEvmoneInterface.h +++ b/test/tools/ossfuzz/YulEvmoneInterface.h @@ -47,6 +47,7 @@ class YulAssembler m_optimiseYul(_optSettings.runYulOptimiser) {} solidity::bytes assemble(); + std::shared_ptr object(); private: solidity::yul::YulStack m_stack; std::string m_yulProgram; diff --git a/test/tools/ossfuzz/protoToYul.cpp b/test/tools/ossfuzz/protoToYul.cpp index 25b5a977df84..80768578934b 100644 --- a/test/tools/ossfuzz/protoToYul.cpp +++ b/test/tools/ossfuzz/protoToYul.cpp @@ -640,7 +640,7 @@ void ProtoConverter::visit(UnaryOp const& _x) { m_output << "mod("; visit(_x.operand()); - m_output << ", " << to_string(s_maxMemory) << ")"; + m_output << ", " << to_string(s_maxMemory - 32) << ")"; } else visit(_x.operand()); @@ -1125,12 +1125,21 @@ void ProtoConverter::visit(StoreFunc const& _x) // Write to memory within bounds, storage is unbounded if (storeType == StoreFunc::SSTORE) visit(_x.loc()); - else + else if (storeType == StoreFunc::MSTORE8) { m_output << "mod("; visit(_x.loc()); m_output << ", " << to_string(s_maxMemory) << ")"; } + else if (storeType == StoreFunc::MSTORE) + { + // Since we write 32 bytes, ensure it does not exceed + // upper bound on memory. + m_output << "mod("; + visit(_x.loc()); + m_output << ", " << to_string(s_maxMemory - 32) << ")"; + + } m_output << ", "; visit(_x.val()); m_output << ")\n"; @@ -1706,7 +1715,7 @@ void ProtoConverter::fillFunctionCallInput(unsigned _numInParams) case 1: { // Access memory within stipulated bounds - slot = "mod(" + dictionaryToken() + ", " + to_string(s_maxMemory) + ")"; + slot = "mod(" + dictionaryToken() + ", " + to_string(s_maxMemory - 32) + ")"; m_output << "mload(" << slot << ")"; break; } @@ -1940,6 +1949,8 @@ void ProtoConverter::visit(Program const& _x) { case Program::kBlock: m_output << "{\n"; + m_output << "mstore(memoryguard(0x10000), 1)\n"; + m_output << "sstore(mload(calldataload(0)), 1)\n"; visit(_x.block()); m_output << "}\n"; break; diff --git a/test/tools/ossfuzz/protoToYul.h b/test/tools/ossfuzz/protoToYul.h index 00559fa93aa6..b7f7c72e5a8e 100644 --- a/test/tools/ossfuzz/protoToYul.h +++ b/test/tools/ossfuzz/protoToYul.h @@ -344,11 +344,12 @@ class ProtoConverter static unsigned constexpr s_modOutputParams = 5; /// Hard-coded identifier for a Yul object's data block static auto constexpr s_dataIdentifier = "datablock"; - /// Upper bound on memory writes = 2**32 - 1 - /// See: https://eips.ethereum.org/EIPS/eip-1985#memory-size - static unsigned constexpr s_maxMemory = 4294967295; + /// Upper bound on memory writes is 64KB in order to + /// preserve semantic equivalence in the presence of + /// memory guard + static unsigned constexpr s_maxMemory = 65536; /// Upper bound on size for range copy functions - static unsigned constexpr s_maxSize = 65536; + static unsigned constexpr s_maxSize = 32768; /// Predicate to keep track of for body scope. If false, break/continue /// statements can not be created. bool m_inForBodyScope; From d12a981ba80fe9cfa3635243a0dfd3f00b6a7900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 23 Jun 2023 12:52:46 +0200 Subject: [PATCH 096/138] CI: Define aliases for all the base environment dicts --- .circleci/config.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bbf52f9747c6..a9bf33a37528 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -358,7 +358,7 @@ defaults: - base_archlinux: &base_archlinux docker: - image: archlinux:base - environment: + environment: &base_archlinux_env TERM: xterm MAKEFLAGS: -j 3 @@ -366,7 +366,7 @@ defaults: docker: - image: archlinux:base resource_class: large - environment: + environment: &base_archlinux_large_env TERM: xterm MAKEFLAGS: -j 5 @@ -374,7 +374,7 @@ defaults: docker: - image: cimg/base:current resource_class: small - environment: + environment: &base_cimg_small_env TERM: xterm MAKEFLAGS: -j 2 @@ -382,7 +382,7 @@ defaults: docker: - image: << pipeline.parameters.emscripten-docker-image >> resource_class: large - environment: + environment: &base_ems_large_env TERM: xterm MAKEFLAGS: -j 5 @@ -390,7 +390,7 @@ defaults: docker: - image: cimg/node:current resource_class: small - environment: + environment: &base_node_small_env TERM: xterm MAKEFLAGS: -j 2 @@ -398,7 +398,7 @@ defaults: macos: xcode: "14.2.0" resource_class: macos.x86.medium.gen2 - environment: + environment: &base_osx_env TERM: xterm MAKEFLAGS: -j5 @@ -406,7 +406,7 @@ defaults: macos: xcode: "14.2.0" resource_class: large - environment: + environment: &base_osx_large_env TERM: xterm MAKEFLAGS: -j10 @@ -414,56 +414,56 @@ defaults: docker: - image: cimg/python:3.6 resource_class: small - environment: + environment: &base_python_small_env TERM: xterm MAKEFLAGS: -j 2 - base_ubuntu_clang: &base_ubuntu_clang docker: - image: << pipeline.parameters.ubuntu-clang-ossfuzz-docker-image >> - environment: + environment: &base_ubuntu_clang_env TERM: xterm MAKEFLAGS: -j 3 - base_ubuntu_clang_small: &base_ubuntu_clang_small <<: *base_ubuntu_clang resource_class: small - environment: + environment: &base_ubuntu_clang_small_env TERM: xterm MAKEFLAGS: -j 2 - base_ubuntu2004: &base_ubuntu2004 docker: - image: << pipeline.parameters.ubuntu-2004-docker-image >> - environment: + environment: &base_ubuntu2004_env TERM: xterm MAKEFLAGS: -j 3 - base_ubuntu2004_small: &base_ubuntu2004_small <<: *base_ubuntu2004 resource_class: small - environment: + environment: &base_ubuntu2004_small_env TERM: xterm MAKEFLAGS: -j 2 - base_ubuntu2004_xlarge: &base_ubuntu2004_xlarge <<: *base_ubuntu2004 resource_class: xlarge - environment: + environment: &base_ubuntu2004_xlarge_env TERM: xterm MAKEFLAGS: -j 10 - base_ubuntu2204: &base_ubuntu2204 docker: - image: << pipeline.parameters.ubuntu-2204-docker-image >> - environment: + environment: &base_ubuntu2204_env TERM: xterm MAKEFLAGS: -j 3 - base_ubuntu2204_clang: &base_ubuntu2204_clang docker: - image: << pipeline.parameters.ubuntu-2204-clang-docker-image >> - environment: + environment: &base_ubuntu2204_clang_env TERM: xterm CC: clang CXX: clang++ @@ -472,7 +472,7 @@ defaults: - base_ubuntu2204_clang_large: &base_ubuntu2204_clang_large <<: *base_ubuntu2204_clang resource_class: large - environment: + environment: &base_ubuntu2204_clang_large_env TERM: xterm CC: clang CXX: clang++ @@ -481,21 +481,21 @@ defaults: - base_ubuntu2204_small: &base_ubuntu2204_small <<: *base_ubuntu2204 resource_class: small - environment: + environment: &base_ubuntu2204_small_env TERM: xterm MAKEFLAGS: -j 2 - base_ubuntu2204_large: &base_ubuntu2204_large <<: *base_ubuntu2204 resource_class: large - environment: + environment: &base_ubuntu2204_large_env TERM: xterm MAKEFLAGS: -j 5 - base_ubuntu2204_xlarge: &base_ubuntu2204_xlarge <<: *base_ubuntu2204 resource_class: xlarge - environment: + environment: &base_ubuntu2204_xlarge_env TERM: xterm MAKEFLAGS: -j 10 From 793adc8106df639f020b52a7d345e8dcca0d5c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 23 Jun 2023 12:55:19 +0200 Subject: [PATCH 097/138] CI: Define base environments in terms of environments of dicts they depend on --- .circleci/config.yml | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a9bf33a37528..4a041faadc0a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -363,11 +363,10 @@ defaults: MAKEFLAGS: -j 3 - base_archlinux_large: &base_archlinux_large - docker: - - image: archlinux:base + <<: *base_archlinux resource_class: large environment: &base_archlinux_large_env - TERM: xterm + <<: *base_archlinux_env MAKEFLAGS: -j 5 - base_cimg_small: &base_cimg_small @@ -403,11 +402,10 @@ defaults: MAKEFLAGS: -j5 - base_osx_large: &base_osx_large - macos: - xcode: "14.2.0" + <<: *base_osx resource_class: large environment: &base_osx_large_env - TERM: xterm + <<: *base_osx_env MAKEFLAGS: -j10 - base_python_small: &base_python_small @@ -429,29 +427,29 @@ defaults: <<: *base_ubuntu_clang resource_class: small environment: &base_ubuntu_clang_small_env - TERM: xterm + <<: *base_ubuntu_clang_env MAKEFLAGS: -j 2 - base_ubuntu2004: &base_ubuntu2004 docker: - - image: << pipeline.parameters.ubuntu-2004-docker-image >> + - image: << pipeline.parameters.ubuntu-2004-docker-image >> environment: &base_ubuntu2004_env - TERM: xterm - MAKEFLAGS: -j 3 + TERM: xterm + MAKEFLAGS: -j 3 - base_ubuntu2004_small: &base_ubuntu2004_small <<: *base_ubuntu2004 resource_class: small environment: &base_ubuntu2004_small_env - TERM: xterm - MAKEFLAGS: -j 2 + <<: *base_ubuntu2004_env + MAKEFLAGS: -j 2 - base_ubuntu2004_xlarge: &base_ubuntu2004_xlarge <<: *base_ubuntu2004 resource_class: xlarge environment: &base_ubuntu2004_xlarge_env - TERM: xterm - MAKEFLAGS: -j 10 + <<: *base_ubuntu2004_env + MAKEFLAGS: -j 10 - base_ubuntu2204: &base_ubuntu2204 docker: @@ -473,30 +471,28 @@ defaults: <<: *base_ubuntu2204_clang resource_class: large environment: &base_ubuntu2204_clang_large_env - TERM: xterm - CC: clang - CXX: clang++ + <<: *base_ubuntu2204_clang_env MAKEFLAGS: -j 5 - base_ubuntu2204_small: &base_ubuntu2204_small <<: *base_ubuntu2204 resource_class: small environment: &base_ubuntu2204_small_env - TERM: xterm + <<: *base_ubuntu2204_env MAKEFLAGS: -j 2 - base_ubuntu2204_large: &base_ubuntu2204_large <<: *base_ubuntu2204 resource_class: large environment: &base_ubuntu2204_large_env - TERM: xterm + <<: *base_ubuntu2204_env MAKEFLAGS: -j 5 - base_ubuntu2204_xlarge: &base_ubuntu2204_xlarge <<: *base_ubuntu2204 resource_class: xlarge environment: &base_ubuntu2204_xlarge_env - TERM: xterm + <<: *base_ubuntu2204_env MAKEFLAGS: -j 10 - base_win: &base_win From 8b64195d4b1549ae598f102e12d951c464314850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 23 Jun 2023 12:57:02 +0200 Subject: [PATCH 098/138] CI: Make jobs extend base environments instead of redefining them - Also remove variables that are now redundant. - Note that this adds new variables for jobs that previously did not have them. This should not affect behavior because we were simply omitting those variables where they were not necessary. --- .circleci/config.yml | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4a041faadc0a..06cc0c475b6f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -884,17 +884,15 @@ jobs: # Runs slightly faster on large and xlarge but we only run it nightly so efficiency matters more. <<: *base_ubuntu2204 environment: + <<: *base_ubuntu2204_env CMAKE_OPTIONS: -DSANITIZE=address - MAKEFLAGS: -j 3 CMAKE_BUILD_TYPE: Release <<: *steps_build b_ubu_clang: &b_ubu_clang <<: *base_ubuntu2204_clang_large environment: - TERM: xterm - CC: clang - CXX: clang++ + <<: *base_ubuntu2204_clang_large_env MAKEFLAGS: -j 10 <<: *steps_build @@ -905,18 +903,15 @@ jobs: type: string <<: *base_ubuntu2204_clang environment: - TERM: xterm - CC: clang - CXX: clang++ - MAKEFLAGS: -j 3 + <<: *base_ubuntu2204_clang_env CMAKE_OPTIONS: << parameters.cmake_options >> <<: *steps_build b_ubu_force_release: &b_ubu_force_release <<: *b_ubu environment: + <<: *base_ubuntu2204_xlarge_env FORCE_RELEASE: ON - MAKEFLAGS: -j 10 b_ubu_static: # We temporarily keep building static release binaries on ubuntu 20.04 @@ -925,8 +920,7 @@ jobs: # On large runs 2x faster than on medium. 3x on xlarge. <<: *base_ubuntu2004_xlarge environment: - TERM: xterm - MAKEFLAGS: -j 10 + <<: *base_ubuntu2204_xlarge_env CMAKE_OPTIONS: -DCMAKE_BUILD_TYPE=Release -DUSE_Z3_DLOPEN=ON -DUSE_CVC4=OFF -DSOLC_STATIC_STDLIBS=ON steps: - checkout @@ -948,9 +942,9 @@ jobs: # Runs ~30% faster on large but we only run it nightly so efficiency matters more. <<: *base_ubuntu2204 environment: + <<: *base_ubuntu2204_env COVERAGE: ON CMAKE_BUILD_TYPE: Debug - MAKEFLAGS: -j 3 steps: - checkout - run: *run_build @@ -960,6 +954,7 @@ jobs: t_ubu_codecov: <<: *base_ubuntu2204_large environment: + <<: *base_ubuntu2204_large_env EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 1 steps: @@ -984,6 +979,7 @@ jobs: b_ubu_cxx20: <<: *base_ubuntu2204_large environment: + <<: *base_ubuntu2204_large_env CMAKE_BUILD_TYPE: Debug CMAKE_OPTIONS: -DCMAKE_CXX_STANDARD=20 -DUSE_CVC4=OFF MAKEFLAGS: -j 10 @@ -1019,8 +1015,7 @@ jobs: b_archlinux: <<: *base_archlinux_large environment: - TERM: xterm - MAKEFLAGS: -j 5 + <<: *base_archlinux_large_env # This can be switched off if we run out of sync with Arch. USE_Z3: ON steps: @@ -1037,9 +1032,8 @@ jobs: b_osx: <<: *base_osx_large environment: - TERM: xterm + <<: *base_osx_large_env CMAKE_BUILD_TYPE: Release - MAKEFLAGS: -j10 steps: - checkout - when: @@ -1059,9 +1053,9 @@ jobs: t_osx_soltest: &t_osx_soltest <<: *base_osx environment: + <<: *base_osx_env EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 - TERM: xterm steps: - checkout - when: @@ -1091,7 +1085,7 @@ jobs: b_ems: <<: *base_ems_large environment: - TERM: xterm + <<: *base_ems_large_env MAKEFLAGS: -j 10 steps: - checkout @@ -1138,9 +1132,9 @@ jobs: <<: *base_archlinux parallelism: 20 environment: + <<: *base_archlinux_env EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 - TERM: xterm # For Archlinux we do not have prebuilt docker images and we would need to build evmone from source, # thus we forgo semantics tests to speed things up. SOLTEST_FLAGS: --no-semantic-tests --no-smt @@ -1157,6 +1151,7 @@ jobs: <<: *base_ubuntu2204_clang parallelism: 20 environment: + <<: *base_ubuntu2204_clang_env EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 # The high parallelism in this job is causing the SMT tests to run out of memory, @@ -1191,7 +1186,7 @@ jobs: <<: *base_ubuntu2204 parallelism: 7 # Should match number of tests in .circleci/cli.sh environment: - TERM: xterm + <<: *base_ubuntu2204_env ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 # Suppress CLN memory leak. # See: https://github.com/ethereum/solidity/issues/13891 for details. @@ -1202,6 +1197,7 @@ jobs: <<: *base_ubuntu2204 parallelism: 20 environment: + <<: *base_ubuntu2204_env EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 SOLTEST_FLAGS: --no-smt @@ -1215,6 +1211,7 @@ jobs: <<: *base_ubuntu2204_clang parallelism: 20 environment: + <<: *base_ubuntu2204_clang_env EVM: << pipeline.parameters.evm-version >> OPTIMIZE: 0 SOLTEST_FLAGS: --no-smt @@ -1225,6 +1222,7 @@ jobs: <<: *base_ubuntu2204_clang parallelism: 20 environment: + <<: *base_ubuntu2204_clang_env EVM: << pipeline.parameters.evm-version >> SOLTEST_FLAGS: --no-smt <<: *steps_soltest @@ -1260,7 +1258,7 @@ jobs: docker: - image: cimg/node:18.16 environment: - TERM: xterm + <<: *base_node_small_env HARDHAT_TESTS_SOLC_PATH: /tmp/workspace/soljson.js steps: - checkout @@ -1581,9 +1579,8 @@ jobs: t_bytecode_compare: <<: *base_ubuntu2204_small environment: + <<: *base_ubuntu2204_small_env <<: *bytecode_compare_env_presets - TERM: xterm - MAKEFLAGS: -j 2 steps: - checkout - attach_workspace: From 29041c8101d13a5e4372e9c2b94e83a5e254d66e Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Tue, 27 Jun 2023 17:42:06 +0200 Subject: [PATCH 099/138] Remove ReasoningBasedSimplifier from libyul Due to a design decision to move away from a bundled SMT solver, ReasoningBasedSimplifier in its current form cannot be use any longer. This is a necessary step to allow a unified way to call solvers using only SMTLIB interface. Since this optimization pass has always been marked as highly experimental and never turned on by default, it should be OK to remove it. --- Changelog.md | 1 + docs/internals/optimizer.rst | 21 -- libyul/CMakeLists.txt | 4 - libyul/optimiser/ReasoningBasedSimplifier.cpp | 228 ------------------ libyul/optimiser/ReasoningBasedSimplifier.h | 75 ------ libyul/optimiser/SMTSolver.cpp | 160 ------------ libyul/optimiser/SMTSolver.h | 92 ------- libyul/optimiser/Suite.cpp | 3 - test/libyul/YulOptimizerTest.cpp | 7 - test/libyul/YulOptimizerTestCommon.cpp | 8 +- .../reasoningBasedSimplifier/arith.yul | 13 - .../arith_movable.yul | 19 -- .../arith_non_movable.yul | 23 -- .../reasoningBasedSimplifier/mulcheck.yul | 32 --- .../reasoningBasedSimplifier/mulmod.yul | 31 --- .../negative_rounding.yul | 16 -- .../reasoningBasedSimplifier/nested.yul | 26 -- .../signed_division.yul | 31 --- .../reasoningBasedSimplifier/smod.yul | 53 ---- .../reasoningBasedSimplifier/smoke.yul | 5 - .../reasoningBasedSimplifier/wrapping.yul | 15 -- test/tools/yulopti.cpp | 1 - test/yulPhaser/Chromosome.cpp | 2 +- 23 files changed, 3 insertions(+), 863 deletions(-) delete mode 100644 libyul/optimiser/ReasoningBasedSimplifier.cpp delete mode 100644 libyul/optimiser/ReasoningBasedSimplifier.h delete mode 100644 libyul/optimiser/SMTSolver.cpp delete mode 100644 libyul/optimiser/SMTSolver.h delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_movable.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_non_movable.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulcheck.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulmod.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/negative_rounding.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/nested.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/signed_division.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smod.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smoke.yul delete mode 100644 test/libyul/yulOptimizerTests/reasoningBasedSimplifier/wrapping.yul diff --git a/Changelog.md b/Changelog.md index 69bd02624e3f..2ddf6647e06b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,7 @@ Compiler Features: * SMTChecker: Add ``--model-checker-print-query`` CLI option and ``settings.modelChecker.printQuery`` JSON option to output the SMTChecker queries in the SMTLIB2 format. This requires using `smtlib2` solver only. * Standard JSON Interface: Add ``ast`` file-level output for Yul input. * Standard JSON Interface: Add ``irAst`` and ``irOptimizedAst`` contract-level outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. + * Yul Optimizer: Remove experimental `ReasoningBasedSimplifier` optimization step. * Yul Optimizer: Stack-to-memory mover is now enabled by default whenever possible for via IR code generation and pure Yul compilation. diff --git a/docs/internals/optimizer.rst b/docs/internals/optimizer.rst index d3df1b60094b..cd4624a1a13b 100644 --- a/docs/internals/optimizer.rst +++ b/docs/internals/optimizer.rst @@ -316,7 +316,6 @@ Abbreviation Full name ``L`` :ref:`load-resolver` ``M`` :ref:`loop-invariant-code-motion` ``r`` :ref:`redundant-assign-eliminator` -``R`` :ref:`reasoning-based-simplifier` - highly experimental ``m`` :ref:`rematerialiser` ``V`` :ref:`SSA-reverser` ``a`` :ref:`SSA-transform` @@ -330,10 +329,6 @@ Abbreviation Full name Some steps depend on properties ensured by ``BlockFlattener``, ``FunctionGrouper``, ``ForLoopInitRewriter``. For this reason the Yul optimizer always applies them before applying any steps supplied by the user. -The ReasoningBasedSimplifier is an optimizer step that is currently not enabled -in the default set of steps. It uses an SMT solver to simplify arithmetic expressions -and boolean conditions. It has not received thorough testing or validation yet and can produce -non-reproducible results, so please use with care! Selecting Optimizations ----------------------- @@ -863,22 +858,6 @@ Works best if the code is in SSA form. Prerequisite: Disambiguator, ForLoopInitRewriter. -.. _reasoning-based-simplifier: - -ReasoningBasedSimplifier -^^^^^^^^^^^^^^^^^^^^^^^^ - -This optimizer uses SMT solvers to check whether ``if`` conditions are constant. - -- If ``constraints AND condition`` is UNSAT, the condition is never true and the whole body can be removed. -- If ``constraints AND NOT condition`` is UNSAT, the condition is always true and can be replaced by ``1``. - -The simplifications above can only be applied if the condition is movable. - -It is only effective on the EVM dialect, but safe to use on other dialects. - -Prerequisite: Disambiguator, SSATransform. - Statement-Scale Simplifications ------------------------------- diff --git a/libyul/CMakeLists.txt b/libyul/CMakeLists.txt index 2cf02f8383f7..0bb98e4677fa 100644 --- a/libyul/CMakeLists.txt +++ b/libyul/CMakeLists.txt @@ -143,8 +143,6 @@ add_library(yul optimiser/OptimiserStep.h optimiser/OptimizerUtilities.cpp optimiser/OptimizerUtilities.h - optimiser/ReasoningBasedSimplifier.cpp - optimiser/ReasoningBasedSimplifier.h optimiser/UnusedAssignEliminator.cpp optimiser/UnusedAssignEliminator.h optimiser/UnusedStoreBase.cpp @@ -153,8 +151,6 @@ add_library(yul optimiser/UnusedStoreEliminator.h optimiser/Rematerialiser.cpp optimiser/Rematerialiser.h - optimiser/SMTSolver.cpp - optimiser/SMTSolver.h optimiser/SSAReverser.cpp optimiser/SSAReverser.h optimiser/SSATransform.cpp diff --git a/libyul/optimiser/ReasoningBasedSimplifier.cpp b/libyul/optimiser/ReasoningBasedSimplifier.cpp deleted file mode 100644 index 24882d84e8e1..000000000000 --- a/libyul/optimiser/ReasoningBasedSimplifier.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include - -#include - -#include -#include - -using namespace std; -using namespace solidity; -using namespace solidity::util; -using namespace solidity::yul; -using namespace solidity::smtutil; - -void ReasoningBasedSimplifier::run(OptimiserStepContext& _context, Block& _ast) -{ - set ssaVars = SSAValueTracker::ssaVariables(_ast); - ReasoningBasedSimplifier{_context.dialect, ssaVars}(_ast); -} - -std::optional ReasoningBasedSimplifier::invalidInCurrentEnvironment() -{ - // SMTLib2 interface is always available, but we would like to have synchronous answers. - if (smtutil::SMTPortfolio{}.solvers() <= 1) - return string{"No SMT solvers available."}; - else - return nullopt; -} - -void ReasoningBasedSimplifier::operator()(VariableDeclaration& _varDecl) -{ - SMTSolver::encodeVariableDeclaration(_varDecl); -} - -void ReasoningBasedSimplifier::operator()(If& _if) -{ - if (!SideEffectsCollector{m_dialect, *_if.condition}.movable()) - return; - - smtutil::Expression condition = encodeExpression(*_if.condition); - m_solver->push(); - m_solver->addAssertion(condition == constantValue(0)); - CheckResult result = m_solver->check({}).first; - m_solver->pop(); - if (result == CheckResult::UNSATISFIABLE) - { - Literal trueCondition = m_dialect.trueLiteral(); - trueCondition.debugData = debugDataOf(*_if.condition); - _if.condition = make_unique(std::move(trueCondition)); - } - else - { - m_solver->push(); - m_solver->addAssertion(condition != constantValue(0)); - CheckResult result2 = m_solver->check({}).first; - m_solver->pop(); - if (result2 == CheckResult::UNSATISFIABLE) - { - Literal falseCondition = m_dialect.zeroLiteralForType(m_dialect.boolType); - falseCondition.debugData = debugDataOf(*_if.condition); - _if.condition = make_unique(std::move(falseCondition)); - _if.body = yul::Block{}; - // Nothing left to be done. - return; - } - } - - m_solver->push(); - m_solver->addAssertion(condition != constantValue(0)); - - ASTModifier::operator()(_if.body); - - m_solver->pop(); -} - -ReasoningBasedSimplifier::ReasoningBasedSimplifier( - Dialect const& _dialect, - set const& _ssaVariables -): - SMTSolver(_ssaVariables, _dialect), - m_dialect(_dialect) -{ -} - - -smtutil::Expression ReasoningBasedSimplifier::encodeEVMBuiltin( - evmasm::Instruction _instruction, - vector const& _arguments -) -{ - vector arguments = applyMap( - _arguments, - [this](yul::Expression const& _expr) { return encodeExpression(_expr); } - ); - switch (_instruction) - { - case evmasm::Instruction::ADD: - return wrap(arguments.at(0) + arguments.at(1)); - case evmasm::Instruction::MUL: - return wrap(arguments.at(0) * arguments.at(1)); - case evmasm::Instruction::SUB: - return wrap(arguments.at(0) - arguments.at(1)); - case evmasm::Instruction::DIV: - return smtutil::Expression::ite( - arguments.at(1) == constantValue(0), - constantValue(0), - arguments.at(0) / arguments.at(1) - ); - case evmasm::Instruction::SDIV: - return smtutil::Expression::ite( - arguments.at(1) == constantValue(0), - constantValue(0), - // No `wrap()` needed here, because -2**255 / -1 results - // in 2**255 which is "converted" to its two's complement - // representation 2**255 in `signedToTwosComplement` - signedToTwosComplement(smtutil::signedDivisionEVM( - twosComplementToSigned(arguments.at(0)), - twosComplementToSigned(arguments.at(1)) - )) - ); - case evmasm::Instruction::MOD: - return smtutil::Expression::ite( - arguments.at(1) == constantValue(0), - constantValue(0), - arguments.at(0) % arguments.at(1) - ); - case evmasm::Instruction::SMOD: - return smtutil::Expression::ite( - arguments.at(1) == constantValue(0), - constantValue(0), - signedToTwosComplement(signedModuloEVM( - twosComplementToSigned(arguments.at(0)), - twosComplementToSigned(arguments.at(1)) - )) - ); - case evmasm::Instruction::LT: - return booleanValue(arguments.at(0) < arguments.at(1)); - case evmasm::Instruction::SLT: - return booleanValue(twosComplementToSigned(arguments.at(0)) < twosComplementToSigned(arguments.at(1))); - case evmasm::Instruction::GT: - return booleanValue(arguments.at(0) > arguments.at(1)); - case evmasm::Instruction::SGT: - return booleanValue(twosComplementToSigned(arguments.at(0)) > twosComplementToSigned(arguments.at(1))); - case evmasm::Instruction::EQ: - return booleanValue(arguments.at(0) == arguments.at(1)); - case evmasm::Instruction::ISZERO: - return booleanValue(arguments.at(0) == constantValue(0)); - case evmasm::Instruction::AND: - return smtutil::Expression::ite( - (arguments.at(0) == 0 || arguments.at(0) == 1) && - (arguments.at(1) == 0 || arguments.at(1) == 1), - booleanValue(arguments.at(0) == 1 && arguments.at(1) == 1), - bv2int(int2bv(arguments.at(0)) & int2bv(arguments.at(1))) - ); - case evmasm::Instruction::OR: - return smtutil::Expression::ite( - (arguments.at(0) == 0 || arguments.at(0) == 1) && - (arguments.at(1) == 0 || arguments.at(1) == 1), - booleanValue(arguments.at(0) == 1 || arguments.at(1) == 1), - bv2int(int2bv(arguments.at(0)) | int2bv(arguments.at(1))) - ); - case evmasm::Instruction::XOR: - return bv2int(int2bv(arguments.at(0)) ^ int2bv(arguments.at(1))); - case evmasm::Instruction::NOT: - return smtutil::Expression(u256(-1)) - arguments.at(0); - case evmasm::Instruction::SHL: - return smtutil::Expression::ite( - arguments.at(0) > 255, - constantValue(0), - bv2int(int2bv(arguments.at(1)) << int2bv(arguments.at(0))) - ); - case evmasm::Instruction::SHR: - return smtutil::Expression::ite( - arguments.at(0) > 255, - constantValue(0), - bv2int(int2bv(arguments.at(1)) >> int2bv(arguments.at(0))) - ); - case evmasm::Instruction::SAR: - return smtutil::Expression::ite( - arguments.at(0) > 255, - constantValue(0), - bv2int(smtutil::Expression::ashr(int2bv(arguments.at(1)), int2bv(arguments.at(0)))) - ); - case evmasm::Instruction::ADDMOD: - return smtutil::Expression::ite( - arguments.at(2) == constantValue(0), - constantValue(0), - (arguments.at(0) + arguments.at(1)) % arguments.at(2) - ); - case evmasm::Instruction::MULMOD: - return smtutil::Expression::ite( - arguments.at(2) == constantValue(0), - constantValue(0), - (arguments.at(0) * arguments.at(1)) % arguments.at(2) - ); - // TODO SIGNEXTEND - default: - break; - } - return newRestrictedVariable(); -} diff --git a/libyul/optimiser/ReasoningBasedSimplifier.h b/libyul/optimiser/ReasoningBasedSimplifier.h deleted file mode 100644 index c458a36d096c..000000000000 --- a/libyul/optimiser/ReasoningBasedSimplifier.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -#pragma once - -#include -#include -#include -#include - -// because of instruction -#include - -#include - -namespace solidity::smtutil -{ -class SolverInterface; -class Expression; -struct Sort; -} - -namespace solidity::yul -{ - -/** - * Reasoning-based simplifier. - * This optimizer uses SMT solvers to check whether `if` conditions are constant. - * - If `constraints AND condition` is UNSAT, the condition is never true and the whole body can be removed. - * - If `constraints AND NOT condition` is UNSAT, the condition is always true and can be replaced by `1`. - * The simplifications above can only be applied if the condition is movable. - * - * It is only effective on the EVM dialect, but safe to use on other dialects. - * - * Prerequisite: Disambiguator, SSATransform. - */ -class ReasoningBasedSimplifier: public ASTModifier, SMTSolver -{ -public: - static constexpr char const* name{"ReasoningBasedSimplifier"}; - static void run(OptimiserStepContext& _context, Block& _ast); - static std::optional invalidInCurrentEnvironment(); - - using ASTModifier::operator(); - void operator()(VariableDeclaration& _varDecl) override; - void operator()(If& _if) override; - -private: - explicit ReasoningBasedSimplifier( - Dialect const& _dialect, - std::set const& _ssaVariables - ); - - smtutil::Expression encodeEVMBuiltin( - evmasm::Instruction _instruction, - std::vector const& _arguments - ) override; - - Dialect const& m_dialect; -}; - -} diff --git a/libyul/optimiser/SMTSolver.cpp b/libyul/optimiser/SMTSolver.cpp deleted file mode 100644 index c0c6bcb5ecb7..000000000000 --- a/libyul/optimiser/SMTSolver.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ - -#include -#include - -#include -#include - -#include -#include - -#include -#include - -using namespace solidity::yul; -using namespace solidity::util; -using namespace solidity::smtutil; -using namespace solidity; -using namespace std; - -SMTSolver::SMTSolver(set const& _ssaVariables, Dialect const& _dialect): - m_ssaVariables(_ssaVariables), - m_solver(make_unique()), - m_dialect(_dialect) -{ } - -smtutil::Expression SMTSolver::encodeExpression(Expression const& _expression) -{ - return std::visit(GenericVisitor{ - [&](FunctionCall const& _functionCall) - { - if (auto instruction = toEVMInstruction(m_dialect, _functionCall.functionName.name)) - return encodeEVMBuiltin(*instruction, _functionCall.arguments); - - return newRestrictedVariable(); - }, - [&](Identifier const& _identifier) - { - if ( - m_ssaVariables.count(_identifier.name) && - m_variables.count(_identifier.name) - ) - return m_variables.at(_identifier.name); - else - return newRestrictedVariable(); - }, - [&](Literal const& _literal) - { - return literalValue(_literal); - } - }, _expression); -} - -smtutil::Expression SMTSolver::int2bv(smtutil::Expression _arg) -{ - return smtutil::Expression::int2bv(std::move(_arg), 256); -} - -smtutil::Expression SMTSolver::bv2int(smtutil::Expression _arg) -{ - return smtutil::Expression::bv2int(std::move(_arg)); -} - -smtutil::Expression SMTSolver::newVariable() -{ - return m_solver->newVariable(uniqueName(), defaultSort()); -} - -smtutil::Expression SMTSolver::newRestrictedVariable(bigint _maxValue) -{ - smtutil::Expression var = newVariable(); - m_solver->addAssertion(0 <= var && var <= smtutil::Expression(_maxValue)); - return var; -} - -string SMTSolver::uniqueName() -{ - return "expr_" + to_string(m_varCounter++); -} - -shared_ptr SMTSolver::defaultSort() const -{ - return SortProvider::intSort(); -} - -smtutil::Expression SMTSolver::booleanValue(smtutil::Expression _value) -{ - return smtutil::Expression::ite(_value, constantValue(1), constantValue(0)); -} - -smtutil::Expression SMTSolver::constantValue(bigint _value) -{ - return _value; -} - -smtutil::Expression SMTSolver::literalValue(Literal const& _literal) -{ - return smtutil::Expression(valueOfLiteral(_literal)); -} - -smtutil::Expression SMTSolver::twosComplementToSigned(smtutil::Expression _value) -{ - return smtutil::Expression::ite( - _value < smtutil::Expression(bigint(1) << 255), - _value, - _value - smtutil::Expression(bigint(1) << 256) - ); -} - -smtutil::Expression SMTSolver::signedToTwosComplement(smtutil::Expression _value) -{ - return smtutil::Expression::ite( - _value >= 0, - _value, - _value + smtutil::Expression(bigint(1) << 256) - ); -} - -smtutil::Expression SMTSolver::wrap(smtutil::Expression _value) -{ - smtutil::Expression rest = newRestrictedVariable(); - smtutil::Expression multiplier = newVariable(); - m_solver->addAssertion(_value == multiplier * smtutil::Expression(bigint(1) << 256) + rest); - return rest; -} - -void SMTSolver::encodeVariableDeclaration(VariableDeclaration const& _varDecl) -{ - if ( - _varDecl.variables.size() == 1 && - _varDecl.value && - m_ssaVariables.count(_varDecl.variables.front().name) - ) - { - YulString const& variableName = _varDecl.variables.front().name; - bool const inserted = m_variables.insert({ - variableName, - m_solver->newVariable("yul_" + variableName.str(), defaultSort()) - }).second; - yulAssert(inserted, ""); - m_solver->addAssertion( - m_variables.at(variableName) == encodeExpression(*_varDecl.value) - ); - } -} diff --git a/libyul/optimiser/SMTSolver.h b/libyul/optimiser/SMTSolver.h deleted file mode 100644 index d92a84c1d5ea..000000000000 --- a/libyul/optimiser/SMTSolver.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - This file is part of solidity. - - solidity is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - solidity is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with solidity. If not, see . -*/ -#pragma once - -#include -#include -#include - -// because of instruction -#include - -#include - -#include - -namespace solidity::smtutil -{ - -class SolverInterface; -class Expression; -struct Sort; - -} - -namespace solidity::yul -{ - -/** - * Base class for SMT based optimization steps. - * - * Works best when used with AST in SSA form. - */ -class SMTSolver -{ -protected: - SMTSolver( - std::set const& _ssaVariables, - Dialect const& _dialect - ); - - /// Helper function that encodes VariableDeclaration - void encodeVariableDeclaration(VariableDeclaration const& _varDecl); - - /// The encoding for a builtin. The type of encoding determines what we are - /// solving for. - virtual smtutil::Expression encodeEVMBuiltin( - evmasm::Instruction _instruction, - std::vector const& _arguments - ) = 0; - - smtutil::Expression encodeExpression(Expression const& _expression); - - static smtutil::Expression int2bv(smtutil::Expression _arg); - static smtutil::Expression bv2int(smtutil::Expression _arg); - - smtutil::Expression newVariable(); - virtual smtutil::Expression newRestrictedVariable(bigint _maxValue = (bigint(1) << 256) - 1); - std::string uniqueName(); - - virtual std::shared_ptr defaultSort() const; - static smtutil::Expression booleanValue(smtutil::Expression _value); - static smtutil::Expression constantValue(bigint _value); - static smtutil::Expression literalValue(Literal const& _literal); - static smtutil::Expression twosComplementToSigned(smtutil::Expression _value); - static smtutil::Expression signedToTwosComplement(smtutil::Expression _value); - smtutil::Expression wrap(smtutil::Expression _value); - - std::set const& m_ssaVariables; - std::unique_ptr m_solver; - std::map m_variables; - - Dialect const& m_dialect; - -private: - size_t m_varCounter = 0; -}; - -} diff --git a/libyul/optimiser/Suite.cpp b/libyul/optimiser/Suite.cpp index e29112b01d80..bd966e5d3069 100644 --- a/libyul/optimiser/Suite.cpp +++ b/libyul/optimiser/Suite.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -272,7 +271,6 @@ map> const& OptimiserSuite::allSteps() LoopInvariantCodeMotion, UnusedAssignEliminator, UnusedStoreEliminator, - ReasoningBasedSimplifier, Rematerialiser, SSAReverser, SSATransform, @@ -312,7 +310,6 @@ map const& OptimiserSuite::stepNameToAbbreviationMap() {LiteralRematerialiser::name, 'T'}, {LoadResolver::name, 'L'}, {LoopInvariantCodeMotion::name, 'M'}, - {ReasoningBasedSimplifier::name, 'R'}, {UnusedAssignEliminator::name, 'r'}, {UnusedStoreEliminator::name, 'S'}, {Rematerialiser::name, 'm'}, diff --git a/test/libyul/YulOptimizerTest.cpp b/test/libyul/YulOptimizerTest.cpp index 6404fa7c6a62..b50bcb38e58f 100644 --- a/test/libyul/YulOptimizerTest.cpp +++ b/test/libyul/YulOptimizerTest.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #include @@ -53,12 +52,6 @@ YulOptimizerTest::YulOptimizerTest(string const& _filename): BOOST_THROW_EXCEPTION(runtime_error("Filename path has to contain a directory: \"" + _filename + "\".")); m_optimizerStep = std::prev(std::prev(path.end()))->string(); - if (m_optimizerStep == "reasoningBasedSimplifier" && ( - solidity::test::CommonOptions::get().disableSMT || - ReasoningBasedSimplifier::invalidInCurrentEnvironment() - )) - m_shouldRun = false; - m_source = m_reader.source(); auto dialectName = m_reader.stringSetting("dialect", "evm"); diff --git a/test/libyul/YulOptimizerTestCommon.cpp b/test/libyul/YulOptimizerTestCommon.cpp index 48c7ea403850..ed29f339c625 100644 --- a/test/libyul/YulOptimizerTestCommon.cpp +++ b/test/libyul/YulOptimizerTestCommon.cpp @@ -49,7 +49,6 @@ #include #include #include -#include #include #include #include @@ -289,10 +288,6 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( LiteralRematerialiser::run(*m_context, *m_ast); StructuralSimplifier::run(*m_context, *m_ast); }}, - {"reasoningBasedSimplifier", [&]() { - disambiguate(); - ReasoningBasedSimplifier::run(*m_context, *m_object->code); - }}, {"equivalentFunctionCombiner", [&]() { disambiguate(); ForLoopInitRewriter::run(*m_context, *m_ast); @@ -424,8 +419,7 @@ string YulOptimizerTestCommon::randomOptimiserStep(unsigned _seed) // it can sometimes drain memory. if ( optimiserStep == "mainFunction" || - optimiserStep == "wordSizeTransform" || - optimiserStep == "reasoningBasedSimplifier" + optimiserStep == "wordSizeTransform" ) // "Fullsuite" is fuzzed roughly four times more frequently than // other steps because of the filtering in place above. diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith.yul deleted file mode 100644 index 7ff930766342..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith.yul +++ /dev/null @@ -1,13 +0,0 @@ -{ - let x := 7 - let y := 8 - if eq(add(x, y), 15) { } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let x := 7 -// let y := 8 -// if 1 { } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_movable.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_movable.yul deleted file mode 100644 index 2080a678c0bf..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_movable.yul +++ /dev/null @@ -1,19 +0,0 @@ -{ - function f() -> z - { - z := 15 - } - let x := 7 - let y := 8 - if eq(add(x, y), f()) { } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// function f() -> z -// { z := 15 } -// let x := 7 -// let y := 8 -// if eq(add(x, y), f()) { } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_non_movable.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_non_movable.yul deleted file mode 100644 index ed50224d02a6..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/arith_non_movable.yul +++ /dev/null @@ -1,23 +0,0 @@ -{ - function f() -> z - { - sstore(1, 15) - z := 15 - } - let x := 7 - let y := 8 - if eq(add(x, y), f()) { } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// function f() -> z -// { -// sstore(1, 15) -// z := 15 -// } -// let x := 7 -// let y := 8 -// if eq(add(x, y), f()) { } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulcheck.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulcheck.yul deleted file mode 100644 index 31a342339332..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulcheck.yul +++ /dev/null @@ -1,32 +0,0 @@ -{ - let vloc_x := calldataload(0) - let vloc_y := calldataload(1) - if lt(vloc_x, shl(100, 1)) { - if lt(vloc_y, shl(100, 1)) { - if iszero(and(iszero(iszero(vloc_x)), gt(vloc_y, div(not(0), vloc_x)))) { - let vloc := mul(vloc_x, vloc_y) - sstore(0, vloc) - } - } - } -} -// ==== -// EVMVersion: >=constantinople -// ---- -// step: reasoningBasedSimplifier -// -// { -// let vloc_x := calldataload(0) -// let vloc_y := calldataload(1) -// if lt(vloc_x, shl(100, 1)) -// { -// if lt(vloc_y, shl(100, 1)) -// { -// if 1 -// { -// let vloc := mul(vloc_x, vloc_y) -// sstore(0, vloc) -// } -// } -// } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulmod.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulmod.yul deleted file mode 100644 index f5226acf7743..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/mulmod.yul +++ /dev/null @@ -1,31 +0,0 @@ -{ - let x := calldataload(0) - let y := calldataload(32) - let z := calldataload(64) - let result := mulmod(x, y, z) - - // should be zero - if gt(result, z) { sstore(0, 1) } - - // mulmod is equal to mod of product for small numbers - if and(and(lt(x, 1000), lt(y, 1000)), lt(z, 1000)) { - if eq(result, mod(mul(x, y), z)) { sstore(0, 9) } - } - - // but not in general - if and(and(gt(x, sub(0, 5)), eq(y, 2)), eq(z, 3)) { - if eq(result, mod(mul(x, y), z)) { sstore(0, 5) } - } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let x := calldataload(0) -// let y := calldataload(32) -// let z := calldataload(64) -// let result := mulmod(x, y, z) -// if 0 { } -// if and(and(lt(x, 1000), lt(y, 1000)), lt(z, 1000)) { if 1 { sstore(0, 9) } } -// if and(and(gt(x, sub(0, 5)), eq(y, 2)), eq(z, 3)) { if 0 { } } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/negative_rounding.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/negative_rounding.yul deleted file mode 100644 index 6e4b3f5edee3..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/negative_rounding.yul +++ /dev/null @@ -1,16 +0,0 @@ -{ - let x := sub(0, 7) - let y := 2 - // (-7)/2 == -3 on the evm - if iszero(add(sdiv(x, y), 3)) { } - if iszero(add(sdiv(x, y), 4)) { } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let x := sub(0, 7) -// let y := 2 -// if 1 { } -// if 0 { } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/nested.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/nested.yul deleted file mode 100644 index d7002c99b561..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/nested.yul +++ /dev/null @@ -1,26 +0,0 @@ -{ - let x := calldataload(2) - let t := lt(x, 20) - if t { - if lt(x, 21) { } - if lt(x, 20) { } - if lt(x, 19) { } - if gt(x, 20) { } - if iszero(gt(x, 20)) { } - } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let x := calldataload(2) -// let t := lt(x, 20) -// if t -// { -// if 1 { } -// if 1 { } -// if lt(x, 19) { } -// if 0 { } -// if 1 { } -// } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/signed_division.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/signed_division.yul deleted file mode 100644 index 1e409079e8a7..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/signed_division.yul +++ /dev/null @@ -1,31 +0,0 @@ -{ - let y := calldataload(0) - let t := calldataload(32) - - if sgt(sub(y, 1), y) { - // y - 1 > y, i.e. y is the most negative value - if eq(sdiv(y, sub(0, 1)), y) { - // should be true: y / -1 == y - sstore(0, 7) - } - if iszero(eq(y, t)) { - // t is not the most negative value - if eq(sdiv(t, sub(0, 1)), sub(0, t)) { - // should be true: t / -1 = 0 - t - sstore(1, 7) - } - } - } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let y := calldataload(0) -// let t := calldataload(32) -// if sgt(sub(y, 1), y) -// { -// if 1 { sstore(0, 7) } -// if iszero(eq(y, t)) { if 1 { sstore(1, 7) } } -// } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smod.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smod.yul deleted file mode 100644 index 12f04c857cc7..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smod.yul +++ /dev/null @@ -1,53 +0,0 @@ -{ - // 7 % 5 == 2 - // 7 % -5 == 2 - // -7 % 5 == -2 - // -7 % -5 == -2 - // -5 % -5 == 0 - let x := calldataload(0) - let y := calldataload(32) - let result := smod(x, y) - if eq(x, 7) { - if eq(y, 5) { - if eq(result, 2) { sstore(0, 7)} - } - if eq(y, sub(0, 5)) { - if eq(result, 2) { sstore(0, 7)} - } - } - if eq(x, sub(0, 7)) { - if eq(y, 5) { - if eq(result, sub(0, 2)) { sstore(0, 7)} - } - if eq(y, sub(0, 5)) { - if eq(result, sub(0, 2)) { sstore(0, 7)} - } - } - if eq(x, sub(0, 5)) { - if eq(y, sub(0, 5)) { - if eq(result, 0) { sstore(0, 7)} - } - } -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let x := calldataload(0) -// let y := calldataload(32) -// let result := smod(x, y) -// if eq(x, 7) -// { -// if eq(y, 5) { if 1 { sstore(0, 7) } } -// if eq(y, sub(0, 5)) { if 1 { sstore(0, 7) } } -// } -// if eq(x, sub(0, 7)) -// { -// if eq(y, 5) { if 1 { sstore(0, 7) } } -// if eq(y, sub(0, 5)) { if 1 { sstore(0, 7) } } -// } -// if eq(x, sub(0, 5)) -// { -// if eq(y, sub(0, 5)) { if 1 { sstore(0, 7) } } -// } -// } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smoke.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smoke.yul deleted file mode 100644 index 6f860dc13242..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/smoke.yul +++ /dev/null @@ -1,5 +0,0 @@ -{ } -// ---- -// step: reasoningBasedSimplifier -// -// { } diff --git a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/wrapping.yul b/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/wrapping.yul deleted file mode 100644 index 69f5c6769757..000000000000 --- a/test/libyul/yulOptimizerTests/reasoningBasedSimplifier/wrapping.yul +++ /dev/null @@ -1,15 +0,0 @@ -{ - let x := 7 - let y := 8 - if gt(sub(x, y), 20) { } - if eq(sub(x, y), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) {} -} -// ---- -// step: reasoningBasedSimplifier -// -// { -// let x := 7 -// let y := 8 -// if 1 { } -// if 1 { } -// } diff --git a/test/tools/yulopti.cpp b/test/tools/yulopti.cpp index ad98ab9bee07..20491afe1657 100644 --- a/test/tools/yulopti.cpp +++ b/test/tools/yulopti.cpp @@ -37,7 +37,6 @@ #include #include #include -#include #include diff --git a/test/yulPhaser/Chromosome.cpp b/test/yulPhaser/Chromosome.cpp index 90e278f42ef1..1d12bf18c161 100644 --- a/test/yulPhaser/Chromosome.cpp +++ b/test/yulPhaser/Chromosome.cpp @@ -138,7 +138,7 @@ BOOST_AUTO_TEST_CASE(output_operator_should_create_concise_and_unambiguous_strin BOOST_TEST(chromosome.length() == allSteps.size()); BOOST_TEST(chromosome.optimisationSteps() == allSteps); - BOOST_TEST(toString(chromosome) == "flcCUnDEvejsxIOoighFTLMRmVatrpuSd"); + BOOST_TEST(toString(chromosome) == "flcCUnDEvejsxIOoighFTLMmVatrpuSd"); } BOOST_AUTO_TEST_CASE(optimisationSteps_should_translate_chromosomes_genes_to_optimisation_step_names) From 3599c8c6b92cac837b7fa3f0c0c196a12e749151 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Fri, 30 Jun 2023 15:02:06 +0200 Subject: [PATCH 100/138] SMTChecker: Fix generation of smtlib scripts When both CHC and BMC engines are used, the type of state variable changes when trusted mode for external calls is used. This is because in CHC engine, trusted mode means we pack more information into the symbolic state. In BMC this type is always simple. However, if BMC is run after CHC, in the current code state variables are reset (and their declaration dumped into SMT-LIB script) before BMC resets the type of the state variable. The proposed solution is to simply reset the variable type before the first variable of this type is created. --- libsolidity/formal/BMC.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index d38f27b6ad22..cead3a528f57 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -81,13 +81,13 @@ void BMC::analyze(SourceUnit const& _source, map Date: Sun, 9 Jul 2023 01:45:54 +0200 Subject: [PATCH 101/138] updated protoToAbiv2.h --- test/tools/ossfuzz/protoToAbiV2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tools/ossfuzz/protoToAbiV2.h b/test/tools/ossfuzz/protoToAbiV2.h index 7038ed7064a3..be583d49711c 100644 --- a/test/tools/ossfuzz/protoToAbiV2.h +++ b/test/tools/ossfuzz/protoToAbiV2.h @@ -390,7 +390,7 @@ class ProtoConverter return m_isLastDynParamRightPadded; } - /// Convert delimter to a comma or null string. + /// Convert delimiter to a comma or null string. static std::string delimiterToString(Delimiter _delimiter, bool _space = true); /// Generates number in the range [1, @param _n] uniformly at random. unsigned randomNumberOneToN(unsigned _n) From 58a42969894de1ababf064f6e157ec1b9a10405a Mon Sep 17 00:00:00 2001 From: Cliff Syner <33703995+alpinevm@users.noreply.github.com> Date: Mon, 10 Jul 2023 00:33:05 -0500 Subject: [PATCH 102/138] Update using-the-compiler.rst Reflect all available evm options in compiler standard input docs --- docs/using-the-compiler.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 6fb32871c8d6..6e6a64bb28f8 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -316,7 +316,7 @@ Input Description }, // Version of the EVM to compile for. // Affects type checking and code generation. Can be homestead, - // tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, istanbul, berlin, london or paris + // tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, istanbul, berlin, london, paris or shanghai "evmVersion": "byzantium", // Optional: Change compilation pipeline to go through the Yul intermediate representation. // This is false by default. From a9c8b4b4d1879909a1cf2adec31613f9eb56e968 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Mon, 10 Jul 2023 13:12:46 +0200 Subject: [PATCH 103/138] Purge using namespace std --- CODING_STYLE.md | 20 +--- libevmasm/Assembly.cpp | 121 ++++++++++---------- libevmasm/AssemblyItem.cpp | 88 +++++++------- libevmasm/BlockDeduplicator.cpp | 9 +- libevmasm/CommonSubexpressionEliminator.cpp | 29 +++-- libevmasm/ConstantOptimiser.cpp | 9 +- libevmasm/ControlFlowGraph.cpp | 25 ++-- libevmasm/Disassemble.cpp | 7 +- libevmasm/ExpressionClasses.cpp | 29 +++-- libevmasm/GasMeter.cpp | 3 +- libevmasm/Inliner.cpp | 29 +++-- libevmasm/Instruction.cpp | 3 +- libevmasm/JumpdestRemover.cpp | 11 +- libevmasm/KnownState.cpp | 49 ++++---- libevmasm/LinkerObject.cpp | 17 ++- libevmasm/PathGasMeter.cpp | 15 ++- libevmasm/PeepholeOptimiser.cpp | 43 ++++--- libevmasm/SemanticInformation.cpp | 9 +- libevmasm/SimplificationRules.cpp | 21 ++-- 19 files changed, 255 insertions(+), 282 deletions(-) diff --git a/CODING_STYLE.md b/CODING_STYLE.md index cd46800da694..5b9129fbd07b 100644 --- a/CODING_STYLE.md +++ b/CODING_STYLE.md @@ -51,11 +51,11 @@ To set indentation and tab width settings uniformly, the repository contains an ## 1. Namespaces 1. No `using namespace` declarations in header files. -2. Use `using namespace std;` in cpp files, but avoid importing namespaces from boost and others. -3. All symbols should be declared in a namespace except for final applications. -4. Use anonymous namespaces for helpers whose scope is a cpp file only. -5. Preprocessor symbols should be prefixed with the namespace in all-caps and an underscore. -6. Do not use `std::` qualifier in cpp files (see 2.), except for `std::move` and `std::forward`, which will otherwise cause the `check_style` step to fail. +2. `using namespace solidity;` and other project local namespaces is fine in cpp files, and generally encouraged. +3. Avoid `using namespace` at file level for third party libraries, such as boost, ranges, etc. +4. All symbols should be declared in a namespace except for final applications. +5. Use anonymous namespaces for helpers whose scope is a cpp file only. +6. Preprocessor symbols should be prefixed with the namespace in all-caps and an underscore. Only in the header: ```cpp @@ -66,16 +66,6 @@ std::tuple meanAndSigma(std::vector const& _v); } ``` -Only in the cpp file: -```cpp -#include -using namespace std; -tuple myNamespace::meanAndSigma(vector const& _v) -{ - // ... -} -``` - ## 2. Preprocessor 1. File comment is always at top, and includes: diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp index b9b946aa59df..f524aad66b8a 100644 --- a/libevmasm/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -42,7 +42,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::langutil; @@ -77,7 +76,7 @@ unsigned Assembly::codeSize(unsigned subTagSize) const namespace { -string locationFromSources(StringMap const& _sourceCodes, SourceLocation const& _location) +std::string locationFromSources(StringMap const& _sourceCodes, SourceLocation const& _location) { if (!_location.hasText() || _sourceCodes.empty()) return {}; @@ -92,7 +91,7 @@ string locationFromSources(StringMap const& _sourceCodes, SourceLocation const& class Functionalizer { public: - Functionalizer (ostream& _out, string const& _prefix, StringMap const& _sourceCodes, Assembly const& _assembly): + Functionalizer (std::ostream& _out, std::string const& _prefix, StringMap const& _sourceCodes, Assembly const& _assembly): m_out(_out), m_prefix(_prefix), m_sourceCodes(_sourceCodes), m_assembly(_assembly) {} @@ -105,7 +104,7 @@ class Functionalizer printLocation(_debugInfoSelection); } - string expression = _item.toAssemblyText(m_assembly); + std::string expression = _item.toAssemblyText(m_assembly); if (!( _item.canBeFunctional() && @@ -114,7 +113,7 @@ class Functionalizer )) { flush(); - m_out << m_prefix << (_item.type() == Tag ? "" : " ") << expression << endl; + m_out << m_prefix << (_item.type() == Tag ? "" : " ") << expression << std::endl; return; } if (_item.arguments() > 0) @@ -137,8 +136,8 @@ class Functionalizer void flush() { - for (string const& expression: m_pending) - m_out << m_prefix << " " << expression << endl; + for (std::string const& expression: m_pending) + m_out << m_prefix << " " << expression << std::endl; m_pending.clear(); } @@ -154,7 +153,7 @@ class Functionalizer if (m_location.sourceName) m_out << " " + escapeAndQuoteString(*m_location.sourceName); if (m_location.hasText()) - m_out << ":" << to_string(m_location.start) + ":" + to_string(m_location.end); + m_out << ":" << std::to_string(m_location.start) + ":" + std::to_string(m_location.end); } if (_debugInfoSelection.snippet) @@ -165,15 +164,15 @@ class Functionalizer m_out << locationFromSources(m_sourceCodes, m_location); } - m_out << " */" << endl; + m_out << " */" << std::endl; } private: strings m_pending; SourceLocation m_location; - ostream& m_out; - string const& m_prefix; + std::ostream& m_out; + std::string const& m_prefix; StringMap const& m_sourceCodes; Assembly const& m_assembly; }; @@ -181,9 +180,9 @@ class Functionalizer } void Assembly::assemblyStream( - ostream& _out, + std::ostream& _out, DebugInfoSelection const& _debugInfoSelection, - string const& _prefix, + std::string const& _prefix, StringMap const& _sourceCodes ) const { @@ -195,34 +194,34 @@ void Assembly::assemblyStream( if (!m_data.empty() || !m_subs.empty()) { - _out << _prefix << "stop" << endl; + _out << _prefix << "stop" << std::endl; for (auto const& i: m_data) if (u256(i.first) >= m_subs.size()) - _out << _prefix << "data_" << toHex(u256(i.first)) << " " << util::toHex(i.second) << endl; + _out << _prefix << "data_" << toHex(u256(i.first)) << " " << util::toHex(i.second) << std::endl; for (size_t i = 0; i < m_subs.size(); ++i) { - _out << endl << _prefix << "sub_" << i << ": assembly {\n"; + _out << std::endl << _prefix << "sub_" << i << ": assembly {\n"; m_subs[i]->assemblyStream(_out, _debugInfoSelection, _prefix + " ", _sourceCodes); - _out << _prefix << "}" << endl; + _out << _prefix << "}" << std::endl; } } if (m_auxiliaryData.size() > 0) - _out << endl << _prefix << "auxdata: 0x" << util::toHex(m_auxiliaryData) << endl; + _out << std::endl << _prefix << "auxdata: 0x" << util::toHex(m_auxiliaryData) << std::endl; } -string Assembly::assemblyString( +std::string Assembly::assemblyString( DebugInfoSelection const& _debugInfoSelection, StringMap const& _sourceCodes ) const { - ostringstream tmp; + std::ostringstream tmp; assemblyStream(tmp, _debugInfoSelection, "", _sourceCodes); return tmp.str(); } -Json::Value Assembly::assemblyJSON(map const& _sourceIndices, bool _includeSourceList) const +Json::Value Assembly::assemblyJSON(std::map const& _sourceIndices, bool _includeSourceList) const { Json::Value root; root[".code"] = Json::arrayValue; @@ -244,7 +243,7 @@ Json::Value Assembly::assemblyJSON(map const& _sourceIndices, jsonItem["end"] = item.location().end; if (item.m_modifierDepth != 0) jsonItem["modifierDepth"] = static_cast(item.m_modifierDepth); - string jumpType = item.getJumpTypeAsString(); + std::string jumpType = item.getJumpTypeAsString(); if (!jumpType.empty()) jsonItem["jumpType"] = jumpType; if (name == "PUSHLIB") @@ -286,8 +285,8 @@ Json::Value Assembly::assemblyJSON(map const& _sourceIndices, for (size_t i = 0; i < m_subs.size(); ++i) { - stringstream hexStr; - hexStr << hex << i; + std::stringstream hexStr; + hexStr << std::hex << i; data[hexStr.str()] = m_subs[i]->assemblyJSON(_sourceIndices, /*_includeSourceList = */false); } } @@ -298,7 +297,7 @@ Json::Value Assembly::assemblyJSON(map const& _sourceIndices, return root; } -AssemblyItem Assembly::namedTag(string const& _name, size_t _params, size_t _returns, optional _sourceID) +AssemblyItem Assembly::namedTag(std::string const& _name, size_t _params, size_t _returns, std::optional _sourceID) { assertThrow(!_name.empty(), AssemblyException, "Empty named tag."); if (m_namedTags.count(_name)) @@ -312,21 +311,21 @@ AssemblyItem Assembly::namedTag(string const& _name, size_t _params, size_t _ret return AssemblyItem{Tag, m_namedTags.at(_name).id}; } -AssemblyItem Assembly::newPushLibraryAddress(string const& _identifier) +AssemblyItem Assembly::newPushLibraryAddress(std::string const& _identifier) { h256 h(util::keccak256(_identifier)); m_libraries[h] = _identifier; return AssemblyItem{PushLibraryAddress, h}; } -AssemblyItem Assembly::newPushImmutable(string const& _identifier) +AssemblyItem Assembly::newPushImmutable(std::string const& _identifier) { h256 h(util::keccak256(_identifier)); m_immutables[h] = _identifier; return AssemblyItem{PushImmutable, h}; } -AssemblyItem Assembly::newImmutableAssignment(string const& _identifier) +AssemblyItem Assembly::newImmutableAssignment(std::string const& _identifier) { h256 h(util::keccak256(_identifier)); m_immutables[h] = _identifier; @@ -339,9 +338,9 @@ Assembly& Assembly::optimise(OptimiserSettings const& _settings) return *this; } -map const& Assembly::optimiseInternal( +std::map const& Assembly::optimiseInternal( OptimiserSettings const& _settings, - set _tagsReferencedFromOutside + std::set _tagsReferencedFromOutside ) { if (m_tagReplacements) @@ -352,7 +351,7 @@ map const& Assembly::optimiseInternal( { OptimiserSettings settings = _settings; Assembly& sub = *m_subs[subId]; - map const& subTagReplacements = sub.optimiseInternal( + std::map const& subTagReplacements = sub.optimiseInternal( settings, JumpdestRemover::referencedTags(m_items, subId) ); @@ -360,7 +359,7 @@ map const& Assembly::optimiseInternal( BlockDeduplicator::applyTagReplacement(m_items, subTagReplacements, subId); } - map tagReplacements; + std::map tagReplacements; // Iterate until no new optimisation possibilities are found. for (unsigned count = 1; count > 0;) { @@ -401,7 +400,7 @@ map const& Assembly::optimiseInternal( for (auto const& replacement: deduplicator.replacedTags()) { assertThrow( - replacement.first <= numeric_limits::max() && replacement.second <= numeric_limits::max(), + replacement.first <= std::numeric_limits::max() && replacement.second <= std::numeric_limits::max(), OptimizerException, "Invalid tag replacement." ); @@ -494,7 +493,7 @@ LinkerObject const& Assembly::assemble() const LinkerObject& ret = m_assembledObject; size_t subTagSize = 1; - map>> immutableReferencesBySub; + std::map>> immutableReferencesBySub; for (auto const& sub: m_subs) { auto const& linkerObject = sub->assemble(); @@ -508,7 +507,7 @@ LinkerObject const& Assembly::assemble() const immutableReferencesBySub = linkerObject.immutableReferences; } for (size_t tagPos: sub->m_tagPositionsInBytecode) - if (tagPos != numeric_limits::max() && tagPos > subTagSize) + if (tagPos != std::numeric_limits::max() && tagPos > subTagSize) subTagSize = tagPos; } @@ -531,11 +530,11 @@ LinkerObject const& Assembly::assemble() const ); unsigned bytesRequiredForCode = codeSize(static_cast(subTagSize)); - m_tagPositionsInBytecode = vector(m_usedTags, numeric_limits::max()); - map> tagRef; - multimap dataRef; - multimap subRef; - vector sizeRef; ///< Pointers to code locations where the size of the program is inserted + m_tagPositionsInBytecode = std::vector(m_usedTags, std::numeric_limits::max()); + std::map> tagRef; + std::multimap dataRef; + std::multimap subRef; + std::vector sizeRef; ///< Pointers to code locations where the size of the program is inserted unsigned bytesPerTag = numberEncodingSize(bytesRequiredForCode); uint8_t tagPush = static_cast(pushInstruction(bytesPerTag)); @@ -550,7 +549,7 @@ LinkerObject const& Assembly::assemble() const for (AssemblyItem const& i: m_items) { // store position of the invalid jump destination - if (i.type() != Tag && m_tagPositionsInBytecode[0] == numeric_limits::max()) + if (i.type() != Tag && m_tagPositionsInBytecode[0] == std::numeric_limits::max()) m_tagPositionsInBytecode[0] = ret.bytecode.size(); switch (i.type()) @@ -583,21 +582,21 @@ LinkerObject const& Assembly::assemble() const } case PushData: ret.bytecode.push_back(dataRefPush); - dataRef.insert(make_pair(h256(i.data()), ret.bytecode.size())); + dataRef.insert(std::make_pair(h256(i.data()), ret.bytecode.size())); ret.bytecode.resize(ret.bytecode.size() + bytesPerDataRef); break; case PushSub: - assertThrow(i.data() <= numeric_limits::max(), AssemblyException, ""); + assertThrow(i.data() <= std::numeric_limits::max(), AssemblyException, ""); ret.bytecode.push_back(dataRefPush); - subRef.insert(make_pair(static_cast(i.data()), ret.bytecode.size())); + subRef.insert(std::make_pair(static_cast(i.data()), ret.bytecode.size())); ret.bytecode.resize(ret.bytecode.size() + bytesPerDataRef); break; case PushSubSize: { - assertThrow(i.data() <= numeric_limits::max(), AssemblyException, ""); + assertThrow(i.data() <= std::numeric_limits::max(), AssemblyException, ""); auto s = subAssemblyById(static_cast(i.data()))->assemble().bytecode.size(); i.setPushedValue(u256(s)); - unsigned b = max(1, numberEncodingSize(s)); + unsigned b = std::max(1, numberEncodingSize(s)); ret.bytecode.push_back(static_cast(pushInstruction(b))); ret.bytecode.resize(ret.bytecode.size() + b); bytesRef byr(&ret.bytecode.back() + 1 - b, b); @@ -618,7 +617,7 @@ LinkerObject const& Assembly::assemble() const break; case PushImmutable: ret.bytecode.push_back(static_cast(Instruction::PUSH32)); - // Maps keccak back to the "identifier" string of that immutable. + // Maps keccak back to the "identifier" std::string of that immutable. ret.immutableReferences[i.data()].first = m_immutables.at(i.data()); // Record the bytecode offset of the PUSH32 argument. ret.immutableReferences[i.data()].second.emplace_back(ret.bytecode.size()); @@ -661,10 +660,10 @@ LinkerObject const& Assembly::assemble() const case Tag: { assertThrow(i.data() != 0, AssemblyException, "Invalid tag position."); - assertThrow(i.splitForeignPushTag().first == numeric_limits::max(), AssemblyException, "Foreign tag."); + assertThrow(i.splitForeignPushTag().first == std::numeric_limits::max(), AssemblyException, "Foreign tag."); size_t tagId = static_cast(i.data()); assertThrow(ret.bytecode.size() < 0xffffffffL, AssemblyException, "Tag too large."); - assertThrow(m_tagPositionsInBytecode[tagId] == numeric_limits::max(), AssemblyException, "Duplicate tag position."); + assertThrow(m_tagPositionsInBytecode[tagId] == std::numeric_limits::max(), AssemblyException, "Duplicate tag position."); m_tagPositionsInBytecode[tagId] = ret.bytecode.size(); ret.bytecode.push_back(static_cast(Instruction::JUMPDEST)); break; @@ -686,7 +685,7 @@ LinkerObject const& Assembly::assemble() const // Append an INVALID here to help tests find miscompilation. ret.bytecode.push_back(static_cast(Instruction::INVALID)); - map subAssemblyOffsets; + std::map subAssemblyOffsets; for (auto const& [subIdPath, bytecodeOffset]: subRef) { LinkerObject subObject = subAssemblyById(subIdPath)->assemble(); @@ -709,15 +708,15 @@ LinkerObject const& Assembly::assemble() const { size_t subId; size_t tagId; - tie(subId, tagId) = i.second; - assertThrow(subId == numeric_limits::max() || subId < m_subs.size(), AssemblyException, "Invalid sub id"); - vector const& tagPositions = - subId == numeric_limits::max() ? + std::tie(subId, tagId) = i.second; + assertThrow(subId == std::numeric_limits::max() || subId < m_subs.size(), AssemblyException, "Invalid sub id"); + std::vector const& tagPositions = + subId == std::numeric_limits::max() ? m_tagPositionsInBytecode : m_subs[subId]->m_tagPositionsInBytecode; assertThrow(tagId < tagPositions.size(), AssemblyException, "Reference to non-existing tag."); size_t pos = tagPositions[tagId]; - assertThrow(pos != numeric_limits::max(), AssemblyException, "Reference to tag without position."); + assertThrow(pos != std::numeric_limits::max(), AssemblyException, "Reference to tag without position."); assertThrow(numberEncodingSize(pos) <= bytesPerTag, AssemblyException, "Tag too large for reserved space."); bytesRef r(ret.bytecode.data() + i.first, bytesPerTag); toBigEndian(pos, r); @@ -725,7 +724,7 @@ LinkerObject const& Assembly::assemble() const for (auto const& [name, tagInfo]: m_namedTags) { size_t position = m_tagPositionsInBytecode.at(tagInfo.id); - optional tagIndex; + std::optional tagIndex; for (auto&& [index, item]: m_items | ranges::views::enumerate) if (item.type() == Tag && static_cast(item.data()) == tagInfo.id) { @@ -733,7 +732,7 @@ LinkerObject const& Assembly::assemble() const break; } ret.functionDebugData[name] = { - position == numeric_limits::max() ? nullopt : optional{position}, + position == std::numeric_limits::max() ? std::nullopt : std::optional{position}, tagIndex, tagInfo.sourceID, tagInfo.params, @@ -764,7 +763,7 @@ LinkerObject const& Assembly::assemble() const return ret; } -vector Assembly::decodeSubPath(size_t _subObjectId) const +std::vector Assembly::decodeSubPath(size_t _subObjectId) const { if (_subObjectId < m_subs.size()) return {_subObjectId}; @@ -779,7 +778,7 @@ vector Assembly::decodeSubPath(size_t _subObjectId) const return subIdPathIt->first; } -size_t Assembly::encodeSubPath(vector const& _subPath) +size_t Assembly::encodeSubPath(std::vector const& _subPath) { assertThrow(!_subPath.empty(), AssemblyException, ""); if (_subPath.size() == 1) @@ -790,7 +789,7 @@ size_t Assembly::encodeSubPath(vector const& _subPath) if (m_subPaths.find(_subPath) == m_subPaths.end()) { - size_t objectId = numeric_limits::max() - m_subPaths.size(); + size_t objectId = std::numeric_limits::max() - m_subPaths.size(); assertThrow(objectId >= m_subs.size(), AssemblyException, ""); m_subPaths[_subPath] = objectId; } @@ -800,7 +799,7 @@ size_t Assembly::encodeSubPath(vector const& _subPath) Assembly const* Assembly::subAssemblyById(size_t _subId) const { - vector subIds = decodeSubPath(_subId); + std::vector subIds = decodeSubPath(_subId); Assembly const* currentAssembly = this; for (size_t currentSubId: subIds) { diff --git a/libevmasm/AssemblyItem.cpp b/libevmasm/AssemblyItem.cpp index 5661fb94021e..6c2b673c697d 100644 --- a/libevmasm/AssemblyItem.cpp +++ b/libevmasm/AssemblyItem.cpp @@ -30,7 +30,7 @@ #include #include -using namespace std; +using namespace std::literals; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::langutil; @@ -40,10 +40,10 @@ static_assert(sizeof(size_t) <= 8, "size_t must be at most 64-bits wide"); namespace { -string toStringInHex(u256 _value) +std::string toStringInHex(u256 _value) { - stringstream hexStr; - hexStr << uppercase << hex << _value; + std::stringstream hexStr; + hexStr << std::uppercase << std::hex << _value; return hexStr.str(); } @@ -60,16 +60,16 @@ AssemblyItem AssemblyItem::toSubAssemblyTag(size_t _subId) const return r; } -pair AssemblyItem::splitForeignPushTag() const +std::pair AssemblyItem::splitForeignPushTag() const { assertThrow(m_type == PushTag || m_type == Tag, util::Exception, ""); u256 combined = u256(data()); size_t subId = static_cast((combined >> 64) - 1); size_t tag = static_cast(combined & 0xffffffffffffffffULL); - return make_pair(subId, tag); + return std::make_pair(subId, tag); } -pair AssemblyItem::nameAndData(langutil::EVMVersion _evmVersion) const +std::pair AssemblyItem::nameAndData(langutil::EVMVersion _evmVersion) const { switch (type()) { @@ -111,7 +111,7 @@ void AssemblyItem::setPushTagSubIdAndTag(size_t _subId, size_t _tag) { assertThrow(m_type == PushTag || m_type == Tag, util::Exception, ""); u256 data = _tag; - if (_subId != numeric_limits::max()) + if (_subId != std::numeric_limits::max()) data |= (u256(_subId) + 1) << 64; setData(data); } @@ -124,7 +124,7 @@ size_t AssemblyItem::bytesRequired(size_t _addressLength, Precision _precision) case Tag: // 1 byte for the JUMPDEST return 1; case Push: - return 1 + max(1, numberEncodingSize(data())); + return 1 + std::max(1, numberEncodingSize(data())); case PushSubSize: case PushProgramSize: return 1 + 4; // worst case: a 16MB program @@ -158,7 +158,7 @@ size_t AssemblyItem::bytesRequired(size_t _addressLength, Precision _precision) return 2; } case VerbatimBytecode: - return get<2>(*m_verbatimBytecode).size(); + return std::get<2>(*m_verbatimBytecode).size(); default: break; } @@ -172,7 +172,7 @@ size_t AssemblyItem::arguments() const // the same across all EVM versions except for the instruction name. return static_cast(instructionInfo(instruction(), EVMVersion()).args); else if (type() == VerbatimBytecode) - return get<0>(*m_verbatimBytecode); + return std::get<0>(*m_verbatimBytecode); else if (type() == AssignImmutable) return 2; else @@ -200,7 +200,7 @@ size_t AssemblyItem::returnValues() const case Tag: return 0; case VerbatimBytecode: - return get<1>(*m_verbatimBytecode); + return std::get<1>(*m_verbatimBytecode); default: break; } @@ -233,7 +233,7 @@ bool AssemblyItem::canBeFunctional() const return false; } -string AssemblyItem::getJumpTypeAsString() const +std::string AssemblyItem::getJumpTypeAsString() const { switch (m_jumpType) { @@ -247,9 +247,9 @@ string AssemblyItem::getJumpTypeAsString() const } } -string AssemblyItem::toAssemblyText(Assembly const& _assembly) const +std::string AssemblyItem::toAssemblyText(Assembly const& _assembly) const { - string text; + std::string text; switch (type()) { case Operation: @@ -265,26 +265,26 @@ string AssemblyItem::toAssemblyText(Assembly const& _assembly) const { size_t sub{0}; size_t tag{0}; - tie(sub, tag) = splitForeignPushTag(); - if (sub == numeric_limits::max()) - text = string("tag_") + to_string(tag); + std::tie(sub, tag) = splitForeignPushTag(); + if (sub == std::numeric_limits::max()) + text = std::string("tag_") + std::to_string(tag); else - text = string("tag_") + to_string(sub) + "_" + to_string(tag); + text = std::string("tag_") + std::to_string(sub) + "_" + std::to_string(tag); break; } case Tag: assertThrow(data() < 0x10000, AssemblyException, "Declaration of sub-assembly tag."); - text = string("tag_") + to_string(static_cast(data())) + ":"; + text = std::string("tag_") + std::to_string(static_cast(data())) + ":"; break; case PushData: - text = string("data_") + toHex(data()); + text = std::string("data_") + toHex(data()); break; case PushSub: case PushSubSize: { - vector subPathComponents; + std::vector subPathComponents; for (size_t subPathComponentId: _assembly.decodeSubPath(static_cast(data()))) - subPathComponents.emplace_back("sub_" + to_string(subPathComponentId)); + subPathComponents.emplace_back("sub_" + std::to_string(subPathComponentId)); text = (type() == PushSub ? "dataOffset"s : "dataSize"s) + "(" + @@ -293,25 +293,25 @@ string AssemblyItem::toAssemblyText(Assembly const& _assembly) const break; } case PushProgramSize: - text = string("bytecodeSize"); + text = std::string("bytecodeSize"); break; case PushLibraryAddress: - text = string("linkerSymbol(\"") + toHex(data()) + string("\")"); + text = std::string("linkerSymbol(\"") + toHex(data()) + std::string("\")"); break; case PushDeployTimeAddress: - text = string("deployTimeAddress()"); + text = std::string("deployTimeAddress()"); break; case PushImmutable: - text = string("immutable(\"") + "0x" + util::toHex(toCompactBigEndian(data(), 1)) + "\")"; + text = std::string("immutable(\"") + "0x" + util::toHex(toCompactBigEndian(data(), 1)) + "\")"; break; case AssignImmutable: - text = string("assignImmutable(\"") + "0x" + util::toHex(toCompactBigEndian(data(), 1)) + "\")"; + text = std::string("assignImmutable(\"") + "0x" + util::toHex(toCompactBigEndian(data(), 1)) + "\")"; break; case UndefinedItem: assertThrow(false, AssemblyException, "Invalid assembly item."); break; case VerbatimBytecode: - text = string("verbatimbytecode_") + util::toHex(get<2>(*m_verbatimBytecode)); + text = std::string("verbatimbytecode_") + util::toHex(std::get<2>(*m_verbatimBytecode)); break; default: assertThrow(false, InvalidOpcode, ""); @@ -328,7 +328,7 @@ string AssemblyItem::toAssemblyText(Assembly const& _assembly) const } // Note: This method is exclusively used for debugging. -ostream& solidity::evmasm::operator<<(ostream& _out, AssemblyItem const& _item) +std::ostream& solidity::evmasm::operator<<(std::ostream& _out, AssemblyItem const& _item) { switch (_item.type()) { @@ -338,12 +338,12 @@ ostream& solidity::evmasm::operator<<(ostream& _out, AssemblyItem const& _item) _out << "\t" << _item.getJumpTypeAsString(); break; case Push: - _out << " PUSH " << hex << _item.data() << dec; + _out << " PUSH " << std::hex << _item.data() << std::dec; break; case PushTag: { size_t subId = _item.splitForeignPushTag().first; - if (subId == numeric_limits::max()) + if (subId == std::numeric_limits::max()) _out << " PushTag " << _item.splitForeignPushTag().second; else _out << " PushTag " << subId << ":" << _item.splitForeignPushTag().second; @@ -353,20 +353,20 @@ ostream& solidity::evmasm::operator<<(ostream& _out, AssemblyItem const& _item) _out << " Tag " << _item.data(); break; case PushData: - _out << " PushData " << hex << static_cast(_item.data()) << dec; + _out << " PushData " << std::hex << static_cast(_item.data()) << std::dec; break; case PushSub: - _out << " PushSub " << hex << static_cast(_item.data()) << dec; + _out << " PushSub " << std::hex << static_cast(_item.data()) << std::dec; break; case PushSubSize: - _out << " PushSubSize " << hex << static_cast(_item.data()) << dec; + _out << " PushSubSize " << std::hex << static_cast(_item.data()) << std::dec; break; case PushProgramSize: _out << " PushProgramSize"; break; case PushLibraryAddress: { - string hash(util::h256((_item.data())).hex()); + std::string hash(util::h256((_item.data())).hex()); _out << " PushLibraryAddress " << hash.substr(0, 8) + "..." + hash.substr(hash.length() - 8); break; } @@ -411,12 +411,12 @@ size_t AssemblyItem::opcodeCount() const noexcept } } -string AssemblyItem::computeSourceMapping( +std::string AssemblyItem::computeSourceMapping( AssemblyItems const& _items, - map const& _sourceIndicesMap + std::map const& _sourceIndicesMap ) { - string ret; + std::string ret; int prevStart = -1; int prevLength = -1; @@ -465,17 +465,17 @@ string AssemblyItem::computeSourceMapping( if (components-- > 0) { if (location.start != prevStart) - ret += to_string(location.start); + ret += std::to_string(location.start); if (components-- > 0) { ret += ':'; if (length != prevLength) - ret += to_string(length); + ret += std::to_string(length); if (components-- > 0) { ret += ':'; if (sourceIndex != prevSourceIndex) - ret += to_string(sourceIndex); + ret += std::to_string(sourceIndex); if (components-- > 0) { ret += ':'; @@ -485,7 +485,7 @@ string AssemblyItem::computeSourceMapping( { ret += ':'; if (modifierDepth != prevModifierDepth) - ret += to_string(modifierDepth); + ret += std::to_string(modifierDepth); } } } @@ -493,7 +493,7 @@ string AssemblyItem::computeSourceMapping( } if (item.opcodeCount() > 1) - ret += string(item.opcodeCount() - 1, ';'); + ret += std::string(item.opcodeCount() - 1, ';'); prevStart = location.start; prevLength = length; diff --git a/libevmasm/BlockDeduplicator.cpp b/libevmasm/BlockDeduplicator.cpp index 5f9fa768ffde..c978bae2bb39 100644 --- a/libevmasm/BlockDeduplicator.cpp +++ b/libevmasm/BlockDeduplicator.cpp @@ -30,7 +30,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; @@ -49,7 +48,7 @@ bool BlockDeduplicator::deduplicate() ) return false; - function comparator = [&](size_t _i, size_t _j) + std::function comparator = [&](size_t _i, size_t _j) { if (_i == _j) return false; @@ -81,7 +80,7 @@ bool BlockDeduplicator::deduplicate() for (; ; ++iterations) { //@todo this should probably be optimized. - set> blocksSeen(comparator); + std::set> blocksSeen(comparator); for (size_t i = 0; i < m_items.size(); ++i) { if (m_items.at(i).type() != Tag) @@ -101,7 +100,7 @@ bool BlockDeduplicator::deduplicate() bool BlockDeduplicator::applyTagReplacement( AssemblyItems& _items, - map const& _replacements, + std::map const& _replacements, size_t _subId ) { @@ -111,7 +110,7 @@ bool BlockDeduplicator::applyTagReplacement( { size_t subId; size_t tagId; - tie(subId, tagId) = item.splitForeignPushTag(); + std::tie(subId, tagId) = item.splitForeignPushTag(); if (subId != _subId) continue; auto it = _replacements.find(tagId); diff --git a/libevmasm/CommonSubexpressionEliminator.cpp b/libevmasm/CommonSubexpressionEliminator.cpp index d097f3c725f0..de1e5a364aca 100644 --- a/libevmasm/CommonSubexpressionEliminator.cpp +++ b/libevmasm/CommonSubexpressionEliminator.cpp @@ -30,12 +30,11 @@ #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::langutil; -vector CommonSubexpressionEliminator::getOptimizedItems() +std::vector CommonSubexpressionEliminator::getOptimizedItems() { optimizeBreakingItem(); @@ -52,11 +51,11 @@ vector CommonSubexpressionEliminator::getOptimizedItems() m_state = std::move(nextState); }); - map initialStackContents; - map targetStackContents; + std::map initialStackContents; + std::map targetStackContents; int minHeight = m_state.stackHeight() + 1; if (!m_state.stackElements().empty()) - minHeight = min(minHeight, m_state.stackElements().begin()->first); + minHeight = std::min(minHeight, m_state.stackElements().begin()->first); for (int height = minHeight; height <= m_initialState.stackHeight(); ++height) initialStackContents[height] = m_initialState.stackElement(height, SourceLocation()); for (int height = minHeight; height <= m_state.stackHeight(); ++height) @@ -125,19 +124,19 @@ void CommonSubexpressionEliminator::optimizeBreakingItem() CSECodeGenerator::CSECodeGenerator( ExpressionClasses& _expressionClasses, - vector const& _storeOperations + std::vector const& _storeOperations ): m_expressionClasses(_expressionClasses) { for (auto const& store: _storeOperations) - m_storeOperations[make_pair(store.target, store.slot)].push_back(store); + m_storeOperations[std::make_pair(store.target, store.slot)].push_back(store); } AssemblyItems CSECodeGenerator::generateCode( unsigned _initialSequenceNumber, int _initialStackHeight, - map const& _initialStack, - map const& _targetStackContents + std::map const& _initialStack, + std::map const& _targetStackContents ) { m_stackHeight = _initialStackHeight; @@ -156,7 +155,7 @@ AssemblyItems CSECodeGenerator::generateCode( } // store all needed sequenced expressions - set> sequencedExpressions; + std::set> sequencedExpressions; for (auto const& p: m_neededBy) for (auto id: {p.first, p.second}) if (unsigned seqNr = m_expressionClasses.representative(id).sequenceNumber) @@ -165,7 +164,7 @@ AssemblyItems CSECodeGenerator::generateCode( // @todo quick fix for now. Proper fix needs to choose representative with higher // sequence number during dependency analysis. assertThrow(seqNr >= _initialSequenceNumber, StackTooDeepException, util::stackTooDeepString); - sequencedExpressions.insert(make_pair(seqNr, id)); + sequencedExpressions.insert(std::make_pair(seqNr, id)); } // Perform all operations on storage and memory in order, if they are needed. @@ -230,7 +229,7 @@ void CSECodeGenerator::addDependencies(Id _c) for (Id argument: expr.arguments) { addDependencies(argument); - m_neededBy.insert(make_pair(argument, _c)); + m_neededBy.insert(std::make_pair(argument, _c)); } if (expr.item && expr.item->type() == Operation && ( expr.item->instruction() == Instruction::SLOAD || @@ -294,7 +293,7 @@ void CSECodeGenerator::addDependencies(Id _c) if (it->sequenceNumber < expr.sequenceNumber) latestStore = it->expression; addDependencies(latestStore); - m_neededBy.insert(make_pair(latestStore, _c)); + m_neededBy.insert(std::make_pair(latestStore, _c)); } } } @@ -331,7 +330,7 @@ void CSECodeGenerator::generateClassElement(Id _c, bool _allowSequenced) OptimizerException, "Undefined item requested but not available." ); - vector const& arguments = expr.arguments; + std::vector const& arguments = expr.arguments; for (Id arg: arguments | ranges::views::reverse) generateClassElement(arg); @@ -495,7 +494,7 @@ void CSECodeGenerator::appendOrRemoveSwap(int _fromPosition, SourceLocation cons m_classPositions[m_stack[m_stackHeight]].insert(_fromPosition); m_classPositions[m_stack[_fromPosition]].erase(_fromPosition); m_classPositions[m_stack[_fromPosition]].insert(m_stackHeight); - swap(m_stack[m_stackHeight], m_stack[_fromPosition]); + std::swap(m_stack[m_stackHeight], m_stack[_fromPosition]); } if (m_generatedItems.size() >= 2 && SemanticInformation::isSwapInstruction(m_generatedItems.back()) && diff --git a/libevmasm/ConstantOptimiser.cpp b/libevmasm/ConstantOptimiser.cpp index 5bce21cf1e10..62dbc803bbc2 100644 --- a/libevmasm/ConstantOptimiser.cpp +++ b/libevmasm/ConstantOptimiser.cpp @@ -24,7 +24,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; @@ -39,11 +38,11 @@ unsigned ConstantOptimisationMethod::optimiseConstants( AssemblyItems& _items = _assembly.items(); unsigned optimisations = 0; - map pushes; + std::map pushes; for (AssemblyItem const& item: _items) if (item.type() == Push) pushes[item]++; - map pendingReplacements; + std::map pendingReplacements; for (auto it: pushes) { AssemblyItem const& item = it.first; @@ -108,7 +107,7 @@ size_t ConstantOptimisationMethod::bytesRequired(AssemblyItems const& _items) void ConstantOptimisationMethod::replaceConstants( AssemblyItems& _items, - map const& _replacements + std::map const& _replacements ) { AssemblyItems replaced; @@ -255,7 +254,7 @@ AssemblyItems ComputeMethod::findRepresentation(u256 const& _value) bool ComputeMethod::checkRepresentation(u256 const& _value, AssemblyItems const& _routine) const { // This is a tiny EVM that can only evaluate some instructions. - vector stack; + std::vector stack; for (AssemblyItem const& item: _routine) { switch (item.type()) diff --git a/libevmasm/ControlFlowGraph.cpp b/libevmasm/ControlFlowGraph.cpp index cb648f90f216..9d2927ed9ca4 100644 --- a/libevmasm/ControlFlowGraph.cpp +++ b/libevmasm/ControlFlowGraph.cpp @@ -31,7 +31,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; @@ -64,7 +63,7 @@ void ControlFlowGraph::findLargestTag() { // Assert that it can be converted. BlockId(item.data()); - m_lastUsedId = max(unsigned(item.data()), m_lastUsedId); + m_lastUsedId = std::max(unsigned(item.data()), m_lastUsedId); } } @@ -111,7 +110,7 @@ void ControlFlowGraph::splitBlocks() void ControlFlowGraph::resolveNextLinks() { - map blockByBeginPos; + std::map blockByBeginPos; for (auto const& idAndBlock: m_blocks) if (idAndBlock.second.begin != idAndBlock.second.end) blockByBeginPos[idAndBlock.second.begin] = idAndBlock.first; @@ -138,8 +137,8 @@ void ControlFlowGraph::resolveNextLinks() void ControlFlowGraph::removeUnusedBlocks() { - vector blocksToProcess{BlockId::initial()}; - set neededBlocks{BlockId::initial()}; + std::vector blocksToProcess{BlockId::initial()}; + std::set neededBlocks{BlockId::initial()}; while (!blocksToProcess.empty()) { BasicBlock const& block = m_blocks.at(blocksToProcess.back()); @@ -219,16 +218,16 @@ void ControlFlowGraph::gatherKnowledge() { // @todo actually we know that memory is filled with zeros at the beginning, // we could make use of that. - KnownStatePointer emptyState = make_shared(); + KnownStatePointer emptyState = std::make_shared(); bool unknownJumpEncountered = false; struct WorkQueueItem { BlockId blockId; KnownStatePointer state; - set blocksSeen; + std::set blocksSeen; }; - vector workQueue{WorkQueueItem{BlockId::initial(), emptyState->copy(), set()}}; + std::vector workQueue{WorkQueueItem{BlockId::initial(), emptyState->copy(), std::set()}}; auto addWorkQueueItem = [&](WorkQueueItem const& _currentItem, BlockId _to, KnownStatePointer const& _state) { WorkQueueItem item; @@ -275,7 +274,7 @@ void ControlFlowGraph::gatherKnowledge() assertThrow(block.begin <= pc && pc == block.end - 1, OptimizerException, ""); //@todo in the case of JUMPI, add knowledge about the condition to the state // (for both values of the condition) - set tags = state->tagsInExpression( + std::set tags = state->tagsInExpression( state->stackElement(state->stackHeight(), langutil::SourceLocation{}) ); state->feedItem(m_items.at(pc++)); @@ -289,7 +288,7 @@ void ControlFlowGraph::gatherKnowledge() unknownJumpEncountered = true; for (auto const& it: m_blocks) if (it.second.begin < it.second.end && m_items[it.second.begin].type() == Tag) - workQueue.push_back(WorkQueueItem{it.first, emptyState->copy(), set()}); + workQueue.push_back(WorkQueueItem{it.first, emptyState->copy(), std::set()}); } } else @@ -321,16 +320,16 @@ void ControlFlowGraph::gatherKnowledge() BasicBlocks ControlFlowGraph::rebuildCode() { - map pushes; + std::map pushes; for (auto& idAndBlock: m_blocks) for (BlockId ref: idAndBlock.second.pushedTags) if (m_blocks.count(ref)) pushes[ref]++; - set blocksToAdd; + std::set blocksToAdd; for (auto it: m_blocks) blocksToAdd.insert(it.first); - set blocksAdded; + std::set blocksAdded; BasicBlocks blocks; for ( diff --git a/libevmasm/Disassemble.cpp b/libevmasm/Disassemble.cpp index f1c904b6998d..27e860661d63 100644 --- a/libevmasm/Disassemble.cpp +++ b/libevmasm/Disassemble.cpp @@ -22,7 +22,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; @@ -31,7 +30,7 @@ using namespace solidity::evmasm; void solidity::evmasm::eachInstruction( bytes const& _mem, langutil::EVMVersion _evmVersion, - function const& _onInstruction + std::function const& _onInstruction ) { for (auto it = _mem.begin(); it < _mem.end(); ++it) @@ -58,9 +57,9 @@ void solidity::evmasm::eachInstruction( } } -string solidity::evmasm::disassemble(bytes const& _mem, langutil::EVMVersion _evmVersion, string const& _delimiter) +std::string solidity::evmasm::disassemble(bytes const& _mem, langutil::EVMVersion _evmVersion, std::string const& _delimiter) { - stringstream ret; + std::stringstream ret; eachInstruction(_mem, _evmVersion, [&](Instruction _instr, u256 const& _data) { if (!isValidInstruction(_instr)) ret << "0x" << std::uppercase << std::hex << static_cast(_instr) << _delimiter; diff --git a/libevmasm/ExpressionClasses.cpp b/libevmasm/ExpressionClasses.cpp index 8cd97b6a8942..dd66eea32840 100644 --- a/libevmasm/ExpressionClasses.cpp +++ b/libevmasm/ExpressionClasses.cpp @@ -34,7 +34,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::langutil; @@ -58,10 +57,10 @@ bool ExpressionClasses::Expression::operator==(ExpressionClasses::Expression con std::tie(_other.item->data(), _other.arguments, _other.sequenceNumber); } -std::size_t ExpressionClasses::Expression::ExpressionHash::operator()(Expression const& _expression) const +size_t ExpressionClasses::Expression::ExpressionHash::operator()(Expression const& _expression) const { assertThrow(!!_expression.item, OptimizerException, ""); - std::size_t seed = 0; + size_t seed = 0; auto type = _expression.item->type(); boost::hash_combine(seed, type); @@ -171,7 +170,7 @@ bool ExpressionClasses::knownNonZero(Id _c) u256 const* ExpressionClasses::knownConstant(Id _c) { - map matchGroups; + std::map matchGroups; Pattern constant(Push); constant.setMatchGroup(1, matchGroups); if (!constant.matches(representative(_c), *this)) @@ -181,15 +180,15 @@ u256 const* ExpressionClasses::knownConstant(Id _c) AssemblyItem const* ExpressionClasses::storeItem(AssemblyItem const& _item) { - m_spareAssemblyItems.push_back(make_shared(_item)); + m_spareAssemblyItems.push_back(std::make_shared(_item)); return m_spareAssemblyItems.back().get(); } -string ExpressionClasses::fullDAGToString(ExpressionClasses::Id _id) const +std::string ExpressionClasses::fullDAGToString(ExpressionClasses::Id _id) const { Expression const& expr = representative(_id); - stringstream str; - str << dec << expr.id << ":"; + std::stringstream str; + str << std::dec << expr.id << ":"; if (expr.item) { str << *expr.item << "("; @@ -212,25 +211,25 @@ ExpressionClasses::Id ExpressionClasses::tryToSimplify(Expression const& _expr) _expr.item->type() != Operation || !SemanticInformation::isDeterministic(*_expr.item) ) - return numeric_limits::max(); + return std::numeric_limits::max(); if (auto match = rules.findFirstMatch(_expr, *this)) { // Debug info if (false) { - cout << "Simplifying " << *_expr.item << "("; + std::cout << "Simplifying " << *_expr.item << "("; for (Id arg: _expr.arguments) - cout << fullDAGToString(arg) << ", "; - cout << ")" << endl; - cout << "with rule " << match->pattern.toString() << endl; - cout << "to " << match->action().toString() << endl; + std::cout << fullDAGToString(arg) << ", "; + std::cout << ")" << std::endl; + std::cout << "with rule " << match->pattern.toString() << std::endl; + std::cout << "to " << match->action().toString() << std::endl; } return rebuildExpression(ExpressionTemplate(match->action(), _expr.item->location())); } - return numeric_limits::max(); + return std::numeric_limits::max(); } ExpressionClasses::Id ExpressionClasses::rebuildExpression(ExpressionTemplate const& _template) diff --git a/libevmasm/GasMeter.cpp b/libevmasm/GasMeter.cpp index 6a0c597db00f..271a6ce2de3c 100644 --- a/libevmasm/GasMeter.cpp +++ b/libevmasm/GasMeter.cpp @@ -20,7 +20,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; @@ -32,7 +31,7 @@ GasMeter::GasConsumption& GasMeter::GasConsumption::operator+=(GasConsumption co if (isInfinite) return *this; bigint v = bigint(value) + _other.value; - if (v > numeric_limits::max()) + if (v > std::numeric_limits::max()) *this = infinite(); else value = u256(v); diff --git a/libevmasm/Inliner.cpp b/libevmasm/Inliner.cpp index d365e312a939..ded5172ddc3a 100644 --- a/libevmasm/Inliner.cpp +++ b/libevmasm/Inliner.cpp @@ -38,7 +38,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; @@ -54,7 +53,7 @@ u256 executionCost(RangeType const& _itemRange, langutil::EVMVersion _evmVersion [&gasMeter](auto const& _item) { return gasMeter.estimateMax(_item, false); } ), GasMeter::GasConsumption()); if (gasConsumption.isInfinite) - return numeric_limits::max(); + return std::numeric_limits::max(); else return gasConsumption.value; } @@ -66,14 +65,14 @@ uint64_t codeSize(RangeType const& _itemRange) [](auto const& _item) { return _item.bytesRequired(2, Precision::Approximate); } ), 0u); } -/// @returns the tag id, if @a _item is a PushTag or Tag into the current subassembly, nullopt otherwise. -optional getLocalTag(AssemblyItem const& _item) +/// @returns the tag id, if @a _item is a PushTag or Tag into the current subassembly, std::nullopt otherwise. +std::optional getLocalTag(AssemblyItem const& _item) { if (_item.type() != PushTag && _item.type() != Tag) - return nullopt; + return std::nullopt; auto [subId, tag] = _item.splitForeignPushTag(); - if (subId != numeric_limits::max()) - return nullopt; + if (subId != std::numeric_limits::max()) + return std::nullopt; return tag; } } @@ -99,7 +98,7 @@ bool Inliner::isInlineCandidate(size_t _tag, ranges::span _i return true; } -map Inliner::determineInlinableBlocks(AssemblyItems const& _items) const +std::map Inliner::determineInlinableBlocks(AssemblyItems const& _items) const { std::map> inlinableBlockItems; std::map numPushTags; @@ -108,7 +107,7 @@ map Inliner::determineInlinableBlocks(AssemblyI { // The number of PushTags approximates the number of calls to a block. if (item.type() == PushTag) - if (optional tag = getLocalTag(item)) + if (std::optional tag = getLocalTag(item)) ++numPushTags[*tag]; // We can only inline blocks with straight control flow that end in a jump. @@ -116,7 +115,7 @@ map Inliner::determineInlinableBlocks(AssemblyI if (lastTag && SemanticInformation::breaksCSEAnalysisBlock(item, false)) { ranges::span block = _items | ranges::views::slice(*lastTag + 1, index + 1); - if (optional tag = getLocalTag(_items[*lastTag])) + if (std::optional tag = getLocalTag(_items[*lastTag])) if (isInlineCandidate(*tag, block)) inlinableBlockItems[*tag] = block; lastTag.reset(); @@ -130,7 +129,7 @@ map Inliner::determineInlinableBlocks(AssemblyI } // Store the number of PushTags alongside the assembly items and discard tags that are never pushed. - map result; + std::map result; for (auto&& [tag, items]: inlinableBlockItems) if (uint64_t const* numPushes = util::valueOrNullptr(numPushTags, tag)) result.emplace(tag, InlinableBlock{items, *numPushes}); @@ -199,7 +198,7 @@ bool Inliner::shouldInlineFullFunctionBody(size_t _tag, ranges::span Inliner::shouldInline(size_t _tag, AssemblyItem const& _jump, InlinableBlock const& _block) const +std::optional Inliner::shouldInline(size_t _tag, AssemblyItem const& _jump, InlinableBlock const& _block) const { assertThrow(_jump == Instruction::JUMP, OptimizerException, ""); AssemblyItem blockExit = _block.items.back(); @@ -232,7 +231,7 @@ optional Inliner::shouldInline(size_t _tag, AssemblyItem const& _j return blockExit; } - return nullopt; + return std::nullopt; } @@ -252,7 +251,7 @@ void Inliner::optimise() AssemblyItem const& nextItem = *next(it); if (item.type() == PushTag && nextItem == Instruction::JUMP) { - if (optional tag = getLocalTag(item)) + if (std::optional tag = getLocalTag(item)) if (auto* inlinableBlock = util::valueOrNullptr(inlinableBlocks, *tag)) if (auto exitItem = shouldInline(*tag, nextItem, *inlinableBlock)) { @@ -264,7 +263,7 @@ void Inliner::optimise() // We might increase the number of push tags to other blocks. for (AssemblyItem const& inlinedItem: inlinableBlock->items) if (inlinedItem.type() == PushTag) - if (optional duplicatedTag = getLocalTag(inlinedItem)) + if (std::optional duplicatedTag = getLocalTag(inlinedItem)) if (auto* block = util::valueOrNullptr(inlinableBlocks, *duplicatedTag)) ++block->pushTagCount; diff --git a/libevmasm/Instruction.cpp b/libevmasm/Instruction.cpp index 2c313fd752ac..174d12b5e355 100644 --- a/libevmasm/Instruction.cpp +++ b/libevmasm/Instruction.cpp @@ -22,7 +22,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; @@ -335,7 +334,7 @@ InstructionInfo solidity::evmasm::instructionInfo(Instruction _inst, langutil::E } catch (...) { - return InstructionInfo({"(_inst)) + ">", 0, 0, 0, false, Tier::Invalid}); + return InstructionInfo({"(_inst)) + ">", 0, 0, 0, false, Tier::Invalid}); } } diff --git a/libevmasm/JumpdestRemover.cpp b/libevmasm/JumpdestRemover.cpp index 2c0c5875efe7..7afa715a88df 100644 --- a/libevmasm/JumpdestRemover.cpp +++ b/libevmasm/JumpdestRemover.cpp @@ -26,14 +26,13 @@ #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; -bool JumpdestRemover::optimise(set const& _tagsReferencedFromOutside) +bool JumpdestRemover::optimise(std::set const& _tagsReferencedFromOutside) { - set references{referencedTags(m_items, numeric_limits::max())}; + std::set references{referencedTags(m_items, std::numeric_limits::max())}; references.insert(_tagsReferencedFromOutside.begin(), _tagsReferencedFromOutside.end()); size_t initialSize = m_items.size(); @@ -46,7 +45,7 @@ bool JumpdestRemover::optimise(set const& _tagsReferencedFromOutside) if (_item.type() != Tag) return false; auto asmIdAndTag = _item.splitForeignPushTag(); - assertThrow(asmIdAndTag.first == numeric_limits::max(), OptimizerException, "Sub-assembly tag used as label."); + assertThrow(asmIdAndTag.first == std::numeric_limits::max(), OptimizerException, "Sub-assembly tag used as label."); size_t tag = asmIdAndTag.second; return !references.count(tag); } @@ -55,9 +54,9 @@ bool JumpdestRemover::optimise(set const& _tagsReferencedFromOutside) return m_items.size() != initialSize; } -set JumpdestRemover::referencedTags(AssemblyItems const& _items, size_t _subId) +std::set JumpdestRemover::referencedTags(AssemblyItems const& _items, size_t _subId) { - set ret; + std::set ret; for (auto const& item: _items) if (item.type() == PushTag) { diff --git a/libevmasm/KnownState.cpp b/libevmasm/KnownState.cpp index a2bda5af713e..91f798bf3890 100644 --- a/libevmasm/KnownState.cpp +++ b/libevmasm/KnownState.cpp @@ -28,17 +28,16 @@ #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::langutil; -ostream& KnownState::stream(ostream& _out) const +std::ostream& KnownState::stream(std::ostream& _out) const { - auto streamExpressionClass = [this](ostream& _out, Id _id) + auto streamExpressionClass = [this](std::ostream& _out, Id _id) { auto const& expr = m_expressionClasses->representative(_id); - _out << " " << dec << _id << ": "; + _out << " " << std::dec << _id << ": "; if (!expr.item) _out << " no item"; else if (expr.item->type() == UndefinedItem) @@ -46,26 +45,26 @@ ostream& KnownState::stream(ostream& _out) const else _out << *expr.item; if (expr.sequenceNumber) - _out << "@" << dec << expr.sequenceNumber; + _out << "@" << std::dec << expr.sequenceNumber; _out << "("; for (Id arg: expr.arguments) - _out << dec << arg << ","; - _out << ")" << endl; + _out << std::dec << arg << ","; + _out << ")" << std::endl; }; - _out << "=== State ===" << endl; - _out << "Stack height: " << dec << m_stackHeight << endl; - _out << "Equivalence classes:" << endl; + _out << "=== State ===" << std::endl; + _out << "Stack height: " << std::dec << m_stackHeight << std::endl; + _out << "Equivalence classes:" << std::endl; for (Id eqClass = 0; eqClass < m_expressionClasses->size(); ++eqClass) streamExpressionClass(_out, eqClass); - _out << "Stack:" << endl; + _out << "Stack:" << std::endl; for (auto const& it: m_stackElements) { - _out << " " << dec << it.first << ": "; + _out << " " << std::dec << it.first << ": "; streamExpressionClass(_out, it.second); } - _out << "Storage:" << endl; + _out << "Storage:" << std::endl; for (auto const& it: m_storageContent) { _out << " "; @@ -73,7 +72,7 @@ ostream& KnownState::stream(ostream& _out) const _out << ": "; streamExpressionClass(_out, it.second); } - _out << "Memory:" << endl; + _out << "Memory:" << std::endl; for (auto const& it: m_memoryContent) { _out << " "; @@ -149,7 +148,7 @@ KnownState::StoreOperation KnownState::feedItem(AssemblyItem const& _item, bool ); else if (instruction != Instruction::POP) { - vector arguments(static_cast(info.args)); + std::vector arguments(static_cast(info.args)); for (size_t i = 0; i < static_cast(info.args); ++i) arguments[i] = stackElement(m_stackHeight - static_cast(i), _item.location()); switch (_item.instruction()) @@ -233,8 +232,8 @@ void KnownState::reduceToCommonKnowledge(KnownState const& _other, bool _combine ++it; else { - set theseTags = tagsInExpression(it->second); - set otherTags = tagsInExpression(other); + std::set theseTags = tagsInExpression(it->second); + std::set otherTags = tagsInExpression(other); if (!theseTags.empty() && !otherTags.empty()) { theseTags.insert(otherTags.begin(), otherTags.end()); @@ -251,7 +250,7 @@ void KnownState::reduceToCommonKnowledge(KnownState const& _other, bool _combine // Use the smaller stack height. Essential to terminate in case of loops. if (m_stackHeight > _other.m_stackHeight) { - map shiftedStack; + std::map shiftedStack; for (auto const& stackElement: m_stackElements) shiftedStack[stackElement.first - stackDiff] = stackElement.second; m_stackElements = std::move(shiftedStack); @@ -261,7 +260,7 @@ void KnownState::reduceToCommonKnowledge(KnownState const& _other, bool _combine intersect(m_storageContent, _other.m_storageContent); intersect(m_memoryContent, _other.m_memoryContent); if (_combineSequenceNumbers) - m_sequenceNumber = max(m_sequenceNumber, _other.m_sequenceNumber); + m_sequenceNumber = std::max(m_sequenceNumber, _other.m_sequenceNumber); } bool KnownState::operator==(KnownState const& _other) const @@ -316,7 +315,7 @@ void KnownState::swapStackElements( stackElement(_stackHeightA, _location); stackElement(_stackHeightB, _location); - swap(m_stackElements[_stackHeightA], m_stackElements[_stackHeightB]); + std::swap(m_stackElements[_stackHeightA], m_stackElements[_stackHeightB]); } KnownState::StoreOperation KnownState::storeInStorage( @@ -400,7 +399,7 @@ KnownState::Id KnownState::applyKeccak256( if (!l || *l > 128) return m_expressionClasses->find(keccak256Item, {_start, _length}, true, m_sequenceNumber); unsigned length = unsigned(*l); - vector arguments; + std::vector arguments; for (unsigned i = 0; i < length; i += 32) { Id slot = m_expressionClasses->find( @@ -426,19 +425,19 @@ KnownState::Id KnownState::applyKeccak256( return m_knownKeccak256Hashes[{arguments, length}] = v; } -set KnownState::tagsInExpression(KnownState::Id _expressionId) +std::set KnownState::tagsInExpression(KnownState::Id _expressionId) { if (m_tagUnions.left.count(_expressionId)) return m_tagUnions.left.at(_expressionId); // Might be a tag, then return the set of itself. ExpressionClasses::Expression expr = m_expressionClasses->representative(_expressionId); if (expr.item && expr.item->type() == PushTag) - return set({expr.item->data()}); + return std::set({expr.item->data()}); else - return set(); + return std::set(); } -KnownState::Id KnownState::tagUnion(set _tags) +KnownState::Id KnownState::tagUnion(std::set _tags) { if (m_tagUnions.right.count(_tags)) return m_tagUnions.right.at(_tags); diff --git a/libevmasm/LinkerObject.cpp b/libevmasm/LinkerObject.cpp index 5a0631e3295c..1b09f4ced0ae 100644 --- a/libevmasm/LinkerObject.cpp +++ b/libevmasm/LinkerObject.cpp @@ -24,7 +24,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; @@ -36,24 +35,24 @@ void LinkerObject::append(LinkerObject const& _other) bytecode += _other.bytecode; } -void LinkerObject::link(map const& _libraryAddresses) +void LinkerObject::link(std::map const& _libraryAddresses) { std::map remainingRefs; for (auto const& linkRef: linkReferences) if (h160 const* address = matchLibrary(linkRef.second, _libraryAddresses)) - copy(address->data(), address->data() + 20, bytecode.begin() + vector::difference_type(linkRef.first)); + copy(address->data(), address->data() + 20, bytecode.begin() + std::vector::difference_type(linkRef.first)); else remainingRefs.insert(linkRef); linkReferences.swap(remainingRefs); } -string LinkerObject::toHex() const +std::string LinkerObject::toHex() const { - string hex = solidity::util::toHex(bytecode); + std::string hex = solidity::util::toHex(bytecode); for (auto const& ref: linkReferences) { size_t pos = ref.first * 2; - string hash = libraryPlaceholder(ref.second); + std::string hash = libraryPlaceholder(ref.second); hex[pos] = hex[pos + 1] = hex[pos + 38] = hex[pos + 39] = '_'; for (size_t i = 0; i < 36; ++i) hex[pos + 2 + i] = hash.at(i); @@ -61,15 +60,15 @@ string LinkerObject::toHex() const return hex; } -string LinkerObject::libraryPlaceholder(string const& _libraryName) +std::string LinkerObject::libraryPlaceholder(std::string const& _libraryName) { return "$" + keccak256(_libraryName).hex().substr(0, 34) + "$"; } h160 const* LinkerObject::matchLibrary( - string const& _linkRefName, - map const& _libraryAddresses + std::string const& _linkRefName, + std::map const& _libraryAddresses ) { auto it = _libraryAddresses.find(_linkRefName); diff --git a/libevmasm/PathGasMeter.cpp b/libevmasm/PathGasMeter.cpp index c165985cffb0..2acafea22cd4 100644 --- a/libevmasm/PathGasMeter.cpp +++ b/libevmasm/PathGasMeter.cpp @@ -24,7 +24,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; @@ -38,17 +37,17 @@ PathGasMeter::PathGasMeter(AssemblyItems const& _items, langutil::EVMVersion _ev GasMeter::GasConsumption PathGasMeter::estimateMax( size_t _startIndex, - shared_ptr const& _state + std::shared_ptr const& _state ) { - auto path = make_unique(); + auto path = std::make_unique(); path->index = _startIndex; path->state = _state->copy(); queue(std::move(path)); GasMeter::GasConsumption gas; while (!m_queue.empty() && !gas.isInfinite) - gas = max(gas, handleQueueItem()); + gas = std::max(gas, handleQueueItem()); return gas; } @@ -67,10 +66,10 @@ GasMeter::GasConsumption PathGasMeter::handleQueueItem() { assertThrow(!m_queue.empty(), OptimizerException, ""); - unique_ptr path = std::move(m_queue.rbegin()->second); + std::unique_ptr path = std::move(m_queue.rbegin()->second); m_queue.erase(--m_queue.end()); - shared_ptr state = path->state; + std::shared_ptr state = path->state; GasMeter meter(state, m_evmVersion, path->largestMemoryAccess); ExpressionClasses& classes = state->expressionClasses(); GasMeter::GasConsumption gas = path->gas; @@ -82,7 +81,7 @@ GasMeter::GasConsumption PathGasMeter::handleQueueItem() // return the current gas value. return gas; - set jumpTags; + std::set jumpTags; for (; index < m_items.size() && !gas.isInfinite; ++index) { bool branchStops = false; @@ -121,7 +120,7 @@ GasMeter::GasConsumption PathGasMeter::handleQueueItem() for (u256 const& tag: jumpTags) { - auto newPath = make_unique(); + auto newPath = std::make_unique(); newPath->index = m_items.size(); if (m_tagPositions.count(tag)) newPath->index = m_tagPositions.at(tag); diff --git a/libevmasm/PeepholeOptimiser.cpp b/libevmasm/PeepholeOptimiser.cpp index 22d40c8ea1ac..e9231c0a56b0 100644 --- a/libevmasm/PeepholeOptimiser.cpp +++ b/libevmasm/PeepholeOptimiser.cpp @@ -25,7 +25,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; @@ -38,7 +37,7 @@ struct OptimiserState { AssemblyItems const& items; size_t i; - back_insert_iterator out; + std::back_insert_iterator out; }; template @@ -55,8 +54,8 @@ struct SimplePeepholeOptimizerMethod template static bool applyRule( AssemblyItems::const_iterator _in, - back_insert_iterator _out, - index_sequence + std::back_insert_iterator _out, + std::index_sequence ) { return Method::applySimple(_in[Indices]..., _out); @@ -66,7 +65,7 @@ struct SimplePeepholeOptimizerMethod static constexpr size_t WindowSize = FunctionParameterCount::value - 1; if ( _state.i + WindowSize <= _state.items.size() && - applyRule(_state.items.begin() + static_cast(_state.i), _state.out, make_index_sequence{}) + applyRule(_state.items.begin() + static_cast(_state.i), _state.out, std::make_index_sequence{}) ) { _state.i += WindowSize; @@ -81,7 +80,7 @@ struct Identity: SimplePeepholeOptimizerMethod { static bool applySimple( AssemblyItem const& _item, - back_insert_iterator _out + std::back_insert_iterator _out ) { *_out = _item; @@ -94,7 +93,7 @@ struct PushPop: SimplePeepholeOptimizerMethod static bool applySimple( AssemblyItem const& _push, AssemblyItem const& _pop, - back_insert_iterator + std::back_insert_iterator ) { auto t = _push.type(); @@ -111,7 +110,7 @@ struct OpPop: SimplePeepholeOptimizerMethod static bool applySimple( AssemblyItem const& _op, AssemblyItem const& _pop, - back_insert_iterator _out + std::back_insert_iterator _out ) { if (_pop == Instruction::POP && _op.type() == Operation) @@ -133,7 +132,7 @@ struct OpStop: SimplePeepholeOptimizerMethod static bool applySimple( AssemblyItem const& _op, AssemblyItem const& _stop, - back_insert_iterator _out + std::back_insert_iterator _out ) { if (_stop == Instruction::STOP) @@ -164,7 +163,7 @@ struct OpReturnRevert: SimplePeepholeOptimizerMethod AssemblyItem const& _push, AssemblyItem const& _pushOrDup, AssemblyItem const& _returnRevert, - back_insert_iterator _out + std::back_insert_iterator _out ) { if ( @@ -191,7 +190,7 @@ struct DoubleSwap: SimplePeepholeOptimizerMethod static size_t applySimple( AssemblyItem const& _s1, AssemblyItem const& _s2, - back_insert_iterator + std::back_insert_iterator ) { return _s1 == _s2 && SemanticInformation::isSwapInstruction(_s1); @@ -203,7 +202,7 @@ struct DoublePush: SimplePeepholeOptimizerMethod static bool applySimple( AssemblyItem const& _push1, AssemblyItem const& _push2, - back_insert_iterator _out + std::back_insert_iterator _out ) { if (_push1.type() == Push && _push2.type() == Push && _push1.data() == _push2.data()) @@ -222,7 +221,7 @@ struct CommutativeSwap: SimplePeepholeOptimizerMethod static bool applySimple( AssemblyItem const& _swap, AssemblyItem const& _op, - back_insert_iterator _out + std::back_insert_iterator _out ) { // Remove SWAP1 if following instruction is commutative @@ -244,10 +243,10 @@ struct SwapComparison: SimplePeepholeOptimizerMethod static bool applySimple( AssemblyItem const& _swap, AssemblyItem const& _op, - back_insert_iterator _out + std::back_insert_iterator _out ) { - static map const swappableOps{ + static std::map const swappableOps{ { Instruction::LT, Instruction::GT }, { Instruction::GT, Instruction::LT }, { Instruction::SLT, Instruction::SGT }, @@ -274,7 +273,7 @@ struct DupSwap: SimplePeepholeOptimizerMethod static size_t applySimple( AssemblyItem const& _dupN, AssemblyItem const& _swapN, - back_insert_iterator _out + std::back_insert_iterator _out ) { if ( @@ -299,7 +298,7 @@ struct IsZeroIsZeroJumpI: SimplePeepholeOptimizerMethod AssemblyItem const& _iszero2, AssemblyItem const& _pushTag, AssemblyItem const& _jumpi, - back_insert_iterator _out + std::back_insert_iterator _out ) { if ( @@ -325,7 +324,7 @@ struct EqIsZeroJumpI: SimplePeepholeOptimizerMethod AssemblyItem const& _iszero, AssemblyItem const& _pushTag, AssemblyItem const& _jumpi, - back_insert_iterator _out + std::back_insert_iterator _out ) { if ( @@ -354,7 +353,7 @@ struct DoubleJump: SimplePeepholeOptimizerMethod AssemblyItem const& _pushTag2, AssemblyItem const& _jump, AssemblyItem const& _tag1, - back_insert_iterator _out + std::back_insert_iterator _out ) { if ( @@ -383,7 +382,7 @@ struct JumpToNext: SimplePeepholeOptimizerMethod AssemblyItem const& _pushTag, AssemblyItem const& _jump, AssemblyItem const& _tag, - back_insert_iterator _out + std::back_insert_iterator _out ) { if ( @@ -409,7 +408,7 @@ struct TagConjunctions: SimplePeepholeOptimizerMethod AssemblyItem const& _pushTag, AssemblyItem const& _pushConstant, AssemblyItem const& _and, - back_insert_iterator _out + std::back_insert_iterator _out ) { if (_and != Instruction::AND) @@ -444,7 +443,7 @@ struct TruthyAnd: SimplePeepholeOptimizerMethod AssemblyItem const& _push, AssemblyItem const& _not, AssemblyItem const& _and, - back_insert_iterator + std::back_insert_iterator ) { return ( diff --git a/libevmasm/SemanticInformation.cpp b/libevmasm/SemanticInformation.cpp index b6bcc828025b..1971d9d45bb8 100644 --- a/libevmasm/SemanticInformation.cpp +++ b/libevmasm/SemanticInformation.cpp @@ -25,11 +25,10 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; -vector SemanticInformation::readWriteOperations(Instruction _instruction) +std::vector SemanticInformation::readWriteOperations(Instruction _instruction) { switch (_instruction) { @@ -111,7 +110,7 @@ vector SemanticInformation::readWriteOperations( case Instruction::DELEGATECALL: { size_t paramCount = static_cast(instructionInfo(_instruction, langutil::EVMVersion()).args); - vector operations{ + std::vector operations{ Operation{Location::Memory, Effect::Read, paramCount - 4, paramCount - 3, {}}, Operation{Location::Storage, Effect::Read, {}, {}, {}} }; @@ -130,7 +129,7 @@ vector SemanticInformation::readWriteOperations( } case Instruction::CREATE: case Instruction::CREATE2: - return vector{ + return std::vector{ Operation{ Location::Memory, Effect::Read, @@ -143,7 +142,7 @@ vector SemanticInformation::readWriteOperations( }; case Instruction::MSIZE: // This is just to satisfy the assert below. - return vector{}; + return std::vector{}; default: assertThrow(storage(_instruction) == None && memory(_instruction) == None, AssemblyException, ""); } diff --git a/libevmasm/SimplificationRules.cpp b/libevmasm/SimplificationRules.cpp index bcb8da3882ce..ef2d68c7fdaa 100644 --- a/libevmasm/SimplificationRules.cpp +++ b/libevmasm/SimplificationRules.cpp @@ -32,7 +32,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::evmasm; using namespace solidity::langutil; @@ -92,7 +91,7 @@ Rules::Rules() Y.setMatchGroup(6, m_matchGroups); Z.setMatchGroup(7, m_matchGroups); - addRules(simplificationRuleList(nullopt, A, B, C, W, X, Y, Z)); + addRules(simplificationRuleList(std::nullopt, A, B, C, W, X, Y, Z)); assertThrow(isInitialized(), OptimizerException, "Rule list not properly initialized."); } @@ -103,7 +102,7 @@ Pattern::Pattern(Instruction _instruction, std::initializer_list _argum { } -void Pattern::setMatchGroup(unsigned _group, map& _matchGroups) +void Pattern::setMatchGroup(unsigned _group, std::map& _matchGroups) { m_matchGroup = _group; m_matchGroups = &_matchGroups; @@ -135,9 +134,9 @@ AssemblyItem Pattern::toAssemblyItem(SourceLocation const& _location) const return AssemblyItem(m_type, data(), _location); } -string Pattern::toString() const +std::string Pattern::toString() const { - stringstream s; + std::stringstream s; switch (m_type) { case Operation: @@ -146,7 +145,7 @@ string Pattern::toString() const break; case Push: if (m_data) - s << "PUSH " << hex << data(); + s << "PUSH " << std::hex << data(); else s << "PUSH "; break; @@ -155,15 +154,15 @@ string Pattern::toString() const break; default: if (m_data) - s << "t=" << dec << m_type << " d=" << hex << data(); + s << "t=" << std::dec << m_type << " d=" << std::hex << data(); else - s << "t=" << dec << m_type << " d: nullptr"; + s << "t=" << std::dec << m_type << " d: nullptr"; break; } if (!m_requireDataMatch) s << " ~"; if (m_matchGroup) - s << "[" << dec << m_matchGroup << "]"; + s << "[" << std::dec << m_matchGroup << "]"; s << "("; for (Pattern const& p: m_arguments) s << p.toString() << ", "; @@ -216,9 +215,9 @@ ExpressionTemplate::ExpressionTemplate(Pattern const& _pattern, SourceLocation c arguments.emplace_back(arg, _location); } -string ExpressionTemplate::toString() const +std::string ExpressionTemplate::toString() const { - stringstream s; + std::stringstream s; if (hasId) s << id; else From ce0fbae00b5ec37a9faeaf34a90c473c2f743817 Mon Sep 17 00:00:00 2001 From: minaminao Date: Wed, 5 Jul 2023 10:12:49 +0900 Subject: [PATCH 104/138] fix docs Co-authored-by: r0qs --- docs/contracts/interfaces.rst | 2 +- docs/smtchecker.rst | 5 +++-- docs/units-and-global-variables.rst | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/contracts/interfaces.rst b/docs/contracts/interfaces.rst index cc71cf64e652..a3085667b7f4 100644 --- a/docs/contracts/interfaces.rst +++ b/docs/contracts/interfaces.rst @@ -65,7 +65,7 @@ inheritance. Types defined inside interfaces and other contract-like structures can be accessed from other contracts: ``Token.TokenType`` or ``Token.Coin``. -.. warning: +.. warning:: Interfaces have supported ``enum`` types since :doc:`Solidity version 0.5.0 <050-breaking-changes>`, make sure the pragma version specifies this version as a minimum. diff --git a/docs/smtchecker.rst b/docs/smtchecker.rst index b68d58ed331a..f8085b63de6f 100644 --- a/docs/smtchecker.rst +++ b/docs/smtchecker.rst @@ -636,7 +636,7 @@ expression type. It is also helpful to cast the called contract's variable as the type of the most derived type in case of inheritance. - .. code-block:: solidity +.. code-block:: solidity // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0; @@ -697,8 +697,9 @@ storage for ``address`` variables, therefore if ``B.a`` had type ``address`` the encoding would assume that its storage does not change in between transactions to ``B``. - .. code-block:: solidity +.. code-block:: solidity + // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0; contract A { diff --git a/docs/units-and-global-variables.rst b/docs/units-and-global-variables.rst index e7029967953b..d2256884eb48 100644 --- a/docs/units-and-global-variables.rst +++ b/docs/units-and-global-variables.rst @@ -380,7 +380,7 @@ The following properties are available for a contract type ``C``: In addition to the properties above, the following properties are available for an interface type ``I``: -``type(I).interfaceId``: +``type(I).interfaceId`` A ``bytes4`` value containing the `EIP-165 `_ interface identifier of the given interface ``I``. This identifier is defined as the ``XOR`` of all function selectors defined within the interface itself - excluding all inherited functions. From 09c30566eb9264bd81b6e57cd89cc2288b835c37 Mon Sep 17 00:00:00 2001 From: Cliff Syner <33703995+alpinevm@users.noreply.github.com> Date: Mon, 10 Jul 2023 09:20:10 -0500 Subject: [PATCH 105/138] Formatting docs/using-the-compiler.rst Co-authored-by: Nuno Santos --- docs/using-the-compiler.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 6e6a64bb28f8..3c0c1a70b609 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -316,7 +316,8 @@ Input Description }, // Version of the EVM to compile for. // Affects type checking and code generation. Can be homestead, - // tangerineWhistle, spuriousDragon, byzantium, constantinople, petersburg, istanbul, berlin, london, paris or shanghai + // tangerineWhistle, spuriousDragon, byzantium, constantinople, + // petersburg, istanbul, berlin, london, paris or shanghai (default) "evmVersion": "byzantium", // Optional: Change compilation pipeline to go through the Yul intermediate representation. // This is false by default. From 919408901da4be2d958045a2b1c14e238b311102 Mon Sep 17 00:00:00 2001 From: r0qs Date: Mon, 10 Jul 2023 14:20:55 +0200 Subject: [PATCH 106/138] Remove token requirement from external contributor greeter --- .github/workflows/welcome-external-pr.yml | 32 +++-------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/.github/workflows/welcome-external-pr.yml b/.github/workflows/welcome-external-pr.yml index eefc7d62bbda..ac8d1362eac3 100644 --- a/.github/workflows/welcome-external-pr.yml +++ b/.github/workflows/welcome-external-pr.yml @@ -6,42 +6,16 @@ on: - opened env: - ORGANIZATION: Ethereum DRY_RUN: false jobs: comment-external-pr: runs-on: ubuntu-latest steps: - - name: Get organization members - id: get_members - env: - GH_TOKEN: ${{ secrets.READ_ORG }} - CONTRIBUTOR: ${{ github.event.pull_request.user.login }} - run: | - gh api graphql \ - --raw-field organization="$ORGANIZATION" \ - --raw-field query=' - query($organization: String!) { - organization(login: $organization) { - team(slug: "Solidity") { - members(first: 100) { - nodes { - login - } - } - } - } - }' > org_members.json - echo "CONTRIBUTOR_IS_ORG_MEMBER=$( - jq \ - --arg contributor $CONTRIBUTOR \ - '.data.organization.team.members | any(.nodes[].login; . == $contributor)' \ - org_members.json - )" >> $GITHUB_OUTPUT - + # Note: this step requires that the INTERNAL_CONTRIBUTORS environment variable + # is already defined in the repository with the current json list of internal contributors. - name: Comment on external contribution PR - if: ${{ steps.get_members.outputs.CONTRIBUTOR_IS_ORG_MEMBER == 'false' }} + if: "!contains(fromJSON(vars.INTERNAL_CONTRIBUTORS), github.event.pull_request.user.login)" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} PR: ${{ github.event.pull_request.html_url }} From c1ca2bf9d290a4b3be6e8e06824957952aee8035 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Tue, 11 Jul 2023 20:28:21 +0200 Subject: [PATCH 107/138] Check style coverage for using namespace std --- scripts/check_style.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/check_style.sh b/scripts/check_style.sh index 0953106d3bf1..0d5fe1826874 100755 --- a/scripts/check_style.sh +++ b/scripts/check_style.sh @@ -20,6 +20,10 @@ EXCLUDE_FILES=( EXCLUDE_FILES_JOINED=$(printf "%s\|" "${EXCLUDE_FILES[@]}") EXCLUDE_FILES_JOINED=${EXCLUDE_FILES_JOINED%??} +NAMESPACE_STD_FREE_FILES=( + libevmasm/* +) + ( REPO_ROOT="$(dirname "$0")"/.. cd "$REPO_ROOT" || exit 1 @@ -58,6 +62,9 @@ FORMATERROR=$( # unqualified move()/forward() checks, i.e. make sure that std::move() and std::forward() are used instead of move() and forward() preparedGrep "move\(.+\)" | grep -v "std::move" | grep -E "[^a-z]move" preparedGrep "forward\(.+\)" | grep -v "std::forward" | grep -E "[^a-z]forward" + # make sure `using namespace std` is not used in INCLUDE_DIRECTORIES + # shellcheck disable=SC2068,SC2068 + grep -nIE -d skip "using namespace std;" ${NAMESPACE_STD_FREE_FILES[@]} ) | grep -E -v -e "^[a-zA-Z\./]*:[0-9]*:\s*\/(\/|\*)" -e "^test/" || true ) From e81f2bdbd66e9c8780f74b8a8d67b4dc2c87945e Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 12 Jul 2023 10:05:47 +0200 Subject: [PATCH 108/138] Purge using namespace std from liblangutil --- liblangutil/CharStream.cpp | 43 ++++++++++----------- liblangutil/DebugInfoSelection.cpp | 19 +++++---- liblangutil/ErrorReporter.cpp | 49 ++++++++++++------------ liblangutil/Exceptions.cpp | 1 - liblangutil/ParserBase.cpp | 27 +++++++------ liblangutil/Scanner.cpp | 23 ++++++----- liblangutil/SemVerHandler.cpp | 10 ++--- liblangutil/SourceLocation.cpp | 5 +-- liblangutil/SourceReferenceExtractor.cpp | 19 +++++---- liblangutil/SourceReferenceFormatter.cpp | 7 ++-- liblangutil/Token.cpp | 38 +++++++++--------- scripts/check_style.sh | 1 + 12 files changed, 116 insertions(+), 126 deletions(-) diff --git a/liblangutil/CharStream.cpp b/liblangutil/CharStream.cpp index 6ecd85bfed6d..c6b58ef64790 100644 --- a/liblangutil/CharStream.cpp +++ b/liblangutil/CharStream.cpp @@ -51,7 +51,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; @@ -79,21 +78,21 @@ char CharStream::setPosition(size_t _location) return get(); } -string CharStream::lineAtPosition(int _position) const +std::string CharStream::lineAtPosition(int _position) const { // if _position points to \n, it returns the line before the \n - using size_type = string::size_type; - size_type searchStart = min(m_source.size(), size_type(_position)); + using size_type = std::string::size_type; + size_type searchStart = std::min(m_source.size(), size_type(_position)); if (searchStart > 0) searchStart--; size_type lineStart = m_source.rfind('\n', searchStart); - if (lineStart == string::npos) + if (lineStart == std::string::npos) lineStart = 0; else lineStart++; - string line = m_source.substr( + std::string line = m_source.substr( lineStart, - min(m_source.find('\n', lineStart), m_source.size()) - lineStart + std::min(m_source.find('\n', lineStart), m_source.size()) - lineStart ); if (!line.empty() && line.back() == '\r') line.pop_back(); @@ -102,9 +101,9 @@ string CharStream::lineAtPosition(int _position) const LineColumn CharStream::translatePositionToLineColumn(int _position) const { - using size_type = string::size_type; - using diff_type = string::difference_type; - size_type searchPosition = min(m_source.size(), size_type(_position)); + using size_type = std::string::size_type; + using diff_type = std::string::difference_type; + size_type searchPosition = std::min(m_source.size(), size_type(_position)); int lineNumber = static_cast(count(m_source.begin(), m_source.begin() + diff_type(searchPosition), '\n')); size_type lineStart; if (searchPosition == 0) @@ -112,24 +111,24 @@ LineColumn CharStream::translatePositionToLineColumn(int _position) const else { lineStart = m_source.rfind('\n', searchPosition - 1); - lineStart = lineStart == string::npos ? 0 : lineStart + 1; + lineStart = lineStart == std::string::npos ? 0 : lineStart + 1; } return LineColumn{lineNumber, static_cast(searchPosition - lineStart)}; } -string_view CharStream::text(SourceLocation const& _location) const +std::string_view CharStream::text(SourceLocation const& _location) const { if (!_location.hasText()) return {}; solAssert(_location.sourceName && *_location.sourceName == m_name, ""); solAssert(static_cast(_location.end) <= m_source.size(), ""); - return string_view{m_source}.substr( + return std::string_view{m_source}.substr( static_cast(_location.start), static_cast(_location.end - _location.start) ); } -string CharStream::singleLineSnippet(string const& _sourceCode, SourceLocation const& _location) +std::string CharStream::singleLineSnippet(std::string const& _sourceCode, SourceLocation const& _location) { if (!_location.hasText()) return {}; @@ -137,39 +136,39 @@ string CharStream::singleLineSnippet(string const& _sourceCode, SourceLocation c if (static_cast(_location.start) >= _sourceCode.size()) return {}; - string cut = _sourceCode.substr(static_cast(_location.start), static_cast(_location.end - _location.start)); + std::string cut = _sourceCode.substr(static_cast(_location.start), static_cast(_location.end - _location.start)); auto newLinePos = cut.find_first_of("\n\r"); - if (newLinePos != string::npos) + if (newLinePos != std::string::npos) cut = cut.substr(0, newLinePos) + "..."; return cut; } -optional CharStream::translateLineColumnToPosition(LineColumn const& _lineColumn) const +std::optional CharStream::translateLineColumnToPosition(LineColumn const& _lineColumn) const { return translateLineColumnToPosition(m_source, _lineColumn); } -optional CharStream::translateLineColumnToPosition(std::string const& _text, LineColumn const& _input) +std::optional CharStream::translateLineColumnToPosition(std::string const& _text, LineColumn const& _input) { if (_input.line < 0) - return nullopt; + return std::nullopt; size_t offset = 0; for (int i = 0; i < _input.line; i++) { offset = _text.find('\n', offset); if (offset == _text.npos) - return nullopt; + return std::nullopt; offset++; // Skip linefeed. } size_t endOfLine = _text.find('\n', offset); - if (endOfLine == string::npos) + if (endOfLine == std::string::npos) endOfLine = _text.size(); if (offset + static_cast(_input.column) > endOfLine) - return nullopt; + return std::nullopt; return offset + static_cast(_input.column); } diff --git a/liblangutil/DebugInfoSelection.cpp b/liblangutil/DebugInfoSelection.cpp index 6ff023c01d86..88e09cdb7aa0 100644 --- a/liblangutil/DebugInfoSelection.cpp +++ b/liblangutil/DebugInfoSelection.cpp @@ -30,7 +30,6 @@ #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::util; @@ -50,7 +49,7 @@ DebugInfoSelection const DebugInfoSelection::Only(bool DebugInfoSelection::* _me return result; } -optional DebugInfoSelection::fromString(string_view _input) +std::optional DebugInfoSelection::fromString(std::string_view _input) { // TODO: Make more stuff constexpr and make it a static_assert(). solAssert(componentMap().count("all") == 0, ""); @@ -61,11 +60,11 @@ optional DebugInfoSelection::fromString(string_view _input) if (_input == "none") return None(); - return fromComponents(_input | ranges::views::split(',') | ranges::to>); + return fromComponents(_input | ranges::views::split(',') | ranges::to>); } -optional DebugInfoSelection::fromComponents( - vector const& _componentNames, +std::optional DebugInfoSelection::fromComponents( + std::vector const& _componentNames, bool _acceptWildcards ) { @@ -75,16 +74,16 @@ optional DebugInfoSelection::fromComponents( for (auto const& component: _componentNames) { if (component == "*") - return (_acceptWildcards ? make_optional(DebugInfoSelection::All()) : nullopt); + return (_acceptWildcards ? std::make_optional(DebugInfoSelection::All()) : std::nullopt); if (!selection.enable(component)) - return nullopt; + return std::nullopt; } return selection; } -bool DebugInfoSelection::enable(string _component) +bool DebugInfoSelection::enable(std::string _component) { auto memberIt = componentMap().find(boost::trim_copy(_component)); if (memberIt == componentMap().end()) @@ -146,9 +145,9 @@ bool DebugInfoSelection::operator==(DebugInfoSelection const& _other) const noex return true; } -ostream& langutil::operator<<(ostream& _stream, DebugInfoSelection const& _selection) +std::ostream& langutil::operator<<(std::ostream& _stream, DebugInfoSelection const& _selection) { - vector selectedComponentNames; + std::vector selectedComponentNames; for (auto const& [name, member]: _selection.componentMap()) if (_selection.*member) selectedComponentNames.push_back(name); diff --git a/liblangutil/ErrorReporter.cpp b/liblangutil/ErrorReporter.cpp index f99247b328c3..298e4f630f10 100644 --- a/liblangutil/ErrorReporter.cpp +++ b/liblangutil/ErrorReporter.cpp @@ -25,7 +25,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; @@ -37,7 +36,7 @@ ErrorReporter& ErrorReporter::operator=(ErrorReporter const& _errorReporter) return *this; } -void ErrorReporter::warning(ErrorId _error, string const& _description) +void ErrorReporter::warning(ErrorId _error, std::string const& _description) { error(_error, Error::Type::Warning, SourceLocation(), _description); } @@ -45,7 +44,7 @@ void ErrorReporter::warning(ErrorId _error, string const& _description) void ErrorReporter::warning( ErrorId _error, SourceLocation const& _location, - string const& _description + std::string const& _description ) { error(_error, Error::Type::Warning, _location, _description); @@ -54,27 +53,27 @@ void ErrorReporter::warning( void ErrorReporter::warning( ErrorId _error, SourceLocation const& _location, - string const& _description, + std::string const& _description, SecondarySourceLocation const& _secondaryLocation ) { error(_error, Error::Type::Warning, _location, _secondaryLocation, _description); } -void ErrorReporter::error(ErrorId _errorId, Error::Type _type, SourceLocation const& _location, string const& _description) +void ErrorReporter::error(ErrorId _errorId, Error::Type _type, SourceLocation const& _location, std::string const& _description) { if (checkForExcessiveErrors(_type)) return; - m_errorList.push_back(make_shared(_errorId, _type, _description, _location)); + m_errorList.push_back(std::make_shared(_errorId, _type, _description, _location)); } -void ErrorReporter::error(ErrorId _errorId, Error::Type _type, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, string const& _description) +void ErrorReporter::error(ErrorId _errorId, Error::Type _type, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, std::string const& _description) { if (checkForExcessiveErrors(_type)) return; - m_errorList.push_back(make_shared(_errorId, _type, _description, _location, _secondaryLocation)); + m_errorList.push_back(std::make_shared(_errorId, _type, _description, _location, _secondaryLocation)); } bool ErrorReporter::hasExcessiveErrors() const @@ -89,7 +88,7 @@ bool ErrorReporter::checkForExcessiveErrors(Error::Type _type) m_warningCount++; if (m_warningCount == c_maxWarningsAllowed) - m_errorList.push_back(make_shared(4591_error, Error::Type::Warning, "There are more than 256 warnings. Ignoring the rest.")); + m_errorList.push_back(std::make_shared(4591_error, Error::Type::Warning, "There are more than 256 warnings. Ignoring the rest.")); if (m_warningCount >= c_maxWarningsAllowed) return true; @@ -99,7 +98,7 @@ bool ErrorReporter::checkForExcessiveErrors(Error::Type _type) m_infoCount++; if (m_infoCount == c_maxInfosAllowed) - m_errorList.push_back(make_shared(2833_error, Error::Type::Info, "There are more than 256 infos. Ignoring the rest.")); + m_errorList.push_back(std::make_shared(2833_error, Error::Type::Info, "There are more than 256 infos. Ignoring the rest.")); if (m_infoCount >= c_maxInfosAllowed) return true; @@ -110,7 +109,7 @@ bool ErrorReporter::checkForExcessiveErrors(Error::Type _type) if (m_errorCount > c_maxErrorsAllowed) { - m_errorList.push_back(make_shared(4013_error, Error::Type::Warning, "There are more than 256 errors. Aborting.")); + m_errorList.push_back(std::make_shared(4013_error, Error::Type::Warning, "There are more than 256 errors. Aborting.")); BOOST_THROW_EXCEPTION(FatalError()); } } @@ -118,13 +117,13 @@ bool ErrorReporter::checkForExcessiveErrors(Error::Type _type) return false; } -void ErrorReporter::fatalError(ErrorId _error, Error::Type _type, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, string const& _description) +void ErrorReporter::fatalError(ErrorId _error, Error::Type _type, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, std::string const& _description) { error(_error, _type, _location, _secondaryLocation, _description); BOOST_THROW_EXCEPTION(FatalError()); } -void ErrorReporter::fatalError(ErrorId _error, Error::Type _type, SourceLocation const& _location, string const& _description) +void ErrorReporter::fatalError(ErrorId _error, Error::Type _type, SourceLocation const& _location, std::string const& _description) { error(_error, _type, _location, _description); BOOST_THROW_EXCEPTION(FatalError()); @@ -140,7 +139,7 @@ void ErrorReporter::clear() m_errorList.clear(); } -void ErrorReporter::declarationError(ErrorId _error, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, string const& _description) +void ErrorReporter::declarationError(ErrorId _error, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, std::string const& _description) { error( _error, @@ -151,7 +150,7 @@ void ErrorReporter::declarationError(ErrorId _error, SourceLocation const& _loca ); } -void ErrorReporter::declarationError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::declarationError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { error( _error, @@ -170,7 +169,7 @@ void ErrorReporter::fatalDeclarationError(ErrorId _error, SourceLocation const& _description); } -void ErrorReporter::parserError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::parserError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { error( _error, @@ -180,7 +179,7 @@ void ErrorReporter::parserError(ErrorId _error, SourceLocation const& _location, ); } -void ErrorReporter::fatalParserError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::fatalParserError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { fatalError( _error, @@ -190,7 +189,7 @@ void ErrorReporter::fatalParserError(ErrorId _error, SourceLocation const& _loca ); } -void ErrorReporter::syntaxError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::syntaxError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { error( _error, @@ -200,7 +199,7 @@ void ErrorReporter::syntaxError(ErrorId _error, SourceLocation const& _location, ); } -void ErrorReporter::typeError(ErrorId _error, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, string const& _description) +void ErrorReporter::typeError(ErrorId _error, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, std::string const& _description) { error( _error, @@ -211,7 +210,7 @@ void ErrorReporter::typeError(ErrorId _error, SourceLocation const& _location, S ); } -void ErrorReporter::typeError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::typeError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { error( _error, @@ -222,7 +221,7 @@ void ErrorReporter::typeError(ErrorId _error, SourceLocation const& _location, s } -void ErrorReporter::fatalTypeError(ErrorId _error, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, string const& _description) +void ErrorReporter::fatalTypeError(ErrorId _error, SourceLocation const& _location, SecondarySourceLocation const& _secondaryLocation, std::string const& _description) { fatalError( _error, @@ -233,7 +232,7 @@ void ErrorReporter::fatalTypeError(ErrorId _error, SourceLocation const& _locati ); } -void ErrorReporter::fatalTypeError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::fatalTypeError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { fatalError( _error, @@ -243,7 +242,7 @@ void ErrorReporter::fatalTypeError(ErrorId _error, SourceLocation const& _locati ); } -void ErrorReporter::docstringParsingError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ErrorReporter::docstringParsingError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { error( _error, @@ -256,13 +255,13 @@ void ErrorReporter::docstringParsingError(ErrorId _error, SourceLocation const& void ErrorReporter::info( ErrorId _error, SourceLocation const& _location, - string const& _description + std::string const& _description ) { error(_error, Error::Type::Info, _location, _description); } -void ErrorReporter::info(ErrorId _error, string const& _description) +void ErrorReporter::info(ErrorId _error, std::string const& _description) { error(_error, Error::Type::Info, SourceLocation(), _description); } diff --git a/liblangutil/Exceptions.cpp b/liblangutil/Exceptions.cpp index 92fe2589ace9..118720b74570 100644 --- a/liblangutil/Exceptions.cpp +++ b/liblangutil/Exceptions.cpp @@ -26,7 +26,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; diff --git a/liblangutil/ParserBase.cpp b/liblangutil/ParserBase.cpp index 91f67861ab7d..12a00d04f121 100644 --- a/liblangutil/ParserBase.cpp +++ b/liblangutil/ParserBase.cpp @@ -25,7 +25,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; @@ -44,7 +43,7 @@ Token ParserBase::peekNextToken() const return m_scanner->peekNextToken(); } -string ParserBase::currentLiteral() const +std::string ParserBase::currentLiteral() const { return m_scanner->currentLiteral(); } @@ -54,7 +53,7 @@ Token ParserBase::advance() return m_scanner->next(); } -string ParserBase::tokenName(Token _token) +std::string ParserBase::tokenName(Token _token) { if (_token == Token::Identifier) return "identifier"; @@ -76,7 +75,7 @@ void ParserBase::expectToken(Token _value, bool _advance) Token tok = m_scanner->currentToken(); if (tok != _value) { - string const expectedToken = ParserBase::tokenName(_value); + std::string const expectedToken = ParserBase::tokenName(_value); if (m_parserErrorRecovery) parserError(6635_error, "Expected " + expectedToken + " but got " + tokenName(tok)); else @@ -92,7 +91,7 @@ void ParserBase::expectToken(Token _value, bool _advance) advance(); } -void ParserBase::expectTokenOrConsumeUntil(Token _value, string const& _currentNodeName, bool _advance) +void ParserBase::expectTokenOrConsumeUntil(Token _value, std::string const& _currentNodeName, bool _advance) { solAssert(m_inParserRecovery, "The function is supposed to be called during parser recovery only."); @@ -104,12 +103,12 @@ void ParserBase::expectTokenOrConsumeUntil(Token _value, string const& _currentN while (m_scanner->currentToken() != _value && m_scanner->currentToken() != Token::EOS) advance(); - string const expectedToken = ParserBase::tokenName(_value); + std::string const expectedToken = ParserBase::tokenName(_value); if (m_scanner->currentToken() == Token::EOS) { // rollback to where the token started, and raise exception to be caught at a higher level. m_scanner->setPosition(static_cast(startPosition)); - string const msg = "In " + _currentNodeName + ", " + expectedToken + "is expected; got " + ParserBase::tokenName(tok) + " instead."; + std::string const msg = "In " + _currentNodeName + ", " + expectedToken + "is expected; got " + ParserBase::tokenName(tok) + " instead."; fatalParserError(1957_error, errorLoc, msg); } else @@ -120,7 +119,7 @@ void ParserBase::expectTokenOrConsumeUntil(Token _value, string const& _currentN } else { - string expectedToken = ParserBase::tokenName(_value); + std::string expectedToken = ParserBase::tokenName(_value); parserWarning(3347_error, "Recovered in " + _currentNodeName + " at " + expectedToken + "."); m_inParserRecovery = false; } @@ -142,32 +141,32 @@ void ParserBase::decreaseRecursionDepth() m_recursionDepth--; } -void ParserBase::parserWarning(ErrorId _error, string const& _description) +void ParserBase::parserWarning(ErrorId _error, std::string const& _description) { m_errorReporter.warning(_error, currentLocation(), _description); } -void ParserBase::parserWarning(ErrorId _error, SourceLocation const& _location, string const& _description) +void ParserBase::parserWarning(ErrorId _error, SourceLocation const& _location, std::string const& _description) { m_errorReporter.warning(_error, _location, _description); } -void ParserBase::parserError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ParserBase::parserError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { m_errorReporter.parserError(_error, _location, _description); } -void ParserBase::parserError(ErrorId _error, string const& _description) +void ParserBase::parserError(ErrorId _error, std::string const& _description) { parserError(_error, currentLocation(), _description); } -void ParserBase::fatalParserError(ErrorId _error, string const& _description) +void ParserBase::fatalParserError(ErrorId _error, std::string const& _description) { fatalParserError(_error, currentLocation(), _description); } -void ParserBase::fatalParserError(ErrorId _error, SourceLocation const& _location, string const& _description) +void ParserBase::fatalParserError(ErrorId _error, SourceLocation const& _location, std::string const& _description) { m_errorReporter.fatalParserError(_error, _location, _description); } diff --git a/liblangutil/Scanner.cpp b/liblangutil/Scanner.cpp index 1b9b2afac2d0..2d5607607a88 100644 --- a/liblangutil/Scanner.cpp +++ b/liblangutil/Scanner.cpp @@ -61,12 +61,11 @@ #include #include -using namespace std; namespace solidity::langutil { -string to_string(ScannerError _errorCode) +std::string to_string(ScannerError _errorCode) { switch (_errorCode) { @@ -92,7 +91,7 @@ string to_string(ScannerError _errorCode) } -ostream& operator<<(ostream& os, ScannerError _errorCode) +std::ostream& operator<<(std::ostream& os, ScannerError _errorCode) { return os << to_string(_errorCode); } @@ -275,12 +274,12 @@ namespace /// to the user. static ScannerError validateBiDiMarkup(CharStream& _stream, size_t _startPosition) { - static array, 5> constexpr directionalSequences{ - pair{"\xE2\x80\xAD", 1}, // U+202D (LRO - Left-to-Right Override) - pair{"\xE2\x80\xAE", 1}, // U+202E (RLO - Right-to-Left Override) - pair{"\xE2\x80\xAA", 1}, // U+202A (LRE - Left-to-Right Embedding) - pair{"\xE2\x80\xAB", 1}, // U+202B (RLE - Right-to-Left Embedding) - pair{"\xE2\x80\xAC", -1} // U+202C (PDF - Pop Directional Formatting + static std::array, 5> constexpr directionalSequences{ + std::pair{"\xE2\x80\xAD", 1}, // U+202D (LRO - Left-to-Right Override) + std::pair{"\xE2\x80\xAE", 1}, // U+202E (RLO - Right-to-Left Override) + std::pair{"\xE2\x80\xAA", 1}, // U+202A (LRE - Left-to-Right Embedding) + std::pair{"\xE2\x80\xAB", 1}, // U+202B (RLE - Right-to-Left Embedding) + std::pair{"\xE2\x80\xAC", -1} // U+202C (PDF - Pop Directional Formatting }; size_t endPosition = _stream.position(); @@ -712,7 +711,7 @@ void Scanner::scanToken() default: if (isIdentifierStart(m_char)) { - tie(token, m, n) = scanIdentifierOrKeyword(); + std::tie(token, m, n) = scanIdentifierOrKeyword(); // Special case for hexadecimal literals if (token == Token::Hex) @@ -757,7 +756,7 @@ void Scanner::scanToken() m_tokens[NextNext].location.end = static_cast(sourcePos()); m_tokens[NextNext].location.sourceName = m_sourceName; m_tokens[NextNext].token = token; - m_tokens[NextNext].extendedTokenInfo = make_tuple(m, n); + m_tokens[NextNext].extendedTokenInfo = std::make_tuple(m, n); } bool Scanner::scanEscape() @@ -1011,7 +1010,7 @@ Token Scanner::scanNumber(char _charSeen) return Token::Number; } -tuple Scanner::scanIdentifierOrKeyword() +std::tuple Scanner::scanIdentifierOrKeyword() { solAssert(isIdentifierStart(m_char), ""); LiteralScope literal(this, LITERAL_TYPE_STRING); diff --git a/liblangutil/SemVerHandler.cpp b/liblangutil/SemVerHandler.cpp index 6e85e2609d85..2358eec5ef0d 100644 --- a/liblangutil/SemVerHandler.cpp +++ b/liblangutil/SemVerHandler.cpp @@ -29,18 +29,18 @@ #include #include -using namespace std; +using namespace std::string_literals; using namespace solidity; using namespace solidity::langutil; using namespace solidity::util; -SemVerMatchExpressionParser::SemVerMatchExpressionParser(vector _tokens, vector _literals): +SemVerMatchExpressionParser::SemVerMatchExpressionParser(std::vector _tokens, std::vector _literals): m_tokens(std::move(_tokens)), m_literals(std::move(_literals)) { solAssert(m_tokens.size() == m_literals.size(), ""); } -SemVerVersion::SemVerVersion(string const& _versionString) +SemVerVersion::SemVerVersion(std::string const& _versionString) { auto i = _versionString.begin(); auto end = _versionString.end(); @@ -63,13 +63,13 @@ SemVerVersion::SemVerVersion(string const& _versionString) { auto prereleaseStart = ++i; while (i != end && *i != '+') ++i; - prerelease = string(prereleaseStart, i); + prerelease = std::string(prereleaseStart, i); } if (i != end && *i == '+') { auto buildStart = ++i; while (i != end) ++i; - build = string(buildStart, i); + build = std::string(buildStart, i); } if (i != end) solThrow(SemVerError, "Invalid versionString "s + _versionString); diff --git a/liblangutil/SourceLocation.cpp b/liblangutil/SourceLocation.cpp index 72f2506e8a02..61fe40f92627 100644 --- a/liblangutil/SourceLocation.cpp +++ b/liblangutil/SourceLocation.cpp @@ -25,14 +25,13 @@ using namespace solidity; using namespace solidity::langutil; -using namespace std; -SourceLocation solidity::langutil::parseSourceLocation(string const& _input, vector> const& _sourceNames) +SourceLocation solidity::langutil::parseSourceLocation(std::string const& _input, std::vector> const& _sourceNames) { // Expected input: "start:length:sourceindex" enum SrcElem: size_t { Start, Length, Index }; - vector pos; + std::vector pos; boost::algorithm::split(pos, _input, boost::is_any_of(":")); diff --git a/liblangutil/SourceReferenceExtractor.cpp b/liblangutil/SourceReferenceExtractor.cpp index 01f22a1f7790..9389a77aa695 100644 --- a/liblangutil/SourceReferenceExtractor.cpp +++ b/liblangutil/SourceReferenceExtractor.cpp @@ -24,7 +24,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; @@ -36,7 +35,7 @@ SourceReferenceExtractor::Message SourceReferenceExtractor::extract( { SourceLocation const* location = boost::get_error_info(_exception); - string const* message = boost::get_error_info(_exception); + std::string const* message = boost::get_error_info(_exception); SourceReference primary = extract(_charStreamProvider, location, message ? *message : ""); std::vector secondary; @@ -45,7 +44,7 @@ SourceReferenceExtractor::Message SourceReferenceExtractor::extract( for (auto const& info: secondaryLocation->infos) secondary.emplace_back(extract(_charStreamProvider, &info.second, info.first)); - return Message{std::move(primary), _typeOrSeverity, std::move(secondary), nullopt}; + return Message{std::move(primary), _typeOrSeverity, std::move(secondary), std::nullopt}; } SourceReferenceExtractor::Message SourceReferenceExtractor::extract( @@ -78,7 +77,7 @@ SourceReference SourceReferenceExtractor::extract( LineColumn end = charStream.translatePositionToLineColumn(_location->end); bool const isMultiline = start.line != end.line; - string line = charStream.lineAtPosition(_location->start); + std::string line = charStream.lineAtPosition(_location->start); int locationLength = isMultiline ? @@ -88,7 +87,7 @@ SourceReference SourceReferenceExtractor::extract( if (locationLength > 150) { auto const lhs = static_cast(start.column) + 35; - string::size_type const rhs = (isMultiline ? line.length() : static_cast(end.column)) - 35; + std::string::size_type const rhs = (isMultiline ? line.length() : static_cast(end.column)) - 35; line = line.substr(0, lhs) + " ... " + line.substr(rhs); end.column = start.column + 75; locationLength = 75; @@ -98,9 +97,9 @@ SourceReference SourceReferenceExtractor::extract( { int const len = static_cast(line.length()); line = line.substr( - static_cast(max(0, start.column - 35)), - static_cast(min(start.column, 35)) + static_cast( - min(locationLength + 35, len - start.column) + static_cast(std::max(0, start.column - 35)), + static_cast(std::min(start.column, 35)) + static_cast( + std::min(locationLength + 35, len - start.column) ) ); if (start.column + locationLength + 35 < len) @@ -119,7 +118,7 @@ SourceReference SourceReferenceExtractor::extract( interest, isMultiline, line, - min(start.column, static_cast(line.length())), - min(end.column, static_cast(line.length())) + std::min(start.column, static_cast(line.length())), + std::min(end.column, static_cast(line.length())) }; } diff --git a/liblangutil/SourceReferenceFormatter.cpp b/liblangutil/SourceReferenceFormatter.cpp index 4765b9fb24d9..76cb1df61a33 100644 --- a/liblangutil/SourceReferenceFormatter.cpp +++ b/liblangutil/SourceReferenceFormatter.cpp @@ -28,7 +28,6 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::langutil; using namespace solidity::util; @@ -114,15 +113,15 @@ void SourceReferenceFormatter::printSourceLocation(SourceReference const& _ref) return; // No line available, nothing else to print } - string line = std::to_string(_ref.position.line + 1); // one-based line number as string - string leftpad = string(line.size(), ' '); + std::string line = std::to_string(_ref.position.line + 1); // one-based line number as string + std::string leftpad = std::string(line.size(), ' '); // line 0: source name m_stream << leftpad; frameColored() << "-->"; m_stream << ' ' << _ref.sourceName << ':' << line << ':' << (_ref.position.column + 1) << ":\n"; - string_view text = _ref.text; + std::string_view text = _ref.text; if (m_charStreamProvider.charStream(_ref.sourceName).isImportedFromAST()) return; diff --git a/liblangutil/Token.cpp b/liblangutil/Token.cpp index 60b8aa798755..8a860791fa45 100644 --- a/liblangutil/Token.cpp +++ b/liblangutil/Token.cpp @@ -46,8 +46,6 @@ #include -using namespace std; - namespace solidity::langutil { @@ -71,25 +69,25 @@ std::string ElementaryTypeNameToken::toString(bool const& tokenValue) const void ElementaryTypeNameToken::assertDetails(Token _baseType, unsigned const& _first, unsigned const& _second) { - solAssert(TokenTraits::isElementaryTypeName(_baseType), "Expected elementary type name: " + string(TokenTraits::toString(_baseType))); + solAssert(TokenTraits::isElementaryTypeName(_baseType), "Expected elementary type name: " + std::string(TokenTraits::toString(_baseType))); if (_baseType == Token::BytesM) { solAssert(_second == 0, "There should not be a second size argument to type bytesM."); - solAssert(_first <= 32, "No elementary type bytes" + to_string(_first) + "."); + solAssert(_first <= 32, "No elementary type bytes" + std::to_string(_first) + "."); } else if (_baseType == Token::UIntM || _baseType == Token::IntM) { - solAssert(_second == 0, "There should not be a second size argument to type " + string(TokenTraits::toString(_baseType)) + "."); + solAssert(_second == 0, "There should not be a second size argument to type " + std::string(TokenTraits::toString(_baseType)) + "."); solAssert( _first <= 256 && _first % 8 == 0, - "No elementary type " + string(TokenTraits::toString(_baseType)) + to_string(_first) + "." + "No elementary type " + std::string(TokenTraits::toString(_baseType)) + std::to_string(_first) + "." ); } else if (_baseType == Token::UFixedMxN || _baseType == Token::FixedMxN) { solAssert( _first >= 8 && _first <= 256 && _first % 8 == 0 && _second <= 80, - "No elementary type " + string(TokenTraits::toString(_baseType)) + to_string(_first) + "x" + to_string(_second) + "." + "No elementary type " + std::string(TokenTraits::toString(_baseType)) + std::to_string(_first) + "x" + std::to_string(_second) + "." ); } else @@ -136,29 +134,29 @@ std::string friendlyName(Token tok) } -static Token keywordByName(string const& _name) +static Token keywordByName(std::string const& _name) { // The following macros are used inside TOKEN_LIST and cause non-keyword tokens to be ignored // and keywords to be put inside the keywords variable. #define KEYWORD(name, string, precedence) {string, Token::name}, #define TOKEN(name, string, precedence) - static map const keywords({TOKEN_LIST(TOKEN, KEYWORD)}); + static std::map const keywords({TOKEN_LIST(TOKEN, KEYWORD)}); #undef KEYWORD #undef TOKEN auto it = keywords.find(_name); return it == keywords.end() ? Token::Identifier : it->second; } -bool isYulKeyword(string const& _literal) +bool isYulKeyword(std::string const& _literal) { return _literal == "leave" || isYulKeyword(keywordByName(_literal)); } -tuple fromIdentifierOrKeyword(string const& _literal) +std::tuple fromIdentifierOrKeyword(std::string const& _literal) { // Used for `bytesM`, `uintM`, `intM`, `fixedMxN`, `ufixedMxN`. // M/N must be shortest representation. M can never be 0. N can be zero. - auto parseSize = [](string::const_iterator _begin, string::const_iterator _end) -> int + auto parseSize = [](std::string::const_iterator _begin, std::string::const_iterator _end) -> int { // No number. if (distance(_begin, _end) == 0) @@ -185,23 +183,23 @@ tuple fromIdentifierOrKeyword(string const& _ auto positionM = find_if(_literal.begin(), _literal.end(), util::isDigit); if (positionM != _literal.end()) { - string baseType(_literal.begin(), positionM); + std::string baseType(_literal.begin(), positionM); auto positionX = find_if_not(positionM, _literal.end(), util::isDigit); int m = parseSize(positionM, positionX); Token keyword = keywordByName(baseType); if (keyword == Token::Bytes) { if (0 < m && m <= 32 && positionX == _literal.end()) - return make_tuple(Token::BytesM, m, 0); + return std::make_tuple(Token::BytesM, m, 0); } else if (keyword == Token::UInt || keyword == Token::Int) { if (0 < m && m <= 256 && m % 8 == 0 && positionX == _literal.end()) { if (keyword == Token::UInt) - return make_tuple(Token::UIntM, m, 0); + return std::make_tuple(Token::UIntM, m, 0); else - return make_tuple(Token::IntM, m, 0); + return std::make_tuple(Token::IntM, m, 0); } } else if (keyword == Token::UFixed || keyword == Token::Fixed) @@ -218,16 +216,16 @@ tuple fromIdentifierOrKeyword(string const& _ 0 <= n && n <= 80 ) { if (keyword == Token::UFixed) - return make_tuple(Token::UFixedMxN, m, n); + return std::make_tuple(Token::UFixedMxN, m, n); else - return make_tuple(Token::FixedMxN, m, n); + return std::make_tuple(Token::FixedMxN, m, n); } } } - return make_tuple(Token::Identifier, 0, 0); + return std::make_tuple(Token::Identifier, 0, 0); } - return make_tuple(keywordByName(_literal), 0, 0); + return std::make_tuple(keywordByName(_literal), 0, 0); } } diff --git a/scripts/check_style.sh b/scripts/check_style.sh index 0d5fe1826874..bd9fbf00560a 100755 --- a/scripts/check_style.sh +++ b/scripts/check_style.sh @@ -22,6 +22,7 @@ EXCLUDE_FILES_JOINED=${EXCLUDE_FILES_JOINED%??} NAMESPACE_STD_FREE_FILES=( libevmasm/* + liblangutil/* ) ( From 62723b7534bcd0975e8c926978b7b27d6dc035f7 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 12 Jul 2023 14:09:19 +0200 Subject: [PATCH 109/138] Purge using namespace std in libsmtutil and libsolc --- libsmtutil/CHCSmtLib2Interface.cpp | 43 ++++++++-------- libsmtutil/CVC4Interface.cpp | 29 ++++++----- libsmtutil/SMTLib2Interface.cpp | 79 +++++++++++++++--------------- libsmtutil/SMTPortfolio.cpp | 25 +++++----- libsmtutil/Sorts.cpp | 12 ++--- libsmtutil/Z3CHCInterface.cpp | 33 ++++++------- libsmtutil/Z3Interface.cpp | 49 +++++++++--------- libsmtutil/Z3Loader.cpp | 5 +- libsolc/libsolc.cpp | 21 ++++---- scripts/check_style.sh | 2 + 10 files changed, 145 insertions(+), 153 deletions(-) diff --git a/libsmtutil/CHCSmtLib2Interface.cpp b/libsmtutil/CHCSmtLib2Interface.cpp index 4229cf5d6680..ef7c56ac0c06 100644 --- a/libsmtutil/CHCSmtLib2Interface.cpp +++ b/libsmtutil/CHCSmtLib2Interface.cpp @@ -31,20 +31,19 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::frontend; using namespace solidity::smtutil; CHCSmtLib2Interface::CHCSmtLib2Interface( - map const& _queryResponses, + std::map const& _queryResponses, ReadCallback::Callback _smtCallback, SMTSolverChoice _enabledSolvers, - optional _queryTimeout + std::optional _queryTimeout ): CHCSolverInterface(_queryTimeout), - m_smtlib2(make_unique(_queryResponses, _smtCallback, m_queryTimeout)), + m_smtlib2(std::make_unique(_queryResponses, _smtCallback, m_queryTimeout)), m_queryResponses(std::move(_queryResponses)), m_smtCallback(_smtCallback), m_enabledSolvers(_enabledSolvers) @@ -66,8 +65,8 @@ void CHCSmtLib2Interface::registerRelation(Expression const& _expr) smtAssert(_expr.sort->kind == Kind::Function); if (!m_variables.count(_expr.name)) { - auto fSort = dynamic_pointer_cast(_expr.sort); - string domain = toSmtLibSort(fSort->domain); + auto fSort = std::dynamic_pointer_cast(_expr.sort); + std::string domain = toSmtLibSort(fSort->domain); // Relations are predicates which have implicit codomain Bool. m_variables.insert(_expr.name); write( @@ -89,10 +88,10 @@ void CHCSmtLib2Interface::addRule(Expression const& _expr, std::string const& /* ); } -tuple CHCSmtLib2Interface::query(Expression const& _block) +std::tuple CHCSmtLib2Interface::query(Expression const& _block) { - string query = dumpQuery(_block); - string response = querySolver(query); + std::string query = dumpQuery(_block); + std::string response = querySolver(query); CheckResult result; // TODO proper parsing @@ -108,7 +107,7 @@ tuple CHCSmtLib2Interface return {result, Expression(true), {}}; } -void CHCSmtLib2Interface::declareVariable(string const& _name, SortPointer const& _sort) +void CHCSmtLib2Interface::declareVariable(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort); if (_sort->kind == Kind::Function) @@ -120,25 +119,25 @@ void CHCSmtLib2Interface::declareVariable(string const& _name, SortPointer const } } -string CHCSmtLib2Interface::toSmtLibSort(Sort const& _sort) +std::string CHCSmtLib2Interface::toSmtLibSort(Sort const& _sort) { if (!m_sortNames.count(&_sort)) m_sortNames[&_sort] = m_smtlib2->toSmtLibSort(_sort); return m_sortNames.at(&_sort); } -string CHCSmtLib2Interface::toSmtLibSort(vector const& _sorts) +std::string CHCSmtLib2Interface::toSmtLibSort(std::vector const& _sorts) { - string ssort("("); + std::string ssort("("); for (auto const& sort: _sorts) ssort += toSmtLibSort(*sort) + " "; ssort += ")"; return ssort; } -string CHCSmtLib2Interface::forall() +std::string CHCSmtLib2Interface::forall() { - string vars("("); + std::string vars("("); for (auto const& [name, sort]: m_smtlib2->variables()) { solAssert(sort, ""); @@ -149,17 +148,17 @@ string CHCSmtLib2Interface::forall() return vars; } -void CHCSmtLib2Interface::declareFunction(string const& _name, SortPointer const& _sort) +void CHCSmtLib2Interface::declareFunction(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort); smtAssert(_sort->kind == Kind::Function); // TODO Use domain and codomain as key as well if (!m_variables.count(_name)) { - auto fSort = dynamic_pointer_cast(_sort); + auto fSort = std::dynamic_pointer_cast(_sort); smtAssert(fSort->codomain); - string domain = toSmtLibSort(fSort->domain); - string codomain = toSmtLibSort(*fSort->codomain); + std::string domain = toSmtLibSort(fSort->domain); + std::string codomain = toSmtLibSort(*fSort->codomain); m_variables.insert(_name); write( "(declare-fun |" + @@ -173,12 +172,12 @@ void CHCSmtLib2Interface::declareFunction(string const& _name, SortPointer const } } -void CHCSmtLib2Interface::write(string _data) +void CHCSmtLib2Interface::write(std::string _data) { m_accumulatedOutput += std::move(_data) + "\n"; } -string CHCSmtLib2Interface::querySolver(string const& _input) +std::string CHCSmtLib2Interface::querySolver(std::string const& _input) { util::h256 inputHash = util::keccak256(_input); if (m_queryResponses.count(inputHash)) @@ -212,7 +211,7 @@ std::string CHCSmtLib2Interface::dumpQuery(Expression const& _expr) std::string CHCSmtLib2Interface::createHeaderAndDeclarations() { std::stringstream s; if (m_queryTimeout) - s << "(set-option :timeout " + to_string(*m_queryTimeout) + ")\n"; + s << "(set-option :timeout " + std::to_string(*m_queryTimeout) + ")\n"; s << "(set-logic HORN)" << std::endl; for (auto const& decl: m_smtlib2->userSorts() | ranges::views::values) diff --git a/libsmtutil/CVC4Interface.cpp b/libsmtutil/CVC4Interface.cpp index 3c047782a4fc..f53c92ab5705 100644 --- a/libsmtutil/CVC4Interface.cpp +++ b/libsmtutil/CVC4Interface.cpp @@ -23,12 +23,11 @@ #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::smtutil; -CVC4Interface::CVC4Interface(optional _queryTimeout): +CVC4Interface::CVC4Interface(std::optional _queryTimeout): SolverInterface(_queryTimeout), m_solver(&m_context) { @@ -56,7 +55,7 @@ void CVC4Interface::pop() m_solver.pop(); } -void CVC4Interface::declareVariable(string const& _name, SortPointer const& _sort) +void CVC4Interface::declareVariable(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort, ""); m_variables[_name] = m_context.mkVar(_name.c_str(), cvc4Sort(*_sort)); @@ -86,10 +85,10 @@ void CVC4Interface::addAssertion(Expression const& _expr) } } -pair> CVC4Interface::check(vector const& _expressionsToEvaluate) +std::pair> CVC4Interface::check(std::vector const& _expressionsToEvaluate) { CheckResult result; - vector values; + std::vector values; try { switch (m_solver.checkSat().isSat()) @@ -119,7 +118,7 @@ pair> CVC4Interface::check(vector const& values.clear(); } - return make_pair(result, values); + return std::make_pair(result, values); } CVC4::Expr CVC4Interface::toCVC4Expr(Expression const& _expr) @@ -128,13 +127,13 @@ CVC4::Expr CVC4Interface::toCVC4Expr(Expression const& _expr) if (_expr.arguments.empty() && m_variables.count(_expr.name)) return m_variables.at(_expr.name); - vector arguments; + std::vector arguments; for (auto const& arg: _expr.arguments) arguments.push_back(toCVC4Expr(arg)); try { - string const& n = _expr.name; + std::string const& n = _expr.name; // Function application if (!arguments.empty() && m_variables.count(_expr.name)) return m_context.mkExpr(CVC4::kind::APPLY_UF, m_variables.at(n), arguments); @@ -145,7 +144,7 @@ CVC4::Expr CVC4Interface::toCVC4Expr(Expression const& _expr) return m_context.mkConst(true); else if (n == "false") return m_context.mkConst(false); - else if (auto sortSort = dynamic_pointer_cast(_expr.sort)) + else if (auto sortSort = std::dynamic_pointer_cast(_expr.sort)) return m_context.mkVar(n, cvc4Sort(*sortSort->inner)); else try @@ -224,7 +223,7 @@ CVC4::Expr CVC4Interface::toCVC4Expr(Expression const& _expr) } else if (n == "bv2int") { - auto intSort = dynamic_pointer_cast(_expr.sort); + auto intSort = std::dynamic_pointer_cast(_expr.sort); smtAssert(intSort, ""); auto nat = m_context.mkExpr(CVC4::kind::BITVECTOR_TO_NAT, arguments[0]); if (!intSort->isSigned) @@ -254,13 +253,13 @@ CVC4::Expr CVC4Interface::toCVC4Expr(Expression const& _expr) return m_context.mkExpr(CVC4::kind::STORE, arguments[0], arguments[1], arguments[2]); else if (n == "const_array") { - shared_ptr sortSort = std::dynamic_pointer_cast(_expr.arguments[0].sort); + std::shared_ptr sortSort = std::dynamic_pointer_cast(_expr.arguments[0].sort); smtAssert(sortSort, ""); return m_context.mkConst(CVC4::ArrayStoreAll(cvc4Sort(*sortSort->inner), arguments[1])); } else if (n == "tuple_get") { - shared_ptr tupleSort = std::dynamic_pointer_cast(_expr.arguments[0].sort); + std::shared_ptr tupleSort = std::dynamic_pointer_cast(_expr.arguments[0].sort); smtAssert(tupleSort, ""); CVC4::DatatypeType tt = m_context.mkTupleType(cvc4Sort(tupleSort->components)); CVC4::Datatype const& dt = tt.getDatatype(); @@ -270,7 +269,7 @@ CVC4::Expr CVC4Interface::toCVC4Expr(Expression const& _expr) } else if (n == "tuple_constructor") { - shared_ptr tupleSort = std::dynamic_pointer_cast(_expr.sort); + std::shared_ptr tupleSort = std::dynamic_pointer_cast(_expr.sort); smtAssert(tupleSort, ""); CVC4::DatatypeType tt = m_context.mkTupleType(cvc4Sort(tupleSort->components)); CVC4::Datatype const& dt = tt.getDatatype(); @@ -328,9 +327,9 @@ CVC4::Type CVC4Interface::cvc4Sort(Sort const& _sort) return m_context.integerType(); } -vector CVC4Interface::cvc4Sort(vector const& _sorts) +std::vector CVC4Interface::cvc4Sort(std::vector const& _sorts) { - vector cvc4Sorts; + std::vector cvc4Sorts; for (auto const& _sort: _sorts) cvc4Sorts.push_back(cvc4Sort(*_sort)); return cvc4Sorts; diff --git a/libsmtutil/SMTLib2Interface.cpp b/libsmtutil/SMTLib2Interface.cpp index 85103d00ebc3..ac5645bf121b 100644 --- a/libsmtutil/SMTLib2Interface.cpp +++ b/libsmtutil/SMTLib2Interface.cpp @@ -33,16 +33,15 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::frontend; using namespace solidity::smtutil; SMTLib2Interface::SMTLib2Interface( - map _queryResponses, + std::map _queryResponses, ReadCallback::Callback _smtCallback, - optional _queryTimeout + std::optional _queryTimeout ): SolverInterface(_queryTimeout), m_queryResponses(std::move(_queryResponses)), @@ -59,7 +58,7 @@ void SMTLib2Interface::reset() m_userSorts.clear(); write("(set-option :produce-models true)"); if (m_queryTimeout) - write("(set-option :timeout " + to_string(*m_queryTimeout) + ")"); + write("(set-option :timeout " + std::to_string(*m_queryTimeout) + ")"); write("(set-logic ALL)"); } @@ -74,7 +73,7 @@ void SMTLib2Interface::pop() m_accumulatedOutput.pop_back(); } -void SMTLib2Interface::declareVariable(string const& _name, SortPointer const& _sort) +void SMTLib2Interface::declareVariable(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort, ""); if (_sort->kind == Kind::Function) @@ -86,16 +85,16 @@ void SMTLib2Interface::declareVariable(string const& _name, SortPointer const& _ } } -void SMTLib2Interface::declareFunction(string const& _name, SortPointer const& _sort) +void SMTLib2Interface::declareFunction(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort, ""); smtAssert(_sort->kind == Kind::Function, ""); // TODO Use domain and codomain as key as well if (!m_variables.count(_name)) { - auto const& fSort = dynamic_pointer_cast(_sort); - string domain = toSmtLibSort(fSort->domain); - string codomain = toSmtLibSort(*fSort->codomain); + auto const& fSort = std::dynamic_pointer_cast(_sort); + std::string domain = toSmtLibSort(fSort->domain); + std::string codomain = toSmtLibSort(*fSort->codomain); m_variables.emplace(_name, _sort); write( "(declare-fun |" + @@ -114,9 +113,9 @@ void SMTLib2Interface::addAssertion(Expression const& _expr) write("(assert " + toSExpr(_expr) + ")"); } -pair> SMTLib2Interface::check(vector const& _expressionsToEvaluate) +std::pair> SMTLib2Interface::check(std::vector const& _expressionsToEvaluate) { - string response = querySolver( + std::string response = querySolver( boost::algorithm::join(m_accumulatedOutput, "\n") + checkSatAndGetValuesCommand(_expressionsToEvaluate) ); @@ -132,13 +131,13 @@ pair> SMTLib2Interface::check(vector con else result = CheckResult::ERROR; - vector values; + std::vector values; if (result == CheckResult::SATISFIABLE && !_expressionsToEvaluate.empty()) values = parseValues(find(response.cbegin(), response.cend(), '\n'), response.cend()); - return make_pair(result, values); + return std::make_pair(result, values); } -string SMTLib2Interface::toSExpr(Expression const& _expr) +std::string SMTLib2Interface::toSExpr(Expression const& _expr) { if (_expr.arguments.empty()) return _expr.name; @@ -148,16 +147,16 @@ string SMTLib2Interface::toSExpr(Expression const& _expr) { size_t size = std::stoul(_expr.arguments[1].name); auto arg = toSExpr(_expr.arguments.front()); - auto int2bv = "(_ int2bv " + to_string(size) + ")"; + auto int2bv = "(_ int2bv " + std::to_string(size) + ")"; // Some solvers treat all BVs as unsigned, so we need to manually apply 2's complement if needed. - sexpr += string("ite ") + + sexpr += std::string("ite ") + "(>= " + arg + " 0) " + "(" + int2bv + " " + arg + ") " + "(bvneg (" + int2bv + " (- " + arg + ")))"; } else if (_expr.name == "bv2int") { - auto intSort = dynamic_pointer_cast(_expr.sort); + auto intSort = std::dynamic_pointer_cast(_expr.sort); smtAssert(intSort, ""); auto arg = toSExpr(_expr.arguments.front()); @@ -166,13 +165,13 @@ string SMTLib2Interface::toSExpr(Expression const& _expr) if (!intSort->isSigned) return nat; - auto bvSort = dynamic_pointer_cast(_expr.arguments.front().sort); + auto bvSort = std::dynamic_pointer_cast(_expr.arguments.front().sort); smtAssert(bvSort, ""); - auto size = to_string(bvSort->size); - auto pos = to_string(bvSort->size - 1); + auto size = std::to_string(bvSort->size); + auto pos = std::to_string(bvSort->size - 1); // Some solvers treat all BVs as unsigned, so we need to manually apply 2's complement if needed. - sexpr += string("ite ") + + sexpr += std::string("ite ") + "(= ((_ extract " + pos + " " + pos + ")" + arg + ") #b0) " + nat + " " + "(- (bv2nat (bvneg " + arg + ")))"; @@ -182,7 +181,7 @@ string SMTLib2Interface::toSExpr(Expression const& _expr) smtAssert(_expr.arguments.size() == 2, ""); auto sortSort = std::dynamic_pointer_cast(_expr.arguments.at(0).sort); smtAssert(sortSort, ""); - auto arraySort = dynamic_pointer_cast(sortSort->inner); + auto arraySort = std::dynamic_pointer_cast(sortSort->inner); smtAssert(arraySort, ""); sexpr += "(as const " + toSmtLibSort(*arraySort) + ") "; sexpr += toSExpr(_expr.arguments.at(1)); @@ -190,14 +189,14 @@ string SMTLib2Interface::toSExpr(Expression const& _expr) else if (_expr.name == "tuple_get") { smtAssert(_expr.arguments.size() == 2, ""); - auto tupleSort = dynamic_pointer_cast(_expr.arguments.at(0).sort); + auto tupleSort = std::dynamic_pointer_cast(_expr.arguments.at(0).sort); size_t index = std::stoul(_expr.arguments.at(1).name); smtAssert(index < tupleSort->members.size(), ""); sexpr += "|" + tupleSort->members.at(index) + "| " + toSExpr(_expr.arguments.at(0)); } else if (_expr.name == "tuple_constructor") { - auto tupleSort = dynamic_pointer_cast(_expr.sort); + auto tupleSort = std::dynamic_pointer_cast(_expr.sort); smtAssert(tupleSort, ""); sexpr += "|" + tupleSort->name + "|"; for (auto const& arg: _expr.arguments) @@ -213,7 +212,7 @@ string SMTLib2Interface::toSExpr(Expression const& _expr) return sexpr; } -string SMTLib2Interface::toSmtLibSort(Sort const& _sort) +std::string SMTLib2Interface::toSmtLibSort(Sort const& _sort) { switch (_sort.kind) { @@ -222,7 +221,7 @@ string SMTLib2Interface::toSmtLibSort(Sort const& _sort) case Kind::Bool: return "Bool"; case Kind::BitVector: - return "(_ BitVec " + to_string(dynamic_cast(_sort).size) + ")"; + return "(_ BitVec " + std::to_string(dynamic_cast(_sort).size) + ")"; case Kind::Array: { auto const& arraySort = dynamic_cast(_sort); @@ -232,11 +231,11 @@ string SMTLib2Interface::toSmtLibSort(Sort const& _sort) case Kind::Tuple: { auto const& tupleSort = dynamic_cast(_sort); - string tupleName = "|" + tupleSort.name + "|"; + std::string tupleName = "|" + tupleSort.name + "|"; auto isName = [&](auto entry) { return entry.first == tupleName; }; if (ranges::find_if(m_userSorts, isName) == m_userSorts.end()) { - string decl("(declare-datatypes ((" + tupleName + " 0)) (((" + tupleName); + std::string decl("(declare-datatypes ((" + tupleName + " 0)) (((" + tupleName); smtAssert(tupleSort.members.size() == tupleSort.components.size(), ""); for (unsigned i = 0; i < tupleSort.members.size(); ++i) decl += " (|" + tupleSort.members.at(i) + "| " + toSmtLibSort(*tupleSort.components.at(i)) + ")"; @@ -252,24 +251,24 @@ string SMTLib2Interface::toSmtLibSort(Sort const& _sort) } } -string SMTLib2Interface::toSmtLibSort(vector const& _sorts) +std::string SMTLib2Interface::toSmtLibSort(std::vector const& _sorts) { - string ssort("("); + std::string ssort("("); for (auto const& sort: _sorts) ssort += toSmtLibSort(*sort) + " "; ssort += ")"; return ssort; } -void SMTLib2Interface::write(string _data) +void SMTLib2Interface::write(std::string _data) { smtAssert(!m_accumulatedOutput.empty(), ""); m_accumulatedOutput.back() += std::move(_data) + "\n"; } -string SMTLib2Interface::checkSatAndGetValuesCommand(vector const& _expressionsToEvaluate) +std::string SMTLib2Interface::checkSatAndGetValuesCommand(std::vector const& _expressionsToEvaluate) { - string command; + std::string command; if (_expressionsToEvaluate.empty()) command = "(check-sat)\n"; else @@ -279,22 +278,22 @@ string SMTLib2Interface::checkSatAndGetValuesCommand(vector const& _ { auto const& e = _expressionsToEvaluate.at(i); smtAssert(e.sort->kind == Kind::Int || e.sort->kind == Kind::Bool, "Invalid sort for expression to evaluate."); - command += "(declare-const |EVALEXPR_" + to_string(i) + "| " + (e.sort->kind == Kind::Int ? "Int" : "Bool") + ")\n"; - command += "(assert (= |EVALEXPR_" + to_string(i) + "| " + toSExpr(e) + "))\n"; + command += "(declare-const |EVALEXPR_" + std::to_string(i) + "| " + (e.sort->kind == Kind::Int ? "Int" : "Bool") + ")\n"; + command += "(assert (= |EVALEXPR_" + std::to_string(i) + "| " + toSExpr(e) + "))\n"; } command += "(check-sat)\n"; command += "(get-value ("; for (size_t i = 0; i < _expressionsToEvaluate.size(); i++) - command += "|EVALEXPR_" + to_string(i) + "| "; + command += "|EVALEXPR_" + std::to_string(i) + "| "; command += "))\n"; } return command; } -vector SMTLib2Interface::parseValues(string::const_iterator _start, string::const_iterator _end) +std::vector SMTLib2Interface::parseValues(std::string::const_iterator _start, std::string::const_iterator _end) { - vector values; + std::vector values; while (_start < _end) { auto valStart = find(_start, _end, ' '); @@ -308,7 +307,7 @@ vector SMTLib2Interface::parseValues(string::const_iterator _start, stri return values; } -string SMTLib2Interface::querySolver(string const& _input) +std::string SMTLib2Interface::querySolver(std::string const& _input) { h256 inputHash = keccak256(_input); if (m_queryResponses.count(inputHash)) @@ -323,7 +322,7 @@ string SMTLib2Interface::querySolver(string const& _input) return "unknown\n"; } -string SMTLib2Interface::dumpQuery(vector const& _expressionsToEvaluate) +std::string SMTLib2Interface::dumpQuery(std::vector const& _expressionsToEvaluate) { return boost::algorithm::join(m_accumulatedOutput, "\n") + checkSatAndGetValuesCommand(_expressionsToEvaluate); diff --git a/libsmtutil/SMTPortfolio.cpp b/libsmtutil/SMTPortfolio.cpp index be961d01f6c2..76c69d0180a3 100644 --- a/libsmtutil/SMTPortfolio.cpp +++ b/libsmtutil/SMTPortfolio.cpp @@ -26,31 +26,30 @@ #endif #include -using namespace std; using namespace solidity; using namespace solidity::util; using namespace solidity::frontend; using namespace solidity::smtutil; SMTPortfolio::SMTPortfolio( - map _smtlib2Responses, + std::map _smtlib2Responses, frontend::ReadCallback::Callback _smtCallback, [[maybe_unused]] SMTSolverChoice _enabledSolvers, - optional _queryTimeout, + std::optional _queryTimeout, bool _printQuery ): SolverInterface(_queryTimeout) { solAssert(!_printQuery || _enabledSolvers == smtutil::SMTSolverChoice::SMTLIB2(), "Only SMTLib2 solver can be enabled to print queries"); if (_enabledSolvers.smtlib2) - m_solvers.emplace_back(make_unique(std::move(_smtlib2Responses), std::move(_smtCallback), m_queryTimeout)); + m_solvers.emplace_back(std::make_unique(std::move(_smtlib2Responses), std::move(_smtCallback), m_queryTimeout)); #ifdef HAVE_Z3 if (_enabledSolvers.z3 && Z3Interface::available()) - m_solvers.emplace_back(make_unique(m_queryTimeout)); + m_solvers.emplace_back(std::make_unique(m_queryTimeout)); #endif #ifdef HAVE_CVC4 if (_enabledSolvers.cvc4) - m_solvers.emplace_back(make_unique(m_queryTimeout)); + m_solvers.emplace_back(std::make_unique(m_queryTimeout)); #endif } @@ -72,7 +71,7 @@ void SMTPortfolio::pop() s->pop(); } -void SMTPortfolio::declareVariable(string const& _name, SortPointer const& _sort) +void SMTPortfolio::declareVariable(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort, ""); for (auto const& s: m_solvers) @@ -115,14 +114,14 @@ void SMTPortfolio::addAssertion(Expression const& _expr) * * If all solvers return ERROR, the result is ERROR. */ -pair> SMTPortfolio::check(vector const& _expressionsToEvaluate) +std::pair> SMTPortfolio::check(std::vector const& _expressionsToEvaluate) { CheckResult lastResult = CheckResult::ERROR; - vector finalValues; + std::vector finalValues; for (auto const& s: m_solvers) { CheckResult result; - vector values; + std::vector values; tie(result, values) = s->check(_expressionsToEvaluate); if (solverAnswered(result)) { @@ -140,10 +139,10 @@ pair> SMTPortfolio::check(vector const& else if (result == CheckResult::UNKNOWN && lastResult == CheckResult::ERROR) lastResult = result; } - return make_pair(lastResult, finalValues); + return std::make_pair(lastResult, finalValues); } -vector SMTPortfolio::unhandledQueries() +std::vector SMTPortfolio::unhandledQueries() { // This code assumes that the constructor guarantees that // SmtLib2Interface is in position 0, if enabled. @@ -158,7 +157,7 @@ bool SMTPortfolio::solverAnswered(CheckResult result) return result == CheckResult::SATISFIABLE || result == CheckResult::UNSATISFIABLE; } -string SMTPortfolio::dumpQuery(vector const& _expressionsToEvaluate) +std::string SMTPortfolio::dumpQuery(std::vector const& _expressionsToEvaluate) { // This code assumes that the constructor guarantees that // SmtLib2Interface is in position 0, if enabled. diff --git a/libsmtutil/Sorts.cpp b/libsmtutil/Sorts.cpp index 543c7ba0f840..b45bb303c892 100644 --- a/libsmtutil/Sorts.cpp +++ b/libsmtutil/Sorts.cpp @@ -19,22 +19,20 @@ #include -using namespace std; - namespace solidity::smtutil { -shared_ptr const SortProvider::boolSort{make_shared(Kind::Bool)}; -shared_ptr const SortProvider::uintSort{make_shared(false)}; -shared_ptr const SortProvider::sintSort{make_shared(true)}; +std::shared_ptr const SortProvider::boolSort{std::make_shared(Kind::Bool)}; +std::shared_ptr const SortProvider::uintSort{std::make_shared(false)}; +std::shared_ptr const SortProvider::sintSort{std::make_shared(true)}; -shared_ptr SortProvider::intSort(bool _signed) +std::shared_ptr SortProvider::intSort(bool _signed) { if (_signed) return sintSort; return uintSort; } -shared_ptr const SortProvider::bitVectorSort{make_shared(256)}; +std::shared_ptr const SortProvider::bitVectorSort{std::make_shared(256)}; } diff --git a/libsmtutil/Z3CHCInterface.cpp b/libsmtutil/Z3CHCInterface.cpp index bfbc9841b6de..a25890e8d10a 100644 --- a/libsmtutil/Z3CHCInterface.cpp +++ b/libsmtutil/Z3CHCInterface.cpp @@ -23,21 +23,20 @@ #include #include -using namespace std; using namespace solidity; using namespace solidity::smtutil; -Z3CHCInterface::Z3CHCInterface(optional _queryTimeout): +Z3CHCInterface::Z3CHCInterface(std::optional _queryTimeout): CHCSolverInterface(_queryTimeout), - m_z3Interface(make_unique(m_queryTimeout)), + m_z3Interface(std::make_unique(m_queryTimeout)), m_context(m_z3Interface->context()), m_solver(*m_context) { Z3_get_version( - &get<0>(m_version), - &get<1>(m_version), - &get<2>(m_version), - &get<3>(m_version) + &std::get<0>(m_version), + &std::get<1>(m_version), + &std::get<2>(m_version), + &std::get<3>(m_version) ); // These need to be set globally. @@ -51,7 +50,7 @@ Z3CHCInterface::Z3CHCInterface(optional _queryTimeout): setSpacerOptions(); } -void Z3CHCInterface::declareVariable(string const& _name, SortPointer const& _sort) +void Z3CHCInterface::declareVariable(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort, ""); m_z3Interface->declareVariable(_name, _sort); @@ -62,7 +61,7 @@ void Z3CHCInterface::registerRelation(Expression const& _expr) m_solver.register_relation(m_z3Interface->functions().at(_expr.name)); } -void Z3CHCInterface::addRule(Expression const& _expr, string const& _name) +void Z3CHCInterface::addRule(Expression const& _expr, std::string const& _name) { z3::expr rule = m_z3Interface->toZ3Expr(_expr); if (m_z3Interface->constants().empty()) @@ -77,7 +76,7 @@ void Z3CHCInterface::addRule(Expression const& _expr, string const& _name) } } -tuple Z3CHCInterface::query(Expression const& _expr) +std::tuple Z3CHCInterface::query(Expression const& _expr) { CheckResult result; try @@ -90,7 +89,7 @@ tuple Z3CHCInterface::que result = CheckResult::SATISFIABLE; // z3 version 4.8.8 modified Spacer to also return // proofs containing nonlinear clauses. - if (m_version >= tuple(4, 8, 8, 0)) + if (m_version >= std::tuple(4, 8, 8, 0)) { auto proof = m_solver.get_answer(); return {result, Expression(true), cexGraph(proof)}; @@ -113,7 +112,7 @@ tuple Z3CHCInterface::que } catch (z3::exception const& _err) { - set msgs{ + std::set msgs{ /// Resource limit (rlimit) exhausted. "max. resource limit exceeded", /// User given timeout exhausted. @@ -178,13 +177,13 @@ CHCSolverInterface::CexGraph Z3CHCInterface::cexGraph(z3::expr const& _proof) CexGraph graph; - stack proofStack; + std::stack proofStack; proofStack.push(_proof.arg(0)); auto const& root = proofStack.top(); graph.nodes.emplace(root.id(), m_z3Interface->fromZ3Expr(fact(root))); - set visited; + std::set visited; visited.insert(root.id()); while (!proofStack.empty()) @@ -227,16 +226,16 @@ z3::expr Z3CHCInterface::fact(z3::expr const& _node) return _node.arg(_node.num_args() - 1); } -string Z3CHCInterface::name(z3::expr const& _predicate) +std::string Z3CHCInterface::name(z3::expr const& _predicate) { smtAssert(_predicate.is_app(), ""); return _predicate.decl().name().str(); } -vector Z3CHCInterface::arguments(z3::expr const& _predicate) +std::vector Z3CHCInterface::arguments(z3::expr const& _predicate) { smtAssert(_predicate.is_app(), ""); - vector args; + std::vector args; for (unsigned i = 0; i < _predicate.num_args(); ++i) args.emplace_back(_predicate.arg(i).to_string()); return args; diff --git a/libsmtutil/Z3Interface.cpp b/libsmtutil/Z3Interface.cpp index 21b31d19f8de..a16e75668e40 100644 --- a/libsmtutil/Z3Interface.cpp +++ b/libsmtutil/Z3Interface.cpp @@ -26,7 +26,6 @@ #include #endif -using namespace std; using namespace solidity::smtutil; using namespace solidity::util; @@ -69,7 +68,7 @@ void Z3Interface::pop() m_solver.pop(); } -void Z3Interface::declareVariable(string const& _name, SortPointer const& _sort) +void Z3Interface::declareVariable(std::string const& _name, SortPointer const& _sort) { smtAssert(_sort, ""); if (_sort->kind == Kind::Function) @@ -80,7 +79,7 @@ void Z3Interface::declareVariable(string const& _name, SortPointer const& _sort) m_constants.emplace(_name, m_context.constant(_name.c_str(), z3Sort(*_sort))); } -void Z3Interface::declareFunction(string const& _name, Sort const& _sort) +void Z3Interface::declareFunction(std::string const& _name, Sort const& _sort) { smtAssert(_sort.kind == Kind::Function, ""); FunctionSort fSort = dynamic_cast(_sort); @@ -95,10 +94,10 @@ void Z3Interface::addAssertion(Expression const& _expr) m_solver.add(toZ3Expr(_expr)); } -pair> Z3Interface::check(vector const& _expressionsToEvaluate) +std::pair> Z3Interface::check(std::vector const& _expressionsToEvaluate) { CheckResult result; - vector values; + std::vector values; try { switch (m_solver.check()) @@ -123,7 +122,7 @@ pair> Z3Interface::check(vector const& _ } catch (z3::exception const& _err) { - set msgs{ + std::set msgs{ /// Resource limit (rlimit) exhausted. "max. resource limit exceeded", /// User given timeout exhausted. @@ -137,7 +136,7 @@ pair> Z3Interface::check(vector const& _ values.clear(); } - return make_pair(result, values); + return std::make_pair(result, values); } z3::expr Z3Interface::toZ3Expr(Expression const& _expr) @@ -150,7 +149,7 @@ z3::expr Z3Interface::toZ3Expr(Expression const& _expr) try { - string const& n = _expr.name; + std::string const& n = _expr.name; if (m_functions.count(n)) return m_functions.at(n)(arguments); else if (m_constants.count(n)) @@ -166,7 +165,7 @@ z3::expr Z3Interface::toZ3Expr(Expression const& _expr) return m_context.bool_val(false); else if (_expr.sort->kind == Kind::Sort) { - auto sortSort = dynamic_pointer_cast(_expr.sort); + auto sortSort = std::dynamic_pointer_cast(_expr.sort); smtAssert(sortSort, ""); return m_context.constant(n.c_str(), z3Sort(*sortSort->inner)); } @@ -233,7 +232,7 @@ z3::expr Z3Interface::toZ3Expr(Expression const& _expr) } else if (n == "bv2int") { - auto intSort = dynamic_pointer_cast(_expr.sort); + auto intSort = std::dynamic_pointer_cast(_expr.sort); smtAssert(intSort, ""); return z3::bv2int(arguments[0], intSort->isSigned); } @@ -243,9 +242,9 @@ z3::expr Z3Interface::toZ3Expr(Expression const& _expr) return z3::store(arguments[0], arguments[1], arguments[2]); else if (n == "const_array") { - shared_ptr sortSort = std::dynamic_pointer_cast(_expr.arguments[0].sort); + std::shared_ptr sortSort = std::dynamic_pointer_cast(_expr.arguments[0].sort); smtAssert(sortSort, ""); - auto arraySort = dynamic_pointer_cast(sortSort->inner); + auto arraySort = std::dynamic_pointer_cast(sortSort->inner); smtAssert(arraySort && arraySort->domain, ""); return z3::const_array(z3Sort(*arraySort->domain), arguments[1]); } @@ -285,7 +284,7 @@ Expression Z3Interface::fromZ3Expr(z3::expr const& _expr) if (_expr.is_quantifier()) { - string quantifierName; + std::string quantifierName; if (_expr.is_exists()) quantifierName = "exists"; else if (_expr.is_forall()) @@ -297,7 +296,7 @@ Expression Z3Interface::fromZ3Expr(z3::expr const& _expr) return Expression(quantifierName, {fromZ3Expr(_expr.body())}, sort); } smtAssert(_expr.is_app(), ""); - vector arguments; + std::vector arguments; for (unsigned i = 0; i < _expr.num_args(); ++i) arguments.push_back(fromZ3Expr(_expr.arg(i))); @@ -370,12 +369,12 @@ Expression Z3Interface::fromZ3Expr(z3::expr const& _expr) return Expression::store(arguments[0], arguments[1], arguments[2]); else if (kind == Z3_OP_CONST_ARRAY) { - auto sortSort = make_shared(fromZ3Sort(_expr.get_sort())); + auto sortSort = std::make_shared(fromZ3Sort(_expr.get_sort())); return Expression::const_array(Expression(sortSort), arguments[0]); } else if (kind == Z3_OP_DT_CONSTRUCTOR) { - auto sortSort = make_shared(fromZ3Sort(_expr.get_sort())); + auto sortSort = std::make_shared(fromZ3Sort(_expr.get_sort())); return Expression::tuple_constructor(Expression(sortSort), arguments); } else if (kind == Z3_OP_DT_ACCESSOR) @@ -412,12 +411,12 @@ z3::sort Z3Interface::z3Sort(Sort const& _sort) case Kind::Tuple: { auto const& tupleSort = dynamic_cast(_sort); - vector cMembers; + std::vector cMembers; for (auto const& member: tupleSort.members) cMembers.emplace_back(member.c_str()); /// Using this instead of the function below because with that one /// we can't use `&sorts[0]` here. - vector sorts; + std::vector sorts; for (auto const& sort: tupleSort.components) sorts.push_back(z3Sort(*sort)); z3::func_decl_vector projs(m_context); @@ -439,7 +438,7 @@ z3::sort Z3Interface::z3Sort(Sort const& _sort) return m_context.int_sort(); } -z3::sort_vector Z3Interface::z3Sort(vector const& _sorts) +z3::sort_vector Z3Interface::z3Sort(std::vector const& _sorts) { z3::sort_vector z3Sorts(m_context); for (auto const& _sort: _sorts) @@ -454,27 +453,27 @@ SortPointer Z3Interface::fromZ3Sort(z3::sort const& _sort) if (_sort.is_int()) return SortProvider::sintSort; if (_sort.is_bv()) - return make_shared(_sort.bv_size()); + return std::make_shared(_sort.bv_size()); if (_sort.is_array()) - return make_shared(fromZ3Sort(_sort.array_domain()), fromZ3Sort(_sort.array_range())); + return std::make_shared(fromZ3Sort(_sort.array_domain()), fromZ3Sort(_sort.array_range())); if (_sort.is_datatype()) { auto name = _sort.name().str(); auto constructor = z3::func_decl(m_context, Z3_get_tuple_sort_mk_decl(m_context, _sort)); - vector memberNames; - vector memberSorts; + std::vector memberNames; + std::vector memberSorts; for (unsigned i = 0; i < constructor.arity(); ++i) { auto accessor = z3::func_decl(m_context, Z3_get_tuple_sort_field_decl(m_context, _sort, i)); memberNames.push_back(accessor.name().str()); memberSorts.push_back(fromZ3Sort(accessor.range())); } - return make_shared(name, memberNames, memberSorts); + return std::make_shared(name, memberNames, memberSorts); } smtAssert(false, ""); } -vector Z3Interface::fromZ3Sort(z3::sort_vector const& _sorts) +std::vector Z3Interface::fromZ3Sort(z3::sort_vector const& _sorts) { return applyMap(_sorts, [this](auto const& sort) { return fromZ3Sort(sort); }); } diff --git a/libsmtutil/Z3Loader.cpp b/libsmtutil/Z3Loader.cpp index 86b17aa0300b..0211f600d9f1 100644 --- a/libsmtutil/Z3Loader.cpp +++ b/libsmtutil/Z3Loader.cpp @@ -27,7 +27,6 @@ #endif #include -using namespace std; using namespace solidity; using namespace solidity::smtutil; @@ -41,7 +40,7 @@ void* Z3Loader::loadSymbol(char const* _name) const { smtAssert(m_handle, "Attempted to use dynamically loaded Z3, even though it is not available."); void* sym = dlsym(m_handle, _name); - smtAssert(sym, string("Symbol \"") + _name + "\" not found in libz3.so"); + smtAssert(sym, std::string("Symbol \"") + _name + "\" not found in libz3.so"); return sym; } @@ -59,7 +58,7 @@ bool Z3Loader::available() const Z3Loader::Z3Loader() { - string libname{"libz3.so." + to_string(Z3_MAJOR_VERSION) + "." + to_string(Z3_MINOR_VERSION)}; + std::string libname{"libz3.so." + std::to_string(Z3_MAJOR_VERSION) + "." + std::to_string(Z3_MINOR_VERSION)}; m_handle = dlmopen(LM_ID_NEWLM, libname.c_str(), RTLD_NOW); } diff --git a/libsolc/libsolc.cpp b/libsolc/libsolc.cpp index 4ceeeac6fad7..105949253260 100644 --- a/libsolc/libsolc.cpp +++ b/libsolc/libsolc.cpp @@ -32,7 +32,6 @@ #include "license.h" -using namespace std; using namespace solidity; using namespace solidity::util; @@ -42,21 +41,21 @@ using solidity::frontend::StandardCompiler; namespace { -// The strings in this list must not be resized after they have been added here (via solidity_alloc()), because +// The std::strings in this list must not be resized after they have been added here (via solidity_alloc()), because // this may potentially change the pointer that was passed to the caller from solidity_alloc(). -static list solidityAllocations; +static std::list solidityAllocations; /// Find the equivalent to @p _data in the list of allocations of solidity_alloc(), /// removes it from the list and returns its value. /// /// If any invalid argument is being passed, it is considered a programming error /// on the caller-side and hence, will call abort() then. -string takeOverAllocation(char const* _data) +std::string takeOverAllocation(char const* _data) { for (auto iter = begin(solidityAllocations); iter != end(solidityAllocations); ++iter) if (iter->data() == _data) { - string chunk = std::move(*iter); + std::string chunk = std::move(*iter); solidityAllocations.erase(iter); return chunk; } @@ -64,11 +63,11 @@ string takeOverAllocation(char const* _data) abort(); } -/// Resizes a std::string to the proper length based on the occurrence of a zero terminator. -void truncateCString(string& _data) +/// Resizes a std::std::string to the proper length based on the occurrence of a zero terminator. +void truncateCString(std::string& _data) { size_t pos = _data.find('\0'); - if (pos != string::npos) + if (pos != std::string::npos) _data.resize(pos); } @@ -77,7 +76,7 @@ ReadCallback::Callback wrapReadCallback(CStyleReadFileCallback _readCallback, vo ReadCallback::Callback readCallback; if (_readCallback) { - readCallback = [=](string const& _kind, string const& _data) + readCallback = [=](std::string const& _kind, std::string const& _data) { char* contents_c = nullptr; char* error_c = nullptr; @@ -106,7 +105,7 @@ ReadCallback::Callback wrapReadCallback(CStyleReadFileCallback _readCallback, vo return readCallback; } -string compile(string _input, CStyleReadFileCallback _readCallback, void* _readContext) +std::string compile(std::string _input, CStyleReadFileCallback _readCallback, void* _readContext) { StandardCompiler compiler(wrapReadCallback(_readCallback, _readContext)); return compiler.compile(std::move(_input)); @@ -118,7 +117,7 @@ extern "C" { extern char const* solidity_license() noexcept { - static string fullLicenseText = otherLicenses + licenseText; + static std::string fullLicenseText = otherLicenses + licenseText; return fullLicenseText.c_str(); } diff --git a/scripts/check_style.sh b/scripts/check_style.sh index bd9fbf00560a..34fbf0381bf7 100755 --- a/scripts/check_style.sh +++ b/scripts/check_style.sh @@ -23,6 +23,8 @@ EXCLUDE_FILES_JOINED=${EXCLUDE_FILES_JOINED%??} NAMESPACE_STD_FREE_FILES=( libevmasm/* liblangutil/* + libsmtutil/* + libsolc/* ) ( From 16220db75963a6f1d0a3dbdc9a0665509018b4d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 28 Jun 2023 13:52:24 +0200 Subject: [PATCH 110/138] IRGeneratorForStatements: Fix undefined order of functions when generating code for index expressions --- Changelog.md | 1 + libsolidity/codegen/ir/IRGeneratorForStatements.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 2ddf6647e06b..fa6ea616b819 100644 --- a/Changelog.md +++ b/Changelog.md @@ -17,6 +17,7 @@ Compiler Features: Bugfixes: + * Code Generator: Fix not entirely deterministic order of functions in unoptimized Yul output. The choice of C++ compiler in some cases would result in different (but equivalent) bytecode (especially from native binaries vs emscripten binaries) * Commandline Interface: Fix internal error when using ``--stop-after parsing`` and requesting some of the outputs that require full analysis or compilation. * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index 509cc28c7aa7..e4eaaf5e8482 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -2295,8 +2295,9 @@ void IRGeneratorForStatements::endVisit(IndexAccess const& _indexAccess) } case DataLocation::Memory: { + string indexAccessFunction = m_utils.memoryArrayIndexAccessFunction(arrayType); string const memAddress = - m_utils.memoryArrayIndexAccessFunction(arrayType) + + indexAccessFunction + "(" + IRVariable(_indexAccess.baseExpression()).part("mpos").name() + ", " + From 5b70830a6410ecfb935231b1c9f33a3b10687901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Thu, 13 Jul 2023 11:07:40 +0200 Subject: [PATCH 111/138] IRGeneratorForStatements: Small refactor in endVisit(IndexAccess) for readability --- .../codegen/ir/IRGeneratorForStatements.cpp | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index e4eaaf5e8482..b2d9571d9ded 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -2295,14 +2295,13 @@ void IRGeneratorForStatements::endVisit(IndexAccess const& _indexAccess) } case DataLocation::Memory: { - string indexAccessFunction = m_utils.memoryArrayIndexAccessFunction(arrayType); - string const memAddress = - indexAccessFunction + - "(" + - IRVariable(_indexAccess.baseExpression()).part("mpos").name() + - ", " + - expressionAsType(*_indexAccess.indexExpression(), *TypeProvider::uint256()) + - ")"; + string const indexAccessFunction = m_utils.memoryArrayIndexAccessFunction(arrayType); + string const baseRef = IRVariable(_indexAccess.baseExpression()).part("mpos").name(); + string const indexExpression = expressionAsType( + *_indexAccess.indexExpression(), + *TypeProvider::uint256() + ); + string const memAddress = indexAccessFunction + "(" + baseRef + ", " + indexExpression + ")"; setLValue(_indexAccess, IRLValue{ *arrayType.baseType(), @@ -2312,28 +2311,28 @@ void IRGeneratorForStatements::endVisit(IndexAccess const& _indexAccess) } case DataLocation::CallData: { - string indexAccessFunction = m_utils.calldataArrayIndexAccessFunction(arrayType); - string const indexAccessFunctionCall = - indexAccessFunction + - "(" + - IRVariable(_indexAccess.baseExpression()).commaSeparatedList() + - ", " + - expressionAsType(*_indexAccess.indexExpression(), *TypeProvider::uint256()) + - ")"; + string const indexAccessFunction = m_utils.calldataArrayIndexAccessFunction(arrayType); + string const baseRef = IRVariable(_indexAccess.baseExpression()).commaSeparatedList(); + string const indexExpression = expressionAsType( + *_indexAccess.indexExpression(), + *TypeProvider::uint256() + ); + string const calldataAddress = indexAccessFunction + "(" + baseRef + ", " + indexExpression + ")"; + if (arrayType.isByteArrayOrString()) define(_indexAccess) << m_utils.cleanupFunction(*arrayType.baseType()) << "(calldataload(" << - indexAccessFunctionCall << + calldataAddress << "))\n"; else if (arrayType.baseType()->isValueType()) define(_indexAccess) << m_utils.readFromCalldata(*arrayType.baseType()) << "(" << - indexAccessFunctionCall << + calldataAddress << ")\n"; else - define(_indexAccess) << indexAccessFunctionCall << "\n"; + define(_indexAccess) << calldataAddress << "\n"; break; } } From 1628678de2410ac66eac3bb2131c2728b05a16fd Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Fri, 14 Jul 2023 12:54:28 +0200 Subject: [PATCH 112/138] Remove missing test from OZ script --- test/externalTests/zeppelin.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index cf8df4363e13..f0570bf46897 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -83,10 +83,9 @@ function zeppelin_test sed -i "s|it(\('reverts if index is greater than supply'\)|it.skip(\1|g" test/token/ERC721/ERC721.behavior.js sed -i "s|it(\('burns all tokens'\)|it.skip(\1|g" test/token/ERC721/ERC721.behavior.js sed -i "s|it(\('guards transfer against invalid user'\)|it.skip(\1|g" test/access/Ownable2Step.test.js - sed -i "s|it(\('reverting initialization'\)|it.skip(\1|g" test/proxy/beacon/BeaconProxy.test.js + sed -i "s|it(\('reverting initialization function'\)|it.skip(\1|g" test/proxy/beacon/BeaconProxy.test.js sed -i "s|describe(\('reverting initialization'\)|describe.skip(\1|g" test/proxy/Proxy.behaviour.js sed -i "s|it(\('does not allow remote callback'\)|it.skip(\1|g" test/security/ReentrancyGuard.test.js - sed -i "s|shouldBehaveLikeAccessControlDefaultAdminRules|\/\/&|" test/access/AccessControlDefaultAdminRules.test.js # TODO: Remove when hardhat properly handle reverts of custom errors with via-ir enabled # and/or open-zeppelin fix https://github.com/OpenZeppelin/openzeppelin-contracts/issues/4349 From ea724071b1535ae54f12e24cdcf5f1225c26d136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 19 Jun 2023 11:29:00 +0200 Subject: [PATCH 113/138] prepare_report: Add viaIR presets --- scripts/bytecodecompare/prepare_report.js | 8 ++++++-- scripts/bytecodecompare/prepare_report.py | 13 +++++++++++-- test/scripts/test_bytecodecompare_prepare_report.py | 7 ++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/scripts/bytecodecompare/prepare_report.js b/scripts/bytecodecompare/prepare_report.js index 8c714679beff..451a67bb1dc9 100755 --- a/scripts/bytecodecompare/prepare_report.js +++ b/scripts/bytecodecompare/prepare_report.js @@ -5,8 +5,10 @@ const fs = require('fs') const compiler = require('solc') SETTINGS_PRESETS = { - 'legacy-optimize': {optimize: true}, - 'legacy-no-optimize': {optimize: false}, + 'legacy-optimize': {optimize: true, viaIR: false}, + 'legacy-no-optimize': {optimize: false, viaIR: false}, + 'via-ir-optimize': {optimize: true, viaIR: true}, + 'via-ir-no-optimize': {optimize: false, viaIR: true}, } function loadSource(sourceFileName, stripSMTPragmas) @@ -67,6 +69,8 @@ for (const preset of presets) }, settings: { optimizer: {enabled: settings.optimize}, + // NOTE: We omit viaIR rather than set it to false to handle older versions that don't have it. + viaIR: settings.viaIR ? true : undefined, outputSelection: {'*': {'*': ['evm.bytecode.object', 'metadata']}} } } diff --git a/scripts/bytecodecompare/prepare_report.py b/scripts/bytecodecompare/prepare_report.py index 6ec80e753ab5..b99e06b7d5dc 100755 --- a/scripts/bytecodecompare/prepare_report.py +++ b/scripts/bytecodecompare/prepare_report.py @@ -29,6 +29,8 @@ class CompilerInterface(Enum): class SettingsPreset(Enum): LEGACY_OPTIMIZE = 'legacy-optimize' LEGACY_NO_OPTIMIZE = 'legacy-no-optimize' + VIA_IR_OPTIMIZE = 'via-ir-optimize' + VIA_IR_NO_OPTIMIZE = 'via-ir-no-optimize' class SMTUse(Enum): @@ -40,12 +42,15 @@ class SMTUse(Enum): @dataclass(frozen=True) class CompilerSettings: optimize: bool + via_ir: bool @staticmethod def from_preset(preset: SettingsPreset): return { - SettingsPreset.LEGACY_OPTIMIZE: CompilerSettings(optimize=True), - SettingsPreset.LEGACY_NO_OPTIMIZE: CompilerSettings(optimize=False), + SettingsPreset.LEGACY_OPTIMIZE: CompilerSettings(optimize=True, via_ir=False), + SettingsPreset.LEGACY_NO_OPTIMIZE: CompilerSettings(optimize=False, via_ir=False), + SettingsPreset.VIA_IR_OPTIMIZE: CompilerSettings(optimize=True, via_ir=True), + SettingsPreset.VIA_IR_NO_OPTIMIZE: CompilerSettings(optimize=False, via_ir=True), }[preset] @@ -224,6 +229,8 @@ def prepare_compiler_input( }, 'settings': { 'optimizer': {'enabled': settings.optimize}, + # NOTE: We omit viaIR rather than set it to false to handle older versions that don't have it. + **({'viaIR': True} if settings.via_ir else {}), 'outputSelection': {'*': {'*': ['evm.bytecode.object', 'metadata']}}, } } @@ -243,6 +250,8 @@ def prepare_compiler_input( compiler_options.append('--optimize') elif force_no_optimize_yul: compiler_options.append('--no-optimize-yul') + if settings.via_ir: + compiler_options.append('--via-ir') if smt_use == SMTUse.DISABLE: compiler_options += ['--model-checker-engine', 'none'] diff --git a/test/scripts/test_bytecodecompare_prepare_report.py b/test/scripts/test_bytecodecompare_prepare_report.py index 16d73ee39acd..b8a1791d652c 100644 --- a/test/scripts/test_bytecodecompare_prepare_report.py +++ b/test/scripts/test_bytecodecompare_prepare_report.py @@ -265,6 +265,7 @@ def test_prepare_compiler_input_for_json_preserves_newlines(self): }, 'settings': { 'optimizer': {'enabled': True}, + 'viaIR': True, 'outputSelection': {'*': {'*': ['evm.bytecode.object', 'metadata']}}, 'modelChecker': {'engine': 'none'}, } @@ -273,7 +274,7 @@ def test_prepare_compiler_input_for_json_preserves_newlines(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_CONTRACT_WITH_MIXED_NEWLINES_SOL_PATH, - preset=SettingsPreset.LEGACY_OPTIMIZE, + preset=SettingsPreset.VIA_IR_OPTIMIZE, force_no_optimize_yul=False, interface=CompilerInterface.STANDARD_JSON, smt_use=SMTUse.DISABLE, @@ -317,7 +318,7 @@ def test_prepare_compiler_input_for_cli_should_not_use_metadata_option_if_not_su (command_line, compiler_input) = prepare_compiler_input( Path('solc'), SMT_SMOKE_TEST_SOL_PATH, - preset=SettingsPreset.LEGACY_OPTIMIZE, + preset=SettingsPreset.VIA_IR_OPTIMIZE, force_no_optimize_yul=False, interface=CompilerInterface.CLI, smt_use=SMTUse.PRESERVE, @@ -326,7 +327,7 @@ def test_prepare_compiler_input_for_cli_should_not_use_metadata_option_if_not_su self.assertEqual( command_line, - ['solc', str(SMT_SMOKE_TEST_SOL_PATH), '--bin', '--optimize'], + ['solc', str(SMT_SMOKE_TEST_SOL_PATH), '--bin', '--optimize', '--via-ir'], ) self.assertEqual(compiler_input, SMT_SMOKE_TEST_SOL_CODE) From ae3b7625c9d2e3e9afa35324961d0e908726bf88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 20 Jun 2023 14:51:53 +0200 Subject: [PATCH 114/138] CI: Include via IR presets in the bytecode comparison --- .circleci/config.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 06cc0c475b6f..bb6e562f11fe 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -88,6 +88,7 @@ commands: steps: - run: name: Generate bytecode reports for the selected preset + no_output_timeout: 30m command: | .circleci/parallel_bytecode_report.sh \ "<< parameters.label >>" \ @@ -227,6 +228,8 @@ defaults: PRESETS: legacy-optimize legacy-no-optimize + via-ir-optimize + via-ir-no-optimize - bytecode_compare_preset_matrix: &bytecode_compare_preset_matrix parameters: @@ -234,6 +237,8 @@ defaults: # NOTE: Keep in sync with preset list in bytecode_compare_env_presets - legacy-optimize - legacy-no-optimize + - via-ir-optimize + - via-ir-no-optimize # -------------------------------------------------------------------------- # Artifacts Templates From 23955ba42800f354b66b37675a1a0cb68b1c6229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 20 Jun 2023 16:38:48 +0200 Subject: [PATCH 115/138] CI: Workaround for some test cases crashing the compiler via IR during bytecode comparison due to a regex-related bug --- .circleci/parallel_bytecode_report.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/parallel_bytecode_report.sh b/.circleci/parallel_bytecode_report.sh index 208230622107..4a19015ce62f 100755 --- a/.circleci/parallel_bytecode_report.sh +++ b/.circleci/parallel_bytecode_report.sh @@ -44,6 +44,9 @@ cd test-cases/ echo "Preparing input files" python3 ../scripts/isolate_tests.py ../test/ +# FIXME: These cases crash because of https://github.com/ethereum/solidity/issues/13583 +rm ./*_bytecode_too_large_*.sol ./*_combined_too_large_*.sol + if [[ $binary_type == native ]]; then interface=$(echo -e "standard-json\ncli" | circleci tests split) echo "Selected interface: ${interface}" From bccfcd40a02b06af97f536e0636253a2dbfad775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 28 Jun 2023 17:28:41 +0200 Subject: [PATCH 116/138] prepare_report: Add YulException to the list of ICEs for which we ignore Standard JSON outputs even when present --- scripts/bytecodecompare/prepare_report.js | 2 +- scripts/bytecodecompare/prepare_report.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/bytecodecompare/prepare_report.js b/scripts/bytecodecompare/prepare_report.js index 451a67bb1dc9..cba7a0800116 100755 --- a/scripts/bytecodecompare/prepare_report.js +++ b/scripts/bytecodecompare/prepare_report.js @@ -100,7 +100,7 @@ for (const preset of presets) // JSON interface still returns contract metadata in case of an internal compiler error while // CLI interface does not. To make reports comparable we must force this case to be detected as // an error in both cases. - if (['UnimplementedFeatureError', 'CompilerError', 'CodeGenerationError'].includes(error['type'])) + if (['UnimplementedFeatureError', 'CompilerError', 'CodeGenerationError', 'YulException'].includes(error['type'])) { internalCompilerError = true break diff --git a/scripts/bytecodecompare/prepare_report.py b/scripts/bytecodecompare/prepare_report.py index b99e06b7d5dc..4cf24bb8aa40 100755 --- a/scripts/bytecodecompare/prepare_report.py +++ b/scripts/bytecodecompare/prepare_report.py @@ -157,7 +157,7 @@ def parse_standard_json_output(source_file_name: Path, standard_json_output: str # CLI interface does not. To make reports comparable we must force this case to be detected as # an error in both cases. internal_compiler_error = any( - error['type'] in ['UnimplementedFeatureError', 'CompilerError', 'CodeGenerationError'] + error['type'] in ['UnimplementedFeatureError', 'CompilerError', 'CodeGenerationError', 'YulException'] for error in decoded_json_output.get('errors', {}) ) From 0afe025f193bbe1cd43db2579f5da96b11960beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 2 Jun 2023 12:40:19 +0200 Subject: [PATCH 117/138] Minor tweaks to immutable tests for better diffs --- .../immutable/ctor_initialization_indirect_reading.sol | 2 +- .../immutable/function_initialization_reading.sol | 2 +- .../syntaxTests/immutable/function_pointer_reading.sol | 4 ++-- .../immutable/indirect_reading_during_statevar_init.sol | 4 ++-- .../immutable/inheritance_virtual_functions.sol | 6 +++--- .../immutable/init_in_constructor_modifier_param.sol | 7 +++++++ .../immutable/init_in_inheritance_specifier_param.sol | 2 +- .../syntaxTests/immutable/init_in_modifier_param.sol | 7 ------- .../immutable/multiple_inheritance_virtual_functions.sol | 6 +++--- .../multiple_inheritance_virtual_functions_with_super.sol | 6 +++--- .../syntaxTests/immutable/read_in_function_before_init.sol | 4 ++-- .../immutable/reading_after_initialization_function.sol | 4 ++-- .../syntaxTests/immutable/try_catch_initialized.sol | 1 - 13 files changed, 27 insertions(+), 28 deletions(-) create mode 100644 test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol delete mode 100644 test/libsolidity/syntaxTests/immutable/init_in_modifier_param.sol diff --git a/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol b/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol index 0ee583b56200..1bd0f6b91309 100644 --- a/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol @@ -4,7 +4,7 @@ contract C { x = f(); } - function f() public pure returns (uint) { return 3 + x; } + function f() public view returns (uint) { return 3 + x; } } // ---- // TypeError 7733: (136-137): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol b/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol index 7933f8e7f9c2..06868858473b 100644 --- a/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol @@ -1,7 +1,7 @@ contract C { uint immutable x = f(); - function f() public pure returns (uint) { return 3 + x; } + function f() public view returns (uint) { return 3 + x; } } // ---- // TypeError 7733: (99-100): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol b/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol index e94fd155ccd9..5c026300c23b 100644 --- a/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol @@ -7,7 +7,7 @@ abstract contract B { } contract C is B(C.f) { - function f() internal returns(uint) { return x + 2; } + function f() internal view returns(uint) { return x + 2; } } // ---- -// TypeError 7733: (200-201): Immutable variables cannot be read before they are initialized. +// TypeError 7733: (205-206): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol b/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol index eaa2186f10ea..ff7927277cad 100644 --- a/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol +++ b/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol @@ -2,7 +2,7 @@ contract C { uint immutable x = 0; uint y = f(); - function f() internal returns(uint) { return x; } + function f() internal pure returns(uint) { return x; } } // ---- -// TypeError 7733: (107-108): Immutable variables cannot be read before they are initialized. +// TypeError 7733: (112-113): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol b/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol index dc11b8a61c5c..f33ce4cc4d95 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol @@ -5,15 +5,15 @@ contract B { x = xInit(); } - function xInit() internal virtual returns(uint) { + function xInit() internal view virtual returns(uint) { return 3; } } contract C is B { - function xInit() internal override returns(uint) { + function xInit() internal view override returns(uint) { return x; } } // ---- -// TypeError 7733: (253-254): Immutable variables cannot be read before they are initialized. +// TypeError 7733: (263-264): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol new file mode 100644 index 000000000000..d23416942fb0 --- /dev/null +++ b/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol @@ -0,0 +1,7 @@ +contract D { + uint immutable t; + modifier m(uint) { _; } + constructor() m(t = 2) {} +} +// ---- +// TypeError 1581: (83-84): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol index 63662e1b7abc..cc56202e73a4 100644 --- a/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol +++ b/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol @@ -1,6 +1,6 @@ contract C { constructor(uint) {} } contract D is C(D.t = 2) { - uint immutable t; + uint immutable t; } // ---- // TypeError 1581: (52-55): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_modifier_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_modifier_param.sol deleted file mode 100644 index 3e354b4e92c4..000000000000 --- a/test/libsolidity/syntaxTests/immutable/init_in_modifier_param.sol +++ /dev/null @@ -1,7 +0,0 @@ -contract D { - uint immutable t; - modifier m(uint) { _; } - constructor() m(t=2) {} -} -// ---- -// TypeError 1581: (77-78): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol index 33749c8cdc3d..401b068cb687 100644 --- a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol +++ b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol @@ -13,7 +13,7 @@ contract B { return f(); } - function f() internal virtual returns(uint) { return 3; } + function f() internal view virtual returns(uint) { return 3; } } contract C is A, B { @@ -21,9 +21,9 @@ contract C is A, B { return B.xInit(); } - function f() internal override(A, B) returns(uint) { + function f() internal view override(A, B) returns(uint) { return x; } } // ---- -// TypeError 7733: (489-490): Immutable variables cannot be read before they are initialized. +// TypeError 7733: (499-500): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol index 11da864db234..bf5a1f85b38c 100644 --- a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol +++ b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol @@ -13,7 +13,7 @@ contract B { return f(); } - function f() internal virtual returns(uint) { return 3; } + function f() internal view virtual returns(uint) { return 3; } } contract C is A, B { @@ -21,9 +21,9 @@ contract C is A, B { return super.xInit(); } - function f() internal override(A, B) returns(uint) { + function f() internal view override(A, B) returns(uint) { return x; } } // ---- -// TypeError 7733: (493-494): Immutable variables cannot be read before they are initialized. +// TypeError 7733: (503-504): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol b/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol index 3ca0df2700f3..6e934ff9d46c 100644 --- a/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol +++ b/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol @@ -2,11 +2,11 @@ abstract contract A { uint public t; constructor() { t = f(); } - function f() virtual view internal returns (uint); + function f() virtual pure internal returns (uint); } contract B is A { uint immutable x = 2; - function f() override view internal returns (uint) { return x; } + function f() override pure internal returns (uint) { return x; } } // ---- // TypeError 7733: (223-224): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol b/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol index 70d4ac4c8413..32ac0cceb494 100644 --- a/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol +++ b/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol @@ -1,5 +1,5 @@ contract C { - uint immutable x ; + uint immutable x; constructor() { @@ -13,4 +13,4 @@ contract C { } } // ---- -// TypeError 7733: (145-146): Immutable variables cannot be read before they are initialized. +// TypeError 7733: (141-142): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol b/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol index 2d901a020091..9cd18a2b61df 100644 --- a/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol +++ b/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol @@ -31,7 +31,6 @@ contract B revert(); } } - // ==== // EVMVersion: >=byzantium // ---- From 490b90d0abea120d96e219798ed98fc78905cd3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Mon, 5 Jun 2023 14:12:56 +0200 Subject: [PATCH 118/138] Implement ImmutableItem::setToZero() to make delete work with immutables --- libsolidity/codegen/LValue.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libsolidity/codegen/LValue.cpp b/libsolidity/codegen/LValue.cpp index 8f20cd992a92..b99ebceddd09 100644 --- a/libsolidity/codegen/LValue.cpp +++ b/libsolidity/codegen/LValue.cpp @@ -187,9 +187,16 @@ void ImmutableItem::storeValue(Type const& _sourceType, SourceLocation const&, b m_context << Instruction::POP; } -void ImmutableItem::setToZero(SourceLocation const&, bool) const +void ImmutableItem::setToZero(SourceLocation const&, bool _removeReference) const { - solAssert(false, "Attempted to set immutable variable to zero."); + CompilerUtils utils(m_context); + solUnimplementedAssert(m_dataType->isValueType()); + solAssert(_removeReference); + + m_context << m_context.immutableMemoryOffset(m_variable); + utils.pushZeroValue(*m_dataType); + utils.storeInMemoryDynamic(*m_dataType); + m_context << Instruction::POP; } StorageItem::StorageItem(CompilerContext& _compilerContext, VariableDeclaration const& _declaration): From dad2bf64723cc83f0168bae0310714db01983a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 30 May 2023 16:07:00 +0200 Subject: [PATCH 119/138] Relax restrictions on immutable initialization --- Changelog.md | 1 + docs/cheatsheet.rst | 2 +- docs/contracts/constant-state-variables.rst | 48 ++-- docs/ir-breaking-changes.rst | 2 + libsolidity/analysis/ImmutableValidator.cpp | 261 +----------------- libsolidity/analysis/ImmutableValidator.h | 38 +-- .../semanticTests/immutable/delete.sol | 15 + .../immutable/increment_decrement.sol | 18 ++ .../immutable/multiple_initializations.sol | 27 ++ .../semanticTests/immutable/uninitialized.sol | 11 + .../conditional_return_uninitialized.sol | 2 - .../immutable/conditionally_initialized.sol | 2 - .../ctor_initialization_indirect_reading.sol | 2 - .../immutable/ctor_initialization_reading.sol | 2 - .../immutable/ctor_modifier_args.sol | 1 - .../immutable/ctor_modifier_reading.sol | 2 - .../syntaxTests/immutable/decrement.sol | 2 - .../syntaxTests/immutable/delete.sol | 8 - .../immutable/delete_and_initialize.sol | 8 - .../function_initialization_reading.sol | 2 - .../function_pointer_initializing.sol | 1 - .../immutable/function_pointer_reading.sol | 1 - .../syntaxTests/immutable/increment.sol | 2 - .../immutable/increment_decrement.sol | 11 - .../indirect_reading_during_statevar_init.sol | 1 - .../immutable/inheritance_ctor_argument.sol | 2 - ...e_ctor_inherit_specifier_argument_init.sol | 2 - ...tor_inherit_specifier_argument_reading.sol | 2 - .../inheritance_virtual_functions.sol | 1 - .../inheritance_virtual_modifiers.sol | 2 - .../immutable/inheritance_wrong_ctor.sol | 2 - .../init_in_constructor_modifier_param.sol | 1 - .../immutable/init_in_ctor_param.sol | 2 - .../init_in_function_modifier_param.sol | 7 + .../init_in_function_via_contract_name.sol | 11 + .../immutable/init_in_function_via_super.sol | 13 + .../init_in_inheritance_specifier_param.sol | 2 - .../immutable/loop_initialized.sol | 2 - ...multiple_inheritance_virtual_functions.sol | 1 - ...heritance_virtual_functions_with_super.sol | 1 - .../immutable/multiple_initializations.sol | 2 - .../immutable/private_state_var.sol | 2 - .../read_in_function_before_init.sol | 2 - .../read_in_function_before_init2.sol | 2 - .../reading_after_initialization_function.sol | 1 - .../reading_during_statevar_init.sol | 2 - .../immutable/return_uninitialized.sol | 2 +- .../state_var_external_access_read.sol | 13 + .../state_var_external_access_write.sol | 11 + .../immutable/try_catch_initialized.sol | 6 - .../syntaxTests/immutable/uninitialized.sol | 2 - .../uninitialized_private_state_var.sol | 3 - .../variable_declaration_already.sol | 3 - .../immutable/variable_declaration_value.sol | 2 - 54 files changed, 178 insertions(+), 396 deletions(-) create mode 100644 test/libsolidity/semanticTests/immutable/delete.sol create mode 100644 test/libsolidity/semanticTests/immutable/increment_decrement.sol create mode 100644 test/libsolidity/semanticTests/immutable/multiple_initializations.sol create mode 100644 test/libsolidity/semanticTests/immutable/uninitialized.sol delete mode 100644 test/libsolidity/syntaxTests/immutable/delete.sol delete mode 100644 test/libsolidity/syntaxTests/immutable/delete_and_initialize.sol delete mode 100644 test/libsolidity/syntaxTests/immutable/increment_decrement.sol create mode 100644 test/libsolidity/syntaxTests/immutable/init_in_function_modifier_param.sol create mode 100644 test/libsolidity/syntaxTests/immutable/init_in_function_via_contract_name.sol create mode 100644 test/libsolidity/syntaxTests/immutable/init_in_function_via_super.sol create mode 100644 test/libsolidity/syntaxTests/immutable/state_var_external_access_read.sol create mode 100644 test/libsolidity/syntaxTests/immutable/state_var_external_access_write.sol diff --git a/Changelog.md b/Changelog.md index fa6ea616b819..4cbddb3dd92f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,7 @@ Language Features: * Allow qualified access to events from other contracts. + * Relax restrictions on initialization of immutable variables. Reads and writes may now happen at any point at construction time outside of functions and modifiers. Explicit initialization is no longer mandatory. Compiler Features: * Commandline Interface: Add ``--ast-compact-json`` output in assembler mode. diff --git a/docs/cheatsheet.rst b/docs/cheatsheet.rst index 34ad46df6aeb..a60d3b50f526 100644 --- a/docs/cheatsheet.rst +++ b/docs/cheatsheet.rst @@ -150,7 +150,7 @@ Modifiers - ``view`` for functions: Disallows modification of state. - ``payable`` for functions: Allows them to receive Ether together with a call. - ``constant`` for state variables: Disallows assignment (except initialisation), does not occupy storage slot. -- ``immutable`` for state variables: Allows exactly one assignment at construction time and is constant afterwards. Is stored in code. +- ``immutable`` for state variables: Allows assignment at construction time and is constant when deployed. Is stored in code. - ``anonymous`` for events: Does not store event signature as topic. - ``indexed`` for event parameters: Stores the parameter as topic. - ``virtual`` for functions and modifiers: Allows the function's or modifier's diff --git a/docs/contracts/constant-state-variables.rst b/docs/contracts/constant-state-variables.rst index 1b57bf3bec5b..a1bc24f50c64 100644 --- a/docs/contracts/constant-state-variables.rst +++ b/docs/contracts/constant-state-variables.rst @@ -30,19 +30,23 @@ Not all types for constants and immutables are implemented at this time. The onl .. code-block:: solidity // SPDX-License-Identifier: GPL-3.0 - pragma solidity >=0.7.4; + pragma solidity ^0.8.21; uint constant X = 32**22 + 8; contract C { string constant TEXT = "abc"; bytes32 constant MY_HASH = keccak256("abc"); - uint immutable decimals; + uint immutable decimals = 18; uint immutable maxBalance; address immutable owner = msg.sender; constructor(uint decimals_, address ref) { - decimals = decimals_; + if (decimals_ != 0) + // Immutables are only immutable when deployed. + // At construction time they can be assigned to any number of times. + decimals = decimals_; + // Assignments to immutables can even access the environment. maxBalance = ref.balance; } @@ -74,10 +78,29 @@ Immutable ========= Variables declared as ``immutable`` are a bit less restricted than those -declared as ``constant``: Immutable variables can be assigned an arbitrary -value in the constructor of the contract or at the point of their declaration. -They can be assigned only once and can, from that point on, be read even during -construction time. +declared as ``constant``: Immutable variables can be assigned a +value at construction time. +The value can be changed at any time before deployment and then it becomes permanent. + +One additional restriction is that immutables can only be assigned to inside expressions for which +there is no possibility of being executed after creation. +This excludes all modifier definitions and functions other than constructors. + +There are no restrictions on reading immutable variables. +The read is even allowed to happen before the variable is written to for the first time because variables in +Solidity always have a well-defined initial value. +For this reason it is also allowed to never explicitly assign a value to an immutable. + +.. warning:: + When accessing immutables at construction time, please keep the :ref:`initialization order + ` in mind. + Even if you provide an explicit initializer, some expressions may end up being evaluated before + that initializer, especially when they are at a different level in inheritance hierarchy. + +.. note:: + Before Solidity 0.8.21 initialization of immutable variables was more restrictive. + Such variables had to be initialized exactly once at construction time and could not be read + before then. The contract creation code generated by the compiler will modify the contract's runtime code before it is returned by replacing all references @@ -86,14 +109,3 @@ you are comparing the runtime code generated by the compiler with the one actually stored in the blockchain. The compiler outputs where these immutables are located in the deployed bytecode in the ``immutableReferences`` field of the :ref:`compiler JSON standard output `. - -.. note:: - Immutables that are assigned at their declaration are only considered - initialized once the constructor of the contract is executing. - This means you cannot initialize immutables inline with a value - that depends on another immutable. You can do this, however, - inside the constructor of the contract. - - This is a safeguard against different interpretations about the order - of state variable initialization and constructor execution, especially - with regards to inheritance. diff --git a/docs/ir-breaking-changes.rst b/docs/ir-breaking-changes.rst index 38e6b552f35d..4917cfc7158d 100644 --- a/docs/ir-breaking-changes.rst +++ b/docs/ir-breaking-changes.rst @@ -30,6 +30,8 @@ Semantic Only Changes This section lists the changes that are semantic-only, thus potentially hiding new and different behavior in existing code. +.. _state-variable-initialization-order: + - The order of state variable initialization has changed in case of inheritance. The order used to be: diff --git a/libsolidity/analysis/ImmutableValidator.cpp b/libsolidity/analysis/ImmutableValidator.cpp index 8e89c49ab98a..0f5a2ee2e0e6 100644 --- a/libsolidity/analysis/ImmutableValidator.cpp +++ b/libsolidity/analysis/ImmutableValidator.cpp @@ -18,8 +18,6 @@ #include -#include - #include using namespace solidity::frontend; @@ -27,275 +25,44 @@ using namespace solidity::langutil; void ImmutableValidator::analyze() { - m_inCreationContext = true; - auto linearizedContracts = m_mostDerivedContract.annotation().linearizedBaseContracts | ranges::views::reverse; - for (ContractDefinition const* contract: linearizedContracts) - for (VariableDeclaration const* stateVar: contract->stateVariables()) - if (stateVar->value()) - stateVar->value()->accept(*this); - - for (ContractDefinition const* contract: linearizedContracts) - for (std::shared_ptr const& inheritSpec: contract->baseContracts()) - if (auto args = inheritSpec->arguments()) - ASTNode::listAccept(*args, *this); - - for (ContractDefinition const* contract: linearizedContracts) - { - for (VariableDeclaration const* stateVar: contract->stateVariables()) - if (stateVar->value()) - m_initializedStateVariables.emplace(stateVar); - - if (contract->constructor()) - visitCallableIfNew(*contract->constructor()); - } - - m_inCreationContext = false; - for (ContractDefinition const* contract: linearizedContracts) { - for (auto funcDef: contract->definedFunctions()) - visitCallableIfNew(*funcDef); + for (FunctionDefinition const* function: contract->definedFunctions()) + function->accept(*this); - for (auto modDef: contract->functionModifiers()) - visitCallableIfNew(*modDef); + for (ModifierDefinition const* modifier: contract->functionModifiers()) + modifier->accept(*this); } - - checkAllVariablesInitialized(m_mostDerivedContract.location()); } -bool ImmutableValidator::visit(Assignment const& _assignment) -{ - // Need to visit values first (rhs) as they might access other immutables. - _assignment.rightHandSide().accept(*this); - _assignment.leftHandSide().accept(*this); - return false; -} - - bool ImmutableValidator::visit(FunctionDefinition const& _functionDefinition) { - return analyseCallable(_functionDefinition); -} - -bool ImmutableValidator::visit(ModifierDefinition const& _modifierDefinition) -{ - return analyseCallable(_modifierDefinition); -} - -bool ImmutableValidator::visit(MemberAccess const& _memberAccess) -{ - _memberAccess.expression().accept(*this); - - if (auto contractType = dynamic_cast(_memberAccess.expression().annotation().type)) - if (!contractType->isSuper()) - // external access, no analysis needed. - return false; - - if (auto varDecl = dynamic_cast(_memberAccess.annotation().referencedDeclaration)) - analyseVariableReference(*varDecl, _memberAccess); - else if (auto funcType = dynamic_cast(_memberAccess.annotation().type)) - if (funcType->kind() == FunctionType::Kind::Internal && funcType->hasDeclaration()) - visitCallableIfNew(funcType->declaration()); - - return false; -} - -bool ImmutableValidator::visit(IfStatement const& _ifStatement) -{ - bool prevInBranch = m_inBranch; - - _ifStatement.condition().accept(*this); - - m_inBranch = true; - _ifStatement.trueStatement().accept(*this); - - if (auto falseStatement = _ifStatement.falseStatement()) - falseStatement->accept(*this); - - m_inBranch = prevInBranch; - - return false; -} - -bool ImmutableValidator::visit(WhileStatement const& _whileStatement) -{ - bool prevInLoop = m_inLoop; - m_inLoop = true; - - _whileStatement.condition().accept(*this); - _whileStatement.body().accept(*this); - - m_inLoop = prevInLoop; - - return false; -} - -bool ImmutableValidator::visit(TryStatement const& _tryStatement) -{ - ScopedSaveAndRestore constructorGuard{m_inTryStatement, true}; - - _tryStatement.externalCall().accept(*this); - - for (auto&& clause: _tryStatement.clauses()) - if (clause) - clause->accept(*this); - - return false; + return !_functionDefinition.isConstructor(); } -void ImmutableValidator::endVisit(IdentifierPath const& _identifierPath) +void ImmutableValidator::endVisit(MemberAccess const& _memberAccess) { - if (auto const callableDef = dynamic_cast(_identifierPath.annotation().referencedDeclaration)) - visitCallableIfNew( - *_identifierPath.annotation().requiredLookup == VirtualLookup::Virtual ? - callableDef->resolveVirtual(m_mostDerivedContract) : - *callableDef - ); - - solAssert(!dynamic_cast(_identifierPath.annotation().referencedDeclaration), ""); + analyseVariableReference(_memberAccess.annotation().referencedDeclaration, _memberAccess); } void ImmutableValidator::endVisit(Identifier const& _identifier) { - if (auto const callableDef = dynamic_cast(_identifier.annotation().referencedDeclaration)) - visitCallableIfNew(*_identifier.annotation().requiredLookup == VirtualLookup::Virtual ? callableDef->resolveVirtual(m_mostDerivedContract) : *callableDef); - if (auto const varDecl = dynamic_cast(_identifier.annotation().referencedDeclaration)) - analyseVariableReference(*varDecl, _identifier); -} - -void ImmutableValidator::endVisit(Return const& _return) -{ - if (m_currentConstructor != nullptr) - checkAllVariablesInitialized(_return.location()); -} - -bool ImmutableValidator::analyseCallable(CallableDeclaration const& _callableDeclaration) -{ - ScopedSaveAndRestore constructorGuard{m_currentConstructor, {}}; - ScopedSaveAndRestore constructorContractGuard{m_currentConstructorContract, {}}; - - if (FunctionDefinition const* funcDef = dynamic_cast(&_callableDeclaration)) - { - ASTNode::listAccept(funcDef->modifiers(), *this); - - if (funcDef->isConstructor()) - { - m_currentConstructorContract = funcDef->annotation().contract; - m_currentConstructor = funcDef; - } - - if (funcDef->isImplemented()) - funcDef->body().accept(*this); - } - else if (ModifierDefinition const* modDef = dynamic_cast(&_callableDeclaration)) - if (modDef->isImplemented()) - modDef->body().accept(*this); - - return false; + analyseVariableReference(_identifier.annotation().referencedDeclaration, _identifier); } -void ImmutableValidator::analyseVariableReference(VariableDeclaration const& _variableReference, Expression const& _expression) +void ImmutableValidator::analyseVariableReference(Declaration const* _reference, Expression const& _expression) { - if (!_variableReference.isStateVariable() || !_variableReference.immutable()) + auto const* variable = dynamic_cast(_reference); + if (!variable || !variable->isStateVariable() || !variable->immutable()) return; // If this is not an ordinary assignment, we write and read at the same time. - bool write = _expression.annotation().willBeWrittenTo; - bool read = !_expression.annotation().willBeWrittenTo || !_expression.annotation().lValueOfOrdinaryAssignment; - if (write) - { - if (!m_currentConstructor) - m_errorReporter.typeError( - 1581_error, - _expression.location(), - "Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor." - ); - else if (m_currentConstructor->annotation().contract->id() != _variableReference.annotation().contract->id()) - m_errorReporter.typeError( - 7484_error, - _expression.location(), - "Cannot write to immutable here: Immutable variables must be initialized in the constructor of the contract they are defined in." - ); - else if (m_inLoop) - m_errorReporter.typeError( - 6672_error, - _expression.location(), - "Cannot write to immutable here: Immutable variables cannot be initialized inside a loop." - ); - else if (m_inBranch) - m_errorReporter.typeError( - 4599_error, - _expression.location(), - "Cannot write to immutable here: Immutable variables cannot be initialized inside an if statement." - ); - else if (m_inTryStatement) - m_errorReporter.typeError( - 4130_error, - _expression.location(), - "Cannot write to immutable here: Immutable variables cannot be initialized inside a try/catch statement." - ); - else if (m_initializedStateVariables.count(&_variableReference)) - { - if (!read) - m_errorReporter.typeError( - 1574_error, - _expression.location(), - "Immutable state variable already initialized." - ); - else - m_errorReporter.typeError( - 2718_error, - _expression.location(), - "Immutable variables cannot be modified after initialization." - ); - } - else if (read) - m_errorReporter.typeError( - 3969_error, - _expression.location(), - "Immutable variables must be initialized using an assignment." - ); - m_initializedStateVariables.emplace(&_variableReference); - } - if ( - read && - m_inCreationContext && - !m_initializedStateVariables.count(&_variableReference) - ) + if (_expression.annotation().willBeWrittenTo) m_errorReporter.typeError( - 7733_error, + 1581_error, _expression.location(), - "Immutable variables cannot be read before they are initialized." + "Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor." ); } - -void ImmutableValidator::checkAllVariablesInitialized(solidity::langutil::SourceLocation const& _location) -{ - for (ContractDefinition const* contract: m_mostDerivedContract.annotation().linearizedBaseContracts | ranges::views::reverse) - { - for (VariableDeclaration const* varDecl: contract->stateVariables()) - if (varDecl->immutable()) - if (!util::contains(m_initializedStateVariables, varDecl)) - m_errorReporter.typeError( - 2658_error, - _location, - solidity::langutil::SecondarySourceLocation().append("Not initialized: ", varDecl->location()), - "Construction control flow ends without initializing all immutable state variables." - ); - - // Don't check further than the current c'tors contract - if (contract == m_currentConstructorContract) - break; - } -} - -void ImmutableValidator::visitCallableIfNew(Declaration const& _declaration) -{ - CallableDeclaration const* _callable = dynamic_cast(&_declaration); - solAssert(_callable != nullptr, ""); - - if (m_visitedCallables.emplace(_callable).second) - _declaration.accept(*this); -} diff --git a/libsolidity/analysis/ImmutableValidator.h b/libsolidity/analysis/ImmutableValidator.h index 43a4b5dbf404..78d85a61ce0f 100644 --- a/libsolidity/analysis/ImmutableValidator.h +++ b/libsolidity/analysis/ImmutableValidator.h @@ -21,25 +21,15 @@ #include #include -#include - namespace solidity::frontend { /** * Validates access and initialization of immutable variables: - * must be directly initialized in their respective c'tor or inline - * cannot be read before being initialized - * cannot be read when initializing state variables inline - * must be initialized outside loops (only one initialization) - * must be initialized outside ifs (must be initialized unconditionally) - * must be initialized exactly once (no multiple statements) - * must be initialized exactly once (no early return to skip initialization) + * must be directly initialized in a c'tor or inline */ class ImmutableValidator: private ASTConstVisitor { - using CallableDeclarationSet = std::set; - public: ImmutableValidator(langutil::ErrorReporter& _errorReporter, ContractDefinition const& _contractDefinition): m_mostDerivedContract(_contractDefinition), @@ -49,37 +39,15 @@ class ImmutableValidator: private ASTConstVisitor void analyze(); private: - bool visit(Assignment const& _assignment); bool visit(FunctionDefinition const& _functionDefinition); - bool visit(ModifierDefinition const& _modifierDefinition); - bool visit(MemberAccess const& _memberAccess); - bool visit(IfStatement const& _ifStatement); - bool visit(WhileStatement const& _whileStatement); - bool visit(TryStatement const& _tryStatement); - void endVisit(IdentifierPath const& _identifierPath); + void endVisit(MemberAccess const& _memberAccess); void endVisit(Identifier const& _identifier); - void endVisit(Return const& _return); - - bool analyseCallable(CallableDeclaration const& _callableDeclaration); - void analyseVariableReference(VariableDeclaration const& _variableReference, Expression const& _expression); - void checkAllVariablesInitialized(langutil::SourceLocation const& _location); - - void visitCallableIfNew(Declaration const& _declaration); + void analyseVariableReference(Declaration const* _variableReference, Expression const& _expression); ContractDefinition const& m_mostDerivedContract; - CallableDeclarationSet m_visitedCallables; - - std::set m_initializedStateVariables; langutil::ErrorReporter& m_errorReporter; - - FunctionDefinition const* m_currentConstructor = nullptr; - ContractDefinition const* m_currentConstructorContract = nullptr; - bool m_inLoop = false; - bool m_inBranch = false; - bool m_inCreationContext = true; - bool m_inTryStatement = false; }; } diff --git a/test/libsolidity/semanticTests/immutable/delete.sol b/test/libsolidity/semanticTests/immutable/delete.sol new file mode 100644 index 000000000000..76e219a77d44 --- /dev/null +++ b/test/libsolidity/semanticTests/immutable/delete.sol @@ -0,0 +1,15 @@ +contract C { + uint8 immutable public a; + uint8 immutable public b = 0x42; + uint public c; + + constructor() { + delete a; + delete b; + c = b * 2 + a; + } +} +// ---- +// a() -> 0 +// b() -> 0 +// c() -> 0 diff --git a/test/libsolidity/semanticTests/immutable/increment_decrement.sol b/test/libsolidity/semanticTests/immutable/increment_decrement.sol new file mode 100644 index 000000000000..14304513a3da --- /dev/null +++ b/test/libsolidity/semanticTests/immutable/increment_decrement.sol @@ -0,0 +1,18 @@ +contract C { + int immutable x = 1; + int immutable y = 3; + + constructor() { + x--; + --x; + y++; + ++y; + --y; + } + + function f() public view returns (int, int) { + return (x, y); + } +} +// ---- +// f() -> -1, 4 diff --git a/test/libsolidity/semanticTests/immutable/multiple_initializations.sol b/test/libsolidity/semanticTests/immutable/multiple_initializations.sol new file mode 100644 index 000000000000..b72f05b11015 --- /dev/null +++ b/test/libsolidity/semanticTests/immutable/multiple_initializations.sol @@ -0,0 +1,27 @@ +contract A { + uint immutable x = x + 1; + uint immutable y = x += 2; + + constructor(uint) m(x += 16) m(x += 32) { + x += 64; + x += 128; + } + + modifier m(uint) { + _; + } + + function get() public returns (uint) { + return x; + } +} + +contract B is A(A.x += 8) { + constructor(uint) {} +} + +contract C is B { + constructor() B(x += 4) {} +} +// ---- +// get() -> 0xff diff --git a/test/libsolidity/semanticTests/immutable/uninitialized.sol b/test/libsolidity/semanticTests/immutable/uninitialized.sol new file mode 100644 index 000000000000..f6d59ce768e7 --- /dev/null +++ b/test/libsolidity/semanticTests/immutable/uninitialized.sol @@ -0,0 +1,11 @@ +contract C { + uint immutable u; + bool immutable b; + address immutable a; + + function get() public returns (uint, bool, address) { + return (u, b, a); + } +} +// ---- +// get() -> 0, false, 0x0 diff --git a/test/libsolidity/syntaxTests/immutable/conditional_return_uninitialized.sol b/test/libsolidity/syntaxTests/immutable/conditional_return_uninitialized.sol index 77e73c51f5c2..d2c473fbb945 100644 --- a/test/libsolidity/syntaxTests/immutable/conditional_return_uninitialized.sol +++ b/test/libsolidity/syntaxTests/immutable/conditional_return_uninitialized.sol @@ -7,5 +7,3 @@ contract C { x = 1; } } -// ---- -// TypeError 2658: (86-93): Construction control flow ends without initializing all immutable state variables. diff --git a/test/libsolidity/syntaxTests/immutable/conditionally_initialized.sol b/test/libsolidity/syntaxTests/immutable/conditionally_initialized.sol index 052a1b59746a..312a76083a88 100644 --- a/test/libsolidity/syntaxTests/immutable/conditionally_initialized.sol +++ b/test/libsolidity/syntaxTests/immutable/conditionally_initialized.sol @@ -5,5 +5,3 @@ contract C { x = 1; } } -// ---- -// TypeError 4599: (86-87): Cannot write to immutable here: Immutable variables cannot be initialized inside an if statement. diff --git a/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol b/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol index 1bd0f6b91309..b23d161c174b 100644 --- a/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/ctor_initialization_indirect_reading.sol @@ -6,5 +6,3 @@ contract C { function f() public view returns (uint) { return 3 + x; } } -// ---- -// TypeError 7733: (136-137): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/ctor_initialization_reading.sol b/test/libsolidity/syntaxTests/immutable/ctor_initialization_reading.sol index 38ff92945f14..5df8d162f6c2 100644 --- a/test/libsolidity/syntaxTests/immutable/ctor_initialization_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/ctor_initialization_reading.sol @@ -4,5 +4,3 @@ contract C { x = 3 + x; } } -// ---- -// TypeError 7733: (71-72): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/ctor_modifier_args.sol b/test/libsolidity/syntaxTests/immutable/ctor_modifier_args.sol index 0a966f7c37b3..09c3aefa704c 100644 --- a/test/libsolidity/syntaxTests/immutable/ctor_modifier_args.sol +++ b/test/libsolidity/syntaxTests/immutable/ctor_modifier_args.sol @@ -9,4 +9,3 @@ contract C { function f(uint a) internal pure {} } // ---- -// TypeError 1581: (59-60): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/ctor_modifier_reading.sol b/test/libsolidity/syntaxTests/immutable/ctor_modifier_reading.sol index 5e3442e55eea..113cda75fc20 100644 --- a/test/libsolidity/syntaxTests/immutable/ctor_modifier_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/ctor_modifier_reading.sol @@ -10,5 +10,3 @@ contract C { function f(uint a) internal pure {} } -// ---- -// TypeError 7733: (119-120): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/decrement.sol b/test/libsolidity/syntaxTests/immutable/decrement.sol index dd081438a3a2..4931b5f9f9e6 100644 --- a/test/libsolidity/syntaxTests/immutable/decrement.sol +++ b/test/libsolidity/syntaxTests/immutable/decrement.sol @@ -4,5 +4,3 @@ contract C { x--; } } -// ---- -// TypeError 3969: (63-64): Immutable variables must be initialized using an assignment. diff --git a/test/libsolidity/syntaxTests/immutable/delete.sol b/test/libsolidity/syntaxTests/immutable/delete.sol deleted file mode 100644 index bbb418c17f77..000000000000 --- a/test/libsolidity/syntaxTests/immutable/delete.sol +++ /dev/null @@ -1,8 +0,0 @@ -contract C { - uint immutable x; - constructor() { - delete x; - } -} -// ---- -// TypeError 3969: (70-71): Immutable variables must be initialized using an assignment. diff --git a/test/libsolidity/syntaxTests/immutable/delete_and_initialize.sol b/test/libsolidity/syntaxTests/immutable/delete_and_initialize.sol deleted file mode 100644 index 1e55d90ce885..000000000000 --- a/test/libsolidity/syntaxTests/immutable/delete_and_initialize.sol +++ /dev/null @@ -1,8 +0,0 @@ -contract C { - uint immutable x = 3; - constructor() { - delete x; - } -} -// ---- -// TypeError 2718: (74-75): Immutable variables cannot be modified after initialization. diff --git a/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol b/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol index 06868858473b..e276ba7835e0 100644 --- a/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/function_initialization_reading.sol @@ -3,5 +3,3 @@ contract C { function f() public view returns (uint) { return 3 + x; } } -// ---- -// TypeError 7733: (99-100): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/function_pointer_initializing.sol b/test/libsolidity/syntaxTests/immutable/function_pointer_initializing.sol index 0d9dabf90ac3..cc175d0831d5 100644 --- a/test/libsolidity/syntaxTests/immutable/function_pointer_initializing.sol +++ b/test/libsolidity/syntaxTests/immutable/function_pointer_initializing.sol @@ -11,4 +11,3 @@ contract C is B(C.f) { } // ---- // TypeError 1581: (200-201): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. -// TypeError 1574: (109-110): Immutable state variable already initialized. diff --git a/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol b/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol index 5c026300c23b..2658d35d2324 100644 --- a/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/function_pointer_reading.sol @@ -10,4 +10,3 @@ contract C is B(C.f) { function f() internal view returns(uint) { return x + 2; } } // ---- -// TypeError 7733: (205-206): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/increment.sol b/test/libsolidity/syntaxTests/immutable/increment.sol index 020620159c84..62506d88ff73 100644 --- a/test/libsolidity/syntaxTests/immutable/increment.sol +++ b/test/libsolidity/syntaxTests/immutable/increment.sol @@ -4,5 +4,3 @@ contract C { x++; } } -// ---- -// TypeError 3969: (63-64): Immutable variables must be initialized using an assignment. diff --git a/test/libsolidity/syntaxTests/immutable/increment_decrement.sol b/test/libsolidity/syntaxTests/immutable/increment_decrement.sol deleted file mode 100644 index 7b8092e1e32f..000000000000 --- a/test/libsolidity/syntaxTests/immutable/increment_decrement.sol +++ /dev/null @@ -1,11 +0,0 @@ -contract C { - uint immutable x; - uint immutable y; - constructor() { - ++x; - --y; - } -} -// ---- -// TypeError 3969: (77-78): Immutable variables must be initialized using an assignment. -// TypeError 3969: (86-87): Immutable variables must be initialized using an assignment. diff --git a/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol b/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol index ff7927277cad..985e5d0b395e 100644 --- a/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol +++ b/test/libsolidity/syntaxTests/immutable/indirect_reading_during_statevar_init.sol @@ -5,4 +5,3 @@ contract C { function f() internal pure returns(uint) { return x; } } // ---- -// TypeError 7733: (112-113): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_ctor_argument.sol b/test/libsolidity/syntaxTests/immutable/inheritance_ctor_argument.sol index bc084400e60b..025f5616129c 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_ctor_argument.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_ctor_argument.sol @@ -10,5 +10,3 @@ contract C is B { uint immutable y; constructor() B(y = 3) { } } -// ---- -// TypeError 1581: (148-149): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_init.sol b/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_init.sol index 503f182d6cd2..f1787ab428a2 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_init.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_init.sol @@ -9,5 +9,3 @@ contract B { contract C is B(C.y = 3) { uint immutable y; } -// ---- -// TypeError 1581: (104-107): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_reading.sol b/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_reading.sol index 2c670df6c5aa..0ac37261feef 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_reading.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_ctor_inherit_specifier_argument_reading.sol @@ -12,5 +12,3 @@ contract C is B(C.y) { y = 3; } } -// ---- -// TypeError 7733: (104-107): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol b/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol index f33ce4cc4d95..addd3249c8e0 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_virtual_functions.sol @@ -16,4 +16,3 @@ contract C is B { } } // ---- -// TypeError 7733: (263-264): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_virtual_modifiers.sol b/test/libsolidity/syntaxTests/immutable/inheritance_virtual_modifiers.sol index 95ea3e686b09..31f510dccca5 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_virtual_modifiers.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_virtual_modifiers.sol @@ -17,5 +17,3 @@ contract C is B { _; f(x); } } -// ---- -// TypeError 7733: (245-246): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/inheritance_wrong_ctor.sol b/test/libsolidity/syntaxTests/immutable/inheritance_wrong_ctor.sol index 748d9da55bc2..d7586c433d39 100644 --- a/test/libsolidity/syntaxTests/immutable/inheritance_wrong_ctor.sol +++ b/test/libsolidity/syntaxTests/immutable/inheritance_wrong_ctor.sol @@ -7,5 +7,3 @@ contract C is B { x = 3; } } -// ---- -// TypeError 7484: (88-89): Cannot write to immutable here: Immutable variables must be initialized in the constructor of the contract they are defined in. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol index d23416942fb0..f638ae7bf952 100644 --- a/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol +++ b/test/libsolidity/syntaxTests/immutable/init_in_constructor_modifier_param.sol @@ -4,4 +4,3 @@ contract D { constructor() m(t = 2) {} } // ---- -// TypeError 1581: (83-84): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_ctor_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_ctor_param.sol index b67d149b2aac..63c6057d3e69 100644 --- a/test/libsolidity/syntaxTests/immutable/init_in_ctor_param.sol +++ b/test/libsolidity/syntaxTests/immutable/init_in_ctor_param.sol @@ -3,5 +3,3 @@ contract D is C { uint immutable t; constructor() C(t=2) {} } -// ---- -// TypeError 1581: (92-93): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_function_modifier_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_function_modifier_param.sol new file mode 100644 index 000000000000..b42943959179 --- /dev/null +++ b/test/libsolidity/syntaxTests/immutable/init_in_function_modifier_param.sol @@ -0,0 +1,7 @@ +contract D { + uint immutable t; + modifier m(uint) { _; } + function f() public m(t = 2) {} +} +// ---- +// TypeError 1581: (89-90): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_function_via_contract_name.sol b/test/libsolidity/syntaxTests/immutable/init_in_function_via_contract_name.sol new file mode 100644 index 000000000000..01163f2fe215 --- /dev/null +++ b/test/libsolidity/syntaxTests/immutable/init_in_function_via_contract_name.sol @@ -0,0 +1,11 @@ +contract B { + uint immutable x; +} + +contract C is B { + function f() public { + B.x = 42; + } +} +// ---- +// TypeError 1581: (90-93): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/init_in_function_via_super.sol b/test/libsolidity/syntaxTests/immutable/init_in_function_via_super.sol new file mode 100644 index 000000000000..941b5e5167b2 --- /dev/null +++ b/test/libsolidity/syntaxTests/immutable/init_in_function_via_super.sol @@ -0,0 +1,13 @@ +contract B { + uint immutable x; + + function g() public {} +} + +contract C is B { + function f() public { + super.x = 42; + } +} +// ---- +// TypeError 9582: (118-125): Member "x" not found or not visible after argument-dependent lookup in type(contract super C). diff --git a/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol b/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol index cc56202e73a4..f80c238e6391 100644 --- a/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol +++ b/test/libsolidity/syntaxTests/immutable/init_in_inheritance_specifier_param.sol @@ -2,5 +2,3 @@ contract C { constructor(uint) {} } contract D is C(D.t = 2) { uint immutable t; } -// ---- -// TypeError 1581: (52-55): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/loop_initialized.sol b/test/libsolidity/syntaxTests/immutable/loop_initialized.sol index d8c8ca47fe5e..1cbe9add1a6c 100644 --- a/test/libsolidity/syntaxTests/immutable/loop_initialized.sol +++ b/test/libsolidity/syntaxTests/immutable/loop_initialized.sol @@ -5,5 +5,3 @@ contract C { x = 1; } } -// ---- -// TypeError 6672: (88-89): Cannot write to immutable here: Immutable variables cannot be initialized inside a loop. diff --git a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol index 401b068cb687..a87ec76805a3 100644 --- a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol +++ b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions.sol @@ -26,4 +26,3 @@ contract C is A, B { } } // ---- -// TypeError 7733: (499-500): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol index bf5a1f85b38c..8b8c5dd2818d 100644 --- a/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol +++ b/test/libsolidity/syntaxTests/immutable/multiple_inheritance_virtual_functions_with_super.sol @@ -26,4 +26,3 @@ contract C is A, B { } } // ---- -// TypeError 7733: (503-504): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/multiple_initializations.sol b/test/libsolidity/syntaxTests/immutable/multiple_initializations.sol index 93e01db3017c..8fe5ddcfc0ea 100644 --- a/test/libsolidity/syntaxTests/immutable/multiple_initializations.sol +++ b/test/libsolidity/syntaxTests/immutable/multiple_initializations.sol @@ -5,5 +5,3 @@ contract C { x = 4; } } -// ---- -// TypeError 1574: (78-79): Immutable state variable already initialized. diff --git a/test/libsolidity/syntaxTests/immutable/private_state_var.sol b/test/libsolidity/syntaxTests/immutable/private_state_var.sol index 50af6ace8d0d..cce1ca0f5fb3 100644 --- a/test/libsolidity/syntaxTests/immutable/private_state_var.sol +++ b/test/libsolidity/syntaxTests/immutable/private_state_var.sol @@ -16,5 +16,3 @@ contract C is B { function f() internal view override returns(uint) { return readX(); } } -// ---- -// TypeError 7733: (202-203): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol b/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol index 6e934ff9d46c..b4f56a269d07 100644 --- a/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol +++ b/test/libsolidity/syntaxTests/immutable/read_in_function_before_init.sol @@ -8,5 +8,3 @@ contract B is A { uint immutable x = 2; function f() override pure internal returns (uint) { return x; } } -// ---- -// TypeError 7733: (223-224): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/read_in_function_before_init2.sol b/test/libsolidity/syntaxTests/immutable/read_in_function_before_init2.sol index 6e939b0b28f1..7234e0ef0a30 100644 --- a/test/libsolidity/syntaxTests/immutable/read_in_function_before_init2.sol +++ b/test/libsolidity/syntaxTests/immutable/read_in_function_before_init2.sol @@ -3,5 +3,3 @@ contract C { uint x = f(); function f() internal pure returns (uint) { return t; } } -// ---- -// TypeError 7733: (106-107): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol b/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol index 32ac0cceb494..618ad36f4333 100644 --- a/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol +++ b/test/libsolidity/syntaxTests/immutable/reading_after_initialization_function.sol @@ -13,4 +13,3 @@ contract C { } } // ---- -// TypeError 7733: (141-142): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/reading_during_statevar_init.sol b/test/libsolidity/syntaxTests/immutable/reading_during_statevar_init.sol index ae73679eabc2..755de6481a29 100644 --- a/test/libsolidity/syntaxTests/immutable/reading_during_statevar_init.sol +++ b/test/libsolidity/syntaxTests/immutable/reading_during_statevar_init.sol @@ -2,5 +2,3 @@ contract C { uint immutable x = 0; uint y = x; } -// ---- -// TypeError 7733: (52-53): Immutable variables cannot be read before they are initialized. diff --git a/test/libsolidity/syntaxTests/immutable/return_uninitialized.sol b/test/libsolidity/syntaxTests/immutable/return_uninitialized.sol index 852b5d350b0f..3a0b3f436799 100644 --- a/test/libsolidity/syntaxTests/immutable/return_uninitialized.sol +++ b/test/libsolidity/syntaxTests/immutable/return_uninitialized.sol @@ -7,4 +7,4 @@ contract C { } } // ---- -// TypeError 2658: (63-70): Construction control flow ends without initializing all immutable state variables. +// Warning 5740: (80-85): Unreachable code. diff --git a/test/libsolidity/syntaxTests/immutable/state_var_external_access_read.sol b/test/libsolidity/syntaxTests/immutable/state_var_external_access_read.sol new file mode 100644 index 000000000000..64b24b069dbe --- /dev/null +++ b/test/libsolidity/syntaxTests/immutable/state_var_external_access_read.sol @@ -0,0 +1,13 @@ +contract C { + uint immutable public x = 42; + + function g() external view returns (uint) {} + + function f() public view returns (uint) { + return this.x(); + } + + function h() public view returns (function () external view returns (uint)) { + return this.x; + } +} diff --git a/test/libsolidity/syntaxTests/immutable/state_var_external_access_write.sol b/test/libsolidity/syntaxTests/immutable/state_var_external_access_write.sol new file mode 100644 index 000000000000..4baa743cb201 --- /dev/null +++ b/test/libsolidity/syntaxTests/immutable/state_var_external_access_write.sol @@ -0,0 +1,11 @@ +contract C { + uint immutable public x = 42; + + function g() external view returns (uint) {} + + function f() public view { + this.x = this.g; + } +} +// ---- +// TypeError 4247: (137-143): Expression has to be an lvalue. diff --git a/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol b/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol index 9cd18a2b61df..fe969a20d04c 100644 --- a/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol +++ b/test/libsolidity/syntaxTests/immutable/try_catch_initialized.sol @@ -33,9 +33,3 @@ contract B } // ==== // EVMVersion: >=byzantium -// ---- -// TypeError 4130: (108-116): Cannot write to immutable here: Immutable variables cannot be initialized inside a try/catch statement. -// TypeError 4130: (144-152): Cannot write to immutable here: Immutable variables cannot be initialized inside a try/catch statement. -// TypeError 4130: (216-224): Cannot write to immutable here: Immutable variables cannot be initialized inside a try/catch statement. -// TypeError 4130: (297-305): Cannot write to immutable here: Immutable variables cannot be initialized inside a try/catch statement. -// TypeError 4130: (357-365): Cannot write to immutable here: Immutable variables cannot be initialized inside a try/catch statement. diff --git a/test/libsolidity/syntaxTests/immutable/uninitialized.sol b/test/libsolidity/syntaxTests/immutable/uninitialized.sol index d1791fe0f843..bf7c68a847d9 100644 --- a/test/libsolidity/syntaxTests/immutable/uninitialized.sol +++ b/test/libsolidity/syntaxTests/immutable/uninitialized.sol @@ -1,5 +1,3 @@ contract C { uint immutable x; } -// ---- -// TypeError 2658: (0-36): Construction control flow ends without initializing all immutable state variables. diff --git a/test/libsolidity/syntaxTests/immutable/uninitialized_private_state_var.sol b/test/libsolidity/syntaxTests/immutable/uninitialized_private_state_var.sol index 544111e4c87a..70bd1448a9c5 100644 --- a/test/libsolidity/syntaxTests/immutable/uninitialized_private_state_var.sol +++ b/test/libsolidity/syntaxTests/immutable/uninitialized_private_state_var.sol @@ -16,6 +16,3 @@ contract C is B { function f() internal view override returns(uint) { return readX(); } } -// ---- -// TypeError 2658: (0-202): Construction control flow ends without initializing all immutable state variables. -// TypeError 2658: (204-361): Construction control flow ends without initializing all immutable state variables. diff --git a/test/libsolidity/syntaxTests/immutable/variable_declaration_already.sol b/test/libsolidity/syntaxTests/immutable/variable_declaration_already.sol index 06d2bfa79857..2917f276b794 100644 --- a/test/libsolidity/syntaxTests/immutable/variable_declaration_already.sol +++ b/test/libsolidity/syntaxTests/immutable/variable_declaration_already.sol @@ -3,6 +3,3 @@ contract C { uint immutable x = z = y = 3; uint immutable y = 5; } -// ---- -// TypeError 1581: (66-67): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. -// TypeError 1581: (62-63): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. diff --git a/test/libsolidity/syntaxTests/immutable/variable_declaration_value.sol b/test/libsolidity/syntaxTests/immutable/variable_declaration_value.sol index 2c98ffd791c3..6451c8e207de 100644 --- a/test/libsolidity/syntaxTests/immutable/variable_declaration_value.sol +++ b/test/libsolidity/syntaxTests/immutable/variable_declaration_value.sol @@ -1,5 +1,3 @@ contract C { int immutable x = x = 5; } -// ---- -// TypeError 1581: (35-36): Cannot write to immutable here: Immutable variables can only be initialized inline or assigned directly in the constructor. From 11be2f4881d1644f15b026d1022388f06a034a34 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:31:06 -0700 Subject: [PATCH 120/138] Squashed commit of the following: (#14401) commit 6f38009a31b2ff5d6f53de7b74469f495fe04092 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 15:36:03 2023 -0700 remove default sphinx footer commit 0d842749566f40fa8c2dd434fa67bcc5e9df3aa0 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 15:21:26 2023 -0700 linting commit c8484ac7c1f54067b0d3c4aa4aa81de7d36df71d Merge: 8339800d0 b583e9e64 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 14:15:03 2023 -0700 Merge branch 'develop' into docs-rebrand commit 8339800d0fdd197f589337e1198867d4198a3850 Merge: 633c673c5 88d5e06d4 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 14:11:58 2023 -0700 Merge branch 'rebrand' into docs-rebrand commit 88d5e06d4ce79696b9451991b33834ecc55bf66d Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 14:11:52 2023 -0700 remove dev code commit 633c673c5e227009917d888e1f0991f33aa75f44 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 14:02:25 2023 -0700 update home url poitner to production domain commit b3689cb7c230e1fb3a97400e5412ec14c34fc586 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 13:59:34 2023 -0700 fix external link arrow to match core site commit b7a28a5dfe7517a88870afe67783e9e300b85af4 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 13:59:19 2023 -0700 swap in cdnfonts for overpass fonts commit e979ad5c9f69c9c7ee369a0700a64ea6d9061c2b Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 10 08:30:48 2023 -0700 fix external link arrow spacing/underline commit b90077863cfff5d8776f5dc74f82f061e0162d37 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jul 6 16:26:28 2023 -0700 update foot note commit ed9ddfd327cd0e382286abf0c8896c7c879512b2 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jul 6 13:12:14 2023 -0700 update nav link hover color commit 077d3a0c9333c96cbabc3ce2bccf00afac19a312 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue Jul 4 20:27:05 2023 -0700 bug fixed for header/nav-link styling commit 2584dd2e419255ec93430446bd049ff90155987e Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue Jul 4 12:15:09 2023 -0700 fix link shift bug commit 885d2bc52ca3ed9e4727d7f0eaed0e312fedaaaa Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue Jul 4 12:13:03 2023 -0700 update nav link hover styling commit d06c81592ad88ad2e81701cec9e85b6a3cee86ee Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 3 18:25:37 2023 -0700 extract event listener functions commit 414e444ee67fe937d1295b14ac8591a710bfbdff Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jul 3 18:22:08 2023 -0700 a11y: skip to content link commit 6c628ea73995dad9b9a6fb502bb216d88f0e9602 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 21:57:24 2023 -0700 fine-tuning more styling commit 71b617abaf27c34fcecaf6e30795687abf9885f7 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 21:37:02 2023 -0700 fix primary link color commit d90627418c605bff4398a9e24ae0c5c685f73992 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 21:21:30 2023 -0700 fix mobile versions expansion commit f0f0fbbcb74ea35efa6e4cf87ab1d855f1ae2bd2 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 21:21:16 2023 -0700 update code styling commit 727c7ee9b69427eddd73012a89e6ee9ae1ccec8d Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 21:20:38 2023 -0700 remix link styling commit 4059c00e3d704002ef34f85fd86495f2a4ac9e57 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 21:19:49 2023 -0700 fix whitespace styling commit 631e2910a53484b97770cad1b3439d412a0ab6d0 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 20:33:54 2023 -0700 fix search input styling commit 5e06b22a7200b0774bd135c666b4e3437d342350 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 19:37:19 2023 -0700 css adjustments commit 637d5122038fd6075cd53d57537d728b730acbcf Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 19:15:05 2023 -0700 selector adjustments, linting commit 781dc7c3009dc406b36cd2bdcb2d02c3c34fafa6 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 18:26:09 2023 -0700 top version/search layout adjustments commit 7341e17003700133659e5f64ee2d1369ac50e434 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jul 2 18:18:21 2023 -0700 update version div styling commit 3a4b3feb581b1799e48d395b73aca05760dc5658 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat Jul 1 21:18:12 2023 -0700 restyle external link arrow for forum link commit e6cef6312ca73c125c01b78573f21c75fcbbfc87 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat Jul 1 20:50:31 2023 -0700 add woff2 fonts, use absolute font urls commit 3bc401b1dbe971501826011a692c38ee9ce4b992 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat Jul 1 15:15:26 2023 -0700 fix nav button alignment commit b7d607b7090e1ac6ded55ac6e534549609226236 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 30 19:02:24 2023 -0700 rename pcm param to color commit d67e23539f720250bb298c11fd2b1b6d7dbb0815 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 30 17:34:56 2023 -0700 center align footer buttons, fix bug on pre text commit 34a665038dc27e2b8874b3e16ffc581c33f31bc5 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 29 16:40:26 2023 -0700 preload fonts commit 5b987c31455ffe02135e357ea560bbad8a9c6745 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 29 15:31:41 2023 -0700 antialiased font smoothing commit 9585fb5bb73f67e37a4f9f1da83e7b133f0b4446 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 29 13:44:51 2023 -0700 search results styling commit 224ed028b181b3944d2f2e33f4122b15f38f7608 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 29 13:29:09 2023 -0700 restore search functionality commit ec5782a01cd0f1c1808b353560c39911c9fdc645 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed Jun 28 21:55:11 2023 -0700 more mobile menu and styling fixes commit c033f05e2ab839309e7d3864ae66c465d801e806 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed Jun 28 13:14:22 2023 -0700 patch location cleaner commit 6cae3b5ad67e38f6decfa18eeacce973783a2fc1 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue Jun 27 17:49:28 2023 -0700 patch location cleaner commit e86e6a11189ed57f122382c901fe7a0f49518e83 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue Jun 27 17:40:11 2023 -0700 color mode continuity commit c3ba4ee6c614fa637a34eacbae60c5e88cd018c5 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue Jun 27 15:32:11 2023 -0700 refactor layout commit ac3bae8f34ccbd08f68cb784b3ec00bad70a9281 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jun 26 14:35:00 2023 -0700 color and styling updates commit 42e301818d3d11152c5ce630c8085db1c1664a13 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jun 26 13:23:03 2023 -0700 highlight active nav link commit fb72573c01494486ab9b0942c3f67c372af0d5e6 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jun 26 12:34:25 2023 -0700 patch mobile menu bottom scroll stop commit 2dcef754301d35143ea24ca197906c974e128a25 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon Jun 26 12:32:38 2023 -0700 adjust header icon sizes commit dc75b636b7f442dfe7aaa80ad82470be0f3d4f19 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jun 25 21:41:18 2023 -0700 fix header icon sizes commit de70f1a56eba85c89c1f01f37770b1d6bd91d5db Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun Jun 25 19:58:18 2023 -0700 mobile meun debugging commit 1fe20565a838c2f2212cd95045cd309b076c8b2b Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat Jun 24 13:21:23 2023 -0700 icon color mode improvements commit fcb134a4209371277693e919fb06eaeb53e36cb6 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat Jun 24 11:51:24 2023 -0700 initialize with menu closed commit defa7c78e981037409ec9d2b9ab871910023f5b0 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat Jun 24 11:37:47 2023 -0700 color toggle and mobile menu commit 695d719612be0ed9cac0f246f0eaf91f3fdb2e75 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 23 16:39:32 2023 -0700 forum url as external link commit ad182602095909d84331339993b31f2a37bf1cd7 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 23 16:28:14 2023 -0700 patch contributing path commit fbfeaa7a12a1b9bc86b766a0e490b85d2ded8849 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 23 16:20:57 2023 -0700 update contribute path commit f7dbf1f2e0a3e31d164d6cc67c952f89c3f8f49e Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 23 16:05:22 2023 -0700 dev: point to vercel build for new solidity site commit c344c1df86e78ad6ab9bc066ac75659180d068cf Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 23 14:30:40 2023 -0700 update stylesheets, constants, logos commit c15135378c8568ed93bf685552940cdbe1c07b70 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri Jun 23 10:25:05 2023 -0700 bg color cleanup commit c049df77d9d55adc796bc2f8cd7c186d833aca69 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 22 19:02:49 2023 -0700 clean up initialize and toggle scripts deprecate dark.css in lieu of a dark more html attribute indicator and css selectors for this attribute. Avoids needing to enable/disable dark stylesheet commit 881c9cce66e18d30b50c467a22d98836698f5b58 Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 22 18:59:24 2023 -0700 import type faces commit e9b26157aabf4374754cf14d9a4a980c92bd139c Author: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu Jun 22 15:39:00 2023 -0700 implement initial styling adjustments --- docs/README.md | 23 + docs/_static/css/custom-dark.css | 595 +++++++++++++ docs/_static/css/custom.css | 807 +++++++++++++++++- docs/_static/css/dark.css | 652 -------------- docs/_static/css/fonts.css | 2 + docs/_static/css/pygments.css | 399 +++++++++ docs/_static/css/toggle.css | 15 +- docs/_static/fonts/overpass-bold.otf | Bin 0 -> 68828 bytes docs/_static/fonts/overpass-bold.woff2 | Bin 0 -> 38728 bytes docs/_static/fonts/overpass-italic.otf | Bin 0 -> 72500 bytes docs/_static/fonts/overpass-light.otf | Bin 0 -> 69324 bytes docs/_static/fonts/overpass-mono-bold.otf | Bin 0 -> 95240 bytes docs/_static/fonts/overpass-mono-bold.woff2 | Bin 0 -> 20532 bytes docs/_static/fonts/overpass-mono-regular.otf | Bin 0 -> 94520 bytes .../_static/fonts/overpass-mono-regular.woff2 | Bin 0 -> 20532 bytes .../overpass-mono/overpass-mono-bold.otf | Bin 0 -> 95240 bytes .../overpass-mono/overpass-mono-regular.otf | Bin 0 -> 94520 bytes docs/_static/fonts/overpass-regular.otf | Bin 0 -> 69808 bytes docs/_static/fonts/overpass-regular.woff2 | Bin 0 -> 38728 bytes docs/_static/fonts/overpass-semibold.otf | Bin 0 -> 65704 bytes docs/_static/fonts/overpass/overpass-bold.otf | Bin 0 -> 68828 bytes .../fonts/overpass/overpass-italic.otf | Bin 0 -> 72500 bytes .../_static/fonts/overpass/overpass-light.otf | Bin 0 -> 69324 bytes .../fonts/overpass/overpass-regular.otf | Bin 0 -> 69808 bytes .../fonts/overpass/overpass-semibold.otf | Bin 0 -> 65704 bytes docs/_static/img/favicon.ico | Bin 0 -> 15086 bytes docs/_static/img/hamburger-dark.svg | 3 + docs/_static/img/hamburger-light.svg | 3 + docs/_static/img/logo-dark.svg | 8 + docs/_static/img/logo.svg | 8 + docs/_static/img/moon.svg | 3 + docs/_static/img/sun.svg | 13 + docs/_static/js/constants.js | 31 + docs/_static/js/initialize.js | 250 ++++++ docs/_static/js/toggle.js | 74 +- docs/conf.py | 14 +- docs/logo.svg | 33 +- 37 files changed, 2178 insertions(+), 755 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/_static/css/custom-dark.css delete mode 100644 docs/_static/css/dark.css create mode 100644 docs/_static/css/fonts.css create mode 100644 docs/_static/css/pygments.css create mode 100644 docs/_static/fonts/overpass-bold.otf create mode 100644 docs/_static/fonts/overpass-bold.woff2 create mode 100644 docs/_static/fonts/overpass-italic.otf create mode 100644 docs/_static/fonts/overpass-light.otf create mode 100644 docs/_static/fonts/overpass-mono-bold.otf create mode 100644 docs/_static/fonts/overpass-mono-bold.woff2 create mode 100644 docs/_static/fonts/overpass-mono-regular.otf create mode 100644 docs/_static/fonts/overpass-mono-regular.woff2 create mode 100644 docs/_static/fonts/overpass-mono/overpass-mono-bold.otf create mode 100644 docs/_static/fonts/overpass-mono/overpass-mono-regular.otf create mode 100644 docs/_static/fonts/overpass-regular.otf create mode 100644 docs/_static/fonts/overpass-regular.woff2 create mode 100644 docs/_static/fonts/overpass-semibold.otf create mode 100644 docs/_static/fonts/overpass/overpass-bold.otf create mode 100644 docs/_static/fonts/overpass/overpass-italic.otf create mode 100644 docs/_static/fonts/overpass/overpass-light.otf create mode 100644 docs/_static/fonts/overpass/overpass-regular.otf create mode 100644 docs/_static/fonts/overpass/overpass-semibold.otf create mode 100644 docs/_static/img/favicon.ico create mode 100644 docs/_static/img/hamburger-dark.svg create mode 100644 docs/_static/img/hamburger-light.svg create mode 100644 docs/_static/img/logo-dark.svg create mode 100644 docs/_static/img/logo.svg create mode 100644 docs/_static/img/moon.svg create mode 100644 docs/_static/img/sun.svg create mode 100644 docs/_static/js/constants.js create mode 100644 docs/_static/js/initialize.js diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000000..a3b5f25aedbe --- /dev/null +++ b/docs/README.md @@ -0,0 +1,23 @@ +# Solidity Language Docs + +## Local environment setup + +1. Install python https://www.python.org/downloads/ +1. Install sphinx (the tool used to generate the docs) https://www.sphinx-doc.org/en/master/usage/installation.html + +Go to `/docs` and run `./docs.sh` to install dependencies and build the project: + +```sh +cd docs +./docs.sh +``` + +That will output the generated htmls under _build/ + +## Serve environment + +```py +python3 -m http.server -d _build/html --cgi 8080 +``` + +Visit dev server at http://localhost:8080 diff --git a/docs/_static/css/custom-dark.css b/docs/_static/css/custom-dark.css new file mode 100644 index 000000000000..044a8f800d00 --- /dev/null +++ b/docs/_static/css/custom-dark.css @@ -0,0 +1,595 @@ + + +/* DARK MODE STYLING */ + +/* code directives */ + +:root[style*=dark] .method dt, +:root[style*=dark] .class dt, +:root[style*=dark] .data dt, +:root[style*=dark] .attribute dt, +:root[style*=dark] .function dt, +:root[style*=dark] .classmethod dt, +:root[style*=dark] .exception dt, +:root[style*=dark] .descclassname, +:root[style*=dark] .descname { + background-color: #2d2d2d !important; +} + +:root[style*=dark] .rst-content dl:not(.docutils) dt { + background-color: #0008; + border-top: solid 3px #fff2; + border-left: solid 3px #fff2; +} + +:root[style*=dark] em.property { + color: #888888; +} + + +/* tables */ + +:root[style*=dark] .rst-content table.docutils td { + border: 0px; +} + +:root[style*=dark] .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { + background-color: #0002; +} + +:root[style*=dark] .rst-content pre { + background: none; +} + +/* inlined code highlights */ + +:root[style*=dark] .xref, +:root[style*=dark] .py-meth { + color: #aaddff !important; + font-weight: normal !important; +} + +/* highlight color search text */ + +:root[style*=dark] .rst-content .highlighted { + background: #ff5722; + box-shadow: 0 0 0 2px #f0978b; +} + +/* notes, warnings, hints */ + +:root[style*=dark] .hint .admonition-title { + background: #2aa87c !important; +} + +:root[style*=dark] .warning .admonition-title { + background: #cc4444 !important; +} + +:root[style*=dark] .admonition-title { + background: #3a7ca8 !important; +} + +:root[style*=dark] .admonition, +:root[style*=dark] .note { + background-color: #0008 !important; +} + + +/* table of contents */ + +:root[style*=dark] .sidebar { + background-color: #191919 !important; +} + +:root[style*=dark] .sidebar-title { + background-color: #2b2b2b !important; +} + +:root[style*=dark] .wy-menu-vertical code.docutils.literal.notranslate { + background: none !important; + border: none !important; +} + + +:root[style*=dark] .toc-backref { + color: grey !important; +} + +:root[style*=dark] .highlight { + background: #0008; + color: #f8f8f2 +} + +:root[style*=dark] .highlight .c { + color: #888 +} + + +/* Comment */ + +:root[style*=dark] .highlight .err { + color: #960050; + background-color: #1e0010 +} + + +/* Error */ + +:root[style*=dark] .highlight .k { + color: #66d9ef +} + + +/* Keyword */ + +:root[style*=dark] .highlight .l { + color: #ae81ff +} + + +/* Literal */ + +:root[style*=dark] .highlight .n { + color: #f8f8f2 +} + + +/* Name */ + +:root[style*=dark] .highlight .o { + color: #f92672 +} + + +/* Operator */ + +:root[style*=dark] .highlight .p { + color: #f8f8f2 +} + + +/* Punctuation */ + +:root[style*=dark] .highlight .ch { + color: #888 +} + + +/* Comment.Hashbang */ + +:root[style*=dark] .highlight .cm { + color: #888 +} + + +/* Comment.Multiline */ + +:root[style*=dark] .highlight .cp { + color: #888 +} + + +/* Comment.Preproc */ + +:root[style*=dark] .highlight .cpf { + color: #888 +} + + +/* Comment.PreprocFile */ + +:root[style*=dark] .highlight .c1 { + color: #888 +} + + +/* Comment.Single */ + +:root[style*=dark] .highlight .cs { + color: #888 +} + + +/* Comment.Special */ + +:root[style*=dark] .highlight .gd { + color: #f92672 +} + + +/* Generic.Deleted */ + +:root[style*=dark] .highlight .ge { + font-style: italic +} + + +/* Generic.Emph */ + +:root[style*=dark] .highlight .gi { + color: #a6e22e +} + + +/* Generic.Inserted */ + +:root[style*=dark] .highlight .gs { + font-weight: bold +} + + +/* Generic.Strong */ + +:root[style*=dark] .highlight .gu { + color: #888 +} + + +/* Generic.Subheading */ + +:root[style*=dark] .highlight .kc { + color: #66d9ef +} + + +/* Keyword.Constant */ + +:root[style*=dark] .highlight .kd { + color: #66d9ef +} + + +/* Keyword.Declaration */ + +:root[style*=dark] .highlight .kn { + color: #f92672 +} + + +/* Keyword.Namespace */ + +:root[style*=dark] .highlight .kp { + color: #66d9ef +} + + +/* Keyword.Pseudo */ + +:root[style*=dark] .highlight .kr { + color: #66d9ef +} + + +/* Keyword.Reserved */ + +:root[style*=dark] .highlight .kt { + color: #66d9ef +} + + +/* Keyword.Type */ + +:root[style*=dark] .highlight .ld { + color: #e6db74 +} + + +/* Literal.Date */ + +:root[style*=dark] .highlight .m { + color: #ae81ff +} + + +/* Literal.Number */ + +:root[style*=dark] .highlight .s { + color: #e6db74 +} + + +/* Literal.String */ + +:root[style*=dark] .highlight .na { + color: #a6e22e +} + + +/* Name.Attribute */ + +:root[style*=dark] .highlight .nb { + color: #f8f8f2 +} + + +/* Name.Builtin */ + +:root[style*=dark] .highlight .nc { + color: #a6e22e +} + + +/* Name.Class */ + +:root[style*=dark] .highlight .no { + color: #66d9ef +} + + +/* Name.Constant */ + +:root[style*=dark] .highlight .nd { + color: #a6e22e +} + + +/* Name.Decorator */ + +:root[style*=dark] .highlight .ni { + color: #f8f8f2 +} + + +/* Name.Entity */ + +:root[style*=dark] .highlight .ne { + color: #a6e22e +} + + +/* Name.Exception */ + +:root[style*=dark] .highlight .nf { + color: #a6e22e +} + + +/* Name.Function */ + +:root[style*=dark] .highlight .nl { + color: #f8f8f2 +} + + +/* Name.Label */ + +:root[style*=dark] .highlight .nn { + color: #f8f8f2 +} + + +/* Name.Namespace */ + +:root[style*=dark] .highlight .nx { + color: #a6e22e +} + + +/* Name.Other */ + +:root[style*=dark] .highlight .py { + color: #f8f8f2 +} + + +/* Name.Property */ + +:root[style*=dark] .highlight .nt { + color: #f92672 +} + + +/* Name.Tag */ + +:root[style*=dark] .highlight .nv { + color: #f8f8f2 +} + + +/* Name.Variable */ + +:root[style*=dark] .highlight .ow { + color: #f92672 +} + + +/* Operator.Word */ + +:root[style*=dark] .highlight .w { + color: #f8f8f2 +} + + +/* Text.Whitespace */ + +:root[style*=dark] .highlight .mb { + color: #ae81ff +} + + +/* Literal.Number.Bin */ + +:root[style*=dark] .highlight .mf { + color: #ae81ff +} + + +/* Literal.Number.Float */ + +:root[style*=dark] .highlight .mh { + color: #ae81ff +} + + +/* Literal.Number.Hex */ + +:root[style*=dark] .highlight .mi { + color: #ae81ff +} + + +/* Literal.Number.Integer */ + +:root[style*=dark] .highlight .mo { + color: #ae81ff +} + + +/* Literal.Number.Oct */ + +:root[style*=dark] .highlight .sa { + color: #e6db74 +} + + +/* Literal.String.Affix */ + +:root[style*=dark] .highlight .sb { + color: #e6db74 +} + + +/* Literal.String.Backtick */ + +:root[style*=dark] .highlight .sc { + color: #e6db74 +} + + +/* Literal.String.Char */ + +:root[style*=dark] .highlight .dl { + color: #e6db74 +} + + +/* Literal.String.Delimiter */ + +:root[style*=dark] .highlight .sd { + color: #e6db74 +} + + +/* Literal.String.Doc */ + +:root[style*=dark] .highlight .s2 { + color: #e6db74 +} + + +/* Literal.String.Double */ + +:root[style*=dark] .highlight .se { + color: #ae81ff +} + + +/* Literal.String.Escape */ + +:root[style*=dark] .highlight .sh { + color: #e6db74 +} + + +/* Literal.String.Heredoc */ + +:root[style*=dark] .highlight .si { + color: #e6db74 +} + + +/* Literal.String.Interpol */ + +:root[style*=dark] .highlight .sx { + color: #e6db74 +} + + +/* Literal.String.Other */ + +:root[style*=dark] .highlight .sr { + color: #e6db74 +} + + +/* Literal.String.Regex */ + +:root[style*=dark] .highlight .s1 { + color: #e6db74 +} + + +/* Literal.String.Single */ + +:root[style*=dark] .highlight .ss { + color: #e6db74 +} + + +/* Literal.String.Symbol */ + +:root[style*=dark] .highlight .bp { + color: #f8f8f2 +} + + +/* Name.Builtin.Pseudo */ + +:root[style*=dark] .highlight .fm { + color: #a6e22e +} + + +/* Name.Function.Magic */ + +:root[style*=dark] .highlight .vc { + color: #f8f8f2 +} + + +/* Name.Variable.Class */ + +:root[style*=dark] .highlight .vg { + color: #f8f8f2 +} + + +/* Name.Variable.Global */ + +:root[style*=dark] .highlight .vi { + color: #f8f8f2 +} + + +/* Name.Variable.Instance */ + +:root[style*=dark] .highlight .vm { + color: #f8f8f2 +} + + +/* Name.Variable.Magic */ + +:root[style*=dark] .highlight .il { + color: #ae81ff +} + + +/* Grammar */ + +:root[style*=dark] .railroad-diagram { + fill: white; +} + +:root[style*=dark] .railroad-diagram path { + stroke: white; +} + +:root[style*=dark] .railroad-diagram rect { + stroke: white; +} + +:root[style*=dark] .a4 .sig-name { + background-color: transparent !important; +} diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index 4189fcd06cb7..ed21675dd24d 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -1,9 +1,166 @@ +/* ROOT DECLARATIONS */ +:root { + /* Text */ + --color-a: #2B247C; + --color-b: #672AC8; + --color-c: #5554D9; + --color-d: #9F94E8; + --color-e: #AEC0F1; + --color-f: #E6E3EC; + /* Background */ + + --white: #FAF8FF; + --black: #110C4E; + --menu-bg: #2B247C06; + --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + + --navHeight: 4.5rem; + --sideWidth: 300px; + + text-rendering: geometricPrecision; + -webkit-font-smoothing: antialiased; +} + +a, +button { + border-radius: 0; +} + +:root[style*=dark] { + --color-a: #E6E3EC !important; + --color-b: #AEC0F1 !important; + --color-c: #9F94E8 !important; + --color-d: #5554D9 !important; + --color-e: #672AC8 !important; + --color-f: #2B247C !important; + + --white: #110C4E !important; + --black: #FAF8FF !important; + --menu-bg: #E6E3EC06 !important; +} + +html, +body, +.unified-header::before, +.wy-nav-side, +.rst-versions, +code, +div, +input[type=text], +a, +.wy-grid-for-nav { + transition: background 150ms ease-in-out; +} + +html, +body, +.wy-grid-for-nav { + background-color: var(--color-f) !important; + position: relative; +} + +body { + font-family: "Overpass", sans-serif; +} + +a { + color: var(--color-c); +} + +hr { + margin-block: 2rem; + border-color: var(--color-d) !important; +} + + +/* HEADER STYLES */ +h1 { + font-family: 'Overpass', sans-serif; + font-weight: 700; + font-size: 44px; + color: var(--color-a) !important; + line-height: 1.1; + text-wrap: balance; + margin-top: 4rem; + margin-bottom: 1.5rem; +} + +section:first-of-type h1:first-of-type { + font-family: 'Overpass mono', monospace; + font-size: 48px; + margin-top: 3rem; + margin-bottom: 5rem; +} + +h2 { + font-family: 'Overpass', sans-serif; + font-weight: 700; + font-size: 38px; + color: var(--color-a) !important; + line-height: 46px; + text-wrap: balance; + margin-top: 4rem; + margin-bottom: 1.5rem; +} + +*:not([role=navigation])>p[role=heading]>span, +h3 { + font-family: 'Overpass', sans-serif; + font-weight: 700; + font-size: 32px; + color: var(--color-a) !important; + line-height: 46px; + text-wrap: balance; + margin-top: 4rem; + margin-bottom: 1.5rem; +} + +h4 { + font-family: 'Overpass', sans-serif; + font-weight: 700; + font-size: 32px; + color: var(--color-a) !important; + line-height: 46px; + text-wrap: balance; + margin-top: 3rem; + margin-bottom: 1.5rem; +} + +h5 { + font-family: 'Overpass', sans-serif; + font-weight: 700; + font-size: 18px; + color: var(--color-a) !important; + line-height: 1.4; + text-wrap: balance; +} + +h6 { + font-family: 'Overpass', sans-serif; + font-weight: 700; + font-size: 16px; + color: var(--color-a) !important; + line-height: 1.4; + text-wrap: balance; +} + +span.pre, pre { - white-space: pre-wrap; /* css-3 */ - white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ + /* css-3 */ + white-space: pre-wrap; + /* Mozilla, since 1999 */ + white-space: -moz-pre-wrap; + /* Opera 4-6 */ + white-space: -pre-wrap; + /* Opera 7 */ + white-space: -o-pre-wrap; word-wrap: break-word; + font-family: 'Overpass Mono', monospace; +} + +small, +small * { + font-size: 12px; } .wy-table-responsive table td, @@ -16,10 +173,6 @@ pre { } /* links */ -.rst-content a:not(:visited) { - color: #002fa7; -} - .rst-content .highlighted { background: #eac545; } @@ -29,24 +182,12 @@ pre { background: #fafafa; } -.wy-side-nav-search > a img.logo { - width: 100px; - padding: 0; -} - -.wy-side-nav-search > a { - padding: 0; - margin: 0; -} - /* project version (displayed under project logo) */ -.wy-side-nav-search > div.version { - color: #272525; -} - -/* menu section headers */ -.wy-menu p.caption { - color: #65afff; +.wy-side-nav-search>div.version { + color: var(--color-b); + margin-top: 0; + margin-bottom: 0.5rem; + text-align: start; } /* Link to Remix IDE shown next to code snippets */ @@ -58,18 +199,618 @@ pre { } .rst-content .remix-link-container a.remix-link { - display: inline-block; font-size: 0.7em; - padding: 0.1em 0.4em; - background: #e1e4e5; - color: #707070; -} - -.rst-content .remix-link-container a.remix-link:hover { - background: #c8cbcc; + padding: 0.1em 0.5em; + background: transparent; + color: var(--color-a) !important; + border: 1px solid var(--color-a); + text-decoration: none; } .rst-content div.highlight-solidity, .rst-content div.highlight-yul { margin-top: 0; } + +/* CUSTOMIZATION UPDATES */ + +.wy-nav-content-wrap, +.wy-nav-content { + background: transparent !important; +} + +.wy-side-nav-search { + background-color: transparent !important; + color: var(--color-a) !important; + box-shadow: 0 4 4 0 var(--color-a); + border-bottom: 1px solid var(--color-d) !important; +} + +.wy-side-nav-search svg { + color: var(--color-a) !important; +} + +.wy-nav-top { + background-color: transparent !important; + color: var(--color-a) !important; +} + +.wy-nav-top a { + color: var(--color-a) !important; +} + +.wy-breadcrumbs a.icon-home:before { + content: "Documentation"; + font-family: "Overpass", sans-serif; +} + +.rst-content table.docutils thead { + color: var(--color-a); +} + +code.docutils.literal.notranslate { + padding: 2px 4px; + font-size: 0.875em; + font-family: "Overpass Mono", monospace; + background: var(--white); + color: var(--color-c); + border: 0px; +} + +dt code.docutils.literal.notranslate { + background: none; +} + +.wy-nav-content { + color: var(--color-a); +} + +/* .rst-content a:not(:visited) { */ +/* color: var(--color-b) !important; */ +/* } */ + +.rst-content a:visited { + color: var(--color-c) !important; +} + +.rst-content a { + text-decoration: underline; +} + +.rst-content a:where(:focus, :focus-visible, :hover) { + color: var(--color-d) !important; +} + +.wy-side-scroll a { + color: var(--color-a); + background: transparent; + font-size: 1rem; + line-height: 125%; +} + +.wy-menu-vertical li.current a, +.wy-menu-vertical li.current li a, +.wy-menu-vertical li.current li a code { + border: none; + color: var(--color-a); +} + +ul.current ul, +.wy-menu-vertical li.current a:hover, +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a, +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a, +.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a, +.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a, +.wy-menu-vertical li.current { + background: var(--menu-bg) !important; +} + +.wy-menu.wy-menu-vertical>ul { + margin-bottom: 3rem; +} + +.wy-menu.wy-menu-vertical>p { + color: var(--color-c); +} + +.wy-menu-vertical li.on a, +.wy-menu-vertical li.current>a { + background: var(--menu-bg) !important; + border-bottom: 0px !important; + border-top: 0px !important; +} + +.btn { + border-radius: 0; + text-decoration: none !important; +} + +.wy-breadcrumbs-aside a, +.wy-breadcrumbs-aside a:visited, +/* .wy-breadcrumbs-aside a:not(:visited), */ +a.fa.fa-github, +a.fa.fa-github:visited, +a.fa.fa-github:not(:visited), +a.btn.btn-neutral:visited, +a.btn.btn-neutral:not(:visited), +a.btn.btn-neutral { + background: transparent !important; + color: var(--color-a) !important; + border: 2px solid var(--color-a) !important; + text-decoration: none; +} + +.rst-content .remix-link-container a.remix-link:hover, +.wy-breadcrumbs-aside a:hover, +a.fa.fa-github:hover, +a.btn.btn-neutral:hover { + background: var(--white) !important; + color: var(--color-b) !important; + border-color: var(--color-b) !important; +} + +footer .rst-footer-buttons { + display: flex; + justify-content: center; + gap: 2rem; +} + +/** + * Customization for the unified layout + */ + +/* Site wrapper, and two children: header and rest */ +.unified-wrapper { + position: fixed; + inset: 0; + top: var(--navHeight); + max-width: 80rem; + margin-inline: auto; +} + +/* Site header */ +.unified-header { + position: fixed; + top: 0; + inset-inline: 0; + z-index: 99999; + display: flex; + align-items: center; + box-shadow: var(--shadow); + backdrop-filter: blur(3px); +} + +.unified-header .inner-header { + display: flex; + margin-inline: auto; + width: 100%; + max-width: 80rem; + align-items: center; + justify-content: space-between; + padding-inline: 2rem; + padding-block: 1rem; +} + +.unified-header::before { + content: ""; + position: absolute; + inset: 0; + opacity: 95%; + background: var(--color-f); + z-index: -1; +} + +.unified-header .home-link { + display: block; + text-decoration: none; + width: 25px; + height: 40px; +} + +.unified-header .home-link:hover .solidity-logo { + transform: scale(1.1); + transition: transform 100ms ease-in-out; +} + +.unified-header img.solidity-logo { + transform: scale(1); + transition: transform 100ms ease-in-out; + width: 100%; + height: 100%; +} + +.unified-header .nav-bar { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.unified-header .nav-bar .nav-button-container { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; +} + +.unified-header .nav-link { + display: inline-block; + padding-inline: 8px; + padding-block: 4px; + font-size: 14px; + font-family: 'Overpass Mono', monospace; + text-decoration: none; + color: var(--color-a); + letter-spacing: -0.02em; + font-weight: 400; + box-sizing: content-box; + border-bottom: 1px solid transparent; +} + +.unified-header .nav-link.active { + background: var(--white); +} + +.unified-header .nav-link:hover { + color: var(--color-c); + border-bottom: 1px solid var(--color-c); +} + +/* Rest: Grid, with two children: side bar, and content */ +.unified-wrapper .wy-grid-for-nav { + position: relative !important; + display: grid !important; + grid-template-columns: var(--sideWidth) 1fr; + gap: 1rem; +} + +/* First child: Side bar */ +.unified-wrapper .wy-grid-for-nav nav.wy-nav-side { + position: relative; + display: flex; + flex-direction: column; + background: var(--color-f); + color: var(--color-a); + top: 0; + bottom: 0; + left: 0; + padding-bottom: unset !important; + min-height: unset !important; + z-index: 10 !important; + max-width: var(--sideWidth) !important; +} + +.unified-wrapper .wy-grid-for-nav nav.wy-nav-side .wy-side-scroll { + position: relative !important; + width: fit-content !important; + height: unset !important; +} + +.unified-wrapper .wy-grid-for-nav nav.wy-nav-side .wy-side-scroll .wy-side-nav-search { + margin: 0 !important; + width: var(--sideWidth) !important; +} + +.wy-nav-side, +.wy-side-scroll, +.wy-side-nav-search, +.my-menu { + width: 100% !important; +} + +.wy-nav-side input[type=text] { + font-family: "Overpass", sans-serif; + border-radius: 0; + border-color: var(--color-d); + background: var(--white); + box-shadow: none; + color: var(--color-a); +} + +.wy-nav-side input[type=text]::placeholder { + font-family: "Overpass", sans-serif; + color: var(--color-e); + font-size: 16px; + position: relative; + top: 4px; +} + +/* Second child: Content */ +.unified-wrapper .wy-grid-for-nav .wy-nav-content { + position: relative !important; + overflow-y: scroll !important; + width: 100%; + max-width: 100vw !important; + padding-inline: 2rem; +} + +.unified-wrapper .wy-grid-for-nav .wy-nav-content .rst-content { + max-width: 70ch; + margin-inline: auto; +} + +.unified-wrapper.menu-open .backdrop { + opacity: 0.5; +} + +.unified-wrapper .wy-nav-side, +.unified-wrapper .rst-versions { + left: auto; + +} + +.unified-wrapper .backdrop { + opacity: 0; + transition: opacity 200ms ease-in-out; +} + +@media (max-width: 768px) { + h2 { + margin-top: 3rem; + margin-bottom: 1rem; + } + + h3 { + margin-top: 3rem; + margin-bottom: 1rem; + } + + h4 { + margin-top: 2rem; + margin-bottom: 1rem; + } + + /* Menu closed styles */ + .unified-header .nav-link { + display: none; + } + + .unified-header .inner-header { + padding-inline: 1rem; + } + + .unified-wrapper .wy-grid-for-nav { + grid-template-columns: 1fr; + } + + .unified-wrapper .wy-grid-for-nav nav.wy-nav-side { + position: absolute; + inset-block: 0; + inset-inline-start: 0; + width: var(--sideWidth); + overflow-y: scroll; + transform: translateX(-100%); + transition: transform 200ms ease-in-out; + } + + /* Menu open styles */ + .unified-wrapper .wy-grid-for-nav nav.wy-nav-side { + position: absolute; + + } + + .unified-wrapper.menu-open nav.wy-nav-side { + transform: translateX(0); + transition: transform 200ms ease-in-out; + } + + .unified-wrapper.menu-open .rst-versions { + position: sticky; + bottom: 0; + width: 100%; + } + + .unified-wrapper.menu-open .backdrop { + display: block; + position: fixed; + inset: 0; + opacity: 1; + transition: opacity 200ms ease-in-out; + z-index: 5; + background: #0006; + } + + a.skip-to-content { + display: none; + } +} + +ul.search .context { + color: var(--color-a) !important; +} + +.rst-versions { + background: var(--color-f); +} + +.rst-versions.shift-up { + height: unset !important; + max-height: unset !important; + overflow-y: unset !important; +} + +.rst-content dl:not(.docutils) dt { + color: var(--color-a); + background-color: #fff8; + border-top: solid 3px #0002; + border-inline-start: solid 3px #0002; + padding: 2px 6px; +} + +.rst-versions .rst-current-version { + border-color: var(--color-d) !important; +} + +.rst-current-version *, +.rst-current-version .fa:before, +.rst-current-version .fa-element { + color: var(--color-b) !important; +} + +.rst-current-version dt, +.rst-current-version dd, +.rst-current-version dd a, +.rst-other-versions dl:last-of-type dt, +.rst-other-versions dl:last-of-type dd, +.rst-other-versions dl:last-of-type dd a { + font-size: 14px !important; +} + +.rst-other-versions { + background: var(--white) !important; + color: var(--color-a) !important; +} + +.rst-other-versions a { + text-decoration: underline; + color: var(--color-c) !important; +} + +.rst-other-versions dt { + color: var(--color-a) !important; +} + +.rst-other-versions dl { + margin-bottom: 1.5rem !important; +} + +.rst-other-versions dl:last-of-type { + margin-top: 2rem !important; +} + +/* Bottom Search */ +.wy-nav-side input[type=text], +.rst-other-versions dl:last-of-type dd { + width: 100%; +} + +.rst-other-versions dl:last-of-type dt { + color: var(--color-b) !important; +} + +.rst-other-versions dl:last-of-type div[style*=padding], +.rst-other-versions dl dd:first-of-type a { + padding-inline-start: 0 !important; +} + +button.toctree-expand { + color: var(--black) !important; +} + +/* Light/dark color mode toggle 🌓 */ +button.color-toggle { + display: inline-flex; + appearance: none; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + user-select: none; + outline: none; + height: 28px; + width: 28px; + background: none; + border: none; + padding: 6px; + margin: 6px; + transition-duration: 200ms; + transition-property: background-color, + color, + fill, + stroke, + opacity; +} + +button.color-toggle:focus-visible { + outline: 2px solid var(--color-c); + color: var(--color-c); +} + +button.color-toggle:hover { + color: var(--color-c); + background: #0002; +} + +button.color-toggle .color-toggle-icon { + width: 100%; + height: 100%; + margin: 0; + display: inline-block; + line-height: 1em; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + vertical-align: middle; + /* color: var(--color-a); */ +} + + +button.mobile-menu-button { + display: none; +} + +@media (max-width: 768px) { + nav.wy-nav-top { + display: none; + } + + button.mobile-menu-button { + display: flex; + } +} + + +.hidden { + display: none; +} + +#search-results .search li:first-child, +#search-results .search li { + border-color: var(--color-d); +} + +#search-results .search li:last-child { + border: 0px; +} + +.forum-link::after { + content: ' ↗'; + font-size: 14px; + font-family: 'Overpass Mono', monospace; +} + +.wy-breadcrumbs-aside { + display: block; + padding-top: 0; +} + +.wy-breadcrumbs-aside a { + padding: 0.5rem 0.75rem; + font-size: 12px; + font-family: "'Overpass'", sans-serif; + font-weight: 700; +} + +a.skip-to-content:visited, +a.skip-to-content:not(:visited), +a.skip-to-content { + display: block; + pointer-events: none; + width: fit-content; + opacity: 0; + transition: opacity 200ms ease-in-out; + padding: 2px 4px; + font-size: 14px; + margin-inline-end: auto; + margin-inline-start: 2rem; + color: var(--color-a); +} + +a.skip-to-content:focus { + opacity: 1; + transition: opacity 200ms ease-in-out; +} + +#content { + scroll-margin-top: 6rem; + scroll-behavior: smooth; +} \ No newline at end of file diff --git a/docs/_static/css/dark.css b/docs/_static/css/dark.css deleted file mode 100644 index cba22066bf6f..000000000000 --- a/docs/_static/css/dark.css +++ /dev/null @@ -1,652 +0,0 @@ -/* links */ - -.rst-content a:not(:visited) { - color: #aaddff; -} - -/* code directives */ - -.method dt, -.class dt, -.data dt, -.attribute dt, -.function dt, -.classmethod dt, -.exception dt, -.descclassname, -.descname { - background-color: #2d2d2d !important; -} - -.rst-content dl:not(.docutils) dt { - color: #aaddff; - background-color: #2d2d2d; - border-top: solid 3px #525252; - border-left: solid 3px #525252; -} - -em.property { - color: #888888; -} - - -/* tables */ - -.rst-content table.docutils thead { - color: #ddd; -} - -.rst-content table.docutils td { - border: 0px; -} - -.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { - background-color: #5a5a5a; -} - -.rst-content pre { - background: none; -} - -/* inlined code highlights */ - -.xref, -.py-meth, -.rst-content a code { - color: #aaddff !important; - font-weight: normal !important; -} - -.rst-content code { - color: #eee !important; - font-weight: normal !important; -} - -code.literal { - background-color: #2d2d2d !important; - border: 1px solid #6d6d6d !important; -} - -code.docutils.literal.notranslate { - color: #ddd; -} - -/* highlight color search text */ - -.rst-content .highlighted { - background: #ff5722; - box-shadow: 0 0 0 2px #f0978b; -} - -/* notes, warnings, hints */ - -.hint .admonition-title { - background: #2aa87c !important; -} - -.warning .admonition-title { - background: #cc4444 !important; -} - -.admonition-title { - background: #3a7ca8 !important; -} - -.admonition, -.note { - background-color: #2d2d2d !important; -} - - -/* table of contents */ - -.wy-nav-content-wrap { - background-color: rgba(0, 0, 0, 0.6) !important; -} - -.sidebar { - background-color: #191919 !important; -} - -.sidebar-title { - background-color: #2b2b2b !important; -} - -.wy-menu-vertical a { - color: #ddd; -} - -.wy-menu-vertical code.docutils.literal.notranslate { - color: #404040; - background: none !important; - border: none !important; -} - -.wy-nav-content { - background: #3c3c3c; - color: #dddddd; -} - -.wy-menu-vertical li.on a, -.wy-menu-vertical li.current>a { - background: #a3a3a3; - border-bottom: 0px !important; - border-top: 0px !important; -} - -.wy-menu-vertical li.current { - background: #b3b3b3; -} - -.toc-backref { - color: grey !important; -} - -.highlight .hll { - background-color: #49483e -} - -.highlight { - background: #222; - color: #f8f8f2 -} - -.highlight .c { - color: #888 -} - - -/* Comment */ - -.highlight .err { - color: #960050; - background-color: #1e0010 -} - - -/* Error */ - -.highlight .k { - color: #66d9ef -} - - -/* Keyword */ - -.highlight .l { - color: #ae81ff -} - - -/* Literal */ - -.highlight .n { - color: #f8f8f2 -} - - -/* Name */ - -.highlight .o { - color: #f92672 -} - - -/* Operator */ - -.highlight .p { - color: #f8f8f2 -} - - -/* Punctuation */ - -.highlight .ch { - color: #888 -} - - -/* Comment.Hashbang */ - -.highlight .cm { - color: #888 -} - - -/* Comment.Multiline */ - -.highlight .cp { - color: #888 -} - - -/* Comment.Preproc */ - -.highlight .cpf { - color: #888 -} - - -/* Comment.PreprocFile */ - -.highlight .c1 { - color: #888 -} - - -/* Comment.Single */ - -.highlight .cs { - color: #888 -} - - -/* Comment.Special */ - -.highlight .gd { - color: #f92672 -} - - -/* Generic.Deleted */ - -.highlight .ge { - font-style: italic -} - - -/* Generic.Emph */ - -.highlight .gi { - color: #a6e22e -} - - -/* Generic.Inserted */ - -.highlight .gs { - font-weight: bold -} - - -/* Generic.Strong */ - -.highlight .gu { - color: #888 -} - - -/* Generic.Subheading */ - -.highlight .kc { - color: #66d9ef -} - - -/* Keyword.Constant */ - -.highlight .kd { - color: #66d9ef -} - - -/* Keyword.Declaration */ - -.highlight .kn { - color: #f92672 -} - - -/* Keyword.Namespace */ - -.highlight .kp { - color: #66d9ef -} - - -/* Keyword.Pseudo */ - -.highlight .kr { - color: #66d9ef -} - - -/* Keyword.Reserved */ - -.highlight .kt { - color: #66d9ef -} - - -/* Keyword.Type */ - -.highlight .ld { - color: #e6db74 -} - - -/* Literal.Date */ - -.highlight .m { - color: #ae81ff -} - - -/* Literal.Number */ - -.highlight .s { - color: #e6db74 -} - - -/* Literal.String */ - -.highlight .na { - color: #a6e22e -} - - -/* Name.Attribute */ - -.highlight .nb { - color: #f8f8f2 -} - - -/* Name.Builtin */ - -.highlight .nc { - color: #a6e22e -} - - -/* Name.Class */ - -.highlight .no { - color: #66d9ef -} - - -/* Name.Constant */ - -.highlight .nd { - color: #a6e22e -} - - -/* Name.Decorator */ - -.highlight .ni { - color: #f8f8f2 -} - - -/* Name.Entity */ - -.highlight .ne { - color: #a6e22e -} - - -/* Name.Exception */ - -.highlight .nf { - color: #a6e22e -} - - -/* Name.Function */ - -.highlight .nl { - color: #f8f8f2 -} - - -/* Name.Label */ - -.highlight .nn { - color: #f8f8f2 -} - - -/* Name.Namespace */ - -.highlight .nx { - color: #a6e22e -} - - -/* Name.Other */ - -.highlight .py { - color: #f8f8f2 -} - - -/* Name.Property */ - -.highlight .nt { - color: #f92672 -} - - -/* Name.Tag */ - -.highlight .nv { - color: #f8f8f2 -} - - -/* Name.Variable */ - -.highlight .ow { - color: #f92672 -} - - -/* Operator.Word */ - -.highlight .w { - color: #f8f8f2 -} - - -/* Text.Whitespace */ - -.highlight .mb { - color: #ae81ff -} - - -/* Literal.Number.Bin */ - -.highlight .mf { - color: #ae81ff -} - - -/* Literal.Number.Float */ - -.highlight .mh { - color: #ae81ff -} - - -/* Literal.Number.Hex */ - -.highlight .mi { - color: #ae81ff -} - - -/* Literal.Number.Integer */ - -.highlight .mo { - color: #ae81ff -} - - -/* Literal.Number.Oct */ - -.highlight .sa { - color: #e6db74 -} - - -/* Literal.String.Affix */ - -.highlight .sb { - color: #e6db74 -} - - -/* Literal.String.Backtick */ - -.highlight .sc { - color: #e6db74 -} - - -/* Literal.String.Char */ - -.highlight .dl { - color: #e6db74 -} - - -/* Literal.String.Delimiter */ - -.highlight .sd { - color: #e6db74 -} - - -/* Literal.String.Doc */ - -.highlight .s2 { - color: #e6db74 -} - - -/* Literal.String.Double */ - -.highlight .se { - color: #ae81ff -} - - -/* Literal.String.Escape */ - -.highlight .sh { - color: #e6db74 -} - - -/* Literal.String.Heredoc */ - -.highlight .si { - color: #e6db74 -} - - -/* Literal.String.Interpol */ - -.highlight .sx { - color: #e6db74 -} - - -/* Literal.String.Other */ - -.highlight .sr { - color: #e6db74 -} - - -/* Literal.String.Regex */ - -.highlight .s1 { - color: #e6db74 -} - - -/* Literal.String.Single */ - -.highlight .ss { - color: #e6db74 -} - - -/* Literal.String.Symbol */ - -.highlight .bp { - color: #f8f8f2 -} - - -/* Name.Builtin.Pseudo */ - -.highlight .fm { - color: #a6e22e -} - - -/* Name.Function.Magic */ - -.highlight .vc { - color: #f8f8f2 -} - - -/* Name.Variable.Class */ - -.highlight .vg { - color: #f8f8f2 -} - - -/* Name.Variable.Global */ - -.highlight .vi { - color: #f8f8f2 -} - - -/* Name.Variable.Instance */ - -.highlight .vm { - color: #f8f8f2 -} - - -/* Name.Variable.Magic */ - -.highlight .il { - color: #ae81ff -} - - -/* Link to Remix IDE shown over code snippets */ - -.rst-content .remix-link-container a.remix-link { - color: black; -} - - -/* Grammar */ - -.railroad-diagram { - fill: white; -} - -.railroad-diagram path { - stroke: white; -} - -.railroad-diagram rect { - stroke: white; -} - -.a4 .sig-name { - background-color: transparent !important; -} diff --git a/docs/_static/css/fonts.css b/docs/_static/css/fonts.css new file mode 100644 index 000000000000..1a987a6da1d2 --- /dev/null +++ b/docs/_static/css/fonts.css @@ -0,0 +1,2 @@ +@import url("https://fonts.cdnfonts.com/css/overpass"); +@import url("https://fonts.cdnfonts.com/css/overpass-mono"); \ No newline at end of file diff --git a/docs/_static/css/pygments.css b/docs/_static/css/pygments.css new file mode 100644 index 000000000000..0e640681de2d --- /dev/null +++ b/docs/_static/css/pygments.css @@ -0,0 +1,399 @@ +pre { + line-height: 125%; +} + +td.linenos .normal { + color: inherit; + background-color: transparent; + padding-left: 5px; + padding-right: 5px; +} + +span.linenos { + color: inherit; + background-color: transparent; + padding-left: 5px; + padding-right: 5px; +} + +td.linenos .special { + color: #000000; + background-color: #ffffc0; + padding-left: 5px; + padding-right: 5px; +} + +span.linenos.special { + color: #000000; + background-color: #ffffc0; + padding-left: 5px; + padding-right: 5px; +} + +.highlight .hll { + background-color: #ffffcc +} + +.highlight { + background: #eeffcc; +} + +.highlight .c { + color: #408090; + font-style: italic +} + +/* Comment */ +.highlight .err { + border: 1px solid #FF0000 +} + +/* Error */ +.highlight .k { + color: #007020; + font-weight: bold +} + +/* Keyword */ +.highlight .o { + color: #666666 +} + +/* Operator */ +.highlight .ch { + color: #408090; + font-style: italic +} + +/* Comment.Hashbang */ +.highlight .cm { + color: #408090; + font-style: italic +} + +/* Comment.Multiline */ +.highlight .cp { + color: #007020 +} + +/* Comment.Preproc */ +.highlight .cpf { + color: #408090; + font-style: italic +} + +/* Comment.PreprocFile */ +.highlight .c1 { + color: #408090; + font-style: italic +} + +/* Comment.Single */ +.highlight .cs { + color: #408090; + background-color: #fff0f0 +} + +/* Comment.Special */ +.highlight .gd { + color: #A00000 +} + +/* Generic.Deleted */ +.highlight .ge { + font-style: italic +} + +/* Generic.Emph */ +.highlight .gr { + color: #FF0000 +} + +/* Generic.Error */ +.highlight .gh { + color: #000080; + font-weight: bold +} + +/* Generic.Heading */ +.highlight .gi { + color: #00A000 +} + +/* Generic.Inserted */ +.highlight .go { + color: #333333 +} + +/* Generic.Output */ +.highlight .gp { + color: #c65d09; + font-weight: bold +} + +/* Generic.Prompt */ +.highlight .gs { + font-weight: bold +} + +/* Generic.Strong */ +.highlight .gu { + color: #800080; + font-weight: bold +} + +/* Generic.Subheading */ +.highlight .gt { + color: #0044DD +} + +/* Generic.Traceback */ +.highlight .kc { + color: #007020; + font-weight: bold +} + +/* Keyword.Constant */ +.highlight .kd { + color: #007020; + font-weight: bold +} + +/* Keyword.Declaration */ +.highlight .kn { + color: #007020; + font-weight: bold +} + +/* Keyword.Namespace */ +.highlight .kp { + color: #007020 +} + +/* Keyword.Pseudo */ +.highlight .kr { + color: #007020; + font-weight: bold +} + +/* Keyword.Reserved */ +.highlight .kt { + color: #902000 +} + +/* Keyword.Type */ +.highlight .m { + color: #208050 +} + +/* Literal.Number */ +.highlight .s { + color: #4070a0 +} + +/* Literal.String */ +.highlight .na { + color: #4070a0 +} + +/* Name.Attribute */ +.highlight .nb { + color: #007020 +} + +/* Name.Builtin */ +.highlight .nc { + color: #0e84b5; + font-weight: bold +} + +/* Name.Class */ +.highlight .no { + color: #60add5 +} + +/* Name.Constant */ +.highlight .nd { + color: #555555; + font-weight: bold +} + +/* Name.Decorator */ +.highlight .ni { + color: #d55537; + font-weight: bold +} + +/* Name.Entity */ +.highlight .ne { + color: #007020 +} + +/* Name.Exception */ +.highlight .nf { + color: #06287e +} + +/* Name.Function */ +.highlight .nl { + color: #002070; + font-weight: bold +} + +/* Name.Label */ +.highlight .nn { + color: #0e84b5; + font-weight: bold +} + +/* Name.Namespace */ +.highlight .nt { + color: #062873; + font-weight: bold +} + +/* Name.Tag */ +.highlight .nv { + color: #bb60d5 +} + +/* Name.Variable */ +.highlight .ow { + color: #007020; + font-weight: bold +} + +/* Operator.Word */ +.highlight .w { + color: #bbbbbb +} + +/* Text.Whitespace */ +.highlight .mb { + color: #208050 +} + +/* Literal.Number.Bin */ +.highlight .mf { + color: #208050 +} + +/* Literal.Number.Float */ +.highlight .mh { + color: #208050 +} + +/* Literal.Number.Hex */ +.highlight .mi { + color: #208050 +} + +/* Literal.Number.Integer */ +.highlight .mo { + color: #208050 +} + +/* Literal.Number.Oct */ +.highlight .sa { + color: #4070a0 +} + +/* Literal.String.Affix */ +.highlight .sb { + color: #4070a0 +} + +/* Literal.String.Backtick */ +.highlight .sc { + color: #4070a0 +} + +/* Literal.String.Char */ +.highlight .dl { + color: #4070a0 +} + +/* Literal.String.Delimiter */ +.highlight .sd { + color: #4070a0; + font-style: italic +} + +/* Literal.String.Doc */ +.highlight .s2 { + color: #4070a0 +} + +/* Literal.String.Double */ +.highlight .se { + color: #4070a0; + font-weight: bold +} + +/* Literal.String.Escape */ +.highlight .sh { + color: #4070a0 +} + +/* Literal.String.Heredoc */ +.highlight .si { + color: #70a0d0; + font-style: italic +} + +/* Literal.String.Interpol */ +.highlight .sx { + color: #c65d09 +} + +/* Literal.String.Other */ +.highlight .sr { + color: #235388 +} + +/* Literal.String.Regex */ +.highlight .s1 { + color: #4070a0 +} + +/* Literal.String.Single */ +.highlight .ss { + color: #517918 +} + +/* Literal.String.Symbol */ +.highlight .bp { + color: #007020 +} + +/* Name.Builtin.Pseudo */ +.highlight .fm { + color: #06287e +} + +/* Name.Function.Magic */ +.highlight .vc { + color: #bb60d5 +} + +/* Name.Variable.Class */ +.highlight .vg { + color: #bb60d5 +} + +/* Name.Variable.Global */ +.highlight .vi { + color: #bb60d5 +} + +/* Name.Variable.Instance */ +.highlight .vm { + color: #bb60d5 +} + +/* Name.Variable.Magic */ +.highlight .il { + color: #208050 +} + +/* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_static/css/toggle.css b/docs/_static/css/toggle.css index add134f6c2e2..6f03e6fb6aba 100644 --- a/docs/_static/css/toggle.css +++ b/docs/_static/css/toggle.css @@ -9,6 +9,13 @@ input[type=checkbox] { padding: 10px; display: flex; justify-content: space-between; + background-color: var(--color-f); + border-top: 1px solid var(--color-c); +} + +.fa-caret-down, +.fa-book { + color: var(--color-a) !important; } .rst-versions .rst-current-version .fa-book, @@ -76,8 +83,6 @@ html.transition *:after { transition-delay: 0 !important; } -nav.wy-nav-side { - /* The default padding of 2em is too small and the "Keyword Index" link gets obscured - * by the version toggle. */ - padding-bottom: 3em; -} +.wy-menu-vertical a:hover { + background-color: #0002; +} \ No newline at end of file diff --git a/docs/_static/fonts/overpass-bold.otf b/docs/_static/fonts/overpass-bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..962a5d7628df54752943bc65a97c9aa656b7f6de GIT binary patch literal 68828 zcmdqKcYIXE`aeE%wk5l;Aj?Kb*z6`iXzBC-Vk!he5|YrQrfdqNvDqXP1*F?S6dN6+ z_b!Sc3L-WX8zLAL%T*My&2mqa-}^admjs0Cy`R_X`_GT~?97=n<>~Xx%sI!5oSY2S zgw0|ac6VY*ilcJk!ZOCPnlmx`XR#Tff(KxRhv*;8>X7<+ROW4*Kk zvWF$4oQgWZxaJAQ{0C-aN5zhRed;mB{N|$mg#5DH%B(-*KV~c;hp}eMik-OyrpYVo zaPI>^k75+~mFj{}e*&)C6_>fE7$;^J7~@SCGvt)zPO0P{X5tom3!pF0Epvv){$)n} zi;VTIsH~`RU#nx|85{aD?mHOEWc)+qI6%YL){}kT9N(<(?@Xil4khe^qR7s^^sn=O z&DU<#hM}&8NmPn|zcVHsVgXWb7AtjUcW^86c`Sl|&Du*FSR1J`Yc0)Z!=#=pReBV4 znzNqLzgQFL2srowGitiCCVV`gl(pt|)T?2cfDG!FJ6M0dn?*>wS!Zb|i`8Tze}eU8 z|3d#oECtX}YJ)z}hW)_8_!Dd}`;N8a_1CUotW^FK3z3|xzjP0ak{)19r702groUT?Y$Dfl4`2d>9J+ZxtZlY{(9lo5Zx6Mi2nAe@nQ#Q1mf->%7g zKkFrhpiXZ#Sh9jf;%{fv9mCox`2;qYH)Zj>>9r$LB=T04sTqg5C|B-NJG9|XY~?^aWi@fgAOi4LX{EjupUV26)|*#cR@7Uj=%ymf+JUKpgNM zq{+MXqjZ+VX?_BIsvarwlrmT|DH-~g4jz;M|BoTJr-0ig(0zclKN0G^kDbAQP1ef04@3xi&^ zCEZl|8Ux)Yo0TJd!budyAC# ztniBTgJg8Olx*fp-1qqhqJebepHi|f(u>=rusubW-h}T-fX@lPb{6_|3h5Q3Un2b! z>6=Ku=f-R2z^g39R)}BFMa?A0F3@W`uwRrNAv;!5vSrwl)E3a4wTE5#lWikSmbzn% zUEnQUFG5OoLH2f2s?kB-zA};r(Q>;K`l{TApCDV6)U>}hjq>`^j@Nyv>RUUKP5bdP|IxC=d)K}w_V+<;z)CZ7J ztY!o2NOQ5~qrWb4qxS4y=dUf)ZdGPyOt!v%n6b4|FX<(wg9SV&jYRoiHRa>jcpgjj z{Ct&_d7Wl@^^X8j2U(Sbk^JeC}<9l!3!g5+8f!SL}t`DU6r|2RS6ZP1zjVfqoezf%=`F? zBdFYW;h>A*PFGb)MY-b^m3{SYY*bR^$aT0~xdqO$T-PK=Md6KDB{@rLoQ{-=a(9)Q z9Z}*gc9oPDxhu-U9XZ7nWw}+3K^6IvO3E83?3mw)XpD*Y?+Gn-yDQ_OqH1evBVEpd z;#_xRennZM!UDphkkFtTZQDB1O7flMRZgR^VOV9f8+aOSH0Bh8Lc-sXT~X++&2>2) zC@5817dWcR3!E;8yV&W-PEB)UR65Jm%HHn79X^J}M8-s_oq5|*H~AHnC6HmBv$Uc% z+>u*eK!v%bRTYlhn%t7o+`Lk!qZSMUi&Nrm5K~oB8d>2gipoey zGa8L;@lQo0GdbOnl98U{NJ~vjPR~wu7#ktth;YRAaHKf%T-CX*sbF<#|ikc6~kpzCxLRRA9nE7ABj`WziGa3=?G#a-d3a+j1GbcL(5pthvI=_qj4 zfV#>uCpd^+@+(R~R)s6qT>`xzfjBB%6%(EL?y7L5i|WeC3YS|MO}U%za-uFY(pgxD z8wx79`J`?o`3lEMp-j~!7&;%Fmz7nQm$*xu=#01toX~p>;gRbobUBfrw1T8m=)!Uc zXijpJlsjsROY(~qY^oe(xl~rnF{d5RTW8! z0{*0=L3|Kql|sOEEm0JYutCSwRnCHNu&TNMq7QeJRTPvIk`fSR7!j1XO7g1RC?SMP zr#fIDr4{8xlwvGggW2U3Zbuc&mAn87%c@Adt0G}gDpNs!NqK%L#-N7fQy~UdNsY>M zA{zJebIS>xJZNw!A>u5{a~2d(?nW$tS5$>d9Zl6mbXVoG1uuKSYS^4IlF#=zXuSz- z_F_w96Sg-a(gPRh@1{04Y*FnB)TX@U>sF<9jPXTXa11YSd+*#{zme-WHD$0qwL}q-o zyST#jcjBr_ir~;-|1^w~a8Rxog? z*!`)~2)t|QjgGpy{JP&pSD0^ZGb|K><~E;s7eak2Y6)4etN;^LMR`@6(HPUok?zDa z?=_DbP=_mWDIN%Pl|cL@Xom@{8WL&HAoBK(>$ZaiH|sQP+c&RyXASh_EG>j&Vmtlk zmbawL*W2~kqcPKzx$O3HhN56JCwnIiXD;SmMRcS`5T-hLB1%AnK;>%K3zv+bOL0nW z@?wqsd=)CH)0x+=6*#>7B+uuDM~ukD9Eu>tImPXBcE#0Yx#bZEFA9`6i?&zE6N7tT zCOI2S0IrHkR|y3)Wk3?<(NMk2=|)30!io}SX+f0|3{X270A1w4iy^d99XXI_n87Q6 zthbF9XUu0M@YOXX&RXyUs!xMMTV0S&SExqC-^6))nV^}{{O@jBoh{(zs~pZLmEc~9 zTd`?3f+5&aBLnnWo)44!3K!;dxK_pIC0-YZIth8_6x4tV@OtKQidryxl3jTH0oaJS z2n?Z!k7fw+(UoWg??j5APJcu+&6?dhDUl4-BecCHee=-DEj9R7om->2H`)+_Iasha zg1{iY$gr%!4WHmFFQ{;VZ)9i%2shj%xF8pEvlXH0lzeBUV$QkwlgcY<5jhp948QIJ zVbhK9xE0PcL6e9ZA?;FwNt7aj_z&U%Z@R0zxq(2h^P(^kL^L=j#V=6E>eXsE>rxP0 zR$ZmUQjOjOY+RoScZ^8Q8JICF$AKDI@##6Euv&1$r;l-rnvAm4^u)AbNvY`r90_Qbog_5u z8SPRWz$I}YdX7&>O-s!g74Aq$%}J*|Q_yL=BQriLCpB?cT6~rxb66G*qmt1_61q)K zO;5?fD9J;Tv0y|;i5Z!rvQh^O%n3)M928=uo)w>zJS0AAa5!O@0g|&EN|i`pi9Q_3 z!>Muh!1%N@2QlP&AC7?;X-TM^kPPhOv8+_l0pSY&!W~KRL*fSz1-^c%nwNqG4iKjX zB&R25#ixZkvNMwtQz--1rDi230zuRSyFolk(G#MJ?Bt=tP=I>AAs~Z+$qMSgIUfHd zl76TZr-MT3CnqBdJn*72A~icX+!3FZnoUAT$;udl&LIl$h-e%J7NRQjOvRVPLS=MM zS$tnt2-Kq1UdAOQ$ETq~=tcV9>qg#Yg`Zzm73Gc0qbhTYoRO8qmHiQtm5nbc=!b>p z_*!S4!$FO!yc;1!<<-jG0L`JL&O&z-Ie*M5#qP4w)Ivw9qc|5cY?YH%!__V*KH@!0 z3Yc3l2Pv~AMJkB#$R?_aE2?SHp+q`GC5X+i+6Fv@2j;(Mz=Q*M}vsWR}K;vp#>T9dW(>&HXs8-x;oq zR|Q%sfSu#N?D^*Y{?kY$z}o@*9pHisX#qwoL+WCaP*%YT@q2q-C82hy!UYFQQE+sl zzs98_fV&%VAbFHSB5tJ?@jC~l70OtI!64-GF(%czl?*%LZYR`Jv{+~#c^u-N% z#<3{;)hd6Hz@2oZ7+i5fviSr3${axF+0HElz>;4ps7QNYRM$#uBXp?@1FYQA&~_%PK`$fzl#KJOf&srtsAW zX{mpWIg$x$PDk%4sF@B5i6g0yAeCn0*MYXT=7<9tOWI2wC@hKIDx^-qAQh zB7KNZ{wUXgK_+Z48I%oyXGlX%^yR}O7k&G@8(ARHOS zcB*HpMygUxcU3DV`pZ#HSd;fBjrX-vF;sD{!F`n<`QVa`4=IlUaOcA=X{!7jvAyzPtz(8*92x(yIQD9+JFO?hsX^hvdst z9?|?u_X_amEBjBpP<1Q{G?5o?pshj1RD<|H_imgQd^)3QFL8u;LAa}OpjI??5cKFz9&O|B?^xke4pxl8tV=9N?w&(kUgu`*%%Yz`>kio z0<{mypo*lU_UogA>gEHZ23#8aqmO!;^Hi->_5MaYRV`BQ5M8&Efa)t6 zW+;ktQ!p2%19AW~KV~zdqYX;QE=i-Zk!z%X4jamdBZUC+KR#-Fc#*`YojRA0hagE( zy}wIUjp}_ZZxvGwL_cKpG*(CSLUZ1KCjr&MXiiWyiRM7!y)RByIjee|D)dP{+@~k1 zOnpAQvF}j5c?Igb&_eYyJ_^atkY}K4vVt4qmd4g`qr6qGL;P0c1MX)j93z^^PN=U2 zd8Dg$d|NsAw5qYaS1GoU56l{SY?6tOa>9X9_HJC4(QH5%lTD~`gDMvv z?iuKTR&m5NnuTtPHgAh}<1uOOQsWBW8cNls1}@yBl^8{x`zh+6d6RUP=u_oOa~0uz z^NjR=(LW!ZLom{fbKngz&x+Qq@kn{r+pkc3CeeaYffxvA8swSAFf0~b{7{7>58^RVQ9otSYP_$`Muk#{5-e7ftCX1u~H znw?z#mE_1D7b$(Kvl#WRQscx(YMDAu7vYL#UK&v?C)*(oP>f2mAK6GP?oo87+Mh~& z%t08|kk= zujGYDBYavxF}%-T`TG244iF~lNNNm3*S>gns)C2FPr9SZ(1&3|%%|S-`2)2b(S9qx zLv=~_)fs~9xK!!c*V?zX_SK=;?(gxoij}&)`QNA|kDqsa-R7g-$0@Qy-^#(qSsIJ* zRaaD$uToa&M(i2Te4GwS)s=~=y}rI~uXk!xL^I8e-iCT1uT3MwDWQEyrWvtKlo{kM}7F_dNuweJ8QhwQ1K#J6?)fOu?pq?_c8x_nca-r-`5_u z(=^gBRg3;F>kQ(`e_Cl!bWS$g*y>bG@mVHG(x(gRUIIlk4fR!dsk^;ul&tQu`LI@7 ztKQ^x@jOMF)FaX9Tb+?U_||%A^mLR4nq8o@w5v__u*7;xozUR%`GI+#%f5c+oe`jeJ(uXT&4wmu!`0 zT9xBBMpmkCb$M;4tJiDL+UlRI^Z#Ne>SztRmj#@Nn*R_@->|lz$cpAOiW#OrR;uoi z4``UDNphrd>b!L88SutA&ll18w1I5Jg+CfgjjI~syhKGuZj8GduY@8oa*m=ggr(Yt z8U@f^oNpc`Pwm@lQP-Zn`Qpa-K-EUlZJ&lvOQP1dhVW?$)l_-uo5_jGBu5`rK1uub zrMfAyCR|CIeEs=WayQ10|3q~|tHx`TMv>cfDc;!cf0~EXojG+5_N~;_IY6a^e5gvH zYPmEMlkCYmk_OP)oh+WHQ>~4xRNdVmNvLe%FIC!r78 zJ0a~XP@<#;uKWCMLma5;Km*6l z?OCfM-Kd4P8?kZ!KJ99}Ubx+Ssd|h5KkR?qUMFr|)#PB8OI_8Z<21&%&-I_qx=7k& zQ#9|Ahb@P6R3G7!R}Jpc{wrw{*;a!L8e7`UQP0g$G_@n0QR89KGj*oFnF3mOWn&GN z2K-auMTj24e;{&=&$Y6Zlc5|o0`=(ZiO$Ef@k=LB893ugRZg~(m;-xE@yZ?C$9k7E zaRlyCj~Q$jQo5!-vhYi1W}{F-XA5-Bo~~RCMtxclQrl!UQW+x|ebRUtXh&lYK`EWJ zC41{p3!-9}vXV?^15hi$J6<|k(YREfR-hy`V2U&YzrIm##EN=W$0N*Cz9fPM73X;L zO{b#N*C+)~+Uv{#4n92TM369z2V~+m3wP;ca2Q(A6_pM{nu&VqNg?%2SP{0gYnl$8 zWGU$Y^hy}0CyXkuXw{sFv8l!Y;FY6bK_d}$RFk-ugZuI5mDmG{IoI;~XoO686!@do`P ztdlSb;Y)Nk$hi|(jk7NDO|_~|B@jQ>Pao3_GAyF--%uhs(q^3 zO%uLPdcqt_q#}T>PkUfx2o$Pn%UKvgJKWb@1zLZ z7cEh5wDU-FjJhjarPQFAg!UAvCGCsA>ajmdGN?is#f0kKOD*nFfB1)YIq~ivliDHG z;?oUo@0*O_^hTgkuEE4X<$CTx9e*ZR08;wrOVz8}{RXf*@s?(57KnE;+b|moW_F+v z!a}i)*p9WwW?=_};hk7#)&+_j0i>hwkVFg~mgvg5vF>=3q9^OcdP6jQ@D+xBc=xkE zyIWD?M8z4UD2_4}j}{GvScgEx$%PJuX=Fn&hr!W}z+^KD?}muB@X;3NOyy%Y6!3v%etv-8k^4UW%sceY$lt?!s%dxkyBo@2|{a<+o4#JjMo z*&4Q%tz*x#^=t#%h{xA9vn^~Z+s3xD9c(At#dfnjY%kl#_TxR(gX{%%h`q>OVu#tw zd=)#wjsO%gBKw+s!@k8E&i`WH__$!yUc!OSJ*F1tECTn z%mB}I;Qb7Cjq7-Kp1`wtKA*y8^2hlHc!M`c>M6Z0y&;{~w9tfUHfdhc91Wfq{Hw$2 z2zG?x9gJv4S4W&9$uZNh&apK_7h(ws2nh`d3yBQL2^kmiOvs^-&qKZrl|uEQ%|cs* zT0;XvgG0N74h)?T>TG|i{ab&$DofX{0S^aT#TnQ09z2of@B%&+PErj)v?Mbk{M__-C!uB46CG3U$Emkbh4<76-=q=-%OI*XX&|p0`a6j(PjoieW z@TT0%oAKuS4&H)WcuQ{O0sKzhinr#0Jczg9HXh9F+`&V5C~wQ#@%B87ciC43^E#7lV@FXt7!l27I? zUd3y8EuY2jXK(Y_d=8(>=i%MkKw;QV9)Xw`96MtzrYXkm-$P4KR?J1@nif|{u)2d zPw?0IEBqvXgP-DW^0)Z={5{y@JN#XKnjhgu;nQ03egNCWFAL$yvTEJ6)bzb-t>GNLLgmk?ZEJ!za;TfbGy+Hj@Jp$Mn^i+kN zNVj-_zC^Iq3kQ&H^TKaPw|ikZ(j8v-0V%a7SPIzX1;S;w7g`|QJ=n3tni3^pF>5%on|I7%9;}fbTEC{#0m+6#hwp=17ltfyO`T z1uA>R3+IrMYzWQ*UiHFJq^|*v1F8Whyg;&f-3zryPkP}z(l@*?1?ed-e2NrbQc>VD zr1ae=f-eAX1KtH(0G##$NBW)@rXnSuNN^Ew2JivkO91hUfav(h3)7H(>;)^*PrN{S zM6?ln3m}|`?ymua6Tx%<(Li7T5KaXCfX}_K3~8Mg?n6p65ZntOoCszBzVgB>q=YxY zOaP5Xa6jN1FOa?vP6V?7-+5s!(tmkj4$|)dq=WMSm%OkL>5pDmfb=H->COXypS>U< zz2b$3kpAL@N09#Ng@=)n-V;0u_}vSOkpAI?$B+sykZdszDnL4Z)eDa!{kInuBb5R5 zfF*!Gz2JxRFE1F8Uh@KUf+Ndy_`&#G4~SOp@fhR*#2fnh2=5Ar0CWR%2cRCl#KQR9 z04j?IB%rK%v>H(31?WDX z1%R#-kS=rRD~B%NOF0Z*+hUw_!GsjDS71I;@Q8ryn^T*2kO!YQ?0}yJbOF2vcps1s zI0N_qK;wg#+{;G}9&+%GXJQ_2r2^3-wN`YF<)-LvJ-l zRUls*JPR-nc!H0?z$5rqWyoS`O0%k4d0KE>-NxsJc8VSe;I6x}_W;BLv zEQakX#cw%+kq3}(a5z-JY{wiSDv(ccgsOnpojHI%0r^k|bc=v|i6a)!75&4G9K8W? zC_jxfNd-jX%mG;waM+7uoeF#r(yc0xzYBq$5%9%GK_da_L`Z-NdHuG%4s0UiBH(M}k1!T0sX+5~s9pt{14EmsK=XF!9V*a#9@;_$))J{z z1-=YvYZVZmu+TsiXub`FUJy`x5enNQpgBKupb9kihE7m{Vw2DUfD?5#FxDP^kbvg4 z_V8Z>d<9(Qt12K4VloGS2Fzjn*G&qLJ@el>C_whD!Cm~jb{^~1Tm0kr7!yN4Yrf%Q zIaJd5s)=1~!ml=!JT0}on`pjoqLrJ}o7-r&{`-)wjrG-LZCd?y$9ru`ceP-@q6>Ul zsTo4AU>1gjcOUHK4aSmrEEdMI*N?(1mVwMo2y+fV{a*uV??Lsy!qnnHNU22_ z-5de44WV%)k3|679|3L#0@(=&TPGtpy^k;8i}`ZCk?%!FcmjdqY5oyE&oA=t`OjQP zlGH@H1B*Dj)L!Z!MM~YI{?Z^RQyMOfktRq*QkhgG&6FOJ7E8;e)zSuOoAiQoM0!(t zPdX!=l|GZck}gZXO4l?^u>5PKX{(9UbkoFXQZ!kbk(zOuNt(%;TFq?DBbp~Q%QPD` zJ2Wq9j%nV|e4sg}`9kxZ<_FCcjYm_j)o2Y`v$mzSwKhx}q3x#aqfO8b(T>!P(-vw= zwJz;+?Og4H+C|#uwCnLn%H7(Rw8yk>Y0qfSYU{K=YX7ahrqk(6x)!?Dx=>vwU8JtN zuCFdxH&{1RH&QoVSEwt~xpmWZb9E2vmgtu2*6FtC_Uc~Ny{>ytcUJeM?t9&@x_Z4< zZ`R+b57BqjN9lX$@752{XX;1l$Lovr75XXqnfeFxi}X+FSLiqBx9j)mU(&y-KczpT z|5X2l{yY88dZGWzpf#8bEex#<4nqe+q@kOkkD=Ny8y~BQj!x*UCSBDe7Vp^Nt=U|B z*QO93HgMzBJ-oF?1x55J9DE#s@@n1gRn=u>%BMN#CEt?VQhZCM5HGD4RO3x-yjYDl zxl1ccsBYKz-uOlneaJz1t9^>Eli1kk9;Fr2@bL$y(q(*7JYIFjXCrd+T=?`#ZbcDZ zo1a9tViJ?oBso4gHyU zi1*zI)l_A$67^SYFrcA})ayf+MCN1-RvDb4BuUX=Ds?c3E@Qj)EKt}osG;%1hU_4P z{S%enWTn|a!b%;lR4GnViYGydoaLo>@wp_wv=LdQ>fJ^qX+SMqX<4rPrZ>Ll?XiJd z=}P;OiRDTPb;?l5AKa)_DS9k#bX`$gU0#&ysxB+dt#(%^9Li9BE2>I!@yb5wRYpTL zODS+EzgdmCaW%?kDZ{&z-;BoHXDiLBl;7+IzEw43v-9!sC48JpWqwRmqh6Jw988{}X+lU7IYa6m7VE6bOl$W3p3emO7?+AQ!3Ljl4sjBs5 zhAE>?Ra%T{=wfO^_8z6>H0Af6>-vgs+(6f-HC&UDCiWht6oXEDOs)ImYPd48OnhCT zpt>FkqowDoK-4he5Ku)<*fRE0ocbxQDKBWl0GP1n7%%${B8S0(VLVRXP z%}{q#QdKfVO_lzrMCp$*YJZd?9Aaa-=ek@KwbhjhM!kC~SIRe0)Pi10K|w`rISo%V zspY+ua(eMwxlZop?WUkyz3#5k>Ki8}fs_i2QrVZ#UBUT!cL_a}y9vG2Bwk69yh(!6 zbsjzpq!!am5gU_C%tq3cXuaN15(zmrCMmf(CIz#Sa-mFtu$pe_m5M==xrs!rPs@S62qdTelNN>^y>qGV7`tJI^h$4pS^Yx|rN<zpZ||{oe4q;P->yWxqfC{_>an4gNv?(f-N)gZ#7o zNBEENFZZwVul1kp|A7Ca{!9Fy_uuZn-~VO*WBzaXf98M5|7ZVy8~u!T8Uu|Tja`i0 zjQx#i#!<#XW0}!yoMn92__T4Iaiej&aj)@+@s#mhQS+G?D&j?aoER$C$kn~&p>n(& ze_kFcs_nv{mD`LFt%Y8&L&7fFh&G4hR70 zVNDV3g3TEByk6WbYgfl~AK)q-8@wZ2w`u>OQO;vtMJo{ls?7`BhWLR zJ^It7lzkny+J`M4yL@xt`t{H5JG5y^)w4r}#C`=2IjUz>X@DtJ=VH4K3x0emyZWrt&-G^my zAIYtQ;&6Neu z+J$DP?#I%E{T+j3du*88NA7#Eqp;h}9+%L`{}wqSA8EemCoT$I{TRJ@>L2>27 z`q*F9Z+>{yQ|p3EYsz&?o_gl7=Ylq`oL1$UI<0idjK`mxV;^3i1AqPQH7cC$Xf#{T zZ94X;JzHP)Krru!-IELU<{0E=S(7ue za-TmkIk@d8UDWfYFO^y5zg-zeNNF3&k>bpFQ5t#gCtI19&5o$hB^HP~p%PPEmnvz6N{FPW^z-(C5} z3H$IpZYQA@umEMcvUnzp7pkBm(G0n{zro4H;?NcnKSp{1wpgt%$>d9k^3K+Wj`(- z)7|&TWA{H1^u%LNKDF3>LYQ@C-NHEw=gbeBw`l(3rgcl7-LP!+!uz%b|6o`)vE=c* zpp0~PCwrgx_8-rHrloxUjIqp$5}^X z`(=zwm=^qXwQk3fm8-S~ZGLV_b*1axQk%&-)@bfC^B2+NlFYNt@+o z5#%{*y~}3#F0=k@SEJr6*60>3dGxVGfsfB$G!KSy;RpGG-Xu0@D{GgpS+jD*`i;w` zxZTsHmfKC2X9|O7_C}*eg1VW6RsW@k(20BG2+!TH;FGZASfsJAtYy|}_A z{Kbm~Q&DBnv~fYEnsTFQn||N2n#tugQ_IRGFWdKo(R6V8wgdZ%x1*Ed3FEhwykIw3 z7aHvYZLvlZuQI~0#XI^0o9WRdk1kmhxOn~|lZ7!$6?ty6t$`^IwqTB?ovWXaJ5Ec=oGc7u!6L)_pKcSx~PrWcf zx8d34&#VvHvU*BUVR=<=lP2cp zZJD&+Zkl2fg~H$DnFyIo)SC_;81p{Z>NzhAT+9I-LiU`uRvJYUJ*0ofR?+m*Z$%KJ zS#Dk|n>vQ>ly$JtZ?t2lo5E(o>6{YUr)#qzCHQMX9p{G7p=e? z2^as3DKt7Qr&ssmqt35cyXeVhgKGwis?J#GcR}>97ELyZzG9>GyVs5!vYDE+k2M~U zTbitid8fYndGE0^FKw-?e%3BeG)$_QG;Ms4InlThcAoU~Tc<_8K-2y9s4CrEYmS+O zU2X}w_{SBvYob|8-XWh5JG{()O`Oo14eT&s8-ggve|ud3N+GrhcO zlkF`L4e$99sk3Y4)~QE=%+T)WKAtlHW0n^Ze1vzs<7U$JFd;JYIZ_3Sl#%z(lb)hu8c+By?SujT@QBfJ&@|3C&uE%pTw_`z@6!FKUoCd& zOb1=t^Or#|{`E^tKXnuulN>Id5aD8pPPXXfaCwQ&RHyBz|4CSN<~g4ZsS)EoHC;@) z_}$lu7vW)Bn3m2IexCa`LK!=c8=5ff-bWYT7mVg^o$1mGufM+il;7$G_pbE{SHBG-8yg z$Y{RCV`ecSag)#-F_PYbpwEB*oNxb5H2+2;vP?oZy;hXhwh&Vwd)=G*-JA3VG9GG(UF{k6svz!h(vH$)BPBb|leWG*s zT#o0W=<%m2Mn@vp1>ejV_V@2&c9`KK28yE=&(dNN}WIl_;g0$#OVabBUfw+r=y;o%7OHw43A6U=_@*@EMa&=1W$Qk zcN%9MbbRrZa%hv!ILMr&VUszl=6FzqcK7!v=l6Sc>_tw8Gp}$u8p7$u3@w|h#XdHF zhI4Qa`|Qs#zJ>8+8ortyXyI!ZUnlYHjBnt4GsA%f$N%-R`3Hl{xY44;2;A3HwpfVo_|6I8vK+7$94Q0IAc4kmSB zQVYG*3nzaXDUwNcofO8Tu1xB{q;5>=#BmBJMKGy1lcJdv#iSS}#W6fqBz0#}A9}7x zif2+H4pKEz7L)oiDVa%kF{vMu`ZN50Af&sQl)&&m29c7ORLZ0jCJkiL045D$QYw=M zGie-?(lq$LgWxeEDO)Rz;?e{r6*FlJlSVUXER!mkG@eP5nUu>U7nAa}QWcX*xa8*2 zBqo({sfI}v_$>XR*ZoUx!%BFg{-pjB?3iEF%Z5RQD#L4jv3^B=bC)mbn_vYW5nVW?*i*M#^Hm%u$W-FTg+Fai}y7^trM>nr(KBxJ-=Bt`- zZodBx(;fCZI^Qwrj+gHE@Qxo^m|C=Lk=`Tb^L(pTtx8*+YhBs;@z%!!`vlGlJRKAi)FG&M(Da}MK~J@5+2*b`g>4>d z^L3kVZG&yIY^!a*2lowL8GIu6Wbn^+hkc&?nEf;RpLlR?s$-kulMo)#E+h_*%gqeA z96BxZvCze#heJOI{Veo{woz^K+fHx0vhC`2QSIW}Wwl$_Zfm7**>bhyZwXh zSGPaV{^RyPw!a#t4+{(H8Wtax9#$My6E-L8@vvoKo5EfVJ0A8?*uTR5?9i%1`wqi9 zh2Xt=NIkxkd&QEk+ z+S${kX_t0g61z<3GOf!KUET^$2_G9iDg6HM)#0y%e;?r&5g9QwqB>%6#I}g~$ZnB2 zk?zO^kGo{(Ig{CKiR2~J5&S(Wm7O8o%)0QZ1523#CiFz~T~ zFQwj@T9djw_3hL@2lXBF8z4`nv1Z*A^v8-&G_cmNB`$SV)kZZ}#!6FX;GMfVTI z9U@wUO%SajKD8fwG41uN%+afdKArMNYs;nfhV2h-nYZcwabsG&nfdw~yC-fQ@zl`P zo8049-V-ESI=7cw+by5TfrvkXf`wK)XvC4zA02+_?bC-x#t#@dVxZl;+Bn{(sSEH- z5C-`>F-9+ff7OXQ4RUa(PArj|$UhnejL^w<8s0skGs{<3)$nr_wsQdp&fnG_Kd2Kr z!_aX$@sbj=%NGno$LnOB;rIcaxzH%&tBXTzZ~eKvozXnWC|>Y<5NbPFU)RBAKA3D1 zTM^ERsaF?=*`oi7u*P8jN_6mi5N4CR{1qE+d}>tqWn}h5zM0GO)x>w9EZPi>Hm^aDDcEvC}BG z%qglVbJ@jQb%}8aE7MnWBHd87c8B}bps7M@9W(KO?O@QEJ%b}V>{Qn{DDOQ6opye_$P86Pky*Lvg+Bb zE_y6m5|0|hclB4Sna0z!zUW%>eVr#24gJ1B!vT#OKBP2U;%)d48hVP+@Eg6Q%Y|bG z%R_ZJVo9vQ(&c%h<)PKK`nao)pW&x|(46vQT7U4w_190GHRb*ZL1<3^i~6?;{wUu`maQn9=^`pI&vcsDLvy=`aUTccj>HDH7@y(;*NQr+`U zJp0^+p!LsAb=S<8GSNP|ABYy zJt9$Ad+%Jba;3WVu5jJ=xKX|=SO0rEudA@td8D;Q&v@)3{k2^y{FR(}0j-Xeu=AYQ zV|Cfg3;ytw@lQQv8gW`YV-*o{#QF1b1j6e`5z(Vgj*ug96%p54gd-mzhkxEfXNHZ+ zKg|?fJ#W;uI3;?@A&8VuLqUgGU)OICFY1I__LtoTOWle3h1P>RckDkW{u3{HIC@yIZUd^;FvmFmuW;4GEO&|P|i11EYyHe( z;$oxaNPnB<^SW{0KV}TJ9O-eOi)a@7FYTD>9WUE0pC4Ma`^6X56pg~2G1d8Fg3TYp z$otlK>VIf4*O(7mZ!R>mg~75{tet7Cdw27ZBX*1Hc#=*;=w-X;v+3}%cOE|3dZKai z{PNk8gCm7jXW4pc&(Xtmfj=a?)v426L)&Gq%zr5}*s{0JgoL4vK)GpMU(q7ivi0Cq zKkK%Q?s2&l<#|>1vK_81+XHv5TeBm$wEk(UWpA2u=do9I?s#>ZUEC>mN2etvc{QVh z%=PU_+7H#XI4Ig$CXm1_s~~Q9!(!We!l)5BasX{u7roR|bP*E+#l(xE*S^ESvY&on zpH#VvJStGW=cL@`WS?NAjp&a?FRN`%o;!(^(mjDtGp%DmdW*%jdp%ET?j%`0bOc|BL?;i=7HxoD~p=P>Dwc}0vAaUvm0WXhxD(K+%6Y;fHDnw%v@VP4R- zE61GJOf*?9TK@LyM!7luOck;<6joM?wfTl`qeQWAmcHkeeU&vNj>X+3W9ZR{o-K(~3IUe-pwxVGpoW(=! z=`td3%XeRFACo;`c*%gA5$oQaWS6D!x{iD51`BhL`C0gl&O-8})p8GxJ2W0^fG~>A zUkRzJCrxgpm;YT~uIumdGYCm5PtuD?Vz16zMkr!C1DrNsWi%4Ye!pw%6C_~!dLSAl zbU#2Jo5Twycey8j#K7){$kL32lC?kWRB>Xkh^yE zMEigUUFpu##X<@)SI{6}tXNaaPr)o7rOw|%=V6z>6@j8nmL-sey9D1?;`Y1w+h_=IFjNXO8A3CJoQSgxm$v{Y?0AkwCpB z1c;{kheh}i0W3v=pYW@nEc=P?4RQ-PIZf{WfIQ33JYy!jLk%K=-a>-kHb)|g7$urS ziKdoc#3|s_<H9ONTe?I&?blj~<`MfpTEayBx{8#vHB)w)~Pjam>)3 zfwJ{dwCEgcx#St9%`Dh?=*8VzPn_5@arBt{!c4p67x^1){KyyHe)HwSAAa!4sKKej z#wOT_AO2vhzo-D-FG6b{6=scy!@x_Q#CBD(SP>|q?uPQ+Er+#_mD|XUOWj1^$%Cuc ztO+iWBirV+o$n{CVx6`B=soYheR$tTAHJNMntV?l0v#9^BEumIjN&{jO#YV^W>z1z zv_^cJW84KR#GvP`2X|oOwrKmfaq7nHL3^M2R4Yy;PVRc;%x8gbIJb6Gq{DSQl*r-8123`Sl$k$Jlvvr*fZ~=pb?t9;C>IuSZDu1ZOl=^}Vhas0x zPvFd?i9sBLJdepHo!r!5mhS|jp0PsHVx{nZUUY*?_IDdCmqeP#T5DXdhd=8xPxKBH zI_%jxWLuYRa+hE@lymzIeRyiSb0p6FP9MceJ`F6(AZm@sdAkld@?cW@{@v72fZy+qdw z5wfwHmsa^%4vM?# zTZ+3pEuLKW^tLC~w|-#C1Np8%%anRQgZbQS<6}0>RsVp_HuL47gtv08Lg!Ep+asWM zIs6tD9gSBU%W1{Y_Z?xp{71Tw*RPK`t^4TAW}*2#@W%7_V9P=8k$mv&j^s1$O>mC3kNhMm<48Z< z!kIH3xG%^|+vwgs^tyluqqzz$SD8a01Z=*;y}U6KtFEF|Zku_8jh}-waOME#4&5{f!50mn&?SDH@oEm0WY|4J&%81k7J2PZLf+$8ZpE3L6ps$U_`j4C;*mX_j;s&b~ux5udK^ETo!Nb zw29+z+pW%jkLN1-biFJ$A6{5fjs@i-SWphvS*H9MgCj)C!QF<^b=zuR3Azs}%5f8y zZK<(~62qEjx37OG=>0u8VO^XVm==5oJNz)&!{(XRF4xBqn#ne(@v}3nuk2jDc`bD4 zJ{&U0cU|Zttij8Lc7`p(#@)shFzMY;T%)`jvtq=RAAjM3gFnbyh4zZ9J+2>YGtaas zoh_EfSZCQRpLixvcz&>xF&k~7u_OOco>B8rK)x~4R(}1!vd(*8DTn^K!)iI*!`S~G zBmbzvmX9dTw+B!LA3UYlh7*Iqm}UT$m#+4tje$?~qFvn4kknz-qe_BbsvNr}J!trZ z+JbUyL>y8M8V?vOFP-1D`}phY3;G1hFQCZ*!}*=NPbk;s>|)z2Q0oZ_m;iJ~ff3Id z>FBw{hTV`*qq0Zx)=wQFi<4N=TXG6%NpJaNH;$Ues0;c`&{wv0r~6pYG+NS^9I(9* zbY{1*q))Q@_(9Cwv3m15yF3rAj_NF*Tn$q=Q()NaDp@%^NVazGEcaKQn`mZVhK>^R zk6r$5&zolsY@Ir3m0d12xTjC7yeG)qa2kZ8pq(ED^fp>fA4OMYxzo%m;`1x~6?jkt zRvIy9CN@9hhiCpKPG8}_LsHcMaLkd)nL?t>-;G>$zFWQhsfPLeWcpKxgh#P8dC`5yA5CaHD$c#OcuK zSik_A{EV3Mn@3yAg${&%0h9gBkn(8Bo_7OJ8|un-jd(iv<)=4q{|Z;{ZrgqOvEbhf za_a@%`pc1l>4pi@$|eT8L)YlHE-N2zA7YRrzr0JdUWk>@Wjvd&Tcs@X>&4V{jMk5S^@)fKe8X^H`Nl25tADH3Pnx=Ezx|{^M0WjHZv9wrsNwX2?F9n@ zQw&`<6(5-qJYq(fvj?sQ6z8X4patS7(T{(6Q5?Fc@x+Lyte1D4t1vsdY)B9OSpQbv<7XVV0^#(Ux_TPUFJqWP=iIVU>779>veIDJ7pm zE4>~iC_6pL5@i@)Sid^w@VxLNXG$ZFQ_sMc=k~l&!7u7t$_qO2 zJXt_qcA9Hl@Tj`(5INltrIQ!44tS-txP-Uv z>m=i*t(L6?)3qmbTjc4GI|Ai_FIdf&;yUJpj*b&5lswS%>$Pi7er@x8ox1OTP^a$o zHcxCXoc*S5-Me?w=H0tDO&L9U>SWkCKuGX|^~Y!;sC~>?!^T7YaDJk@vE;MkYwv=d zDwi1lJ>K_uiSgfzTfPU{F0PWNIM>wInckI1 zagLQ^?MOIXsklLkx^@Bf20?qqZnNdCTe0J)`9`-%qOOr28w%(ZV)vOWb5q|TA^ct~k%}i_a z4%!b7ULE&~*IC9)?``d~VwZXK^5vUStzXSLGkdgo?t*#2QD{h}v#~5!{G3F;(QK^g z*2VMJu66&SWs6=t+O#>}>$c53MZSw7vsmVe0S^|d3|lLGs?DEuqp%+r7xI&oGkT?6 zUqz^1|AOMon#Izv!^(gcEc^xQ^upr{NHxC9wH3so;4dih32nZh&)b`O)@lqnwQc<1 z{(ch&*{0OktTP5b$o1*l_MOj7EjcYAK-`cICSznFZ%+p4tJ{it*@J-Vgen>AzZtkBu8a-)>KxXV`D{en_@ z_7i*4PD=U0^xcu&=Qr9~Z`971Hz#niSD)$Mo;$PpyNla%LZ;=|uIFlx&Ka_=jh9k+ znBrEi`T@uvupee0<_kAOX8M8IeqaGVXrRB?f`?z2a6|d5H4}CD&dM()xm63jw=yGQ z_JTFuY=*W)L8~9wd|lS;7s})pY;xvmtrDV#fR0vJbDwIsJFI+eqs2W<4Xy{(PBhd# znC=m@c;CtX8ulscVS*W`P8q1%_ehK0hpx76_dTuRq4R5|RpJyK8>kxvrFa7c^S{Qo z*0PE^_YIOL+t57<^c-OM1zp0^tb#0JwCVG(cP%nBQ&1emfD(4V^s3)9OFj&NOswkb zyRdbx=Y3bPR>P>@aNBo7yPi@+FU3m{nk)5`x=d)!yqNgasqc>1Iv%?0^UABBA4JFw z{SI8ccIv?8D<}JR-)-yR=i9%Xm)ys*-GI-&@Uvaqb@H<-Uf+E-qD|ZWBih^CW60bz z1nO4wXjFA;eMp1#?dsP0=)Nh3l|g(k10gZEF&UZ#)&g2(y>j+BJBx8Vy}n?w@`1L2 zUb#;i8cLCeyMbWxWY$jm3j(kYw2EHO&el-Q*3>H7DB#Eh*16%Mi;q|lRL2X*AP6XV zU}EE0kyfdyQ)(&8l-g{WRx#_?I0b&DhOAn5rJBwdh#QFCEvO$9c$?X9|46Z2WVT0o z_fD1(WXy(fHc}04hH5E+Sv4#TEN#?P)|z!;bDJNaxs#cxl1di~q|lLO~U-e6MwX$ZPupRN9NvEONHuy;jP< zS#Y56CjPoVhC1Chg}q?MSviq4MCmIbOeRG49VEIhd!Y@PIuoYDlf%h$IEm?5xq>rF zxd+|!&_NFB;b(o)M$5{7mBXsBPUelQlCoCcYWv{3U_xUR?`Qc{pNXsySWJDC^z7$r z{%Mnc(63vu+>yr`Kh{87yVLZTt$|g3lbnv-d;?~Tvu%aZQ&|61ySFT)XYj)T)V&*)jC}HWP;V*xZ{*`_vBfV5VCk8E>=MVQnD2ZN=>r z$#{G>uG43Yn=_2e3z??XO*H3M<>m6q5$Nw7!2L#a_99outlwm2VV=gT8}OJhCuPPI zGxUebFs6}*!4Q+VZc_D!htWvCWJ_fY>|1xjzEw3%9kqS@A*gW|6kI?xeSD8Ku%U<0 za`f=_Jtyq?#0v6j9mRai8x_~-dT1?LrztJWithVn%p3pXi7c>p_|Tp=(*Bgyk_Bi_ zcS3s#+u8BsM~>J@X|Fn6aMr|T>!)GJudi;Zazu+kKld2K)rxXwkVa?La;?O^fWlPE zUg_Msk=7(!BX5VMZHc5bD%kWk>qb0@^-`W{e?j+U5sV3`^X@UtvR{ccG4tk&U$H7? zxh2y+SG1?~Fk0S}y(%_zhxL~|QtJ*iFBkOCcN^cWKl{Gy*fR$JBE4v?*Hp|iIQud&pjWKr>*rbwaqJB-Wfg|0+z!5>0QP5@fkkVIb zKycZiVwHTv>^{6w`?5Q^UTJN0|0( z-Lh-<BACvAefsHe<3d%SLO5>FBY#i5CK)@H73keUsNO(}@6|QO^9c;}7f7X>% zoxlte)UFOo;2qM3N(1!hn@Dq{L~6P855IZ{RU*VfH;A!v#V}LerDInP+TJ>&9WliZ zx}a`j4t*VLW3_aaJ_!xADAA`=!Qgv@uVHCi|3ZS6z6UiVFH)(HIg zJhV8Q*;b8O2UkHdBA;dO;Z<#wpOsaMoTT&B<%v102mgtcy<<@dwK z%KPeYGAAuQqD-V^ahG4DNoW4atpB9${U-v<20983y8%Hp958(e{kk}^*#P>h!ko0p3_9KWu;tQ!_HEtnI!OAq&C?syBk-r zhnLxHH>}=L*b^4B~SI z4s1L5Q?9LruKBb#iFdtJL~SC1dDXsFlV5n*%2+q!(+{JrnmYlFszj~;3s zmN_bCg0*AEAK&@vYwg^f`@@fVF|Bi_p{K51J96sV%ZK~5X*;YRwEPP}IZq$+VL#@Z zzq+4=DQ`rOSqJIs$Hls*<7k8L_aog_YGEh49;=&l8wT)g2$}i$DYc0_Q+T}N_bFc2 zN0^1C^L|7X;4mqpfN$e`;awchl{$Mm`xQo%`~_HJh@8ns?}p zmlpbH%PJ<@PaQqf$K2!S=*w2+gq*;Yjw`b^rmd-xIy-AxMgUhjHl$ID44X1pVpi?`T}$4;C&aXH7zZt4H-^iJcgQu8~<=#6)<#>B9`*%JIKvLF6x zwr6pLl$(-e9x#^%^gvCBo?>-EWi8m|sk*}r5{&qGA5X48#9y!r)o_4ipY-WE3#tE9 zY4r}fN_|Wvx-bMn>n9Le??7n%1VZZ_yU@Dc!lEg@KPpH)%UlbqOA$yd_m*Y7rMN25 zD_KLe1xmTMERGRaXtyxj_>`)`tNi7Sq{5BP^(>A-AbJTE&t7`Fg(^zHFNlgn8_~y| zF3eFg{E@!xbirL@=orRTXVcJJL>XccY!ch`!1!_L@!S`Dik{sba)yOr8iw(BsllaC z3@#nF4=%}r@+Sn?)J{;!HN>E` ze&eihD+hQf<(t-n%-8sKedZXo3c*wo4D~3Jex+$f*Y4~)`R&o|GiEQfDLow1jEI5W ze2lSW)`TiYN7Ri57~J~$v3+=}9Mucfvd{3VEJq2$R|x-zMl71^Op)7hR&_UX!GM|_`-nrN-hsx# ze?kR%FWz$emUmLVg4+}p}*60oi=KS54cWiwTiTy%VyC$z(7mJV~om@KK2ef zrbPFX&V91^)2+7cE4Qy&yQ%&6m4{f2w<1Z%`&pN~CUK)HMUtbO>376K^-sy*U7+O* ztGWz5u;WMrbzwAQ^s;G0OB?+qlGL@V+69y*w2Q@82{Y}Pp*6m#52bt?i4yV(#Mo}N zB|M=c)1*9(MH|%LmN+@*gLtcRauYc+yv=0vpiBPKVqPHfOg`C4NpTcruKYb zTmdVyAl~!2injRSEQ?|*T-L`jM17B$S$IDQEw$sVwcr-%?~|!vBGZfzs(LTqh!o}N z<4DUCs&uakJE?)t42^xXow;pC`&^&?c;CVl3JL##kI)<634bs8)jkE^QViuDZ+KwE zF(+>sAKsCl64gUFeDdhAA68jm(SfO&dZXNB>d2u~VG5jijG>s}Y4aGDmjXHUC948C zb@vv`W%l3VH&&g?yvt_%ZCK$2O6vK+9VheFTjh)u7QOMePSkQyd(Y*kTdXQ3Dbl#o zQxq7a1+8@9@;(+H61K)ry@)GJ>tn(AhcDHN_=3w+Y_Xcr#+7t77e^GAoiM^~(;Y3q&X)0u=C}k4vx*WA|dlz{z zr=QM+KR37RvoJo;g2DBdrGl`d)V3%ezG+E8_(+Y?;Y}BWIGZZv`@jhPGOIS$;)kIe z(0P5Sjr2jPBxeMCB4x8`#;0Q}7_3e(8D;*`__U4G3_Svj*~>;x%oPhGmwg z4gn`>*+f1TUqk=(9W4xSPz}I^bEyao-!$B2p<({~SYHXs@67zz+LlglYMKHp?p>m# zJ(#U|3#Hk^s=*>?yu>=b>FOwvlAkK^2?A3rDQ{{!d>yH?kL}1u^21lnO|#s96+hEx zZcMSTn+FHNJSYLmvnH@;TSq4UbyzbsgI^2U4YVksu+E7@ftc%Qyr4K4Zg7N(m@ImmRl5cA3vLjk zOa=bzsO_(GWL{@yU?q)>tlDPOpzEqV!Y@eR`b0@-T##!r-d0h4y^VCEvjs(v->2_m zm%(()7U31q8EXiEq@)bYHo=1V2_EPfW8(jDwc{)wEEomV(U&@!VPB7C*iW_^ZzIp+ zclK^OcP4kjdse#%liV7LqN7=7RvbR+viCsNnX~5ne(DkuNplkC{pk`C%i`C>EwyF@ zFAB^IVOt7XSN7F+pEy+!p+&OWT(Gl9^l;XxoWsXl_U_L(^SPOQn*hFn0vyCg-_iG& zFs&Mbqkn-G+R?xGn2WV7-;_iDg7kV{KZdD>8*jK<6#7&r1&pKRi00$LdG?m$Ia&@i z3bh@bbEHmS)p=|eZ?~Vv7u>Ecp_6kyKkXgMC`drw7K|STP)}e~!CiW#;+upc{^}RP z@+o=+HU22cp~q*Tyk33%rscc5c&%=NGN5_9Df{M6Hz~9}1VnnBRc`fhoRbdOXMM%0-Q&|%8cK>- zSl&TfSd3*5^SWuDK@4?cHN^x9yUZ;|?o%4cg)2v^Oo)2{#z!tZfM>41vwbIEhlICZ!kttiHqam1P#ZIAnMLnn3Y*#E$VsbuxP zz1F?1OuL}UfbLr3?M9G&Vl7HNZpzT{nFmZ|9zTMCq475c@ylc^z~DI^o@QP={*(D> zyWG~BtUjv-yCc zgWY(ExjqHwmb>QP94IN{3h(~Wj%hUb^>S#6#?hJw3&3RMV_5S5cH~)#o(+ap4y%ta zNm&j{iRBP+oE6N|g3VL}GH`zO41*#X42lGoGLQ@A2q( z4|{{gInujeeEV50XM91=NRD#Y8w|4SBI^?*vmP3g4LqG9q%#_}C)Wx;Rny@?kkS+c znFUs&+PvhFa>eK${;Yth>1_+g*FXcbnmB3**k%n2j3kB;M>U4rBQeNP^h>-869>yt z=62#S8e}((>=q{-*#7B_t+q!yzxtLnG0T6s$kR}wx2g-R={jF5A~;A@DY*CNX=2XK zP}sLI*9VVDFuyI=P-Vlz2X>x(w87d7MbI0s*O7+kjkmi@88ZwD3F_~l*d<+IUhGH2 z0fF*nrOVBxcD9hUs$JX)hqzu#nrx9r5W7)PzsXj3w*hQw?XwiwRNg+F zMjfZpw9d7rLY0GhgvyULFd# zt#OsILFH`5kzli{+DL`&umr%%19&MIKUJnpLt5|2MYmf#^!WT&*5nD;-8UEpeZsPI ztWwtl9}FHFIC+-Un7g-5!F#{z@itL^amVVz`?k&KWp$r~QLrCryt@W$Vy-|9*$qZ9 zFK>IwA+RNQq1(JZdsF5%7uNKV4(f(_y7+Z5tD;uAuy^tNQW>m^%8tp-A={Wc4~~qU zx%>Cu;LV_LMYU2k?$AlY@u;~RdX%M3`LlQhfaorX7b5g$*TFfrK0U2YZji1m9k z`62Ut=yB|c?Eg>Z^8_Dt8!UL8>Hf)mch}k)ZPNOM&6+*hYrw>#SFdhAb~<+3tzv0S{O;arUCGzfbsul-qMm6_|eV8$4zKYe2T-W|4y zH?>n|O`Sj2Yx=ybLpEmAUpv8^?y%bCU%P+OtdY-P&&k`13 zfYM!Q>xDTV+N9p|#X zcW?g4=K*)lYneCNV%*n`rtO9nxXvtU5h-(ODEI$YM;+?T@mY4MfwK+uvf`aJCn$&ymc%@TO@mo;7cL0485i9jXTkfq8xPL< z+6zx|I>@+G@sqEj_z1*{ua1uhLkB8yk72wM~sJU<+P zfA9=k0>35j3x!`O{EW`t;m6yW<}I0@y<+jw<=J7&0)s zlz2XsIA=vDUW8KME{Ucfe8!5!OLDT2a`61nV5`x)qEKLLOG#6ab5?{cMv)O3MGjJn zOevtqlyo~uP_hOimH8`{EnAwC4P*p{A{Ev>o|49gAiuE1_z(&m?kqG3;{L#>nlkyL zX}}tWsiLw3@~2WSe=76_G%*fot-w~UsMF#- z`K0*3u;7Rhd{Vr!CgHfn(+3S<$k6ZY(hnPK&q4EfAo=ILEXw+* z?NZb+>Cs1*=2^0LY~QeQ=g#$WCr_9WG!Bz#7qU&;Eo{>q%Z2mjmtWv`?Gw_S<5hlk zspGF6=N}tKo+oo7T5rI(N=2@5B&|81tYJHgmvQQi;k%t|(~pn99zEEYycT)Jhu|+y z9qi@dFa$`Fo$j&>Od0UUvQz#@^{3k>IbL<^CBiA&R2r#R%&aU68D}ZR7~8Z9#pXEs z;lpDYQVqpMIFpMAW2+t@Y2fTraD-JHO>86K$uEFaS5b9{^^u+$E06A`gWcr2de}UwgM*EvDFC6W3b+2;M>)cx$DB@-puszFsYNoOb4~@v(LzT z#5M9B4HM3opaZ^qMse4Mr6psr!mQ-XWy!Wv?4&knQBqclIWsCfA|^6E4$F>S_)r@W z7aAXKj#wO>6>VkZeUwYeXIghwbtgn!AC25+sB{pE{`Fo&6D{T5i#`sO+-J*60(e&P z;WMVp^z_WsxXidkwtnn0?b6uT%mrQ%u@PYlZ9YnQ1?6b|E<=(^`M%l((P1$W=I|v5 zZDq(gJ|iP81w`+S8C<^fT?w9PX;|OShLvSEm0H4Zv1C=M3|}n6tjS%sxS*R-<&ZWx zGBP>ZYhiSBR9tdYY9yj4o3xRsX|ZWuYWWUg8rZorrj+!g#0(q5Vvbo!i<1_aGs99A zq*|5opF?5!*}FfWV3&PZdF|qbF_{rw5it?-<7^)S0de7R5z*#|jHpbQzycSWfeUt% zy=4lMM!>MWS2*T<=?i*=A7GW<20{q;l%bq(rn`l`VCSBTn}2Jf$*(mO>)?543+n3j zW6jd07P+o&gyN9|V)V|B0VNK?f(-FWTa*2>`+R7jZ#9n8%I{#I!4bnGr4JT!jLyK4 zunQN)M!VHidMS90jE#vlN2NxmVVTF|3@h_Epe=X@vy%6>m0zVb>VUxAfeK^J9* z-u^!-%iEECZ}dZ6LnqK5qnAIt*2rV?hhYk=QlXa8+cu?CvT2d2YO?f~%8$}+)-%Ib z7yp^}O?Sm$Eok#vZleeO-JdHBkgq+_8)};QOXa?f5+hn~rNT4h&_Hp=FGW-)P+Y^; z7xSKcMTt3brN60uOmF&_*;6GZJmsWzP=0KZ_dYGytCK%2oDQm+u;H2b>od8}Gfn>b z{Msg3zcev2DoI_xG&(7QuV4BZtzQ~J>z8I?{nAsId%ewX<=_EWkD^W;r5xa|tla18 zKHIa$+VPUMug`>*&CHmtRZFP_^I2Tsy4>>re$Z(vbLY#YrqFV!SR2*qevH?V{HbzV z)5(Hn`jw~Nmcpcf(^|RN$%3xBuw1R&|73x$Zpkh!f)Z=VpCXsTk6zhNThPo`?y6fl zR$DN@SN7F~j?)%&^_83H0zRalUX`7FB~ty%uP-+>1)bU@`6=b*UeMM@ovNT6Wmy;< z6SokoY$>gvyf8MVWCdmNQCCn-OOjYc?U%Y0{r13?%xz^a?LT2UsU}@q7PR@jwP}$t zNzqb}(R=FQS@XqnG-Qnu zo?nG|W?ztJANf5K_<6>4R~b_GhOp4_%R*5tEs^IXZpu z=9Kj1$0M?`_oQF^B*VCEphqqXi8igv-f_&!*iNV*tjtNuS-yOkTXo|qtcJKYa>6mM z>_v$g8MZC!a~7}2%E_#fleuQ`a`WnuabbI{aT)QM@tH2sQ3(-IAAOcK*Bs&>wIIei zJ!1O2IYBOwk>Lx&yygaFuduC7%~`oFDrcp6Nosc1;*?1XS6E}y(&AISRxew*B-6HP zX>xX!IW->68ow%fWz;H+==Tu4=kE#LF>RB}*u8-#KQ%Ac?+d(B{o^6idyGpQoIKVV zn;08wj*N|15NHjZ7aBM}C?+~4IyP!S$il$rpalWZ0igjd(F@|jBg`R5F-g{>#I!|T z#_)PrMDl1`zje070T}_o=9#l2=SD3|Oj>9iklk(Zyi}Lyq`2f%v(dW(mYH0%XlZuX z(q(w^#tM=tsTmNQ;lDz+V)@eSl=zhRG+R)3SWt{LA|A$su`UbZqZWpTXNCotjp2w9 z6c!O;4o_XUDAtO=acTInRk5oUx^T2dZaWl|?5b>O~;tibH(lq%6F3)2YMS+R=}7AK@8WhcAUiqRV@IJXnxqv97X zG)E*xrbJj%qLZUiqFv&W5)+cVl9Lis5^WjDX({ITG^A?Yx^&C(jn?G!a z4D+HT8`76r5h67$DLyI5oS2l9m}p%!RU4I(7QNUj3ldJcZE4ohtmWx0=_x6RY39WE z_@p>5;x)1HE};PdVROBVu0lIueq=^wlr2-2k{p-pwQN~x+EUw+v}LJFQ(cmik`q(S z$?=JC*7*3uc(1sqkf=#E%(su3?-iwsicUz0vBjiBCoWj(g1?%KLL??8C0Y|xl2THV z7iFX*Wh`<@O-@KoHZO`<9*&Nm5H5tphDX?p&bW(Ao}Xz=h*=nmj$1?pVL{Bgv}~-< zygJ!`esp3&sx3ojbOLFor6U~Z;Nv7jElfzUrKBV+F)xW+6h@((+s%s(4i8+Eo*7|VvT#kpJabG;Xk4^)p*}Kc zLE1v=^4VFlQfIiVpSEbg$L5Hn(99)^(v~D!6Vnni(#(729-g(uY8;8RQ+Eb0?>f~S z78?>9VNG9{6_*;}k{lYH7UnfCC?X`z78f5MH#2rdkTouS$~<#WOiYxoH7Yg<(p*Yn zsx56<($b~o^tkl6xG4JS>7gUTrw)r<9_bYu9UEthUmh~gY;*=;Ma4pF;>8x8%BxJN z@o7;hRv|7#C-b!*7fS>hK5OiZR6|BqpcEr^MP)@CztzI{{5*G-0}( z5F4MM2K5%w15L@Gt^^QRmH4ndqG@MIRrNkQ8T2j7f@3jK@k; zCoF>1^LwlQ3;-n~&F| zdDEwb*%r(isW^r7cd0kAKf2&CH_O$! z>b)X2*912MbC$3yFLO>xa&u#@scz-i>Pq?Urf-buHX4nA6o0G>`w~0qju7WzPufCk zAJ*1sA~pxx?z9Wrf<4vfG?HevW|?N6=7{E|MsYSfTb=7UH*xOhJluJc^8sw#bTl_P&=ACa?9l*HraUTlJ9D8wYb)Dt?$~%^#j-Lu7h1CVv~)zt_xi=U01kn zbIo-<IYk3rEkMhjAW4Su*N4-d`z0d ztcgE2&m7AHlQLXK)4*3|ZRXR!v!-NV*)$Ww(Chb@YNn3M+Wv=eSu7j3E3Y#%c^TSa zMMJqu`i7JhNjX)Lf>HuAreWSg=gRPZi>yb>=~@&tj`EKUjGI>_Zh7pAh^^JJ8cQu* z&4R{}lVeohm=z1RwvZcFR?6#8NYj~X4{Qx}qbHB;-OGR1UTZ^L)6?%WPphH%=*hkN zj^A;IZxx_i)GLke4#+!oaOK{uRs*V>^JCV$BR+!+UMQ+W-qQ0YEJx;VGx+P*&KkP{YdKVGMz(Zaerm$p z4((a8ZL@8vzRRe|O3ek<2W+&d!{~F5un79)gWG1!$f1=TCeNJ|G|J2U^x=)i&X|w- zZyY_=f9j~Qn`i8>8oDVvqvyuVi4Cq2n;pF-dS!dIv$D6Y9ee|#XLH|})zPcE!*>$4 z#-O!F*5nV+D(JSkDPJxOjtS)}HN-5z8a4*@Wo5izz6A;B&%3b=thNpd3T?m)N*x%- z9_^FO2Or$Pe9!*Rl@3+~#`A8N4S_Yjef76i4;uE-jG=98h8~jNRP5BUX$p3F(AKpW zp6jl#O{pt0wk2m*Nea%Klp1hF*;M(3j(KCjh)Gzl-oUWjQkvYBPvq-_?sX?<1u&_P zr53csT;(;8l2apN&~+~nu??nXSngd9>l`eYrpEwDhLVD{TBfjc#mFr>uF5SuvCcbo ze9^&<;ry|Ov~*hiwy*%6rcD0;3tQD!3`ZJ$-^*&ek8Z1;WjsN+=0A=49wr6P_PxfO z3e$e?+UT%-(7Z8r?fClCXJ3EQ?_`(G{d_xjIo1Cg+b!o=K{;3!Va3|jD+6cF3<#QI zGnBDYk%O?z`f`VTN(c;ew1&T0eR57{&?H)Y5{v1x-MYNv>kjVT5Ein^n*Cb4dWQd! zv0fidoINT488|lXILkNg@E_{)fCk`>-GflThF23rq#!TK78|jQwEpBW#|U0FF{{RYt)zfx{I~@V8xe z#!fLVu*`TD&T(~B+~NB!W`yF34La7aUM0O7L(?#aiMByqFvXzsF4j|E6C3C$NZ9|q zp2A>iXE9tlYEehKv9Lb+P2DVp8>;KHU%=wg>jmJRw^;{wXC5< zX$;u z|9gY@qWl}NC_fA~u_nBZRrw6N4`Az-k1#8=p3U8aWiOkA)ejnH&7G#bcwyI-mu3Uz zRiR~^pl4ZkSU=W`b$FX~QsQg|tk2Oiz_4m4sQRssEe36DM#f%CdTMM+Gaz4%wcUP%l5ls`el-jD^$XnC{MjEuWvxo!G*v9KrLK2@+e(Z8@RM&Yu8EqQ%-Ud|EQq zDr48KgW1b4)vEWHfgRshr&<{t3q6gJ94kE;)RlYXTPU)9(bXZJz1IzkuFm9(u4eH? zSCSasYlU@q8r>Dq@+t(Z}L z#dIzGC?=GhI5P1AOephJrkQ-EYyf&-fM}3!n{u~q+P7=U`U$qI%`4Zg%o(%3@`uBw z4fZh)*)nY}{@75MeJn%0A6jq=yI?e?ttG0$5*yn!xEYQCL&|P-LYLwu-_WX6dOEyQvbo9z3Wxi&rqy5HjEFPiV-Xf0sUmfwg(NFU|{RlO5bCUlUYBwg&N`7 zjs`<5S7-uN`8Elni8mWAK%B z!ZZJ2Oelh5}s;eefACO%lp8vppzFfIX6SSL$7Bxks{htt#m#2GtRym2IoRBA=Nj!(vGQkD@uB7?gU2Ar(5Inajd;cC zVgO&QaE~Of4_f3Iv^{lDNkKz|8^h6qD^Kpg)?w?c-Ld;?_QZ+lW4!wI#`J2#4g3T) zi#G6i(&FjQ&kZK5hckwC*4OevMi`yX(zJQX_xTHZ<)acu$c%NPgetaa)RK7^EmdBa1t!oH60ro zV4rh0!1n|nz(Lr_SQJKKiwW%A04EB8*z;b*juM%GYiWZEVK1C0d?K6x`~o{yh{84O z?=E8RckG9N9nlK`i$tU>8pH~KM$rmbO{@)APka~fJ+U)jH?c3^hvHDck45Awjux@$ zgg8N*0XSP+2$+ODD>ULt?8mGTDx=IU=&jQB0-`wFejSFZ6E+&S1n7kD*z$shr*EZG z5}s-hvs0H|zJj~|sM%8mZ^Xw@RK%|aY^+>OXeGF|AJW-d=+?2lueUI;V?RK@p6!Qt z3p0E7?d2_m_vzKiTS)HLx3{;D?Mq>{V24(3+J~B_BLav25USgsoP=^HZ4LXAMsOFZ z2sQ0b&e+P?EYz|;Y4JT?*w$H1MJH4gstR@NPkO-v|ERA0$pyo`RslL1o}Vjr$+ijg z?N5?m!dJZ|G#E2|)^t(gumXpk99HG9I)`;RY{X$R4qI{9j>9gK$IhH8_Ttc&!(kly zap=$CYz{*>jN&kn!%Pmdr;M68SzO2A77lYc+|S`r4o`A;mcuVOyv*Ts4)0ExJY}-@ z6Nh;mKIc&8@C`vHXAUI}D{$z^VO0+CANarj-ym&d;e?d_udgECH~fEtM8Q-K{yV4z zwN?T(H3i+P^#uEe@Gos4Vv7*eGQAk=tVvNL*j^ z8;6D92b+ot#Vts+x))ze%Hx@B*6F8zsA&~BuMfXseFN=N_ zciNw^j|@F?->c$Y_-gQcRoq?l8=jC3o<2e7$Jm&LI4<6CctUWpd_kD1R=Zj=gwmky z?gP$os8>MIa-8GRfZAMJXn_CIf@Ae#Y~C}8^W6}>20f&cbi(d#0mXhYFfT%Q%)Df$}kHx%XK{wnu5h3Bh9`w*j$hg49C z|KdPS0`e(DuJ?<6#@{S;z+c9f-~eWXqDPK9+&=*h><8k#M(o!`c@*mJ9TXm^@DtyG zE1n9~xO7Fn_NPBf&mR5>l>;Z0Ef4ws%Q*J56;KyH)Gx(XR8dny8uYc#;L6~jB!9gB z)9>Tu{fjt`*hSOI;8sI<;P2g|_qZZuxD)&dU&IfsT2lC}t&%!dT&_y|?_mEhIzR>XKY?$!!&AKn4k;9+bIAXn{o77C zLL!=$M^-_lQulO==c2E1g``yauyX~<<7ZIlIeO=yHF`&NsdV_#_r>A9LrnU1s=sR4 z{!J}HxOiYH52-7_+*Qy#wnr&hz?Wl!r|qcmPf%7WTXs<>$7i;Rb%OY7 z@9|h_jm#@bK{|F^a({3Io+rUP^*@x#m%dl|{ok>dfWmX0f~#EYrcMeF|7dH`C%~_^=rF$I z60rXX-b-(I*Ijo%fK2%CFKnjedzZU*g}qkFUr>7)tROD3)ps|6`8) zO0K{Ewvsph>Q1Hbe-+|izxzFo%5uBEj*IV5Yc}T|e;uym4LIqg628s<5m5oPv*qA$ z08{E8(-MW@nNtb*;m_aVcvXWw|o`0Eg+T-wWXz7!R&N*5GP65ON z_u2W!QQZG*rz-)}L}h*fx;n?X*Ox^HxU};O($Q*8Uy(e8JkZlsw4JSZnfH;rhg87v z@JyxTH5ymWXZZ&LP)Uo+uGVaO&2adZym!RmU-CEW50B$iDUjs6s;SmD=)X2ciqw*y z;8<6L^7spnfXn|R#nMIjH}@QS7a-T!|Ioh){y)72XSj#IAUpCRn&#Ap+~Etk3{Jh? z#~sln$+n=v|0&zQ5!q3qzY+9548m(1+WWtV1|7tIc7VF`P@_w5s7l+Av>e|+IHWW| zHH9iwa~x7FDf}xA`WI!W0X}XeUe4c_6T0B)Q4*HtDDh{9Y=Cx_AJupZpa@Mtx8>~d z?XUjErOMw3^S=Z^UkbhM|1Srx%NM|T9ejg$=$G^iN76j?N2ouc{xeSN#bL`(KK|kh zIEqp1%6wa8D9818 z<>7BtNtfOb9r7zLL)oxppUS4kIl<59JEOm@9-Lzn*CuQNcW756io<1)ukjW=Cwm&j zaVRFRLpwtnuc@=%W@_>7x#AU1+`z))ak$3 zJ$QXVi~Jhxs~v~@Yi`m1r7*lq^hH!Qlo@wiwj>`l4bXz)8|{hO{rQ(5WgZUDUN?Cf ze;$Jj@-eic6IC(A)ZV_(1xHf1fgPQ+winA;Y2O{2?DI2-T=E1uFZXRr@^-PlT3%TdH5Liy{ff zjyI*QW#T{%ea8D4yiOtxG+br5d8wH8TeYM`8`Q@l?7&V(S)N~XiuY2Q@;6*t!2{WQ zLCDk5&fHS{OTnI{?n~YN%ToO}aWE$K_Ycr2wIsjGr}!)W^sl1tLjBc-CAs|hHvZ2RURwDZSC)%AqFo~_0y$zF}U0MAAQvY$o}PfXB`y>xkV~~YM|?_Uuibs&G!tb+ zS&+^>dpd3?ZB4uDfD(2<>Byzxy}#ph`T{C1hr_BIPULVLL5xIFNG}eDaoC!}Ob&^kieg6&2XXiohy6I*!l4gAfutQ#v~WoM zQ4!V+gWt8mh~x)CJE6VMLFkAP-_GcncNMw`-7)st zQ|Kl17W!c1(Fe98bA>?jhw_t<2B(r@NiSO1xu7W!d>A9 zj12!M+!r1QKLNw91SaHjOOhf{6g8q&)QhgLCMhSD7c0V^#3cShtRi}e7SSeF6KjaI z#5%Anc}r|4HWr(~x}>GpT5KbJAhs7fid|r5(nIVe_7Q!=exk29Q2a<7A`XL1`bgND z_=)3SZ!$^r7pIET#hI`=nJWg0!D5IQDu#;@Vic;O1{N7_1HEg+&4R1AP23AB4G~)X z>agiJBYcjL?QEy50A53H9ygWVEY3_TQH!)EC>p+I4=q9?06+{oQlIST` z7R_Q+(JFe2)y0}(ZLzLcUu+;Y5#JS?i!H=f;`?Gdu>)o}bQZgc-Nl|_Z?P{dn)>6v z4-yB9L&f2+Y#Jqw5yy%X#mV9nahfTAiI^{ji3`L?aiJIsj5x#gr@63A z*p7QMbYI?}uo|GTT0&!?iSVJ&PZ%J~5cUcCg`>hT;goQ?nEJjJzTp%|mMXQ0R&f>4 zM#6pt7Evof!(OP%#4*X%%bDAH>A0vfvj zdVS7qy)JNDukWbLWW9y2f_)dtOs5mdT^-H|c&G_@22MncI}1p4jzW;F8gVePsc=Pj zlC|}4Mm)Jhn8?o_{LTU-x^MX`uaZdYXhg{oJ|Mb)()}T!?}RRbwC=# z=XBt7oe`@GoBz&I1N^xDFO}P0Mv*YK&_|+)QfsS0#9`XG>8URzmyZp0hULLqydku z2xt_IfF{u-Xu)s)0a!(>0_cTSR14l~fi+Myu^M0vu?Ao*u@+z*u?}E8u^!-C;#+_X z#fE|&oVhVzQ?V&vGqIWA0?K#~{IsRm60o({8nBJn2Ji#%1H@`Cwg>EpHdzNA-UYCm z*bSxaA@%_5CH4aBBlZFG5q$vriTwmOa9m%&f#N{GkHn9Ja^Uqt0Edag07t;eupIdQ zNWmTSHyY4S^aGqAP7o@f6_^C*FZu&c6{iAD7pDWx6lVg?7H0#_73T^S(Lw|Q28+Rf zAz}z%C@g1;XfeV8Bg6=yk{E@yqmq~bURNG;=Om`vdyUSp>v2U56hVXaL6d(xNVaes z>R7iKHaG(KKuer;VfR-Bc7X4qhh765!wcg!m4$cU)Prn`$gWC*lbm{`+EnsPe$JqG z9ZI4HmAjH9A^3&k@J89(xFhaNwZ*_;V{jrj`&j|BT^+RO0ghv|_qXaG0jj5Jo*Jaz zsFZU922}SpcoezT#XjYbRuk?VWl*oJkd_9#un~W3j{B0MvHiAUv6nYWSNf<4%TAKx z)G}%Cmg>Jd{s^6PfCBlI!bxy+)PkcpB0n8?BTSOhap%aJM<@eoqO9ua&9BYD$2IuQ z(kIDZWQi-nzvNV(ONXO-q7ynq;H%^$yFEI|kN%Dm?woL?r^fbojxcm>jg$Oab82i{ zrZkQmONSyVRnH3GB}6L~i%%+z4*%+pXLasJcB`dNqINoo+Ucb4`E&dc#~+WAzJ&1X z4%&19$D}_)lt@zRM{p9Pg~13l1WtoCX(-Az3{D5>VK~Y=0#1XLZ4~ky4X5F9goL!m zeR{>JT4&<^2PRmxc>sK5|>0YkVPIM z(*Ob8sIZ1_&OIse%CKiSq#Gi}L})#4vE-1>yq0NHJ3Igsim?FcuOQS&}=6 zG2jt&)Bz`@+AV;x-N9G?^-+(%u7$cSfD6~fX+aGXz=azL&A>|A!`r%WphJFA2pzti4hm<3qoW3#$~nq%4@$w&wm9;*jKwDsz@Ih!$ytf}Ie{ihpG56+61CGwWrEfp zepTT_^hCDdemfj-WE-f7sEQ_%1GboN)dTR6C(Z~7_^|l|J z3;J3EKp`{WT+!#+2Mq3qGobHv6zLs<)9^l+Gw+jVp$GUJ-$p$XE%X8BaQ`)&6MAOf zAf&1vQ2C82XX%laNWYBNQ4fCie+zW@UaCpzp!;m zT!9Z)-2VgkB3K#D)qYk2-pFP`0=7yYR43Iubx0r6lZu@y{)XyG!aICCd0Hj@j=O&# zElSP7Q`D5zx0UUIh*zpdMU<}e;owecnMmqY4=pZq(xLtfx+9sR-(9&(X&gCH7)L0gQuVBamVju*z4)Y1)GzttS%v#)Kog};!mx^EqIM5n zw#x9Sjc~3gGiIG2Z4qUne?l!_7u;!i3G{fTe!LEHB=w!B&u!qG$BALd{k{aTXbBxswOLuTqAb^z=ub_G;rDdLs}&Mgg`TN=15<-&QUf%8l!&NH1j&vfEE zvmEcmI@>uX^<|yy{F8dL&UP+J{aWWzyi~(^sfPD%b-Z`0<5H9x{u9lSs)D~q|4;ot zqz!Sj38V*cwzml?E=yyJw+3bK^hXSF-26!kK)rEi-Wzx3y>VyW8+R_l`-$Qtv6D8n z%pAblypGUZI%=EMIe_n?RqKh~i8>Ro51$F>$7cct^O=CDd?w%qJ`?aLp9%Oap9%Po z&jfsfaVkoU`gSxEusQTcy||wXu%gZfYyj+Z05&M33-F`P3v7r!QAbd&>g$*v*a$t< zPQaS#>zF6_HpL&EJ`#RV!#d^@HiM?W2in1bqel79cG7X^&Y>rVRt{@(*oedC9Jb}K3x|C;9OyT7 z+7zdcIrQUj5{J_{oXcSdhY=jca+u6vCWp($%^WqxX%&ZCINZzOaSqRN_$`MwIsA#k zryTx9P~+@Bar`KaJBO7xG;`?9VQmf@aM+Z?796(auoH(p{HKla*Z6Qaki%gdj^=Oz zhf_J6&0#Qy;Zx^KnW>59FpXF2?m!^<3A z=kP9vKXI7H;d2gU4&M-TcAhn7`YdOO!wMXFa#)qa>KxYPun~vNIBdmXI}W?>TCQ?% zs_|5>{;#go^y{NqZ3nX0=NnHe~#iw?UAhms@2O-GE2swwM z@h0*iY2<%{6?qE(3pDT){#)pY9&&SVn{MDtL!g_PB+P{NI|90tbYYpW25swZNZ4nD zFCjDE#<${o|6d_z@6tdJMDcw~DiK9d1S=astV9btv9T2^tDqs8|HD#j1Q837Ks0`9 zOkxnRw6GCUrL+>Uut;HP|v+$5!J)-40 z=V=R*zKHu}*ZVGo9;#k=m@!M#C79 zfhlIld^0!e9#wLcw zXIeAxx7}e6Yg@i;WFKO%JXA(=eib>b+{fu8Bm^J@iEamr4_g>SaRJq9cO!7y0D@QRgX@kgV7D^s%>*)k$vjoSjiKA^07Rw! zrKSJ>PfR9qSg!1nBy9^YZ!Z)jn5la}){F!;ckv{LXgD<&u_Xp7l;5b;{)rbTH$eJD7tRzMu;3 zkGg~UqwcdUeB~|Nv#_ApAR?qztn&PT$nv8)b;p61!ZY_d;rJaJ`se+B>M}4kMp{22 zYMpp~EA;>W-PeD_T)Fe0s(oSW>pqC%A9m-@^K<)i?u%`235;IR1IHNQ2xn1F88yei zSww$C<!0s)zx4YahFU5{WQmkV zr$kCq-asgkN1W1xP$F8ltUa;$$DG!;@gZbc7V<}yWm%Sm5VDYkZG>ZtVvIuwAx8;0 zODWCJgkhK~J+@141nHb-=FVK%%yDPCnJe2#kBebbUWU!fFf79|l*drUr7jR-%v?sToRls6N0tQ?HpII!OEYXzvjnrts}3Ia?EUn*^?znEggAr{5CM^8 z)m1E8p0~7pt<|qy7}$NKwY~MLc5iE2-R^U>BVvqU2$RWV{#nlNuc@_~TE}{Pwx?rv z$8qd(9NV|-&a&+N%eq(7zwUj@=DhFs`F6+Wu) zI@AkMUNCERV}S}dX-7gqiMu9a@}X##zE^y<4Jjy_T;(CFwTmA5hl`URB&r9i(xUt|g?P!=c)1pn}Q zU-!c^eoHFJ0IaqG%XJNwzut;ej{kN4JMH8CVwp$HJNLIM620*-Y6ALlKyg4}7==xj zh_z8MMCq1bDM1Woi{*mKGwi=0r*H7!n&a})vH`Wg|A58`vWZ2tMd{~uv1q9B6u$r6 za4Zlgbf%iAa7lWf&ionSc}5VwG<}*rsaLx;9|#Qjz*_AmwQ?I|7+U9`XIzQ92P3=& zr3dJL@6WXTXYamP-+c2;^t1UhQgAmengC!&WitKlleF^N>t|bLS-S!LUXx5LFv;P{ zG<^sFd_tQN`3QY!Ko03<0*|LVKR zsY)pYCFZ1|1cu>{DDhL@J@3i6>_9PtQ;S}J9`11RQMuAibIi5971vU(7)xf zsrLs?S?*A4WVI|0q~%b{a>yYsIf$p#ea~5)LDtDVG`FvyprDfi0s;aG?g=ocCTlV< zFffQFYYGVH9t)kK?u8I8n8zP1Y~dnW-7{?2@+X`A9yCquRc4tO$MG4ajkb{$bH#sy2)LQFn3NCS9r6E&5eiqp*MS{?>p)P!VXOcl zh?o&+{mF8kte{{OKMoMUT3QY>h{Hv)Q9KV};v`vS6ugGf^>Bt99*@WQ1YAPQWu#n5 z$<;LMRB7hIYp7#nb#0`7&Zp1(3iH#tVeChk(?o0|*{is20PKFpyh-&`{Zd zh2WF5j{=wvSPHNT1Py{Pr%DmPVeA@s09)WVN7-|3#b4n^cb-iATNMChj(^6j;}m&|9J1Mo+95vl}{6&*At0^jcz3Iq>r)iA)JqE zlBTy|Mbf0;{NViX{F(WY`O*2y^H=9T|M87aWf?B^ zEetMB7<%zrMOW@y~O4wIBQPhgqssYk5CUtn{OPn|~|L=?puHqi!8??e4$JJzd?cyR^%? zoGZDqt9Z*^=SiOGXAc;!AWJI*3z1iYNtQNF<%Q`Oku-x4igd@weiVCy1Uz;TsNc zf-?jID^$>iB!p0aGCRZGY>B%#&RpSIj^h$siZi&Z5NlE!F3UHy&$Q3AFSMMzj%;XJ zs`N}Z;V2}9XH-|uo()?d2oC2XNpvGpM$?fh`gNp%RvT>6pvhs!^*|5; zAa%Dv3PM0&@mn*n?H9QC$HB2{1|)Y6$etURISwEF3C(}QNB<6-UWL{F!=eRN-+(hu zfg2>DL0E>>Xh1VQMThgZ>#)K2>&36}&g4$y*iw$C)U0YLi z^?7xwvw93VeeY2O@FDo{2MFLJ8sLzz(_f9;nXm89!(7hj{0KSiwI<+ zq>>9E3_wnaJmslP6Ubv}OK18r1oFislT9&|Gzw5tfLfwBpw_8G8P!n~Kpj_wfV!x3 zWiEYLfa6!n%^$2a{%WQ9dsTY)Pu1-Hb|;~|I-yg$B+%{B;ou`WUi;4JO1tW=p^a^A zM|(l{(T*5@v)gRnkGh?%-nAQW?mJpg%!qZw&(^EdfpkgO=L-9@}8O2mKczw*_@XW2WBBfkBcDsbeh+5*Fie(JY z!by3Y%5xM9COdnb$EZnm--`)qqG6)6ZxD&uZu~#@#o|RpDI_Gt8$=zc3KyH^f9cB9G{%4;G2WtgP08Q=^s2j z`3h->)7FRguP*-&mA{zL<=}E$0QKI!&HFV$MZB;pIKQi)rhbz6Kaj-#TsK5*(Ms>j z*jbuxwFdq>k>MD%*Q)nH>hbg1=jh_sU4CSR=(U zvS?u`>7Yp$<6U2bASV8W>SmqRX&>kOYhzWsQb_Y^V*5Oe4|_rW!rSmPWOcoEa;H@7 zgDY_C&#_^EvAEKH@U7vF#*A9{x@a~;^GS(g^@oZb`g~<8r+*Lc6@TdTvCU_kyDhp?Rs7d2L@BE4VSOLI-Pu6nyu>I6M! zkG&m`HDaf-g$I}Po6yLAf5m1hjo$e5mIo}<{N;a+{-Tu&e1YhPQwUeFQoHP_C`}Gfd-%0(#CzPTnD;AL~)BB?Y1BKhJanZ-SNT>fq zjotwK040cnk^h+VeKG*FGZ(Wx7Ph#Lj{!#86Z#TEbCm%)47MrArzA^`+@Aa@m>6;= z+UfzN$?-_s!Sctr29}G?1@C@c2%i~jLpL%;BV>kHgsr&~3DJw;2OK8>DLAY+jc6w@ z%;R8|2?Amse~+KQN44o*QOw0O2SW-KeV@Y#Nen?ZB~xl{Xh=UZ4xz{^K3hb>NHzP29ntl-Oe)(fg_REZ!LsQbm$mW zS=3e#SPG#%%2!SVA)hiikCtQwzGjbtS%pN`#0tL}dTLkE>ZYeyBbamqplgDKJlzm! zE#hCIl;Dv*9%s)kiZbd9qhV_43R3u5_a zPBl4U`|xuKK2F|brIr}@jG5ePz`)|&deYFaP|_q6PTF_6w>!C)>EHwR?<{8}7fI(= zu)FH#9?N$tO;a~ahqfw3CK0Hf>#s-D082m$>=?H+252e$yzI3;vJpAI@=lcD3eo{) z%Dw;Hg9??3ZSj0G##495QOxIZAyOV|RAwNNA`GQ9*o2hjiVA8-&oM5w?K(uZTuQkAsKx2Im&WMum8 z0BcF2Xo!w{>1ZSQ%Ywi_)+yPR4_podGqDJH!M5lL+`(vxpM??xY!^|(qvtamr)p#z z3M3+>c&8yKG{WUB;PaLew+Q~#16_gzyDVY?0oREi08!0~|H`|Yv27>KN-6tC<&~sp zF^z_eXwa3Ckt~0U%+bv))x9E3N}K_v;uY~uKFJ!13mb$Z9<Gz!LjG(k(LHLudPAn?u-a1m0& z1?62hT&S^1cZE|0k3!Y_iIU{Kh|*S{67>=_6o@%?RMc(JMcIKc>eD{RY87-9Q^A`0 zwBK&J)!t*W>9&`nJ`4;Vq92o0b;Sn|J^}e$-v$H46>9%L>`{YIjTDA_JFYlr+8ZeY zmGG8EKs=i*p(4hA!G9UQ-UmiA!r$fBOK^=PfR=`0ls;0w4g;cgk|o+AeUlhZBaeeq z&1IYEd8cX8WJ99`OS*5uk>t3#7JiX(O#!7q)jhBt7ZG!L;^Z1UjgT_hN6vf|dLcT? zJtJcHDqlPztB=wULI4X@;EFZnb8VZ0t@lf*BH@ZROkx%uAABBZ;{9+{|OuMfYy-)l8bzFk)n6k!GsKrrs~b zI|b;DgHpuQW(I}_8=>h?m_d77XmwpT z8OKOf9(r0C(N7uv>?k#M)&rpE(>T>@6jk7Zsk!Sk2)&sADKj^9>uV1Q;^K3q1}-(@ zC_~&os%t{7s((U229wZEFVt6e+yb^9Pcel1>M6bs=_opQNtX^!&68Z9UpNbp*{MJ5 z5pfHI(#c-Hsf(l!PiMJ+s@&Wd){yJIlW$Ha)bIOJjl@*ZR}=(vc;Lo$LkSH=f5BZg zvH^8ug@MXBYw%VyjSYWkd%-R7dmLy0*?5yko$3wDCL;0G@r2AKltz~>0HKs2h*7Ce z3BqE=$LEM)+1-t$rXnrTpS=;Gn4(_5P2n{S^Wk$f08jv#q|Z1o#7cBR&iUM_@=@f$ zLg|^YK8(Ooli(}62mzDfMKs=I!;Pl1Vz^uU+H@-_V3~LEfK!_gvLVI*QU(n77QkXQ zY8xW%O{ho1tTsBb)^M@F#0A$J5gs)9mQCyX8(2|%XuuB3_=IeXTWbX0k3@qcT4YJ+ z6cxx)NbZE#1DH;?6^m&MDNY8d_cT0NurPycHzOZrC9}wZH(W_d2WZ^Nb&joZq(6IV zM@^y?>$f}Sir%^;Gtr#oep!Yty;Bn>mEslG1IsJV0COaZG#7XpH}C;=2h+gw15#RP zx+iAhOm-wMSalgFYu$7sUhpCJ`Mh5>i7z;)8L@5V4!2pCa80)-UHZfK^SoJA>dmk(62=pp)>aqC9wY zI*fssI^2KMs|v&38c=58k&;94WY9W0DV{l;?w$i-M9ncP-7+>D+RWcvza+j_MDdz) zDxqg`c`26;gj$QkJ215*dqGjOQ(@cJP6UJ4;fLXB_X#-N{m9TYO|ey6)OwWf{?&tm z#fxbcBioyUH;vHS9{G?hL!c2wBgKV?W{7u_=iPs2vQBi7*tOMETtfyJv(=}(y*xBm zDk}EDOTvV+2&$1O9TZkqihE40M-v%_e>?!o98{c;pMnxhXEmaMUMvU> z^b#HztlY}hgJ~_HKEaq6HcL`;qxAGj`cHysR~xR~*LeUss>Wo`Wf`?3@w;Z+ zYR#)Etvd~qA_Bc&{MqeUYJH}zig-9Bn%xjZwNm{>RT?!Iv|f`Y(CA;948i|`98+6u zJ6TreriNY)4(^s^KRCuQoHqwAv3`mzZN>C<;OGC&a45+u3g551ZVPnp8#qm!?nuospvS!<05OH@ zgp5=AXYt?+pYV%l;XLZV;>WfJYpue3{!!=IeP(K4$bfgoKnoa{7L}MjaE+BetHJf- z!xwPXc!|!wrkavx&jH^KG*(k`;fGA4mz~UK4al2DPW08qB|rc=r_P@a*SSyx2;mRV zs=1|pkb`4@3YfjktWqC9pFy1T7!dF>I@7@lGZN=qKjT4nuLaUERUPt5*#N`>i@`1b zI%w?nFt33nif4G-^k)q=eLPP^9Lp+)1iXkvU}ujtzRg2c=p0rP^G}7>^rKrDOt=tD zvrSWjk_5u+cpAji7skmn-9Qi1ErKq3pwSF1Mg zZ9uG^F|MrYDbNLB<{kO9^z~3DGd~5okR=W1j^pn4K1@r#^fz65@$P#%SbSeutg>#G z7H?X=rM{9(rf&EiqvQ8lly;_bf7b;o7yS1@BgQAeE^(JLfI1lmoCfyc{bEbT>AAey zI$VzV_~y?OX+Cb@c;S=o_XiH^_GNGLC+CEn0z}~SjG3ZvQ{Pv9W=|Y|nhe(8 zJGihl;H3D>fIZ?as`e?dzXN+a=Koqpu&4tRv0X5)A1%rtCRhRpV49DQ7_1<>_Zf7D#<35(IVRTorMbo~Q zDQA2?PrN_^UM4*h9gUt*jJxx4ZyP(RKW2xx9Zj0}o&AjP-%rfxoStd z%+wv~*=3sSyzG2s(X-6gn6B-g3wxjMGOve7w#Rzv*>BH>wYbYBSxp?=i~#L%3gNTN zvyLTMgEd);wONOCS&t39apn7)oYvU9=}z8RqKGDj!6zF}v~`r&ji!Xedne$O_b~4T zd$SMwvLE|%00;V@x{HH-ck4-)5uI5O_*6KJ(>a4PIa}v-t-R_p3M}Ae-+LtfYjgga zoe96(f;2u$1~n30!k4;OBvO7Qd=197zGa5gJ4GM>I15JHe& z!+$P-0si4H^oaR7Bw4+xXK{0qm#~)a+%lH{{a9i+US26Didg%I0DAyGA|`$#d@~O` z2`be%H#oe)iz;HZ7=61muOV|BB)jAAfMHUUu#ZS2-X#VzE4(LVE?hFN_|U5&1lmhZ zk~GUYPcWJYZ@UPdwQ_>+=jOG*c4S*}t;PAixuxbO^o?c!U*x0^C|wC3A$Nw8qiN6u zmUDyM_Ky&1@JuvIG*4>FSka+qe2GJ%cB03)z*POc-T{*;heFB*W=ojMOyv}bcdkiX zV7{eTQzU}n*Uk+lJ2qf>S6B!zbB}UHvYC&0#FcCNX-~0^1Ms-zBvC5gSu6_C#J{L& z7BkULa=ud$78OE|i;!TBd~uG%~7)nh*t*I8w?Yd89G{RCa+CoYN@$h3BoSa{mad{((b- z`3fr4K|QrvEoQ!UQh)MVS6#KvO?Rw^&9E`E#gi%x@1dEkda1izzo&M1&W&Eqy31=n z()4PYY4tzS_I^r7x*vrNy&NT1=k*~cfk!NdFE3n; z8Xq=cp%4LX3@w5nBv?ooiiRIT8ekp}8JEEeD1^UZC?FUS1ZE_9DWp--Nc>6@3!y(1 zMKP}Kr2&|QVb2kOeQjZqAlW8l!OGyc4giCbE!_|)kdh4d<$BtQ-CJf2K?jK47O)$z zr7Zz_Nd&AjijP)b6J3^#5{(y5Zz2!hC^ zzU#>lrQ++llXg+A5Dy}RI=_OOK?F5!_%N1onv5Fb#5Z#=eAnl)T{>Ks#$|phLjnfv zj7k|Vl1iL-pVQ*qMJmLsENEv|90BqFeySq*@!Is)plY?uJNAi*Zot^R!U0$Bl8dKY0L+`W~?V3^G);3o6PAaL)x77gb?skD@4n z(g;D>3y?0FF{K9Sm;5Fn=L+T(5FZ%IzcQ;>Nmcg`k#N*w=OanPWDH>#?randN<4=e z2=p++1_wL{d^k}PX3V>7#kwsMfIooS^|%xb7Ir^s(-17_u+m4|e^*Bv#(}$aPBJT)~p^Qc)_yR@Fhd#y&GUNtVUh zOj-Rb*20G!AWr%5Yg@ADU%QMH*&Vv`gi=FEK!-OTnS+Pr@z)Z96 zMtEnVW2jf~qRNL76(d5Dkz&o-fp|0hv}zgG{brHKagLn z(pALSHbDc?M?GY#thNOZGEhOdO0Ui;!L^CR6fC zkj4x%s8*nJ3~>QMqTZz5TAW#&O%!L2>^0aeBxfC4x|%J~$h+drEU?^QW9FZb*-~UF zz&jU!ILdx5dLB+AzmM^^#n5WotN7tO+y16KXsB2<1>#oHO|7UVlkOkv2-!Ffi(=hFb^5 zw4vzofz#Am=0eL#CtK}Nz3oub*_P$bOZF6xj`v)u-JX!tF}moja;{~CGpX1ksncP< z-X(O)5_JvL35u>DB|1TsguDc%hzT)`6n#-6uz8e5MJe&} zD8?mG@C#C!ltdvYLTOqe1y__}W(8%Je%C$(dF8|CFxjhygfFEaWNhyPc+9x zsr*!9dNd{3T$b(6%Cg1T@_cJyR1g&w7jg@=TffA%)Rg$rVYwu$@~A8=HCMUn#d7{m ze#PhycgOE$@0M4aSD96QRatGUJ*#Q8%QaqYqLy7Ntp6*Jby>Z#-q`T-sm7H?ZnN^c zsPszZQo1E-`_-lGgKarsh;kU43B-clFWw@v3^bFn?^}P7;SNM3q2c*k=1IY-!~UcO zf`B~$TC)Z?HUezx9;Q#TL4n`;7a(z9hy#0kk02i6V3}XA{s)35i2VcI8Q?ph4+uX1 zdj$Fl>nmKZfZlmCtRN}e8cq3ld-DHg7EY3{9Ota7y}85wj4TnL>@dPEFTv;rLl zTV<$N8{uE1hlrD5fi!utWtuNbm2#g{s*NE%F2U_KC76Ks#WPH}jHasGCt6H45eh>* zBn@%x9)L?r>#J2393fso1Lf{g_lPOz?qiV~zvLKmV1a(RPb?AiGT~9^iuvP2rK&D; zO=got0x>F1K)lK+9>EwS93O962E`-uM|*!cVX-Eg*ndz^x|+-!H2}B_bk`h44A7S7 zehGMrMdg$B=FNOC1*`&&oIRdc>~NWQ_%JN}-wI$dOMX2Cta-ZK?Bb^KCbj~8-h2qa z5;%Z0kgLxwcOn4JeO*w6o*;4>I&sYC1eA2F5CDZ@ps{!0CKu{ZlOv7m?M>+(YWS z@H6}pJi~Lmz)O51pXS?FajtSO>>vJoc$45NRPTJC126{-g9Od-b9-XfEaGXNz2yYo z{86+44g+8q5-h%;o!8E8W4126Ixn`1Hvr&A-^CX3+N+~t<*WEt)|XFSF36|6_-XbX zuFznI=wo~he4zlmZXXJh@Nexey5~Ec{<8;u*WC9H1Mr;y{=?4>@C%E472ktC zzdFS4ehdd343=*AiAV8c_FL?0#~gOtLo5UuJ`6krh;Sq0!j&&C-h4>#7a~xQP{CmX zt-+#1i;+NQ3Yc`mB+4`r5*iT>9sv^#U9N0=g@g)7h{6R*lqpuCl#Wc5P-VXLrMEuw zxpxp?J^~^qfE$w{P^ia%_)t76f&!>wr$_+!YV69>g-U{IGX`bcS2wgNpgRuZ=2Wu> zc1-FcfmBZ*eXK&J-L7P-JIo^#aeCg5!6aFDDOQ+GXfHtx3DAM;gwsl<2NaMcrNja+ zuQgBg5|ThF0*m1|nxxD$x6w4Egz>6mYg3@~j8&1vsiw<8K0le6P9zS6!o_)|f|gep zE-aaPQ&KK$+ek$(5=n8FXS&K3wVgUox~Ni+N7vr;FlAVTjVFeUKSkT3T&GKB? zFO_M{d zVpNe2i*qAxeTz*`Q_ozFG+w*PtX25Fa8rzmA?vS#*BaJ2Z}J!`4v%EXY#5`CcCoa& z3f?%z%_dDlz$j|$^PQ))kNxs-5Mn5ZQ(@0_hf}#cE)B(Uq_MBHth&Y~iK>v%;;H>U za#xcGQt~#5z*O+5%YwY;)3;=YcwdGGciO~2!VxZn(kC3BMu;-h5FkPIYZo-i6?3=?hmDBiY>8Y?(i zE;mxRuG51^7{dSAegt-6mo>SO)0d`J8nP=+#0>fD#VDQo7pGlS$NKO~G3aU^sdgf4 z)6TS=BmeG6pbuZiui1AGD7bBpnSWQ^;$NrQHD`9#z;=O@Zk4H9gxxI_E|sG!5AdvX z#p3I&tHb+QyI2b?w3m0W(A+bFl*v~YkIu@h^F}(y4e@XFf)Nuhgghp2+!BjWofZCb zIm;f@@upha8k3j3ypGEIFsB?-Vi4H>{ZQ~X$DHWq+7~G)f0JgZ#uSk>3^tQ zzfk_LLZiHb(<#k_mkmuKXieTozl5Z zXy2lp%?jcc7U=TYJ`Q4id_hsBX^dyx4C}`kOa^RU>)&HkM^`R28YSconY-p>xWRN= zSq$Xp>|jLPh~OsY3xiA3v#gIUu6Ve!LH;_FL?~soYI zb5TO2lO>cYz|M*XIvCwJ(e>42nrYJ3GOp<=tFH`;flDN6*RCsc2^XrGJ$WvZ`+kAJ ztRaNK+XDo20E6b2`-?HaIXlryA!mDKwO-xC%=7vo1mZOBQD+Zg#Ov-}At$UKxyELE zVK$7^rQOn^W#e8NQgnKSCia-{IrrqA5L;N6j?aBho8dAs%E57)j*r#_JiAigIhk5M zA>-=PoZBSMKll6vwMb7NZT!e)YtX6iUiO%W78A3K>;BBo+?MY1kucqnTY=)DM99?e z`=f=)n|+oKBieGvO+5ePN@XI-zbBQFv@uD>8H6$kk;vOfDZ)M}?&3}uVnO>+Kj@4@ zlQCQd#$$a9fz)=_dL5BX8W-pC8R+bVy3ykB?s@KciuJvh(eu}SbL`q_`=y$1eME@0 zSIfc%wZjB+<=|Kn>TuRs6n61DbrPSE{v6G@;yKDKF#BVU$?!uHgT&Coj)f3td1)6z z6I9U(t~~wPh38wfu=6z?}RR&lBE6#kUjMiBFBbX8xMQrVuV-|mNCGrH6x%XVSU-h7fHGqT9% z;g~(LOP4SPa*T}K*LrIw&B3l3z2(rb9{cQ-_6jy*buKal=G5v*P*OcAHIXF0*87kp zJY`<2ymy34$u~+}E@RF2uUvrBf2_lM)wV&%kSE2v>QS;1C}ZCx8F=@hY_SM-R6&*e zA#O3Nw1p_LXUbRzd0U>kG>MMiYE3eH=UNVe|I;|8V(1%i*PP7`j7i4?61;EnC%bOj z99n(GF}AJAB3D_Fq?yPsOHx-QyD+16V3hKUD*WwN)L<$!@bfRfm8bq}ja$Y?4@2ny zwhcZeAo;u+V@KGY<2g?$PrGLP#1N((Ote<&4a-pzV#?w_$T?Z^Vk5RRt8jL%qu70} zE!!EsOtdMfP2)oqe5yn(x8*JM;9OUBbfz;sVrlHNjm53%m5R%??Hz=ZH?vN5q#AdA z%=Q%I;w%&fs$^@9+{sGq3N2$@d|l@4(Z-%LKZL|@T%V_^eeHBdtO?}z&J7m#KZQTL zYbalOM_i~_E0dFJP@5C8m;NEQ)n6PuMNI6qHvsgs#j=3JOA@n}e!aDVYpYTUV~^3e8x;4T^={6yA~x^ow8hU0jPX zR1Y#Z#=Il-?$9MW2Zb6M^*;7N$O>R|*-~<7_Q&uaeP`$aE7f+DIDTjWiFy#7BAMfr zx#1PL2UoA2a1pKjB^v%@tq7u`e*NaG48}RBA_ESiJShx@P!Q{5Wq&(DHKC&s(2>y4 z5op9H*ctO&_hu%@!I)uuPO|^U`1DHd_Mgqi`)Ws*07qY-uk9D*pP!dO6GZ&hLJz5-RIi~#OJ#=kH$KFU~AZ-oKd z@g>f0?T?fA4+pf6b+vlV4gKJn2aIGG7vPSvoY$DgO=ZSB?#i{j1Dvlsy4#rrU9R z=J@B!_KQy#+{}pM+{`&M_yjWkjjrth!pYWzUeo#DEB&x}F-uddKERGd)l14N#tQkf zAu9r9}dazH8539{cf~-Ci%U z%g*l?y}WVdV{cENm!JAv)7OqY*}1@_PtUQy@`!PKar zyo^x7uJen+);&4O2Lq7C+f-?mcT0iCvP)*;{(}pbY`1fyXs=eLs}{}1!=Ok}*ED^l z6`o-4#W4KtX~MON5U1;oe2~d58>?&ab-rNFg_c20{Xkt^+8f*ZPmOa3wfE$f4`+fM z*)!Rn)9p@M9+!BfPNQT&Uw(N+8Hid3$?z4vH0-8eVwBhME%sTsuBTm=W=C}^42N(A zdCdD-Q8_WXA}ukzvMfiYmFvO{@@&vU@Qr(J5yJlI3E|q;7D{7PjI#{BIBER|QigoQ zT_&Jq2fjTSPT0Kp{yqzv-+`v3{ZK47gY_Sz;Q7mClv5%aY@(y891Ih~I@>m2GWnj^vzsm5&6}q?&%I3}xWk*>pSB&VSQ@iJcw_&%A;wAwwuAc+ z`^D1}Mfn4Va?0`MfX?hng}M|w5|50G?jppjBneKPJagJU!#mTL7C(S#&f*`9H0@3; zHWe~iWnyq2BAp;`21_dxeTUJ7DC@4L*#@P&B= zo)G#euNDWkLaY~!;#c;$qSedBM(gRSkh1AiA9z6)s@iht)N#`#9Z^a4#!SZVskzn& zHbbsF3HWnHvUM?{P4l>#q7BTXCKZva8S4OFOU4Gr7S!ccvelTx9WR&JS!(#3E`l8p9)6&(8W)ra?>0P?xi7I)fQnQp68jh$Yli&9>6EYjy zFP$ny%~j_CJ8+>NCU1#=Sz+}02^HpE2f-oN$$LsFv{s86%)fEGaq*skzJf+(z;+{% zm(bOhQ+UMNh{!j0`B#wPDCmRa!v`Ts zWnL#}>EWubc>W`I?}gtkr^@;cJOFK1jb3@X1N$3?;9PTBF1wSoA02@iCh}&l-Z?zx zP#Wbn5uyN@pr=Y4N{ggHEU9SIt8=ek8UeFp+k^+*H~uYlj3B^6t-mf6l5_ z@0eR!?--S; z0M{3XssG*6!2|`$AC#|NtgR7MVLGN(?-B>hwLYk+a;BUDqT!vdmDMRE%f<9>54(8v zoXLc%jeE&(02kQ!U4#K0i~4Xs(vU^ccHLiCYPy8=-$)yRhp!2--J{Yi_YKL8kTP(UqC8;(nUfYDD|f{j5W zqN(wo2X6|zffRE7)K@P_4yn1sCa=)eo0X0?j)G146mSY6dUN#WgH3Pc`qieN4mu#B zH-IV=y;(ePSYc1Xeki|mxbxECnh!bH0oBmq#Vw*YBWLs5ys$MYPi))id_c(YO#SZa zY4yh9?jj`cg@;#gLu=$q*yUBL-g@d_1iF*CD8YR321t zDx{JYG?JEH6CGwtElJokhLl1=Bk4PMu}BsPJPvf+fBxv<{g;lT_g_AIbpQF0K4r;3 zQ)@||Qc}^^+Eg(BOpvwo!xKEr2Y~Bd=%E z$0y-=-+bLV-cY6+thW`;a5N2ikz4(}IfalvMGGqq*PS#N z^cO!-f;ZfIQmANY#&~1o2Dk6em(3u{v*c)m0qt2-FXSd0b~6fxXv{Vi3vD&x7@{^* z>!DQYwI8SG@w0iuvAMQeRjRwy^>v?rZvlCp+GA90Ps&Q!$47Ly^)Dlb4Ld(;A9=j9 z?&@epQPm}_`es#q)q{5{8m5_6G`23+GC5*p)T8kxW-hU=9u0W-j5@N^+<)uLlzz-I zFh|J8?TG+$LFn21p1Sg~-qLVM8s17~2CFi~MKh;`x~en6q8V{!u!_uFR6y&OE&9sK z@2dbMK-#~Xr|A|1-jIvO)>`lkh8dq-i_gUw%m~_fnNiCWS;{4amU0oZRtxexr*z)$ zn!DbIbaaoP6#A>B#W!lLhWj5@*v22Ui+&q^F>6VC>(SebV*buzgLA-ew?vwH=MN^+A$GC*ZGY)vBylDImqIum$m&sMyGl zOs8@4(I^}ZlR}6Vl|@HhxzmsXx%3{+b3aRuht&{F4m&7w6Vx&@`nWdrvj@W+K1Pnm zv>`}7hxZQCbPkl0(bXnQjwv;VkeNj$WFUw{1cHnQ%TLWzL2FY(xD`X?or%A=?I;dZ zxS1z=v=p48tuj70LDE)NT+&=8iH%`3)?ig6?O2bw22LR(Qpt1#j7CpI(8(DG59RB&kfsDBJ>KQpMCicN--2??p( zTn;g=o+BM^>*OV+JS@!TaFx!)#@XRk_C>a)5f35K(o#tXi3*V3iP?ncSYZ+qu!Pv? zXpHkm$6ktrq|2`>_}!GuJazO`Ds$I?(uC6;OR2d@_r4{U!u}MXda3p6D+-sUwd4!m zc|Tv1$E~Z;HTL!z7EHz0?ka7z3u57-f|;nxWq)*X@gYXZ@u7JpzCJMjcG%8~1r7}@ zzKq8B=mwbxkL}jyX00OsGx*KBkg0(+3Q+Q>)XfX5#(8u zfZj3DNxOeB(#W94Ip1k8gZx+QoJx(W+k?e>^m@S2a;EadXU|VK_iLOr9Y+0dfsVIj zEq(n02q?+dA$Jx%xty~v4&+e%>b2?)lWrtm$KJ3W*|SFk+a|{9t%=Cv)ZnCkMoU7R zE#sI@N%N9rdi8o`W-FQM=bt_YJ~*$YOC)3+SyQMK z4F)((;MM`RYgRhJC-QCN|5xwYBgR|yEMFpsUp%A3u1Ua0%)Kgt`NrG8$ZXC$w@p?$P z%^Y3#OflLedH?p}{dOl})QR}KHL-7Ovvl?ok#LeWO3T0`8`LPXjW2644t>LlDO4j! z1f0u~Nq6oBBg(fZcb93|#JA0IplWceVEmSv;n$1WimX z3nijtJ5y0+rB>XTPgzl*{*a$6mu|8R5E~5jMiAYDV))d&~T2b;-iHWa)%l3|CkzwkK2KE4*eD+CHg&I^P8EVUETfj?s9_pb>@}VkDgSctG|8( zyr-K4BW&)FpgM)HEvT&MAUWu<|iuPwE0 zyEVJ7bUHPdJ5yY&Z_}1ha#byO@-DP*E3Ax@W#-l%yFBSNadfKEW5n#6Hy+*KYvDipA_W}0*?4otcJuiDpZ5PWE1yVOCF?Fl%A?Xt3!fe<$H4W88R@#n zyg?8PNxeQlFCW?Hue7a-jA?pGpaCa0AlR&`bX-wT4J;+VfR*bJY+DLGZEryeY_E`z zn4E@B*gw+siapj9ooMQ98>CDU-b2?{q|$y(Hu}6PTA5DOuA4{st2DlcSNU9&%uKwJAf#jt!;ke_-HUft&m_n*-IW0sgN%-jn*p#=+d7!zfw# zI<;71v?%3pBn}b#A~N)YPe=$R4FonU7CI@&K~7p<;lA>tT;1hEQl>85#7jP)gzmJ8&Oj0mvQ}Tmgg0VQ`pK zk)G*ML~2dAyz%zUtP35Dh#CqFJsTBq5d=K5C-HWhqY&G7@8yPb@WBd35;{e&rzZfu zJzyVc;n#RMBN^oM!SeThCPXg#?hHQ}x(^i_>67*CpPC^_ysV-?lF71`fWT)CeqK7s zjPY*bGtbkl!7n3`9bkr|ckJQG+`zIxI#Up^N#UtpzGR@``Uu3`Pk%Rb9)~Z zY!V1|T~F>tHsvVdkkD6p3SgxbYzK)%aw;hyN=i-ee6%;@F9q_vvG?%Rm4ZL$c@Af- zq862{-)>RA4Va?KHef&KeJWt}VQ%axa1?Q~kz1jsR3x>kNXk}6cB0$HZ$#Z>TGxx; z$2a!oRBsPX4(qkrK?U+{l&9b{rFcr3?dWv+UyY^PNPP|~Fd^4d_n!;auiyuFgG+A(m;DGXzY<*WlCPAq zDo;kx0As77ZPm7E+qE6qPOVYfr8Sl8PU);`bhPblJJRg06JfvB005bt*+ydx`OYMU zwpUJ$1D&}U-$wh`RX07fBPTny2S{&!N68!S%yfF=o!yrb+F9B74#YsddX-RP2I4zu zf4_2h;*EEeh{jFn-=9WJwVDnJxI1>Wi&oAW4R&W9$n2s`U%#OTfb{UlDZRg(oqo<2 z4%r<-=1t1*W4!($2>-`GNT(&-g)ei@0=i#~_zRW9*@Y259E0U2$@a}Lx@yKI(M53^ z%KnY{baHry`n=leJz(uIpabxw-Eq52d?WLVsg&10ks2@1$`w6Ef0-7lNdc^YZf)AbZoO^5Xsv$aegd8+REh6|b{0&T7Kxv~9w>DRwDj!s?A zp#Bvu*k#5uXJfkCMP|8h8fO2VQDHXcLAM!m9JFf*qDJ|78JwTjj>)8Q8gkKs1pJ+OS9CIO?Y)UbsDUlk9^e;q87wO-P)R~5E6u$78wSm_z zm$YuZ+;d9n%_bxcLuVK>>2#*Ni7VJsrx_DjT6H#_#2n)@ok?C2<>l7cGsX`T3VQ-_ zUFIQx5FqFLkCt5UH+0r9nTmnUR-eW`!w&jxMzT9k=0^UL_eG-QB~-dDl)obNO>Na~ zedq+;o=(Hb&ie}RH#-sRpq$Bbmo{q`e1^P7FR zRmS(?FT`Je^zl*6(V*pj`xZZdrFMG0dThn|pVrNOr%e&Hgic(rU27k!dg#RS10-1l z%wy2g)pM9(Ay4d z`yb*DF+iU9xcjX1`PSzNt%R7FohNVT;YXh3%+-bZD^TzIss8#Q7g^jKXz)=`iG_32 z(nyqUhRLGQmW$iKJD ze2A>w*Lu2jr1cXk{=VYA6-Ue2XWGAhzj6Pg;GE#A!M}&3gpfmuLyRH4A>V|uLf;Fc zhusZ#3U>_;4^Iy-2%igI4*xv-FQ^Zc4=sasKyO8eBBmm~iG)UqBX30Qt2GLvN~26s zgHbeG&wn%+|6t$MEuBf%#lgg`#K*Uun_Rv2SD^F$e9&obyGLprZYID$0Uh86061+# z-n`+r^F>$CCUfwFa&CSc5YEmMjcoj8-6yYS|9F3Pc{60|B=O})%ce6T%sMZcyLnmNsCTxS~^b)YvN}?tw;bfj%#q6;&QcglI2Kn%L%tAq=2PH0vG0j2C0jK*@X3 zrp4H}yjpz+bbNmRfEL(4bR9dUs;O=GJDpyt8@zK28wf0+M?0WgCnpo%tV5ly1A5|{ z(%c3Cve;5!p<7J|qaBaYsxpN%eK=PkNRq`rCveQgYFQMgU~NfNkG&>^7QF(a?fm99os}RM}K=c(>!XTYDLI3|C$0fOve4wmFV1OSTto zQ_%}91_IVo zs3*&Gc%l-jBsBqjXi-525(Jc;}(R=$ldH2!mCY(aDL1uc9x&x#Q~`j07>=X$;WwHuLmWHi^JmLEh5J6*J_pa%ArWK1cGR*XQhRabhl-1fuai$J<@(xpO#afMxQ=$?lpi6A%_ zSBSomzS59;ssHoF#hS+47sBt4oL_GecnSp`91+2~C1`r#*J@Wk|G_jHxIX#KrWd_g z43iS{*=OrxfRav_#o0CPEsH=P+BryFSo1cRJ;#rv_)0;?d`7F!fSY*cJ2c$AMX|yk z)V{@6H|fCjNmDcVv$9|AYGnHo9D#d<@S1P4Lb(P!$~qRl(IO(;T1u}*Vf!`z=-JOj-)nNT5ApV#Mr_)s|6dftqo8?$E#QLKKNWbtC_~IUStyA z$|*obG?c6-?gf}?)8`MJs<7?^s$Q@s`cL*JvxzRID2zsa(#a=%17Ord(%9>Pftdjn zqd6kcnjnSbHX0`_I4qFNEH(r{jJYuq=2^vAHo2(=-u8g6fsCZjah}Nx<0x930g5S) zz4tFYRyQ{MbE3o8`{tYm?xoIIql4f?3X;P(D;K%&F_Fr(~ zBD&AGTgl40yiNT2X$q30$9m+G+)LCHRXb-DFko`GIF8i(qyFMS1Ko|gMwb#P41g_o zB-hoSCI7JBJZPrZKR^rK0s!#Q^v`WJgw-286&&|=+>FOGGz;;#N!-gc@OORNS)!$5h{rz-8oK7V%xSKZyER&W3@q%TyWmt4C`e*%3zvZv_ zbM3jhrHy1|)*$SG9wD;Uk>!L^anRyQn`?+_ZBw#PPLNH3I_NBH_*(ak0+8`i{vkyj z*1=HfuoP|~rx#Sx?<#VUXD;VhR5``;eCV;1>4D9c!?VX+R*`dwhQ=Xlp0IqSMLdKz z_}tV3*S*zUwM1X=+R=#UqrP6Y$40t$nHFB785i=s|K+FC~=f-XcMSR~E@^ofLN=>SGcG z>eb^StUACFe_2;z*~a?JbO-jf4g52WqJ*5Xobw>@@+Ms@x(Df70>IWYi#MH(1(JGA zztQiF%V*{6iO97cydE3N)(N-|OrfFFoev4+5@uYoU*NbG65&LaXta&ia+xX}9UW<% zjMqrx@Obo)8Zh-}b|Nt?VPr{~9#@vg9}Iw3Upu;fa=i?M2fXF72JL5AudfJFwZ)xQ zIX;Fh5Xn=Un-&;s=YcOcnigB|It0vicgl{;MD_7a?n1A-=K78#m;HhR4!m2e~$S82=WzFnzAE~v29 zvIFY|HB*5JmSsj;#^`=YRWE&x7;owj6rOP?eY9&ETQ<{fi(VLk z+fw@kZzf0wwH8E&HzR|=QV86+D~f*bi;VvQsC4?nO@O=M!SNFkLs{IyH*6Kfcq^TY zyH-2>p5aMJNvZmC<*MBkv#%=M6Y#;8!;k#L$z}H^`lX(B+HPv{;C)7cBy%8DVRT{ zQ+*V00L|Rrx0S%SvbZ6jICfV>!>3LI-6dNYELMG=Ll6ew0W`kWQ4odKsFE441j|!| zmlY)32du3%Br#lN@%b19BY9P%){d|uV9}G`HL!3{xqjJ7E1K32Q{}LSIgAX{yJcz^ z7hUTadV4F)2xX_frR?!I;*)`4!Ez3^X+vCU0^RcYR~9jtWofnZF$<9;;RBRkfCd&H)`< z1mD@trh!R;`?;D4^kYhP3;+EBnbznMuT~%iP24wMr^O;ylp%>R`p9+sTH6RfrVd)F z$OMH*jI^B&8_igoV5{1EE3F(x$Ui|DYz@`3a|GIazgs`Q zV4nVY>Tc5GHSBBO-uEX%1urXG2?UHqiUd4#0Y;56Qq1sslZ;O9T+ zdI4JpqS??3y|#+xWPWyS}|3uNN(c324S1s93w?_gPPAL1Dj!7C9U3 z3vG}+s2{YC#(@P0Q&XifNi!>vHtISqhmF^+;-04YIinpdNbwTdIPxi4JKe zTqmWy?HT&&%efhANhPHrt;%N?lxb967&B$PIt}JOO#4ZrSd#`(TwZ#9hJ`OU1=}>f zaM5TuOvjzeqqFag?r(^NPpM6CABFpWt^nD3q{hOIWk%ft~l z)+7&Fu@esov~;81+G0q>L~`FG91EcLA$5QfMgFL z)bC|RQkZGFAhTd7{W9Ck{4v=RG!EjCo4;mA?N3r(tdo3-E)1X*y6jNtSUDXOZjP(! zOK4*U3j4eIoY{h>qmjxKrH2a^uro$}y^&dS==F{ny)i?(fZA;@@}WpagrtHXQ>3xY ztn+Z6lWum85&A-Oa-VL3?$=-upCJzHmW-qJ=VsA0 z{eqC-1w}>MYE2Td1OMmF`&T@^BcHFX$@KNibS-Qqa2LEsP?k^fiWW-LW)?V=&#f1l zH0>1u+Y%*j*Pe&$t6NbwGo1mJTyr&%QotwY$Y0~rdAHtHU35(-Yn67}g}>Y*tbNHs z^FmyO4VE3jLrmJ6ACadN4ot;PmhR6u7NGYUR+;Vw6DHR@wppBzuX(z9?dp#aziP5! zw-1e5%RvV_UR&5N0?zlX@sb-FW0V6FmZwxcg%la1Y*|8NfQDR9!Q%fJT9FY=5vKac znig&qx;tU9x_MP8OMa%gSeKTBY?{6Vdd20vyLxKmVso9{x)2CHz`I!FL60u-W$aDQ z*z?i{)M61W!m5}?W|;0Y09EB%c3-||U+jQ}1|U;5UJTq4?E>R$ifb>+QA^F>c#;4D z@~!|G2q92Vsuz$2oIFHbk$!IB!Z=xgvypbTyH9a+bS3Du;su}ugDD}jE}#;t_I{|_ z>H=^i+1qCZ3&rs6FibE>n)~CbRZF=~{eKiD@x74&3C#U-_9HXh0QlIciW%hd)MKOa zsjOB%_#T79;}W14=4+OYHorV~+5iTaL6>QNoyNijP}a-c=z20u&0x*QPH~Lmq`P1J zbDLSdMmx;(1nQh{%pnNjnA^~p@hd&CwR&}sL{2p@)6kZ*|5<01Bc?X^z}pXhJKQEQ zH4=CU{30nW_{=-A0}L?HzL2|`fb6sfMxMFqkZ1> za$4P+$)X^r=pk2Ud!_#Te0qkEys4!!X+Gb>nj)2cX8RoV6*a77Sr!swdU{W!qWyjS zYVrix-KQ9KkoFL3ELIvZMl3Va-M;ScHOuvuPeXN&I)lQ10uAwMJM5lTDLBht=pnz% z&Jg#KFXJufUfC?bhO$2CM@h`LG56(>+Scp`n)jKJ0S9GQ4|9Td+t^)?m2!L6=;mo< zD;+h4NEaD8y=6gg>D@TEdP=noq(gGK?GOx58)O9~7)KOBgPDPA}xcciIrUt zMpK`?Qsvct`x-uhBQ>a{1kMrByMH9L!5dtA%E^YF)&?Ab;fw-F_bqtKMqA|uM&!zx zGQ@#p^zgMbL~ck=aA~y}}c>`lmb7%45IDH7F&p{mX!5vNg+h=ZP7yA?b4J zvyEj$kw!m!;}T)uPvF|6K^BZ!&%=W-nrU9`oi-F(T5jCQ8_vu#aH(W0nRA71K9g3Q z^R(WvZ5-w+jNfrKa&0j7+;{$JS{v+Z!idOF8x$Vx7HP#-iaWz>f#lQluzQovZ3)>uy{SXTCnUxY zRwuwU;EIA3w*MHd?KF>@tWv`9lS96?W{uInm@vCIqgKL>VGu9;kBR?k7i8f;j5jkL z`=XJhgJ%oM&b^W4p$$VyCHZB884@5j{Ct{0OmCl=Up(!wSDhh|WO?pmVYPJm9V*-V5d1Xro!8+K86YXol3bRztC~@w5%tj3 z#?y;*J}aGWY#=f#V-=X={a#cAkRTZB9RH8R-UVf|EHSUok&dJ zZnlvt4#7v2ya#MK>FgO}TejZ`82LYB+B}_f%q}PQO|@;N9S_Ets;ffb03`CTg>j9= zdY9IG-7jSxiC7?*Sr3`B7_pH9q%vc|;c?8~z4jY7vLyHz1PLM@Z>dz(6U$IaaF!FJ zD^2p#3D=>Y$;mZ9PORU`-zcY~iKNO=cC;h26rG&H>8=tG;@qDsN1vnnD&-qBxcTq@Xk%NFMI3wC7N~)>K!r#3=Z(XiF8lr}nFj z3Pho(D6-aM)(vB6X0bZo$cT|h4d)p}U=W5(T1|#`V=hv;Eo8oP#NnLo8lwrbu7N^K6PDQgM|1jJ*^WQ|h`wO!IJYZaT73hPj)iNW?+GaC5hBvl)DRwMM` zbD?ccFd`#07`Ytl@e{Yh-EF+pOC&Q^(iGo9O5>;*_qYE%!dBFH6E92jrE|h zp^OSxL}3HI$6f>8n0{!z@s1LzhVM|lSZ}Z<^n!jf=}44FlFnFKjrhRC3dJj*J5M&W zv}`Zz&#M(c7?ES;7h3wQi_&|JddK7jw=P8Tjxa4QeSj7oo*E}z-OfMbOpns6-3Oy@ zPV!mUNZxv<8R*YaKno8PLzy}$1xRnDw|vbKeUjQ-4YZ)2IJYpxcMQHTFFM=Y0d>_D zMgG+CTGfhDIQ?I}KqOe5HT%qWCa{Js^>+O`=^;Mg^LZ|{VZ};GVg2EtuHmKM0PQB! zU{*)%!O-uYN`<0YE}#BWv&}oc=_1%_x`8f zJbUr#w}m$&(`)XXTeSB!TV2Z)Tn1NBZgqO$^K3-fTpmwaD3nNW2=ELX1y9yxOQpg> zDVGNWW+M#TdTCqiN+9D&I10gZy8OcI;rYX}hqMa(A*`}zw>sq7Pd}{w{0nan96QhS zG2~WBdxw6(cjoLF-^F9bt-Y=9jN<%05AQp26tB&e6x%^!JS~Ak9nqC*~5rP6p5%d<1L{?{b^h zz%)EOD+5RjOOzOE2w3i89G)wiOGD6(l_AKpBUl7(fJ76W_-R-lJ<;|&48hrKBW}|J zRtCbF5s}9fqTE&La=_IvrCb-ZgPi1Be<0F3kt)M;UYvNMLpiRy<>c(kVlbe#bV>>b ziHsGs+5uX%6)?E^GeumGQNiIpW*>dQMjJL|3x zblYD(R+74vIY&)pCwho-nR_EJH4mB_;bwIXoIjXqGvHLYglJ+{jrh+*=v-&GOU?{@ zk=kIpVciAgS9D#8lm*`DJlyB^*=VOr{ypG;*A(+O{E* zk#I=jMsgg)(If6e2(Y-d=o9k=GS5X?v=>*vv6< zDw9>a8Y3ZQgF@mel=X_4vr7gqr-#Ay`POT#8iuL>g)*HrMj(H#+wgLrDPE-ZAu0TX?+dy7Ab1{^L zxm~^1HYS$$nbDDEJYh}Cti9XN;4N<%O1|u#eXW90qy2Z4)$flmR>M?Vx9{F^k>aJ# znFnSSh;unE*xTxO@~b%0zgx3?Ez8k~vkVZ(s<%9+ook1wd1K0=Q^9(R z1LR_thN4b>HC)*5a%3_AeZ!}uFscMZ#A08K&(eKMKGN4`z*x%+xE42yGK15GJO8ru zZ9!?)*V%5@`drcRH~t~m9&Z}yn*J{|Q4#JtQ&f~-4pU7daqWighb2(^FX@LNX`OhMU3(7^{W*b~#0EbDR8;}S_l%&-XOk~qXA|=u9^78AEwQu-T zwvKM^NL)_F#p?xKi1}ubog(iv!Q5()9XSzkDdlNnuk>ZjVVVg0fmq!*r#tP&2=50{ z-@m$)k<95U6LxwJ{dnOEe)*t$aI4;N?Oe=0e=SqAoKIAx|_n@_mhXOckqIM_rB+?MH{g>IAC$F9uh7M95*#0v= z;oz(lJ@QZ9srgAzJ!^9i2GQYR7+`{BJ0Ha6fB7#5AdZ}EpWZJ?HFi4G$GYm)8IF4A z#54H`@Q;elX(@x?5ByBFjR+EJ7#$h1A^@faJ;u!(v z)j)j(0bf++IInE4jCh!9>MbiN zCs(5A0rwlO-xzqpM585H_H;dWS#z`))7Uk?T5eVsn`JkG2m3Qla_7cdpt%F`-LDU) zT&?(jai<>RXlh(LJSR~IwH7_51g!BsPNu44p2w36VaRU3!Z5%(M8nC!44mA2sdun9 zAGIqNtzif|E9jXx92f~qGg=o}*OfymXl1b`6IyeMz1tY+Ls}!mh6dBna}5V2CU}O~ zCYPBpFs${cuA&1xW^yU$aQO0MIOibOs_V%fRzL_$^%wuRn!F6e@L86G9|!mo@jhS! zTOQ!Yy-<>QJ{bZvR&GtiViWk7e2Wcn;W6o7y-I$dc=f;QcqD$-|J@vu`>Qw!WTfbE zcB7RGq?a(_`cp=?y$hwb>A<$V39#)d5N&S(HY*PYpnIUMe55yE`l8pVnrnHXRQYmK zC5nQ`a=5C`b8ISC4MYUd0v6cOy`>Er5> zS+7Y34{RV#(y|$+oW46>NX@Wj%!u1=02pBn%-CdX#nkjvhMgTIItX0L48vyS{VJ62 z@Gg^6^p3dp;-e07PK@c_^_!Nj41UZo8GvU42f?3}GRw}&0&%9?JzfIM)j17xE9r znmScR>j=9`v8@?WD!6Xu>3Xs#)=6RRRtAjFC|DV(njCN7TX82rf88AGY9eqD8o-O` zXifumsL0V21p>oQ1P? z+}0}=Z8S8ILff`NGdQErCb1Pt*&LC!NUubp&5`P0fq{mS*J-thY8$4`mgr_I@JVR2 zB@ka9NYFHZ#{@SnKq&n52M*!26ctdLG$n{6 z2PB!Gn}~{}$gXcys2AZPUI&7fGO}S0$HEvgDHDhL%#MiO>qC#z4ZWN~f-2YO&+JNt|u_Z%#z`W899gLb5+w0s9El&5XzP+U|W_G`3G(G;R>J zP|ibTpda^XxWzhv1XeOa;qziIAm#a`uftO}fxC+cKoy#5+z?bN+wg16VzdU#eS9Y0 zhDBTb#9)5NnwTF|M0u(3E5Yry?^KG9-2OmYdjpYwpawYG{iZiv6l<*CE`J+P$jbh6 z@AzEu2yt^H>(|U2>Pl%j-i7snCrqOiXVo^5S20#-t-W{zrO3N}M)GVK$0}@W5y|V* zrV7_B9T0PZPK7VJ6t`Vtp(|Hv)$$7y_y#N2&7ylUhf|X<&ETtY+nYju2Ng|x0d^-J z$95oJwn6eNevU`u9&v`jc87RdxgOTOt|9@((_AH^@h2AD8cPWcBW__^K$m!h1CS-$ zjg?K9f=R8fvhl|Hvl+YH?uV#dI!ahE9D_UOve0~Rbwelzk`5=@Bgzo1u~u5r+9WMb zIcoB<#jFxR}qEOea6z$TPao z5iKFGUkRGaN4kdb$^ZLeKOM`{)tRLu@GJnX?eQyiUO%>8`AG)rFq_YG9JtBw#I~)w z?#>vk@!Dat!4`u10p=+&CS|%H2d`1>R?m5366QMw17K zz!<447dHZk$5Utw=&k_(wcG7}KkKTu&xSeQ3r)%7V~-VeE21El^k!mD`*E{?GjKoG z9GS2zQzy%6W6E5V+b_6#%-{d;{2fC7^8{qdB`{7&~}U2tSH(05wcxrYR=rHF+Y zk)rW%#02D6-oi6*=CE@VrkN@jRD1;l)tEuRav>fZW~ok-iYMM&nkO&&AwB?lbO>Q$ zgEXU)NoImZw~I#Z&-r^Z(K1;WQaic@0KnWDCSt|zmU@!sCkd__EPgR9P($)&5*S!q zTw=R5WtwHYrtUp{I~doHQ|c*4#Zj}rXhus0Hcx4blJt|A+-a$k5WqXf3cH&ZIw7+7 zsa|dZCqL;PJj?Uckh}dlj-SDvVxOG}g<3nBm3YX=48e*wvC-I~z^fWB8>%>-xQQo6 z6Vt$xYZYZy7-pxaX(B|cwc3|%L}wmz4Rbp7Khv zTi(i_1XiU_8--&p?!_QL5JuGNI6P7DggU$P@fho+*C2852wfs`PN6hp zJvCZ=Pp}HuG3Ns>Ju(?d+?kuwoV9Wbq{&BdCj0v#S8ylcD1Av)FK~zBJARFW)?C#t(9fe$1_Jo9m2%GX4Z2cUFCYyVf=X1kb200_HbM{uFvaw!m zRW)T@^-|UW0`7sqe05HHKvWGBY66;t=#G=ziYR6|6l54iH{=zs;ZFD=MyZr_%{bH#^^xx%Lg63rQPzDg#Cm zb!`QsCU*vzow>s!Z^NqIo*~>W4R5bGBiTBP!H1WIRu`u_xQyi5;FsfwPIv*=ncP49 zQtz2UDgTG0@9By2pRM)}k2-A%+&}<&W-O;arP}DwpFbTxYFcf8{e7unk_i29%899S z68?60$f>2CSUCM7BD$uz{g>DW`#10M+(4rW4Z|ibtfszb8Mf(x(K1isnk*OJY^^ng zquJuqPV7Y?Nhsomn2!hLx;aT}VN?Xfc#!u~myV%4GgfX5}dtuh3R z?aWg7`2C#SUkS9ufifEVo2S2HEfT^PEwuaPX6;GmpfzXqa74>;(AJ?ze#i`umke@x z*&Rqh9DY<%XFS@b=`1^>e4gxQ8*uCQL`I`=^nK-8pmzuE`8APkR|pI~Pfze8$(@CU z1x`4tH+fFz924q$3L8FrmPE+ut(eDA|ATp_$wWq3L7%bwQ&F&mE5H`uZ>&KBGz9S) z;m7GB=Z4)|0AJNE#c*BFcmueaBfew6 zZgZ2%Xa09<2(TwxFQ#wA03J=lXjz#8CQBqK3tOAuO1c1%(jvcPAdV-s`S#J_d^(u} z{J=_Co&~dw^&xIaT*`pA8mLIHrVLPJ!VzsSo8_Z_Tn-UPLjuW!^C4k~fCC=47X{WR zmf|dX*Bv2k91vWFAMwEQUXN95LJ#0-mYI67ts69HJGTu_NVY>X9IFV~*Kk59d1K#Z zSdY+a(nb_daax{b^-4v8sWQqPE&X206f!_Yk5KkPRXaq}cn?-e(I_|loU;M_u1h|J zd){s;=}0icwIJQp$+}gKtRD&E(Fm)6pMFU`_I5g71J;Xr={Mv}m-;IyY$6?$lY4oW z0sFaHO<;E$)*v4iz(hs!7ZhfI_FUip-+v1lJD9HjcUwW|71gOV4Ror#%jt7}`sk6pCFVhKzs1nTf>Mf!(&=v*%#> zMCxAzU0p67YaMyv)$S|tuCDrr&Yj_7_G%Lup;-Nbi_8}2(#~2$uI>jqBu`?oWXp2V zfsY>2^wsrQXg}G^(hV`WknV&C>VL;<%0-jgHFTAOnH_05>~;JxIIQc+t~^~lC4#wk zquN8#rW6aMay@jSN5n}Z7eZ_H1U)7S+EQ!1OoruSZQi#oxBBkN|0^pe6yx-p0r(aN z=@7xTOWg2T>6br`3;PL5J$7ou> z_nUND{*1Tkc30D--s(^%0d%1If%9czf5FA24UnNOkL>V{#Z@gUQs{3le&x>!Al9}^ zMUksUuqX?N&PbN*pUpeA)fvrn%eK4nO_u9q9}b4ewVOVKuWmbF>_dZ}sMw1&d=b8g zw=VCG$a9KTF~B)prYmgs;w8FIaj+-};Lb|SVC%r8B^V|8gd=gfRChB&DWgZv)w&Fk z8Q_T=u*Fh`f3dDUU=6Kz^aCVWtdqPpyBf8FG)~ycKB-SusPhC}(Js*pS8~v%)m~DH z0L@l>TZ|>+u-sVM4)H@t>U=iS*N!f{c@bvp$a>3d?wcidb<8GP`24r;?F&GW4Fgw`M)hf*TWto9H$!@I))xS_*A&@xev^S}2S+6aUQI3{?^E?>h>(tb=XfQ7f*SK=SErbwwB|EN6#9CRY ztq+%O>UhD&@}oOuSMvjSH6Z%HF1JKu7>I)fzD}zY)r(D=rJHmgJ}f|3fXfO{kraP& ziKN;H12~v6NuxS%#=t@`Y9}{4_OZb@l7DXX!aG?bz@x4Nq zn7tuMCFI4nN!l=n58@VZ(kyEkwnkG$0hIAjjT;}QE$BMNL#PDBTpb2JX0`miCjcWo z>K<8>H@{vD7KuP)pYROKScK~Q<; zR2{PM$Qu=a-U3gKEUoL}xF4-=z=z;Lp=o|RCUFi(F=fg4nW7lC=^H4;DQ@HB03Hi} z3~V?2j5fRFWLd?cAvL4|&u#nWWy1wMk7jS;tca7r=nD*V!1jHvUe#sJp-S?(I9UaQ z4TpFG1l3$TwDC!jG#)kC5mQE!&A#DH_-x-n&YH zp*oGnJP>J`x~#`ZV2q;7gapTy^$M|Rbh`qEG+mwIbWfzo{rS4w0&-V4%U!t-M*7w@ z0^SEtqX}J)tK!7ADf1awUE)GDk{qf3jZNSv!%fx^)`gg}k80LNAwydvj;Etg)T|aB z35fK|jf|pcv3T?u1|8KRk}SZ);f#D-MAy0daumr3d9@+ymfKvu?R>7>Yk6x)_D-W} zM;g%{RN=la$x-qB-9y|l3gfopcqHylHyhb7x#)382uucvns$YQ!NicnCSAPSVm*E* z(b3sG%(5luy59V|HHYaeu}VDp$~)7@)hG1St|%W4c#JIH@L_nSKF)i)T2l;`0=4y; zUM_lKyRpk|ysu=|Q{274h4Uwx>S}9hQ~iE#==4cn#{P4yLGe|Qj8@WPGUsDwN{OKbOMO1Bo8eRMTd972ihUCi8eeSLEa1-Un{f)O;0BnixL>(&KyAk`quvm}eNwiV2bghD@IKk@)HViG1E0OCF}&v=VEYlOZFU`rirh3TwMj9hXPs z2aZLiBA42=#RJj!|35T23-b#CiC&5DpuR4Kx2)87p{wq*zy8JRdIcSkQ#<9GQ{U>- z5~&harf!d!8srsBe%E{%pwapJYXB281+plj^VR_VI{$Tl`g_@Vly+-+zIp8bJj7pw zzUWr)){t%ABp^0|T$#UhvokT@dHtz={5lxx<>IdUCiSti0a0z2nUQ0bncmDA0{0_8 z!Kqi=eTzLlS;hz3tsuPgAE^uZSoxbSUz>+{gMZ!F3G;zWKb5)8 zvVJb!9Y`NlW*5~dqg$pQX)%icu$U(T1(4DRH$^$yi)PMU2c6}=I`g1Q0+gfQ#Yz`i z4D@9{w=&~EnId*GTzok*HcqnlW&exVke6*Llqva8naifR@?udlUV^@4I=DFb+R+?x@f4u8+TbE`iQ0K{zS}(zOk8;e z{v4q_xlO{%1m=6bA0*34B7qn*%h41C?Y=I{6}E}nCU>196DMlfP7pUihqRXNNqe!H zaY?m^mFg(;omlV$-D<0b?aYzbj?(H^G9T8&wx21VN)g?i^Mx2@IK?jG6iX%|3;J*X z^myz>kI^q*=d5_w?*?T54ZFERmzK`;t=add=D4YYnaV�W-gOcvg3HE~xxq{zXX~ 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 IKGdgV1zXGahX4Qo literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-italic.otf b/docs/_static/fonts/overpass-italic.otf new file mode 100644 index 0000000000000000000000000000000000000000..19224a86dc1d636bfd9aa978d4c776a2718590cf GIT binary patch literal 72500 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 literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-light.otf b/docs/_static/fonts/overpass-light.otf new file mode 100644 index 0000000000000000000000000000000000000000..b060651a442a5e7fbe9425c4a7f0990b8ec6636d GIT binary patch literal 69324 zcmdqKd0bT0|37}t9cBh+bWFxU1&0}MS3tmh7g>}$W3|9d6AS`)P1mYDQ)7ORqC_ zq$y+liw0+m7?fDu`7qV_J)4|W=qOIV5&I!ygXS~V_=P;D zBind*)g?ST2k4%M4F7|EwJ1Ls_pS2^OJ{r&n3K#HZ^)QFv(Pc4n17IlN9;I2SL7&k zc5E;mefxjKSg)6gT_vSA-)F;sFX3lrERFFGaK!-{#%31&eq~bQzJD-{=3C^jbGeZn zeCf^B|DNZ!+pn!sQleb^yTX{Xj;A>Y{vatET1>WwF%>W7-x%m*jI|cbtG)RJzlkz_Y?5XuXpDS?7esHA;}783Db|}$N4+S} zOn@H;KHe}^(|8as`f#_Sst;ZHc-1r!{CAK~Z&;1^2x0jdDC zw{Rm_sSm)5aH|Jt{AJ*F6LcGoaoB+0YVd0&c-Wn#X{NHF3IwoLpi?}c9q=yFjJx>@ z(Ox6&;AbSp-VNeWP@!H;wk%(%!dhs%l$%lTQ2WilW=FFSpXUkR!TZ3_M5f_C-Ba5>kPfmK&8w_E`C`rae}Bade&S~9n?wC}E8bc4 zx5_UpmY>v`hchia-Q)0Y43tz-K9LRMpfF>8N=fAhex2EUxA6(dBiR9Fzj;&o>81{S zwB@t#a2Y-4H!%(>OEtpyi?{miP7eX}>(9D-uO;-~-+QfLEm)lQ+7G^cy!Tqmg4tB> zwGR1nz1Mn-bD8(rpBb5Nj1AB`q9dg*1M3I=s@Fzl;jO&a4Z-W4-s?v9tmMPJ*Cys{ z@{{-4%rXNqFb?k50Bscnyz0H?tfkrPy_T5C+}V4rVKL@@-fO>lWwflj+2zgGA%Cs+ zTF=tV?|QHOSzyy9-s=WzVAFQqYXh6rG}n7=WF4D+?!9ivVk}1Qb)(SU7GJ+6R^7eA zn|}|xr$?;!x(PG%81B6`v-Lg3#kq=Sy7P1MO6?o$F;UUo?Nesj)1BG&A&$~;ds0zW zq&>Evz^;@ivAdlmPItL8J2JK0=`MDZlq6HlE|F1DQGG}l`uOrAln1^$yK*Iytz*P}$cNAq)rlX+5Wp|W2 z@(UbO3Y_)|5DX+vj2&)wl=e1w$5fK#&M(GbO7aULUGCh@sfo!3gP|4vsfeT{q}UTv zQ!?$zNpT4&83}enJw)sg_L%PWMCTNDnZrF3q>k!gFhoQ|cpFGdPlz2hC^-S>I_av%V<`&Nm1TqV;r2pTc76^C0bzz7F%ozFl(JIf5W)pB?NE>cS5Ypd=nMBC zc9E;pUg9c%=**q$LzbLB!eNe@snP7uEzg#6c4I0n097TlA6i9FZ zA>u5Y;>^ybtJ|>vUY%WTwKr83(Oij77rf*JsiAX9Pd@u&r@1Jk*^4a=o3OnTk$N~Q zB&d519P?Zi5FfXKEDag>x}6112eqYY9*s?5fxUEQv6CdsOLVnew{v<~zT2rtAH>JY zVlV=E4zSawzI7^X&vpT8>daAG4CI&v?M3L07%>#s>)=0ouwKA);rzpOFGz!jKP{^4b=a9o}&(I*9R{ zN%y)J)y$=U$MwfRq*D1_QtZs~3bxw0-H}u3HI*=XUVm0n3Tr`h#aO8IR5-ExB1eJG zY}Rj^=tJfMwu0;dSbZBQN&AakMQ95`S7NWPNPka1>T{S+1HBfqexG-!P9f|L39%zv zQLIu|IM`j_EQKh9+et~vroa%DmQhBH*IH1%Vq#nc&KgBrRa;sQU7vNmWANa|OnX+I zqX;C)g_yYu9c2I9lubs`CxEw;fdtlG)=ZAb79b+ z|J03>uAtMou#SavUFyurE6UFTM=IR;#6NVe>RU0y7Hp`O`8;U6@~@1RfAi*i$D)2o#E71;bUlO|AnLIoGLp2_mDn zf7g^!C^C`40X&Lf4OH^phJaED7D%Y>rdtRE`8J<==Rka26@)BEmJLVcDk|x1FhqB-r#Ru}z3Oor>M%ua#R6em z`CxxO>cOFvfg^PiMAqJZOLtJ=PML;o`}~^MYoIM>K@K<*)8RkYyz9t(t=;k-^@*nV zvcLBkihz+%_Bsux1HM;b9mx@xsX9+Y35XCVUk!a>k`Z(%MyZsnSbaNRf`Y0$^V+p+ zyO*A1`AT6CBOLId2vVFgN`1yIudL8f6oK#}TZyx1>6I)os0U(_v4I0{yNccU6wnj` zNvKC%@j_=QDwZOw$afZGmngvi)uRs3#1vRDgjT8{2NHE2+y!L4b-XykpXI|=m*+bx zKof{Qbq;BDgF9Uy8m_;v^Y3|rYD)FLnrYQrz|5D}oimC-z5G%|r%MqGL6_<&pjY#J zm}I%!@aZtEip`6=#SqmAd3_2>zyx?La}h-?@Sda>UV8vC!WV%c6!DRVARAqbTCh$e z2&(&|L6g_)+ChnAs2ri~Rp~psRvxLrw`$z#mAzeu5X?b?y%7XD@kNG(u2R?pXHmAx z4Z4w{Wh2}u&BqOym^-xyMQ3C=ixqWtWKAn_RUmT8RSAB}212Ln;c+*d$w3o~>mlt{ zgGuBfg7^>Y0d2aew7G47UgJe!BnDAuoD{o2A*)xaVXO-<;KH&JC6=o1Bf$p*N?_by zLn74(DwVt>tY7iYIIO;2!j}HOkH2oC1PG+KnoM#vDX|oD-9GD@;)L0x2(JthL7XUe z18SbJJ*dS+7Gh~(IGd)kO}Y*Zznjd(Phl9ZB|j$RUmC1ApchT>Aw z#-t|=9+DZ3N}0&SOg%j|K4DmF`p|H~Fcm{iw<|>=fhF3oCyb=Z8AD=|lkG&1TW#2f zq$bCs^q>S_AB$;3F)!P;r5KQgt#QS z0O^v_6XJj%N`l-NJaW+zqKk}#;UkcNa=tFWgCPkD>cBY`|HqMhs3T6n2&tXS)O66m zi^`~^jD&D|Y24D?lR};|P!tMImP@zQh*Fqi4$G`<6hU6xH?;EdKga;TK?}^xD%uL zE#CRejZ`u zJIP5Ns8R|ZW+_**Gp;Qr`II%%txU00*N$TIzK3u6y zR8)EBqraVHpzj>uTA}dKiC)zb1-JE0l3xZq2xm90iAz*A16q)bG!=9pJnJ}nC-%g} zJ7qK)<0UXC{JmShK5U4N#lT3_!6`@!kW-=Pp+mvTSJHteC3r@1S`Ns^y#qR2px|49 zd%|6n;zVffaOJubTr?oRK1WMHdy>RrA72J%ZG^rZTqYnX&{Z4WZw?#RLfL` zR2?-vRkfVPkJm^PtjY3|#QW;07^=9Jql`)qvZOf*PDCAFS)z@qOZ3d4(5XVfk*qBB zZwF0Dld}{__KlA$BUxjT5z-Li3)vynBGt7|obq9!>XX_gc_pGl5$d{?x+MG5mrrM0 zUYgQV(%L%7QYC}>AP$md5;i^#{MDA!$62L~ig6k05l%!qqHh_lRjsF-LbOcxIo`aw zF{xuzc|tln1vN&8~cV=6&(pl7%H1)t2Q(n}N}S`h9kAE*}fT|efrqcv56 ziRyRK*2irhZU2cPcc-)3JK=M;`YIhMdZ++yWPRL`VT4bo>-JL_XYbicc|%tlS( z0MT8QUkC6j#;AxpYP-I1P}wYCREJBQee{irz%D26B^gwaX_^dbsmZ$ z+C=!m6hJ0`{9^_)*jwI;3;zB{Y(F*yz|BeHyhLKNDC5e0>(cTv)tCUr(P6^s18}5@6m8U)%Uf*`8 z*4%~iZq!iijBkWwXUHT3m~=vo8&tmda8E@G zG=n3mkr%on+WcF*>-R~%ON}dhvnVw(siQ&$=yAJMRDC~19ppFFISq}9MoGSk@V?U{ z{V($88|N_ebh{6{Er$Htar*dkHyf!+Cq405Vv2sK7oYCC6q`vUh(Z*X(G!w9pC>7U z45|?kd2MeAdsC$(MQv(q;VVz|)hLGa%!zV7{8Wn9=L$tDw^R4_GXKDN1xuCUq-)fV zDkbFoRqIO{N3o<2JGHbglB}bGDxLpH8hjR(?5`6Z$By43XcJjS8iP-EecX&yXhq)1 z{a~XHrw(7;Gb#*jO^rYsgemWO-Pw;;TGVsX(}rJtKMbMT0(%t;z(==$y)P9|zSa==Slu&?;FW zk_ewvPz>+0SH3p?nF54~+LIas(Y-I;ovGmAYm=U+JoI5$7xSsleD*-CM`OR6-J!B1 z`>KZ^JuXmM_SN>yt$k(4+x<1(RsviMVO&D(sV_thmm^vxW6l%>81 zUv)-B*Com<-GDU%^2aH_LYdLG9QdfG_C|O-)^I@&l zR;|h3#q$(xQj0WB-|UR!!8g}aqo>>D(--p*o+M`xNY!~LwM7c;%&~HAdDqs-?hv-rBc&>C zB#+sOzW8R1zW#h8P_dYzv`l`V;@`Sa5uJ%gcbkK|@Pu$v<3(RTx6@gjpAn6yUD8$Z zv?|3_z447)wXJTi?sV~54Vqj1lXm_udZPALCwu9@iAM7uqUqb_78F^jy8=Wk4^L!DVk0zumZv01msc}_ZoEN9a$n9}={h3fCdd^fNhWMwp zp+*6;7U%QBWT|~?E$ZCU=Pz!L4^(L++4e~Y)uhq-<`6zfp^_>seV&}COnmf>%ExKn zx>Q$%*MuucldnDBOz!sh@t;OrSF8RUrC#KAi;K6n`=9)fx-zHwVBbt#^#STg$cCyT zR5h18G4Yj&{qdDm*C75k?NMXWZnw$J z-*Zs)-FL=LDktt1IZ=7lO8&!4$Qu=q6c8U&nYdd#M-oDkK-?znP&MwqS)(9ad^Dyt zYqh7_rSR{1tlz#*y6Vpt{?1>j*5dyU>tBB_6L-#PGH=alQm`B2Tj%;udtJnB(kb%0 zWMPZI9o0to_*IUlwEjxcM7mYSgZi3wXVi0N6ixL=X4H6?OKV~|5_(;j<@ayJy^Q_vpOO<<#yJ`&I-^_Plz)b}vt(q3DF zw;a`=QH;PnT@Oa7LEipSP>cGd@-zb_t^re|srdEvdOKFsvf3YErqU%2V^DF9MccG1 zN^Ol%@T9fQO!Vu+lXe6N(^vpL8pbtAM;tIBO4E}xT&LqV75xxBsb#{7u%%Vg6woAH zNeAOOVW93XsNrk439gpL!jtRG*s6vh=0SuO_lCydv}h4#x+WzSsm3?IunM(ed^J-E>g#1>XUHx;X^V@vgFf* zI;xPC5hm0V@tW?a2hs$Rq*Tz9p82#;?Zd~%5lUTOt5olH`ueoRSI$?jZs+^27DAt|;=S zxq>=^Lgd}~{!KD^R^L!cQfz;c(kH#;;KUWxR_6ve=#BPq)s-;fsyc^IXSC`JiG055 zQz$B-l~9VkeQ^}EMr)Gfebn{h5~T$B7+P(ln(8|dcC6eIcS?{)(W1I4Q-P<{p7Iah zf8x79Cec|A_~27l>izmLoW2%R@-=WOl&|9+lxe^O3sh>dTdDW1DVSqMl&E1v)Fy?e)a&H%_`X(_8@zR zJ^%FB zU0@%vi|k|e3Hy{?VxO_g>~nkv{Ut{D75f@r$$rDWW#6&y*$?b0`;q;`erCV0U)eS0 z=SPQu%m&TrTix00CfD+Ad=SszS$qbsLDGGs-#af0h+d&4Vpcg10i!m zezRNbA@(qQn-OL2V()E_w^!QN*k23PhMGeIL&HMbhDL^FhE5D!5xOh%v(T@@q%d7r zEZw{bJnU>WXI#g-^EjT#v-wQ)e}dOa&C&m1 z^namV|8qjF+0FLmcDvGljJ?-g`_Bj+7rG>LTj<5m%ijK*p#K)P`p@?E&u`wm`6s>@ z{{vXu`bXcP)4zX1H~zg3aR0w^Z#1}Zy!NLrJYPJaKD+$v<@KMBx%|xK$3MU4^3}_& zEVym-jI}tj-J2yZa%1 zbD(<7E4bTL}GI1l?NEc-k9IRoA3Z`=1sYU2l8gTId8#(crb6ttvrO=xSfacFy4x{=52Ue z-j28D9oV-#f=BWw9?iQ#E4uR@;7>2!oA=>;c|YDCR@9FV-~)LqG$xM6^8}vA2lF93 ziQmhI@?<`YbeN|@n=<(bK9Y~(qxl#u5&Zlt|e z!VV&}17-urudG%9(#9ZRD!h&KWxy+dX8>!w@Eg*#Uf6(iofphVU-iNYr0cyv?NK=b z=o#cxg)K-od4WzZc+CqtkZ$(E??`b5lL9M|zTt%*kWzhurvYzzfpFRCg#e`6ywC*c zTV7a=bh{S_7aAwQ^8o6bfKFE0>4l$>zT<_)NOyUG`rPe>y+~;c1SSC86Ep(AJ}Gby z(*0hb{ttM8^4|5r$4H4c1RntodEo%k_WEGUYLdSLoZm6 zUho3R5si)D8vx-%#5xsa+<;E*Nh0)X@cvL=130?Co|i3%i-(x)nrtZ4#N;E*3pTNOBDOtV1+vXPoS zDsafH=70)hXG7)y<^oU9F$8#o{Dy1L&Ta-Y1rF~ag+3F&YcV^f!U9`vdBBizf9J~sBMg{&hQfe2#cOqS(0^fyn8vuFyAW~`zz~4nm&j1`e3cUz` ztZ>Lz=p_|MzC%A#f#f~(GT=*;flh>e1^61*`*F08qyqWvFr5nI1H&4tKz=){i3;S; z!va)bO_5qu;4dI;p#tI)78axe`P(qa1p&nuVbDDS^7&yyR3P6QHdzIVO~SGPPLz3- zu{N-S1mxe^z#tyk zFarV|`XhX9icr~(U=s&sA>hT4a0q6{V~SXa@N_nRj4$R-@#pzVd=rAlT?iUa@elat z{2TrQzs9d)0;!c6OHDD243j!Youmj%N(NwBk}Rc56Q!wAv2>sGptMk0A+3@&NpDEo zrQOoI(h2FT^pW(n^ovw0-PC9_2F*PhtH!R0&~(-G(Zp(!H5r;o8mDHOrb6?OX1->T zW`$;zW~1h9Oizz$PH8^WT+)1{`Bw9bMrdR|$*+N5W4}PZmVRM=?foMBy7=|<8{n7d zm*F?o&*7KrSLipxZ?@kfevAE{@_W&5jo)U!U494r4*MPRJLC6>-#32O{I2`m)atbN zXsy~-+K$?2ZEtO?c8GSkcC>bqHb+~iE!EzqeMtM5cB%GR?aSH?+O67M+C$po+H=}Z zwO6#iXgxYfXVjT>R$V(?XI)R-AYHO9LpNTRrJJfN(aq95sGF}_s(ViNl5V~34c*(i zy}I{w$8=|OAL%aZzR~@p`$Jc&*XkSU&H5mHsJ@*(Qr}hIM_;CY7)RJdMGfkuCSBAd z24CLdTUva^OyBU)MJ^qTgQF7YI=?6fXCRc$RLgcNDJv{g4(!Os$JO|ny8z#@XP0G_ z(&H|%y^8a3Toaw?pnTvyLur9N63%xN;4GRPl!}Ro>R#ZQg(D%H31x1V(rj$J10TWT zK#ABXZXC)I>%DR1;=B534keGuMaRX*IkIqmje3*dPz%H+D4AKxZ(O#k)RBermrCQZ z^4&OCC8q!%R^Q5W;6wm4kd@^?Z}G}+w)fiYa+GG()k#p1z*#PYST=qfr3nfu3Ab8H zP!YgkN5IOLEB(>BZ8zVq)5#xE6R1a z%L)q|Wu*y4xvu*6scK1;A~7zdf~%y!fiM1V31NJ6dc7{($^*B8k-J`gYF({#rAUeT zTSuJ?B_pFQqoiK-bfv+JdN~SC-MeID;ZP?WdZn-@dQhfPE)&czx$Qx0DY8b?8%_5Z z93ulc!6_9)i&CZD2xWjHlm{c|7_~Abql_*`)RU3;E@kzpq>`s=nOb5LOhUP{LjA29 z%_wDf70U0Zy6iDZxluT+3a2&Xm&{bF`EEzl?`Eu0cb4)?2VRsYV~*=J_LeY@scUy; z-6a+4GAOPvzeu$kIEby=tXp-am%;Rr^5Tq!>=JywUzDv>h>k%L6V)Tpk&~Yv)w5UE zXeB$QJ7q^lb;F4iP%NA-q1;E4A&rUd)|C>ZYNk>)CYo$*V)r=J*2YGuCA*YXxFWNQ zTy&&ZOt-i=oLlE~-pYuM=|0QpRtvxaD)~7$Oi8`K;bzK3N&XBa#Q`;HhEk`ftPo=< zcNQtns2j?0(m8!~)s;f1PN~{;T{XI*PAOHIrVEGL?ZP2FXhdy^@|2PE>Zu@Bci%%P zS_Yes8riOjBDI)GxL!nznCOIV-a^?p$OOgc19IiTAeE4ce~O77q|h^ZkV?-%Y7>Kc zswI0UNqnr@pjt9MPJO0k#>cBg2B}4&m9D1XfFbo>;c#?(f_kTRoDfwOod_?cR!qcA z*O(qrQOb#hb*F8NZ=W?@IYjXPcvzx(3?h4sf-N)lCMpplZeYeEr9IMR=_`#N*0CcsLp3Ry37QhkNzIpFm0Wy1u%Bx-k?)v`vM16)nTVJGi>u2g8&_AnRuYXOyMPH>qsXwFtR)5XE zfqx7CQ2!485&m8MhxiZoAL~Ea-|1iCKihw<|Kt8I_^c*!uB%v8JiWZ4c>3z{ zwKk(D_&^L7u_88B43`V!f>?RD94p6uAP*M>D-CkD4AD-63)>;lRdf^G4$1B0aM_k2 zca^)@OrqJBKa0Mif0wIrGr3upc5+|2|Cb#_vz3PM(HDeSwAgp{`|tPlm(6n1k^Li4 zzD>tXgAxW8PM;F8DpkAo&Fc00g5Nt>*4j2%zi!OL<&%Ru#*CH?HlyXZ_(|8wYTnnz zD(lY-zjpB5HCx^aky|}(iFNEe`N84Mr+2(tQTCdxz1~?cX3DT&)1qaImMsZdI&aA% z^B$c)@8J-6k{qIac;2IP7d*V+;l*?3HEbg$$yV*WWsB!82{!J2(cpP}=_>s9Qj4W! zODmREh>o?7H{bE1;d+{OkgjcQX=U2HRr6NPTiHTx>8a3;(#avU6?4lUDV1#vY*{a<$C1ZVJaHqsk{koma{bZ`G%6+_eSkSmh z(=$eneQirY$k@q75&Zi%VxaAUJZYG)IP{@I2e*+UhEBG=2l{sXWZRU98$%)tMvG{4 z=Gd`KwqdVmM^2lN+avgnGPYh;i?DoCBkmE+>_@`4*m`d2xA}vhBYU=fTJz4-oEJil zzob1jW6-YF!E)e$*cjRW&yhdo*gh@za6-4B9_bUK`lN0@>Iz9J(GGa^izHzPHbz)Y zmOoA$ynLjO5}+FP}w-#+F%9c=WR3o{s(TWiRx*GX{MXV6R^+La?e`az{k}TPbo?a*A-^6pmeL{ANhs38R zYg_3|meV@1;`#{fKplkb=FCxZSI&E3?h7qsi@2$c*NN2HhqWecTdVPy?q^ZGf>qq~Z#W>Dj-aEOU z)x38}mce{ua$o!`>17a27F2sKRr7DpeYsQEc6@nGm1*lLLyWzxxf`c%4>3km9(9$AmyU|&M~&-VT(x%HjMc@{ zE6R(fud0C7uM}FX=yg!e(dEhRw`OZsJ-=b~JHhX*n=)q9R7Y}l_Nq1IwrNweunxjw z5r(b5T*x={*d8JDwl%eW7N<2%SL?o!r`_f0Zy9IxjIZsl76R+8S?pG$rRu=`s;ZHD zh7B7zcG$23qpEEC{R*eAedCR_FK^iNN@;Fx$@FP9(Ebgb=r{a~++@UrvI)~dj7ioJ zs5`=7^vpd`+fL_c=lNK>ueK=3W6{@!*M6!sRaSexuQoywoYq90QE1+M{p_iISuzVT zI(KO?dzh0G+$X(C_|3M7Uvvv!TJZeSL84pF&*g@Lhq;D3LJpN=ZWt7tm9D1MsC!)V)^0e39-Sft4TX$_L7&*2ecbv`io~9j}*5TZ^~%vl+EdJoeav$ATYv zcL}2H;#=TT9`2mM){1+*v0UA8?DiD zzg1@%E9V~+ZJ#h0MH>+*h?(1=V&~r6_u8sC4?i1X)OcnE%9$RcXewH2d+X#Rd6d@E zQJ;{ny%Ap{9?)ODB6`Xfv_|=Jr{VV+jqy-I?XntiQg8IQujgrvMeZ`!jE5FH^)MP* z8hBABFZN6k8R8-B0G+%+{zWT(Nq`L!EA&Dq!XT%Uv`dyPTD&Ca$$3lW8WpDzB8tU9 zi|}7s_3o#^`!5#AHe2mO@?6D*5W0`m7-y~8Fz3x+)0G9ErX(6Ji>QEY*Zs^hjB>}y zDo^LC5!NFo#MBcSW>fT(B^B`IF0* zEqZ*>V~gNWn=BFf-J)-haR4?u)22CQ-WOu@EK4w2qBE`l+h+UEeRq6&R{m<6yi7mZ zHMVGUu*q_z>iEUW8Hf57xE{W*%w`;FIB2v?uo@@TT+h)bm@!HZCmcO?6*%pgtKRtEntRLjpnwvxb-zx$%LTjviUp(^uGxQU1 z__#yyl!I@tnqZaIi?z^Qq=3@s!2$>5~ec^SlHmG*#crC6mkR$sSP7_X-#7{#NNM^lcALDl6) zMPRkD#QJ-U@s$N9JjYKMH|ut+H69cf5AwZ7MW3S@G14erDK!}PieY=dI>^N;WW^cH z*cJ#la@_dc+3$>j>#XLTGV$7zSuI)~=fbbXsNJuF&E6^7aACBpv0CIz@utYsi3S^u z(+wtm@SNBQVvR7!Cw0bhaiUtRs5T122g1NbA_RxiGB#EypI}(hV+WL7t@oAvDJ*|t z6%&j8SYv&jc1LNk{}smPb1eMP#_D>kVe0VO5o^$c_O%9CX@wOFqHl6q3f-%05MoUi zOP*DnHa)QBd6Lr(-DytybLX)`$JvLR_SZh*w6lf<-_Nmy#__HVZS*=gUc{mIZAuue z!LL-$D2FYQosr~7Syp`j-_#0O<%yU^G{3WxL&60 z-A$$)V_G10GAxaAtXxlJ_}dk{v-@JbPXj$u(5OP*Nn z#p*AP>*uQ(f0^+$jAOy~CC1k>{wm|IGro@T^|UI_H){BsjK9J8R$7?n+h|Fizs0c7 zjx~6`Q^M*y-^chNS_0=EG5$W|2WW|%AECu{{vP9pv9hkg;r`e^!bUtlrJ+UTk7+rX zpXdBCS>%m^6V&lbJN0NiHT$Vp2YnCNliVAj!d`EJ?~`QVx@*F)5Ep zg$#erK`LNU36qMLRLmqdlggMho&MC2REj^M1R~-cJRJmVEmY`pEUw?gn<+#1b9@Wl zv$!U;!lJlKdKUA;T1_KmZdjpNi3RHy{Elg}G532_dr{X$H&~aX%=M<}w(CB@%x;l> zuYVK&ss7J4Xwo3R!Tk+3HaOPc3xmdxV$>M}jOE6MjH`|7jfairjo%ypXec%GZ`ib9 ze#7#Hvm0(})VNVdqliWW8l^Ov)#%YiyBZyCRMY5Jlfl%{lwry>xlNCozA#;DY;J68 z+^KP5~(M<}Qyw&7jlM?}90X+le z2W$#BY;IwGz`WSJ$9%#3M^nG10Zl`jCO3Vs=|`54mTb#(%WTUk%Vx`NOSR?4z;=PX z1Cs+M237`c3Oo>aF7W$iO`8pCHm}*0=7XDm*!+5nb}d%4xDpf-R2j4&=*6IqgRTT! z4R!`E4&EC4Vaqlx+qHbO<&Ku;t!=G^)*9+c~UA?-t+2-y{KCgfkXINQ^k>QtOqix3zx1^~bH{HVxY}Z_}pD;5H-LOl>o}&690bx7plgPn)VX=i6Ls^Ltxu z+oo+hwoPk0q3!)`A8qSt`>%FQ+I4If+iqIBjqUy0hqMoGKdAlv?H9IR+5YwR``Vvv z|3mxQ4u%fV9VT~}(&2E23mty!Xz19!W8aR$J1**Yvs05!)=phIjqJ3r)7za+b-EUA z4(}a4CcHTO?Ql;-NJL!3sEDG7M>N2Pa%^O7b*HOeo_9@RT4GpamlN!0eJ<553G+oJQLH%A|cJ`?>zOoNz^ znCO_qm{BnWF^|SP6SF0zs!Pi*;a%dojOvozWk#2|U2b-b>pHpX{atr-{k2=eZc*Km zx=ri0qT7}3_jHfzKE8Wp_ZPY!>S5^7yT_0o6MAgyak84JGggd?_+(&_o?pN zvTsP=$NPTL&)9EdzuEoX?cb!oxqrxj-2;vfI5ptI0apjq4s0~A&A{#hlLk&0SUK?V zfy)PO8n}Dl@qx9mjbq!z_KD4oEs9+ndoflFiXXIM(3LoCT-&&N2+jS{9MJd^NCVyncFiSrZpCVn;8JUDi+d+?sYH@`B`Wq0Ei0`Y#qyrVJ z0u<+K{zR;+voeLj6j3-i^H`rVIipZ)rb;mOTk z%Rf!lSt66D|X12eP(^yd$1P4e%n%lQvA znjZpd#3#Drd$ou4_m0tuFDdGk|IjCm(x&N8?AMxRBw9Z^D|VdKh!3tW4Kr-Hv9hC~ z&?=TkTHma_9By6YG>COI8c}e4X$M1(e@9q)SRb^CD9^bL2D#n8W4c(EuPzrItHqnu z!d8JW>)Vr>-_c`7k)jjb4-3CUV)021Ew#gC%D=+@^CxmjY4t1#at77*J1*6M3s*NS3&{`#$jXM-QE zwq#6MVfgw`ANd|RaMZvEo9P+r@u7wq&s>d1M}v_cxv|tT#JX6`)oaAtkyg2D?K#U3 zgOC;+oKWrw-YXIxwR)UYW@fHfQF*VmHnKL>a#UyD?dk2%PcVpMwZB<13`ZA;9&%*4 zXn4?*hT@Hn-d^~5wXi1{g;BR6-C7%cefit`>=DgbPnzY3r}q@y1cOO9ZZ#v=UJ-k7|?X8r}WzJ1o3jfqm>RD=AeC+&dvXdf5Lsx;fsu~>gV&eg4WWBr=_oBS{C zesk;DpbP1{2J{{`IsJi|wDgp%aq?jj*&%`?xF+d)$ zYnMDg#A?l}#X!-2%szR5JP^}H^G zpBBx;2+PyDjpCqI6voMgdh_MYwM#9J8{`?D1hHyCMZl?=n{3(~ye5=5hnb6yTu-x@ zw>2D(>8 zqEu|tCR3FQ)fT04n9hZ4 zQ+Wr`DY@EF{!;n%*44=(Ea0V#vq498Z^2?&fwEXO>tOoZy`O4fZZ_xRc)fY(oW6QlGiPXG?;zRm=jb1E zLOv}xKdwhmkBrG!IoqbLoSB2?tQmYJ?Z--glUQGAHSZr}HQ&rPgqZg$>m(uX`_UBI zX1?j0MdJxgq(e;GDys|2uZL6x>^iaHgvdCt_k{UvF|X3{@#WV~RoTq5FGOj-(8-NO zyKN_)IkNbj7D>AK?gz)0PQY~N-sYG0A9(kJpf840MRgvO*?Hu;$wvor|y%r)>+H5%eBcx#f^ULRkrc}Hc_(LN#GDk9~y=7dt^=*LHeN#q5Iyd=?b$j7Mi`s5$v zZgOdmJR?eORWv!o)bA$$o&?J>hlx=YTs(mO_Ia$9Q=JdKo&4pnLl>6(wz>2~`)ToG zS67#Q0P4crh_f zo+ytUEXK;?&+1H>);WgSW)IA^K0v~4rtvNCI5cvg-zlBPdi@e4(ey%+m7hN+E}z$k zQ!tDpc8RH2dK-`~GUTE1sEJr4Z!5>WC#Q;`SRW6XikWIVVO|HNvy0}h$&qp!+2V$_ z*=;8IB}^x4wq*%(faqCc-XeMi)?81Us575VDjQXv5NzI(C5(F0`~@dH7pu8v{5j2s zfu2bxYc0CxzdXP99RKsUXc{Dpy+4veWMhw{UgaTGF73$|cD(a_@YRFE2SoQC z*)`49cCf5TkmG_(vn!8_O~=II;{l#N=O%stH?$e*CmJcTywvqE*wc zzldgkcK%b=#}6-^l5cxS7}1GEwAku@P%lp$Ek|KzU|f(KaZxsih>-c!mgt1jUw?P< z)VDt!9UKuoG_jM-)M|D4^`=L-=m!tnFR(`Ugc!J9JR?Sl690E9*Q3JZd%3O^S%|pyrJw5&UkKKLZqj&e5J^Sw1eo14;^|zU? z$=Cg2hP?mdrK+>veODFNv%`?#F*ehz<>lhFL*k=qe*C032c1bkpA+|qFfmDt3lb57 zghB2k2exU8)pG6E?S=l_;a7HS4w)r4vdb;x;B0@P7n?2ZQ)<5Z`q-HtzOIRnju?`F zJsN0-2oR6WwuDnQBk5%qmYn7v^URUy2n~n$UIB|izmheAoF2MS9f6LjIb)u(8nJ8g-C$yEhX^)HxmXkt3f@qP11-xLaL$(u* z`a;$Hv%6)wX1%y+$$}@JSPBWgUz@Bme|X@5p4zH8j?Ke^Wqq71b!=Z9cj?gEukD8* zym4T{@=b*YgRh+X18oeJTZ)GAD0ws%{yWQVdAf*_1H=d$nwTj{E$O-2PhQ+{>cidJ zCnxn8KP16s8gAf6JX^>?=ajq(!>*bF>v26 z-~W*I{(u*4X3vQ=JNBOmx-#Y)xhL3v*dn(PkBYun#9Et@J|JT(qC)fUJLS(Ta=Lg~ zMC(MWHxgrq79`7hn`t9VVGRPr+RBdB<5-?MQ;l%5_MArTXpG^B8%->71J9XE!*DA_ z$T8NjuneElYB$~1h)>1L6Y@;#;e2zlHbQ55z(5O(X4rt*N=pZ;=^{#hc0wGYDE508 zk`;k-4f5wtTM^IF8gtjhSV;Q~dYD())3D)bYp%6kG`_|vhA%IFEyarQdq&roXIvi^ zcs(seFBjJ?nmc>m?76dB%zbv=vvZ%73q6aPr_zp9v2Lq=$?T=Gm(2Dz?-Ubj?-$cN z_b*-XG6Bg#ap713Ozy_gM+iQ0ofdxt#*;x@dblMcdtu2+eoD zj`)qD?d1ryy6bK$W*>LmZtYnS zH73nA>BN}aT?yJ*uBi`Y2b*Y(6}Vu5_4mMNt7!)K#e z_ZdtNTM=4{Z*l)^rKPoDU5WLeXPrju4&0{`4`bI8n`(V(Uz%I-Ncr6I7LTl+yZVt; za-8R-=Gf;HQ&IT3LnG1y+gV4KSa*0_8c$l_d7bR=_={oU6Kt8vt>u^HcH(8M&WjZJ z8+n3!L;HbFbP?}qO^Zsb%4}v`U=Qmv5GTwOY66E?<=Jvz_4UcsT<*_I6Ra$Wlc0@j~Blg*Po z_ltj9&g$e5;u>unWXRXFXLSgWW5n}XQ%^bJ0v5KP)I238SUgW&sC`mrdeE?1EYyf` zBMqhj)|FQA3|YJTJxv3>JJNgFSVtp#TWAfy)M?#0NYO!<-KH15#}0bmo4Bmb)&0SYx-nrgjo-vD-sC#@ICYpsTt1h>u8Ti3R4Pry3#cq(_ zSZ&padp(&04W>y}nj5dLF<%w4<$R0VYW~EtAVF`w+TQSxfqy;Ks`)x_vSD>1wkE#| z`1qUNFBr_fz_Qj_23pPE=GE2?hUU$)(!)=bhckp(c_=rzQDZTe4zrrysy#Ku&;~7F z0yzb7;vbmyLVdpvtiXh87Gj>s`$kt2g=W(K<~`TrVG6$03BLhn+9!?5o9qhNQ=rEUD>RWZOjrFCMmhMwL@xG~W?p*3H< zHKomTtT0?TNK@M8BL~3;j;%yXDh)4))s>d&t!v-hY?GJhYc^@kJFoWvF)vKeugiCA z96}rHb_BHjFLe}wwnf#J$T4R{bD=wMN-{UvE=7aamnb~5_$_JmXTp2Awn!^ZmlONZbIy(rFVH(j% z9@zye0=!22NxE-%*&y1SML7I9l=rZ{-y-M1?}HBM#XVWCBrXX#y=>d7q54(nyV`2z;Z5kX`0LkcHN2zfMpvF@D>6YjN*)|12W9Bx2HRYx9}Y>JmsKL)gZpr2Wde~hKdcA zMOJh1a|ZL4Q|FQ|1;a@T{dZhUco7=;#2^ExYPX68H{P(cGVEDB-{3jAp9|Mvp*gHM z5_nE`R3vG|THP@@Nqa^omtAkBeQV{0x84a-cF#wR9X8?B>@71x_H4Hly4P*qyk-sd z&)xa?CB@ThvY|HZ0qaJWbw`!whpK>@bK;2;Kxv=2I?B3shme*YKeF*?i#uN-=|-=a zI3{kiRlT8oFK^@_IUrb`*aeFP8FJitd7v2nfNfM#x&iah9BasgLd*`QS%+JXXB)&s zT8@$*#(GqY^_u|(p{bsI48C{CR`KGSPeKx}c;c>ain5wN=x#M%aT(0tiGDXWS>Q$8 zhD+bU?|<>4^$Xax4PKJ;ys;ae^*tznFIu-j%%7_Fu(cuCAO_Q_mw9&ejpEi; z+-@I<8?jcs^VmJ-LUI4wjb5#-1FV<6TWMYMqILRl%>MT?F(%HckluX%oYl40e6JMk znbQVEFFtHIa(w1i@zC*{H&J@mYVj}6PeA>x1HgUPY9N2#z_qnM`6}%mNR{^Q7mfC> zv~I%++u=FK&HD$6*F0w}=KXW(zwBT`KE3dO+5Vinyz^kL9QfM}y|3N8%y2bXc1n-{QqeC4!|ak z?C)L4l57bKScrgxB-05H0)&JX2)(z^d#|Z=VdGltLFRHs5c7&C6rwX1@5`sYl zPnSpNS!3seWTomY>EY(BAB-0C%DuT^y*2R$a`=*sa8+(m+v1mqI@h|F@U$uMr_p1s zl{E&U%4JW{glSeuJ9?~hhYb1yV^}lw#b?q%)zM-x>{X*rV03ey%TmD4r3rW57v%sG7?A)O2{45|lj~pF~ ze?{0{de)g!ZOC^e{wAy|p9Wio=Xua>2-{K7PpZW!ID{EX+POk1?47FUZeiGZYb<)! zF*d}NpP=KQW#Ie}I7di*ud^x81IFAeEzNNVmyz{PSgthQ#OefU4ql(3HQo)=!^^(j zAsY@9FVv)JcS{SQryePd_=Jrv5D&xl4{DAX(g@Q}pWb}foW%CJ(oJHV9*FdR>?56!d0oz4C88_{5mag2P~sV;uKTcPH)C zkxiev8?$?ZP?t@eJKEA>{4LBStA6>*dWUevcxymOnSflPMDl}xPK=NEs;4LUwyul@Lj^#@OzpS`!c9jx&7 zciDc?eD3(Rn_nFCTe89S(J{@wd4oCJt0He59y+Oz#^y6s2b&lU_Y&s?&2 z_A(4wquD~XQoPO9L&?S#nm)UD{>F{>FTVHQ(D%D{KR@&{yXS@?eWA!s-gtIH%}&bW zOgHvuiVi(1N!8KKF?okhes4(KdQGm%?rc<Qxq+Kk0tA078zyHP&x*<<>rXpO(J%166*lZCG12LuEsr#S3B!!_aScSY{9 zu*%=xW9Ba>Tzh+$-B^5WWMHcz%X>?5|}JhNPWlq=r8z~0Db zBd@ZWUG#FZhv0La|E7HiJ@id&1E{92WgLPQZeRAydD8-X z{a_#pWItbJm-D~nxJ=ijH@oQ5em32?eC+d0_92@!gTf{+8EQYo2BW;uO?9KBm@Vpx9BfCxKB`wpQl|L8> z#j(s41 zVLS87PvRjA@83ClC8UCYoA+*tOeIZ+(vSt1Sk_H>f%e0D8rJ=$Y}bDHH<&1ne@i2$ zcVlz46IyHJF5Ory?dW=_7|#uQQG&8*X^m0(rPi;*+UTW*tol`U@2Z${qbTd9x+suU z2bDhg8XAMfjlO|3ZIuCC8jQC;9N+sZ*?={yMs4NBa-%2hST$xS`269A_D07Gx-w5o z@%XEzH+x)p{=D$&gCDQ7X>-i}&ZL3un_HyeHQwy|)!oVVZ;$4G`@r(xlm2z<_8j=8 z-SZ?&)h=P)$Tg^v2Q;V!(4fBC4P(lf-q4`Fi>cIRd9n%0ngl3tq|0oW>2qDNCngA< zteWOaUGXgWJxvdtTtfOB3i1#kq*<(^rV#Jgdzub9$y2UYjM<$=-i$!Q5?H@Mm#S)Pf_kt}48*;BqFcVc%m9ktA_*rJi!4`OZm$ZY{3>&jIyw+ducShLG= zvul7l&p!I#ug#uy(H?W%)M?21pPuAj`sL?ylbY7+*+;d|YNu}}f)a6>I+gqe<4zy80lU9aL0FcsYJIkZO`eQTb4&{u$|SdTI|1Sf@SddIc@C4rMkIMbH?~BOiv54 zjnp|dY*L3SYYU!dmwsnIw8@GS3 z=8Wa$&V}#VVZT0SLWYl}<69G&HT!t%{iA0#Y}js>-PW6i&)jqN!kNuEJC8d;cG%z4 zEnYZw;Z&qipKZ-&SM$Xag)9P+U+7|ezFXJv=O1V48&4hD!S4C4HG|K<3)#LK#sioU z#p#Xn`df_~GW5m+v++L}|3~=^8r|E%CxTL6X~;YJ*7CTk(jHdLE9b_Kta`m0Om&lF z47O9MYudki$KE}DduGj?@9XQcZQcQUaPdPEtNruenAzS<+j#JxhONeY^eNP^tSK8D z#73DnbziKD2k{R|l;45wP*&Y)&uXKVpGtM048_`6LqdLzS)@A9l^QqhEB?vEd~|cL zjOM_)SFT3(fj&a=E)b>VX#eG`yXhu7Tf0_ z%kt&xZC7-wmiVulW*IR84cxk2|F5BfC{CTCKgot*>T)taF28L0;wSZ!)TZzEUnX0; znX!KUiY=aTTnnE;z3hjz2a|ViJ8m)h@rjKwTkhe8sm?e|b+VPI&gq2wqACGgCwaMs zbVw`5L6p8wVq(ptq3N4eY)RizD}CXLh3Sjgo5e$GdT!C5kh&TD+2|Udqr9nl z_78cb=}RpZw^m{$C0)}2w=noaxLp)(7Y~+ZJxQU~>zzh{9k@}TC;J{MVevU+jNZ8V zkj3M>%g_?+QVoF1HRAQ}>+kl{lggBp6s5J-v!|H7)Pt`wd10+co-@9X-ry6L$B^V+ z%+oVZOk3*d7wEsB2~Ody;}q!RE#niZFAw%Df<2k1?^tpi^A~nH?CL0|fiH9(n1tOe zG%k_m)sTb&`6O)E+g+2}LI1h6Kz``Z8uw@UPs*5Jk$pSM1JPN#eTroyzeC5<*X*&& zy2B>u|0Y@aR*MrKI2P}*7w^z5@tF}i!Q#pGVWFY>Ro3Y$w>pI0XGfUnUf%KR2kdd#({0zLy?^*^i(IQU->-46 z39GeE-_*5V$O~Pn@rjw?aX6V_d8Z$6%4wb%Q)kRn}(<(g2Ln?zBYmg6|DJj9!3Fzm zSg|0yQ2CL)^rTSqLyp-vX|4X`-yX7R*IBhkBHQy=&Ayc4OglGi+`e`37JT`4;R62+ zOLo}h5P7(BVV#A@M-TwU@{2biz+y6%-vMLpu#-jllj03&k(zA_GkvCI6WB``7wHry z$S*Z4l3h2kuJUy(vEyRbx$c8&0gR*t=<1Xc-kesVFI54vBl15 zFT`3>6tuA}(MMw`uh+$YUSz{ziz?hvOPVm#lY+B3d+bB^YbN=Qo!i&aVAS7!2(YtG z+AS9~@V(w^SqU2wHgCdymjv#+R{L~a&I9IQxp*pQ-d;N-{gqXXxZQOR`uc%|CUaSjBTrXu|Z$WJXg*mx=M(zELx)$9^rV zy(yxhMy_^~Rnskh%4~~apt+%4fykP$2w6G7ffLL7nl0*D!8CSkcwH~7A@4b9u zf^{m)hA4$uB`+perbI5pI=g7OemiZSt}`!VS{1B#Jc(vFhsw>7{Yb;Pk*4Po)iiN8|(h z`5$Tw*J~k3hq0Gx_5n?NNtAvZp^xEQ_ykMf6Y5c5uP5f|JsnoO{X9=}#GwbhD}COG z2Z!X%D*dEp9lAm9yjwa*IvMdJQpsSoRyx?7eCJucm_Mn)4zeyIt%ve8Q?$KWlS<3q zsnR;=YhAAYL>j7Q&>*#?C~|0ycojzBo#oJ0`kbRV_Yc~KYTubRa%7){dRLamHn)0i z`mTVL6o_BnVBbK%D*VoL`OMnghwKHtbI$a+~h_1;>XAkJ|F{N96YHr`b7e z)VjfzL8AiaPP6yPA3d_5w`Rd)$CzQ}A*)7joo?&Z>)i1CYZ|{pIU$!U1#YkRx&8c? zYoGu9$+eF4>-Oo~$nNQ&!AgIH53#Im(V?MMNnP>;)b*bAyDQ29#Tlj{8-D1;wv@E0 z4g!t>(KT^gwzp@H=@ zDuYd)h*`;-SJYBA)yRoGr~VEFxN~%mDH*JJMRD1F-n21;7wYAU()?xCHz<1Nvdu@x zW1}l)@{Qk0)d&;xV;^igbN>Syd#u9_zi%t-?;EY_J8#^?e!$}mY4cBZ`jvMf4Cr&*x%gIn>jph6(r8Kriw+QI@hSA0QThz)Io5(|Oc5v@>>17GWW!#zYXY5JH@%v*q4;AFb#Aj zce1&4bMf7#dSx9}*sH^Sz_(P*PE6|ovwb&HIZ0zIxYE0Ii~!pegCP&Vpey#E)1+-d{ed& zr8%rA8h=@jz4r0J&3pITjUf{;Av-OPIfIQZ_a8IE*#g%-m-()JF7I3aekBBakLY+d z$hZ|2vA(;)m$6ht!>mI|CukGjw-)AsBaVwxIO1g@W1}Qb03lP1i+RvR&WW>*BVFVR zi1tLrMTy1tdDMqLt<>K~b>?@~%TqZ6CGDk{d-Io{zD1wi)y-P`5-QDLBGdj($qh@X zu;a%pu|3MESKAO<+q>=S#UVs~Ke*KG$#3$c6f4MSV>lDbkj_ zFHq07FL^3sz$4z&y+HD*{4Z8;k1`t+b^{S;l&dy>uYP z5idPyJ@6a89{9L1BBCw}Zyk)YhJ9)*VRBKX3Ci7SAKm=k-b>qW%&Y+eNALgG)=O(F zX_ecJRkbCSY^G)ViPrmQf?EM`)&YfzF7z<9!HAOmCgWF*1y*Ib(LwkXvTykltBFPb zCtdYf(E4)>BmyCCZa)qsV<&mE>*5AaIq7Sb!zdUy9Ds`PXXPMSz zI515PXrP~HWo|DZ_T}FC$5~d1GV-N^9rD$WEV%$g9L*2NLz#^MYQt$}FoilQdkFyYkkRh)i z``j_wWP7ztor_J2Ikag}-d)I&bgbhL+5tIs z(Re=_tHoMem0SE%*TYBCwQv7?tP9eR&R1G|4m~b>^nvj)o6Bb*-(Z-0JWnrcO7={! zl1?4^@^MO#Cu|ZQNk3C2Dzc{dF=^E~Dn0t2KXpG=v*d{q5u*!6=PA7Z)hub{3W`x= z>h(K?w=w&-QwN+~lF7rvf4I}X8nycD;?I>ReApOh6(g>kEmS|Hu7H8`%kB1+){?=x z{tHG=ps|z(QkI^VTsiz>JLd&}*Gk5<)xXOp;w-cbcOjbqNf(5-OmHrsvja7-iXQBcZ}4?= zHoRn(2@B>Y9kgN|ZS{IkX!K9Q>>Yjw$qN=P5FN?JMT+Ot*Y%~UEdo-{Mc6ziN(FciJ_A{ovj*}7+8r7~a7y1aa^fnNS+tkvsbq0d?4 zU9uN2eiHZctp@rmeOZeDr4LZTGV@^}tF2fSu$@~*bK4&_7Zd%XgtQZ8`yA`}; zCbriXS*5MTGbzRaBzK)M>a<$wC&!vjr0rX?WuyC%1KA&4GZ%&S_;;K4zbxKVbFgmM zg1)a~Q}75UjU#>7TP$JML998+r?Yn-cVE9F^Wa%CyAF@jctdxyZpW+KGLu zfbYaEcAo;($#+-6t!y~wGaX7~%oZXcu5PowC>!MKVoq@}4}2YC&ml-L73>U8OlDPefUZ8~ld4HX*m znTdD3J|+GW^oMCfEVt2Wah6qA%(S`{%b@=dIcCYWC7-@{%#A_(&KiRRZV$3hAcK$~ z0Tv;P1(<{w105xqZpIUib_31065n}i=YL?s>zJwY{lg>OJ&~zr zTr%hn`ubg_vatU`ReWoLzI@lo3@XBKNV2r+q%mcBXh}#jYgquPDe+G)$ZE`E{oIa})bl&ZFQ~^*E2>_HV4}w{`uh zKT}258pSOT!kp8!v%Xfj$vkVp63Hje3kEWlYgshAJIj1{(#B}f1mVaU}`<=^T9{06Q z2kWU^KuP+Z#n8sh_>4bxC*C8+QfA3Eh;Z(r*X8CxMrkUQM==4!Jct_s-XQY$Sgr|6 zKzUJ_RS_fG?Mg*ojke0IO751~7a=M;P=G&fKq##$s%$DK9^0D@lMl$I-pnK)z`+fm zX{h@SKtS;cyTKLw;atNA4O|#J+cGBV;Bose*rE-^b|dBAOunhT zd+Yx9Nw3HyOi;!GF`}ZjBuai4;nB1~uhoh{6P4O_6$|LW0VohA; zUka+bg)0bEI>{iX97q%j5Tl<1seVtX?scHpP{yPXr<@KBSYHo2gg(S1jUf*(<{%6i zClv7MOgh%?A< zwWVuE&Yexu7mOe@|96?FnXcp(V!pv=R(9i=oC7)EZ?`SB$^|;(Hx2b;biL<~nMiUW z^hbRA81ZSI%k!Aehp?9AnPfiG^<;-CZRdj0B8cgYtbSH$7MG9)!hizCYbRRh%fbyN z6%>?YN-(bx`so>#OezjZ3p$>}8#M>l9U+{3#H)_SV6c4jL~~VMHOnz4fc0Mikk8%zVGb%y$*CNFm8@HvF=> zLC!B^F?7;F|w-)i@zZacAKTew46Ihwm_hGqCjtQbL?t zXN=S1y5hll%NOBYTqMV`f!;5?I+-wgzq6rFKxYXa`M{ImJ}pu!iO*Lr?ebHgddN&n8dSEex6(urzA( zkeZn*Hl%OMc9$FJTAo^%W7|^Hz;qyM@{m3Y-tW@S&YJ3&xNiF%o2T>x#+Mqo_h|7K z@-r8ZnT-~Kjm+`uTZ{Gbm-1GV@rmP2t5lcWH_@7~9j_?EPaHhQc*07{R1 zrI?Mz4x`*sp*?LRdjU%*F`u=RbgY>gm2G16zP|SCx_#7c&FlTzPHARo-SgmwzIHZG z+Mr|6%dzrUMebygd&wQKq7a8o7%g!E&tSVeSZa$CpmfJiUfue+<+H-s6A#+ucXgi6 z!?2AshuM`~tm8f&_p$MXqvAH!Umeb^sbh;v7wL^mz=qKm4(HK2qbB(7I2B+Ywn$_A z)iH4EnaQ7FZEp=nc`Wxx4qKMvg`K2QKSEnFP|seIPxZB)D47LBFM+3IjMekeDm|;t zQ)kQP0>5{~#AR=1;{A$CaUj);b2yNSc~1@Un>oO2l)XD&82+sdzVA}Jc2Iq+(r?JQ zm~$N4Vn+g3PAc}ro=HVQIjPQlvAarUb+EFzwgrP6^+ z#iNS{1km|cT`(G@E?l28=b8mi(h~UqP?(i$`w@ai`79mrUvxgrqd)G+bU5!9OoV9BGx={Fq!Oy4?I-lu8h_lxLNp|R(py1GuV4Kmcs!-gk zMsU`$b!*qGCgi|D$lblY16!JcR=Y9?Jj=oYZIWLN%5?S`WIAM3FmNN&RjYO`9^Dei zmr<_Q0SV#Yg_^8(w=QOJ|UOg$x*gc*BGjomxU$i z!_Wix)@$?tIT)L|hvj;);42sfHnQLv*tR_hySC%P)?(gl?P67k&r?o7&+3>%rvNp_ z>dv6B0eblyQhb>!KFU`=s*$ht*QX)DrJOdsazK;6u%Tg~xJMwkUqEkIC^$ zvtWwqIvPy-M@NInacs+4E8Fr)!Ppim8S4~KRyekWN>@}%DI2hsm5#!8_%JAdwa?*Y z{17|XwxE#5P{ z?3kblj|+=)m?P3+*F@T$j=^zzk6DwE#)e}wA(2tB5oX7#xRr4> zhGgSYQ{z*xkUeCf)m5ljHE=3gT8bSTnk$})hBMUS<7~2KTBZ~Z9}FD&sjKHYVB}nHrszx*|DwrS0i{4b)8y_iK{FBWLLu1&K&a zi%G{I*I@@8qV~f-pk|fairetwvC~vM`Lt3z3L=$a_EAcKI_TxoL=Wt=lOEXY z($bTlN-43RRETg00Z?5_iHI^$(kU1(ag3KZ#$vY&Qz6TPE!EDKp1^g9pkxkdF6@Hglp=en(PZx zbYyI7xV`agjnt~R#{fw!KOc$Ob>Wf@6{w{{u<9xvE1%Ty7GNdPYG{}{L;SX15m}FG zQl)EZ?3oyc9htJ&0DA~0kJNLlHefxfW43P!pFjVmn_SygJm{JT_9NT4lbQkjd^@x;%RN~G>_+Vg*8r~PU7tI{FWP=S8H{aYgIN0E6L6qr z9JaSi>S#J#?5E4v(b_uL8opg4`5rC~(k?xrk>U;)$7$D`AV%Vh;&08Erz!TEDg|rT zOwbg^O_k!bOK}r4Rr1w_`}ftCwJ4(S{(=YwH{#Ae9>TlH*AjR8!P2UW_5gq>E&U0P@YmlY0bWC3a_h|SZ%cjXcC zVbe9H@1vEky7B)?R$!OIkrvIDssvdZ4tV-X$|c=L6MiIuZZDa4T3IYevX894rtRX! z|6%84eG}(;b{PpVv5zd^Xq$thFb1&ac|Ye3U_-oEuWQ&vAhUQ^NC6=mu*!LI<)1m! z!PKI9AMDtYtIL%Ku*yw2lpE+|@dLt?z=jL}E{@2b{Zkri;venzw zgB4gga@IiS`D66D?3Jv|UN(GN_R5QEVs}NXT>re`Q?Hz?_*EBA#O*wmowhb~eR6ut z%G6!aD^~4FS+Vv^ct-Z&71z$D8~2XzI>yp;3UAv}IUE@X^ zOt&RsR*oe*Gci5gzI)rcRqHd>t*o_f<>pmu&6_60g&ncQrN^&~U+EqlnGha1>U`P~ zbBJH$@)(JUbQsUJvu2aIn`|Rt||zt zGc#9bhpk?NCvTkRmjYgAbijYTcKzDb*(vcU@oDxTM_5pdEj&IVVR@|k^7zOohht?} zklE-!jG(aa5VIpSDl^uGz;S6P*~Zw7QSQ9jBldn6lwmP?d*H;r4@~hJVzVN$++$WO z&qy*SCnuz)W@fBPk4=k8wT(C$o)MTGol+}0B`S?7J0mtTVO2tEQg(8s1~EEgRkzMU zd}Mr7lsP;xA|>3G5}h2G673$Bl!((elamrt67A_2&&}~^z-r#JdiUBLw&WGbD^{eq zr^KYCn=`YvuUKtEh}5(s9NB43OiD^jv~8TLiA+h0US-Kxxnji%`|6C<8EaR#uSiKr zOfx6O$0x;EqGDqbV&mOI0|LU9Sd1P*XJJ`H`pQWAN^J^G`?RcClbW{Lo|U#Hb##@XWI6XPv$ks*;j_Smq{m}QnoZDe#pN{l@wB|35WYIn41GBS~vn3QNs zOi4;fNzP19NlMRjPfbq10j-%aYaN(k2>AM9tRviRbi-Xl^0Jk-gqWyUOdG`* zre$Yt$l8?bw=6m_A=RF)#WbU;khUTrCe>~fI#(0o(i2vun>TFC%Ff7$2u~w~qLAiD z3|(Z7kByB(vEZW;BBK&g>?tWpS>~*W%rFY&)_G}kup=;Y#maDdR@CN%rRJEJ(70$@ zlrAD^d0Lch?V^l@sq@{p&C47Ei2iUn3kBHW+%wzw5@mYRcNVj_pxB4d+M zRwSiBj7nRRw0gC9Mcj(GxJW9sf9NE~+;OpMBP_Aev2phJwINH*MmG>vWNZ{w3Z3Qm zRN81tjZceAv7urUP`wFBmFlNPLw+;Ip&8>*b!fq+F{apr#AL{XvGx=+0mbbsB&CE$ zQ%!dkV&fB(px(lYKvOcPD**&nD?Tm;4o#O3pJYKmcj0i7iQd^$bn!6>NpbeXn55Xm zcpM0HdnFqq9%gUB68&w+CM!)WkqrjN^uFKl!}go)OFr>0Sa{8S=kkEni-s-qnL0jX z?_i71QvZ2j_T>vF$*Pc{?yt{oH@&S{ejSI-c(XuT1{-6N$8=*2_a=kXQ|#+=HO+FF zr{5=*ADP?fJ4fxSXJ}F!$q^3om{zh$?r!r8TP3BhVm(%UuvROtUwbe^SMK4?Jv?k1 z+mu%FNT_7EsxLHLO|Dd_Fu77?mRemZGGQAcKR>@0zTi6_Cz4(g?&C|IR(!>B7QTkL z8Q-3~CqBnlU>m5$sphLb#Lq1>3Zpg=!WZ-=t6XHx)nGvf0ypC?zrxZ?yByA?pJq}yVhOr zUempydlQ_P-`0JQ`!si7cYpT)oS2{LzS?~QPRu{ye#-q4&ddMS{h9keJ+vNGaZbM7 zqn<}Aj}9JPa8mwgkC`4m9&~1LyEl~Gp9bl% zX}X2RaHGtm{uQIUC3z-!srI)=|AO$8RfIoTLvXDike2libgV87tE?V2t6Q(pM_$-i zeh>Kro&4_k9<1iM4_2Q%U_&l{ZyluA1{uccHUv*O+z}g+-ohEha?i&tnX2%}_G3Hk z9d$is4wl=8+dgO0O|AQWisQy!J9F#l!HfQ*cG~55-H3U^eJ5Ky$5|l=(t+!SrZ|rN z-t`kVx7h#VO|PB4Xu_)4JrAtic=&+%#_*$E`V5~ue6j6ZkmkVJ-8(+8e7I@$teHWx z$JrN;)*61l_qpHKaxXT`ZaA=g_ntleyJyby_w)7L?svd$Xb6FG7TTwMv0Ds=+n6P_ zqA+$xZSa=dYL3-<7rR9VMh8a+)CxP_MsmZx4IBrStDFG0`A<)P+d?P6O?l-6ID_fb zo=uxJ*r)B(EO#soooAUpZ|xC-JdxQnsSz>B(U!>Q=&0!Ah~x;n;g1&BaMC_sVXLsT z_OlM>Vl%5IJvAjQAw3~ICM~s61B2I zUAvf_pQ1oQIBW@O4ZAe2M{%T1_U!K0w@vWw+_|=4b2MFc=S+Bt>HloE3A6T`JHGdW zlc#r2pEzQ+?|5vOw90iAn(L@PP}jiLx=owE^}vxG+YTPuHh;>@1q-I)u)nRx zao@1MgnpJ~xDLW$H%#)4(R%FWxYc6-ZTw2dfjBIky_tv49b^pCZybm-x|JXnp%kxgunwQqt@FgqtQxVAlCiqNeH!Mg8@pp?=qbygoXoRl?4Fv~ z@Yu*`b5v^d3Il5)8s2l6=;j;G7);;h=H32e)YWdj^THPg*tdLnIrrnW?m1}Ng^h8X zh1uNt!>&Krl5K!KAOlA@tdje4 zeRVAL6MS{$ZPuj&>me@(i7}5Itn#C0e#~9g$~X*L^F1(ao!t<=JSH(ZF&d|ohiM#1$)tiy$;?c(8+?`rE}mhT zbW&$9;k1!#GA_x7ZOL9bZ3L%Kj1RyW_yt;+D&=E2U$N<_HXO$c!U}OC*&lksLd>8W zvtViym<1^d2z>PbEfu22+4iVg18vT+8~4)w9Gi1@PBwPu82eY)pM$g70}S9_QPI(n z(aABX;9qwq|0wHZ_bK%|8+zzHr6;Cs+cxgmv2@#Xd&=Q$+gGj#O07A1&Z3DU%rmzy z+HNyodr*6;A!FJ6OkYd?NwdZ*vKy{UInQdGpK`^JbA0p-iy`s(R#xW;)3{%hHx6Ut z@eu(!sI4QMd|UWQxJOdPUi2(ilNVOe^ffB680rgW74=)$moJpqQB*d(dO5%hiX45mw8 z?YVQx{{Eh;qrS6T%iXyXV_0*&C#_g{u|%vZ8R+!aumBu}&zG^hSQ0HZ{m2Fx=*v1s z&IB(wWJ{WpvUueJcSBgZ)ljxI55|DBHP6te)eu<|FSm9#m~yq3*+oq=e2Zh?8mmFX z3H+{4`80ZagzRoNJozy9)|ZEeH8MaE-{C`pa+vPjX?nxH6SL?Xq?{e6cjj6QEqn&h ze!~xvcW*szF)TuT8wG>?svGLNnSsS)U$QpuJN^+3e2oVx8t7ecgCan=f0!%x9~$H^ zw)O)1?h%&YRAKAKlx7~n4 z)CGZmEBy?P%2x?ie1+H@e)z6CU>jjD;7DO2;AEVjk8|naL?IC0kQQ-Z{z||tbbdcR z*m(r-EI!&P;!OT)fS==g$s)exjI-PEh2avwQW2O%gIE>NDB1w)hz$W>7vBbKBlZC7 zEe-;FUmOcKK}5Rvemu_9hx|PsaFG}Vn1mzw)#3&mc&`?4ggf#JjF<(9V&4k?Rro5v zO}tehJWllI;i;^2>4m3i#O&U)|1iPRZ}OtKf;ZyhS6a&d8}O;pIzoHFqsy2c-a_wg zU50rJBf1R%oYt?)7;j<0fIqv*G;ls?P#%lW(D|elstL96*;ECmPVhn-HFiF^ zV^z;4Kl*qFoS9Jc1LJ%^n+ z?CCpw!CbLFhr>7=$Kf;%{Wx62VF-tj942zOlEdsdlNb1kTRGg#;Xw|Mad?`;Tn?{r zSis>e4!_{=?i}AazTyuYKH~5f4kZp>5>&ZysOPXMhc!5?%^})>xBdSH>Fj(JF#TWu z7eULEv;PGW1yeux@1O?MS{>BXT6mY&lPKUj2E3&0#eCek3-03g>VcIfy;lFVY|Bo| z6>DcDEo*l{i%unar{X#S{-Htt66+k}Z>>UiVW2P!pZc99%*7WyqQNuP2wU-C-&?{L z_zK8lp%`DNQ$Fh3L~Jc~6$hio`{RpsiAeMP(ig%4T%ypV6km=2d;#A#0N*TqR^d)9 zG%l5${z`~P2=O&)vq|Ymp;_rY;SKaWk%u6x1;AP$=*3N?+2ZEXo8p$zqvBRv+e$}> z+e-_?9iy3SU;?P7MqtPJboDbAyX&0*ZqQljqtc^*M^UqYL^a->c$-xP z59y3nn}ik%#0OFG!Ab83--zBKwNPJi99lS{^q`Ok{O{u$jcY9GSS{8ST8Z^>H56I_ zQwZ85vGjpZC{#hX2S{_0&{%vE*IVFVDtrp1y4Vsl=O*+m-6KxIH3iqS(mmjRH9?71 zTp^_w1V`x|;JF~A;{OX=Qt2I}G#n`nM@qxRK6vhj>wVPdXw=zQPAdbE2N9)k!T%j+ zd5+8PG(tVl2TCGb!2gS-CtW2%DXFwma7{yLsqC##_Eso6J{n?^P->y>!1|BSQXQ!+ z1WoCk(g&s4rC*ocEPYnG2Q=Qe^aXtG;Awm5LEOJ6y@%@p+KsL|Xt{f6wg34CTrZG= zJCqBgSMVxAq7I%v?u}NYr)SQ*P>%R}{_-yaDig5r3;o&oqvwD1E6)+n2i418&I9FN zNyC}?3!!?c?8?o*O5OF2(gc0uBKV*GN+{Hx)W zC(0RO@OI~S@^5RqV)=o&JogF$ie2W%^YAazD~m*Z;(z{?r~E&o`X3Pd=eaXoKGV`=3IOJe;jOw39D^ckz;Pnk|3( zM|Zs33T;=Q$G@5zq!)n_KH@d=0DVvCCwfRguD)AVKHd(_epI@uG!${Od0eU;a1pfE z1IQ`(QN5#ADYdEa24`O=O@glzqmws)dlQz5Wi0Ql<-SS?gnXd%cOJ{t7G)glH+YD0 z9#!;H(st#5=M^JSc`DqetiD&lz+2SUGs#r3vylTvDqnJAQ~=xfmX zozk=LtL~yMC4Olhr@VWpXOeVQaOxx;N$xCYw-v{;2jS4;IF@^*dANIqRHy~Fqa6x< zTRsK1D@XtOKl1iJ_Gh#cBmh?`wfO|@}<0*p2fLx2vH_^^{H0y@{QM5D3 zxpaSz3q&&yQ-d^rj2<|L3&!xXQsPlTvol11~2ZVQ@#KE^852&i>2)6~>AG z62o7L<|-dW!uVD}o<=)zZi=?ehU7+1^u9WtAA#Te$3K^RpirvPa<1OOQ{}yh_p%D9 zS43YiR~7yL;GTFS)nF~sIzcypDJ04zBhSzHT>*GUIqf`B_zQA&)5S}OlS02$1)=o{ z#|4f*{!v=IuU2^dYU{oFR3X@3y`?&*eDiV;?+2&H6UJc9vmW5>i;A2~!OuA<=#t*> zaAmv>JnIf`QQpQCX`o`xD$;btHuxhxQeLahv|r(o6|q*l$Lv{|&2vvG6#| z;m>{*^W_SIx+oiATz*I=5B?Z0aaZ=XVp>Y9S7tQjk^kadMZ7#k8q>b!HGU6sXPU!S zq4boTydsxYsgP9JJz{{vDsOnJQawSg<+w>2Ks`F&-ocx)(a7bC5WnNcE_`_Bl=CQb z1z!cbGamfW=YbnJafL%VJT0XpN=$wa39~$9!s&YV@6sv@_b2?NJf%M<56`J9t%~Wp z^7~uA-#znrE)V@DoalEk{tFMv`5#g3e}U@XMnMae(K-coa*MM5;jC|GYq_Xasl!)e zDoNoDm*9Du(w#DEQ^pD6G`|}Kf8S33Hq*`kzfHd)Zr%rem)3uZ`LBhewyK!+UyJ?M zLi17Zcl^(VgYym7Lxul;M)MVd{Qg!|nd?t$9jtW;vRq}9ku)=pz$L+f!K;3wX(1^W zVeqMG`k~$bG?#e&8>yW~Q2;&^T^d zhSAB%$~oL$$N*{!HBcs@Q@@}w^*@pWsfJ%oN~upkXI@@?TmDoUi+XZ$DWpd8o$S)- z)Kic??}g=Ie|z^zT$(H0EKPF8rS`5cr}%Bm-#;U#+e`6%@bVwZR8VmoDSv~!kv3&o zX>2*yL+Yd}rhG%5R>IP}mSg#SPDqX``~Ahf_`k#@8S=mQp%jn)jqLcRSUJ~wx10{p zs{bjU8w^^2mH^sU8e#q*7FwBR*<~}yS3*_iJ5Wj;G~{`RadX4APapGN%776wmFez7?N%>O9ZL*B_Tlr3<8bujOT( zfOgUFx}cW1BZ#_bIzRYTg3W;ni*R4yx+^>ozk;ptkK$w48~+L;2Cb@+%1c#KWmDBx zHBq%ty`y?p)m7D7H4y&8aE%eaQcY6LQ2D7Ar~(o1xhfR@AFBdYk*avaN>yd5vQ?W^ zJ8`#Pbp$>q#e1rAcz;QiueyPBD3zKV-webpcagwAF4O5KzRLw7KDj&aLFQGJfagb! zhj7(IJ{5=0y~EAmE)(xV%dR^V=atI~_-Z1(idTJJZYsM?^$o5jC`Ak8=eO7Q@Oy~5 zQLd+|7pSAn_=>%X|EK$bs#LYR+LQmUjy&yu<=U?rqdKWJtG($zZvnJ|x}mz6x|O;u z>h~N<5cr4J0@PxKi?^J!^{52}v2-jbMl2mgP=v(>TKp$|-A8dbN@;Fp0v!OxSzwBrLZqj*}4C6 z?$eEYM3KXH31W?ze5P<%i^H#Y$iDoo<0V-ZJ>>pPIIP3{?+|pWs-~58XP<(t4RphJ zhMiEwb|@XkV?^SO8huhHc);$d4eTD;!S<&EbR8XqPQrUaXGmXNg>JB9=ppnJdI`OS zK0;ripU__zfc51;u#s9UED-{*Rvsh-3rk@SwN*F-Tc~rehRTI4)aS5t_)_>v_!<^g z-wJny?}U58-(dT2U-&_I01GK56mbiwQWRe;YDAsr0V}D>VimC(?4(TMYho?Yf?Wu9 zv5r_zY#=s*#Z*)A4Y37QDQSe{mqJD29l`#1Y~saf~=l zoG4C$RmC)M2JEPOL_cvZEG!nlnrev{Co%_g&P-IANyXBP5FMVqLMm*id{| zoGeZir;GE&g$NUkOR4Msi<(|1tmn0TszPmF|NmIut^RV2|Lgh|1*Oj2F&0;Xo!uy5 zG%RJtq7KIk6JT{WS(qYBh2_k2VFqe-mM|MN>nr#Pb6}Y<5B7K=!ZIOL2ooHz#|wu& zUL;O(h!$dmSXd;)3kl!}NkX!aBBTmw!U`cBwl~?rMq#(GUpNeVz4P3%<0kC%UcgH4 zSD{#ViJej^(G3-d_!8XSxdOO>)F)Toui7myq#dpNEVtcf0XISiX7kh}k z#6Ds_aez1owtGXx;o?Yfv^Z8A4;wzE^=D)M%p7qZQGvKv3=o6FrQ$L%Ok6HTh*4s+ z7z?^^gPq$u!d_t??k$+dc!S33fyx>PErgcB`=G_4!f@=%IVv0zP76801>s^D1%3i6 z6NL(49|$@YVL$gKaSON_xX21{1N<%M=a7oHeWM$V)TBpZ*0%) z8@q$Pwg@A*ed9<_*+*z2vTq#A?Hk8)`^GuE_s-|`jf=Q_V<@+8j6{EJD5P@x#!PPC zxP{v{9^&?mC%Jv&MQ-1CncFvh%5?{;AT4XR0CXfaJ05~-wsZNa$^y)Bbh5O!cmB9)7Ag#V|RlpJZfd}-5GlDY?z+7}7oEJFc zAovW1s}3$1fII}kslhFSfH@e>0IsWqaB3WhQ;K%S4^Sj5?p8vr&E z8v(wKQCS$c7Pqk4uBoSj)3n$63~L9 zcLD4sb_47w_5|!L_C}uj!p_wIF5e$;pg0h4us9fSh&V*346Z*6aD+GlaFjSo@Wco( z25=ngwmdNsOaz=HPJ&I=6j&!!!Kg3|aF#ersEV<{2hdOS1Dq?)1@ssF0T+l102hgi z0GEhMglZT!0s(`?V89SD1Ta(#6^s~19Dw0sIBdHjF{03@s}ffz>)N2T2B53<@PqNw zAI|4Uu5tYoUF~aVPg;R^hjWD5u$QVMye+&1N~i@ZF)yS*RIL13qt&gzuEs@9`A_|* z{F(gRK<`@QL@3VPUt71zRE9pcKK23sPI;W|K!`m`OX!F{x`)% z{!KX-Z1PHOTq#xzMO3O>%^?L5tyC(z1dJ+LwAAmf7Tiw`)Y8jFaNR}N1r-zI%8llF(sWA?XMc&52X(2O=M_-u;r^aYD8L_9p zsk!u^hx{-TZ)d?(f*dg$`SgLS0(rt0{(f*q$Q5(Yqvpc7V@#O`AAdL#De zM#X5P7z6o22MHqq{)vz;43IEZq8DYuRfdeQ5&pa3szTP-k5mrBY4|9rhum=<_xW(u zxsARW63CAT`2tRaBtmk1F`Ov8gwqfaf``BXx`}RpT2Tw=F1ibDkW)|g@w5p)1qrWt%%iY);l(||9x72CqUz1SY` zT@jM~kDu zZO4jZ0U-;4BTp75gWFCOrvgsL&W0-DY;iWYr?2P>I7gfVI8U4hI3GJ6szF*>2%fuG zT#WkwF+lKwhRH{N^q22%6*ltDi!xjX0OA2~0IXhb<7HHG0C^=*!JP-^9yagHwKu(I1JI(JYsK z%70qhRetoW_)(9=xD4u1BPRl=&h@JV4quzQ`hai2xp8R5K8f1S%MMyKf(o^uBbxWR ze#A)?`~)jkaJ5kbii4#Kca}0AD{y&p=fXq(8zNQW)_P!3ehOyg-Zfg$>{t0!LhdU5 zTB0A*IHu(3b-b+#X9NAyrTmn(pl~GN(XS>P#ZfNuQGUwEq1?ODcD*bA-x7IMu1fqr zjS{b;oE0yq01<&Mq6ycfJXZ`y_X6rbz^F?$0Oc3?(M5jLI<0U=R^RkQd2_vY{U_Z3 z`I7`rcfU9_qn)s0Zhv9-N1|i+WKH z-bb9&gL6_3&PhEuCw1qX)I+Qx*1+4EVogA^Xa=k;)&_i2d=s3GWLuR;vaL#dOMDAH z#49~Guk_%&(u4C#56&w+xMZs4lBt?YrfM#ks<~w9#wAlXE}6P<4yfn6&%k+~f%85C z=Y0k)b!xfPspV3qj!T_7wBKu7mZ{8pv<}>hW>EFu+;}e&K|u}Bd)?|p^86}R+Ka?z+bI`BW|rY;&0@L=epb<^Rw50i?9(N zAX!eq%pZ^s<>%te0@|&d6Vp4Y2l^>_vXs50(ZV%il$V{PuJRwnb;VbFDJN7Wa;~(? z!@KVE$g6Ty<^M@9Wlkonz<+w8 zyt&@H{u38hxI2}*_A9w@rKpSpN+_aI<*JU+m1w1M*+o2`W*oo2%-l~6ny7eD4J)-w z)Lw<>tv0aHF1o(Bh*J}}Vu0iBl24(lEhHGmT&Z^k&lG zLA6|)AaXvc3lKS%)pCsh?W27kS_9Gos5q}xabBz9 zyjI0|t(x;%HRrWzKDT${yjI6&_->rz>i9h0jq_a{pY6MG?yEz8YzP|nKufrzKhZp! zT2hheX7ZMWJPub0{>pq?hbJ0Kwa&4W^hcF=o2vLIs^KlG=3}WFA4@fSEF~@7NTfw0 zY8Bq%Rk&ufGH>@P(2vdlh0?fMh0k#+^Er+(##VFE18M0+K9@1@xl9#K4^{ar#*mf+E%?X zGV_^^fzNdGe3Y)rX{;)zuBx1_s&cxj!s)6Cr>m-*t}xrde1~+jUYJMFe5Wd>sH&Wn zs&Xo-%IT*n^tJC`_R(4FjG0JRu`BLrM&k*+Z7w(RXG(^<@8gP&ucvS zyrwdr*LZS@Qf45|gsFKyQS%<6=6yrW^XkU)O8gjt7c_d^HL0)cH*bhk@x#7t;>XH< z^S2>c_9J}(-*rBa?>e8xcby0GUFWHM*ZFq7>-;p|b$)~II{%UHI)CZJ=Gt}s4s^Kv zxt}}gLfL!X4E56$HA3kUk5=}ezX82SH}p8g*R>bDIW$h)QEQ5?Yft){$X^fiNX6H+ zH@yXPU_Bv8DZZ{f>Mfy{>jl|L@pbK0Zw1cY8)Nya7WB`3uuoX=b?semjn%il zkjF+$p6s_srRC6*!x|jgIBdvaa}M9(uoH(pIULC0h-q`@%~4I@a2kg`9Qt#(gu@UH z!#RxQFqy-Z9IlzMVDePeMh!QT z+rq{E3*Gb_R^_k;hqXDZ%VA>4^i|8MO`M-zMm#RS0 zqp|P*{~gVPDZl>&w*~R>s7~{P$&ygn)pTX}; zj3|VVxi{zT&Yld*o!OaXrKdDR-hr6eV;~D=JApia-2QM~Aa%F@hg^cRei7l1Jx{%! zSSPcb$%Oj^n1=l}tB!dpbeu}$AvucsR4)IM+U#!VsH>j(8t6qsjnMQ(jJB8dsc9VH zA**=93q0Qy+FsR$Pp5!bZHL;}rdSwrrUPdQ=abDrJ6 lhFuHG@z62GMiVSkV38@7m_`4yV4Y#t;P(do-MhJ}{Wlv+JeL3f literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-mono-bold.otf b/docs/_static/fonts/overpass-mono-bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..f8291d926d984f94367ac8d9edfdf2b4c728432f GIT binary patch literal 95240 zcmdqKcYGAp`UgC-HQ7lvby0}PPDCOqCD~*XiiK1Nh6Ix!MMO8rCRs?bVRw@dL_|=; zh9DM-g5BL#8HN&!2d-nwD*C&wU(iBxFx&> zSeiVI-kF~cO%sGTT;}C9`-7pAHw(i-?;JG9f-q7reu|pNQF_TIE!V|d`kP=heuEa_ z-MW5tdim#@f6X@SGo_)gQ7}-eAQfLxF)n5s(dB z22g)}EcGRf0+NAq0Gfk%pi+l^U5mEzu=dmM>-|U;eF5T&=8Og|0O&roy#!nV>;!aL zn@}GKkjyH9T;NKe4Imn+EdbmHP#=gb3ZQ##AO;}$kY1?$9)RRd zWd%Sq5_I~BFP&DR>1?36iN0_UeZ>290M&Kch`w-8dpL-8((QPF=%Mk;0n#DqCRT$9 zCF$=0fb1m#AlZ=a$i_&{w*n#HTp%8xb!jcKE$VwCaH$6B6VAJYYZ^nkFav&|88{5+ zHgg&3B*#kx;ja%-rUGQkkD1;S+6br9I8QxCwkv&pLb5MDeRuX+Q53Ngb9uDYopmLISU89x6KeZEotc09v0cyVw7y^*q z%e8Bon{?m>NLQr*wNW|Yv}>J?@DhBVd>j4J0bMp^N5sSFCD{YnA+^&SnOaGHN7pWZ ze1d#ZFG()b!rEw#WdP}s{FBNefX31_*#XhDs#1FG& zt)%h#dQ`p+EC#LxNKZ!q@}rwz`*#9&p?(7}7_b4PFS56D0kXrizrjTqdmHYN4Xy?# zC#(m^kM0LHY1f;zHfsN0`&FZFFQB(p>enfB4Vxjmpf|H|8w=u18yKDHg#lK~�mw&4 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-mono-bold.woff2 b/docs/_static/fonts/overpass-mono-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..280570a46adcfdb48ea30406090fb0e3a4673509 GIT binary patch literal 20532 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 H`Gw0BF8zcF literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-mono-regular.otf b/docs/_static/fonts/overpass-mono-regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..80a4b839b76cf53992e7fdf51428d0194b48bf46 GIT binary patch literal 94520 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 z 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 PABx=cLXOA&yR`os%KIp- literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-mono-regular.woff2 b/docs/_static/fonts/overpass-mono-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..280570a46adcfdb48ea30406090fb0e3a4673509 GIT binary patch literal 20532 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 H`Gw0BF8zcF literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-mono/overpass-mono-bold.otf b/docs/_static/fonts/overpass-mono/overpass-mono-bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..f8291d926d984f94367ac8d9edfdf2b4c728432f GIT binary patch literal 95240 zcmdqKcYGAp`UgC-HQ7lvby0}PPDCOqCD~*XiiK1Nh6Ix!MMO8rCRs?bVRw@dL_|=; zh9DM-g5BL#8HN&!2d-nwD*C&wU(iBxFx&> zSeiVI-kF~cO%sGTT;}C9`-7pAHw(i-?;JG9f-q7reu|pNQF_TIE!V|d`kP=heuEa_ z-MW5tdim#@f6X@SGo_)gQ7}-eAQfLxF)n5s(dB z22g)}EcGRf0+NAq0Gfk%pi+l^U5mEzu=dmM>-|U;eF5T&=8Og|0O&roy#!nV>;!aL zn@}GKkjyH9T;NKe4Imn+EdbmHP#=gb3ZQ##AO;}$kY1?$9)RRd zWd%Sq5_I~BFP&DR>1?36iN0_UeZ>290M&Kch`w-8dpL-8((QPF=%Mk;0n#DqCRT$9 zCF$=0fb1m#AlZ=a$i_&{w*n#HTp%8xb!jcKE$VwCaH$6B6VAJYYZ^nkFav&|88{5+ zHgg&3B*#kx;ja%-rUGQkkD1;S+6br9I8QxCwkv&pLb5MDeRuX+Q53Ngb9uDYopmLISU89x6KeZEotc09v0cyVw7y^*q z%e8Bon{?m>NLQr*wNW|Yv}>J?@DhBVd>j4J0bMp^N5sSFCD{YnA+^&SnOaGHN7pWZ ze1d#ZFG()b!rEw#WdP}s{FBNefX31_*#XhDs#1FG& zt)%h#dQ`p+EC#LxNKZ!q@}rwz`*#9&p?(7}7_b4PFS56D0kXrizrjTqdmHYN4Xy?# zC#(m^kM0LHY1f;zHfsN0`&FZFFQB(p>enfB4Vxjmpf|H|8w=u18yKDHg#lK~�mw&4 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-mono/overpass-mono-regular.otf b/docs/_static/fonts/overpass-mono/overpass-mono-regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..80a4b839b76cf53992e7fdf51428d0194b48bf46 GIT binary patch literal 94520 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 z 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 PABx=cLXOA&yR`os%KIp- literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-regular.otf b/docs/_static/fonts/overpass-regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..3a7c095fab33942b0597fcbd57fbfec815c9a2c5 GIT binary patch literal 69808 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 D3Nx>f literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-regular.woff2 b/docs/_static/fonts/overpass-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f8133b0e93b133773ebac59b65d51e03dd620082 GIT binary patch literal 38728 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�W-gOcvg3HE~xxq{zXX~ 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 IKGdgV1zXGahX4Qo literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass-semibold.otf b/docs/_static/fonts/overpass-semibold.otf new file mode 100644 index 0000000000000000000000000000000000000000..176fb43ce14a23251c04318345785f99bf52f2c3 GIT binary patch literal 65704 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

  • v)3VY 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 jcI43x~Xx%sI!5oSY2S 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 literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass/overpass-light.otf b/docs/_static/fonts/overpass/overpass-light.otf new file mode 100644 index 0000000000000000000000000000000000000000..b060651a442a5e7fbe9425c4a7f0990b8ec6636d GIT binary patch literal 69324 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 literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass/overpass-regular.otf b/docs/_static/fonts/overpass/overpass-regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..3a7c095fab33942b0597fcbd57fbfec815c9a2c5 GIT binary patch literal 69808 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 D3Nx>f literal 0 HcmV?d00001 diff --git a/docs/_static/fonts/overpass/overpass-semibold.otf b/docs/_static/fonts/overpass/overpass-semibold.otf new file mode 100644 index 0000000000000000000000000000000000000000..176fb43ce14a23251c04318345785f99bf52f2c3 GIT binary patch literal 65704 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

  • v)3VY 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 zX`!ethereum.org team.'; + contentInfo.parentNode.insertBefore(footerNote, contentInfo.nextSibling); +} + +function rearrangeDom() { + const bodyDivs = document.querySelectorAll("body>div"); + bodyDivs.forEach((div) => div.remove()); + const wrapperDiv = document.createElement("div"); + wrapperDiv.classList.add(WRAPPER_CLASS); + bodyDivs.forEach((div) => wrapperDiv.appendChild(div)); + document.body.prepend(wrapperDiv); + + const rstVersions = document.querySelector(".rst-versions"); + rstVersions.remove(); + const wyNavSide = document.querySelector("nav.wy-nav-side"); + wyNavSide.appendChild(rstVersions); + const backdrop = document.createElement("div"); + backdrop.classList.add("backdrop"); + wrapperDiv.appendChild(backdrop); + + const content = document.querySelector(".wy-nav-content"); + content.id = "content"; + const oldWrap = document.querySelector("section.wy-nav-content-wrap"); + oldWrap.remove(); + document.querySelector(".wy-grid-for-nav").appendChild(content); +} + +function buildHeader() { + const isDarkMode = localStorage.getItem(LS_COLOR_SCHEME) == DARK; + + const header = document.createElement("div"); + header.classList.add("unified-header"); + document.querySelector(`.${WRAPPER_CLASS}`).prepend(header); + + const innerHeader = document.createElement("div"); + innerHeader.classList.add("inner-header"); + header.appendChild(innerHeader); + + const homeLink = document.createElement("a"); + homeLink.classList.add("home-link"); + homeLink.href = SOLIDITY_HOME_URL; + homeLink.ariaLabel = "Solidity home"; + innerHeader.appendChild(homeLink); + + const logo = document.createElement("img"); + logo.classList.add(SOLIDITY_LOGO_CLASS); + logo.src = getLogoSrc(isDarkMode); + logo.alt = "Solidity logo"; + homeLink.appendChild(logo); + + const skipToContent = document.createElement("a"); + skipToContent.classList.add("skip-to-content"); + skipToContent.href = "#content"; + skipToContent.innerText = "{ skip to content }"; + innerHeader.appendChild(skipToContent); + + const navBar = document.createElement("nav"); + navBar.classList.add("nav-bar"); + innerHeader.appendChild(navBar); + + const linkElements = NAV_LINKS.map(({ name, href }) => { + const link = document.createElement("a"); + link.classList.add("nav-link"); + link.setAttribute("key", name); + link.setAttribute("href", href); + link.setAttribute("aria-label", name); + if (href === FORUM_URL) { + link.classList.add("forum-link"); + link.setAttribute("target", "_blank"); + link.setAttribute("rel", "noopener noreferrer"); + } + link.innerText = name; + return link; + }); + linkElements.forEach((link) => navBar.appendChild(link)); + + // Flex wrapper for color mode and mobile menu buttons + const navButtonContainer = document.createElement("div"); + navButtonContainer.classList.add("nav-button-container"); + navBar.appendChild(navButtonContainer); + + // Build color toggle + const toggleIcon = document.createElement("img"); + toggleIcon.classList.add(COLOR_TOGGLE_ICON_CLASS); + toggleIcon.src = getModeIconSrc(isDarkMode); + toggleIcon.alt = "Color mode toggle icon"; + toggleIcon.setAttribute("aria-hidden", "true"); + toggleIcon.setAttribute("key", "toggle icon"); + const colorModeButton = document.createElement("button"); + colorModeButton.classList.add("color-toggle"); + colorModeButton.setAttribute("type", "button"); + colorModeButton.setAttribute("aria-label", "Toggle light dark mode"); + colorModeButton.setAttribute("key", "color mode button"); + colorModeButton.addEventListener("click", toggleColorMode); + colorModeButton.appendChild(toggleIcon); + navButtonContainer.appendChild(colorModeButton); + + // Build mobile hamburger menu + const menuIcon = document.createElement("img"); + menuIcon.classList.add(COLOR_TOGGLE_ICON_CLASS); + menuIcon.src = getMenuIconSrc(isDarkMode); + menuIcon.alt = "Toggle menu"; + menuIcon.setAttribute("aria-hidden", "true"); + menuIcon.setAttribute("key", "menu icon"); + const menuButton = document.createElement("button"); + menuButton.classList.add("color-toggle"); + menuButton.classList.add("mobile-menu-button"); + menuButton.setAttribute("type", "button"); + menuButton.setAttribute("aria-label", "Toggle menu"); + menuButton.setAttribute("key", "menu button"); + menuButton.addEventListener("click", toggleMenu); + menuButton.appendChild(menuIcon); + navButtonContainer.appendChild(menuButton); +} + +const updateActiveNavLink = () => { + const navLinks = document.querySelectorAll(".unified-header .nav-link"); + navLinks.forEach((link) => { + const href = link.getAttribute("href"); + if (document.documentURI.includes("contributing.html")) { + link.classList[href.includes("contributing.html") ? "add" : "remove"]( + "active" + ); + } else { + link.classList[document.documentURI.includes(href) ? "add" : "remove"]( + "active" + ); + } + }); +}; + +document.addEventListener("locationchange", updateActiveNavLink); + +function initialize() { + // Preload fonts + const fonts = [ + "overpass-regular.otf", + "overpass-bold.otf", + "overpass-mono-regular.otf", + "overpass-mono-bold.otf", + ]; + fonts.forEach((filename) => { + const link = document.createElement("link"); + link.rel = "preload"; + link.as = "font"; + link.href = `https://solidity-docs-dev.readthedocs.io/en/latest/_static/fonts/${filename}`; + link.crossOrigin = ""; + document.head.appendChild(link); + }); + + // Rearrange DOM elements for styling + rearrangeDom(); + + // Check localStorage for existing color scheme preference + var prefersDark = localStorage.getItem(LS_COLOR_SCHEME) == DARK; + // Check link for search param "color"... it may be "light" or "dark" + var urlParams = new URLSearchParams(window.location.search); + if (urlParams.size > 0) { + // This is used for color mode continuity between the main Solidity Lang site and the docs + var colorSchemeParam = urlParams.get("color"); + // If present, overwrite prefersDark accordingly + if (colorSchemeParam) { + prefersDark = colorSchemeParam == DARK; + } + + // Remove "color" search param from URL + const { location, title } = document; + const { pathname, origin, search, hash } = location; + const newSearchParams = new URLSearchParams(search); + newSearchParams.delete("color"); + const sanitizedSearch = + newSearchParams.size < 1 ? "" : "?" + newSearchParams.toString(); + window.history.replaceState( + origin, + title, + pathname + sanitizedSearch + hash + ); + } + + // In case none existed, establish localStorage color scheme preference + var mode = prefersDark ? DARK : LIGHT; + localStorage.setItem(LS_COLOR_SCHEME, mode); + + // Select the root element and set the style attribute to denote color-scheme attribute + document + .querySelector(":root") + .setAttribute("style", `--color-scheme: ${mode}`); + + // Remove old input and RTD logo anchor element + document.querySelector("input[name=mode]").remove(); + document.querySelector("label[for=switch]").remove(); + document.querySelector(".wy-side-nav-search > a").remove(); + + // Add footer note + addFooterNote(); + + // Build header + buildHeader(); + + // Close menu + toggleMenu({ force: false }); + + // Update active nav link + updateActiveNavLink(); +} + +document.addEventListener("DOMContentLoaded", initialize); + +const handleClick = (e) => { + if (e.target.closest(".backdrop")) { + toggleMenu({ force: false }); + } + + if (e.target.closest("a")) { + const target = e.target.closest("a"); + const href = target.getAttribute("href"); + if (href.includes(SOLIDITY_HOME_URL)) { + const url = new URL(href); + const params = new URLSearchParams(url.search); + params.set("color", localStorage.getItem(LS_COLOR_SCHEME)); + url.search = params.toString(); + target.setAttribute("href", url.toString()); + } + } +}; +document.addEventListener("click", handleClick); + +const handleKeyDown = (e) => { + if (e.metaKey && e.key === "k") { + document.querySelector("#rtd-search-form input").focus(); + } else if (e.key === "Escape") { + toggleMenu({ force: false }); + } + if (e.metaKey && e.code === "Backslash") { + toggleColorMode(); + } +}; +document.addEventListener("keydown", handleKeyDown); diff --git a/docs/_static/js/toggle.js b/docs/_static/js/toggle.js index 780ea9ee710e..6ea2dd1f801f 100644 --- a/docs/_static/js/toggle.js +++ b/docs/_static/js/toggle.js @@ -1,39 +1,47 @@ -document.addEventListener('DOMContentLoaded', function() { +function toggleColorMode() { + // Check localStorage for previous color scheme preference, assign the opposite + var newMode = localStorage.getItem(LS_COLOR_SCHEME) == DARK ? LIGHT : DARK; - function toggleCssMode(isDay) { - var mode = (isDay ? "Day" : "Night"); - localStorage.setItem("css-mode", mode); + // Update localStorage with new color scheme preference + localStorage.setItem(LS_COLOR_SCHEME, newMode); - var url_root = DOCUMENTATION_OPTIONS.URL_ROOT == "./" ? "" : DOCUMENTATION_OPTIONS.URL_ROOT; - var daysheet = $(`link[href="${url_root}_static/pygments.css"]`)[0].sheet; - daysheet.disabled = !isDay; + // Update the root element with the new color scheme preference + document + .querySelector(":root") + .setAttribute("style", `--color-scheme: ${newMode}`); - var nightsheet = $(`link[href="${url_root}_static/css/dark.css"]`)[0]; - if (!isDay && nightsheet === undefined) { - var element = document.createElement("link"); - element.setAttribute("rel", "stylesheet"); - element.setAttribute("type", "text/css"); - element.setAttribute("href", `${url_root}_static/css/dark.css`); - document.getElementsByTagName("head")[0].appendChild(element); - return; - } - if (nightsheet !== undefined) { - nightsheet.sheet.disabled = isDay; - } - } - - var initial = localStorage.getItem("css-mode") != "Night"; - var checkbox = document.querySelector('input[name=mode]'); + // Update logo + document + .querySelector(`img.${SOLIDITY_LOGO_CLASS}`) + .setAttribute("src", newMode === LIGHT ? LIGHT_LOGO_PATH : DARK_LOGO_PATH); - toggleCssMode(initial); - checkbox.checked = initial; + // Update color mode toggle icon + document + .querySelector(`img.${COLOR_TOGGLE_ICON_CLASS}`) + .setAttribute("src", newMode === LIGHT ? MOON_ICON_PATH : SUN_ICON_PATH); - checkbox.addEventListener('change', function() { - document.documentElement.classList.add('transition'); - window.setTimeout(() => { - document.documentElement.classList.remove('transition'); - }, 1000) - toggleCssMode(this.checked); - }) + // Update hamburger menu icon color + document + .querySelector("button.mobile-menu-button img") + .setAttribute( + "src", + newMode === LIGHT ? LIGHT_HAMBURGER_PATH : DARK_HAMBURGER_PATH + ); +} -}); \ No newline at end of file +function toggleMenu(options = {}) { + const handleClassToggle = ({ classList }, className) => { + if (typeof options.force !== "undefined") { + classList.toggle(className, options.force); + } else { + classList.toggle(className); + } + }; + document + .querySelectorAll('[data-toggle="rst-versions"]') + .forEach((e) => handleClassToggle(e, MOBILE_MENU_TOGGLE_CLASS)); + document + .querySelectorAll('[data-toggle="wy-nav-shift"]') + .forEach((e) => handleClassToggle(e, MOBILE_MENU_TOGGLE_CLASS)); + handleClassToggle(document.querySelector(`.${WRAPPER_CLASS}`), "menu-open"); +} diff --git a/docs/conf.py b/docs/conf.py index 7cd047a060f1..550fbf4b36af 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,10 @@ def setup(sphinx): sphinx.add_lexer('Solidity', SolidityLexer) sphinx.add_lexer('Yul', YulLexer) + sphinx.add_css_file('css/fonts.css') sphinx.add_css_file('css/custom.css') + sphinx.add_css_file('css/custom-dark.css') + sphinx.add_css_file('css/pygments.css') # -- General configuration ------------------------------------------------ @@ -132,7 +135,6 @@ def setup(sphinx): # documentation. html_theme_options = { 'logo_only': True, - 'style_nav_header_background': '#65afff', 'display_version': True, } @@ -148,12 +150,12 @@ def setup(sphinx): # The name of an image file (relative to this directory) to place at the top # of the sidebar. -html_logo = "logo.svg" +# html_logo = "logo.svg" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -html_favicon = "_static/img/favicon.png" +html_favicon = "_static/img/favicon.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -162,12 +164,12 @@ def setup(sphinx): html_css_files = ["css/toggle.css"] -html_js_files = ["js/toggle.js"] +html_js_files = ["js/constants.js", "js/initialize.js", "js/toggle.js"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -html_extra_path = ["_static/css"] +html_extra_path = ["_static/css", "_static/fonts"] # List of templates of static files to be included in the HTML output. # Keys represent paths to input files and values are dicts containing: @@ -210,7 +212,7 @@ def setup(sphinx): #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +html_show_sphinx = False # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True diff --git a/docs/logo.svg b/docs/logo.svg index 86b9f4995b24..19391843b407 100644 --- a/docs/logo.svg +++ b/docs/logo.svg @@ -1,27 +1,8 @@ - - - - -Vector 1 -Created with Sketch. - - - - - - - - - - - - + + + + + + + From edceb4d2d1ee40e47e73fb8ee3271047e57d002a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 11 Jul 2023 11:49:05 +0200 Subject: [PATCH 121/138] Allow testing FullInliner without ExpressionSplitter --- test/libyul/YulOptimizerTestCommon.cpp | 6 ++++++ .../fullInlinerWithoutSplitter/simple.sol | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/simple.sol diff --git a/test/libyul/YulOptimizerTestCommon.cpp b/test/libyul/YulOptimizerTestCommon.cpp index 64b19182ea42..7e2a4c9593fc 100644 --- a/test/libyul/YulOptimizerTestCommon.cpp +++ b/test/libyul/YulOptimizerTestCommon.cpp @@ -168,6 +168,12 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( FullInliner::run(*m_context, *m_ast); ExpressionJoiner::run(*m_context, *m_ast); }}, + {"fullInlinerWithoutSplitter", [&]() { + disambiguate(); + FunctionHoister::run(*m_context, *m_ast); + FunctionGrouper::run(*m_context, *m_ast); + FullInliner::run(*m_context, *m_ast); + }}, {"mainFunction", [&]() { disambiguate(); FunctionGrouper::run(*m_context, *m_ast); diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/simple.sol b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/simple.sol new file mode 100644 index 000000000000..80b975903ca7 --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/simple.sol @@ -0,0 +1,19 @@ +{ + function f(a) -> x { + x := add(a, a) + } + let y := f(2) +} +// ---- +// step: fullInlinerWithoutSplitter +// +// { +// { +// let a_1 := 2 +// let x_2 := 0 +// x_2 := add(a_1, a_1) +// let y := x_2 +// } +// function f(a) -> x +// { x := add(a, a) } +// } From a07f6c443ae6abe6b232999a7991929077dfb2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 11 Jul 2023 11:32:02 +0200 Subject: [PATCH 122/138] Tests for Yul argument evaluation order after optimization --- .../call_arguments_with_side_effects.yul | 28 +++++++++++ .../call_arguments_without_side_effects.yul | 49 +++++++++++++++++++ .../call_arguments_with_side_effects.yul | 27 ++++++++++ .../call_arguments_without_side_effects.yul | 44 +++++++++++++++++ .../call_arguments_with_side_effects.yul | 12 +++++ .../call_arguments_without_side_effects.yul | 48 ++++++++++++++++++ 6 files changed, 208 insertions(+) create mode 100644 test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul create mode 100644 test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul create mode 100644 test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul create mode 100644 test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul create mode 100644 test/libyul/yulOptimizerTests/fullSuite/call_arguments_with_side_effects.yul create mode 100644 test/libyul/yulOptimizerTests/fullSuite/call_arguments_without_side_effects.yul diff --git a/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul new file mode 100644 index 000000000000..5046bbb9d729 --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul @@ -0,0 +1,28 @@ +{ + function fun_revert() -> ret { revert(0, 0) } + function fun_return() -> ret { return(0, 0) } + function empty(a, b) {} + + // Evaluation order in Yul is right to left so fun_revert() should run first. + empty(fun_return(), fun_revert()) +} +// ---- +// step: fullInliner +// +// { +// { +// let ret_7 := 0 +// revert(0, 0) +// let _1 := ret_7 +// let ret_1_10 := 0 +// return(0, 0) +// let a_13 := ret_1_10 +// let b_14 := _1 +// } +// function fun_revert() -> ret +// { revert(0, 0) } +// function fun_return() -> ret_1 +// { return(0, 0) } +// function empty(a, b) +// { } +// } diff --git a/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul new file mode 100644 index 000000000000..1e2e86a20973 --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul @@ -0,0 +1,49 @@ +{ + function empty(a, b, c) {} + + // Constants + empty(111, 222, 333) + + // Variables + let x := 111 + let y := 222 + let z := 333 + empty(x, y, z) + + // Calls + empty(mload(111), sload(222), calldataload(333)) + + // Mix + let a := 222 + empty(111, a, mload(333)) +} +// ---- +// step: fullInliner +// +// { +// { +// let _1 := 333 +// let _2 := 222 +// let a_13 := 111 +// let b_14 := _2 +// let c_15 := _1 +// let x := 111 +// let y := 222 +// let z := 333 +// let a_16 := x +// let b_17 := y +// let c_18 := z +// let _5 := calldataload(333) +// let _7 := sload(222) +// let a_19 := mload(111) +// let b_20 := _7 +// let c_21 := _5 +// let a_1 := 222 +// let _11 := mload(333) +// let a_22 := 111 +// let b_23 := a_1 +// let c_24 := _11 +// } +// function empty(a, b, c) +// { } +// } diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul new file mode 100644 index 000000000000..b5214e8e4947 --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul @@ -0,0 +1,27 @@ +{ + function fun_revert() -> ret { revert(0, 0) } + function fun_return() -> ret { return(0, 0) } + function empty(a, b) {} + + // Evaluation order in Yul is right to left so fun_revert() should run first. + empty(fun_return(), fun_revert()) +} +// ---- +// step: fullInlinerWithoutSplitter +// +// { +// { +// let ret_1_3 := 0 +// return(0, 0) +// let a_1 := ret_1_3 +// let ret_4 := 0 +// revert(0, 0) +// let b_2 := ret_4 +// } +// function fun_revert() -> ret +// { revert(0, 0) } +// function fun_return() -> ret_1 +// { return(0, 0) } +// function empty(a, b) +// { } +// } diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul new file mode 100644 index 000000000000..4c0705bd35e7 --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul @@ -0,0 +1,44 @@ +{ + function empty(a, b, c) {} + + // Constants + empty(111, 222, 333) + + // Variables + let x := 111 + let y := 222 + let z := 333 + empty(x, y, z) + + // Calls + empty(mload(111), sload(222), calldataload(333)) + + // Mix + let a := 222 + empty(111, a, mload(333)) +} +// ---- +// step: fullInlinerWithoutSplitter +// +// { +// { +// let a_2 := 111 +// let b_3 := 222 +// let c_4 := 333 +// let x := 111 +// let y := 222 +// let z := 333 +// let a_5 := x +// let b_6 := y +// let c_7 := z +// let a_8 := mload(111) +// let b_9 := sload(222) +// let c_10 := calldataload(333) +// let a_1 := 222 +// let a_11 := 111 +// let b_12 := a_1 +// let c_13 := mload(333) +// } +// function empty(a, b, c) +// { } +// } diff --git a/test/libyul/yulOptimizerTests/fullSuite/call_arguments_with_side_effects.yul b/test/libyul/yulOptimizerTests/fullSuite/call_arguments_with_side_effects.yul new file mode 100644 index 000000000000..c8c969d8846d --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullSuite/call_arguments_with_side_effects.yul @@ -0,0 +1,12 @@ +{ + function fun_revert() -> ret { revert(0, 0) } + function fun_return() -> ret { return(0, 0) } + function empty(a, b) {} + + // Evaluation order in Yul is always right to left so optimized code should reach the revert first. + empty(fun_return(), fun_revert()) +} +// ---- +// step: fullSuite +// +// { { revert(0, 0) } } diff --git a/test/libyul/yulOptimizerTests/fullSuite/call_arguments_without_side_effects.yul b/test/libyul/yulOptimizerTests/fullSuite/call_arguments_without_side_effects.yul new file mode 100644 index 000000000000..fc36bdfa37a0 --- /dev/null +++ b/test/libyul/yulOptimizerTests/fullSuite/call_arguments_without_side_effects.yul @@ -0,0 +1,48 @@ +{ + function empty(a, b, c) { + mstore(a, 1) + mstore(b, 1) + mstore(c, 1) + } + + // Constants + empty(1, 2, 3) + + // Variables + let x := 4 + let y := 5 + let z := 6 + empty(x, y, z) + + // Calls + empty(mload(7), sload(8), calldataload(9)) + + // Mix + let a := 12 + empty(11, a, mload(13)) + + return(0, 32) +} +// ---- +// step: fullSuite +// +// { +// { +// let _1 := 1 +// mstore(_1, _1) +// mstore(2, _1) +// mstore(3, _1) +// mstore(4, _1) +// mstore(5, _1) +// mstore(6, _1) +// let _2 := sload(8) +// mstore(mload(7), _1) +// mstore(_2, _1) +// mstore(calldataload(9), _1) +// let _3 := mload(13) +// mstore(11, _1) +// mstore(12, _1) +// mstore(_3, _1) +// return(0, 32) +// } +// } From 5e1e0e7752f2c71eb0e07d5a9dc7d677e22366a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 11 Jul 2023 12:13:00 +0200 Subject: [PATCH 123/138] FullInliner: Fix order of arguments of inlined functions --- Changelog.md | 4 ++ docs/bugs.json | 13 ++++++ docs/bugs_by_version.json | 46 +++++++++++++++++-- docs/internals/optimizer.rst | 2 +- libyul/optimiser/FullInliner.cpp | 6 ++- libyul/optimiser/FullInliner.h | 2 +- .../call_arguments_with_side_effects.yul | 5 +- .../call_arguments_without_side_effects.yul | 20 ++++---- .../move_up_rightwards_argument.yul | 9 ++-- .../fullInliner/multi_fun.yul | 9 ++-- .../call_arguments_with_side_effects.yul | 10 ++-- .../call_arguments_without_side_effects.yul | 24 +++++----- 12 files changed, 106 insertions(+), 44 deletions(-) diff --git a/Changelog.md b/Changelog.md index 4cbddb3dd92f..4da52893ac67 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,9 @@ ### 0.8.21 (unreleased) +Important Bugfixes: + * Yul Optimizer: Fix ``FullInliner`` step (``i``) not preserving the evaluation order of arguments passed into inlined functions in code that is not in expression-split form (i.e. when using a custom optimizer sequence in which the step not preceded by ``ExpressionSplitter`` (``x``)). + + Language Features: * Allow qualified access to events from other contracts. * Relax restrictions on initialization of immutable variables. Reads and writes may now happen at any point at construction time outside of functions and modifiers. Explicit initialization is no longer mandatory. diff --git a/docs/bugs.json b/docs/bugs.json index 9c9780c93582..e8b8507fad44 100644 --- a/docs/bugs.json +++ b/docs/bugs.json @@ -1,4 +1,17 @@ [ + { + "uid": "SOL-2023-2", + "name": "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "summary": "Optimizer sequences containing FullInliner do not preserve the evaluation order of arguments of inlined function calls in code that is not in expression-split form.", + "description": "Function call arguments in Yul are evaluated right to left. This order matters when the argument expressions have side-effects, and changing it may change contract behavior. FullInliner is an optimizer step that can replace a function call with the body of that function. The transformation involves assigning argument expressions to temporary variables, which imposes an explicit evaluation order. FullInliner was written with the assumption that this order does not necessarily have to match usual argument evaluation order because the argument expressions have no side-effects. In most circumstances this assumption is true because the default optimization step sequence contains the ExpressionSplitter step. ExpressionSplitter ensures that the code is in *expression-split form*, which means that function calls cannot appear nested inside expressions, and all function call arguments have to be variables. The assumption is, however, not guaranteed to be true in general. Version 0.6.7 introduced a setting allowing users to specify an arbitrary optimization step sequence, making it possible for the FullInliner to actually encounter argument expressions with side-effects, which can result in behavior differences between optimized and unoptimized bytecode. Contracts compiled without optimization or with the default optimization sequence are not affected. To trigger the bug the user has to explicitly choose compiler settings that contain a sequence with FullInliner step not preceded by ExpressionSplitter.", + "link": "https://blog.soliditylang.org/2023/07/19/full-inliner-non-expression-split-argument-evaluation-order-bug/", + "introduced": "0.6.7", + "fixed": "0.8.21", + "severity": "low", + "conditions": { + "yulOptimizer": true + } + }, { "uid": "SOL-2022-7", "name": "StorageWriteRemovalBeforeConditionalTermination", diff --git a/docs/bugs_by_version.json b/docs/bugs_by_version.json index ce621f19546a..8f2ba181803b 100644 --- a/docs/bugs_by_version.json +++ b/docs/bugs_by_version.json @@ -1422,6 +1422,7 @@ }, "0.6.10": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1436,6 +1437,7 @@ }, "0.6.11": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1450,6 +1452,7 @@ }, "0.6.12": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1548,6 +1551,7 @@ }, "0.6.7": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1564,6 +1568,7 @@ }, "0.6.8": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1577,6 +1582,7 @@ }, "0.6.9": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1592,6 +1598,7 @@ }, "0.7.0": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1606,6 +1613,7 @@ }, "0.7.1": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1621,6 +1629,7 @@ }, "0.7.2": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1635,6 +1644,7 @@ }, "0.7.3": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1648,6 +1658,7 @@ }, "0.7.4": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1660,6 +1671,7 @@ }, "0.7.5": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1672,6 +1684,7 @@ }, "0.7.6": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1684,6 +1697,7 @@ }, "0.8.0": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1696,6 +1710,7 @@ }, "0.8.1": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1708,6 +1723,7 @@ }, "0.8.10": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1717,6 +1733,7 @@ }, "0.8.11": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1727,6 +1744,7 @@ }, "0.8.12": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1737,6 +1755,7 @@ }, "0.8.13": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "StorageWriteRemovalBeforeConditionalTermination", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", @@ -1748,6 +1767,7 @@ }, "0.8.14": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "StorageWriteRemovalBeforeConditionalTermination", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", @@ -1757,6 +1777,7 @@ }, "0.8.15": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "StorageWriteRemovalBeforeConditionalTermination", "AbiReencodingHeadOverflowWithStaticArrayCleanup" ], @@ -1764,24 +1785,32 @@ }, "0.8.16": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "StorageWriteRemovalBeforeConditionalTermination" ], "released": "2022-08-08" }, "0.8.17": { - "bugs": [], + "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + ], "released": "2022-09-08" }, "0.8.18": { - "bugs": [], + "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + ], "released": "2023-02-01" }, "0.8.19": { - "bugs": [], + "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + ], "released": "2023-02-22" }, "0.8.2": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1793,11 +1822,14 @@ "released": "2021-03-02" }, "0.8.20": { - "bugs": [], + "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + ], "released": "2023-05-10" }, "0.8.3": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1809,6 +1841,7 @@ }, "0.8.4": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1819,6 +1852,7 @@ }, "0.8.5": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1829,6 +1863,7 @@ }, "0.8.6": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1839,6 +1874,7 @@ }, "0.8.7": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1849,6 +1885,7 @@ }, "0.8.8": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1860,6 +1897,7 @@ }, "0.8.9": { "bugs": [ + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", diff --git a/docs/internals/optimizer.rst b/docs/internals/optimizer.rst index cd4624a1a13b..da72eed4eae5 100644 --- a/docs/internals/optimizer.rst +++ b/docs/internals/optimizer.rst @@ -570,7 +570,7 @@ It is not applied to loop iteration-condition, because the loop control flow doe this "outlining" of the inner expressions in all cases. We can sidestep this limitation by applying :ref:`for-loop-condition-into-body` to move the iteration condition into loop body. -The final program should be in a form such that (with the exception of loop conditions) +The final program should be in an *expression-split form*, where (with the exception of loop conditions) function calls cannot appear nested inside expressions and all function call arguments have to be variables. diff --git a/libyul/optimiser/FullInliner.cpp b/libyul/optimiser/FullInliner.cpp index 0482e20d62e4..16bfcf1250f7 100644 --- a/libyul/optimiser/FullInliner.cpp +++ b/libyul/optimiser/FullInliner.cpp @@ -38,6 +38,8 @@ #include #include +#include +#include using namespace std; using namespace solidity; @@ -305,8 +307,8 @@ vector InlineModifier::performInline(Statement& _statement, FunctionC newStatements.emplace_back(std::move(varDecl)); }; - for (size_t i = 0; i < _funCall.arguments.size(); ++i) - newVariable(function->parameters[i], &_funCall.arguments[i]); + for (auto&& [parameter, argument]: ranges::views::zip(function->parameters, _funCall.arguments) | ranges::views::reverse) + newVariable(parameter, &argument); for (auto const& var: function->returnVariables) newVariable(var, nullptr); diff --git a/libyul/optimiser/FullInliner.h b/libyul/optimiser/FullInliner.h index 5029abf3920b..3001453cbe5e 100644 --- a/libyul/optimiser/FullInliner.h +++ b/libyul/optimiser/FullInliner.h @@ -58,8 +58,8 @@ class NameCollector; * * function f(a, b) -> c { ... } * - * let f_a := x * let f_b := y + * let f_a := x * let f_c * code of f, with replacements: a -> f_a, b -> f_b, c -> f_c * let z := f_c diff --git a/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul index 5046bbb9d729..94b0c72d2934 100644 --- a/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul +++ b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_with_side_effects.yul @@ -16,8 +16,9 @@ // let _1 := ret_7 // let ret_1_10 := 0 // return(0, 0) -// let a_13 := ret_1_10 -// let b_14 := _1 +// let _2 := ret_1_10 +// let b_13 := _1 +// let a_14 := _2 // } // function fun_revert() -> ret // { revert(0, 0) } diff --git a/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul index 1e2e86a20973..747ac8084912 100644 --- a/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul +++ b/test/libyul/yulOptimizerTests/fullInliner/call_arguments_without_side_effects.yul @@ -24,25 +24,27 @@ // { // let _1 := 333 // let _2 := 222 -// let a_13 := 111 +// let _3 := 111 +// let c_13 := _1 // let b_14 := _2 -// let c_15 := _1 +// let a_15 := _3 // let x := 111 // let y := 222 -// let z := 333 -// let a_16 := x +// let c_16 := 333 // let b_17 := y -// let c_18 := z +// let a_18 := x // let _5 := calldataload(333) // let _7 := sload(222) -// let a_19 := mload(111) +// let _9 := mload(111) +// let c_19 := _5 // let b_20 := _7 -// let c_21 := _5 +// let a_21 := _9 // let a_1 := 222 // let _11 := mload(333) -// let a_22 := 111 +// let _12 := 111 +// let c_22 := _11 // let b_23 := a_1 -// let c_24 := _11 +// let a_24 := _12 // } // function empty(a, b, c) // { } diff --git a/test/libyul/yulOptimizerTests/fullInliner/move_up_rightwards_argument.yul b/test/libyul/yulOptimizerTests/fullInliner/move_up_rightwards_argument.yul index 7bc959ec8f58..1f777237ac82 100644 --- a/test/libyul/yulOptimizerTests/fullInliner/move_up_rightwards_argument.yul +++ b/test/libyul/yulOptimizerTests/fullInliner/move_up_rightwards_argument.yul @@ -13,12 +13,13 @@ // let _2 := mload(5) // let _4 := mload(4) // let _6 := mload(3) -// let a_13 := mload(2) +// let _8 := mload(2) +// let c_13 := _4 // let b_14 := _6 -// let c_15 := _4 +// let a_15 := _8 // let x_16 := 0 -// x_16 := add(a_13, b_14) -// x_16 := mul(x_16, c_15) +// x_16 := add(a_15, b_14) +// x_16 := mul(x_16, c_13) // let _10 := add(x_16, _2) // let y := add(mload(1), _10) // } diff --git a/test/libyul/yulOptimizerTests/fullInliner/multi_fun.yul b/test/libyul/yulOptimizerTests/fullInliner/multi_fun.yul index a5194457a408..b30078cb61f4 100644 --- a/test/libyul/yulOptimizerTests/fullInliner/multi_fun.yul +++ b/test/libyul/yulOptimizerTests/fullInliner/multi_fun.yul @@ -12,13 +12,14 @@ // let a_8 := 3 // let x_9 := 0 // x_9 := add(a_8, a_8) -// let b_10 := x_9 -// let c_11 := _1 +// let _3 := x_9 +// let c_10 := _1 +// let b_11 := _3 // let y_12 := 0 -// let a_6_13 := b_10 +// let a_6_13 := b_11 // let x_7_14 := 0 // x_7_14 := add(a_6_13, a_6_13) -// y_12 := mul(mload(c_11), x_7_14) +// y_12 := mul(mload(c_10), x_7_14) // let y_1 := y_12 // } // function f(a) -> x diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul index b5214e8e4947..3a297b9d5402 100644 --- a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul @@ -11,12 +11,12 @@ // // { // { -// let ret_1_3 := 0 -// return(0, 0) -// let a_1 := ret_1_3 -// let ret_4 := 0 +// let ret_3 := 0 // revert(0, 0) -// let b_2 := ret_4 +// let b_1 := ret_3 +// let ret_1_4 := 0 +// return(0, 0) +// let a_2 := ret_1_4 // } // function fun_revert() -> ret // { revert(0, 0) } diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul index 4c0705bd35e7..d3516f66cade 100644 --- a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul @@ -22,22 +22,22 @@ // // { // { -// let a_2 := 111 -// let b_3 := 222 -// let c_4 := 333 +// let c_1 := 333 +// let b_2 := 222 +// let a_3 := 111 // let x := 111 // let y := 222 // let z := 333 -// let a_5 := x -// let b_6 := y -// let c_7 := z -// let a_8 := mload(111) -// let b_9 := sload(222) -// let c_10 := calldataload(333) +// let c_4 := z +// let b_5 := y +// let a_6 := x +// let c_7 := calldataload(333) +// let b_8 := sload(222) +// let a_9 := mload(111) // let a_1 := 222 -// let a_11 := 111 -// let b_12 := a_1 -// let c_13 := mload(333) +// let c_10 := mload(333) +// let b_11 := a_1 +// let a_12 := 111 // } // function empty(a, b, c) // { } From ba3f9dd2a2056a5b9def06568eef19b28be74af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 11 Jul 2023 12:33:33 +0200 Subject: [PATCH 124/138] FullInliner: Do not include calls whose arguments may have side-effects --- Changelog.md | 1 + libyul/optimiser/FullInliner.cpp | 6 ++++++ .../call_arguments_with_side_effects.yul | 7 +------ .../call_arguments_without_side_effects.yul | 8 ++------ 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Changelog.md b/Changelog.md index 4da52893ac67..fa2ea9666896 100644 --- a/Changelog.md +++ b/Changelog.md @@ -30,6 +30,7 @@ Bugfixes: * SMTChecker: Fix internal error caused by using external identifier to encode member access to functions that take an internal function as a parameter. * Standard JSON Interface: Fix an incomplete AST being returned when analysis is interrupted by certain kinds of fatal errors. * Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation. + * Yul Optimizer: Fix ``FullInliner`` step not ignoring code that is not in expression-split form. * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. AST Changes: diff --git a/libyul/optimiser/FullInliner.cpp b/libyul/optimiser/FullInliner.cpp index 16bfcf1250f7..ebf82e763dc2 100644 --- a/libyul/optimiser/FullInliner.cpp +++ b/libyul/optimiser/FullInliner.cpp @@ -189,6 +189,12 @@ bool FullInliner::shallInline(FunctionCall const& _funCall, YulString _callSite) if (m_noInlineFunctions.count(_funCall.functionName.name) || recursive(*calledFunction)) return false; + // No inlining of calls where argument expressions may have side-effects. + // To avoid running into this, make sure that ExpressionSplitter runs before FullInliner. + for (auto const& argument: _funCall.arguments) + if (!holds_alternative(argument) && !holds_alternative(argument)) + return false; + // Inline really, really tiny functions size_t size = m_functionSizes.at(calledFunction->name); if (size <= 1) diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul index 3a297b9d5402..a89dd89137d5 100644 --- a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_with_side_effects.yul @@ -11,12 +11,7 @@ // // { // { -// let ret_3 := 0 -// revert(0, 0) -// let b_1 := ret_3 -// let ret_1_4 := 0 -// return(0, 0) -// let a_2 := ret_1_4 +// empty(fun_return(), fun_revert()) // } // function fun_revert() -> ret // { revert(0, 0) } diff --git a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul index d3516f66cade..8f903b48445d 100644 --- a/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul +++ b/test/libyul/yulOptimizerTests/fullInlinerWithoutSplitter/call_arguments_without_side_effects.yul @@ -31,13 +31,9 @@ // let c_4 := z // let b_5 := y // let a_6 := x -// let c_7 := calldataload(333) -// let b_8 := sload(222) -// let a_9 := mload(111) +// empty(mload(111), sload(222), calldataload(333)) // let a_1 := 222 -// let c_10 := mload(333) -// let b_11 := a_1 -// let a_12 := 111 +// empty(111, a_1, mload(333)) // } // function empty(a, b, c) // { } From 735326d50d0463290fdc18b786ab1566d8ce8064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Tue, 11 Jul 2023 14:05:04 +0200 Subject: [PATCH 125/138] Properly document FullInliner's prerequisites --- docs/internals/optimizer.rst | 7 ++++++- libyul/optimiser/FullInliner.h | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/internals/optimizer.rst b/docs/internals/optimizer.rst index da72eed4eae5..ab37872ffb17 100644 --- a/docs/internals/optimizer.rst +++ b/docs/internals/optimizer.rst @@ -1192,7 +1192,7 @@ This component can only be used on sources with unique names. FullInliner ^^^^^^^^^^^ -The Full Inliner replaces certain calls of certain functions +The FullInliner replaces certain calls of certain functions by the function's body. This is not very helpful in most cases, because it just increases the code size but does not have a benefit. Furthermore, code is usually very expensive and we would often rather have shorter @@ -1216,6 +1216,11 @@ we can run the optimizer on this specialized function. If it results in heavy gains, the specialized function is kept, otherwise the original function is used instead. +FunctionHoister and ExpressionSplitter are recommended as prerequisites since they make the step +more efficient, but are not required for correctness. +In particular, function calls with other function calls as arguments are not inlined, but running +ExpressionSplitter beforehand ensures that there are no such calls in the input. + Cleanup ------- diff --git a/libyul/optimiser/FullInliner.h b/libyul/optimiser/FullInliner.h index 3001453cbe5e..931315305c57 100644 --- a/libyul/optimiser/FullInliner.h +++ b/libyul/optimiser/FullInliner.h @@ -44,10 +44,10 @@ class NameCollector; * Optimiser component that modifies an AST in place, inlining functions. * Expressions are expected to be split, i.e. the component will only inline * function calls that are at the root of the expression and that only contains - * variables as arguments. More specifically, it will inline + * variables or literals as arguments. More specifically, it will inline * - let x1, ..., xn := f(a1, ..., am) * - x1, ..., xn := f(a1, ..., am) - * f(a1, ..., am) + * - f(a1, ..., am) * * The transform changes code of the form * From 0ab0842c2944680c3f92119ee4185822b9a63350 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Mon, 26 Jun 2023 17:00:52 +0200 Subject: [PATCH 126/138] Disallow conversions between declaration function types. --- Changelog.md | 1 + libsolidity/ast/Types.cpp | 6 ++++++ .../functionTypes/declaration_type_conversion.sol | 11 +++++++++++ .../declaration_type_conversion_internal_base.sol | 11 +++++++++++ 4 files changed, 29 insertions(+) create mode 100644 test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion_internal_base.sol diff --git a/Changelog.md b/Changelog.md index fa2ea9666896..723df4583466 100644 --- a/Changelog.md +++ b/Changelog.md @@ -29,6 +29,7 @@ Bugfixes: * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. * SMTChecker: Fix internal error caused by using external identifier to encode member access to functions that take an internal function as a parameter. * Standard JSON Interface: Fix an incomplete AST being returned when analysis is interrupted by certain kinds of fatal errors. + * Type Checker: Function declaration types referring to different declarations are no longer convertible to each other. * Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation. * Yul Optimizer: Fix ``FullInliner`` step not ignoring code that is not in expression-split form. * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 6308dbe3d19f..915440caa05b 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -3127,6 +3127,12 @@ BoolResult FunctionType::isImplicitlyConvertibleTo(Type const& _convertTo) const if (convertTo.kind() != kind()) return BoolResult::err("Special functions cannot be converted to function types."); + if ( + kind() == FunctionType::Kind::Declaration && + m_declaration != convertTo.m_declaration + ) + return BoolResult::err("Function declaration types referring to different functions cannot be converted to each other."); + if (!equalExcludingStateMutability(convertTo)) return false; diff --git a/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol b/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol new file mode 100644 index 000000000000..a26460dc124d --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol @@ -0,0 +1,11 @@ +contract D { + function f() external {} + function g() external {} +} +contract C { + function f(bool c) public pure { + (c ? D.f : D.g); + } +} +// ---- +// TypeError 1080: (117-130): True expression's type function D.f() does not match false expression's type function D.g(). diff --git a/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion_internal_base.sol b/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion_internal_base.sol new file mode 100644 index 000000000000..210211b287f0 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion_internal_base.sol @@ -0,0 +1,11 @@ +contract C { + function f() internal {} + function g() internal {} +} + +contract D is C { + function h(bool b) public pure { + (b ? C.f : C.g); + } +} +// ---- From f3fc19080aba715b44c22323fd5ffa436aa8274c Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Tue, 27 Jun 2023 14:52:15 -0300 Subject: [PATCH 127/138] Override mobileType of MagicType to null --- Changelog.md | 1 + libsolidity/ast/Types.h | 2 ++ .../module_from_ternary_expression.sol | 15 +++++++++++++++ .../tuple_from_ternary_expression.sol | 9 +++++++++ .../smtCheckerTests/special/msg_parens_1.sol | 4 ++-- ...odule_function_from_ternary_expression.sol | 19 +++++++++++++++++++ .../unnamed_type_tuple_in_inline_array.sol | 7 +++++++ .../unnamed_types_in_inline_array_1.sol | 2 +- .../unnamed_types_in_inline_array_2.sol | 2 +- ...word_from_ternary_with_type_expression.sol | 8 ++++++++ ...Code_from_ternary_with_type_expression.sol | 16 ++++++++++++++++ .../metaTypes/type_expression_tuple_max.sol | 6 ++++++ .../syntaxTests/metaTypes/type_max.sol | 6 ++++++ .../type_max_from_ternary_expression.sol | 8 ++++++++ .../metaTypes/type_runtimecode.sol | 9 +++++++++ ...e_runtimecode_from_ternary_expression_.sol | 14 ++++++++++++++ 16 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 test/libsolidity/semanticTests/expressions/module_from_ternary_expression.sol create mode 100644 test/libsolidity/semanticTests/expressions/tuple_from_ternary_expression.sol create mode 100644 test/libsolidity/syntaxTests/imports/module_function_from_ternary_expression.sol create mode 100644 test/libsolidity/syntaxTests/inline_arrays/unnamed_type_tuple_in_inline_array.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/max_keyword_from_ternary_with_type_expression.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/runtimeCode_from_ternary_with_type_expression.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_expression_tuple_max.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_max.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_max_from_ternary_expression.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_runtimecode.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_runtimecode_from_ternary_expression_.sol diff --git a/Changelog.md b/Changelog.md index 723df4583466..7b19d37c0d53 100644 --- a/Changelog.md +++ b/Changelog.md @@ -22,6 +22,7 @@ Compiler Features: Bugfixes: + * Code Generator: Disallow complex expressions whose results are types, built-ins, modules or some unassignable functions. The legacy code generation pipeline would not actually evaluate them, discarding any side-effects they might have. * Code Generator: Fix not entirely deterministic order of functions in unoptimized Yul output. The choice of C++ compiler in some cases would result in different (but equivalent) bytecode (especially from native binaries vs emscripten binaries) * Commandline Interface: Fix internal error when using ``--stop-after parsing`` and requesting some of the outputs that require full analysis or compilation. * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 1fc0a7e17fb3..02b730863526 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -1694,6 +1694,8 @@ class MagicType: public Type Type const* typeArgument() const; + Type const* mobileType() const override { return nullptr; } + protected: std::vector> makeStackItems() const override { return {}; } private: diff --git a/test/libsolidity/semanticTests/expressions/module_from_ternary_expression.sol b/test/libsolidity/semanticTests/expressions/module_from_ternary_expression.sol new file mode 100644 index 000000000000..7aa8a5caa886 --- /dev/null +++ b/test/libsolidity/semanticTests/expressions/module_from_ternary_expression.sol @@ -0,0 +1,15 @@ +==== Source: A ==== +contract C { +} +==== Source: B ==== +import "A" as M; + +contract C { + function f() public pure returns (bool) { + bool flag; + ((flag = true) ? M : M).C; + return flag; + } +} +// ---- +// f() -> true diff --git a/test/libsolidity/semanticTests/expressions/tuple_from_ternary_expression.sol b/test/libsolidity/semanticTests/expressions/tuple_from_ternary_expression.sol new file mode 100644 index 000000000000..c8a2ced2cc12 --- /dev/null +++ b/test/libsolidity/semanticTests/expressions/tuple_from_ternary_expression.sol @@ -0,0 +1,9 @@ +contract C { + function f() public pure returns (bool){ + bool flag; + ((flag = true) ? (1, 2, 3) : (3, 2, 1)); + return flag; + } +} +// ---- +// f() -> true diff --git a/test/libsolidity/smtCheckerTests/special/msg_parens_1.sol b/test/libsolidity/smtCheckerTests/special/msg_parens_1.sol index 6eb19e5e8030..6368eb2ddd12 100644 --- a/test/libsolidity/smtCheckerTests/special/msg_parens_1.sol +++ b/test/libsolidity/smtCheckerTests/special/msg_parens_1.sol @@ -9,5 +9,5 @@ contract C { // SMTIgnoreOS: macos // SMTIgnoreCex: yes // ---- -// Warning 6328: (46-71): CHC: Assertion violation happens here. -// Warning 6328: (75-113): CHC: Assertion violation happens here. +// TypeError 9717: (90-93): Invalid mobile type in true expression. +// TypeError 3703: (96-99): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/imports/module_function_from_ternary_expression.sol b/test/libsolidity/syntaxTests/imports/module_function_from_ternary_expression.sol new file mode 100644 index 000000000000..d97bbee3d372 --- /dev/null +++ b/test/libsolidity/syntaxTests/imports/module_function_from_ternary_expression.sol @@ -0,0 +1,19 @@ +==== Source: A ==== +function f() pure returns (uint) { + return 42; +} +==== Source: B ==== +function f() pure returns (uint) { + return 24; +} +==== Source: C ==== +import "A" as A; +import "B" as B; + +contract C { + function f(bool b) public pure returns (uint) { + return (b ? A : B).f(); + } +} +// ---- +// TypeError 1080: (C:116-125): True expression's type module "A" does not match false expression's type module "B". diff --git a/test/libsolidity/syntaxTests/inline_arrays/unnamed_type_tuple_in_inline_array.sol b/test/libsolidity/syntaxTests/inline_arrays/unnamed_type_tuple_in_inline_array.sol new file mode 100644 index 000000000000..21f112c5cf41 --- /dev/null +++ b/test/libsolidity/syntaxTests/inline_arrays/unnamed_type_tuple_in_inline_array.sol @@ -0,0 +1,7 @@ +contract C { + function f() public { + [(1, 2, 3), (4, 5, 6)]; + } +} +// ---- +// TypeError 9656: (47-69): Unable to deduce nameable type for array elements. Try adding explicit type conversion for the first element. diff --git a/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_1.sol b/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_1.sol index d00f818a7ef1..b848b7b12bdf 100644 --- a/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_1.sol +++ b/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_1.sol @@ -4,4 +4,4 @@ contract C { } } // ---- -// TypeError 9656: (47-52): Unable to deduce nameable type for array elements. Try adding explicit type conversion for the first element. +// TypeError 9563: (48-51): Invalid mobile type. diff --git a/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_2.sol b/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_2.sol index 0abd5ca25683..7f659209c5be 100644 --- a/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_2.sol +++ b/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_2.sol @@ -4,4 +4,4 @@ contract C { } } // ---- -// TypeError 9656: (47-56): Unable to deduce nameable type for array elements. Try adding explicit type conversion for the first element. +// TypeError 9563: (48-55): Invalid mobile type. diff --git a/test/libsolidity/syntaxTests/metaTypes/max_keyword_from_ternary_with_type_expression.sol b/test/libsolidity/syntaxTests/metaTypes/max_keyword_from_ternary_with_type_expression.sol new file mode 100644 index 000000000000..ce4a1262300d --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/max_keyword_from_ternary_with_type_expression.sol @@ -0,0 +1,8 @@ +contract C { + function max(bool isUint) pure public returns (uint8) { + return (isUint ? type(uint8) : type(int8)).max; + } +} +// ---- +// TypeError 9717: (98-109): Invalid mobile type in true expression. +// TypeError 3703: (112-122): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/runtimeCode_from_ternary_with_type_expression.sol b/test/libsolidity/syntaxTests/metaTypes/runtimeCode_from_ternary_with_type_expression.sol new file mode 100644 index 000000000000..b2b9b2adcb6b --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/runtimeCode_from_ternary_with_type_expression.sol @@ -0,0 +1,16 @@ +contract A { + function f() public {} +} + +contract B { + function g() public {} +} + +contract C { + function ab(bool getA) pure public returns (bytes memory) { + return (getA ? type(A) : type(B)).runtimeCode; + } +} +// ---- +// TypeError 9717: (186-193): Invalid mobile type in true expression. +// TypeError 3703: (196-203): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/type_expression_tuple_max.sol b/test/libsolidity/syntaxTests/metaTypes/type_expression_tuple_max.sol new file mode 100644 index 000000000000..c5a5e82c3c08 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_expression_tuple_max.sol @@ -0,0 +1,6 @@ +contract C { + function max() public pure returns (uint8) { + return (type(uint8)).max; + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/metaTypes/type_max.sol b/test/libsolidity/syntaxTests/metaTypes/type_max.sol new file mode 100644 index 000000000000..4d3b5886e391 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_max.sol @@ -0,0 +1,6 @@ +contract C { + function max() public pure returns (uint8) { + return type(uint8).max; + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/metaTypes/type_max_from_ternary_expression.sol b/test/libsolidity/syntaxTests/metaTypes/type_max_from_ternary_expression.sol new file mode 100644 index 000000000000..873b2e679b95 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_max_from_ternary_expression.sol @@ -0,0 +1,8 @@ +contract C { + function max(bool isUint) public returns (uint8) { + return (isUint ? type(uint8) : type(int8)).max; + } +} +// ---- +// TypeError 9717: (93-104): Invalid mobile type in true expression. +// TypeError 3703: (107-117): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/type_runtimecode.sol b/test/libsolidity/syntaxTests/metaTypes/type_runtimecode.sol new file mode 100644 index 000000000000..6b054b4dacfb --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_runtimecode.sol @@ -0,0 +1,9 @@ +contract A { +} + +contract C { + function f() public pure returns (bytes memory) { + return type(A).runtimeCode; + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/metaTypes/type_runtimecode_from_ternary_expression_.sol b/test/libsolidity/syntaxTests/metaTypes/type_runtimecode_from_ternary_expression_.sol new file mode 100644 index 000000000000..8fcf65480e12 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_runtimecode_from_ternary_expression_.sol @@ -0,0 +1,14 @@ +contract A { +} + +contract B { +} + +contract C { + function f(bool getA) public returns (bytes memory) { + return (getA ? type(A) : type(B)).runtimeCode; + } +} +// ---- +// TypeError 9717: (126-133): Invalid mobile type in true expression. +// TypeError 3703: (136-143): Invalid mobile type in false expression. From 4fd5bbf50b24c9457fa87a091101295b0fbde7fc Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Thu, 22 Jun 2023 10:56:08 -0300 Subject: [PATCH 128/138] Restrict mobileType of TypeType --- libsolidity/ast/Types.h | 1 + ...licit_conversion_of_super_in_operators.sol | 2 +- .../unnamed_types_in_inline_array_3.sol | 7 +++++++ .../metaTypes/array_type_from_ternary.sol | 8 ++++++++ .../metaTypes/contract_from_ternary.sol | 9 +++++++++ .../metaTypes/explicit_type_conversion.sol | 8 ++++++++ .../metaTypes/library_from_ternary.sol | 12 ++++++++++++ .../metaTypes/struct_from_ternary.sol | 14 ++++++++++++++ ..._expression_nested_ternary_max_keyword.sol | 8 ++++++++ .../metaTypes/type_from_ternary_condition.sol | 8 ++++++++ .../abi_decode_array_of_unitary_tuples.sol | 17 +++++++++++++++++ .../abidecode/abi_decode_enum.sol | 8 ++++++++ ..._array_length_ternary_with_max_keyword.sol | 9 +++++++++ ...ecode_invalid_argument_array_of_tuples.sol | 7 +++++++ ...invalid_argument_indexed_array_literal.sol | 7 +++++++ ...id_argument_indexed_ternary_expression.sol | 9 +++++++++ ..._argument_ternary_condition_expression.sol | 8 ++++++++ ..._ternary_expression_inside_parentheses.sol | 8 ++++++++ ...alid_argument_ternary_with_side_effect.sol | 9 +++++++++ ...abi_decode_invalid_argument_tuple_type.sol | 7 +++++++ ...ecode_invalid_argument_type_expression.sol | 7 +++++++ .../abidecode/abi_decode_member_acess.sol | 19 +++++++++++++++++++ .../abi_decode_unitary_nested_tuple.sol | 13 +++++++++++++ 23 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_3.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/array_type_from_ternary.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/contract_from_ternary.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/explicit_type_conversion.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/library_from_ternary.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/struct_from_ternary.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_expression_nested_ternary_max_keyword.sol create mode 100644 test/libsolidity/syntaxTests/metaTypes/type_from_ternary_condition.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_array_of_unitary_tuples.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_enum.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_length_ternary_with_max_keyword.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_of_tuples.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_array_literal.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_ternary_expression.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_condition_expression.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_expression_inside_parentheses.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_with_side_effect.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_tuple_type.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_type_expression.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_member_acess.sol create mode 100644 test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_unitary_nested_tuple.sol diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 02b730863526..fd1b6a7d3df3 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -1598,6 +1598,7 @@ class TypeType: public Type bool hasSimpleZeroValueInMemory() const override { solAssert(false, ""); } std::string toString(bool _withoutDataLocation) const override { return "type(" + m_actualType->toString(_withoutDataLocation) + ")"; } MemberList::MemberMap nativeMembers(ASTNode const* _currentScope) const override; + Type const* mobileType() const override { return nullptr; } BoolResult isExplicitlyConvertibleTo(Type const& _convertTo) const override; protected: diff --git a/test/libsolidity/syntaxTests/conversion/implicit_conversion_of_super_in_operators.sol b/test/libsolidity/syntaxTests/conversion/implicit_conversion_of_super_in_operators.sol index 40e9075e1fc3..234657a224e1 100644 --- a/test/libsolidity/syntaxTests/conversion/implicit_conversion_of_super_in_operators.sol +++ b/test/libsolidity/syntaxTests/conversion/implicit_conversion_of_super_in_operators.sol @@ -53,4 +53,4 @@ contract C { // TypeError 7366: (480-493): Operator -= not compatible with types type(contract super C) and contract C. // TypeError 4247: (503-508): Expression has to be an lvalue. // TypeError 7366: (503-516): Operator += not compatible with types type(contract super C) and contract C. -// TypeError 1080: (527-546): True expression's type type(contract super C) does not match false expression's type contract C. +// TypeError 9717: (534-539): Invalid mobile type in true expression. diff --git a/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_3.sol b/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_3.sol new file mode 100644 index 000000000000..78c5493e5f8b --- /dev/null +++ b/test/libsolidity/syntaxTests/inline_arrays/unnamed_types_in_inline_array_3.sol @@ -0,0 +1,7 @@ +contract C { + function f() public pure { + [uint]; + } +} +// ---- +// TypeError 9563: (53-57): Invalid mobile type. diff --git a/test/libsolidity/syntaxTests/metaTypes/array_type_from_ternary.sol b/test/libsolidity/syntaxTests/metaTypes/array_type_from_ternary.sol new file mode 100644 index 000000000000..b4f11310ce3e --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/array_type_from_ternary.sol @@ -0,0 +1,8 @@ +contract C { + function f(bool c) public { + (c ? uint[2] : uint[2])[3]; + } +} +// ---- +// TypeError 9717: (58-65): Invalid mobile type in true expression. +// TypeError 3703: (68-75): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/contract_from_ternary.sol b/test/libsolidity/syntaxTests/metaTypes/contract_from_ternary.sol new file mode 100644 index 000000000000..7f4f17552ef1 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/contract_from_ternary.sol @@ -0,0 +1,9 @@ +contract C { + function f() public pure { } + function g(bool c) public { + (c ? C : C).f(); + } +} +// ---- +// TypeError 9717: (91-92): Invalid mobile type in true expression. +// TypeError 3703: (95-96): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/explicit_type_conversion.sol b/test/libsolidity/syntaxTests/metaTypes/explicit_type_conversion.sol new file mode 100644 index 000000000000..3afd4d296f0c --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/explicit_type_conversion.sol @@ -0,0 +1,8 @@ +contract C { + function f(bool c) pure public returns (int) { + return (c ? int : int)(0); + } +} +// ---- +// TypeError 9717: (84-87): Invalid mobile type in true expression. +// TypeError 3703: (90-93): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/library_from_ternary.sol b/test/libsolidity/syntaxTests/metaTypes/library_from_ternary.sol new file mode 100644 index 000000000000..e1e147a15c06 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/library_from_ternary.sol @@ -0,0 +1,12 @@ +library L { + function f() public pure { } +} + +contract C { + function g(bool c) public { + (c ? L : L).f(); + } +} +// ---- +// TypeError 9717: (106-107): Invalid mobile type in true expression. +// TypeError 3703: (110-111): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/struct_from_ternary.sol b/test/libsolidity/syntaxTests/metaTypes/struct_from_ternary.sol new file mode 100644 index 000000000000..5d531d23fc0b --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/struct_from_ternary.sol @@ -0,0 +1,14 @@ +struct S { + uint x; + uint y; + uint z; +} + +contract C { + function f(bool c) public pure { + S memory s = (c ? S : S)(0, 1, 2); + } +} +// ---- +// TypeError 9717: (126-127): Invalid mobile type in true expression. +// TypeError 3703: (130-131): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/type_expression_nested_ternary_max_keyword.sol b/test/libsolidity/syntaxTests/metaTypes/type_expression_nested_ternary_max_keyword.sol new file mode 100644 index 000000000000..9e926738d2e8 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_expression_nested_ternary_max_keyword.sol @@ -0,0 +1,8 @@ +contract C { + function f(bool b) public pure returns (uint) { + return type(b ? uint : uint).max; + } +} +// ---- +// TypeError 9717: (89-93): Invalid mobile type in true expression. +// TypeError 3703: (96-100): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/metaTypes/type_from_ternary_condition.sol b/test/libsolidity/syntaxTests/metaTypes/type_from_ternary_condition.sol new file mode 100644 index 000000000000..b015641738c6 --- /dev/null +++ b/test/libsolidity/syntaxTests/metaTypes/type_from_ternary_condition.sol @@ -0,0 +1,8 @@ +contract C { + function f(bool c) pure public { + type(c ? uint : uint); + } +} +// ---- +// TypeError 9717: (67-71): Invalid mobile type in true expression. +// TypeError 3703: (74-78): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_array_of_unitary_tuples.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_array_of_unitary_tuples.sol new file mode 100644 index 000000000000..1f12fcf31f34 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_array_of_unitary_tuples.sol @@ -0,0 +1,17 @@ +contract C { + function f() pure public { + abi.decode("", ((uint)[2])); + abi.decode("", ((uint)[])); + abi.decode("", ((uint)[][3])); + abi.decode("", ((uint)[4][])); + abi.decode("", ((uint)[5][6])); + abi.decode("", (((uint))[5][6])); + } +} +// ---- +// Warning 6133: (52-79): Statement has no effect. +// Warning 6133: (89-115): Statement has no effect. +// Warning 6133: (125-154): Statement has no effect. +// Warning 6133: (164-193): Statement has no effect. +// Warning 6133: (203-233): Statement has no effect. +// Warning 6133: (243-275): Statement has no effect. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_enum.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_enum.sol new file mode 100644 index 000000000000..a44a65739291 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_enum.sol @@ -0,0 +1,8 @@ +contract C { + enum Color { red, green, blue } + function f() pure public { + abi.decode("", (Color)); + } +} +// ---- +// Warning 6133: (88-111): Statement has no effect. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_length_ternary_with_max_keyword.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_length_ternary_with_max_keyword.sol new file mode 100644 index 000000000000..f958f74f3107 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_length_ternary_with_max_keyword.sol @@ -0,0 +1,9 @@ +contract C { + function f() pure public { + bool x; + abi.decode("", (uint[type(x = true ? uint8 : uint8).max])); + } +} +// ---- +// TypeError 9717: (105-110): Invalid mobile type in true expression. +// TypeError 3703: (113-118): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_of_tuples.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_of_tuples.sol new file mode 100644 index 000000000000..3b5dc9059486 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_array_of_tuples.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + abi.decode("", ((uint, int)[5][6])); + } +} +// ---- +// TypeError 2614: (68-79): Indexed expression has to be a type, mapping or array (is tuple(type(uint256),type(int256))) diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_array_literal.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_array_literal.sol new file mode 100644 index 000000000000..6f481e0d3805 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_array_literal.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + abi.decode("", ([uint][2])); + } +} +// ---- +// TypeError 9563: (69-73): Invalid mobile type. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_ternary_expression.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_ternary_expression.sol new file mode 100644 index 000000000000..97b15f4bbbe9 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_indexed_ternary_expression.sol @@ -0,0 +1,9 @@ +contract C { + function f() pure public { + bool x; + abi.decode("", ((x = true ? uint : uint)[0])); + } +} +// ---- +// TypeError 9717: (96-100): Invalid mobile type in true expression. +// TypeError 3703: (103-107): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_condition_expression.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_condition_expression.sol new file mode 100644 index 000000000000..6e64de7235a8 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_condition_expression.sol @@ -0,0 +1,8 @@ +contract C { + function f() pure public { + abi.decode("", (true ? uint : uint)); + } +} +// ---- +// TypeError 9717: (75-79): Invalid mobile type in true expression. +// TypeError 3703: (82-86): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_expression_inside_parentheses.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_expression_inside_parentheses.sol new file mode 100644 index 000000000000..891164812968 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_expression_inside_parentheses.sol @@ -0,0 +1,8 @@ +contract C { + function f() pure public { + abi.decode("", ((true ? uint : uint))); + } +} +// ---- +// TypeError 9717: (76-80): Invalid mobile type in true expression. +// TypeError 3703: (83-87): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_with_side_effect.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_with_side_effect.sol new file mode 100644 index 000000000000..62592e429631 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_ternary_with_side_effect.sol @@ -0,0 +1,9 @@ +contract C { + function f() pure public { + int x; + abi.decode("", ((x = 1) > 0 ? int : int)); + } +} +// ---- +// TypeError 9717: (97-100): Invalid mobile type in true expression. +// TypeError 3703: (103-106): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_tuple_type.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_tuple_type.sol new file mode 100644 index 000000000000..317244a0940b --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_tuple_type.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + abi.decode("", ((uint, int))); + } +} +// ---- +// TypeError 1039: (68-79): Argument has to be a type name. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_type_expression.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_type_expression.sol new file mode 100644 index 000000000000..84640abd2a20 --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_invalid_argument_type_expression.sol @@ -0,0 +1,7 @@ +contract C { + function f() pure public { + abi.decode("", (type(uint))); + } +} +// ---- +// TypeError 1039: (68-78): Argument has to be a type name. diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_member_acess.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_member_acess.sol new file mode 100644 index 000000000000..5078fcdebf3c --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_member_acess.sol @@ -0,0 +1,19 @@ +library L { + struct S { int a; } + enum State { idle, running, blocked } +} + +contract D { + struct X { uint b; } + enum Color { red, green, blue } +} + +contract C { + function f() pure public { + abi.decode("", (L.S)); + abi.decode("", (L.State)); + abi.decode("", (D.X)); + abi.decode("", (D.Color)); + } +} +// ---- diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_unitary_nested_tuple.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_unitary_nested_tuple.sol new file mode 100644 index 000000000000..8da0f0a0906e --- /dev/null +++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_unitary_nested_tuple.sol @@ -0,0 +1,13 @@ +struct S { int a; } + +contract C { + function f() pure public { + abi.decode("", (((uint)))); + abi.decode("", ((((uint))))); + abi.decode("", (((S)))); + } +} +// ---- +// Warning 6133: (73-99): Statement has no effect. +// Warning 6133: (109-137): Statement has no effect. +// Warning 6133: (147-170): Statement has no effect. From 110e2a656da142bdec13f13bf06b9961cc074588 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Mon, 26 Jun 2023 19:07:24 +0200 Subject: [PATCH 129/138] Restrict mobile types of function types. Move ternary tests to semanticTests --- Changelog.md | 1 + libsolidity/ast/Types.cpp | 8 ++++++-- .../functionTypes/selector_ternary.sol | 10 ++++++++++ ...ry_function_pointer_from_function_call.sol | 19 +++++++++++++++++++ .../ternary_contract_internal_function.sol | 10 ++++++++++ ...ary_contract_library_internal_function.sol | 13 +++++++++++++ .../ternary_contract_public_function.sol | 10 ++++++++++ .../errors/error_ternary_operator.sol | 11 +++++++++++ ...error_ternary_operator_different_types.sol | 18 ------------------ .../events/event_ternary_operator.sol | 10 ++++++++++ ...event_ternary_operator_different_types.sol | 17 ----------------- .../functionTypes/from_ternary_expression.sol | 8 ++++++++ ...tor_ternary_contract_external_function.sol | 10 ++++++++++ ...ary_different_contract_public_function.sol | 13 +++++++++++++ ..._different_contracts_external_function.sol | 16 ++++++++++++++++ ..._different_interface_external_function.sol | 16 ++++++++++++++++ 16 files changed, 153 insertions(+), 37 deletions(-) create mode 100644 test/libsolidity/semanticTests/functionTypes/selector_ternary.sol create mode 100644 test/libsolidity/semanticTests/functionTypes/selector_ternary_function_pointer_from_function_call.sol create mode 100644 test/libsolidity/semanticTests/functionTypes/ternary_contract_internal_function.sol create mode 100644 test/libsolidity/semanticTests/functionTypes/ternary_contract_library_internal_function.sol create mode 100644 test/libsolidity/semanticTests/functionTypes/ternary_contract_public_function.sol create mode 100644 test/libsolidity/syntaxTests/errors/error_ternary_operator.sol delete mode 100644 test/libsolidity/syntaxTests/errors/error_ternary_operator_different_types.sol create mode 100644 test/libsolidity/syntaxTests/events/event_ternary_operator.sol delete mode 100644 test/libsolidity/syntaxTests/events/event_ternary_operator_different_types.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/from_ternary_expression.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/selector_ternary_contract_external_function.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contract_public_function.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contracts_external_function.sol create mode 100644 test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_interface_external_function.sol diff --git a/Changelog.md b/Changelog.md index 7b19d37c0d53..06a761e6e87d 100644 --- a/Changelog.md +++ b/Changelog.md @@ -30,6 +30,7 @@ Bugfixes: * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. * SMTChecker: Fix internal error caused by using external identifier to encode member access to functions that take an internal function as a parameter. * Standard JSON Interface: Fix an incomplete AST being returned when analysis is interrupted by certain kinds of fatal errors. + * Type Checker: Disallow using certain unassignable function types in complex expressions. * Type Checker: Function declaration types referring to different declarations are no longer convertible to each other. * Yul Optimizer: Ensure that the assignment of memory slots for variables moved to memory does not depend on AST IDs that may depend on whether additional files are included during compilation. * Yul Optimizer: Fix ``FullInliner`` step not ignoring code that is not in expression-split form. diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 915440caa05b..47e1fea04c1c 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -3472,7 +3472,11 @@ Type const* FunctionType::mobileType() const if (valueSet() || gasSet() || saltSet() || hasBoundFirstArgument()) return nullptr; - // return function without parameter names + // Special function types do not get a mobile type, such that they cannot be used in complex expressions. + if (m_kind != FunctionType::Kind::Internal && m_kind != FunctionType::Kind::External && m_kind != FunctionType::Kind::DelegateCall) + return nullptr; + + // return function without parameter names and without declaration return TypeProvider::function( m_parameterTypes, m_returnParameterTypes, @@ -3480,7 +3484,7 @@ Type const* FunctionType::mobileType() const strings(m_returnParameterNames.size()), m_kind, m_stateMutability, - m_declaration, + nullptr, Options::fromFunctionType(*this) ); } diff --git a/test/libsolidity/semanticTests/functionTypes/selector_ternary.sol b/test/libsolidity/semanticTests/functionTypes/selector_ternary.sol new file mode 100644 index 000000000000..567b7c14b945 --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/selector_ternary.sol @@ -0,0 +1,10 @@ +contract C { + function f() public {} + function g() public {} + function h(bool c) public returns (bytes4) { + return (c ? this.f : this.g).selector; + } +} +// ---- +// h(bool): true -> 0x26121ff000000000000000000000000000000000000000000000000000000000 +// h(bool): false -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/functionTypes/selector_ternary_function_pointer_from_function_call.sol b/test/libsolidity/semanticTests/functionTypes/selector_ternary_function_pointer_from_function_call.sol new file mode 100644 index 000000000000..83415f728ceb --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/selector_ternary_function_pointer_from_function_call.sol @@ -0,0 +1,19 @@ +contract A { + function f() public {} + function g() public {} +} + +contract C { + A a = new A(); + + function getContract() public view returns (A) { + return a; + } + + function test(bool b) public view returns (bytes4) { + return (b ? getContract().f : getContract().g).selector; + } +} +// ---- +// test(bool): true -> 0x26121ff000000000000000000000000000000000000000000000000000000000 +// test(bool): false -> 0xe2179b8e00000000000000000000000000000000000000000000000000000000 diff --git a/test/libsolidity/semanticTests/functionTypes/ternary_contract_internal_function.sol b/test/libsolidity/semanticTests/functionTypes/ternary_contract_internal_function.sol new file mode 100644 index 000000000000..f7dc890489d0 --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/ternary_contract_internal_function.sol @@ -0,0 +1,10 @@ +contract C { + function f() internal pure returns(uint256) { return 1;} + function g() internal pure returns(uint256) { return 2; } + function test(bool b) public returns(uint256) { + return (b ? C.f : C.g)(); + } +} +// ---- +// test(bool): true -> 1 +// test(bool): false -> 2 diff --git a/test/libsolidity/semanticTests/functionTypes/ternary_contract_library_internal_function.sol b/test/libsolidity/semanticTests/functionTypes/ternary_contract_library_internal_function.sol new file mode 100644 index 000000000000..a29a678d502b --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/ternary_contract_library_internal_function.sol @@ -0,0 +1,13 @@ +library L { + function f() internal pure returns(uint256){ return 1; } +} + +contract C { + function g() internal pure returns(uint256) { return 2; } + function test(bool b) public returns(uint256) { + return (b ? L.f : C.g)(); + } +} +// ---- +// test(bool): true -> 1 +// test(bool): false -> 2 diff --git a/test/libsolidity/semanticTests/functionTypes/ternary_contract_public_function.sol b/test/libsolidity/semanticTests/functionTypes/ternary_contract_public_function.sol new file mode 100644 index 000000000000..6d52017a5efb --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/ternary_contract_public_function.sol @@ -0,0 +1,10 @@ +contract C { + function f() public pure returns(uint256) { return 1; } + function g() public pure returns(uint256) { return 2; } + function test(bool b) public returns(uint256) { + return (b ? C.f : C.g)(); + } +} +// ---- +// test(bool): true -> 1 +// test(bool): false -> 2 diff --git a/test/libsolidity/syntaxTests/errors/error_ternary_operator.sol b/test/libsolidity/syntaxTests/errors/error_ternary_operator.sol new file mode 100644 index 000000000000..c4600a858caf --- /dev/null +++ b/test/libsolidity/syntaxTests/errors/error_ternary_operator.sol @@ -0,0 +1,11 @@ +error MyCustomError(uint, bool); + +contract C { + function f() pure public { + true ? MyCustomError : MyCustomError; + } +} + +// ---- +// TypeError 9717: (93-106): Invalid mobile type in true expression. +// TypeError 3703: (109-122): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/errors/error_ternary_operator_different_types.sol b/test/libsolidity/syntaxTests/errors/error_ternary_operator_different_types.sol deleted file mode 100644 index 680ab8058e1a..000000000000 --- a/test/libsolidity/syntaxTests/errors/error_ternary_operator_different_types.sol +++ /dev/null @@ -1,18 +0,0 @@ -error MyCustomError(uint, bool); -error MyCustomError2(uint, bool); -error MyCustomError3(uint, bool, bool); - -contract C { - function f() pure public { - true ? MyCustomError : MyCustomError; - true ? MyCustomError : MyCustomError2; - true ? MyCustomError : MyCustomError3; - true ? MyCustomError : true; - true ? true : MyCustomError; - } -} - -// ---- -// TypeError 1080: (253-290): True expression's type error MyCustomError(uint256,bool) does not match false expression's type error MyCustomError3(uint256,bool,bool). -// TypeError 1080: (300-327): True expression's type error MyCustomError(uint256,bool) does not match false expression's type bool. -// TypeError 1080: (337-364): True expression's type bool does not match false expression's type error MyCustomError(uint256,bool). diff --git a/test/libsolidity/syntaxTests/events/event_ternary_operator.sol b/test/libsolidity/syntaxTests/events/event_ternary_operator.sol new file mode 100644 index 000000000000..0ba773241f4c --- /dev/null +++ b/test/libsolidity/syntaxTests/events/event_ternary_operator.sol @@ -0,0 +1,10 @@ +contract C { + event MyCustomEvent(uint); + function f() pure public { + true ? MyCustomEvent : MyCustomEvent; + } +} + +// ---- +// TypeError 9717: (90-103): Invalid mobile type in true expression. +// TypeError 3703: (106-119): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/events/event_ternary_operator_different_types.sol b/test/libsolidity/syntaxTests/events/event_ternary_operator_different_types.sol deleted file mode 100644 index ca2f1e1d6852..000000000000 --- a/test/libsolidity/syntaxTests/events/event_ternary_operator_different_types.sol +++ /dev/null @@ -1,17 +0,0 @@ -contract C { - event MyCustomEvent(uint); - event MyCustomEvent2(uint); - event MyCustomEvent3(uint, bool); - function f() pure public { - true ? MyCustomEvent : MyCustomEvent; - true ? MyCustomEvent : MyCustomEvent2; - true ? MyCustomEvent : MyCustomEvent3; - true ? MyCustomEvent : true; - true ? true : MyCustomEvent; - } -} - -// ---- -// TypeError 1080: (246-283): True expression's type event MyCustomEvent(uint256) does not match false expression's type event MyCustomEvent3(uint256,bool). -// TypeError 1080: (293-320): True expression's type event MyCustomEvent(uint256) does not match false expression's type bool. -// TypeError 1080: (330-357): True expression's type bool does not match false expression's type event MyCustomEvent(uint256). diff --git a/test/libsolidity/syntaxTests/functionTypes/from_ternary_expression.sol b/test/libsolidity/syntaxTests/functionTypes/from_ternary_expression.sol new file mode 100644 index 000000000000..62ad8aa93d6c --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/from_ternary_expression.sol @@ -0,0 +1,8 @@ +contract C { + function f() public pure returns (uint x) { + x = (true ? addmod : addmod)(3, 4, 5); + } +} +// ---- +// TypeError 9717: (81-87): Invalid mobile type in true expression. +// TypeError 3703: (90-96): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/functionTypes/selector_ternary_contract_external_function.sol b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_contract_external_function.sol new file mode 100644 index 000000000000..847caad06f34 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_contract_external_function.sol @@ -0,0 +1,10 @@ +contract C { + function f() external pure { } + function g() external pure { } + function test(bool b) public returns(bytes4) { + (b ? C.f : C.g).selector; + } +} +// ---- +// TypeError 9717: (147-150): Invalid mobile type in true expression. +// TypeError 3703: (153-156): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contract_public_function.sol b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contract_public_function.sol new file mode 100644 index 000000000000..5f5edfa9fcc6 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contract_public_function.sol @@ -0,0 +1,13 @@ +contract C { + function f() public pure { } + function g() public pure { } +} + +contract A { + function test(bool b) public returns(bytes4) { + (b ? C.f : C.g).selector; + } +} +// ---- +// TypeError 9717: (159-162): Invalid mobile type in true expression. +// TypeError 3703: (165-168): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contracts_external_function.sol b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contracts_external_function.sol new file mode 100644 index 000000000000..e015f4315021 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_contracts_external_function.sol @@ -0,0 +1,16 @@ +contract C { + function f() external pure { } +} + +contract D { + function g() external pure { } +} + +contract A { + function test(bool b) public returns(bytes4) { + (b ? C.f : D.g).selector; + } +} +// ---- +// TypeError 9717: (179-182): Invalid mobile type in true expression. +// TypeError 3703: (185-188): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_interface_external_function.sol b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_interface_external_function.sol new file mode 100644 index 000000000000..4109a14ced16 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/selector_ternary_different_interface_external_function.sol @@ -0,0 +1,16 @@ +interface I1 { + function f() external pure; +} + +interface I2 { + function g() external pure; +} + +contract C { + function test(bool b) public returns(bytes4) { + (b ? I1.f : I2.g).selector; + } +} +// ---- +// TypeError 9717: (177-181): Invalid mobile type in true expression. +// TypeError 3703: (184-188): Invalid mobile type in false expression. From 82cb5338a90b13a6d9483164bdb7734ed021c86a Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Tue, 18 Jul 2023 13:55:46 +0200 Subject: [PATCH 130/138] Relax delegatecall type restriction plus test --- libsolidity/ast/Types.cpp | 8 +++----- .../functionTypes/declaration_type_conversion.sol | 3 ++- .../ternary_contract_delegate_function.sol | 12 ++++++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 test/libsolidity/syntaxTests/functionTypes/ternary_contract_delegate_function.sol diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 47e1fea04c1c..2b955369fc9c 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -3423,12 +3423,10 @@ MemberList::MemberMap FunctionType::nativeMembers(ASTNode const* _scope) const } case Kind::DelegateCall: { - auto const* functionDefinition = dynamic_cast(m_declaration); - solAssert(functionDefinition, ""); - solAssert(functionDefinition->visibility() != Visibility::Private, ""); - if (functionDefinition->visibility() != Visibility::Internal) + if (auto const* functionDefinition = dynamic_cast(m_declaration)) { - auto const* contract = dynamic_cast(m_declaration->scope()); + solAssert(functionDefinition->visibility() > Visibility::Internal, ""); + auto const *contract = dynamic_cast(m_declaration->scope()); solAssert(contract, ""); solAssert(contract->isLibrary(), ""); return {{"selector", TypeProvider::fixedBytes(4)}}; diff --git a/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol b/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol index a26460dc124d..c31c49aea99b 100644 --- a/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol +++ b/test/libsolidity/syntaxTests/functionTypes/declaration_type_conversion.sol @@ -8,4 +8,5 @@ contract C { } } // ---- -// TypeError 1080: (117-130): True expression's type function D.f() does not match false expression's type function D.g(). +// TypeError 9717: (121-124): Invalid mobile type in true expression. +// TypeError 3703: (127-130): Invalid mobile type in false expression. diff --git a/test/libsolidity/syntaxTests/functionTypes/ternary_contract_delegate_function.sol b/test/libsolidity/syntaxTests/functionTypes/ternary_contract_delegate_function.sol new file mode 100644 index 000000000000..810f5eb21075 --- /dev/null +++ b/test/libsolidity/syntaxTests/functionTypes/ternary_contract_delegate_function.sol @@ -0,0 +1,12 @@ +library L { + function f() external {} +} + +contract C { + function test() public { + (true ? L.f : L.f).selector; + } +} + +// ---- +// TypeError 9582: (94-121): Member "selector" not found or not visible after argument-dependent lookup in function (). From 5c7214cbe343a57540754accb8a4bbc4db3027bd Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Mon, 26 Jun 2023 17:14:08 +0200 Subject: [PATCH 131/138] Always generate code for .selector member access. --- Changelog.md | 3 +++ libsolidity/codegen/ExpressionCompiler.cpp | 4 ++++ .../selector_expression_side_effect.sol | 13 +++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 test/libsolidity/semanticTests/functionTypes/selector_expression_side_effect.sol diff --git a/Changelog.md b/Changelog.md index 06a761e6e87d..c47d26ba2da5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ ### 0.8.21 (unreleased) Important Bugfixes: + * Code Generator: Always generate code for the expression in ``expression.selector``. * Yul Optimizer: Fix ``FullInliner`` step (``i``) not preserving the evaluation order of arguments passed into inlined functions in code that is not in expression-split form (i.e. when using a custom optimizer sequence in which the step not preceded by ``ExpressionSplitter`` (``x``)). @@ -8,6 +9,7 @@ Language Features: * Allow qualified access to events from other contracts. * Relax restrictions on initialization of immutable variables. Reads and writes may now happen at any point at construction time outside of functions and modifiers. Explicit initialization is no longer mandatory. + Compiler Features: * Commandline Interface: Add ``--ast-compact-json`` output in assembler mode. * Commandline Interface: Add ``--ir-ast-json`` and ``--ir-optimized-ast-json`` outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. @@ -36,6 +38,7 @@ Bugfixes: * Yul Optimizer: Fix ``FullInliner`` step not ignoring code that is not in expression-split form. * Yul Optimizer: Fix optimized IR being unnecessarily passed through the Yul optimizer again before bytecode generation. + AST Changes: * AST: Add the ``experimentalSolidity`` field to the ``SourceUnit`` nodes, which indicate whether the experimental parsing mode has been enabled via ``pragma experimental solidity``. diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index 25bd15d5a5b7..fa94d2f58fa0 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -1659,6 +1659,10 @@ bool ExpressionCompiler::visit(MemberAccess const& _memberAccess) { if (functionType->hasDeclaration()) { + // Still visit the expression in case it has side effects. + _memberAccess.expression().accept(*this); + utils().popStackElement(*functionType); + if (functionType->kind() == FunctionType::Kind::Event) m_context << u256(h256::Arith(util::keccak256(functionType->externalSignature()))); else diff --git a/test/libsolidity/semanticTests/functionTypes/selector_expression_side_effect.sol b/test/libsolidity/semanticTests/functionTypes/selector_expression_side_effect.sol new file mode 100644 index 000000000000..cdb7b98dfe70 --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/selector_expression_side_effect.sol @@ -0,0 +1,13 @@ +contract C { + uint x; + function f() public returns (uint256) { + h().f.selector; + return x; + } + function h() public returns (C) { + x = 42; + return this; + } +} +// ---- +// f() -> 42 From 86602852be6495c0adb07daea443a8c095b65263 Mon Sep 17 00:00:00 2001 From: r0qs Date: Tue, 11 Jul 2023 11:54:24 +0200 Subject: [PATCH 132/138] Add buglist entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kamil Śliwak --- Changelog.md | 2 +- docs/bugs.json | 13 +++++ docs/bugs_by_version.json | 47 +++++++++++++++++-- .../selector_assignment_expression.sol | 10 ++++ 4 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 test/libsolidity/semanticTests/functionTypes/selector_assignment_expression.sol diff --git a/Changelog.md b/Changelog.md index c47d26ba2da5..ff5a99503627 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,7 +1,7 @@ ### 0.8.21 (unreleased) Important Bugfixes: - * Code Generator: Always generate code for the expression in ``expression.selector``. + * Code Generator: Always generate code for the expression in ``.selector`` in the legacy code generation pipeline. * Yul Optimizer: Fix ``FullInliner`` step (``i``) not preserving the evaluation order of arguments passed into inlined functions in code that is not in expression-split form (i.e. when using a custom optimizer sequence in which the step not preceded by ``ExpressionSplitter`` (``x``)). diff --git a/docs/bugs.json b/docs/bugs.json index e8b8507fad44..6245bdeda5af 100644 --- a/docs/bugs.json +++ b/docs/bugs.json @@ -12,6 +12,19 @@ "yulOptimizer": true } }, + { + "uid": "SOL-2023-1", + "name": "MissingSideEffectsOnSelectorAccess", + "summary": "Accessing the ``.selector`` member on complex expressions leaves the expression unevaluated in the legacy code generation.", + "description": "When accessing the ``.selector`` member on an expression with side-effects, like an assignment, a function call or a conditional, the expression would not be evaluated in the legacy code generation. This would happen in expressions where the functions used in the expression were all known at compilation time, regardless of whether the whole expression could be evaluated at compilation time or not. Note that the code generated by the IR pipeline was unaffected and would behave as expected.", + "link": "https://blog.soliditylang.org/2023/07/19/missing-side-effects-on-selector-access-bug/", + "introduced": "0.6.2", + "fixed": "0.8.21", + "severity": "low", + "conditions": { + "viaIR": false + } + }, { "uid": "SOL-2022-7", "name": "StorageWriteRemovalBeforeConditionalTermination", diff --git a/docs/bugs_by_version.json b/docs/bugs_by_version.json index 8f2ba181803b..43d5af799a55 100644 --- a/docs/bugs_by_version.json +++ b/docs/bugs_by_version.json @@ -1423,6 +1423,7 @@ "0.6.10": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1438,6 +1439,7 @@ "0.6.11": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1453,6 +1455,7 @@ "0.6.12": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1467,6 +1470,7 @@ }, "0.6.2": { "bugs": [ + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1484,6 +1488,7 @@ }, "0.6.3": { "bugs": [ + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1501,6 +1506,7 @@ }, "0.6.4": { "bugs": [ + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1518,6 +1524,7 @@ }, "0.6.5": { "bugs": [ + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1535,6 +1542,7 @@ }, "0.6.6": { "bugs": [ + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1552,6 +1560,7 @@ "0.6.7": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1569,6 +1578,7 @@ "0.6.8": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "NestedCalldataArrayAbiReencodingSizeValidation", @@ -1583,6 +1593,7 @@ "0.6.9": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1599,6 +1610,7 @@ "0.7.0": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1614,6 +1626,7 @@ "0.7.1": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1630,6 +1643,7 @@ "0.7.2": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1645,6 +1659,7 @@ "0.7.3": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1659,6 +1674,7 @@ "0.7.4": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1672,6 +1688,7 @@ "0.7.5": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1685,6 +1702,7 @@ "0.7.6": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1698,6 +1716,7 @@ "0.8.0": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1711,6 +1730,7 @@ "0.8.1": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1724,6 +1744,7 @@ "0.8.10": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1734,6 +1755,7 @@ "0.8.11": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1745,6 +1767,7 @@ "0.8.12": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1756,6 +1779,7 @@ "0.8.13": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "StorageWriteRemovalBeforeConditionalTermination", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", @@ -1768,6 +1792,7 @@ "0.8.14": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "StorageWriteRemovalBeforeConditionalTermination", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", @@ -1778,6 +1803,7 @@ "0.8.15": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "StorageWriteRemovalBeforeConditionalTermination", "AbiReencodingHeadOverflowWithStaticArrayCleanup" ], @@ -1786,31 +1812,36 @@ "0.8.16": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "StorageWriteRemovalBeforeConditionalTermination" ], "released": "2022-08-08" }, "0.8.17": { "bugs": [ - "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess" ], "released": "2022-09-08" }, "0.8.18": { "bugs": [ - "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess" ], "released": "2023-02-01" }, "0.8.19": { "bugs": [ - "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess" ], "released": "2023-02-22" }, "0.8.2": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1823,13 +1854,15 @@ }, "0.8.20": { "bugs": [ - "FullInlinerNonExpressionSplitArgumentEvaluationOrder" + "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess" ], "released": "2023-05-10" }, "0.8.3": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1842,6 +1875,7 @@ "0.8.4": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1853,6 +1887,7 @@ "0.8.5": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1864,6 +1899,7 @@ "0.8.6": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1875,6 +1911,7 @@ "0.8.7": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1886,6 +1923,7 @@ "0.8.8": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", @@ -1898,6 +1936,7 @@ "0.8.9": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", + "MissingSideEffectsOnSelectorAccess", "AbiReencodingHeadOverflowWithStaticArrayCleanup", "DirtyBytesArrayToStorage", "DataLocationChangeInInternalOverride", diff --git a/test/libsolidity/semanticTests/functionTypes/selector_assignment_expression.sol b/test/libsolidity/semanticTests/functionTypes/selector_assignment_expression.sol new file mode 100644 index 000000000000..896dbeb9927b --- /dev/null +++ b/test/libsolidity/semanticTests/functionTypes/selector_assignment_expression.sol @@ -0,0 +1,10 @@ +contract C { + bool public z; + function f() public { + ((z = true) ? this.f : this.f).selector; + } +} + +// ---- +// f() +// z() -> true From aba7d1769c1430570a2b66fea315f129322813b8 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Tue, 18 Jul 2023 18:06:56 +0200 Subject: [PATCH 133/138] Fix broken links in docs --- docs/installing-solidity.rst | 2 +- docs/resources.rst | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/installing-solidity.rst b/docs/installing-solidity.rst index 9eb0ee76f070..c46767366b0a 100644 --- a/docs/installing-solidity.rst +++ b/docs/installing-solidity.rst @@ -380,7 +380,7 @@ Prerequisites - macOS --------------------- For macOS builds, ensure that you have the latest version of -`Xcode installed `_. +`Xcode installed `_. This contains the `Clang C++ compiler `_, the `Xcode IDE `_ and other Apple development tools that are required for building C++ applications on OS X. diff --git a/docs/resources.rst b/docs/resources.rst index f51dba4bd925..84df74fb73cb 100644 --- a/docs/resources.rst +++ b/docs/resources.rst @@ -71,7 +71,7 @@ Editor Integrations * Visual Studio Code (VS Code) - * `Ethereum Remix Visual Studio Code extension `_ + * `Ethereum Remix Visual Studio Code extension `_ Ethereum Remix extension pack for VS Code * `Solidity Visual Studio Code extension, by Juan Blanco `_ @@ -113,9 +113,6 @@ Solidity Tools * `leafleth `_ A documentation generator for Solidity smart-contracts. -* `PIET `_ - A tool to develop, audit and use Solidity smart contracts through a simple graphical interface. - * `Scaffold-ETH `_ Forkable Ethereum development stack focused on fast product iterations. From f622a6c5148f87c498dbd1dbbdf3426a89782e38 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Tue, 18 Jul 2023 20:28:52 +0200 Subject: [PATCH 134/138] Add missing changelog entries --- Changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.md b/Changelog.md index ff5a99503627..e5a8ca925bb6 100644 --- a/Changelog.md +++ b/Changelog.md @@ -30,6 +30,8 @@ Bugfixes: * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. * SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function. + * SMTChecker: Fix generation of invalid SMT-LIB2 scripts in BMC engine with trusted mode for external calls when CHC engine times out. + * SMTChecker: Fix internal error caused by incorrectly classifying external function call using function pointer as a public getter. * SMTChecker: Fix internal error caused by using external identifier to encode member access to functions that take an internal function as a parameter. * Standard JSON Interface: Fix an incomplete AST being returned when analysis is interrupted by certain kinds of fatal errors. * Type Checker: Disallow using certain unassignable function types in complex expressions. From 09628b7502f85de143983726c3649dda8a09bfb4 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 19 Jul 2023 09:27:09 +0200 Subject: [PATCH 135/138] Set release date for 0.8.21 --- Changelog.md | 2 +- docs/bugs_by_version.json | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index e5a8ca925bb6..c5ff48ebda0c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,4 +1,4 @@ -### 0.8.21 (unreleased) +### 0.8.21 (2023-07-19) Important Bugfixes: * Code Generator: Always generate code for the expression in ``.selector`` in the legacy code generation pipeline. diff --git a/docs/bugs_by_version.json b/docs/bugs_by_version.json index 43d5af799a55..d15c72a65424 100644 --- a/docs/bugs_by_version.json +++ b/docs/bugs_by_version.json @@ -1859,6 +1859,10 @@ ], "released": "2023-05-10" }, + "0.8.21": { + "bugs": [], + "released": "2023-07-19" + }, "0.8.3": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder", From 601104ea942de985082863b15206c5fa03a649a7 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Tue, 18 Jul 2023 19:56:07 +0200 Subject: [PATCH 136/138] Sort Changelog for 0.8.21 release --- Changelog.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Changelog.md b/Changelog.md index e5a8ca925bb6..a78b29f41088 100644 --- a/Changelog.md +++ b/Changelog.md @@ -16,16 +16,16 @@ Compiler Features: * Commandline Interface: Respect ``--optimize-yul`` and ``--no-optimize-yul`` in compiler mode and accept them in assembler mode as well. ``--optimize --no-optimize-yul`` combination now allows enabling EVM assembly optimizer without enabling Yul optimizer. * EWasm: Remove EWasm backend. * Parser: Introduce ``pragma experimental solidity``, which will enable an experimental language mode that in particular has no stability guarantees between non-breaking releases and is not suited for production use. - * SMTChecker: Add ``--model-checker-print-query`` CLI option and ``settings.modelChecker.printQuery`` JSON option to output the SMTChecker queries in the SMTLIB2 format. This requires using `smtlib2` solver only. + * SMTChecker: Add ``--model-checker-print-query`` CLI option and ``settings.modelChecker.printQuery`` JSON option to output the SMTChecker queries in the SMTLIB2 format. This requires using ``smtlib2`` solver only. * Standard JSON Interface: Add ``ast`` file-level output for Yul input. * Standard JSON Interface: Add ``irAst`` and ``irOptimizedAst`` contract-level outputs for Solidity input, providing AST in compact JSON format for IR and optimized IR. - * Yul Optimizer: Remove experimental `ReasoningBasedSimplifier` optimization step. + * Yul Optimizer: Remove experimental ``ReasoningBasedSimplifier`` optimization step. * Yul Optimizer: Stack-to-memory mover is now enabled by default whenever possible for via IR code generation and pure Yul compilation. Bugfixes: * Code Generator: Disallow complex expressions whose results are types, built-ins, modules or some unassignable functions. The legacy code generation pipeline would not actually evaluate them, discarding any side-effects they might have. - * Code Generator: Fix not entirely deterministic order of functions in unoptimized Yul output. The choice of C++ compiler in some cases would result in different (but equivalent) bytecode (especially from native binaries vs emscripten binaries) + * Code Generator: Fix not entirely deterministic order of functions in unoptimized Yul output. The choice of C++ compiler in some cases would result in different (but equivalent) bytecode (especially from native binaries vs emscripten binaries). * Commandline Interface: Fix internal error when using ``--stop-after parsing`` and requesting some of the outputs that require full analysis or compilation. * Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time. * SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine. From 917ad057f7ad1abf73c6dfd4eb013d49ef1741c6 Mon Sep 17 00:00:00 2001 From: Alexander Arlt Date: Mon, 11 Dec 2023 22:52:47 +0800 Subject: [PATCH 137/138] Add support for apple silicon. --- .circleci/compare_bytecode_reports.sh | 1 + .circleci/config.yml | 637 +++++++++++------- .circleci/osx_install_dependencies.sh | 81 ++- .circleci/parallel_bytecode_report.sh | 5 +- cmake/jsoncpp.cmake | 2 + scripts/bytecodecompare/prepare_report.py | 30 +- scripts/install_obsolete_jsoncpp_1_7_4.sh | 2 +- .../test_bytecodecompare_prepare_report.py | 9 +- 8 files changed, 489 insertions(+), 278 deletions(-) diff --git a/.circleci/compare_bytecode_reports.sh b/.circleci/compare_bytecode_reports.sh index 7b62656bf24e..7574b0656c81 100755 --- a/.circleci/compare_bytecode_reports.sh +++ b/.circleci/compare_bytecode_reports.sh @@ -30,6 +30,7 @@ native_platforms=( ubuntu2004-static ubuntu osx + osx_intel windows ) interfaces=( diff --git a/.circleci/config.yml b/.circleci/config.yml index f52bed8a77f3..0b869e201a0a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,20 +9,20 @@ version: 2.1 parameters: ubuntu-2004-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu2004-20 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:7a1e1b01eda0d1e20704279672bcfd53dbbc481898ff960958a225dea76345bd" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu2004-21 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:6f64c7b35aabddb416d28f621a3c4bbae768c257d6866f6a7f05f8225acc94f0" ubuntu-2204-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204-5 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:4df420b7ccd96f540a4300a4fae0fcac2f4d3f23ffff9e3777c1f2d7c37ef901" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204-6 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:6eee10420382588b274374c6a18cb2e5d4f8a9fef5cf440b3a1acfc32bf52837" ubuntu-2204-clang-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204.clang-4 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:538596bf55961197f8b5670d8a6742d9bcd502b6a1045ae9d372cdf35ce69d93" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu2204.clang-5 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:e991421ce9f44d6476b29588fc355da1c3b3fedcc424fd12d844bbe310ad7851" ubuntu-clang-ossfuzz-docker-image: type: string - # solbuildpackpusher/solidity-buildpack-deps:ubuntu.clang.ossfuzz-2 - default: "solbuildpackpusher/solidity-buildpack-deps@sha256:a4fc3a41240c3bc58882d3f504e446c6931b547119012f5c45f79b0df91dbdd1" + # solbuildpackpusher/solidity-buildpack-deps:ubuntu.clang.ossfuzz-4 + default: "solbuildpackpusher/solidity-buildpack-deps@sha256:b122ef9dca71a8f90b74f3ba13cda4453681506e4a4ff047e7bc2130c76b0d1e" emscripten-docker-image: type: string # NOTE: Please remember to update the `build_emscripten.sh` whenever the hash of this image changes. @@ -81,6 +81,7 @@ commands: enum: - solcjs - native + - osx_intel binary_path: type: string preset: @@ -88,7 +89,6 @@ commands: steps: - run: name: Generate bytecode reports for the selected preset - no_output_timeout: 30m command: | .circleci/parallel_bytecode_report.sh \ "<< parameters.label >>" \ @@ -179,47 +179,250 @@ commands: paths: - << parameters.install_path >> -defaults: + # -------------------------------------------------------------------------- + # Build Commands + + setup_prerelease_commit_hash: + steps: + - run: + name: Store commit hash and prerelease + command: | + if [[ $CIRCLE_BRANCH == release || -n $CIRCLE_TAG ]]; then + echo -n > prerelease.txt; + else + date -u +"nightly.%Y.%-m.%-d" > prerelease.txt; + fi + echo -n "$CIRCLE_SHA1" > commit_hash.txt + + run_build: + steps: + - run: + name: Build + command: scripts/ci/build.sh + + run_build_ossfuzz: + steps: + - run: + name: Build_ossfuzz + command: scripts/ci/build_ossfuzz.sh + + run_proofs: + steps: + - run: + name: Correctness proofs for optimization rules + command: scripts/run_proofs.sh + + run_soltest: + steps: + - run: + name: soltest + no_output_timeout: 30m + command: .circleci/soltest.sh + + run_soltest_all: + steps: + - run: + name: soltest_all + no_output_timeout: 30m + command: .circleci/soltest_all.sh + + run_cmdline_tests: + steps: + - run: + name: command line tests + no_output_timeout: 30m + command: .circleci/parallel_cli_tests.py + + run_docs_pragma_min_version: + steps: + - run: + name: docs pragma version check + command: scripts/docs_version_pragma_check.sh + + # -------------------------------------------------------------------------- + # Artifact Commands + + store_artifacts_solc: + description: Store compiled solc executable as artifact + steps: + - store_artifacts: + path: build/solc/solc + destination: solc + + store_artifacts_yul_phaser: + steps: + - store_artifacts: + path: build/tools/yul-phaser + destination: yul-phaser + + persist_executables_to_workspace: + description: Persist compiled target executables to workspace + steps: + - persist_to_workspace: + root: build + paths: + - solc/solc + - test/soltest + - test/tools/solfuzzer + + persist_executables_to_workspace_osx: + description: Persist compiled target executables to workspace on macOS + steps: + - persist_to_workspace: + root: . + paths: + - build/solc/solc + - build/test/soltest + - build/test/tools/solfuzzer + + persist_ossfuzz_executables_to_workspace: + description: Persist compiled OSSFUZZ executables to workspace + steps: + - persist_to_workspace: + root: build + paths: + - test/tools/ossfuzz/abiv2_proto_ossfuzz + - test/tools/ossfuzz/abiv2_isabelle_ossfuzz + - test/tools/ossfuzz/const_opt_ossfuzz + - test/tools/ossfuzz/solc_mutator_ossfuzz + - test/tools/ossfuzz/solc_ossfuzz + - test/tools/ossfuzz/stack_reuse_codegen_ossfuzz + - test/tools/ossfuzz/strictasm_assembly_ossfuzz + - test/tools/ossfuzz/strictasm_diff_ossfuzz + - test/tools/ossfuzz/strictasm_opt_ossfuzz + - test/tools/ossfuzz/yul_proto_diff_ossfuzz + - test/tools/ossfuzz/yul_proto_diff_custom_mutate_ossfuzz + - test/tools/ossfuzz/yul_proto_ossfuzz + - test/tools/ossfuzz/sol_proto_ossfuzz + + store_artifacts_test_results: + description: Store test output dir as artifact + steps: + - store_artifacts: + path: test_results/ + destination: test_results/ # -------------------------------------------------------------------------- - # Build Templates + # Complex Build Commands - - setup_prerelease_commit_hash: &setup_prerelease_commit_hash - name: Store commit hash and prerelease - command: | - if [ "$CIRCLE_BRANCH" = release -o -n "$CIRCLE_TAG" ]; then echo -n > prerelease.txt; else date -u +"nightly.%Y.%-m.%-d" > prerelease.txt; fi - echo -n "$CIRCLE_SHA1" > commit_hash.txt + soltest: + steps: + - checkout + - attach_workspace: + at: build + # NOTE: Different build jobs produce different soltest executables (release/debug, + # clang/gcc, windows/linux/macos, etc.). The executable used by these steps comes from the + # attached workspace and we only see the items added to the workspace by jobs we depend on. + - run_soltest + - store_test_results: + path: test_results/ + - store_artifacts_test_results + - matrix_notify_failure_unless_pr - - run_build: &run_build - name: Build - command: scripts/ci/build.sh + test_lsp: + steps: + - checkout + - attach_workspace: + at: build + - run: + name: Install dependencies + command: pip install --user deepdiff colorama + - run: + name: Executing solc LSP test suite + command: test/lsp.py build/solc/solc --non-interactive + - matrix_notify_failure_unless_pr - - run_build_ossfuzz: &run_build_ossfuzz - name: Build_ossfuzz - command: scripts/ci/build_ossfuzz.sh + build: + steps: + - checkout + - run_build + - store_artifacts_solc + - store_artifacts_yul_phaser + - persist_executables_to_workspace + - matrix_notify_failure_unless_pr - - run_proofs: &run_proofs - name: Correctness proofs for optimization rules - command: scripts/run_proofs.sh + soltest_all: + steps: + - checkout + - attach_workspace: + at: build + - run_soltest_all + - store_test_results: + path: test_results/ + - store_artifacts_test_results + - matrix_notify_failure_unless_pr - - run_soltest: &run_soltest - name: soltest - no_output_timeout: 30m - command: ./.circleci/soltest.sh + cmdline_tests: + steps: + - checkout + - attach_workspace: + at: build + - run_cmdline_tests + - store_test_results: + path: test_results/ + - store_artifacts_test_results + - matrix_notify_failure_unless_pr - - run_soltest_all: &run_soltest_all - name: soltest_all - no_output_timeout: 30m - command: ./.circleci/soltest_all.sh + install_dependencies_osx: + # An extra cache key is used to only save the flag that communicates whether the cache exists. + # if this flag was set (the cache exist) we remove all files located in /usr/local & /opt/homebrew. + # With this simple trick restoring the cache is much faster. Otherwise CircleCI is generating + # warning messages if a file from the cache is overwriting an already existing file on disk. + # Restoring the cache is much faster if we remove all potentially conflicting files beforehand. + steps: + - restore_cache: + keys: + - osx-dependencies-cached-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} + - run: + name: Installing dependencies / Restoring dependency cache + command: | + if [[ -f ~/osx-dependencies-cached ]]; then + echo "Dependency flag exists. Removing /usr/local/ and /opt/homebrew/. These directories will be restored from cache." + + # CircleCI is providing the circleci cli tools via some kind of symlink magic. + # So we just save the original symlinks and restore them later. + circleci_binary_path=$(command -v circleci) + circleci_agent_binary_path=$(command -v circleci-agent) + cp "${circleci_binary_path}" /tmp/circleci + cp "${circleci_agent_binary_path}" /tmp/circleci-agent + + # Homebrew is installed in /usr/local on intel macs, but in /opt/homebrew on apple silicon. + if [[ -d /opt/homebrew ]]; then + sudo rm -rf /opt/homebrew + sudo mkdir -p /opt/homebrew/bin + sudo chmod 777 /opt/{homebrew,homebrew/bin} + fi + # under macos /usr/local itself is read-only, so we just remove its sub-directories. + sudo rm -rf /usr/local/* + sudo mkdir -p /usr/local/bin + sudo chmod 777 /usr/{local,local/bin} - - run_cmdline_tests: &run_cmdline_tests - name: command line tests - no_output_timeout: 30m - command: .circleci/parallel_cli_tests.py + mv /tmp/circleci "${circleci_binary_path}" + mv /tmp/circleci-agent "${circleci_agent_binary_path}" + fi + - restore_cache: + keys: + - osx-dependencies-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} + # DO NOT EDIT between here and save_cache, but rather edit ./circleci/osx_install_dependencies.sh + # WARNING! If you do edit anything here instead, remember to invalidate the cache manually. + - run: + name: Install build dependencies + command: .circleci/osx_install_dependencies.sh + - run: + name: Mark dependencies as cached + command: touch ~/osx-dependencies-cached + - save_cache: + key: osx-dependencies-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} + paths: + # Homebrew is installed in /usr/local on intel macs, but in /opt/homebrew on apple silicon. + - /usr/local + - /opt/homebrew + - save_cache: + key: osx-dependencies-cached-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} + paths: + - ~/osx-dependencies-cached - - run_docs_pragma_min_version: &run_docs_pragma_min_version - name: docs pragma version check - command: ./scripts/docs_version_pragma_check.sh +defaults: # -------------------------------------------------------------------------- # Matrix templates @@ -241,122 +444,6 @@ defaults: - via-ir-no-optimize # -------------------------------------------------------------------------- - # Artifacts Templates - - # compiled solc executable target - - artifacts_solc: &artifacts_solc - path: build/solc/solc - destination: solc - - # windows artifacts - - artifact_solc_windows: &artifact_solc_windows - path: upload/ - - - artifact_yul_phaser: &artifact_yul_phaser - path: build/tools/yul-phaser - destination: yul-phaser - - # compiled executable targets - - artifacts_executables: &artifacts_executables - root: build - paths: - - solc/solc - - test/soltest - - test/tools/solfuzzer - - # compiled OSSFUZZ targets - - artifacts_executables_ossfuzz: &artifacts_executables_ossfuzz - root: build - paths: - - test/tools/ossfuzz/abiv2_proto_ossfuzz - - test/tools/ossfuzz/abiv2_isabelle_ossfuzz - - test/tools/ossfuzz/const_opt_ossfuzz - - test/tools/ossfuzz/solc_mutator_ossfuzz - - test/tools/ossfuzz/solc_ossfuzz - - test/tools/ossfuzz/stack_reuse_codegen_ossfuzz - - test/tools/ossfuzz/strictasm_assembly_ossfuzz - - test/tools/ossfuzz/strictasm_diff_ossfuzz - - test/tools/ossfuzz/strictasm_opt_ossfuzz - - test/tools/ossfuzz/yul_proto_diff_ossfuzz - - test/tools/ossfuzz/yul_proto_diff_custom_mutate_ossfuzz - - test/tools/ossfuzz/yul_proto_ossfuzz - - test/tools/ossfuzz/sol_proto_ossfuzz - - # test result output directory - - artifacts_test_results: &artifacts_test_results - path: test_results/ - destination: test_results/ - - # -------------------------------------------------------------------------- - # Step Templates - - # store_test_results helper - - store_test_results: &store_test_results - path: test_results/ - - - steps_soltest: &steps_soltest - steps: - - checkout - - attach_workspace: - at: build - # NOTE: Different build jobs produce different soltest executables (release/debug, - # clang/gcc, windows/linux/macos, etc.). The executable used by these steps comes from the - # attached workspace and we only see the items added to the workspace by jobs we depend on. - - run: *run_soltest - - store_test_results: *store_test_results - - store_artifacts: *artifacts_test_results - - matrix_notify_failure_unless_pr - - - steps_test_lsp: &steps_test_lsp - steps: - - checkout - - attach_workspace: - at: build - - run: - name: Install dependencies - command: pip install --user deepdiff colorama - - run: - name: Executing solc LSP test suite - command: ./test/lsp.py ./build/solc/solc --non-interactive - - matrix_notify_failure_unless_pr - - - steps_build: &steps_build - steps: - - checkout - - run: *run_build - - store_artifacts: *artifacts_solc - - store_artifacts: *artifact_yul_phaser - - persist_to_workspace: *artifacts_executables - - matrix_notify_failure_unless_pr - - - steps_soltest_all: &steps_soltest_all - steps: - - checkout - - attach_workspace: - at: build - - run: *run_soltest_all - - store_test_results: *store_test_results - - store_artifacts: *artifacts_test_results - - matrix_notify_failure_unless_pr - - - steps_cmdline_tests: &steps_cmdline_tests - steps: - - checkout - - attach_workspace: - at: build - - run: *run_cmdline_tests - - store_test_results: *store_test_results - - store_artifacts: *artifacts_test_results - - matrix_notify_failure_unless_pr - - - steps_install_dependencies_osx: &steps_install_dependencies_osx - steps: - # FIXME: We used to cache dependencies on macOS but now it takes longer than just installing - # them each time. See https://github.com/ethereum/solidity/issues/12925. - - run: - name: Install build dependencies - command: ./.circleci/osx_install_dependencies.sh - # -------------------------------------------------------------------------- # Base Image Templates @@ -366,6 +453,7 @@ defaults: environment: &base_archlinux_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_archlinux_large: &base_archlinux_large <<: *base_archlinux @@ -373,6 +461,7 @@ defaults: environment: &base_archlinux_large_env <<: *base_archlinux_env MAKEFLAGS: -j 5 + CPUs: 5 - base_cimg_small: &base_cimg_small docker: @@ -381,6 +470,7 @@ defaults: environment: &base_cimg_small_env TERM: xterm MAKEFLAGS: -j 2 + CPUs: 2 - base_ems_large: &base_ems_large docker: @@ -389,6 +479,7 @@ defaults: environment: &base_ems_large_env TERM: xterm MAKEFLAGS: -j 5 + CPUs: 5 - base_node_small: &base_node_small docker: @@ -397,21 +488,17 @@ defaults: environment: &base_node_small_env TERM: xterm MAKEFLAGS: -j 2 + CPUs: 2 - base_osx: &base_osx macos: - xcode: "14.2.0" - resource_class: macos.x86.medium.gen2 + xcode: "15.0.0" + resource_class: macos.m1.medium.gen1 environment: &base_osx_env TERM: xterm MAKEFLAGS: -j5 - - - base_osx_large: &base_osx_large - <<: *base_osx - resource_class: large - environment: &base_osx_large_env - <<: *base_osx_env - MAKEFLAGS: -j10 + CPUs: 5 + ETH_EVMONE: /usr/local/lib/libevmone.dylib - base_python_small: &base_python_small docker: @@ -420,6 +507,7 @@ defaults: environment: &base_python_small_env TERM: xterm MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu_clang: &base_ubuntu_clang docker: @@ -427,6 +515,7 @@ defaults: environment: &base_ubuntu_clang_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu_clang_small: &base_ubuntu_clang_small <<: *base_ubuntu_clang @@ -434,6 +523,7 @@ defaults: environment: &base_ubuntu_clang_small_env <<: *base_ubuntu_clang_env MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu2004: &base_ubuntu2004 docker: @@ -441,6 +531,7 @@ defaults: environment: &base_ubuntu2004_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu2004_small: &base_ubuntu2004_small <<: *base_ubuntu2004 @@ -448,6 +539,7 @@ defaults: environment: &base_ubuntu2004_small_env <<: *base_ubuntu2004_env MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu2004_xlarge: &base_ubuntu2004_xlarge <<: *base_ubuntu2004 @@ -455,6 +547,7 @@ defaults: environment: &base_ubuntu2004_xlarge_env <<: *base_ubuntu2004_env MAKEFLAGS: -j 10 + CPUs: 10 - base_ubuntu2204: &base_ubuntu2204 docker: @@ -462,6 +555,7 @@ defaults: environment: &base_ubuntu2204_env TERM: xterm MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu2204_clang: &base_ubuntu2204_clang docker: @@ -471,6 +565,7 @@ defaults: CC: clang CXX: clang++ MAKEFLAGS: -j 3 + CPUs: 3 - base_ubuntu2204_clang_large: &base_ubuntu2204_clang_large <<: *base_ubuntu2204_clang @@ -478,6 +573,7 @@ defaults: environment: &base_ubuntu2204_clang_large_env <<: *base_ubuntu2204_clang_env MAKEFLAGS: -j 5 + CPUs: 5 - base_ubuntu2204_small: &base_ubuntu2204_small <<: *base_ubuntu2204 @@ -485,6 +581,7 @@ defaults: environment: &base_ubuntu2204_small_env <<: *base_ubuntu2204_env MAKEFLAGS: -j 2 + CPUs: 2 - base_ubuntu2204_large: &base_ubuntu2204_large <<: *base_ubuntu2204 @@ -492,6 +589,7 @@ defaults: environment: &base_ubuntu2204_large_env <<: *base_ubuntu2204_env MAKEFLAGS: -j 5 + CPUs: 5 - base_ubuntu2204_xlarge: &base_ubuntu2204_xlarge <<: *base_ubuntu2204 @@ -499,6 +597,7 @@ defaults: environment: &base_ubuntu2204_xlarge_env <<: *base_ubuntu2204_env MAKEFLAGS: -j 10 + CPUs: 10 - base_win: &base_win executor: @@ -691,7 +790,8 @@ defaults: name: t_native_test_ext_prb_math project: prb-math binary_type: native - image: cimg/node:18.16 + image: cimg/rust:1.74.0-node + resource_class: medium - job_native_test_ext_elementfi: &job_native_test_ext_elementfi <<: *requires_b_ubu_static @@ -748,7 +848,11 @@ jobs: pip install --user codespell - run: name: Check spelling - command: ~/.local/bin/codespell --skip "*.enc,.git,Dockerfile*,LICENSE,codespell_whitelist.txt,codespell_ignored_lines.txt" --ignore-words ./scripts/codespell_whitelist.txt --exclude-file ./scripts/codespell_ignored_lines.txt + command: | + ~/.local/bin/codespell \ + --skip "*.enc,.git,Dockerfile*,LICENSE,codespell_whitelist.txt,codespell_ignored_lines.txt" \ + --ignore-words scripts/codespell_whitelist.txt \ + --exclude-file scripts/codespell_ignored_lines.txt - matrix_notify_failure_unless_pr chk_docs_examples: @@ -762,7 +866,7 @@ jobs: command: sudo npm install -g solhint - run: name: Test Docs examples - command: ./test/docsCodeStyle.sh + command: test/docsCodeStyle.sh - matrix_notify_failure_unless_pr chk_coding_style: @@ -776,13 +880,13 @@ jobs: sudo apt install -y shellcheck - run: name: Check for C++ coding style - command: ./scripts/check_style.sh + command: scripts/check_style.sh - run: name: checking shell scripts - command: ./scripts/chk_shellscripts/chk_shellscripts.sh + command: scripts/chk_shellscripts/chk_shellscripts.sh - run: name: Check for broken symlinks - command: ./scripts/check_symlinks.sh + command: scripts/check_symlinks.sh - matrix_notify_failure_unless_pr chk_errorcodes: @@ -791,7 +895,7 @@ jobs: - checkout - run: name: Check for error codes - command: ./scripts/error_codes.py --check + command: scripts/error_codes.py --check - matrix_notify_failure_unless_pr chk_pylint: @@ -811,7 +915,7 @@ jobs: - run: pylint --version - run: name: Linting Python Scripts - command: ./scripts/pylint_all.py + command: scripts/pylint_all.py - matrix_notify_failure_unless_pr chk_antlr_grammar: @@ -825,7 +929,7 @@ jobs: sudo apt install -y openjdk-17-jdk - run: name: Run tests - command: ./scripts/test_antlr_grammar.sh + command: scripts/test_antlr_grammar.sh - matrix_notify_failure_unless_pr chk_buglist: @@ -840,7 +944,7 @@ jobs: npm install mktemp - run: name: Test buglist - command: ./test/buglistTests.js + command: test/buglistTests.js - matrix_notify_failure_unless_pr chk_proofs: @@ -849,14 +953,14 @@ jobs: - checkout - install_python3: packages: z3-solver - - run: *run_proofs + - run_proofs - matrix_notify_failure_unless_pr chk_docs_pragma_min_version: <<: *base_ubuntu2204_small steps: - checkout - - run: *run_docs_pragma_min_version + - run_docs_pragma_min_version - matrix_notify_failure_unless_pr t_ubu_pyscripts: @@ -882,7 +986,8 @@ jobs: # this runs 2x faster on xlarge but takes 4x more resources (compared to medium). # Enough other jobs depend on it that it's worth it though. <<: *base_ubuntu2204_xlarge - <<: *steps_build + steps: + - build # x64 ASAN build, for testing for memory related bugs b_ubu_asan: &b_ubu_asan @@ -892,14 +997,16 @@ jobs: <<: *base_ubuntu2204_env CMAKE_OPTIONS: -DSANITIZE=address CMAKE_BUILD_TYPE: Release - <<: *steps_build + steps: + - build b_ubu_clang: &b_ubu_clang <<: *base_ubuntu2204_clang_large environment: <<: *base_ubuntu2204_clang_large_env MAKEFLAGS: -j 10 - <<: *steps_build + steps: + - build b_ubu_san_clang: # This runs a bit faster on large and xlarge but on nightly efficiency matters more. @@ -910,7 +1017,8 @@ jobs: environment: <<: *base_ubuntu2204_clang_env CMAKE_OPTIONS: << parameters.cmake_options >> - <<: *steps_build + steps: + - build b_ubu_force_release: &b_ubu_force_release <<: *b_ubu @@ -929,7 +1037,7 @@ jobs: CMAKE_OPTIONS: -DCMAKE_BUILD_TYPE=Release -DUSE_Z3_DLOPEN=ON -DUSE_CVC4=OFF -DSOLC_STATIC_STDLIBS=ON steps: - checkout - - run: *run_build + - run_build - run: name: strip binary command: strip build/solc/solc @@ -952,8 +1060,8 @@ jobs: CMAKE_BUILD_TYPE: Debug steps: - checkout - - run: *run_build - - persist_to_workspace: *artifacts_executables + - run_build + - persist_executables_to_workspace - matrix_notify_failure_unless_pr t_ubu_codecov: @@ -972,11 +1080,11 @@ jobs: - run: name: "Code Coverage: Syntax Tests" command: codecov --flags syntax --gcov-root build - - run: *run_soltest + - run_soltest - run: name: "Coverage: All" command: codecov --flags all --gcov-root build - - store_artifacts: *artifacts_test_results + - store_artifacts_test_results - matrix_notify_failure_unless_pr # Builds in C++20 mode and uses debug build in order to speed up. @@ -990,16 +1098,16 @@ jobs: MAKEFLAGS: -j 10 steps: - checkout - - run: *run_build + - run_build - matrix_notify_failure_unless_pr b_ubu_ossfuzz: &b_ubu_ossfuzz <<: *base_ubuntu_clang steps: - checkout - - run: *setup_prerelease_commit_hash - - run: *run_build_ossfuzz - - persist_to_workspace: *artifacts_executables_ossfuzz + - setup_prerelease_commit_hash + - run_build_ossfuzz + - persist_ossfuzz_executables_to_workspace - matrix_notify_failure_unless_pr t_ubu_ossfuzz: &t_ubu_ossfuzz @@ -1014,8 +1122,9 @@ jobs: git clone https://github.com/ethereum/solidity-fuzzing-corpus /tmp/solidity-fuzzing-corpus mkdir -p test_results scripts/regressions.py -o test_results - - store_test_results: *store_test_results - - store_artifacts: *artifacts_test_results + - store_test_results: + path: test_results/ + - store_artifacts_test_results b_archlinux: <<: *base_archlinux_large @@ -1029,30 +1138,24 @@ jobs: command: | pacman --noconfirm -Syu --noprogressbar --needed base-devel boost cmake cvc4 git openssh tar - checkout - - run: *run_build - - store_artifacts: *artifacts_solc - - persist_to_workspace: *artifacts_executables + - run_build + - store_artifacts_solc + - persist_executables_to_workspace - matrix_notify_failure_unless_pr b_osx: <<: *base_osx environment: - <<: *base_osx_large_env + <<: *base_osx_env CMAKE_BUILD_TYPE: Release + CMAKE_OPTIONS: -DCMAKE_OSX_ARCHITECTURES:STRING=x86_64;arm64 steps: - checkout - - when: - condition: true - <<: *steps_install_dependencies_osx - - run: *run_build - - store_artifacts: *artifacts_solc - - store_artifacts: *artifact_yul_phaser - - persist_to_workspace: - root: . - paths: - - build/solc/solc - - build/test/soltest - - build/test/tools/solfuzzer + - install_dependencies_osx + - run_build + - store_artifacts_solc + - store_artifacts_yul_phaser + - persist_executables_to_workspace_osx - matrix_notify_failure_unless_pr t_osx_soltest: &t_osx_soltest @@ -1063,28 +1166,25 @@ jobs: OPTIMIZE: 0 steps: - checkout - - when: - condition: true - <<: *steps_install_dependencies_osx + - install_dependencies_osx - attach_workspace: at: . - - run: *run_soltest - - store_test_results: *store_test_results - - store_artifacts: *artifacts_test_results + - run_soltest + - store_test_results: + path: test_results/ + - store_artifacts_test_results - matrix_notify_failure_unless_pr t_osx_cli: <<: *base_osx - parallelism: 7 # Should match number of tests in .circleci/cli.sh + parallelism: 8 # Should match number of tests in .circleci/parallel_cli_tests.py steps: - checkout - - when: - condition: true - <<: *steps_install_dependencies_osx + - install_dependencies_osx - attach_workspace: at: . - - run: *run_cmdline_tests - - store_artifacts: *artifacts_test_results + - run_cmdline_tests + - store_artifacts_test_results - matrix_notify_failure_unless_pr b_ems: @@ -1115,10 +1215,10 @@ jobs: <<: *base_ubuntu2204_small steps: - checkout - - run: *setup_prerelease_commit_hash + - setup_prerelease_commit_hash - run: name: Build documentation - command: ./docs/docs.sh + command: docs/docs.sh - store_artifacts: path: docs/_build/html/ destination: docs-html @@ -1127,11 +1227,13 @@ jobs: t_ubu_soltest_all: &t_ubu_soltest_all <<: *base_ubuntu2204_large parallelism: 50 - <<: *steps_soltest_all + steps: + - soltest_all t_ubu_lsp: &t_ubu_lsp <<: *base_ubuntu2204_small - <<: *steps_test_lsp + steps: + - test_lsp t_archlinux_soltest: &t_archlinux_soltest <<: *base_archlinux @@ -1148,9 +1250,7 @@ jobs: name: Install runtime dependencies command: | pacman --noconfirm -Syu --noprogressbar --needed base-devel boost cmake z3 cvc4 git openssh tar - - when: - condition: true - <<: *steps_soltest + - soltest t_ubu_clang_soltest: &t_ubu_clang_soltest <<: *base_ubuntu2204_clang @@ -1162,7 +1262,8 @@ jobs: # The high parallelism in this job is causing the SMT tests to run out of memory, # so disabling for now. SOLTEST_FLAGS: --no-smt - <<: *steps_soltest + steps: + - soltest t_ubu_force_release_soltest_all: &t_ubu_force_release_soltest_all # NOTE: This definition is identical to t_ubu_soltest_all but in the workflow we make it depend on @@ -1171,8 +1272,9 @@ jobs: t_ubu_cli: &t_ubu_cli <<: *base_ubuntu2204_small - parallelism: 7 # Should match number of tests in .circleci/cli.sh - <<: *steps_cmdline_tests + parallelism: 8 # Should match number of tests in .circleci/parallel_cli_tests.py + steps: + - cmdline_tests t_ubu_force_release_cli: &t_ubu_force_release_cli <<: *t_ubu_cli @@ -1189,14 +1291,15 @@ jobs: t_ubu_asan_cli: # Runs slightly faster on medium but we only run it nightly so efficiency matters more. <<: *base_ubuntu2204 - parallelism: 7 # Should match number of tests in .circleci/cli.sh + parallelism: 8 # Should match number of tests in .circleci/parallel_cli_tests.py environment: <<: *base_ubuntu2204_env ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 # Suppress CLN memory leak. # See: https://github.com/ethereum/solidity/issues/13891 for details. LSAN_OPTIONS: suppressions=/root/project/.circleci/cln-asan.supp:print_suppressions=0 - <<: *steps_cmdline_tests + steps: + - cmdline_tests t_ubu_asan_soltest: <<: *base_ubuntu2204 @@ -1210,7 +1313,8 @@ jobs: # Suppress CLN memory leak. # See: https://github.com/ethereum/solidity/issues/13891 for details. LSAN_OPTIONS: suppressions=/root/project/.circleci/cln-asan.supp - <<: *steps_soltest + steps: + - soltest t_ubu_asan_clang_soltest: <<: *base_ubuntu2204_clang @@ -1221,7 +1325,8 @@ jobs: OPTIMIZE: 0 SOLTEST_FLAGS: --no-smt ASAN_OPTIONS: check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true:strict_string_checks=true:detect_invalid_pointer_pairs=2 - <<: *steps_soltest + steps: + - soltest t_ubu_ubsan_clang_soltest: <<: *base_ubuntu2204_clang @@ -1230,12 +1335,14 @@ jobs: <<: *base_ubuntu2204_clang_env EVM: << pipeline.parameters.evm-version >> SOLTEST_FLAGS: --no-smt - <<: *steps_soltest + steps: + - soltest t_ubu_ubsan_clang_cli: <<: *base_ubuntu2204_clang - parallelism: 7 # Should match number of tests in .circleci/cli.sh - <<: *steps_cmdline_tests + parallelism: 8 # Should match number of tests in .circleci/parallel_cli_tests.py + steps: + - cmdline_tests t_ems_solcjs: # Unlike other t_ems jobs this one actually runs 2x faster on medium (compared to small). @@ -1274,16 +1381,16 @@ jobs: name: Install dependencies command: | cd hardhat - yarn + pnpm install - run: name: Run hardhat-core test suite command: | HARDHAT_TESTS_SOLC_VERSION=$(scripts/get_version.sh) export HARDHAT_TESTS_SOLC_VERSION - # NOTE: This is expected to work without running `yarn build` first. + # NOTE: This is expected to work without running `pnpm build` first. cd hardhat/packages/hardhat-core - yarn test + pnpm test - matrix_notify_failure_unless_pr t_ext: @@ -1321,6 +1428,12 @@ jobs: - attach_workspace: at: /tmp/workspace - install_foundry + - run: + name: Ensure pnpm is installed if npm is present + command: | + if command -v npm &> /dev/null; then + sudo npm install -g pnpm + fi - install_python3: packages: requests - run: @@ -1459,7 +1572,8 @@ jobs: name: "Run solc.exe to make sure build was successful." command: .\build\solc\Release\solc.exe --version shell: powershell.exe - - store_artifacts: *artifact_solc_windows + - store_artifacts: + path: upload/ - persist_to_workspace: root: build paths: @@ -1488,10 +1602,11 @@ jobs: command: python -m pip install --user deepdiff colorama - run: name: Executing solc LSP test suite - command: python ./test/lsp.py .\build\solc\Release\solc.exe --non-interactive + command: python test/lsp.py build\solc\Release\solc.exe --non-interactive shell: powershell.exe - - store_test_results: *store_test_results - - store_artifacts: *artifacts_test_results + - store_test_results: + path: test_results/ + - store_artifacts_test_results - matrix_notify_failure_unless_pr # Note: b_bytecode_ubu_static is required because b_ubu_static and b_ubu @@ -1545,6 +1660,22 @@ jobs: binary_path: "build/solc/solc" preset: "<< parameters.preset >>" + b_bytecode_osx_intel: + parameters: + preset: + type: string + <<: *base_osx + parallelism: 2 # For prepare_bytecode_report + steps: + - checkout + - attach_workspace: + at: . + - prepare_bytecode_report: + label: "osx_intel" + binary_type: osx_intel + binary_path: "build/solc/solc" + preset: "<< parameters.preset >>" + b_bytecode_win: parameters: preset: @@ -1695,7 +1826,9 @@ workflows: - t_ext: *job_ems_compile_ext_colony - - t_ext: *job_native_test_ext_gnosis + # NOTE: We are disabling the gnosis test suite due to version discrepancies that are difficult to fix. + # Check again after (and if) https://github.com/safe-global/safe-contracts/pull/644 is merged. + #- t_ext: *job_native_test_ext_gnosis - t_ext: *job_native_test_ext_zeppelin - t_ext: *job_native_test_ext_ens - t_ext: *job_native_test_ext_yield_liquidator @@ -1718,17 +1851,21 @@ workflows: <<: *requires_nothing requires: - t_ems_compile_ext_colony - - t_native_test_ext_gnosis + # NOTE: We are disabling the gnosis test suite due to version discrepancies that are difficult to fix. + # Check again after (and if) https://github.com/safe-global/safe-contracts/pull/644 is merged. + #- t_native_test_ext_gnosis - t_native_test_ext_zeppelin - t_native_test_ext_ens - t_native_test_ext_yield_liquidator - t_native_test_ext_perpetual_pools - t_native_test_ext_uniswap - - t_native_test_ext_prb_math - t_native_test_ext_elementfi - t_native_test_ext_brink # NOTE: We are disabling gp2 tests due to constant failures. #- t_native_test_ext_gp2 + # TODO: Dropping prb-math from the benchmarks since it is not implemented yet + # in the new Foundry external testing infrastructure. + # - t_native_test_ext_prb_math # NOTE: The external tests below were commented because they # depend on a specific version of hardhat which does not support shanghai EVM. #- t_native_test_ext_trident @@ -1762,6 +1899,11 @@ workflows: matrix: *bytecode_compare_preset_matrix requires: - b_osx + - b_bytecode_osx_intel: + <<: *on_all_tags_and_branches + matrix: *bytecode_compare_preset_matrix + requires: + - b_osx - b_bytecode_ems: <<: *on_all_tags_and_branches matrix: *bytecode_compare_preset_matrix @@ -1774,6 +1916,7 @@ workflows: - b_bytecode_ubu - b_bytecode_win - b_bytecode_osx + - b_bytecode_osx_intel - b_bytecode_ems # Final artifacts diff --git a/.circleci/osx_install_dependencies.sh b/.circleci/osx_install_dependencies.sh index 5e779700c9f6..4ca4a31d503b 100755 --- a/.circleci/osx_install_dependencies.sh +++ b/.circleci/osx_install_dependencies.sh @@ -26,12 +26,8 @@ # ------------------------------------------------------------------------------ # note that the following directories may be cached by circleci: -# - /usr/local/bin -# - /usr/local/sbin -# - /usr/local/lib -# - /usr/local/include -# - /usr/local/Cellar -# - /usr/local/Homebrew +# - /usr/local +# - /opt/homebrew set -eu @@ -52,32 +48,69 @@ function validate_checksum { if [ ! -f /usr/local/lib/libz3.a ] # if this file does not exists (cache was not restored), rebuild dependencies then - brew install boost + brew update + brew upgrade brew install cmake brew install wget brew install coreutils brew install diffutils - ./scripts/install_obsolete_jsoncpp_1_7_4.sh + brew install grep + + # writing to /usr/local/lib need administrative privileges. + sudo ./scripts/install_obsolete_jsoncpp_1_7_4.sh + + # boost + boost_version="1.84.0" + boost_package="boost_${boost_version//./_}.tar.bz2" + boost_dir="boost_${boost_version//./_}" + wget "https://boostorg.jfrog.io/artifactory/main/release/$boost_version/source/$boost_package" + tar xf "$boost_package" + rm "$boost_package" + cd "$boost_dir" + ./bootstrap.sh --with-toolset=clang --with-libraries=thread,system,filesystem,program_options,serialization,test + # the default number of jobs that b2 is taking, is the number of detected available CPU threads. + sudo ./b2 -a address-model=64 architecture=arm+x86 install + cd .. + sudo rm -rf "$boost_dir" # z3 z3_version="4.12.1" - z3_dir="z3-${z3_version}-x64-osx-10.16" - z3_package="${z3_dir}.zip" - wget "https://github.com/Z3Prover/z3/releases/download/z3-${z3_version}/${z3_package}" - validate_checksum "$z3_package" 7601f844de6d906235140d0f76cca58be7ac716f3e2c29c35845aa24b24f73b9 - unzip "$z3_package" + z3_dir="z3-z3-$z3_version" + z3_package="z3-$z3_version.tar.gz" + wget "https://github.com/Z3Prover/z3/archive/refs/tags/$z3_package" + validate_checksum "$z3_package" a3735fabf00e1341adcc70394993c05fd3e2ae167a3e9bb46045e33084eb64a3 + tar xf "$z3_package" rm "$z3_package" - cp "${z3_dir}/bin/libz3.a" /usr/local/lib - cp "${z3_dir}/bin/z3" /usr/local/bin - cp "${z3_dir}/include/"* /usr/local/include - rm -r "$z3_dir" + cd "$z3_dir" + mkdir build + cd build + cmake -DCMAKE_OSX_ARCHITECTURES:STRING="x86_64;arm64" -DZ3_BUILD_LIBZ3_SHARED=false .. + make -j + sudo make install + cd ../.. + rm -rf "$z3_dir" # evmone - evmone_version="0.10.0" - evmone_package="evmone-${evmone_version}-darwin-x86_64.tar.gz" - wget "https://github.com/ethereum/evmone/releases/download/v${evmone_version}/${evmone_package}" - validate_checksum "$evmone_package" 1b7773779287d7908baca6b8d556a98800cbd7d6e5c910b55fa507642bc0a15c - tar xzpf "$evmone_package" -C /usr/local - rm "$evmone_package" - + evmone_version="0.11.0" + if [[ $(uname -m) == 'arm64' ]] + then + # evmone does not provide any builds for apple silicon yet. so lets just build it locally. + # be aware that we are only building the arm version here, we don't build a universal binary. + git clone https://github.com/ethereum/evmone.git + cd evmone + git checkout "v${evmone_version}" + git submodule update --init + cmake -S . -B build + cmake --build build + cd build + sudo make install + cd ../.. + rm -rf evmone + else + evmone_package="evmone-${evmone_version}-darwin-x86_64.tar.gz" + wget "https://github.com/ethereum/evmone/releases/download/v${evmone_version}/${evmone_package}" + validate_checksum "$evmone_package" 83ed20676681d9a31bd30cac399ab7c615ccab8adb8087cc2c7e9cd22b4d2efc + tar xzpf "$evmone_package" -C /usr/local + rm "$evmone_package" + fi fi diff --git a/.circleci/parallel_bytecode_report.sh b/.circleci/parallel_bytecode_report.sh index 4a19015ce62f..d77b8a24f1ef 100755 --- a/.circleci/parallel_bytecode_report.sh +++ b/.circleci/parallel_bytecode_report.sh @@ -33,7 +33,7 @@ binary_type="$2" binary_path="$3" # This path must be absolute preset="$4" -[[ $binary_type == native || $binary_type == solcjs ]] || { >&2 echo "Invalid binary type: ${binary_type}"; exit 1; } +[[ $binary_type == native || $binary_type == "osx_intel" || $binary_type == solcjs ]] || { >&2 echo "Invalid binary type: ${binary_type}"; exit 1; } # NOTE: Locale affects the order of the globbed files. export LC_ALL=C @@ -47,7 +47,7 @@ python3 ../scripts/isolate_tests.py ../test/ # FIXME: These cases crash because of https://github.com/ethereum/solidity/issues/13583 rm ./*_bytecode_too_large_*.sol ./*_combined_too_large_*.sol -if [[ $binary_type == native ]]; then +if [[ $binary_type == native || $binary_type == "osx_intel" ]]; then interface=$(echo -e "standard-json\ncli" | circleci tests split) echo "Selected interface: ${interface}" @@ -56,6 +56,7 @@ if [[ $binary_type == native ]]; then "$binary_path" \ --interface "$interface" \ --preset "$preset" \ + --execution-arch "$binary_type" \ --report-file "../bytecode-report-${label}-${interface}-${preset}.txt" else echo "Installing solc-js" diff --git a/cmake/jsoncpp.cmake b/cmake/jsoncpp.cmake index cf1cc656b3b0..c47c2697a3dc 100644 --- a/cmake/jsoncpp.cmake +++ b/cmake/jsoncpp.cmake @@ -40,6 +40,7 @@ if (WIN32 AND POLICY CMP0091 AND CMAKE_MSVC_RUNTIME_LIBRARY) list(APPEND JSONCPP_CMAKE_ARGS "-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}") endif() +string(REPLACE ";" "$" CMAKE_OSX_ARCHITECTURES_ "${CMAKE_OSX_ARCHITECTURES}") ExternalProject_Add(jsoncpp-project PREFIX "${prefix}" DOWNLOAD_DIR "${PROJECT_SOURCE_DIR}/deps/downloads" @@ -57,6 +58,7 @@ ExternalProject_Add(jsoncpp-project -DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF -DCMAKE_CXX_FLAGS=${JSONCPP_CXX_FLAGS} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_} ${JSONCPP_CMAKE_ARGS} ${byproducts} ) diff --git a/scripts/bytecodecompare/prepare_report.py b/scripts/bytecodecompare/prepare_report.py index 4cf24bb8aa40..82bccbb65a75 100755 --- a/scripts/bytecodecompare/prepare_report.py +++ b/scripts/bytecodecompare/prepare_report.py @@ -26,6 +26,11 @@ class CompilerInterface(Enum): STANDARD_JSON = 'standard-json' +class ExecutionArchitecture(Enum): + NATIVE = 'native' + OSX_INTEL = 'osx_intel' + + class SettingsPreset(Enum): LEGACY_OPTIMIZE = 'legacy-optimize' LEGACY_NO_OPTIMIZE = 'legacy-no-optimize' @@ -211,6 +216,7 @@ def parse_cli_output(source_file_name: Path, cli_output: str) -> FileReport: def prepare_compiler_input( compiler_path: Path, + execution_arch: ExecutionArchitecture, source_file_name: Path, force_no_optimize_yul: bool, interface: CompilerInterface, @@ -221,6 +227,12 @@ def prepare_compiler_input( settings = CompilerSettings.from_preset(preset) + command_line = [] + if execution_arch == ExecutionArchitecture.OSX_INTEL: + command_line = ["/usr/bin/arch", "-64", "-x86_64"] + else: + assert execution_arch == ExecutionArchitecture.NATIVE + if interface == CompilerInterface.STANDARD_JSON: json_input: dict = { 'language': 'Solidity', @@ -238,7 +250,7 @@ def prepare_compiler_input( if smt_use == SMTUse.DISABLE: json_input['settings']['modelChecker'] = {'engine': 'none'} - command_line = [str(compiler_path), '--standard-json'] + command_line += [str(compiler_path), '--standard-json'] compiler_input = json.dumps(json_input) else: assert interface == CompilerInterface.CLI @@ -255,7 +267,7 @@ def prepare_compiler_input( if smt_use == SMTUse.DISABLE: compiler_options += ['--model-checker-engine', 'none'] - command_line = [str(compiler_path)] + compiler_options + command_line += [str(compiler_path)] + compiler_options compiler_input = load_source(source_file_name, smt_use) return (command_line, compiler_input) @@ -286,6 +298,7 @@ def detect_metadata_cli_option_support(compiler_path: Path): def run_compiler( compiler_path: Path, + execution_arch: ExecutionArchitecture, source_file_name: Path, force_no_optimize_yul: bool, interface: CompilerInterface, @@ -295,10 +308,10 @@ def run_compiler( tmp_dir: Path, exit_on_error: bool, ) -> FileReport: - if interface == CompilerInterface.STANDARD_JSON: (command_line, compiler_input) = prepare_compiler_input( compiler_path, + execution_arch, Path(source_file_name.name), force_no_optimize_yul, interface, @@ -322,6 +335,7 @@ def run_compiler( (command_line, compiler_input) = prepare_compiler_input( compiler_path.absolute(), + execution_arch, Path(source_file_name.name), force_no_optimize_yul, interface, @@ -351,6 +365,7 @@ def run_compiler( def generate_report( source_file_names: List[str], compiler_path: Path, + execution_arch: ExecutionArchitecture, interface: CompilerInterface, presets: List[SettingsPreset], smt_use: SMTUse, @@ -370,6 +385,7 @@ def generate_report( try: report = run_compiler( compiler_path, + execution_arch, Path(source_file_name), force_no_optimize_yul, interface, @@ -419,6 +435,13 @@ def commandline_parser() -> ArgumentParser: choices=[c.value for c in CompilerInterface], help="Compiler interface to use.", ) + parser.add_argument( + '--execution-arch', + dest='execution_arch', + default=ExecutionArchitecture.NATIVE.value, + choices=[c.value for c in ExecutionArchitecture], + help="Select the architecture of the universal binary that should be executed. (Only relevant for macOS)", + ) parser.add_argument( '--preset', dest='presets', @@ -467,6 +490,7 @@ def commandline_parser() -> ArgumentParser: generate_report( glob("*.sol"), Path(options.compiler_path), + ExecutionArchitecture(options.execution_arch), CompilerInterface(options.interface), [SettingsPreset(p) for preset_group in presets for p in preset_group], SMTUse(options.smt_use), diff --git a/scripts/install_obsolete_jsoncpp_1_7_4.sh b/scripts/install_obsolete_jsoncpp_1_7_4.sh index 825d1a58a225..f9de0245d70b 100755 --- a/scripts/install_obsolete_jsoncpp_1_7_4.sh +++ b/scripts/install_obsolete_jsoncpp_1_7_4.sh @@ -17,7 +17,7 @@ TEMPDIR=$(mktemp -d) cd "jsoncpp-${jsoncpp_version}" mkdir -p build cd build - cmake -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" .. + cmake -DCMAKE_OSX_ARCHITECTURES:STRING="x86_64;arm64" -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" .. make make install ) diff --git a/test/scripts/test_bytecodecompare_prepare_report.py b/test/scripts/test_bytecodecompare_prepare_report.py index b8a1791d652c..097ffa2be931 100644 --- a/test/scripts/test_bytecodecompare_prepare_report.py +++ b/test/scripts/test_bytecodecompare_prepare_report.py @@ -9,7 +9,8 @@ # NOTE: This test file file only works with scripts/ added to PYTHONPATH so pylint can't find the imports # pragma pylint: disable=import-error -from bytecodecompare.prepare_report import CompilerInterface, FileReport, ContractReport, SettingsPreset, SMTUse, Statistics +from bytecodecompare.prepare_report import ExecutionArchitecture, CompilerInterface, FileReport, ContractReport +from bytecodecompare.prepare_report import SettingsPreset, SMTUse, Statistics from bytecodecompare.prepare_report import load_source, parse_cli_output, parse_standard_json_output, prepare_compiler_input # pragma pylint: enable=import-error @@ -223,6 +224,7 @@ def test_prepare_compiler_input_should_work_with_standard_json_interface(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), + ExecutionArchitecture.NATIVE, SMT_SMOKE_TEST_SOL_PATH, preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=False, @@ -237,6 +239,7 @@ def test_prepare_compiler_input_should_work_with_standard_json_interface(self): def test_prepare_compiler_input_should_work_with_cli_interface(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), + ExecutionArchitecture.NATIVE, SMT_SMOKE_TEST_SOL_PATH, preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=False, @@ -273,6 +276,7 @@ def test_prepare_compiler_input_for_json_preserves_newlines(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), + ExecutionArchitecture.NATIVE, SMT_CONTRACT_WITH_MIXED_NEWLINES_SOL_PATH, preset=SettingsPreset.VIA_IR_OPTIMIZE, force_no_optimize_yul=False, @@ -287,6 +291,7 @@ def test_prepare_compiler_input_for_json_preserves_newlines(self): def test_prepare_compiler_input_for_cli_preserves_newlines(self): (_command_line, compiler_input) = prepare_compiler_input( Path('solc'), + ExecutionArchitecture.NATIVE, SMT_CONTRACT_WITH_MIXED_NEWLINES_SOL_PATH, preset=SettingsPreset.LEGACY_OPTIMIZE, force_no_optimize_yul=True, @@ -300,6 +305,7 @@ def test_prepare_compiler_input_for_cli_preserves_newlines(self): def test_prepare_compiler_input_for_cli_should_handle_force_no_optimize_yul_flag(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), + ExecutionArchitecture.NATIVE, SMT_SMOKE_TEST_SOL_PATH, preset=SettingsPreset.LEGACY_NO_OPTIMIZE, force_no_optimize_yul=True, @@ -317,6 +323,7 @@ def test_prepare_compiler_input_for_cli_should_handle_force_no_optimize_yul_flag def test_prepare_compiler_input_for_cli_should_not_use_metadata_option_if_not_supported(self): (command_line, compiler_input) = prepare_compiler_input( Path('solc'), + ExecutionArchitecture.NATIVE, SMT_SMOKE_TEST_SOL_PATH, preset=SettingsPreset.VIA_IR_OPTIMIZE, force_no_optimize_yul=False, From 400f5aa36d9a791fe107a77b950dd1f0e894b367 Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 9 Jul 2024 09:58:17 +0800 Subject: [PATCH 138/138] func(ci): only trigger ci jobs while tv.* tags are pushed --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0b869e201a0a..722de138a41e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -616,7 +616,9 @@ defaults: - on_all_tags_and_branches: &on_all_tags_and_branches filters: tags: - only: /.*/ + only: /^tv.*/ + branches: + ignore: /.*/ - on_version_tags: &on_version_tags filters: