From 6738ce6f3379bbf1c2d5b2fff768d21913aa4d97 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:49:55 +0100 Subject: [PATCH 01/80] bump fmtlib to 11.1.4 --- deps/fmtlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/fmtlib b/deps/fmtlib index 0c9fce2ffefe..123913715afe 160000 --- a/deps/fmtlib +++ b/deps/fmtlib @@ -1 +1 @@ -Subproject commit 0c9fce2ffefecfdce794e1859584e25877b7b592 +Subproject commit 123913715afeb8a437e6388b4473fcc4753e1c9a From 363f1ae1dedbf47528dd1d76065032e1ed367b2b Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Tue, 11 Mar 2025 13:09:38 -0300 Subject: [PATCH 02/80] Set next version 0.8.30 --- CMakeLists.txt | 2 +- Changelog.md | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d95b7213ebe6..5b39878f26d3 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.29") +set(PROJECT_VERSION "0.8.30") # 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 b1ddcacf6c94..47334fd3dacd 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,14 @@ +### 0.8.30 (unreleased) + +Language Features: + + +Compiler Features: + + +Bugfixes: + + ### 0.8.29 (2025-03-12) Language Features: From c84cac865295b87caa273b3ed8aaa31b0b121d99 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:44:14 +0100 Subject: [PATCH 03/80] release checklist: mention buildx as requirement for docker_deploy_manual --- ReleaseChecklist.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ReleaseChecklist.md b/ReleaseChecklist.md index f55384230aa4..301cf963e81f 100644 --- a/ReleaseChecklist.md +++ b/ReleaseChecklist.md @@ -6,6 +6,7 @@ - [ ] DockerHub account with push rights to the [``solc`` image](https://hub.docker.com/r/ethereum/solc). - [ ] Launchpad (Ubuntu One) account with a membership in the ["Ethereum" team](https://launchpad.net/~ethereum) and a gnupg key for your email in the ``ethereum.org`` domain (has to be version 1, gpg2 won't work). + - [ ] Ubuntu/Debian dependencies of the Docker script: ``docker-buildx``. - [ ] Ubuntu/Debian dependencies of the PPA scripts: ``devscripts``, ``debhelper``, ``dput``, ``git``, ``wget``, ``ca-certificates``. - [ ] [npm Registry](https://www.npmjs.com) account added as a collaborator for the [``solc`` package](https://www.npmjs.com/package/solc). - [ ] Access to the [solidity_lang Twitter account](https://twitter.com/solidity_lang). @@ -79,6 +80,7 @@ At least a day before the release: - [ ] Update the version and the hash (``sha256sum solidity_$VERSION.tar.gz``) in the [``solidity`` formula in Homebrew core repository](https://github.com/Homebrew/homebrew-core/blob/master/Formula/s/solidity.rb). ### Docker + - [ ] Make sure ``docker-buildx`` is installed. - [ ] Run ``./scripts/docker_deploy_manual.sh v$VERSION``. ### PPA From 40a4d5d420006168e6c73a1a27a9159cb0b515f0 Mon Sep 17 00:00:00 2001 From: Ocenka Date: Fri, 14 Mar 2025 12:28:24 +0000 Subject: [PATCH 04/80] Minor spelling fix in external test runners base.py --- scripts/externalTests/runners/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/externalTests/runners/base.py b/scripts/externalTests/runners/base.py index cd94fab6b80b..4778206150e2 100644 --- a/scripts/externalTests/runners/base.py +++ b/scripts/externalTests/runners/base.py @@ -74,7 +74,7 @@ def __init__(self, argv, config: TestConfig): def setup_solc(self) -> str: if self.solc_binary_type == "solcjs": - # TODO: add support to solc-js + # TODO: add support for solc-js raise NotImplementedError() print("Setting up solc...") solc_version_output = subprocess.check_output( From d547bf2b67668bc1fd85cf4c6713c50cf5db5b80 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 14 Mar 2025 08:50:53 +0100 Subject: [PATCH 05/80] Release checklist: Updates style - double backticks -> single backticks - remove single space before bullet points --- ReleaseChecklist.md | 200 ++++++++++++++++++++++---------------------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/ReleaseChecklist.md b/ReleaseChecklist.md index 301cf963e81f..f5e4ec7cae21 100644 --- a/ReleaseChecklist.md +++ b/ReleaseChecklist.md @@ -1,127 +1,127 @@ ## Checklist for making a release: ### Requirements - - [ ] GitHub account with access to [solidity](https://github.com/ethereum/solidity), [solc-js](https://github.com/ethereum/solc-js), - [solc-bin](https://github.com/ethereum/solc-bin), [solidity-website](https://github.com/ethereum/solidity-website). - - [ ] DockerHub account with push rights to the [``solc`` image](https://hub.docker.com/r/ethereum/solc). - - [ ] Launchpad (Ubuntu One) account with a membership in the ["Ethereum" team](https://launchpad.net/~ethereum) and - a gnupg key for your email in the ``ethereum.org`` domain (has to be version 1, gpg2 won't work). - - [ ] Ubuntu/Debian dependencies of the Docker script: ``docker-buildx``. - - [ ] Ubuntu/Debian dependencies of the PPA scripts: ``devscripts``, ``debhelper``, ``dput``, ``git``, ``wget``, ``ca-certificates``. - - [ ] [npm Registry](https://www.npmjs.com) account added as a collaborator for the [``solc`` package](https://www.npmjs.com/package/solc). - - [ ] Access to the [solidity_lang Twitter account](https://twitter.com/solidity_lang). - - [ ] [Reddit](https://www.reddit.com) account that is at least 10 days old with a minimum of 20 comment karma (``/r/ethereum`` requirements). +- [ ] GitHub account with access to [solidity](https://github.com/ethereum/solidity), [solc-js](https://github.com/ethereum/solc-js), + [solc-bin](https://github.com/ethereum/solc-bin), [solidity-website](https://github.com/ethereum/solidity-website). +- [ ] DockerHub account with push rights to the [`solc` image](https://hub.docker.com/r/ethereum/solc). +- [ ] Launchpad (Ubuntu One) account with a membership in the ["Ethereum" team](https://launchpad.net/~ethereum) and + a gnupg key for your email in the `ethereum.org` domain (has to be version 1, gpg2 won't work). +- [ ] Ubuntu/Debian dependencies of the Docker script: `docker-buildx`. +- [ ] Ubuntu/Debian dependencies of the PPA scripts: `devscripts`, `debhelper`, `dput`, `git`, `wget`, `ca-certificates`. +- [ ] [npm Registry](https://www.npmjs.com) account added as a collaborator for the [`solc` package](https://www.npmjs.com/package/solc). +- [ ] Access to the [solidity_lang Twitter account](https://twitter.com/solidity_lang). +- [ ] [Reddit](https://www.reddit.com) account that is at least 10 days old with a minimum of 20 comment karma (`/r/ethereum` requirements). ### Pre-flight checks 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. - **Note**: In order to run the link check, make sure you've built the docs first via ``docs.sh``. - - [ ] 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`` - - [ ] ``solc-bin`` (make sure the bytecode comparison check did run) - - [ ] (Optional) Create a prerelease in our Ubuntu PPA by following the steps in the PPA section below on ``develop`` rather than on a tag. - This is recommended especially when dealing with PPA for the first time, when we add a new Ubuntu version or when the PPA scripts were modified in this release cycle. - - [ ] Verify that the release tarball of ``solc-js`` works. - Bump version locally, add ``soljson.js`` from CI, build it, compare the file structure with the previous version, install it locally and try to use it. - - [ ] Review [Learning from Past Releases](https://notes.ethereum.org/@solidity/release-mistakes) to make sure you don't repeat the same mistakes. +- [ ] 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. + **Note**: In order to run the link check, make sure you've built the docs first via `docs.sh`. +- [ ] 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` + - [ ] `solc-bin` (make sure the bytecode comparison check did run) +- [ ] (Optional) Create a prerelease in our Ubuntu PPA by following the steps in the PPA section below on `develop` rather than on a tag. + This is recommended especially when dealing with PPA for the first time, when we add a new Ubuntu version or when the PPA scripts were modified in this release cycle. +- [ ] Verify that the release tarball of `solc-js` works. + Bump version locally, add `soljson.js` from CI, build it, compare the file structure with the previous version, install it locally and try to use it. +- [ ] Review [Learning from Past Releases](https://notes.ethereum.org/@solidity/release-mistakes) to make sure you don't repeat the same mistakes. ### Drafts At least a day before the release: - - [ ] Create a draft PR to sort the changelog. - - [ ] Create draft PRs to bump version in ``solidity`` and ``solc-js``. - **Note**: The ``solc-js`` PR won't pass CI checks yet because it depends on the soljson binary from ``solc-bin``. - - [ ] Create a draft of the release on github. - - [ ] Create a draft PR to update soliditylang.org. - - [ ] Create drafts of blog posts. - - [ ] Prepare drafts of Twitter, Reddit and Solidity Forum announcements. +- [ ] Create a draft PR to sort the changelog. +- [ ] Create draft PRs to bump version in `solidity` and `solc-js`. + **Note**: The `solc-js` PR won't pass CI checks yet because it depends on the soljson binary from `solc-bin`. +- [ ] Create a draft of the release on github. +- [ ] Create a draft PR to update soliditylang.org. +- [ ] Create drafts of blog posts. +- [ ] Prepare drafts of Twitter, Reddit and Solidity Forum announcements. ### Blog Post - - [ ] Create a post on [solidity-website](https://github.com/ethereum/solidity-website/tree/main/src/posts) in the ``Releases`` category and explain some of the new features or concepts. - - [ ] Create a post on [solidity-website](https://github.com/ethereum/solidity-website/tree/main/src/posts) in the ``Security Alerts`` category in case of important bug(s). - - [ ] Get the posts reviewed and approved **before the release starts**. +- [ ] Create a post on [solidity-website](https://github.com/ethereum/solidity-website/tree/main/src/posts) in the `Releases` category and explain some of the new features or concepts. +- [ ] Create a post on [solidity-website](https://github.com/ethereum/solidity-website/tree/main/src/posts) in the `Security Alerts` category in case of important bug(s). +- [ ] Get the posts reviewed and approved **before the release starts**. ### Changelog - - [ ] Sort the changelog entries alphabetically and correct any errors you notice. Commit it. - - [ ] Update the changelog to include a release date. - - [ ] Run ``scripts/update_bugs_by_version.py`` to regenerate ``bugs_by_version.json`` from the changelog and ``bugs.json``. - Make sure that the resulting ``bugs_by_version.json`` has a new, empty entry for the new version. - - [ ] Commit changes, create a pull request and wait for the tests. Then merge it. - - [ ] Copy the changelog into the release blog post. +- [ ] Sort the changelog entries alphabetically and correct any errors you notice. Commit it. +- [ ] Update the changelog to include a release date. +- [ ] Run `scripts/update_bugs_by_version.py` to regenerate `bugs_by_version.json` from the changelog and `bugs.json`. + Make sure that the resulting `bugs_by_version.json` has a new, empty entry for the new version. +- [ ] Commit changes, create a pull request and wait for the tests. Then merge it. +- [ ] Copy the changelog into the release blog post. ### Create the Release - - [ ] Create a [release on GitHub](https://github.com/ethereum/solidity/releases/new). - Set the target to the ``develop`` branch and the tag to the new version, e.g. ``v0.8.5``. - Include the following warning: ``**The release is still in progress. You may see broken links and binaries may not yet be available from all sources.**``. - Do not publish it yet - click the ``Save draft`` button instead. - - [ ] Thank voluntary contributors in the GitHub release notes. - Use ``scripts/list_contributors.sh v`` to get initial list of names. - Remove different variants of the same name manually before using the output. - - [ ] Check that all tests on the latest commit in ``develop`` are green. - - [ ] Click the ``Publish release`` button on the release page, creating the tag. - **Important: Must not be done before all the PRs, including changelog cleanup and date, are merged.** - - [ ] Wait for the CI runs on the tag itself. +- [ ] Create a [release on GitHub](https://github.com/ethereum/solidity/releases/new). + Set the target to the `develop` branch and the tag to the new version, e.g. `v0.8.5`. + Include the following warning: `**The release is still in progress. You may see broken links and binaries may not yet be available from all sources.**`. + Do not publish it yet - click the `Save draft` button instead. +- [ ] Thank voluntary contributors in the GitHub release notes. + Use `scripts/list_contributors.sh v` to get initial list of names. + Remove different variants of the same name manually before using the output. +- [ ] Check that all tests on the latest commit in `develop` are green. +- [ ] Click the `Publish release` button on the release page, creating the tag. + **Important: Must not be done before all the PRs, including changelog cleanup and date, are merged.** +- [ ] Wait for the CI runs on the tag itself. ### Upload Release Artifacts and Publish Binaries - - [ ] Switch to the tag that archives have to be created for. - - [ ] Create the ``prerelease.txt`` file: (``echo -n > prerelease.txt``). - - [ ] Run ``scripts/create_source_tarball.sh`` while being on the tag to create the source tarball. This will create the tarball in a directory called ``upload``. - - [ ] Take the tarball from the upload directory (its name should be ``solidity_x.x.x.tar.gz``, otherwise ``prerelease.txt`` was missing in the step before) and upload the source tarball to the release page. - - [ ] Take the ``github-binaries.tar`` tarball from ``c_release_binaries`` run of the tagged commit in circle-ci and add all binaries from it to the release page. - Make sure it contains four binaries: ``solc-windows.exe``, ``solc-macos``, ``solc-static-linux`` and ``soljson.js``. - - [ ] Take the ``solc-bin-binaries.tar`` tarball from ``c_release_binaries`` run of the tagged commit in circle-ci and add all binaries from it to solc-bin. - - [ ] Run ``npm install`` if you've got a clean checkout of the solc-bin repo. - - [ ] Run ``npm run update -- --reuse-hashes`` in ``solc-bin`` and verify that the script has updated ``list.js``, ``list.txt`` and ``list.json`` files correctly and that symlinks to the new release have been added in ``solc-bin/wasm/`` and ``solc-bin/emscripten-wasm32/``. - - [ ] Create a pull request in solc-bin and merge. +- [ ] Switch to the tag that archives have to be created for. +- [ ] Create the `prerelease.txt` file: (`echo -n > prerelease.txt`). +- [ ] Run `scripts/create_source_tarball.sh` while being on the tag to create the source tarball. This will create the tarball in a directory called `upload`. +- [ ] Take the tarball from the upload directory (its name should be `solidity_x.x.x.tar.gz`, otherwise `prerelease.txt` was missing in the step before) and upload the source tarball to the release page. +- [ ] Take the `github-binaries.tar` tarball from `c_release_binaries` run of the tagged commit in circle-ci and add all binaries from it to the release page. + Make sure it contains four binaries: `solc-windows.exe`, `solc-macos`, `solc-static-linux` and `soljson.js`. +- [ ] Take the `solc-bin-binaries.tar` tarball from `c_release_binaries` run of the tagged commit in circle-ci and add all binaries from it to solc-bin. +- [ ] Run `npm install` if you've got a clean checkout of the solc-bin repo. +- [ ] Run `npm run update -- --reuse-hashes` in `solc-bin` and verify that the script has updated `list.js`, `list.txt` and `list.json` files correctly and that symlinks to the new release have been added in `solc-bin/wasm/` and `solc-bin/emscripten-wasm32/`. +- [ ] Create a pull request in solc-bin and merge. ### Homebrew and MacOS - - [ ] Update the version and the hash (``sha256sum solidity_$VERSION.tar.gz``) in the [``solidity`` formula in Homebrew core repository](https://github.com/Homebrew/homebrew-core/blob/master/Formula/s/solidity.rb). +- [ ] Update the version and the hash (`sha256sum solidity_$VERSION.tar.gz`) in the [`solidity` formula in Homebrew core repository](https://github.com/Homebrew/homebrew-core/blob/master/Formula/s/solidity.rb). ### Docker - - [ ] Make sure ``docker-buildx`` is installed. - - [ ] Run ``./scripts/docker_deploy_manual.sh v$VERSION``. +- [ ] Make sure `docker-buildx` is installed. +- [ ] Run `./scripts/docker_deploy_manual.sh v$VERSION`. ### PPA - - [ ] Create ``.release_ppa_auth`` at the root of your local Solidity checkout and set ``LAUNCHPAD_EMAIL`` and ``LAUNCHPAD_KEYID`` to your key's email and key id. - - [ ] Double-check that the ``DISTRIBUTIONS`` list in ``scripts/release_ppa.sh`` and ``scripts/deps-ppa/static_z3.sh`` contains the most recent versions of Ubuntu. - - [ ] Make sure the [``~ethereum/cpp-build-deps`` PPA repository](https://launchpad.net/~ethereum/+archive/ubuntu/cpp-build-deps) contains ``libz3-static-dev`` builds for all current versions of Ubuntu. - Note that it may be included in the ``z3-static`` multipackage (follow the ``View package details`` link to check). - If not present, run ``scripts/deps-ppa/static_z3.sh`` and wait for the builds to succeed before continuing. - - [ ] Run ``scripts/release_ppa.sh v$VERSION`` to create the PPA release. - This will create a single package containing static binary for older Ubuntu versions in the [``~ethereum/ethereum-static`` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum-static) - and separate packages with dynamically-linked binaries for recent versions (those listed in ``DISTRIBUTIONS``) in the [``~ethereum/ethereum`` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum). - - [ ] Wait for the build to be finished and published for *all architectures* (currently we only build for ``amd64``, but we may add ``arm`` in the future). - **SERIOUSLY: DO NOT PROCEED EARLIER!!!** - - [ ] *After* the package with the static build is *published*, use it to create packages for older Ubuntu versions. - Copy the static package to the [``~ethereum/ethereum`` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum) - for the destination series ``Trusty``, ``Xenial``, ``Bionic``, and ``Focal`` - while selecting ``Copy existing binaries``. +- [ ] Create `.release_ppa_auth` at the root of your local Solidity checkout and set `LAUNCHPAD_EMAIL` and `LAUNCHPAD_KEYID` to your key's email and key id. +- [ ] Double-check that the `DISTRIBUTIONS` list in `scripts/release_ppa.sh` and `scripts/deps-ppa/static_z3.sh` contains the most recent versions of Ubuntu. +- [ ] Make sure the [`~ethereum/cpp-build-deps` PPA repository](https://launchpad.net/~ethereum/+archive/ubuntu/cpp-build-deps) contains `libz3-static-dev` builds for all current versions of Ubuntu. + Note that it may be included in the `z3-static` multipackage (follow the `View package details` link to check). + If not present, run `scripts/deps-ppa/static_z3.sh` and wait for the builds to succeed before continuing. +- [ ] Run `scripts/release_ppa.sh v$VERSION` to create the PPA release. + This will create a single package containing static binary for older Ubuntu versions in the [`~ethereum/ethereum-static` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum-static) + and separate packages with dynamically-linked binaries for recent versions (those listed in `DISTRIBUTIONS`) in the [`~ethereum/ethereum` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum). +- [ ] Wait for the build to be finished and published for *all architectures* (currently we only build for `amd64`, but we may add `arm` in the future). + **SERIOUSLY: DO NOT PROCEED EARLIER!!!** +- [ ] *After* the package with the static build is *published*, use it to create packages for older Ubuntu versions. + Copy the static package to the [`~ethereum/ethereum` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum) + for the destination series `Trusty`, `Xenial`, `Bionic`, and `Focal` + while selecting `Copy existing binaries`. ### Release solc-js - - [ ] Wait until solc-bin was properly deployed. You can test this via remix - a test run through remix is advisable anyway. - - [ ] Increment the version number, create a pull request for that, merge it after tests succeeded. - - [ ] Create a tag using ``git tag --annotate v$VERSION`` and push it with ``git push --tags``. - - [ ] Wait for the CI runs on the tag itself. - - [ ] Take the ``solc-x.y.z.tgz`` artifact from ``build-package`` run on the tagged commit in circle-ci. - Inspect the tarball to ensure that it contains an up-to-date compiler binary (``soljson.js``). - - [ ] Run ``npm publish solc-x.y.z.tgz`` to publish the newly created tarball. +- [ ] Wait until solc-bin was properly deployed. You can test this via remix - a test run through remix is advisable anyway. +- [ ] Increment the version number, create a pull request for that, merge it after tests succeeded. +- [ ] Create a tag using `git tag --annotate v$VERSION` and push it with `git push --tags`. +- [ ] Wait for the CI runs on the tag itself. +- [ ] Take the `solc-x.y.z.tgz` artifact from `build-package` run on the tagged commit in circle-ci. + Inspect the tarball to ensure that it contains an up-to-date compiler binary (`soljson.js`). +- [ ] Run `npm publish solc-x.y.z.tgz` to publish the newly created tarball. ### Post-release - - [ ] Make sure the documentation for the new release has been published successfully. - Go to the [documentation status page at ReadTheDocs](https://readthedocs.org/projects/solidity/) and verify that the new version is listed, works and is marked as default. - - [ ] Remove "still in progress" warning from the [release notes](https://github.com/ethereum/solidity/releases). - - [ ] Merge the [blog posts](https://github.com/ethereum/solidity-website/pulls) related to the release. - - [ ] Create a commit to increase the version number on ``develop`` in ``CMakeLists.txt`` and add a new skeleton changelog entry. - - [ ] Update the release information section [in the source of soliditylang.org](https://github.com/ethereum/solidity-website/blob/main/src/pages/index.tsx). - - [ ] Announce on [Twitter](https://twitter.com/solidity_lang), including links to the release and the blog post. - - [ ] Announce on [Fosstodon](https://fosstodon.org/@solidity/), including links to the release and the blog post. - - [ ] Share the announcement on Reddit in [``/r/ethdev``](https://reddit.com/r/ethdev/), cross-posted to [``/r/ethereum``](https://reddit.com/r/ethereum/). - - [ ] Share the announcement on the [Solidity forum](https://forum.soliditylang.org) in the ``Announcements`` category. - - [ ] Share the announcement on [Project Updates](https://discord.com/channels/420394352083337236/798974456704925696) - - [ ] Share the announcement on [`#solidity` channel on Matrix](https://matrix.to/#/#ethereum_solidity:gitter.im) - - [ ] Share the announcement on [`#solc-tooling`](https://matrix.to/#/#solc-tooling:matrix.org) - - [ ] If anything went wrong this time, mention it in [Learning from Past Releases](https://notes.ethereum.org/@solidity/release-mistakes). - - [ ] Bump vendored dependencies. - - [ ] Lean back, wait for bug reports and repeat from step 1 :). +- [ ] Make sure the documentation for the new release has been published successfully. + Go to the [documentation status page at ReadTheDocs](https://readthedocs.org/projects/solidity/) and verify that the new version is listed, works and is marked as default. +- [ ] Remove "still in progress" warning from the [release notes](https://github.com/ethereum/solidity/releases). +- [ ] Merge the [blog posts](https://github.com/ethereum/solidity-website/pulls) related to the release. +- [ ] Create a commit to increase the version number on `develop` in `CMakeLists.txt` and add a new skeleton changelog entry. +- [ ] Update the release information section [in the source of soliditylang.org](https://github.com/ethereum/solidity-website/blob/main/src/pages/index.tsx). +- [ ] Announce on [Twitter](https://twitter.com/solidity_lang), including links to the release and the blog post. +- [ ] Announce on [Fosstodon](https://fosstodon.org/@solidity/), including links to the release and the blog post. +- [ ] Share the announcement on Reddit in [`/r/ethdev`](https://reddit.com/r/ethdev/), cross-posted to [`/r/ethereum`](https://reddit.com/r/ethereum/). +- [ ] Share the announcement on the [Solidity forum](https://forum.soliditylang.org) in the `Announcements` category. +- [ ] Share the announcement on [Project Updates](https://discord.com/channels/420394352083337236/798974456704925696) +- [ ] Share the announcement on [`#solidity` channel on Matrix](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [ ] Share the announcement on [`#solc-tooling`](https://matrix.to/#/#solc-tooling:matrix.org) +- [ ] If anything went wrong this time, mention it in [Learning from Past Releases](https://notes.ethereum.org/@solidity/release-mistakes). +- [ ] Bump vendored dependencies. +- [ ] Lean back, wait for bug reports and repeat from step 1 :). From 70d344a0e93b299b531cbde369713ae067567688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 14 Mar 2025 23:55:49 +0100 Subject: [PATCH 06/80] Remove double backticks from CODING_STYLE.md --- CODING_STYLE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODING_STYLE.md b/CODING_STYLE.md index 2305ae1ec752..b70126d91643 100644 --- a/CODING_STYLE.md +++ b/CODING_STYLE.md @@ -110,9 +110,9 @@ Use `solAssert` and `solUnimplementedAssert` generously to check assumptions tha 4. Favour declarations close to use; do not habitually declare at top of scope ala C. 5. Pass non-trivial parameters as const reference, unless the data is to be copied into the function, then either pass by const reference or by value and use std::move. 6. If a function returns multiple values, use std::tuple (std::pair acceptable) or better introduce a struct type. Do not use */& arguments. -7. Use parameters of pointer type only if ``nullptr`` is a valid argument, use references otherwise. Often, ``std::optional`` is better suited than a raw pointer. +7. Use parameters of pointer type only if `nullptr` is a valid argument, use references otherwise. Often, `std::optional` is better suited than a raw pointer. 8. Never use a macro where adequate non-preprocessor C++ can be written. -9. Only use ``auto`` if the type is very long and rather irrelevant. +9. Only use `auto` if the type is very long and rather irrelevant. 10. Do not pass bools: prefer enumerations instead. 11. Prefer enum class to straight enum. 12. Always initialize POD variables, even if their value is overwritten later. From 145e281fac9369c920c9628fe4a967f7b71e9193 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:13:23 +0100 Subject: [PATCH 07/80] Name dependent CSE bug: Compare ASM only --- test/cmdlineTests/~name_dependent_cse_bug/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cmdlineTests/~name_dependent_cse_bug/test.sh b/test/cmdlineTests/~name_dependent_cse_bug/test.sh index 96c3ac23ed97..710e82b1e7a0 100755 --- a/test/cmdlineTests/~name_dependent_cse_bug/test.sh +++ b/test/cmdlineTests/~name_dependent_cse_bug/test.sh @@ -19,7 +19,7 @@ function assemble_with_variable_name { local variable_name="$2" sed -e "s|__placeholder__|${variable_name}|g" "$input_file" | msg_on_error --no-stderr \ - "$SOLC" --strict-assembly - --optimize --debug-info none | + "$SOLC" --strict-assembly - --optimize --debug-info none --asm | stripCLIDecorations } From 74cd757be52c658a8eef7a81c62d364ee1921652 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 17 Mar 2025 08:52:34 +0100 Subject: [PATCH 08/80] SSACFG Builder: Improve function call visitor --- .../evm/SSAControlFlowGraphBuilder.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp b/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp index bf8cfd92a802..69e9e3052104 100644 --- a/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp +++ b/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp @@ -548,21 +548,22 @@ void SSAControlFlowGraphBuilder::assign(std::vector SSAControlFlowGraphBuilder::visitFunctionCall(FunctionCall const& _call) { bool canContinue = true; - SSACFG::Operation operation = [&](){ - if (BuiltinFunction const* builtin = resolveBuiltinFunction(_call.functionName, m_dialect)) + SSACFG::Operation operation = std::visit(util::GenericVisitor{ + [&](BuiltinName const& _builtinName) { - SSACFG::Operation result{{}, SSACFG::BuiltinCall{_call.debugData, *builtin, _call}, {}}; + auto const& builtin = m_dialect.builtin(_builtinName.handle); + SSACFG::Operation result{{}, SSACFG::BuiltinCall{_call.debugData, builtin, _call}, {}}; for (auto&& [idx, arg]: _call.arguments | ranges::views::enumerate | ranges::views::reverse) - if (!builtin->literalArgument(idx).has_value()) + if (!builtin.literalArgument(idx).has_value()) result.inputs.emplace_back(std::visit(*this, arg)); - for (size_t i = 0; i < builtin->numReturns; ++i) + for (size_t i = 0; i < builtin.numReturns; ++i) result.outputs.emplace_back(m_graph.newVariable(m_currentBlock)); - canContinue = builtin->controlFlowSideEffects.canContinue; + canContinue = builtin.controlFlowSideEffects.canContinue; return result; - } - else + }, + [&](Identifier const& _identifier) { - YulName const functionName{resolveFunctionName(_call.functionName, m_dialect)}; + YulName const& functionName = _identifier.name; Scope::Function const& function = lookupFunction(functionName); auto const* definition = findFunctionDefinition(&function); yulAssert(definition); @@ -574,7 +575,7 @@ std::vector SSAControlFlowGraphBuilder::visitFunctionCall(Funct result.outputs.emplace_back(m_graph.newVariable(m_currentBlock)); return result; } - }(); + }, _call.functionName); auto results = operation.outputs; currentBlock().operations.emplace_back(std::move(operation)); if (!canContinue) From 25463c564dc18cb98750e49d227901087a32940b Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Fri, 14 Feb 2025 12:40:18 +0100 Subject: [PATCH 09/80] SMTChecker: Fix analysis for selected contracts Previously, when a contract was selected for analysis, the analysis was incorrect. There were two issues. First, the contracts in the same file were considered as entry points even though they were not selected for analysis. Second, the contracts in a different file were mostly ignored, resulting in unsoundness when an external call was made to such a contract in trusted mode. The solution to the above problems is to always create representation of all contracts (in case they are called from the selected contract), but create verification targets only for the selected contracts. --- Changelog.md | 1 + libsolidity/formal/BMC.cpp | 2 +- libsolidity/formal/CHC.cpp | 26 ++++---- libsolidity/formal/ModelCheckerSettings.cpp | 2 +- libsolidity/formal/SMTEncoder.cpp | 13 ++-- libsolidity/formal/SMTEncoder.h | 11 ++-- .../err | 26 -------- .../model_checker_contracts_only_one/err | 2 +- .../output.json | 66 ------------------- .../output.json | 4 +- .../output.json | 4 +- test/libsolidity/SMTCheckerTest.cpp | 11 +++- ...ternal_call_from_constructor_1_trusted.sol | 5 +- ...ternal_call_from_constructor_3_trusted.sol | 5 +- ...lled_from_selection_with_trusted_calls.sol | 11 ++++ ...selected_and_not_called_from_selection.sol | 9 +++ ...selected_and_not_called_from_selection.sol | 13 ++++ ...selected_and_not_called_from_selection.sol | 11 ++++ 18 files changed, 94 insertions(+), 128 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_analyzed_when_called_from_selection_with_trusted_calls.sol create mode 100644 test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol create mode 100644 test/libsolidity/smtCheckerTests/verification_target/target_in_constructor_of_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol create mode 100644 test/libsolidity/smtCheckerTests/verification_target/target_in_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol diff --git a/Changelog.md b/Changelog.md index 47334fd3dacd..3e423c838b67 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ Compiler Features: Bugfixes: +* SMTChecker: Fix incorrect analysis when only a subset of contracts is selected with `--model-checker-contracts`. ### 0.8.29 (2025-03-12) diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index e5521b816582..6dcd856ee2af 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -1068,7 +1068,7 @@ void BMC::addVerificationTarget( Expression const* _expression ) { - if (!m_settings.targets.has(_type) || (m_currentContract && !shouldAnalyze(*m_currentContract))) + if (!m_settings.targets.has(_type) || (m_currentContract && !shouldAnalyzeVerificationTargetsFor(*m_currentContract))) return; BMCVerificationTarget target{ diff --git a/libsolidity/formal/CHC.cpp b/libsolidity/formal/CHC.cpp index c313ae54e1ae..bab340051f82 100644 --- a/libsolidity/formal/CHC.cpp +++ b/libsolidity/formal/CHC.cpp @@ -89,7 +89,7 @@ void CHC::analyze(SourceUnit const& _source) " If you wish to use Eldarica, please enable Eldarica only." ); - if (!shouldAnalyze(_source)) + if (!shouldAnalyzeVerificationTargetsFor(_source)) return; resetSourceAnalysis(); @@ -131,7 +131,7 @@ std::vector CHC::unhandledQueries() const bool CHC::visit(ContractDefinition const& _contract) { - if (!shouldAnalyze(_contract)) + if (!shouldEncode(_contract)) return false; // Raises UnimplementedFeatureError in the presence of transient storage variables @@ -152,7 +152,7 @@ bool CHC::visit(ContractDefinition const& _contract) void CHC::endVisit(ContractDefinition const& _contract) { - if (!shouldAnalyze(_contract)) + if (!shouldEncode(_contract)) return; for (auto base: _contract.annotation().linearizedBaseContracts) @@ -239,15 +239,14 @@ void CHC::endVisit(ContractDefinition const& _contract) setCurrentBlock(*m_constructorSummaries.at(&_contract)); solAssert(&_contract == m_currentContract, ""); - if (shouldAnalyze(_contract)) - { - auto constructor = _contract.constructor(); - auto txConstraints = state().txTypeConstraints(); - if (!constructor || !constructor->isPayable()) - txConstraints = txConstraints && state().txNonPayableConstraint(); + smtAssert(shouldEncode(_contract)); + auto constructor = _contract.constructor(); + auto txConstraints = state().txTypeConstraints(); + if (!constructor || !constructor->isPayable()) + txConstraints = txConstraints && state().txNonPayableConstraint(); + connectBlocks(m_currentBlock, interface(), txConstraints && errorFlag().currentValue() == 0); + if (shouldAnalyzeVerificationTargetsFor(_contract)) m_queryPlaceholders[&_contract].push_back({txConstraints, errorFlag().currentValue(), m_currentBlock}); - connectBlocks(m_currentBlock, interface(), txConstraints && errorFlag().currentValue() == 0); - } solAssert(m_scopes.back() == &_contract, ""); m_scopes.pop_back(); @@ -338,7 +337,7 @@ void CHC::endVisit(FunctionDefinition const& _function) !_function.isConstructor() && _function.isPublic() && contractFunctions(*m_currentContract).count(&_function) && - shouldAnalyze(*m_currentContract) + shouldEncode(*m_currentContract) ) { defineExternalFunctionInterface(_function, *m_currentContract); @@ -349,8 +348,9 @@ void CHC::endVisit(FunctionDefinition const& _function) auto ifacePre = smt::interfacePre(*m_interfaces.at(m_currentContract), *m_currentContract, m_context); auto sum = externalSummary(_function); - m_queryPlaceholders[&_function].push_back({sum, errorFlag().currentValue(), ifacePre}); connectBlocks(ifacePre, interface(), sum && errorFlag().currentValue() == 0); + if (shouldAnalyzeVerificationTargetsFor(*m_currentContract)) + m_queryPlaceholders[&_function].push_back({sum, errorFlag().currentValue(), ifacePre}); } m_currentFunction = nullptr; diff --git a/libsolidity/formal/ModelCheckerSettings.cpp b/libsolidity/formal/ModelCheckerSettings.cpp index ed4d5ce204c0..ffeedfe3ace0 100644 --- a/libsolidity/formal/ModelCheckerSettings.cpp +++ b/libsolidity/formal/ModelCheckerSettings.cpp @@ -123,7 +123,7 @@ std::optional ModelCheckerContracts::fromString(std::stri { auto&& names = sourceContract | ranges::views::split(':') | ranges::to>(); if (names.size() != 2 || names.at(0).empty() || names.at(1).empty()) - return {}; + return std::nullopt; chosen[names.at(0)].insert(names.at(1)); } diff --git a/libsolidity/formal/SMTEncoder.cpp b/libsolidity/formal/SMTEncoder.cpp index a0b71f5941a9..740af9382b88 100644 --- a/libsolidity/formal/SMTEncoder.cpp +++ b/libsolidity/formal/SMTEncoder.cpp @@ -1092,19 +1092,24 @@ void SMTEncoder::visitPublicGetter(FunctionCall const& _funCall) } } -bool SMTEncoder::shouldAnalyze(SourceUnit const& _source) const +bool SMTEncoder::shouldEncode(ContractDefinition const& _contract) const +{ + return _contract.canBeDeployed(); +} + +bool SMTEncoder::shouldAnalyzeVerificationTargetsFor(SourceUnit const& _source) const { return m_settings.contracts.isDefault() || m_settings.contracts.has(*_source.annotation().path); } -bool SMTEncoder::shouldAnalyze(ContractDefinition const& _contract) const +bool SMTEncoder::shouldAnalyzeVerificationTargetsFor(ContractDefinition const& _contract) const { - if (!_contract.canBeDeployed()) + if (!shouldEncode(_contract)) return false; return m_settings.contracts.isDefault() || - m_settings.contracts.has(_contract.sourceUnitName()); + m_settings.contracts.has(_contract.sourceUnitName(), _contract.name()); } void SMTEncoder::visitTypeConversion(FunctionCall const& _funCall) diff --git a/libsolidity/formal/SMTEncoder.h b/libsolidity/formal/SMTEncoder.h index f926a0d0fc80..5bfb70d8126d 100644 --- a/libsolidity/formal/SMTEncoder.h +++ b/libsolidity/formal/SMTEncoder.h @@ -238,11 +238,12 @@ class SMTEncoder: public ASTConstVisitor void visitFunctionIdentifier(Identifier const& _identifier); virtual void visitPublicGetter(FunctionCall const& _funCall); - /// @returns true if @param _contract is set for analysis in the settings - /// and it is not abstract. - bool shouldAnalyze(ContractDefinition const& _contract) const; - /// @returns true if @param _source is set for analysis in the settings. - bool shouldAnalyze(SourceUnit const& _source) const; + /// @returns true if symbolic representation of @param _contract is required for verification + bool shouldEncode(ContractDefinition const& _contract) const; + /// @returns true if the verification targets of @param _contract are actually selected for verification + bool shouldAnalyzeVerificationTargetsFor(ContractDefinition const& _contract) const; + /// @returns true if we should descend into @param _source to look for contracts that should be verified + bool shouldAnalyzeVerificationTargetsFor(SourceUnit const& _source) const; /// @returns the state variable returned by a public getter if /// @a _expr is a call to a public getter, diff --git a/test/cmdlineTests/model_checker_contracts_inexistent_contract/err b/test/cmdlineTests/model_checker_contracts_inexistent_contract/err index 00b97763f340..6326537e928c 100644 --- a/test/cmdlineTests/model_checker_contracts_inexistent_contract/err +++ b/test/cmdlineTests/model_checker_contracts_inexistent_contract/err @@ -1,27 +1 @@ Warning: Requested contract "C" does not exist in source "model_checker_contracts_inexistent_contract/input.sol". - -Warning: CHC: Assertion violation happens here. -Counterexample: - -x = 0 - -Transaction trace: -B.constructor() -B.f(0) - --> model_checker_contracts_inexistent_contract/input.sol:5:3: - | -5 | assert(x > 0); - | ^^^^^^^^^^^^^ - -Warning: CHC: Assertion violation happens here. -Counterexample: - -y = 0 - -Transaction trace: -A.constructor() -A.g(0) - --> model_checker_contracts_inexistent_contract/input.sol:10:3: - | -10 | assert(y > 0); - | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_contracts_only_one/err b/test/cmdlineTests/model_checker_contracts_only_one/err index 2088e19c7a2f..9c8ade6931c3 100644 --- a/test/cmdlineTests/model_checker_contracts_only_one/err +++ b/test/cmdlineTests/model_checker_contracts_only_one/err @@ -4,7 +4,7 @@ Counterexample: x = 0 Transaction trace: -B.constructor() +A.constructor() B.f(0) --> model_checker_contracts_only_one/input.sol:5:3: | diff --git a/test/cmdlineTests/standard_model_checker_contracts_inexistent_contract/output.json b/test/cmdlineTests/standard_model_checker_contracts_inexistent_contract/output.json index 22d5f32de32b..c6bde90dfbaa 100644 --- a/test/cmdlineTests/standard_model_checker_contracts_inexistent_contract/output.json +++ b/test/cmdlineTests/standard_model_checker_contracts_inexistent_contract/output.json @@ -9,72 +9,6 @@ "message": "Requested contract \"C\" does not exist in source \"Source\".", "severity": "warning", "type": "Warning" - }, - { - "component": "general", - "errorCode": "6328", - "formattedMessage": "Warning: CHC: Assertion violation happens here. -Counterexample: - -y = 0 - -Transaction trace: -B.constructor() -B.g(0) - --> Source:5:7: - | -5 | \t\t\t\t\t\tassert(y > 0); - | \t\t\t\t\t\t^^^^^^^^^^^^^ - -", - "message": "CHC: Assertion violation happens here. -Counterexample: - -y = 0 - -Transaction trace: -B.constructor() -B.g(0)", - "severity": "warning", - "sourceLocation": { - "end": 137, - "file": "Source", - "start": 124 - }, - "type": "Warning" - }, - { - "component": "general", - "errorCode": "6328", - "formattedMessage": "Warning: CHC: Assertion violation happens here. -Counterexample: - -x = 0 - -Transaction trace: -A.constructor() -A.f(0) - --> Source:10:7: - | -10 | \t\t\t\t\t\tassert(x > 0); - | \t\t\t\t\t\t^^^^^^^^^^^^^ - -", - "message": "CHC: Assertion violation happens here. -Counterexample: - -x = 0 - -Transaction trace: -A.constructor() -A.f(0)", - "severity": "warning", - "sourceLocation": { - "end": 231, - "file": "Source", - "start": 218 - }, - "type": "Warning" } ], "sources": { diff --git a/test/cmdlineTests/standard_model_checker_contracts_multi_source/output.json b/test/cmdlineTests/standard_model_checker_contracts_multi_source/output.json index fe287f833637..f568de16044b 100644 --- a/test/cmdlineTests/standard_model_checker_contracts_multi_source/output.json +++ b/test/cmdlineTests/standard_model_checker_contracts_multi_source/output.json @@ -9,7 +9,7 @@ Counterexample: y = 0 Transaction trace: -B.constructor() +A.constructor() B.g(0) --> Source:5:7: | @@ -23,7 +23,7 @@ Counterexample: y = 0 Transaction trace: -B.constructor() +A.constructor() B.g(0)", "severity": "warning", "sourceLocation": { diff --git a/test/cmdlineTests/standard_model_checker_contracts_only_one/output.json b/test/cmdlineTests/standard_model_checker_contracts_only_one/output.json index e9fc1b4cf6b5..a7ca17b4f5b4 100644 --- a/test/cmdlineTests/standard_model_checker_contracts_only_one/output.json +++ b/test/cmdlineTests/standard_model_checker_contracts_only_one/output.json @@ -9,7 +9,7 @@ Counterexample: y = 0 Transaction trace: -B.constructor() +A.constructor() B.g(0) --> Source:5:7: | @@ -23,7 +23,7 @@ Counterexample: y = 0 Transaction trace: -B.constructor() +A.constructor() B.g(0)", "severity": "warning", "sourceLocation": { diff --git a/test/libsolidity/SMTCheckerTest.cpp b/test/libsolidity/SMTCheckerTest.cpp index d8843e0d3a1e..ce099091f69c 100644 --- a/test/libsolidity/SMTCheckerTest.cpp +++ b/test/libsolidity/SMTCheckerTest.cpp @@ -32,8 +32,17 @@ SMTCheckerTest::SMTCheckerTest(std::string const& _filename): universalCallback(nullptr, smtCommand) { auto contract = m_reader.stringSetting("SMTContract", ""); - if (!contract.empty()) + auto maybeContracts = ModelCheckerContracts::fromString(contract); + auto isValidContractName = [](std::string const& _name) + { + return !_name.empty() && _name.find_first_of(" \t\n\r:,") == std::string::npos; + }; + if (maybeContracts) + m_modelCheckerSettings.contracts = *maybeContracts; + else if (isValidContractName(contract)) m_modelCheckerSettings.contracts.contracts[""] = {contract}; + else + BOOST_THROW_EXCEPTION(std::runtime_error("Invalid contract specified in SMTContract setting.")); auto extCallsMode = ModelCheckerExtCalls::fromString(m_reader.stringSetting("SMTExtCalls", "untrusted")); if (extCallsMode) diff --git a/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_1_trusted.sol b/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_1_trusted.sol index 6f2b717b5e87..051215bb102d 100644 --- a/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_1_trusted.sol +++ b/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_1_trusted.sol @@ -1,6 +1,6 @@ contract State { function f(uint _x) public pure returns (uint) { - assert(_x < 100); // should fail + assert(_x < 100); // should hold when analyzing only contract C (can fail only when analyzing State as standalone contract) return _x; } } @@ -18,5 +18,4 @@ contract C { // SMTExtCalls: trusted // SMTIgnoreInv: yes // ---- -// Warning 6328: (69-85): 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. +// Info 1391: CHC: 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/external_calls/external_call_from_constructor_3_trusted.sol b/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_3_trusted.sol index 590664055d6b..0f22100d696d 100644 --- a/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_3_trusted.sol +++ b/test/libsolidity/smtCheckerTests/external_calls/external_call_from_constructor_3_trusted.sol @@ -1,6 +1,6 @@ contract State { function f(uint _x) public pure returns (uint) { - assert(_x < 100); // should fail + assert(_x < 100); // should hold when analyzing only contract C (can fail only when analyzing State as standalone contract) return _x; } } @@ -21,5 +21,4 @@ contract C { // SMTEngine: all // SMTExtCalls: trusted // ---- -// Warning 6328: (69-85): 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. +// Info 1391: CHC: 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/imports/target_in_imported_contract_analyzed_when_called_from_selection_with_trusted_calls.sol b/test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_analyzed_when_called_from_selection_with_trusted_calls.sol new file mode 100644 index 000000000000..9389f7d93866 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_analyzed_when_called_from_selection_with_trusted_calls.sol @@ -0,0 +1,11 @@ +==== Source: A.sol ==== +contract A { function a() pure public { assert(false); } } +==== Source: B.sol ==== +import "A.sol"; +contract B { function b(A a) pure public { a.a(); } } +// ==== +// SMTContract: B.sol:B +// SMTEngine: chc +// SMTExtCalls: trusted +// ---- +// Warning 6328: (A.sol:40-53): CHC: Assertion violation happens here.\nCounterexample:\n\na = 0\n\nTransaction trace:\nB.constructor()\nB.b(0)\n A.a() -- trusted external call diff --git a/test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol b/test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol new file mode 100644 index 000000000000..a7c472bbcd1a --- /dev/null +++ b/test/libsolidity/smtCheckerTests/imports/target_in_imported_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol @@ -0,0 +1,9 @@ +==== Source: A.sol ==== +contract A { function a() pure public { assert(false); } } +==== Source: B.sol ==== +import "A.sol"; +contract B { function b() pure public { } } +// ==== +// SMTContract: B.sol:B +// SMTEngine: chc +// ---- diff --git a/test/libsolidity/smtCheckerTests/verification_target/target_in_constructor_of_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol b/test/libsolidity/smtCheckerTests/verification_target/target_in_constructor_of_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol new file mode 100644 index 000000000000..29d8017cc075 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/verification_target/target_in_constructor_of_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol @@ -0,0 +1,13 @@ +contract B { + constructor() { fail(); } + + function fail() pure internal { assert(false); } +} + +contract A { + function safe() pure public { } +} +// ==== +// SMTContract: A +// SMTEngine: chc +// ---- diff --git a/test/libsolidity/smtCheckerTests/verification_target/target_in_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol b/test/libsolidity/smtCheckerTests/verification_target/target_in_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol new file mode 100644 index 000000000000..f9fcdbb18e7c --- /dev/null +++ b/test/libsolidity/smtCheckerTests/verification_target/target_in_same_source_contract_not_analyzed_when_not_selected_and_not_called_from_selection.sol @@ -0,0 +1,11 @@ +contract B { + function fail() pure public { assert(false); } +} + +contract A { + function safe() pure public { } +} +// ==== +// SMTContract: A +// SMTEngine: chc +// ---- From f2c9eecb46107a6caa1a9604fec7613b027a3d4a Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 17 Mar 2025 08:59:15 +0100 Subject: [PATCH 10/80] Yul Disambiguator: Don't check for builtins when translating identifiers --- libyul/optimiser/Disambiguator.cpp | 6 +++--- libyul/optimiser/Disambiguator.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libyul/optimiser/Disambiguator.cpp b/libyul/optimiser/Disambiguator.cpp index 55219f6eae37..343feb0be379 100644 --- a/libyul/optimiser/Disambiguator.cpp +++ b/libyul/optimiser/Disambiguator.cpp @@ -30,15 +30,15 @@ using namespace solidity; using namespace solidity::yul; using namespace solidity::util; -YulName Disambiguator::translateIdentifier(YulName _originalName) +YulName Disambiguator::translateIdentifier(YulName const _originalName) { - if (m_dialect.findBuiltin(_originalName.str()) || m_externallyUsedIdentifiers.count(_originalName)) + if (m_externallyUsedIdentifiers.contains(_originalName)) return _originalName; assertThrow(!m_scopes.empty() && m_scopes.back(), OptimizerException, ""); Scope::Identifier const* id = m_scopes.back()->lookup(_originalName); assertThrow(id, OptimizerException, ""); - if (!m_translations.count(id)) + if (!m_translations.contains(id)) m_translations[id] = m_nameDispenser.newName(_originalName); return m_translations.at(id); } diff --git a/libyul/optimiser/Disambiguator.h b/libyul/optimiser/Disambiguator.h index 36d178b086c1..7ff186f0a8c7 100644 --- a/libyul/optimiser/Disambiguator.h +++ b/libyul/optimiser/Disambiguator.h @@ -56,7 +56,7 @@ class Disambiguator: public ASTCopier void leaveScope(Block const& _block) override; void enterFunction(FunctionDefinition const& _function) override; void leaveFunction(FunctionDefinition const& _function) override; - YulName translateIdentifier(YulName _name) override; + YulName translateIdentifier(YulName _originalName) override; void enterScopeInternal(Scope& _scope); void leaveScopeInternal(Scope& _scope); From 8f38f2304a69ad73b3800c5d552c2bda9dd8afff Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:45:17 +0100 Subject: [PATCH 11/80] Peephole optimiser: Replace apply methods recursion by folding expression --- libevmasm/PeepholeOptimiser.cpp | 67 +++++++++++++++------------------ 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/libevmasm/PeepholeOptimiser.cpp b/libevmasm/PeepholeOptimiser.cpp index 879f5b3272dc..cc22db9fa2fd 100644 --- a/libevmasm/PeepholeOptimiser.cpp +++ b/libevmasm/PeepholeOptimiser.cpp @@ -690,16 +690,12 @@ struct DeduplicateNextTagSize1 : SimplePeepholeOptimizerMethod +void applyMethods(OptimiserState& _state) { - assertThrow(false, OptimizerException, "Peephole optimizer failed to apply identity."); -} - -template -void applyMethods(OptimiserState& _state, Method, OtherMethods... _other) -{ - if (!Method::apply(_state)) - applyMethods(_state, _other...); + bool continueWithNextMethod = true; + ((continueWithNextMethod && (continueWithNextMethod &= !Method::apply(_state))), ...); + assertThrow(!continueWithNextMethod, OptimizerException, "Peephole optimizer failed to apply identity."); } size_t numberOfPops(AssemblyItems const& _items) @@ -721,33 +717,32 @@ bool PeepholeOptimiser::optimise() auto const approx = evmasm::Precision::Approximate; OptimiserState state {m_items, 0, back_inserter(m_optimisedItems), m_evmVersion}; while (state.i < m_items.size()) - applyMethods( - state, - PushPop(), - OpPop(), - OpStop(), - OpReturnRevert(), - DoublePush(), - DoubleSwap(), - CommutativeSwap(), - SwapComparison(), - DupSwap(), - IsZeroIsZeroJumpI(), - IsZeroIsZeroRJumpI(), // EOF specific - EqIsZeroJumpI(), - EqIsZeroRJumpI(), // EOF specific - DoubleJump(), - DoubleRJump(), // EOF specific - JumpToNext(), - RJumpToNext(), // EOF specific - UnreachableCode(), - DeduplicateNextTagSize3(), - DeduplicateNextTagSize2(), - DeduplicateNextTagSize1(), - TagConjunctions(), - TruthyAnd(), - Identity() - ); + applyMethods< + PushPop, + OpPop, + OpStop, + OpReturnRevert, + DoublePush, + DoubleSwap, + CommutativeSwap, + SwapComparison, + DupSwap, + IsZeroIsZeroJumpI, + IsZeroIsZeroRJumpI, // EOF specific + EqIsZeroJumpI, + EqIsZeroRJumpI, // EOF specific + DoubleJump, + DoubleRJump, // EOF specific + JumpToNext, + RJumpToNext, // EOF specific + UnreachableCode, + DeduplicateNextTagSize3, + DeduplicateNextTagSize2, + DeduplicateNextTagSize1, + TagConjunctions, + TruthyAnd, + Identity + >(state); if (m_optimisedItems.size() < m_items.size() || ( m_optimisedItems.size() == m_items.size() && ( evmasm::bytesRequired(m_optimisedItems, 3, m_evmVersion, approx) < evmasm::bytesRequired(m_items, 3, m_evmVersion, approx) || From 098b854ce59393a1ef48e06de6b031a793486508 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:38:07 +0100 Subject: [PATCH 12/80] IRGeneratorForStatements does not check for builtin when mangling user identifiers --- .../codegen/ir/IRGeneratorForStatements.cpp | 21 +++++++------------ .../codegen/IRGeneratorForStatements.cpp | 11 +++------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index c716c43a6070..5902cfef68b6 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -63,8 +63,8 @@ struct CopyTranslate: public yul::ASTCopier { using ExternalRefsMap = std::map; - CopyTranslate(yul::Dialect const& _dialect, IRGenerationContext& _context, ExternalRefsMap const& _references): - m_dialect(_dialect), m_context(_context), m_references(_references) {} + CopyTranslate(IRGenerationContext& _context, ExternalRefsMap const& _references): + m_context(_context), m_references(_references) {} using ASTCopier::operator(); @@ -80,14 +80,11 @@ struct CopyTranslate: public yul::ASTCopier yul::YulName translateIdentifier(yul::YulName _name) override { - // Strictly, the dialect used by inline assembly (m_dialect) could be different - // from the Yul dialect we are compiling to. So we are assuming here that the builtin - // functions are identical. This should not be a problem for now since everything - // is EVM anyway. - if (m_dialect.findBuiltin(_name.str())) - return _name; - else - return yul::YulName{"usr$" + _name.str()}; + // Strictly, the dialect used by inline assembly could be different + // from the Yul dialect we are compiling to. By only translating `YulName`s which correspond to Identifiers, + // we are implicitly excluding builtins together with the assumption, that numerical builtin handles + // stay identical. Special care has to be taken, that these numerical handles stay consistent. + return yul::YulName{"usr$" + _name.str()}; } yul::Identifier translate(yul::Identifier const& _identifier) override @@ -209,8 +206,6 @@ struct CopyTranslate: public yul::ASTCopier return yul::Identifier{_identifier.debugData, yul::YulName{value}}; } - - yul::Dialect const& m_dialect; IRGenerationContext& m_context; ExternalRefsMap const& m_references; }; @@ -2294,7 +2289,7 @@ bool IRGeneratorForStatements::visit(InlineAssembly const& _inlineAsm) setLocation(_inlineAsm); if (*_inlineAsm.annotation().hasMemoryEffects && !_inlineAsm.annotation().markedMemorySafe) m_context.setMemoryUnsafeInlineAssemblySeen(); - CopyTranslate bodyCopier{_inlineAsm.dialect(), m_context, _inlineAsm.annotation().externalReferences}; + CopyTranslate bodyCopier{m_context, _inlineAsm.annotation().externalReferences}; yul::Statement modified = bodyCopier(_inlineAsm.operations().root()); diff --git a/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp index 80c442b88146..14aef1107dd3 100644 --- a/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp +++ b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp @@ -54,9 +54,8 @@ struct CopyTranslate: public yul::ASTCopier { CopyTranslate( IRGenerationContext const& _context, - yul::Dialect const& _dialect, std::map _references - ): m_context(_context), m_dialect(_dialect), m_references(std::move(_references)) {} + ): m_context(_context), m_references(std::move(_references)) {} using ASTCopier::operator(); @@ -72,10 +71,7 @@ struct CopyTranslate: public yul::ASTCopier yul::YulName translateIdentifier(yul::YulName _name) override { - if (m_dialect.findBuiltin(_name.str())) - return _name; - else - return yul::YulName{"usr$" + _name.str()}; + return yul::YulName{"usr$" + _name.str()}; } yul::Identifier translate(yul::Identifier const& _identifier) override @@ -106,7 +102,6 @@ struct CopyTranslate: public yul::ASTCopier } IRGenerationContext const& m_context; - yul::Dialect const& m_dialect; std::map m_references; }; @@ -129,7 +124,7 @@ bool IRGeneratorForStatements::visit(TupleExpression const& _tupleExpression) bool IRGeneratorForStatements::visit(InlineAssembly const& _assembly) { - CopyTranslate bodyCopier{m_context, _assembly.dialect(), _assembly.annotation().externalReferences}; + CopyTranslate bodyCopier{m_context, _assembly.annotation().externalReferences}; yul::Statement modified = bodyCopier(_assembly.operations().root()); solAssert(std::holds_alternative(modified)); m_code << yul::AsmPrinter(_assembly.dialect())(std::get(modified)) << "\n"; From 08c9f535288b0d5a337c9dd416a47333791b41b9 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Wed, 12 Mar 2025 16:41:03 +0100 Subject: [PATCH 13/80] AssemblyItem gets an optional instruction and the null-state is properly asserted --- libevmasm/AssemblyItem.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libevmasm/AssemblyItem.h b/libevmasm/AssemblyItem.h index b053c5b27598..8b65d77c91e9 100644 --- a/libevmasm/AssemblyItem.h +++ b/libevmasm/AssemblyItem.h @@ -105,7 +105,6 @@ class AssemblyItem explicit AssemblyItem(bytes _verbatimData, size_t _arguments, size_t _returnVariables): m_type(VerbatimBytecode), - m_instruction{}, m_verbatimBytecode{{_arguments, _returnVariables, std::move(_verbatimData)}}, m_debugData{langutil::DebugData::create()} {} @@ -195,7 +194,7 @@ class AssemblyItem /// @returns true if the item has m_instruction properly set. bool hasInstruction() const { - return + bool const shouldHaveInstruction = m_type == Operation || m_type == EOFCreate || m_type == ReturnContract || @@ -206,12 +205,14 @@ class AssemblyItem m_type == RetF || m_type == SwapN || m_type == DupN; + solAssert(shouldHaveInstruction == m_instruction.has_value()); + return shouldHaveInstruction; } /// @returns the instruction of this item (only valid if hasInstruction returns true) Instruction instruction() const { solAssert(hasInstruction()); - return m_instruction; + return *m_instruction; } /// @returns true if the type and data of the items are equal. @@ -323,7 +324,7 @@ class AssemblyItem size_t opcodeCount() const noexcept; AssemblyItemType m_type; - Instruction m_instruction; ///< Only valid if m_type == Operation + std::optional m_instruction; ///< Only valid for item types that represent a specific opcode std::shared_ptr m_data; ///< Only valid if m_type != Operation std::optional m_functionSignature; ///< Only valid if m_type == CallF or JumpF /// If m_type == VerbatimBytecode, this holds number of arguments, number of From dd03613b791b3d13d43b95e253c414eeeb27c35b Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Thu, 20 Mar 2025 22:26:14 +0100 Subject: [PATCH 14/80] SMTChecker: Fix string literal to fixed bytes conversion with user-defined type --- Changelog.md | 1 + libsolidity/formal/SMTEncoder.cpp | 6 ++++-- ...tes_can_be_initialized_from_string_literal.sol | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/userTypes/user_type_over_fixed_bytes_can_be_initialized_from_string_literal.sol diff --git a/Changelog.md b/Changelog.md index 3e423c838b67..7efefca02d6a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,6 +8,7 @@ Compiler Features: Bugfixes: * SMTChecker: Fix incorrect analysis when only a subset of contracts is selected with `--model-checker-contracts`. +* SMTChecker: Fix internal compiler error when string literal is used to initialize user-defined type based on fixed bytes. ### 0.8.29 (2025-03-12) diff --git a/libsolidity/formal/SMTEncoder.cpp b/libsolidity/formal/SMTEncoder.cpp index 740af9382b88..044ff61d8225 100644 --- a/libsolidity/formal/SMTEncoder.cpp +++ b/libsolidity/formal/SMTEncoder.cpp @@ -929,8 +929,10 @@ void SMTEncoder::visitAddMulMod(FunctionCall const& _funCall) void SMTEncoder::visitWrapUnwrap(FunctionCall const& _funCall) { auto const& args = _funCall.arguments(); - solAssert(args.size() == 1, ""); - defineExpr(_funCall, expr(*args.front())); + smtAssert(args.size() == 1, "Expected exactly one argument to wrap/unwrap"); + auto const& funType = dynamic_cast(*_funCall.expression().annotation().type); + auto const* argType = funType.parameterTypes().front(); + defineExpr(_funCall, expr(*args.front(), argType)); } void SMTEncoder::visitObjectCreation(FunctionCall const& _funCall) diff --git a/test/libsolidity/smtCheckerTests/userTypes/user_type_over_fixed_bytes_can_be_initialized_from_string_literal.sol b/test/libsolidity/smtCheckerTests/userTypes/user_type_over_fixed_bytes_can_be_initialized_from_string_literal.sol new file mode 100644 index 000000000000..fe64541f116e --- /dev/null +++ b/test/libsolidity/smtCheckerTests/userTypes/user_type_over_fixed_bytes_can_be_initialized_from_string_literal.sol @@ -0,0 +1,15 @@ +type MyBytes is bytes2; + +contract C { + MyBytes b = MyBytes.wrap("ab"); + + function check() view public { + assert(MyBytes.unwrap(b) == 0); // should fail + assert(MyBytes.unwrap(b) == 0x6162); // should hold + } +} +// ==== +// SMTEngine: chc +// ---- +// Warning 6328: (118-148): CHC: Assertion violation happens here.\nCounterexample:\n\n\nTransaction trace:\nC.constructor()\nC.check() +// Info 1391: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. From d97d7115815314af238de314d710abd4a1aa6868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20Uzdo=C4=9Fan?= Date: Wed, 26 Feb 2025 16:10:25 -0700 Subject: [PATCH 15/80] Update metadata docs for "libraries" and "compilationSettings" fields --- docs/metadata.rst | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/metadata.rst b/docs/metadata.rst index 063936a9dcde..e5945ea5235c 100644 --- a/docs/metadata.rst +++ b/docs/metadata.rst @@ -124,11 +124,13 @@ explanatory purposes. "version": 1 // NatSpec version } }, - // Required: Compiler settings. Reflects the settings in the JSON input during compilation. - // Check the documentation of standard JSON input's "settings" field + // Required: Compiler settings. + // Reflects the settings in the JSON input during compilation, except the + // "compilationTarget" and the "libraries" fields. Check each field for details. + // See the standard JSON input's "settings" docs for the rest. "settings": { // Required for Solidity: File path and the name of the contract or library this - // metadata is created for. + // metadata is created for. Not a valid field in the standard JSON input settings. "compilationTarget": { "myDirectory/myFile.sol": "MyContract" }, @@ -137,8 +139,11 @@ explanatory purposes. // Optional: Only present if not null. "eofVersion": 1, // Required for Solidity: Addresses for libraries used. + // Note that metadata has a different format for "libraries" field than the standard JSON input. + // metadata format = { "MyLib.sol:MyLib": "0x123123..." } + // standard JSON input format = { "MyLib.sol": { "MyLib": "0x123123..." } } "libraries": { - "MyLib": "0x123123..." + "MyLib.sol:MyLib": "0x123123..." }, "metadata": { // Reflects the setting used in the input json, defaults to "true" From 2e33f2557c2c91b59c7d5593389992d7f09b26ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20Uzdo=C4=9Fan?= Date: Wed, 26 Feb 2025 16:21:22 -0700 Subject: [PATCH 16/80] Update the metdata settings field to refer the rest of the settings to std-json --- docs/metadata.rst | 54 ++++++++++------------------------------------- 1 file changed, 11 insertions(+), 43 deletions(-) diff --git a/docs/metadata.rst b/docs/metadata.rst index e5945ea5235c..90513ee326de 100644 --- a/docs/metadata.rst +++ b/docs/metadata.rst @@ -124,20 +124,18 @@ explanatory purposes. "version": 1 // NatSpec version } }, - // Required: Compiler settings. - // Reflects the settings in the JSON input during compilation, except the - // "compilationTarget" and the "libraries" fields. Check each field for details. - // See the standard JSON input's "settings" docs for the rest. + // Required: Compiler settings. + // Reflects the settings in the JSON input during compilation, except: + // - Different format: "libraries" field + // - Added field in metadata.settings: "compilationTarget" + // - Not in metadata.settings: "stopAfter", "debug.debugInfo", "outputSelection" + // See the standard JSON input's "settings" field docs for the rest. "settings": { // Required for Solidity: File path and the name of the contract or library this - // metadata is created for. Not a valid field in the standard JSON input settings. + // metadata is created for. This field is not present in the standard JSON input settings. "compilationTarget": { "myDirectory/myFile.sol": "MyContract" }, - // Required for Solidity. - "evmVersion": "london", - // Optional: Only present if not null. - "eofVersion": 1, // Required for Solidity: Addresses for libraries used. // Note that metadata has a different format for "libraries" field than the standard JSON input. // metadata format = { "MyLib.sol:MyLib": "0x123123..." } @@ -145,40 +143,10 @@ explanatory purposes. "libraries": { "MyLib.sol:MyLib": "0x123123..." }, - "metadata": { - // Reflects the setting used in the input json, defaults to "true" - "appendCBOR": true, - // Reflects the setting used in the input json, defaults to "ipfs" - "bytecodeHash": "ipfs", - // Reflects the setting used in the input json, defaults to "false" - "useLiteralContent": true - }, - // Optional: Optimizer settings. The fields "enabled" and "runs" are deprecated - // and are only given for backward-compatibility. - "optimizer": { - "details": { - "constantOptimizer": false, - "cse": false, - "deduplicate": false, - // inliner defaults to "false" - "inliner": false, - // jumpdestRemover defaults to "true" - "jumpdestRemover": true, - "orderLiterals": false, - // peephole defaults to "true" - "peephole": true, - "yul": true, - // Optional: Only present if "yul" is "true" - "yulDetails": { - "optimizerSteps": "dhfoDgvulfnTUtnIf...", - "stackAllocation": false - } - }, - "enabled": true, - "runs": 500 - }, - // Required for Solidity: Sorted list of import remappings. - "remappings": [ ":g=/dir" ] + // ... + // ... + // ... + // The rest of the fields and their defaults same as in std JSON input. }, // Required: Compilation source files/source units, keys are file paths "sources": { From 1f044c153365955b48d19ae90fa8a57db359c870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaan=20Uzdo=C4=9Fan?= Date: Thu, 20 Mar 2025 10:29:03 +0100 Subject: [PATCH 17/80] Remove "sorted" in std-json remappings 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 4984d999df27..23e83baec4e6 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -279,7 +279,7 @@ Input Description { // Optional: Stop compilation after the given stage. Currently only "parsing" is valid here "stopAfter": "parsing", - // Optional: Sorted list of remappings + // Optional: List of remappings "remappings": [ ":g=/dir" ], // Optional: Optimizer settings "optimizer": { From 1ccea419e6770553f15ce80872be21165ba946c5 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:24:30 +0100 Subject: [PATCH 18/80] AsmAnalysis: Stronger use of fmt, refactor function call analysis --- libyul/AsmAnalysis.cpp | 272 ++++++++++++++++++++++------------------- libyul/AsmAnalysis.h | 19 +-- 2 files changed, 161 insertions(+), 130 deletions(-) diff --git a/libyul/AsmAnalysis.cpp b/libyul/AsmAnalysis.cpp index b6ff862b3850..480373d13271 100644 --- a/libyul/AsmAnalysis.cpp +++ b/libyul/AsmAnalysis.cpp @@ -94,19 +94,28 @@ bool AsmAnalyzer::analyze(Block const& _block) AsmAnalysisInfo AsmAnalyzer::analyzeStrictAssertCorrect(Object const& _object) { yulAssert(_object.dialect()); - return analyzeStrictAssertCorrect(*_object.dialect(), _object.code()->root(), _object.summarizeStructure()); + return analyzeStrictAssertCorrect(*_object.dialect(), *_object.code(), _object.summarizeStructure()); +} + +AsmAnalysisInfo AsmAnalyzer::analyzeStrictAssertCorrect( + Dialect const& _dialect, + AST const& _ast, + Object::Structure _objectStructure +) +{ + return analyzeStrictAssertCorrect(_dialect, _ast.root(), std::move(_objectStructure)); } AsmAnalysisInfo AsmAnalyzer::analyzeStrictAssertCorrect( Dialect const& _dialect, Block const& _astRoot, - Object::Structure const _objectStructure + Object::Structure _objectStructure ) { ErrorList errorList; langutil::ErrorReporter errors(errorList); AsmAnalysisInfo analysisInfo; - bool success = yul::AsmAnalyzer( + bool success = AsmAnalyzer( analysisInfo, errors, _dialect, @@ -155,7 +164,7 @@ size_t AsmAnalyzer::operator()(Literal const& _literal) m_errorReporter.typeError( 3069_error, nativeLocationOf(_literal), - "String literal too long (" + std::to_string(formatLiteral(_literal, false /* _validated */ ).size()) + " > 32)" + fmt::format("String literal too long ({} > 32)", formatLiteral(_literal, false /* _validated */ ).size()) ); } else if (_literal.kind == LiteralKind::Number && _literal.value.hint() && bigint(*_literal.value.hint()) > u256(-1)) @@ -170,7 +179,7 @@ size_t AsmAnalyzer::operator()(Literal const& _literal) size_t AsmAnalyzer::operator()(Identifier const& _identifier) { - yulAssert(!_identifier.name.empty(), ""); + yulAssert(!_identifier.name.empty()); auto watcher = m_errorReporter.errorWatcher(); if (m_currentScope->lookup(_identifier.name, GenericVisitor{ @@ -180,7 +189,7 @@ size_t AsmAnalyzer::operator()(Identifier const& _identifier) m_errorReporter.declarationError( 4990_error, nativeLocationOf(_identifier), - "Variable " + _identifier.name.str() + " used before it was declared." + fmt::format("Variable {} used before it was declared.", _identifier.name.str()) ); }, [&](Scope::Function const&) @@ -188,14 +197,15 @@ size_t AsmAnalyzer::operator()(Identifier const& _identifier) m_errorReporter.typeError( 6041_error, nativeLocationOf(_identifier), - "Function " + _identifier.name.str() + " used without being called." + fmt::format("Function {} used without being called.", _identifier.name.str()) ); } })) { if (m_resolver) // We found a local reference, make sure there is no external reference. - m_resolver( + // Used for side effects, e.g., error reporting in TypeChecker, hence ignoring return value + std::ignore = m_resolver( _identifier, yul::IdentifierContext::NonExternal, m_currentScope->insideFunction() @@ -213,7 +223,7 @@ size_t AsmAnalyzer::operator()(Identifier const& _identifier) m_errorReporter.declarationError( 8198_error, nativeLocationOf(_identifier), - "Identifier \"" + _identifier.name.str() + "\" not found." + fmt::format("Identifier \"{}\" not found.", _identifier.name.str()) ); } @@ -229,11 +239,12 @@ void AsmAnalyzer::operator()(ExpressionStatement const& _statement) m_errorReporter.typeError( 3083_error, nativeLocationOf(_statement), - "Top-level expressions are not supposed to return values (this expression returns " + - std::to_string(numReturns) + - " value" + - (numReturns == 1 ? "" : "s") + - "). Use ``pop()`` or assign them." + fmt::format( + "Top-level expressions are not supposed to return values (this expression returns {} value{}). " + "Use ``pop()`` or assign them.", + numReturns, + numReturns == 1 ? "" : "s" + ) ); } @@ -249,9 +260,10 @@ void AsmAnalyzer::operator()(Assignment const& _assignment) m_errorReporter.declarationError( 9005_error, nativeLocationOf(_assignment), - "Variable " + - _variableName.name.str() + - " occurs multiple times on the left-hand side of the assignment." + fmt::format( + "Variable {} occurs multiple times on the left-hand side of the assignment.", + _variableName.name.str() + ) ); size_t numRhsValues = std::visit(*this, *_assignment.value); @@ -260,13 +272,12 @@ void AsmAnalyzer::operator()(Assignment const& _assignment) m_errorReporter.declarationError( 8678_error, nativeLocationOf(_assignment), - "Variable count for assignment to \"" + - joinHumanReadable(applyMap(_assignment.variableNames, [](auto const& _identifier){ return _identifier.name.str(); })) + - "\" does not match number of values (" + - std::to_string(numVariables) + - " vs. " + - std::to_string(numRhsValues) + - ")" + fmt::format( + "Variable count for assignment to \"{}\" does not match number of values ({} vs. {})", + joinHumanReadable(applyMap(_assignment.variableNames, [](auto const& _identifier){ return _identifier.name.str(); })), + numVariables, + numRhsValues + ) ); for (size_t i = 0; i < numVariables; ++i) @@ -296,13 +307,12 @@ void AsmAnalyzer::operator()(VariableDeclaration const& _varDecl) m_errorReporter.declarationError( 3812_error, nativeLocationOf(_varDecl), - "Variable count mismatch for declaration of \"" + - joinHumanReadable(applyMap(_varDecl.variables, [](auto const& _identifier){ return _identifier.name.str(); })) + - + "\": " + - std::to_string(numVariables) + - " variables and " + - std::to_string(numValues) + - " values." + fmt::format( + "Variable count mismatch for declaration of \"{}\": {} variables and {} values.", + joinHumanReadable(applyMap(_varDecl.variables, [](auto const& _identifier){ return _identifier.name.str(); })), + numVariables, + numValues + ) ); } @@ -314,7 +324,7 @@ void AsmAnalyzer::operator()(VariableDeclaration const& _varDecl) void AsmAnalyzer::operator()(FunctionDefinition const& _funDef) { - yulAssert(!_funDef.name.empty(), ""); + yulAssert(!_funDef.name.empty()); expectValidIdentifier(_funDef.name, nativeLocationOf(_funDef)); Block const* virtualBlock = m_info.virtualBlocks.at(&_funDef).get(); yulAssert(virtualBlock, ""); @@ -352,77 +362,89 @@ size_t AsmAnalyzer::operator()(FunctionCall const& _funCall) std::optional numReturns; std::vector> const* literalArguments = nullptr; - if (BuiltinFunction const* builtin = resolveBuiltinFunction(_funCall.functionName, m_dialect)) - { - if (builtin->name == "selfdestruct") - m_errorReporter.warning( - 1699_error, - nativeLocationOf(_funCall.functionName), - "\"selfdestruct\" has been deprecated. " - "Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and " - "data associated with an account and only transfers its Ether to the beneficiary, " - "unless executed in the same transaction in which the contract was created (see EIP-6780). " - "Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. " - "Future changes to the EVM might further reduce the functionality of the opcode." - ); - else if ( - m_evmVersion.supportsTransientStorage() && - builtin->name == "tstore" && - !m_errorReporter.hasError({2394}) - ) - m_errorReporter.warning( - 2394_error, - nativeLocationOf(_funCall.functionName), - "Transient storage as defined by EIP-1153 can break the composability of smart contracts: " - "Since transient storage is cleared only at the end of the transaction and not at the end of the outermost call frame to the contract within a transaction, " - "your contract may unintentionally misbehave when invoked multiple times in a complex transaction. " - "To avoid this, be sure to clear all transient storage at the end of any call to your contract. " - "The use of transient storage for reentrancy guards that are cleared at the end of the call is safe." - ); + std::visit( + GenericVisitor { + [&](BuiltinName const& _builtinName) + { + BuiltinFunction const& builtin = m_dialect.builtin(_builtinName.handle); + if (builtin.name == "selfdestruct") + m_errorReporter.warning( + 1699_error, + nativeLocationOf(_builtinName), + "\"selfdestruct\" has been deprecated. " + "Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and " + "data associated with an account and only transfers its Ether to the beneficiary, " + "unless executed in the same transaction in which the contract was created (see EIP-6780). " + "Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. " + "Future changes to the EVM might further reduce the functionality of the opcode." + ); + else if ( + builtin.name == "tstore" && + !m_errorReporter.hasError({2394}) + ) + { + yulAssert(m_evmVersion.supportsTransientStorage(), "tstore is only a builtin on EVMs that support transient storage"); + m_errorReporter.warning( + 2394_error, + nativeLocationOf(_builtinName), + "Transient storage as defined by EIP-1153 can break the composability of smart contracts: " + "Since transient storage is cleared only at the end of the transaction and not at the end of the outermost call frame to the contract within a transaction, " + "your contract may unintentionally misbehave when invoked multiple times in a complex transaction. " + "To avoid this, be sure to clear all transient storage at the end of any call to your contract. " + "The use of transient storage for reentrancy guards that are cleared at the end of the call is safe." + ); + } - numParameters = builtin->numParameters; - numReturns = builtin->numReturns; - if (!builtin->literalArguments.empty()) - literalArguments = &builtin->literalArguments; + numParameters = builtin.numParameters; + numReturns = builtin.numReturns; + if (!builtin.literalArguments.empty()) + literalArguments = &builtin.literalArguments; - validateInstructions(_funCall); - m_sideEffects += builtin->sideEffects; - } - else if (m_currentScope->lookup(YulName{resolveFunctionName(_funCall.functionName, m_dialect)}, GenericVisitor{ - [&](Scope::Variable const&) - { - m_errorReporter.typeError( - 4202_error, - nativeLocationOf(_funCall.functionName), - "Attempt to call variable instead of function." - ); + validateInstructions(_funCall); + m_sideEffects += builtin.sideEffects; + }, + [&](Identifier const& _identifier) + { + bool const identifierInCurrentScope = m_currentScope->lookup(_identifier.name, GenericVisitor{ + [&](Scope::Variable const&) + { + m_errorReporter.typeError( + 4202_error, + nativeLocationOf(_identifier), + "Attempt to call variable instead of function." + ); + }, + [&](Scope::Function const& _fun) + { + numParameters = _fun.numArguments; + numReturns = _fun.numReturns; + } + }); + if (identifierInCurrentScope) + { + if (m_resolver) + // We found a local reference, make sure there is no external reference. + // Used for side effects, e.g., error reporting in TypeChecker, hence ignoring return value + std::ignore = m_resolver( + _identifier, + yul::IdentifierContext::NonExternal, + m_currentScope->insideFunction() + ); + } + else + { + if (!validateInstructions(_funCall)) + m_errorReporter.declarationError( + 4619_error, + nativeLocationOf(_identifier), + fmt::format("Function \"{}\" not found.", _identifier.name.str()) + ); + yulAssert(!watcher.ok(), "Expected a reported error."); + } + } }, - [&](Scope::Function const& _fun) - { - numParameters = _fun.numArguments; - numReturns = _fun.numReturns; - } - })) - { - yulAssert(std::holds_alternative(_funCall.functionName)); - if (m_resolver) - // We found a local reference, make sure there is no external reference. - m_resolver( - std::get(_funCall.functionName), - yul::IdentifierContext::NonExternal, - m_currentScope->insideFunction() - ); - } - else - { - if (!validateInstructions(_funCall)) - m_errorReporter.declarationError( - 4619_error, - nativeLocationOf(_funCall.functionName), - fmt::format("Function \"{}\" not found.", resolveFunctionName(_funCall.functionName, m_dialect)) - ); - yulAssert(!watcher.ok(), "Expected a reported error."); - } + _funCall.functionName + ); if (numParameters && _funCall.arguments.size() != *numParameters) m_errorReporter.typeError( @@ -455,7 +477,7 @@ size_t AsmAnalyzer::operator()(FunctionCall const& _funCall) m_errorReporter.typeError( 5859_error, nativeLocationOf(arg), - "Function expects " + to_string(*literalArgumentKind) + " literal." + fmt::format("Function expects {} literal.", to_string(*literalArgumentKind)) ); else if (*literalArgumentKind == LiteralKind::String) { @@ -467,7 +489,7 @@ size_t AsmAnalyzer::operator()(FunctionCall const& _funCall) m_errorReporter.typeError( 3517_error, nativeLocationOf(arg), - "Unknown data object \"" + formatLiteral(argumentAsLiteral) + "\"." + fmt::format("Unknown data object \"{}\".", formatLiteral(argumentAsLiteral)) ); } else if (functionName.substr(0, "verbatim_"s.size()) == "verbatim_") @@ -499,14 +521,17 @@ size_t AsmAnalyzer::operator()(FunctionCall const& _funCall) m_errorReporter.typeError( 7575_error, nativeLocationOf(arg), - "Data name \"" + formattedLiteral + "\" cannot be used as an argument of eofcreate/returncontract. " + - "An object name is only acceptable." + fmt::format( + "Data name \"{}\" cannot be used as an argument of eofcreate/returncontract. " + "An object name is only acceptable.", + formattedLiteral + ) ); else m_errorReporter.typeError( 8970_error, nativeLocationOf(arg), - "Unknown object \"" + formattedLiteral + "\"." + fmt::format("Unknown object \"{}\".", formattedLiteral) ); } } @@ -579,9 +604,7 @@ void AsmAnalyzer::operator()(Switch const& _switch) m_errorReporter.declarationError( 6792_error, nativeLocationOf(_case), - "Duplicate case \"" + - formatLiteral(*_case.value) + - "\" defined." + fmt::format("Duplicate case \"{}\" defined.", formatLiteral(*_case.value)) ); } @@ -631,9 +654,10 @@ void AsmAnalyzer::expectExpression(Expression const& _expr) m_errorReporter.typeError( 3950_error, nativeLocationOf(_expr), - "Expected expression to evaluate to one value, but got " + - std::to_string(numValues) + - " values instead." + fmt::format( + "Expected expression to evaluate to one value, but got {} values instead.", + numValues + ) ); } @@ -645,7 +669,7 @@ void AsmAnalyzer::expectUnlimitedStringLiteral(Literal const& _literal) void AsmAnalyzer::checkAssignment(Identifier const& _variable) { - yulAssert(!_variable.name.empty(), ""); + yulAssert(!_variable.name.empty()); auto watcher = m_errorReporter.errorWatcher(); bool hasVariable = false; bool found = false; @@ -653,7 +677,8 @@ void AsmAnalyzer::checkAssignment(Identifier const& _variable) { if (m_resolver) // We found a local reference, make sure there is no external reference. - m_resolver( + // Used for side effects, e.g., error reporting in TypeChecker, hence ignoring return value + std::ignore = m_resolver( _variable, yul::IdentifierContext::NonExternal, m_currentScope->insideFunction() @@ -665,7 +690,7 @@ void AsmAnalyzer::checkAssignment(Identifier const& _variable) m_errorReporter.declarationError( 1133_error, nativeLocationOf(_variable), - "Variable " + _variable.name.str() + " used before it was declared." + fmt::format("Variable {} used before it was declared.", _variable.name.str()) ); else hasVariable = true; @@ -698,26 +723,27 @@ Scope& AsmAnalyzer::scope(Block const* _block) void AsmAnalyzer::expectValidIdentifier(YulName _identifier, SourceLocation const& _location) { + std::string_view const label = _identifier.str(); // NOTE: the leading dot case is handled by the parser not allowing it. - if (boost::ends_with(_identifier.str(), ".")) + if (label.ends_with('.')) m_errorReporter.syntaxError( 3384_error, _location, - "\"" + _identifier.str() + "\" is not a valid identifier (ends with a dot)." + fmt::format("\"{}\" is not a valid identifier (ends with a dot).", label) ); - if (_identifier.str().find("..") != std::string::npos) + if (label.find("..") != std::string::npos) m_errorReporter.syntaxError( 7771_error, _location, - "\"" + _identifier.str() + "\" is not a valid identifier (contains consecutive dots)." + fmt::format("\"{}\" is not a valid identifier (contains consecutive dots).", label) ); - if (m_dialect.reservedIdentifier(_identifier.str())) + if (m_dialect.reservedIdentifier(label)) m_errorReporter.declarationError( 5017_error, _location, - "The identifier \"" + _identifier.str() + "\" is reserved and can not be used." + fmt::format("The identifier \"{}\" is reserved and can not be used.", label) ); } @@ -744,7 +770,7 @@ bool AsmAnalyzer::validateInstructions(std::string_view _instructionIdentifier, 7223_error, _location, fmt::format( - "Builtin function \"{}\" is only available in EOF.", + "Builtin function \"{function}\" is only available in EOF.", fmt::arg("function", _instructionIdentifier) ) ); @@ -844,7 +870,7 @@ bool AsmAnalyzer::validateInstructions(evmasm::Instruction _instr, SourceLocatio 4328_error, _location, fmt::format( - "The \"{}\" instruction is only available in EOF.", + "The \"{instruction}\" instruction is only available in EOF.", fmt::arg("instruction", boost::to_lower_copy(instructionInfo(_instr, m_evmVersion).name)) ) ); @@ -899,7 +925,7 @@ bool AsmAnalyzer::validateInstructions(FunctionCall const& _functionCall) ); } -void AsmAnalyzer::validateObjectStructure(langutil::SourceLocation _astRootLocation) +void AsmAnalyzer::validateObjectStructure(langutil::SourceLocation const& _astRootLocation) { if (m_eofVersion.has_value()) { diff --git a/libyul/AsmAnalysis.h b/libyul/AsmAnalysis.h index e8c02fbec132..51b8cde2ba1f 100644 --- a/libyul/AsmAnalysis.h +++ b/libyul/AsmAnalysis.h @@ -62,7 +62,7 @@ class AsmAnalyzer langutil::ErrorReporter& _errorReporter, Dialect const& _dialect, ExternalIdentifierAccess::Resolver _resolver = ExternalIdentifierAccess::Resolver(), - Object::Structure const _objectStructure = {} + Object::Structure _objectStructure = {} ): m_resolver(std::move(_resolver)), m_info(_analysisInfo), @@ -85,7 +85,12 @@ class AsmAnalyzer static AsmAnalysisInfo analyzeStrictAssertCorrect( Dialect const& _dialect, Block const& _astRoot, - Object::Structure const _objectStructure + Object::Structure _objectStructure + ); + static AsmAnalysisInfo analyzeStrictAssertCorrect( + Dialect const& _dialect, + AST const& _ast, + Object::Structure _objectStructure ); size_t operator()(Literal const& _literal); @@ -98,9 +103,9 @@ class AsmAnalyzer void operator()(If const& _if); void operator()(Switch const& _switch); void operator()(ForLoop const& _forLoop); - void operator()(Break const&) { } - void operator()(Continue const&) { } - void operator()(Leave const&) { } + void operator()(Break const&) const { } + void operator()(Continue const&) const { } + void operator()(Leave const&) const { } void operator()(Block const& _block); /// @returns the worst side effects encountered during analysis (including within defined functions). @@ -109,7 +114,7 @@ class AsmAnalyzer /// Visits the expression, expects that it evaluates to exactly one value. /// Reports errors otherwise. void expectExpression(Expression const& _expr); - void expectUnlimitedStringLiteral(Literal const& _literal); + static void expectUnlimitedStringLiteral(Literal const& _literal); /// Verifies that a variable to be assigned to exists and can be assigned to. void checkAssignment(Identifier const& _variable); @@ -121,7 +126,7 @@ class AsmAnalyzer bool validateInstructions(std::string_view _instrIdentifier, langutil::SourceLocation const& _location); bool validateInstructions(FunctionCall const& _functionCall); - void validateObjectStructure(langutil::SourceLocation _astRootLocation); + void validateObjectStructure(langutil::SourceLocation const& _astRootLocation); yul::ExternalIdentifierAccess::Resolver m_resolver; Scope* m_currentScope = nullptr; From b9cbf1e7db82b74c1c07801a05f663321889ce26 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 21 Mar 2025 09:17:09 +0100 Subject: [PATCH 19/80] AsmAnalysis: Improve wording of invalid argument for eofcreate/returncontract error --- libyul/AsmAnalysis.cpp | 2 +- .../yulSyntaxTests/eof/eofcreate_invalid_object_name_data.yul | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libyul/AsmAnalysis.cpp b/libyul/AsmAnalysis.cpp index 480373d13271..b36eb48b415e 100644 --- a/libyul/AsmAnalysis.cpp +++ b/libyul/AsmAnalysis.cpp @@ -523,7 +523,7 @@ size_t AsmAnalyzer::operator()(FunctionCall const& _funCall) nativeLocationOf(arg), fmt::format( "Data name \"{}\" cannot be used as an argument of eofcreate/returncontract. " - "An object name is only acceptable.", + "Only an object name is acceptable.", formattedLiteral ) ); diff --git a/test/libyul/yulSyntaxTests/eof/eofcreate_invalid_object_name_data.yul b/test/libyul/yulSyntaxTests/eof/eofcreate_invalid_object_name_data.yul index 1e9fad7d0244..06bb487d62f8 100644 --- a/test/libyul/yulSyntaxTests/eof/eofcreate_invalid_object_name_data.yul +++ b/test/libyul/yulSyntaxTests/eof/eofcreate_invalid_object_name_data.yul @@ -10,4 +10,4 @@ object "a" { // EVMVersion: >=shanghai // bytecodeFormat: >=EOFv1 // ---- -// TypeError 7575: (52-59): Data name "data1" cannot be used as an argument of eofcreate/returncontract. An object name is only acceptable. +// TypeError 7575: (52-59): Data name "data1" cannot be used as an argument of eofcreate/returncontract. Only an object name is acceptable. From d1cbd8dc3f0bd390669a99c8e036b8d6fd215b89 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:02:44 +0100 Subject: [PATCH 20/80] interpreter uses yul AST instead of separate block and dialect --- test/libyul/YulInterpreterTest.cpp | 3 +-- test/tools/yulInterpreter/Inspector.cpp | 15 +++++++-------- test/tools/yulInterpreter/Inspector.h | 3 +-- test/tools/yulInterpreter/Interpreter.cpp | 5 ++--- test/tools/yulInterpreter/Interpreter.h | 4 ++-- 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/test/libyul/YulInterpreterTest.cpp b/test/libyul/YulInterpreterTest.cpp index d97211b9761d..42e0e7c6f543 100644 --- a/test/libyul/YulInterpreterTest.cpp +++ b/test/libyul/YulInterpreterTest.cpp @@ -80,8 +80,7 @@ std::string YulInterpreterTest::interpret(std::shared_ptr const& _ { Interpreter::run( state, - *_object->dialect(), - _object->code()->root(), + *_object->code(), /*disableExternalCalls=*/ !m_simulateExternalCallsToSelf, /*disableMemoryTracing=*/ false ); diff --git a/test/tools/yulInterpreter/Inspector.cpp b/test/tools/yulInterpreter/Inspector.cpp index 7746483a367a..5fec7f1c58d4 100644 --- a/test/tools/yulInterpreter/Inspector.cpp +++ b/test/tools/yulInterpreter/Inspector.cpp @@ -31,9 +31,9 @@ using namespace solidity::yul::test; namespace { -void printVariable(YulString const& _name, u256 const& _value) +void printVariable(std::string_view const _name, u256 const& _value) { - std::cout << "\t" << _name.str() << " = " << _value.str(); + std::cout << "\t" << _name << " = " << _value.str(); if (_value != 0) std::cout << " (" << toCompactHexWithPrefix(_value) << ")"; @@ -46,17 +46,16 @@ void printVariable(YulString const& _name, u256 const& _value) void InspectedInterpreter::run( std::shared_ptr _inspector, InterpreterState& _state, - Dialect const& _dialect, - Block const& _ast, + AST const& _ast, bool _disableExternalCalls, bool _disableMemoryTrace ) { Scope scope; - InspectedInterpreter{_inspector, _state, _dialect, scope, _disableExternalCalls, _disableMemoryTrace}(_ast); + InspectedInterpreter{_inspector, _state, _ast.dialect(), scope, _disableExternalCalls, _disableMemoryTrace}(_ast.root()); } -Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std::map const& _variables) +Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std::map const& _variables) { if (m_stepMode == NodeAction::RunNode) { @@ -99,7 +98,7 @@ Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std else if (input == "variables" || input == "v") { for (auto &&[yulStr, val]: _variables) - printVariable(yulStr, val); + printVariable(yulStr.str(), val); std::cout << std::endl; } else if ( @@ -120,7 +119,7 @@ Inspector::NodeAction Inspector::queryUser(langutil::DebugData const& _data, std for (auto &&[yulStr, val]: _variables) if (yulStr.str() == varname) { - printVariable(yulStr, val); + printVariable(varname, val); found = true; break; } diff --git a/test/tools/yulInterpreter/Inspector.h b/test/tools/yulInterpreter/Inspector.h index 903ebc1142ea..3ea669b438a9 100644 --- a/test/tools/yulInterpreter/Inspector.h +++ b/test/tools/yulInterpreter/Inspector.h @@ -103,8 +103,7 @@ class InspectedInterpreter: public Interpreter static void run( std::shared_ptr _inspector, InterpreterState& _state, - Dialect const& _dialect, - Block const& _ast, + AST const& _ast, bool _disableExternalCalls, bool _disableMemoryTracing ); diff --git a/test/tools/yulInterpreter/Interpreter.cpp b/test/tools/yulInterpreter/Interpreter.cpp index 2709d1b468aa..05db9f581fa5 100644 --- a/test/tools/yulInterpreter/Interpreter.cpp +++ b/test/tools/yulInterpreter/Interpreter.cpp @@ -109,14 +109,13 @@ void InterpreterState::dumpTraceAndState(std::ostream& _out, bool _disableMemory void Interpreter::run( InterpreterState& _state, - Dialect const& _dialect, - Block const& _ast, + AST const& _ast, bool _disableExternalCalls, bool _disableMemoryTrace ) { Scope scope; - Interpreter{_state, _dialect, scope, _disableExternalCalls, _disableMemoryTrace}(_ast); + Interpreter{_state, _ast.dialect(), scope, _disableExternalCalls, _disableMemoryTrace}(_ast.root()); } void Interpreter::operator()(ExpressionStatement const& _expressionStatement) diff --git a/test/tools/yulInterpreter/Interpreter.h b/test/tools/yulInterpreter/Interpreter.h index 427a30d9ea08..3dd6a4238d97 100644 --- a/test/tools/yulInterpreter/Interpreter.h +++ b/test/tools/yulInterpreter/Interpreter.h @@ -22,6 +22,7 @@ #pragma once #include +#include #include #include @@ -162,8 +163,7 @@ class Interpreter: public ASTWalker /// activated e.g., Redundant store eliminator, Equal store eliminator. static void run( InterpreterState& _state, - Dialect const& _dialect, - Block const& _ast, + AST const& _ast, bool _disableExternalCalls, bool _disableMemoryTracing ); From 8859625fdeb9a19f538d596d380e0fae28ea108e Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:02:55 +0100 Subject: [PATCH 21/80] yulrun on AST --- test/tools/yulrun.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/tools/yulrun.cpp b/test/tools/yulrun.cpp index 36d48858620b..a5fa05d934ce 100644 --- a/test/tools/yulrun.cpp +++ b/test/tools/yulrun.cpp @@ -63,6 +63,9 @@ std::pair, std::shared_ptr> parse(st solidity::frontend::OptimiserSettings::none(), DebugInfoSelection::Default() ); + auto const* evmDialect = dynamic_cast(&stack.dialect()); + // TODO: Add EOF support + solUnimplementedAssert(evmDialect && !evmDialect->eofVersion(), "No EOF support for yulrun yet."); if (stack.parseAndAnalyze("--INPUT--", _source)) { yulAssert(!Error::hasErrorsWarningsOrInfos(stack.errors()), "Parsed successfully but had errors."); @@ -87,13 +90,10 @@ void interpret(std::string const& _source, bool _inspect, bool _disableExternalC state.maxTraceSize = 10000; try { - Dialect const& dialect(EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion{}, std::nullopt)); - if (_inspect) - InspectedInterpreter::run(std::make_shared(_source, state), state, dialect, ast->root(), _disableExternalCalls, /*disableMemoryTracing=*/false); - + InspectedInterpreter::run(std::make_shared(_source, state), state, *ast, _disableExternalCalls, /*disableMemoryTracing=*/false); else - Interpreter::run(state, dialect, ast->root(), _disableExternalCalls, /*disableMemoryTracing=*/false); + Interpreter::run(state, *ast, _disableExternalCalls, /*disableMemoryTracing=*/false); } catch (InterpreterTerminatedGeneric const&) { From dafe00677e1ccf04fb4853d74885cfe7288b25e7 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:56:53 +0100 Subject: [PATCH 22/80] ossfuzz uses yul AST instead of separate block and dialect --- test/tools/ossfuzz/strictasm_diff_ossfuzz.cpp | 6 ++---- test/tools/ossfuzz/yulFuzzerCommon.cpp | 5 ++--- test/tools/ossfuzz/yulFuzzerCommon.h | 3 +-- test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp | 6 ++---- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/test/tools/ossfuzz/strictasm_diff_ossfuzz.cpp b/test/tools/ossfuzz/strictasm_diff_ossfuzz.cpp index a4515b30957a..9abf269c869a 100644 --- a/test/tools/ossfuzz/strictasm_diff_ossfuzz.cpp +++ b/test/tools/ossfuzz/strictasm_diff_ossfuzz.cpp @@ -90,8 +90,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size) // TODO: Add EOF support yulFuzzerUtil::TerminationReason termReason = yulFuzzerUtil::interpret( os1, - stack.parserResult()->code()->root(), - EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion(), std::nullopt), + *stack.parserResult()->code(), /*disableMemoryTracing=*/true ); if (yulFuzzerUtil::resourceLimitsExceeded(termReason)) @@ -100,8 +99,7 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size) stack.optimize(); termReason = yulFuzzerUtil::interpret( os2, - stack.parserResult()->code()->root(), - EVMDialect::strictAssemblyForEVMObjects(langutil::EVMVersion(), std::nullopt), + *stack.parserResult()->code(), /*disableMemoryTracing=*/true ); diff --git a/test/tools/ossfuzz/yulFuzzerCommon.cpp b/test/tools/ossfuzz/yulFuzzerCommon.cpp index b95df8f2138c..c34f4351c5d4 100644 --- a/test/tools/ossfuzz/yulFuzzerCommon.cpp +++ b/test/tools/ossfuzz/yulFuzzerCommon.cpp @@ -23,8 +23,7 @@ using namespace solidity::yul::test::yul_fuzzer; yulFuzzerUtil::TerminationReason yulFuzzerUtil::interpret( std::ostream& _os, - yul::Block const& _astRoot, - Dialect const& _dialect, + AST const& _ast, bool _disableMemoryTracing, bool _outputStorageOnly, size_t _maxSteps, @@ -52,7 +51,7 @@ yulFuzzerUtil::TerminationReason yulFuzzerUtil::interpret( TerminationReason reason = TerminationReason::None; try { - Interpreter::run(state, _dialect, _astRoot, true, _disableMemoryTracing); + Interpreter::run(state, _ast, true, _disableMemoryTracing); } catch (StepLimitReached const&) { diff --git a/test/tools/ossfuzz/yulFuzzerCommon.h b/test/tools/ossfuzz/yulFuzzerCommon.h index afcb0f2d3c9e..dcfd0f833775 100644 --- a/test/tools/ossfuzz/yulFuzzerCommon.h +++ b/test/tools/ossfuzz/yulFuzzerCommon.h @@ -40,8 +40,7 @@ struct yulFuzzerUtil /// eliminator. static TerminationReason interpret( std::ostream& _os, - yul::Block const& _astRoot, - Dialect const& _dialect, + AST const& _ast, bool _disableMemoryTracing = false, bool _outputStorageOnly = false, size_t _maxSteps = maxSteps, diff --git a/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp b/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp index d15043972693..4edfbf7ba4ee 100644 --- a/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp +++ b/test/tools/ossfuzz/yulProto_diff_ossfuzz.cpp @@ -90,8 +90,7 @@ DEFINE_PROTO_FUZZER(Program const& _input) // TODO: Add EOF support yulFuzzerUtil::TerminationReason termReason = yulFuzzerUtil::interpret( os1, - stack.parserResult()->code()->root(), - EVMDialect::strictAssemblyForEVMObjects(version, std::nullopt), + *stack.parserResult()->code(), /*disableMemoryTracing=*/true ); @@ -106,8 +105,7 @@ DEFINE_PROTO_FUZZER(Program const& _input) // TODO: Add EOF support termReason = yulFuzzerUtil::interpret( os2, - *astRoot, - EVMDialect::strictAssemblyForEVMObjects(version, std::nullopt), + *optimizerTest.optimizedObject()->code(), true ); if (yulFuzzerUtil::resourceLimitsExceeded(termReason)) From 77878e5d4a56ea175d131a2338052ab4ac1e9ceb Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 14 Mar 2025 13:14:01 +0100 Subject: [PATCH 23/80] add repeats to external.sh --- test/benchmarks/external.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/test/benchmarks/external.sh b/test/benchmarks/external.sh index b003f0ba18d2..7ad3279ae360 100755 --- a/test/benchmarks/external.sh +++ b/test/benchmarks/external.sh @@ -42,9 +42,10 @@ source "${repo_root}/scripts/common.sh" # shellcheck source=scripts/common_cmdline.sh source "${repo_root}/scripts/common_cmdline.sh" -(( $# <= 1 )) || fail "Too many arguments. Usage: external.sh []" +(( $# <= 2 )) || fail "Too many arguments. Usage: external.sh [] []" solc="${1:-${SOLIDITY_BUILD_DIR}/solc/solc}" +num_repeats="${2:-1}" command_available "$solc" --version command_available "$(type -P time)" --version @@ -65,10 +66,10 @@ function benchmark_project { > /dev/null \ 2> "../stderr-${project}-${pipeline}.log" || true - printf '| %-21s | %8s | %6d s | %9d MiB | %9d |\n' \ + printf '| %-21s | %8s | %6.2f s | %9d MiB | %9d |\n' \ "$project" \ "$pipeline" \ - "$(jq '(.user + .sys) | round' "$time_file")" \ + "$(jq '(.user + .sys) * 100 | round / 100' "$time_file")" \ "$(jq '.mem / 1024 | round' "$time_file")" \ "$(jq '.exit' "$time_file")" cd .. @@ -96,8 +97,12 @@ echo "| File | Pipeline | Time | Memory (peak) | Exit code echo "|-----------------------|----------|---------:|--------------:|----------:|" for project in "${benchmarks[@]}"; do - benchmark_project legacy "$project" - benchmark_project ir "$project" + for ((i=0; i Date: Tue, 25 Mar 2025 20:58:29 +0200 Subject: [PATCH 24/80] fix: Remove unnecessary Expression temporary in CHCSmtLib2Interface fix: Remove unnecessary Expression temporary in CHCSmtLib2Interface Update CHCSmtLib2Interface.cpp Update CHCSmtLib2Interface.cpp add repeats to external.sh --- libsmtutil/CHCSmtLib2Interface.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libsmtutil/CHCSmtLib2Interface.cpp b/libsmtutil/CHCSmtLib2Interface.cpp index 6b0534296f29..04cbad1ad489 100644 --- a/libsmtutil/CHCSmtLib2Interface.cpp +++ b/libsmtutil/CHCSmtLib2Interface.cpp @@ -465,9 +465,7 @@ std::optional CHCSmtLib2Interface::invariantsFromSolverResp smtSolverInteractionRequire(isAtom(nameSortPair[0]), "Invalid format of CHC model"); SortPointer varSort = scopedParser.toSort(nameSortPair[1]); scopedParser.addVariableDeclaration(asAtom(nameSortPair[0]), varSort); - // FIXME: Why Expression here? - Expression arg = scopedParser.toSMTUtilExpression(nameSortPair[0]); - predicateArgs.push_back(arg); + predicateArgs.push_back(scopedParser.toSMTUtilExpression(nameSortPair[0])); } auto parsedInterpretation = scopedParser.toSMTUtilExpression(interpretation); @@ -479,6 +477,7 @@ std::optional CHCSmtLib2Interface::invariantsFromSolverResp }); Expression predicate(asAtom(args[1]), predicateArgs, SortProvider::boolSort); + // FIXME: Why do we need to represent the predicate as Expression? definitions.push_back(predicate == parsedInterpretation); } return Expression::mkAnd(std::move(definitions)); From a4489211c9a872e81235d35433cdffe318755c77 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Fri, 28 Mar 2025 09:30:49 +0100 Subject: [PATCH 25/80] SMTChecker: Move helper function towards its only usage We don't need a separate file for a single, relatively small, helper function. --- libsolidity/CMakeLists.txt | 2 - libsolidity/formal/CHC.cpp | 54 +++++++++++++++++++- libsolidity/formal/Invariants.cpp | 85 ------------------------------- libsolidity/formal/Invariants.h | 37 -------------- 4 files changed, 53 insertions(+), 125 deletions(-) delete mode 100644 libsolidity/formal/Invariants.cpp delete mode 100644 libsolidity/formal/Invariants.h diff --git a/libsolidity/CMakeLists.txt b/libsolidity/CMakeLists.txt index 5925a50ac480..f0289acac3a8 100644 --- a/libsolidity/CMakeLists.txt +++ b/libsolidity/CMakeLists.txt @@ -117,8 +117,6 @@ set(sources formal/EncodingContext.h formal/ExpressionFormatter.cpp formal/ExpressionFormatter.h - formal/Invariants.cpp - formal/Invariants.h formal/ModelChecker.cpp formal/ModelChecker.h formal/ModelCheckerSettings.cpp diff --git a/libsolidity/formal/CHC.cpp b/libsolidity/formal/CHC.cpp index bab340051f82..67878084f61b 100644 --- a/libsolidity/formal/CHC.cpp +++ b/libsolidity/formal/CHC.cpp @@ -19,8 +19,8 @@ #include #include +#include #include -#include #include #include #include @@ -2134,6 +2134,58 @@ void CHC::checkVerificationTargets() m_safeTargets[m_verificationTargets.at(id).errorNode].insert(m_verificationTargets.at(id)); } +namespace +{ +std::map> collectInvariants( + smtutil::Expression const& _proof, + std::set const& _predicates, + ModelCheckerInvariants const& _invariantsSetting +) +{ + std::set targets; + if (_invariantsSetting.has(InvariantType::Contract)) + targets.insert("interface_"); + if (_invariantsSetting.has(InvariantType::Reentrancy)) + targets.insert("nondet_interface_"); + + std::map> equalities; + // Collect equalities where one of the sides is a predicate we're interested in. + util::BreadthFirstSearch{{&_proof}}.run([&](auto&& _expr, auto&& _addChild) { + if (_expr->name == "=") + for (auto const& t: targets) + { + auto arg0 = _expr->arguments.at(0); + auto arg1 = _expr->arguments.at(1); + if (boost::algorithm::starts_with(arg0.name, t)) + equalities.insert({arg0.name, {arg0, std::move(arg1)}}); + else if (boost::algorithm::starts_with(arg1.name, t)) + equalities.insert({arg1.name, {arg1, std::move(arg0)}}); + } + for (auto const& arg: _expr->arguments) + _addChild(&arg); + }); + + std::map> invariants; + for (auto pred: _predicates) + { + auto predName = pred->functor().name; + if (!equalities.count(predName)) + continue; + + solAssert(pred->contextContract(), ""); + + auto const& [predExpr, invExpr] = equalities.at(predName); + + static std::set const ignore{"true", "false"}; + auto r = substitute(invExpr, pred->expressionSubstitution(predExpr)); + // No point in reporting true/false as invariants. + if (!ignore.count(r.name)) + invariants[pred].insert(toSolidityStr(r)); + } + return invariants; +} +} // namespace + void CHC::checkAndReportTarget( CHCVerificationTarget const& _target, std::vector const& _placeholders, diff --git a/libsolidity/formal/Invariants.cpp b/libsolidity/formal/Invariants.cpp deleted file mode 100644 index 017ab1e3aedb..000000000000 --- a/libsolidity/formal/Invariants.cpp +++ /dev/null @@ -1,85 +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 - -using boost::algorithm::starts_with; -using namespace solidity; -using namespace solidity::smtutil; -using namespace solidity::frontend::smt; - -namespace solidity::frontend::smt -{ - -std::map> collectInvariants( - smtutil::Expression const& _proof, - std::set const& _predicates, - ModelCheckerInvariants const& _invariantsSetting -) -{ - std::set targets; - if (_invariantsSetting.has(InvariantType::Contract)) - targets.insert("interface_"); - if (_invariantsSetting.has(InvariantType::Reentrancy)) - targets.insert("nondet_interface_"); - - std::map> equalities; - // Collect equalities where one of the sides is a predicate we're interested in. - util::BreadthFirstSearch{{&_proof}}.run([&](auto&& _expr, auto&& _addChild) { - if (_expr->name == "=") - for (auto const& t: targets) - { - auto arg0 = _expr->arguments.at(0); - auto arg1 = _expr->arguments.at(1); - if (starts_with(arg0.name, t)) - equalities.insert({arg0.name, {arg0, std::move(arg1)}}); - else if (starts_with(arg1.name, t)) - equalities.insert({arg1.name, {arg1, std::move(arg0)}}); - } - for (auto const& arg: _expr->arguments) - _addChild(&arg); - }); - - std::map> invariants; - for (auto pred: _predicates) - { - auto predName = pred->functor().name; - if (!equalities.count(predName)) - continue; - - solAssert(pred->contextContract(), ""); - - auto const& [predExpr, invExpr] = equalities.at(predName); - - static std::set const ignore{"true", "false"}; - auto r = substitute(invExpr, pred->expressionSubstitution(predExpr)); - // No point in reporting true/false as invariants. - if (!ignore.count(r.name)) - invariants[pred].insert(toSolidityStr(r)); - } - return invariants; -} - -} diff --git a/libsolidity/formal/Invariants.h b/libsolidity/formal/Invariants.h deleted file mode 100644 index b6459fccd415..000000000000 --- a/libsolidity/formal/Invariants.h +++ /dev/null @@ -1,37 +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 - -#include -#include -#include - -namespace solidity::frontend::smt -{ - -std::map> collectInvariants( - smtutil::Expression const& _proof, - std::set const& _predicates, - ModelCheckerInvariants const& _invariantsSettings -); - -} From 5ea8f2587447a09daa4089322dc06d1f323a16e7 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 19 Mar 2025 13:40:09 +0100 Subject: [PATCH 26/80] Add support for enum values in NatSpec --- Changelog.md | 1 + libsolidity/ast/AST.h | 14 ++++- libsolidity/ast/ASTJsonExporter.cpp | 1 + libsolidity/ast/ASTJsonImporter.cpp | 3 +- libsolidity/parsing/Parser.cpp | 3 +- .../ASTJSON/enum_value_natspec.json | 56 +++++++++++++++++++ .../ASTJSON/enum_value_natspec.sol | 11 ++++ .../ASTJSON/enum_value_natspec_parseOnly.json | 50 +++++++++++++++++ .../{enum_no_docs.sol => enum.sol} | 0 .../{docstring_enum.sol => enum_value.sol} | 10 ++-- 10 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 test/libsolidity/ASTJSON/enum_value_natspec.json create mode 100644 test/libsolidity/ASTJSON/enum_value_natspec.sol create mode 100644 test/libsolidity/ASTJSON/enum_value_natspec_parseOnly.json rename test/libsolidity/natspecJSON/{enum_no_docs.sol => enum.sol} (100%) rename test/libsolidity/natspecJSON/{docstring_enum.sol => enum_value.sol} (55%) diff --git a/Changelog.md b/Changelog.md index 7efefca02d6a..525ed2d9e58b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ Language Features: Compiler Features: +* NatSpec: Capture Natspec documentation of `enum` values in the AST. Bugfixes: diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 0121bef332df..9c7cbbded2cc 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -823,11 +823,19 @@ class EnumDefinition: public Declaration, public StructurallyDocumented, public /** * Declaration of an Enum Value */ -class EnumValue: public Declaration +class EnumValue: public Declaration, public StructurallyDocumented { public: - EnumValue(int64_t _id, SourceLocation const& _location, ASTPointer const& _name): - Declaration(_id, _location, _name, _location) {} + EnumValue( + int64_t _id, + SourceLocation const& _location, + ASTPointer const& _name, + ASTPointer _documentation + ): + Declaration(_id, _location, _name, _location), + StructurallyDocumented(std::move(_documentation)) + { + } void accept(ASTVisitor& _visitor) override; void accept(ASTConstVisitor& _visitor) const override; diff --git a/libsolidity/ast/ASTJsonExporter.cpp b/libsolidity/ast/ASTJsonExporter.cpp index 42627b5f7f7c..4eaa558713a7 100644 --- a/libsolidity/ast/ASTJsonExporter.cpp +++ b/libsolidity/ast/ASTJsonExporter.cpp @@ -430,6 +430,7 @@ bool ASTJsonExporter::visit(EnumValue const& _node) setJsonNode(_node, "EnumValue", { std::make_pair("name", _node.name()), std::make_pair("nameLocation", sourceLocationToString(_node.nameLocation())), + std::make_pair("documentation", toJson(_node.documentation().get())), }); return false; } diff --git a/libsolidity/ast/ASTJsonImporter.cpp b/libsolidity/ast/ASTJsonImporter.cpp index d6cd7f43896a..2d2b66fd8d08 100644 --- a/libsolidity/ast/ASTJsonImporter.cpp +++ b/libsolidity/ast/ASTJsonImporter.cpp @@ -489,7 +489,8 @@ ASTPointer ASTJsonImporter::createEnumValue(Json const& _node) { return createASTNode( _node, - memberAsASTString(_node, "name") + memberAsASTString(_node, "name"), + _node.contains("documentation") && !_node["documentation"].is_null() ? createDocumentation(member(_node, "documentation")) : nullptr ); } diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 08a319b5b597..8889e65087fa 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -824,8 +824,9 @@ ASTPointer Parser::parseEnumValue() { RecursionGuard recursionGuard(*this); ASTNodeFactory nodeFactory(*this); + ASTPointer documentation = parseStructuredDocumentation(); nodeFactory.markEndPosition(); - return nodeFactory.createNode(expectIdentifierToken()); + return nodeFactory.createNode(expectIdentifierToken(), documentation); } ASTPointer Parser::parseEnumDefinition() diff --git a/test/libsolidity/ASTJSON/enum_value_natspec.json b/test/libsolidity/ASTJSON/enum_value_natspec.json new file mode 100644 index 000000000000..e468bb987064 --- /dev/null +++ b/test/libsolidity/ASTJSON/enum_value_natspec.json @@ -0,0 +1,56 @@ +{ + "absolutePath": "a", + "exportedSymbols": { + "Color": [ + 6 + ] + }, + "id": 7, + "nodeType": "SourceUnit", + "nodes": [ + { + "canonicalName": "Color", + "id": 6, + "members": [ + { + "id": 1, + "name": "Red", + "nameLocation": "17:3:1", + "nodeType": "EnumValue", + "src": "17:3:1" + }, + { + "documentation": { + "id": 2, + "nodeType": "StructuredDocumentation", + "src": "26:57:1", + "text": "@notice example of notice\n @dev example of dev" + }, + "id": 3, + "name": "Green", + "nameLocation": "88:5:1", + "nodeType": "EnumValue", + "src": "88:5:1" + }, + { + "documentation": { + "id": 4, + "nodeType": "StructuredDocumentation", + "src": "99:23:1", + "text": "@dev example of dev" + }, + "id": 5, + "name": "Blue", + "nameLocation": "127:4:1", + "nodeType": "EnumValue", + "src": "127:4:1" + } + ], + "name": "Color", + "nameLocation": "5:5:1", + "nodeType": "EnumDefinition", + "src": "0:164:1" + } + ], + "src": "0:165:1" +} diff --git a/test/libsolidity/ASTJSON/enum_value_natspec.sol b/test/libsolidity/ASTJSON/enum_value_natspec.sol new file mode 100644 index 000000000000..e5209d644831 --- /dev/null +++ b/test/libsolidity/ASTJSON/enum_value_natspec.sol @@ -0,0 +1,11 @@ +enum Color { + Red, + /// @notice example of notice + /// @dev example of dev + Green, + /// @dev example of dev + Blue + /// @dev beyond last value +} + +// ---- diff --git a/test/libsolidity/ASTJSON/enum_value_natspec_parseOnly.json b/test/libsolidity/ASTJSON/enum_value_natspec_parseOnly.json new file mode 100644 index 000000000000..ff3d7c756ed1 --- /dev/null +++ b/test/libsolidity/ASTJSON/enum_value_natspec_parseOnly.json @@ -0,0 +1,50 @@ +{ + "absolutePath": "a", + "id": 7, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 6, + "members": [ + { + "id": 1, + "name": "Red", + "nameLocation": "17:3:1", + "nodeType": "EnumValue", + "src": "17:3:1" + }, + { + "documentation": { + "id": 2, + "nodeType": "StructuredDocumentation", + "src": "26:57:1", + "text": "@notice example of notice\n @dev example of dev" + }, + "id": 3, + "name": "Green", + "nameLocation": "88:5:1", + "nodeType": "EnumValue", + "src": "88:5:1" + }, + { + "documentation": { + "id": 4, + "nodeType": "StructuredDocumentation", + "src": "99:23:1", + "text": "@dev example of dev" + }, + "id": 5, + "name": "Blue", + "nameLocation": "127:4:1", + "nodeType": "EnumValue", + "src": "127:4:1" + } + ], + "name": "Color", + "nameLocation": "5:5:1", + "nodeType": "EnumDefinition", + "src": "0:164:1" + } + ], + "src": "0:165:1" +} diff --git a/test/libsolidity/natspecJSON/enum_no_docs.sol b/test/libsolidity/natspecJSON/enum.sol similarity index 100% rename from test/libsolidity/natspecJSON/enum_no_docs.sol rename to test/libsolidity/natspecJSON/enum.sol diff --git a/test/libsolidity/natspecJSON/docstring_enum.sol b/test/libsolidity/natspecJSON/enum_value.sol similarity index 55% rename from test/libsolidity/natspecJSON/docstring_enum.sol rename to test/libsolidity/natspecJSON/enum_value.sol index d5ace6b14192..ccb3233a51b4 100644 --- a/test/libsolidity/natspecJSON/docstring_enum.sol +++ b/test/libsolidity/natspecJSON/enum_value.sol @@ -1,11 +1,13 @@ contract C { - /// @title example of title - /// @author example of author - /// @notice example of notice - /// @dev example of dev enum Color { + /// @custom red color Red, + /// @title example of title + /// @author example of author + /// @notice example of notice + /// @dev example of dev Green + /// @notice beyond last value } } // ---- From c4b454ac53ad6409cee612ddaf38d467b50a6299 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 2 Apr 2025 13:16:18 +0200 Subject: [PATCH 27/80] Docs --- docs/natspec-format.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/natspec-format.rst b/docs/natspec-format.rst index 2f0d1d6b40d9..40da3e5e3529 100644 --- a/docs/natspec-format.rst +++ b/docs/natspec-format.rst @@ -37,7 +37,7 @@ Documentation Example ===================== Documentation is inserted above each ``contract``, ``interface``, ``library``, -``function``, and ``event`` using the Doxygen notation format. +``function``, ``enum``, ``enum`` value and ``event`` using the Doxygen notation format. A ``public`` state variable is equivalent to a ``function`` for the purposes of NatSpec. @@ -116,13 +116,13 @@ in the same way as if it were tagged with ``@notice``. =============== ====================================================================================== ============================= Tag Context =============== ====================================================================================== ============================= -``@title`` A title that should describe the contract/interface contract, library, interface, struct, enum -``@author`` The name of the author contract, library, interface, struct, enum -``@notice`` Explain to an end user what this does contract, library, interface, function, public state variable, event, struct, enum, error -``@dev`` Explain to a developer any extra details contract, library, interface, function, state variable, event, struct, enum, error -``@param`` Documents a parameter just like in Doxygen (must be followed by parameter name) function, event, error -``@return`` Documents the return variables of a contract's function function, public state variable -``@inheritdoc`` Copies all missing tags from the base function (must be followed by the contract name) function, public state variable +``@title`` A title that should describe the contract/interface contract, library, interface, struct, enum, enum values +``@author`` The name of the author contract, library, interface, struct, enum, enum values +``@notice`` Explain to an end user what this does contract, library, interface, function, public state variable, event, struct, enum, enum values error +``@dev`` Explain to a developer any extra details contract, library, interface, function, state variable, event, struct, enum, enum values, error +``@param`` Documents a parameter just like in Doxygen (must be followed by parameter name) function, event, enum values, error +``@return`` Documents the return variables of a contract's function function, enum, enum values, public state variable +``@inheritdoc`` Copies all missing tags from the base function (must be followed by the contract name) function, enum, enum values, public state variable ``@custom:...`` Custom tag, semantics is application-defined everywhere =============== ====================================================================================== ============================= From c6084281e3e7ff0b969235acab44eb409f93f273 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Fri, 28 Mar 2025 09:49:35 +0100 Subject: [PATCH 28/80] SMTChecker: Refactor processing invariants from the solver Instead of extracting invariants as a single expression containing all predicates and their definitions, we represent invariants as a map from predicate names to the corresponding definitions. Additionally, we need to remember formal arguments of the predicate so we can apply substitutions to the definitions properly. I believe the previous representation was an artifact of how Z3 returns CHC model through its API. The new representation is more fitting for models extracted from SMT-LIB. --- libsmtutil/CHCSmtLib2Interface.cpp | 27 +++++------ libsmtutil/CHCSmtLib2Interface.h | 4 +- libsmtutil/CHCSolverInterface.h | 12 ++++- libsolidity/formal/CHC.cpp | 50 +++++++------------- libsolidity/formal/Predicate.cpp | 30 ++++++------ libsolidity/formal/Predicate.h | 4 +- libsolidity/formal/Z3CHCSmtLib2Interface.cpp | 15 +++--- 7 files changed, 65 insertions(+), 77 deletions(-) diff --git a/libsmtutil/CHCSmtLib2Interface.cpp b/libsmtutil/CHCSmtLib2Interface.cpp index 04cbad1ad489..b81eeb4fe06b 100644 --- a/libsmtutil/CHCSmtLib2Interface.cpp +++ b/libsmtutil/CHCSmtLib2Interface.cpp @@ -102,21 +102,18 @@ CHCSolverInterface::QueryResult CHCSmtLib2Interface::query(Expression const& _bl // However, with CHC solvers, the meaning is flipped, UNSAT -> UNSAFE and SAT -> SAFE. // So we have to flip the answer. if (boost::starts_with(response, "sat")) - { - auto maybeInvariants = invariantsFromSolverResponse(response); - return {CheckResult::UNSATISFIABLE, maybeInvariants.value_or(Expression(true)), {}}; - } - else if (boost::starts_with(response, "unsat")) + return {CheckResult::UNSATISFIABLE, invariantsFromSolverResponse(response), {}}; + if (boost::starts_with(response, "unsat")) result = CheckResult::SATISFIABLE; else if (boost::starts_with(response, "unknown")) result = CheckResult::UNKNOWN; else result = CheckResult::ERROR; - return {result, Expression(true), {}}; + return {result, {}, {}}; } catch(smtutil::SMTSolverInteractionError const&) { - return {CheckResult::ERROR, Expression(true), {}}; + return {CheckResult::ERROR, {}, {}}; } } @@ -416,7 +413,7 @@ smtutil::Expression CHCSmtLib2Interface::ScopedParser::toSMTUtilExpression(SMTLi } -std::optional CHCSmtLib2Interface::invariantsFromSolverResponse(std::string const& _response) const +CHCSmtLib2Interface::Invariants CHCSmtLib2Interface::invariantsFromSolverResponse(std::string const& _response) const { std::stringstream ss(_response); std::string answer; @@ -438,7 +435,7 @@ std::optional CHCSmtLib2Interface::invariantsFromSolverResp smtSolverInteractionRequire(parser.isEOF(), "Error during parsing CHC model"); smtSolverInteractionRequire(!parsedOutput.empty(), "Error during parsing CHC model"); auto& commands = parsedOutput.size() == 1 ? asSubExpressions(parsedOutput[0]) : parsedOutput; - std::vector definitions; + Invariants definitions; for (auto& command: commands) { auto& args = asSubExpressions(command); @@ -456,7 +453,7 @@ std::optional CHCSmtLib2Interface::invariantsFromSolverResp inlineLetExpressions(interpretation); ScopedParser scopedParser(m_context); auto const& formalArguments = asSubExpressions(args[2]); - std::vector predicateArgs; + std::vector predicateArguments; for (auto const& formalArgument: formalArguments) { smtSolverInteractionRequire(!isAtom(formalArgument), "Invalid format of CHC model"); @@ -465,7 +462,7 @@ std::optional CHCSmtLib2Interface::invariantsFromSolverResp smtSolverInteractionRequire(isAtom(nameSortPair[0]), "Invalid format of CHC model"); SortPointer varSort = scopedParser.toSort(nameSortPair[1]); scopedParser.addVariableDeclaration(asAtom(nameSortPair[0]), varSort); - predicateArgs.push_back(scopedParser.toSMTUtilExpression(nameSortPair[0])); + predicateArguments.push_back(asAtom(nameSortPair[0])); } auto parsedInterpretation = scopedParser.toSMTUtilExpression(interpretation); @@ -476,11 +473,11 @@ std::optional CHCSmtLib2Interface::invariantsFromSolverResp return first.name < second.name; }); - Expression predicate(asAtom(args[1]), predicateArgs, SortProvider::boolSort); - // FIXME: Why do we need to represent the predicate as Expression? - definitions.push_back(predicate == parsedInterpretation); + std::string const& predicateName = asAtom(args[1]); + smtSolverInteractionRequire(!definitions.contains(predicateName), "Predicates must be unique"); + definitions.emplace(predicateName, InvariantInfo{parsedInterpretation, predicateArguments}); } - return Expression::mkAnd(std::move(definitions)); + return definitions; } namespace diff --git a/libsmtutil/CHCSmtLib2Interface.h b/libsmtutil/CHCSmtLib2Interface.h index 0f8fc061d3df..5b45f1638012 100644 --- a/libsmtutil/CHCSmtLib2Interface.h +++ b/libsmtutil/CHCSmtLib2Interface.h @@ -94,8 +94,8 @@ class CHCSmtLib2Interface: public CHCSolverInterface /// Communicates with the solver via the callback. Throws SMTSolverError on error. virtual std::string querySolver(std::string const& _input); - /// Translates CHC solver response with a model to our representation of invariants. Returns None on error. - std::optional invariantsFromSolverResponse(std::string const& _response) const; + /// Translates CHC solver response with a model to our representation of invariants. + Invariants invariantsFromSolverResponse(std::string const& _response) const; std::set collectVariableNames(Expression const& _expr) const; diff --git a/libsmtutil/CHCSolverInterface.h b/libsmtutil/CHCSolverInterface.h index 8feb18aa8245..641d54cfb440 100644 --- a/libsmtutil/CHCSolverInterface.h +++ b/libsmtutil/CHCSolverInterface.h @@ -25,6 +25,7 @@ #include #include +#include #include namespace solidity::smtutil @@ -49,10 +50,19 @@ class CHCSolverInterface : public SolverInterface std::map> edges; }; + struct InvariantInfo + { + /// Predicate definition as SMT expression + Expression expression; + /// Names of the formal arguments of the predicate definition + std::vector variableNames; + }; + /// Maps predicate to its definition as given by the solver and the formal arguments of the predicate + using Invariants = std::unordered_map; struct QueryResult { CheckResult answer; - Expression invariant; + Invariants invariants; CexGraph cex; }; /// Takes a function application _expr and checks for reachability. diff --git a/libsolidity/formal/CHC.cpp b/libsolidity/formal/CHC.cpp index 67878084f61b..fea13fde2360 100644 --- a/libsolidity/formal/CHC.cpp +++ b/libsolidity/formal/CHC.cpp @@ -34,9 +34,8 @@ #include #include -#include - #include +#include #include #include #include @@ -1895,7 +1894,7 @@ CHCSolverInterface::QueryResult CHC::query(smtutil::Expression const& _query, la 2339_error, "CHC: Requested query:\n" + smtLibCode ); - return {.answer = CheckResult::UNKNOWN, .invariant = smtutil::Expression(true), .cex = {}}; + return {.answer = CheckResult::UNKNOWN, .invariants = {}, .cex = {}}; } auto result = m_interface->query(_query); switch (result.answer) @@ -2137,7 +2136,7 @@ void CHC::checkVerificationTargets() namespace { std::map> collectInvariants( - smtutil::Expression const& _proof, + CHCSmtLib2Interface::Invariants const& _invariants, std::set const& _predicates, ModelCheckerInvariants const& _invariantsSetting ) @@ -2148,38 +2147,23 @@ std::map> collectInvariants( if (_invariantsSetting.has(InvariantType::Reentrancy)) targets.insert("nondet_interface_"); - std::map> equalities; - // Collect equalities where one of the sides is a predicate we're interested in. - util::BreadthFirstSearch{{&_proof}}.run([&](auto&& _expr, auto&& _addChild) { - if (_expr->name == "=") - for (auto const& t: targets) - { - auto arg0 = _expr->arguments.at(0); - auto arg1 = _expr->arguments.at(1); - if (boost::algorithm::starts_with(arg0.name, t)) - equalities.insert({arg0.name, {arg0, std::move(arg1)}}); - else if (boost::algorithm::starts_with(arg1.name, t)) - equalities.insert({arg1.name, {arg1, std::move(arg0)}}); - } - for (auto const& arg: _expr->arguments) - _addChild(&arg); - }); - std::map> invariants; - for (auto pred: _predicates) + for (auto const* pred: _predicates) { - auto predName = pred->functor().name; - if (!equalities.count(predName)) + smtAssert(pred); + auto const& predName = pred->functor().name; + if (!_invariants.contains(predName)) + continue; + if (ranges::none_of(targets, [&](auto const& _target) { return predName.starts_with(_target); })) continue; - solAssert(pred->contextContract(), ""); + smtAssert(pred->contextContract()); - auto const& [predExpr, invExpr] = equalities.at(predName); + auto const& [definition, formalArguments] = _invariants.at(predName); - static std::set const ignore{"true", "false"}; - auto r = substitute(invExpr, pred->expressionSubstitution(predExpr)); + auto r = substitute(definition, pred->expressionSubstitution(formalArguments)); // No point in reporting true/false as invariants. - if (!ignore.count(r.name)) + if (r.name != "true" && r.name != "false") invariants[pred].insert(toSolidityStr(r)); } return invariants; @@ -2205,7 +2189,7 @@ void CHC::checkAndReportTarget( placeholder.constraints && placeholder.errorExpression == _target.errorId ); auto const& location = _target.errorNode->location(); - auto [result, invariant, model] = query(error(), location); + auto [result, invariants, model] = query(error(), location); if (result == CheckResult::UNSATISFIABLE) { m_safeTargets[_target.errorNode].insert(_target); @@ -2214,9 +2198,9 @@ void CHC::checkAndReportTarget( predicates.insert(pred); for (auto const* pred: m_nondetInterfaces | ranges::views::values) predicates.insert(pred); - std::map> invariants = collectInvariants(invariant, predicates, m_settings.invariants); - for (auto pred: invariants | ranges::views::keys) - m_invariants[pred] += std::move(invariants.at(pred)); + std::map> invariantStrings = collectInvariants(invariants, predicates, m_settings.invariants); + for (auto pred: invariantStrings | ranges::views::keys) + m_invariants[pred] += std::move(invariantStrings.at(pred)); } else if (result == CheckResult::SATISFIABLE) { diff --git a/libsolidity/formal/Predicate.cpp b/libsolidity/formal/Predicate.cpp index 4b7ca8edb324..66d8c2405538 100644 --- a/libsolidity/formal/Predicate.cpp +++ b/libsolidity/formal/Predicate.cpp @@ -27,12 +27,10 @@ #include #include -#include #include #include -using boost::algorithm::starts_with; using namespace solidity; using namespace solidity::smtutil; using namespace solidity::frontend; @@ -434,15 +432,15 @@ std::pair>, std::vector Predicate::expressionSubstitution(smtutil::Expression const& _predExpr) const +std::map Predicate::expressionSubstitution(std::vector const& _predArgs) const { std::map subst; std::string predName = functor().name; - solAssert(contextContract(), ""); + smtAssert(contextContract()); auto const& stateVars = SMTEncoder::stateVariablesIncludingInheritedAndPrivate(*contextContract()); - auto nArgs = _predExpr.arguments.size(); + auto const nArgs = _predArgs.size(); // The signature of an interface predicate is // interface(this, abiFunctions, (optionally) bytesConcatFunctions, cryptoFunctions, blockchainState, stateVariables). @@ -450,12 +448,13 @@ std::map Predicate::expressionSubstitution(smtutil::Ex // invariant over its state, for example `x <= 0`. if (isInterface()) { + smtAssert(nArgs > 0); size_t shift = txValuesIndex(); - solAssert(starts_with(predName, "interface"), ""); - subst[_predExpr.arguments.at(0).name] = "address(this)"; - solAssert(nArgs == stateVars.size() + shift, ""); + smtAssert(predName.starts_with("interface")); + subst[_predArgs.at(0)] = "address(this)"; + smtAssert(nArgs == stateVars.size() + shift); for (size_t i = nArgs - stateVars.size(); i < nArgs; ++i) - subst[_predExpr.arguments.at(i).name] = stateVars.at(i - shift)->name(); + subst[_predArgs.at(i)] = stateVars.at(i - shift)->name(); } // The signature of a nondet interface predicate is // nondet_interface(error, this, abiFunctions, (optionally) bytesConcatFunctions, cryptoFunctions, blockchainState, stateVariables, blockchainState', stateVariables'). @@ -466,14 +465,15 @@ std::map Predicate::expressionSubstitution(smtutil::Ex // `(x <= 0) => (x' <= 100)`. else if (isNondetInterface()) { - solAssert(starts_with(predName, "nondet_interface"), ""); - subst[_predExpr.arguments.at(0).name] = ""; - subst[_predExpr.arguments.at(1).name] = "address(this)"; - solAssert(nArgs == stateVars.size() * 2 + firstArgIndex(), ""); + smtAssert(nArgs > 1); + smtAssert(predName.starts_with("nondet_interface")); + subst[_predArgs.at(0)] = ""; + subst[_predArgs.at(1)] = "address(this)"; + smtAssert(nArgs == stateVars.size() * 2 + firstArgIndex()); for (size_t i = nArgs - stateVars.size(), s = 0; i < nArgs; ++i, ++s) - subst[_predExpr.arguments.at(i).name] = stateVars.at(s)->name() + "'"; + subst[_predArgs.at(i)] = stateVars.at(s)->name() + "'"; for (size_t i = nArgs - (stateVars.size() * 2 + 1), s = 0; i < nArgs - (stateVars.size() + 1); ++i, ++s) - subst[_predExpr.arguments.at(i).name] = stateVars.at(s)->name(); + subst[_predArgs.at(i)] = stateVars.at(s)->name(); } return subst; diff --git a/libsolidity/formal/Predicate.h b/libsolidity/formal/Predicate.h index f389ab822111..7e4ba0f00fe8 100644 --- a/libsolidity/formal/Predicate.h +++ b/libsolidity/formal/Predicate.h @@ -179,9 +179,9 @@ class Predicate /// @returns the values of the local variables used by this predicate. std::pair>, std::vector> localVariableValues(std::vector const& _args) const; - /// @returns a substitution map from the arguments of _predExpr + /// @returns a substitution map from the predicate arguments @p _predArgs /// to a Solidity-like expression. - std::map expressionSubstitution(smtutil::Expression const& _predExprs) const; + std::map expressionSubstitution(std::vector const& _predArgs) const; private: /// Recursively fills _array from _expr. diff --git a/libsolidity/formal/Z3CHCSmtLib2Interface.cpp b/libsolidity/formal/Z3CHCSmtLib2Interface.cpp index 2ceecfcf9088..da6f14d963d3 100644 --- a/libsolidity/formal/Z3CHCSmtLib2Interface.cpp +++ b/libsolidity/formal/Z3CHCSmtLib2Interface.cpp @@ -90,26 +90,23 @@ CHCSolverInterface::QueryResult Z3CHCSmtLib2Interface::query(smtutil::Expression #endif setupSmtCallback(true); if (!boost::starts_with(response, "unsat")) - return {CheckResult::SATISFIABLE, Expression(true), {}}; - return {CheckResult::SATISFIABLE, Expression(true), graphFromZ3Answer(response)}; + return {CheckResult::SATISFIABLE, {}, {}}; + return {CheckResult::SATISFIABLE, {}, graphFromZ3Answer(response)}; } CheckResult result; if (boost::starts_with(response, "sat")) - { - auto maybeInvariants = invariantsFromSolverResponse(response); - return {CheckResult::UNSATISFIABLE, maybeInvariants.value_or(Expression(true)), {}}; - } - else if (boost::starts_with(response, "unknown")) + return {CheckResult::UNSATISFIABLE, invariantsFromSolverResponse(response), {}}; + if (boost::starts_with(response, "unknown")) result = CheckResult::UNKNOWN; else result = CheckResult::ERROR; - return {result, Expression(true), {}}; + return {result, {}, {}}; } catch(smtutil::SMTSolverInteractionError const&) { - return {CheckResult::ERROR, Expression(true), {}}; + return {CheckResult::ERROR, {}, {}}; } } From dbd5521a697eae275afeb5d8a0b256670238f5b9 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 4 Apr 2025 07:50:21 +0200 Subject: [PATCH 29/80] remove install of obsolete jsoncpp --- .circleci/osx_install_dependencies.sh | 3 --- scripts/install_obsolete_jsoncpp_1_7_4.sh | 24 ----------------------- 2 files changed, 27 deletions(-) delete mode 100755 scripts/install_obsolete_jsoncpp_1_7_4.sh diff --git a/.circleci/osx_install_dependencies.sh b/.circleci/osx_install_dependencies.sh index e7a0b9ddfda2..6e0c859f9ace 100755 --- a/.circleci/osx_install_dependencies.sh +++ b/.circleci/osx_install_dependencies.sh @@ -59,9 +59,6 @@ then brew install openjdk@11 brew install unzip - # 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" diff --git a/scripts/install_obsolete_jsoncpp_1_7_4.sh b/scripts/install_obsolete_jsoncpp_1_7_4.sh deleted file mode 100755 index f9de0245d70b..000000000000 --- a/scripts/install_obsolete_jsoncpp_1_7_4.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -set -eu - -TEMPDIR=$(mktemp -d) -( - cd "$TEMPDIR" - jsoncpp_version="1.7.4" - jsoncpp_package="jsoncpp-${jsoncpp_version}.tar.gz" - jsoncpp_sha256=10dcd0677e80727e572a1e462193e51a5fde3e023b99e144b2ee1a469835f769 - wget -O "$jsoncpp_package" https://github.com/open-source-parsers/jsoncpp/archive/${jsoncpp_version}.tar.gz - if ! [ "$(sha256sum "$jsoncpp_package")" = "${jsoncpp_sha256} ${jsoncpp_package}" ] - then - >&2 echo "ERROR: Downloaded jsoncpp source package has wrong checksum." - exit 1 - fi - tar xvzf "$jsoncpp_package" - cd "jsoncpp-${jsoncpp_version}" - mkdir -p build - cd build - cmake -DCMAKE_OSX_ARCHITECTURES:STRING="x86_64;arm64" -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" .. - make - make install -) -rm -r "$TEMPDIR" From f323bd4de27b635dab1ba249832a1ec0b054cf4e Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:07:12 +0200 Subject: [PATCH 30/80] cmake: use boost include dirs and version in status message --- cmake/EthDependencies.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmake/EthDependencies.cmake b/cmake/EthDependencies.cmake index 87a5e1b5e17e..56d90bb478e3 100644 --- a/cmake/EthDependencies.cmake +++ b/cmake/EthDependencies.cmake @@ -49,8 +49,7 @@ if (NOT TARGET Boost::boost) # header only target add_library(Boost::boost INTERFACE IMPORTED) set_property(TARGET Boost::boost APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Boost_INCLUDE_DIRS}) endif() -get_property(LOCATION TARGET Boost::boost PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -message(STATUS "Found Boost headers in ${LOCATION}") +message(STATUS "Found Boost ${Boost_VERSION} headers in ${Boost_INCLUDE_DIRS}") foreach (BOOST_COMPONENT IN LISTS BOOST_COMPONENTS) if (NOT TARGET Boost::${BOOST_COMPONENT}) From e6d56997aba55b2805a288b671d14651bd140270 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:17:23 +0200 Subject: [PATCH 31/80] set CMP0167 to OLD behavior for boost versions < 1.70 --- cmake/EthDependencies.cmake | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cmake/EthDependencies.cmake b/cmake/EthDependencies.cmake index 56d90bb478e3..f79140dd29d9 100644 --- a/cmake/EthDependencies.cmake +++ b/cmake/EthDependencies.cmake @@ -31,6 +31,10 @@ endif() set(BOOST_COMPONENTS "filesystem;unit_test_framework;program_options;system") +# CMake >= 3.30 should not use the vendored boost +if(POLICY CMP0167) + cmake_policy(SET CMP0167 NEW) +endif() if (WIN32) # Boost 1.77 fixes a bug that causes crashes on Windows for some relative paths in --allow-paths. # See https://github.com/boostorg/filesystem/issues/201 @@ -38,7 +42,16 @@ if (WIN32) else() # Boost 1.65 is the first to also provide boost::get for rvalue-references (#5787). # Boost 1.67 moved container_hash into is own module. - find_package(Boost 1.67.0 QUIET REQUIRED COMPONENTS ${BOOST_COMPONENTS}) + # Boost 1.70 comes with its own BoostConfig.cmake and is the new (non-deprecated) behavior + find_package(Boost 1.70.0 QUIET COMPONENTS ${BOOST_COMPONENTS}) + if (NOT ${Boost_FOUND}) + # If the boost version is < 1.70.0, there is no boost config delivered with it, revert to old behavior + # todo drop this once cmake minimum version >= 3.30 is reached + if(POLICY CMP0167) + cmake_policy(SET CMP0167 OLD) + endif() + find_package(Boost 1.67.0 QUIET REQUIRED COMPONENTS ${BOOST_COMPONENTS}) + endif() endif() # If cmake is older than boost and boost is older than 1.70, From 4c23d04b53cba7bfda8ddf19ead131e88529e003 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 7 Apr 2025 16:00:49 +0200 Subject: [PATCH 32/80] Disable pedantic compilation for CMake 4.0.0 and AppleClang 15.0 --- CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b39878f26d3..29bf2b0ca663 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,14 @@ endif() find_package(Threads) +if ("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin" AND "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + if (CMAKE_VERSION VERSION_EQUAL "4.0.0" AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "15.0.0.15000040") + # for Apple clang 15 under cmake 4.0.0, disable pedantic warnings explicitly as it fails to treat boost properly as + # system library, warnings propagate + set(PEDANTIC OFF) + endif() +endif() + if(NOT PEDANTIC) message(WARNING "-- Pedantic build flags turned off. Warnings will not make compilation fail. This is NOT recommended in development builds.") endif() From 2cd97dc2b248edfac74241036cf7327d035bae57 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:34:38 +0200 Subject: [PATCH 33/80] Use pre-release version of sphinx-a4doc for python 3.13 --- docs/requirements.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index b1b21a8691d3..e0c87915b40a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,7 +4,9 @@ sphinx_rtd_theme>=0.5.2 pygments-lexer-solidity>=0.7.0 -sphinx-a4doc>=1.6.0 +sphinx-a4doc>=1.6.0; python_version < '3.13' +# todo remove this once there is a version > 1.6.0 +sphinx-a4doc @ git+https://github.com/taminomara/sphinx-a4doc@f63d3b2; python_version >= '3.13' # Sphinx 2.1.0 is the oldest version that accepts a lexer class in add_lexer() sphinx>=2.1.0, <6.0 From 0a6cce58a0e3814db15844c53e05e384e00088fd Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:34:59 +0200 Subject: [PATCH 34/80] relax sphinx version range to [2.1, 9) --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index e0c87915b40a..8e058b6296b9 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -9,4 +9,4 @@ sphinx-a4doc>=1.6.0; python_version < '3.13' sphinx-a4doc @ git+https://github.com/taminomara/sphinx-a4doc@f63d3b2; python_version >= '3.13' # Sphinx 2.1.0 is the oldest version that accepts a lexer class in add_lexer() -sphinx>=2.1.0, <6.0 +sphinx>=2.1.0, <9.0 From 971ac4c9ae79c4b7d5d76d23df1e1c9cd75b61ab Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Tue, 8 Apr 2025 11:46:21 +0200 Subject: [PATCH 35/80] require rtd theme < 3.0.0 --- docs/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 8e058b6296b9..f4c1aae61730 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,8 @@ # Older versions of sphinx-rtd-theme do not work with never docutils but have a bug in the dependency # which could result in it being installed anyway and the style (especially bullet points) being broken. # See https://github.com/readthedocs/sphinx_rtd_theme/issues/1115 -sphinx_rtd_theme>=0.5.2 +# theme >=3.0.0 removes the display_version option in favor of version_selector and language_selector +sphinx_rtd_theme>=0.5.2, <3.0.0 pygments-lexer-solidity>=0.7.0 sphinx-a4doc>=1.6.0; python_version < '3.13' From 502ebaa8f879e8c5b5440a984030cf30f48c6f8a Mon Sep 17 00:00:00 2001 From: Michael Cho Date: Mon, 31 Mar 2025 16:06:00 -0400 Subject: [PATCH 36/80] Add support for upcoming Boost 1.88.0 Boost.Process will make v2 the default in Boost 1.88.0[^1] which breaks compilation of prior code. For a simple fix, this commit updates to use the newer paths for v1 until the code is updated to use v2 API. [^1]: https://github.com/boostorg/process/commit/2ccd97cd48c5468b0609a488b59253efaa381711 --- libsolidity/formal/ModelChecker.cpp | 6 ++++++ libsolidity/interface/SMTSolverCommand.cpp | 9 +++++++++ test/libyul/ControlFlowGraphTest.cpp | 8 ++++++++ test/libyul/SSAControlFlowGraphTest.cpp | 8 ++++++++ test/libyul/StackLayoutGeneratorTest.cpp | 8 ++++++++ 5 files changed, 39 insertions(+) diff --git a/libsolidity/formal/ModelChecker.cpp b/libsolidity/formal/ModelChecker.cpp index 04d96f06746c..2d52414127a6 100644 --- a/libsolidity/formal/ModelChecker.cpp +++ b/libsolidity/formal/ModelChecker.cpp @@ -18,7 +18,13 @@ #include +#include +#if (BOOST_VERSION < 108800) #include +#else +#define BOOST_PROCESS_VERSION 1 +#include +#endif #include #include diff --git a/libsolidity/interface/SMTSolverCommand.cpp b/libsolidity/interface/SMTSolverCommand.cpp index 66adfd0c5e17..e6e0ded6252d 100644 --- a/libsolidity/interface/SMTSolverCommand.cpp +++ b/libsolidity/interface/SMTSolverCommand.cpp @@ -20,7 +20,16 @@ #include #include +#include +#if (BOOST_VERSION < 108800) #include +#else +#define BOOST_PROCESS_VERSION 1 +#include +#include +#include +#include +#endif namespace solidity::frontend { diff --git a/test/libyul/ControlFlowGraphTest.cpp b/test/libyul/ControlFlowGraphTest.cpp index c0ab37956e4c..594b2f6c96ee 100644 --- a/test/libyul/ControlFlowGraphTest.cpp +++ b/test/libyul/ControlFlowGraphTest.cpp @@ -29,7 +29,15 @@ #include #ifdef ISOLTEST +#include +#if (BOOST_VERSION < 108800) #include +#else +#define BOOST_PROCESS_VERSION 1 +#include +#include +#include +#endif #endif using namespace solidity; diff --git a/test/libyul/SSAControlFlowGraphTest.cpp b/test/libyul/SSAControlFlowGraphTest.cpp index c23a2ca5faf9..d2acee7bcb85 100644 --- a/test/libyul/SSAControlFlowGraphTest.cpp +++ b/test/libyul/SSAControlFlowGraphTest.cpp @@ -28,7 +28,15 @@ #include #ifdef ISOLTEST +#include +#if (BOOST_VERSION < 108800) #include +#else +#define BOOST_PROCESS_VERSION 1 +#include +#include +#include +#endif #endif using namespace solidity; diff --git a/test/libyul/StackLayoutGeneratorTest.cpp b/test/libyul/StackLayoutGeneratorTest.cpp index eb34eabb1776..0c85b1a7b968 100644 --- a/test/libyul/StackLayoutGeneratorTest.cpp +++ b/test/libyul/StackLayoutGeneratorTest.cpp @@ -33,7 +33,15 @@ #include #ifdef ISOLTEST +#include +#if (BOOST_VERSION < 108800) #include +#else +#define BOOST_PROCESS_VERSION 1 +#include +#include +#include +#endif #endif using namespace solidity; From 334b7685525367fe8bbe8781ec260fef0ee44f7b Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 12 Mar 2025 12:28:40 +0100 Subject: [PATCH 37/80] Remove Z3 from ppa scripts and add ubunutu plucky. --- scripts/deps-ppa/static_z3.sh | 267 ---------------------------------- scripts/release_ppa.sh | 11 +- 2 files changed, 4 insertions(+), 274 deletions(-) delete mode 100755 scripts/deps-ppa/static_z3.sh diff --git a/scripts/deps-ppa/static_z3.sh b/scripts/deps-ppa/static_z3.sh deleted file mode 100755 index 140c40c6abb3..000000000000 --- a/scripts/deps-ppa/static_z3.sh +++ /dev/null @@ -1,267 +0,0 @@ -#!/usr/bin/env bash -############################################################################## -## This is used to package .deb packages and upload them to the launchpad -## ppa servers for building. -## -## It will clone the Z3 git from github on the specified version tag, -## create a source archive and push it to the ubuntu ppa servers. -## -## This requires the following entries in /etc/dput.cf: -## -## [cpp-build-deps] -## fqdn = ppa.launchpad.net -## method = ftp -## incoming = ~ethereum/cpp-build-deps -## login = anonymous -## -## To interact with launchpad, you need to set the variables $LAUNCHPAD_EMAIL -## and $LAUNCHPAD_KEYID in the file .release_ppa_auth in the root directory of -## the project to your launchpad email and pgp keyid. -## This could for example look like this: -## -## LAUNCHPAD_EMAIL=your-launchpad-email@ethereum.org -## LAUNCHPAD_KEYID=123ABCFFFFFFFF -## -############################################################################## - -set -e - -packagename=z3-static -version="$1" - -REPO_ROOT="$(dirname "$0")/../.." - -# shellcheck source=/dev/null -source "${REPO_ROOT}/scripts/common.sh" - -[[ $version != "" ]] || fail "Usage: $0 " - -sourcePPAConfig - -# Sanity check -checkDputEntries "\[cpp-build-deps\]" - -DISTRIBUTIONS="jammy noble oracular" - -for distribution in $DISTRIBUTIONS -do -cd /tmp/ -rm -rf "$distribution" -mkdir "$distribution" -cd "$distribution" - -pparepo=cpp-build-deps -ppafilesurl=https://launchpad.net/~ethereum/+archive/ubuntu/${pparepo}/+files - -# Fetch source -git clone --branch "z3-${version}" https://github.com/Z3Prover/z3.git -cd z3 - -debversion="${version}" - -CMAKE_OPTIONS="-DZ3_BUILD_LIBZ3_SHARED=OFF -DCMAKE_BUILD_TYPE=Release" - -# gzip will create different tars all the time and we are not allowed -# to upload the same file twice with different contents, so we only -# create it once. -if [ ! -e "/tmp/${packagename}_${debversion}.orig.tar.gz" ] -then - tar --exclude .git -czf "/tmp/${packagename}_${debversion}.orig.tar.gz" . -fi -cp "/tmp/${packagename}_${debversion}.orig.tar.gz" ../ - -# Create debian package information - -mkdir debian -echo 9 > debian/compat -# TODO: the Z3 packages have different build dependencies -cat < debian/control -Source: z3-static -Section: science -Priority: extra -Maintainer: Daniel Kirchner -Build-Depends: debhelper (>= 9.0.0), - cmake, - g++ (>= 5.0), - git, - libgmp-dev, - dh-python, - python3 -Standards-Version: 3.9.6 -Homepage: https://github.com/Z3Prover/z3 -Vcs-Git: https://github.com/Z3Prover/z3.git -Vcs-Browser: https://github.com/Z3Prover/z3 - -Package: z3-static -Architecture: any -Breaks: z3 -Replaces: z3 -Depends: \${misc:Depends}, \${shlibs:Depends} -Description: theorem prover from Microsoft Research - Z3 is a state-of-the art theorem prover from Microsoft Research. It can be - used to check the satisfiability of logical formulas over one or more - theories. Z3 offers a compelling match for software analysis and verification - tools, since several common software constructs map directly into supported - theories. - . - The Z3 input format is an extension of the one defined by the SMT-LIB 2.0 - standard. - - -Package: libz3-static-dev -Section: libdevel -Architecture: any-amd64 -Breaks: libz3-dev -Replaces: libz3-dev -Multi-Arch: same -Depends: \${shlibs:Depends}, \${misc:Depends} -Description: theorem prover from Microsoft Research - development files (static library) - Z3 is a state-of-the art theorem prover from Microsoft Research. It can be - used to check the satisfiability of logical formulas over one or more - theories. Z3 offers a compelling match for software analysis and verification - tools, since several common software constructs map directly into supported - theories. - . - This package can be used to invoke Z3 via its C++ API. -EOF -cat < debian/rules -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. -# -# Modified to make a template file for a multi-binary package with separated -# build-arch and build-indep targets by Bill Allombert 2001 - -# Uncomment this to turn on verbose mode. -export DH_VERBOSE=1 - -# This has to be exported to make some magic below work. -export DH_OPTIONS - - -%: - dh \$@ --buildsystem=cmake - -override_dh_auto_test: - -override_dh_shlibdeps: - dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info - -override_dh_auto_configure: - dh_auto_configure -- ${CMAKE_OPTIONS} - -override_dh_auto_install: - dh_auto_install --destdir debian/tmp -EOF -cat < debian/libz3-static-dev.install -usr/include/* -usr/lib/*/libz3.a -usr/lib/*/cmake/z3/* -EOF -cat < debian/z3-static.install -usr/bin/z3 -EOF -cat < debian/copyright -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: z3 -Source: https://github.com/Z3Prover/z3 - -Files: * -Copyright: Microsoft Corporation -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a copy of - this software and associated documentation files (the "Software"), to deal in - the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -Files: debian/* -Copyright: 2019 Ethereum -License: GPL-3.0+ -This program 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. - . - This package 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 this program. If not, see . - . - On Debian systems, the complete text of the GNU General - Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". -EOF -cat < debian/changelog -z3-static (0.0.1-1ubuntu0) saucy; urgency=low - - * Initial release. - - -- Daniel Mon, 03 Jun 2019 14:50:20 +0000 -EOF -mkdir debian/source -echo "3.0 (quilt)" > debian/source/format -chmod +x debian/rules - -versionsuffix=1ubuntu0~${distribution} -EMAIL="$LAUNCHPAD_EMAIL" dch -v "1:${debversion}-${versionsuffix}" "build of ${version}" - -# build source package -# If packages is rejected because original source is already present, add -# -sd to remove it from the .changes file -# -d disables the build dependencies check -debuild -S -d -sa -us -uc - -# prepare .changes file for Launchpad -sed -i -e "s/UNRELEASED/${distribution}/" -e s/urgency=medium/urgency=low/ ../*.changes - -# check if ubuntu already has the source tarball -( -cd .. -orig="${packagename}_${debversion}.orig.tar.gz" -# shellcheck disable=SC2012 -orig_size=$(ls -l "$orig" | cut -d ' ' -f 5) -orig_sha1=$(sha1sum "$orig" | cut -d ' ' -f 1) -orig_sha256=$(sha256sum "$orig" | cut -d ' ' -f 1) -orig_md5=$(md5sum "$orig" | cut -d ' ' -f 1) - -if wget --quiet -O "$orig-tmp" "$ppafilesurl/$orig" -then - echo "[WARN] Original tarball found in Ubuntu archive, using it instead" - mv "${orig}-tmp" "$orig" - # shellcheck disable=SC2012 - new_size=$(ls -l ./*.orig.tar.gz | cut -d ' ' -f 5) - new_sha1=$(sha1sum "$orig" | cut -d ' ' -f 1) - new_sha256=$(sha256sum "$orig" | cut -d ' ' -f 1) - new_md5=$(md5sum "$orig" | cut -d ' ' -f 1) - sed -i -e "s,$orig_sha1,$new_sha1,g" -e "s,$orig_sha256,$new_sha256,g" -e "s,$orig_size,$new_size,g" -e "s,$orig_md5,$new_md5,g" ./*.dsc - sed -i -e "s,$orig_sha1,$new_sha1,g" -e "s,$orig_sha256,$new_sha256,g" -e "s,$orig_size,$new_size,g" -e "s,$orig_md5,$new_md5,g" ./*.changes -fi -) - -# sign the package -debsign --re-sign -k "${LAUNCHPAD_KEYID}" "../${packagename}_${debversion}-${versionsuffix}_source.changes" - -# upload -dput "${pparepo}" "../${packagename}_${debversion}-${versionsuffix}_source.changes" - -done diff --git a/scripts/release_ppa.sh b/scripts/release_ppa.sh index cf8df3d6c47d..2d0cbd180f56 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=noble -DISTRIBUTIONS="jammy noble oracular" +DISTRIBUTIONS="jammy noble oracular plucky" if is_release then @@ -103,17 +103,14 @@ else fi if [ "$distribution" = focal ] then - SMTDEPENDENCY="libz3-static-dev, - libcvc4-dev, + SMTDEPENDENCY="libcvc4-dev, " elif [ "$distribution" = disco ] then - SMTDEPENDENCY="libz3-static-dev, - libcvc4-dev, + SMTDEPENDENCY="libcvc4-dev, " else - SMTDEPENDENCY="libz3-static-dev, - " + SMTDEPENDENCY="" fi CMAKE_OPTIONS="" fi From 38810a3dc2d91aa51b2788a2df9170da421d34c2 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Tue, 8 Apr 2025 15:15:38 +0200 Subject: [PATCH 38/80] Adjust release checklist. --- ReleaseChecklist.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ReleaseChecklist.md b/ReleaseChecklist.md index f5e4ec7cae21..c9fcaba79fb7 100644 --- a/ReleaseChecklist.md +++ b/ReleaseChecklist.md @@ -85,10 +85,7 @@ At least a day before the release: ### PPA - [ ] Create `.release_ppa_auth` at the root of your local Solidity checkout and set `LAUNCHPAD_EMAIL` and `LAUNCHPAD_KEYID` to your key's email and key id. -- [ ] Double-check that the `DISTRIBUTIONS` list in `scripts/release_ppa.sh` and `scripts/deps-ppa/static_z3.sh` contains the most recent versions of Ubuntu. -- [ ] Make sure the [`~ethereum/cpp-build-deps` PPA repository](https://launchpad.net/~ethereum/+archive/ubuntu/cpp-build-deps) contains `libz3-static-dev` builds for all current versions of Ubuntu. - Note that it may be included in the `z3-static` multipackage (follow the `View package details` link to check). - If not present, run `scripts/deps-ppa/static_z3.sh` and wait for the builds to succeed before continuing. +- [ ] Double-check that the `DISTRIBUTIONS` list in `scripts/release_ppa.sh` contains the most recent versions of Ubuntu. - [ ] Run `scripts/release_ppa.sh v$VERSION` to create the PPA release. This will create a single package containing static binary for older Ubuntu versions in the [`~ethereum/ethereum-static` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum-static) and separate packages with dynamically-linked binaries for recent versions (those listed in `DISTRIBUTIONS`) in the [`~ethereum/ethereum` PPA](https://launchpad.net/~ethereum/+archive/ubuntu/ethereum). From fd2d543c6b7f6f134c6146dc8013814fd3e44c13 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Tue, 8 Apr 2025 15:21:33 +0200 Subject: [PATCH 39/80] Also drop libcvc4-dev and smtdependencies generally. --- scripts/release_ppa.sh | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/scripts/release_ppa.sh b/scripts/release_ppa.sh index 2d0cbd180f56..a8d89040f2dc 100755 --- a/scripts/release_ppa.sh +++ b/scripts/release_ppa.sh @@ -92,7 +92,6 @@ cd "$distribution" if [ "$distribution" = STATIC ] then pparepo=ethereum-static - SMTDEPENDENCY="" CMAKE_OPTIONS="-DSOLC_LINK_STATIC=On -DCMAKE_EXE_LINKER_FLAGS=-static" else if is_release @@ -101,17 +100,6 @@ else else pparepo=ethereum-dev fi - if [ "$distribution" = focal ] - then - SMTDEPENDENCY="libcvc4-dev, - " - elif [ "$distribution" = disco ] - then - SMTDEPENDENCY="libcvc4-dev, - " - else - SMTDEPENDENCY="" - fi CMAKE_OPTIONS="" fi ppafilesurl=https://launchpad.net/~ethereum/+archive/ubuntu/${pparepo}/+files @@ -153,7 +141,7 @@ Source: solc Section: science Priority: extra Maintainer: Christian (Buildserver key) -Build-Depends: ${SMTDEPENDENCY}debhelper (>= 9.0.0), +Build-Depends: debhelper (>= 9.0.0), cmake, g++ (>= 5.0), git, From e13c612202823d158e845df4435e405fd1576dea Mon Sep 17 00:00:00 2001 From: Henry Chu Date: Fri, 4 Apr 2025 16:28:43 +0800 Subject: [PATCH 40/80] Language Server: Fix hover crashes on invalid parameters When `textDocument/hover` gets an out-of-range request --- libsolidity/lsp/DocumentHoverHandler.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libsolidity/lsp/DocumentHoverHandler.cpp b/libsolidity/lsp/DocumentHoverHandler.cpp index e5991b765a66..a4f3de25c014 100644 --- a/libsolidity/lsp/DocumentHoverHandler.cpp +++ b/libsolidity/lsp/DocumentHoverHandler.cpp @@ -59,6 +59,11 @@ void DocumentHoverHandler::operator()(MessageID _id, Json const& _args) { auto const [sourceUnitName, lineColumn] = HandlerBase(*this).extractSourceUnitNameAndLineColumn(_args); auto const [sourceNode, sourceOffset] = m_server.astNodeAndOffsetAtSourceLocation(sourceUnitName, lineColumn); + if (!sourceNode) + { + client().reply(_id, Json()); + return; + } MarkdownBuilder markdown; auto rangeToHighlight = toRange(sourceNode->location()); From 1cd7045cd2cf77a813b8b3baecfcfc5eb5b6af25 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 14 Apr 2025 08:52:53 +0200 Subject: [PATCH 41/80] Remove disable pedantic mode switch for osx cmake 4.0.0 and clang 15.0.0 --- CMakeLists.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29bf2b0ca663..5b39878f26d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,14 +70,6 @@ endif() find_package(Threads) -if ("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin" AND "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - if (CMAKE_VERSION VERSION_EQUAL "4.0.0" AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "15.0.0.15000040") - # for Apple clang 15 under cmake 4.0.0, disable pedantic warnings explicitly as it fails to treat boost properly as - # system library, warnings propagate - set(PEDANTIC OFF) - endif() -endif() - if(NOT PEDANTIC) message(WARNING "-- Pedantic build flags turned off. Warnings will not make compilation fail. This is NOT recommended in development builds.") endif() From 09715e6d13f3922b96d671cddf463aea6523ad3e Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:18:54 +0200 Subject: [PATCH 42/80] osx ci: Install Boost to /opt/boost instead of /usr/local --- .circleci/config.yml | 10 ++++++++-- .circleci/osx_install_dependencies.sh | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d26ef3bd41a6..09b1281c5630 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -385,7 +385,7 @@ commands: 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." + echo "Dependency flag exists. Removing /usr/local/, /opt/homebrew/, and /opt/boost. 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. @@ -405,6 +405,10 @@ commands: sudo mkdir -p /usr/local/bin sudo chmod 777 /usr/{local,local/bin} + sudo rm -rf /opt/boost + sudo mkdir -p /opt/boost + sudo chmod 777 /opt/boost + mv /tmp/circleci "${circleci_binary_path}" mv /tmp/circleci-agent "${circleci_agent_binary_path}" fi @@ -425,6 +429,7 @@ commands: # Homebrew is installed in /usr/local on intel macs, but in /opt/homebrew on apple silicon. - /usr/local - /opt/homebrew + - /opt/boost - save_cache: key: osx-dependencies-cached-{{ arch }}-{{ checksum ".circleci/osx_install_dependencies.sh" }} paths: @@ -1159,7 +1164,8 @@ jobs: environment: <<: *base_osx_env CMAKE_BUILD_TYPE: Release - CMAKE_OPTIONS: -DCMAKE_OSX_ARCHITECTURES:STRING=x86_64;arm64 + # boost root configured to the prefix used in `osx_install_dependencies.sh` + CMAKE_OPTIONS: -DCMAKE_OSX_ARCHITECTURES:STRING=x86_64;arm64 -DBoost_ROOT=/opt/boost steps: - checkout - install_dependencies_osx diff --git a/.circleci/osx_install_dependencies.sh b/.circleci/osx_install_dependencies.sh index 6e0c859f9ace..367e8cbb40cb 100755 --- a/.circleci/osx_install_dependencies.sh +++ b/.circleci/osx_install_dependencies.sh @@ -69,7 +69,8 @@ then 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 + # install boost to /opt/boost, to use it in CMake, specify Boost_ROOT + sudo ./b2 -a address-model=64 architecture=arm+x86 --prefix=/opt/boost install cd .. sudo rm -rf "$boost_dir" From f1c3a2d6eb2e071d5b09a0a472fd5871e342f83f Mon Sep 17 00:00:00 2001 From: closeobserve Date: Sun, 13 Apr 2025 19:13:59 +0800 Subject: [PATCH 43/80] chore: remove redundant word in comment Signed-off-by: closeobserve --- libsolidity/codegen/YulUtilFunctions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/codegen/YulUtilFunctions.h b/libsolidity/codegen/YulUtilFunctions.h index 5ea99d603083..c28ba855c816 100644 --- a/libsolidity/codegen/YulUtilFunctions.h +++ b/libsolidity/codegen/YulUtilFunctions.h @@ -560,7 +560,7 @@ class YulUtilFunctions /// Signature: (address) -> mpos std::string externalCodeFunction(); - /// @return the name of a function that that checks if two external functions pointers are equal or not + /// @return the name of a function that checks if two external functions pointers are equal or not std::string externalFunctionPointersEqualFunction(); private: From 1706158dbb4e2525695c8cef023b87b37052af4c Mon Sep 17 00:00:00 2001 From: futreall <86553580+futreall@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:41:27 +0200 Subject: [PATCH 44/80] Update premium.sol --- test/compilationTests/corion/premium.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/compilationTests/corion/premium.sol b/test/compilationTests/corion/premium.sol index 646ab00e1594..2702aa5bb815 100644 --- a/test/compilationTests/corion/premium.sol +++ b/test/compilationTests/corion/premium.sol @@ -229,7 +229,7 @@ contract premium is module, safeMath { function transfer(address to, uint256 amount, bytes calldata extraData) isReady external returns (bool success) { /* Launch a transaction where we transfer from a given address to another one. - After thetransaction the approvedCorionPremiumToken function of the receiver’s address is going to be called with the given data. + After the transaction the approvedCorionPremiumToken function of the receiver’s address is going to be called with the given data. @to For who? @amount Amount From a1be4f313dd4120b5cb5994fe93f03c76e1de9ba Mon Sep 17 00:00:00 2001 From: futreall <86553580+futreall@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:41:58 +0200 Subject: [PATCH 45/80] Update publisher.sol --- test/compilationTests/corion/publisher.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/compilationTests/corion/publisher.sol b/test/compilationTests/corion/publisher.sol index 311e8d92e725..27d90a27e89b 100644 --- a/test/compilationTests/corion/publisher.sol +++ b/test/compilationTests/corion/publisher.sol @@ -205,8 +205,8 @@ contract publisher is announcementTypes, module, safeMath { If announcement is opposable, anyone owning a token can oppose it Opposition is automatically with the total amount of tokens If the quantity of his tokens changes, the purport of his opposition changes automatically - The prime time is the windup of the announcement, because this is the moment when the number of tokens in opposition are counted. - One address is entitled to be in oppositon only once. An opposition cannot be withdrawn. + The prime time is the windup of the announcement, because this is the moment when the number of tokens in opposition are counted. + One address is entitled to be in opposition only once. An opposition cannot be withdrawn. Running announcements can be opposed only. @id Announcement identification From 513535a75849bf18c44e24f31e56aad4d1b4b94f Mon Sep 17 00:00:00 2001 From: matta Date: Fri, 8 Mar 2024 17:17:06 -0300 Subject: [PATCH 46/80] Adding clarity on extcalls with precompiled contracts. --- docs/control-structures.rst | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/docs/control-structures.rst b/docs/control-structures.rst index 1d21a6e2668e..8a815e10ef0f 100644 --- a/docs/control-structures.rst +++ b/docs/control-structures.rst @@ -111,22 +111,35 @@ otherwise, the ``value`` option would not be available. the ``value`` and ``gas`` settings are lost, only ``feed.info{value: 10, gas: 800}()`` performs the function call. -Due to the fact that the EVM considers a call to a non-existing contract to -always succeed, Solidity uses the ``extcodesize`` opcode to check that -the contract that is about to be called actually exists (it contains code) -and causes an exception if it does not. This check is skipped if the return -data will be decoded after the call and thus the ABI decoder will catch the -case of a non-existing contract. +.. warning:: + Due to the fact that the EVM considers a call to a non-existing contract to + always succeed, Solidity uses the ``extcodesize`` opcode to check that + the contract that is about to be called actually exists (it contains code) + and causes an exception if it does not. This check is skipped if the return + data will be decoded after the call and thus the ABI decoder will catch the + case of a non-existing contract. -Note that this check is not performed in case of :ref:`low-level calls ` which -operate on addresses rather than contract instances. + This check is not performed in case of :ref:`low-level calls ` which + operate on addresses rather than contract instances. -.. note:: +.. warning:: Be careful when using high-level calls to :ref:`precompiled contracts `, since the compiler considers them non-existing according to the above logic even though they execute code and can return data. +.. note:: + Since the version 0.8.10, the compiler does not check ``extcodesize`` on + high-level external calls if return data is expected, because an empty code + will be unable to return data, and the ABI decoder will revert. + As a consequence, this allows high-level external calls to precompiled + contracts, since they can return data despite having no code + associated with their addresses. + + Read about :ref:`precompiled contracts ` and + :ref:`low-level calls ` + for more information. + Function calls also cause exceptions if the called contract itself throws an exception or goes out of gas. @@ -901,4 +914,4 @@ in scope in the block that follows. out-of-gas situation and not a deliberate error condition: The caller always retains at least 1/64th of the gas in a call and thus even if the called contract goes out of gas, the caller still - has some gas left. + has some gas left. \ No newline at end of file From 8b85d14f7d1e3cbb476434dec2af60c456af7fe4 Mon Sep 17 00:00:00 2001 From: Bilog WEB3 <155262265+Bilogweb3@users.noreply.github.com> Date: Wed, 26 Feb 2025 09:50:31 +0100 Subject: [PATCH 47/80] Update custom.css --- docs/_static/css/custom.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index d2c9c86e7b2e..bdfb5ce0bce5 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -93,7 +93,7 @@ h1 { } section:first-of-type h1:first-of-type { - font-family: 'Overpass mono', monospace; + font-family: 'Overpass Mono', monospace; font-size: 48px; margin-top: 3rem; margin-bottom: 5rem; From eda68d51fdefd92186bb4390d8b2eaaae2bf7c93 Mon Sep 17 00:00:00 2001 From: PixelPilot <161360836+PixelPil0t1@users.noreply.github.com> Date: Tue, 11 Mar 2025 15:15:18 +0100 Subject: [PATCH 48/80] Update events.rst --- docs/contracts/events.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contracts/events.rst b/docs/contracts/events.rst index 8c73c31603ae..c83970099a65 100644 --- a/docs/contracts/events.rst +++ b/docs/contracts/events.rst @@ -15,7 +15,7 @@ arguments to be stored in the transaction's log - a special data structure in the blockchain. These logs are associated with the address of the contract that emitted them, are incorporated into the blockchain, and stay there as long as a block is accessible (forever as of now, but this might -change in the future). The Log and its event data is not accessible from within +change in the future). The Log and its event data are not accessible from within contracts (not even from the contract that created them). It is possible to request a Merkle proof for logs, so if From feed69b5cac1e9519b881878b6595a2ee893835f Mon Sep 17 00:00:00 2001 From: argentpapa Date: Fri, 28 Feb 2025 01:17:33 +0800 Subject: [PATCH 49/80] Update calling_nonexisting_contract.sol --- .../functionCall/eof/calling_nonexisting_contract.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/libsolidity/semanticTests/functionCall/eof/calling_nonexisting_contract.sol b/test/libsolidity/semanticTests/functionCall/eof/calling_nonexisting_contract.sol index 10b39634d5de..a1a53e09d89a 100644 --- a/test/libsolidity/semanticTests/functionCall/eof/calling_nonexisting_contract.sol +++ b/test/libsolidity/semanticTests/functionCall/eof/calling_nonexisting_contract.sol @@ -8,7 +8,7 @@ contract C { function f() public returns (uint256) { // This call throws on legacy bytecode because of calling nonexisting contract. Legacy checks that there is - // a non-empty code under under an address. EOF doesn't do it because non-observability assumption + // a non-empty code under an address. EOF doesn't do it because non-observability assumption d.g(); return 7; } From ba3fd65cfbc2450d538229febf87ea3863230a67 Mon Sep 17 00:00:00 2001 From: Voronor <129545215+voronor@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:23:39 +0100 Subject: [PATCH 50/80] docs: Fix grammar in workflow trigger condition --- scripts/docker/buildpack-deps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/docker/buildpack-deps/README.md b/scripts/docker/buildpack-deps/README.md index 9cfcafd4bf27..6149165c8941 100644 --- a/scripts/docker/buildpack-deps/README.md +++ b/scripts/docker/buildpack-deps/README.md @@ -6,7 +6,7 @@ The `buildpack-deps` docker images are used to compile and test solidity within The creation of the images is triggered by a single workflow, defined in `.github/workflows/buildpack-deps.yml`. For each resulting `buildpack-deps` docker image a strategy is defined in the workflow file - the image variant. -The workflow gets triggered, if any Dockerfile defined in `scripts/docker/buildpack-deps/Dockerfile.*` were changed +The workflow gets triggered, if any Dockerfile defined in `scripts/docker/buildpack-deps/Dockerfile.*` was changed within the PR. ### Versioning From ab77b34e67ae6327f80bdd5098889243b3a86d66 Mon Sep 17 00:00:00 2001 From: emmmm <155267286+eeemmmmmm@users.noreply.github.com> Date: Wed, 26 Feb 2025 09:43:24 +0100 Subject: [PATCH 51/80] Update ControlFlowGraphBuilder.h --- libyul/backends/evm/ControlFlowGraphBuilder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libyul/backends/evm/ControlFlowGraphBuilder.h b/libyul/backends/evm/ControlFlowGraphBuilder.h index 1d0227a56b71..4a2aae98c26f 100644 --- a/libyul/backends/evm/ControlFlowGraphBuilder.h +++ b/libyul/backends/evm/ControlFlowGraphBuilder.h @@ -33,7 +33,7 @@ class ControlFlowGraphBuilder ControlFlowGraphBuilder& operator=(ControlFlowGraphBuilder const&) = delete; static std::unique_ptr build(AsmAnalysisInfo const& _analysisInfo, Dialect const& _dialect, Block const& _block); - StackSlot operator()(Expression const& _literal); + StackSlot operator()(Expression const& _expression); StackSlot operator()(Literal const& _literal); StackSlot operator()(Identifier const& _identifier); StackSlot operator()(FunctionCall const&); From 10b21b89a6c2c8a00ea27706497607d28bb4cf19 Mon Sep 17 00:00:00 2001 From: "ferranmesas@gmx.es" Date: Fri, 28 Feb 2025 22:52:40 +0100 Subject: [PATCH 52/80] Replace temporary std::string with std::string_view in _yulname literal to avoid unnecessary allocations --- libyul/YulString.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libyul/YulString.h b/libyul/YulString.h index d6c13f0d3751..329825a4465b 100644 --- a/libyul/YulString.h +++ b/libyul/YulString.h @@ -165,7 +165,7 @@ class YulString inline YulString operator "" _yulname(char const* _string, std::size_t _size) { - return YulString(std::string(_string, _size)); + return YulString(std::string_view(_string, _size)); } } From 771d8052df8947f781d126fea349734344941a3c Mon Sep 17 00:00:00 2001 From: NeoByteX <160131789+NeoByteXx@users.noreply.github.com> Date: Sat, 22 Feb 2025 08:33:10 +0100 Subject: [PATCH 53/80] Fix typo in test script comments --- test/externalTests/brink.sh | 2 +- test/externalTests/elementfi.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/externalTests/brink.sh b/test/externalTests/brink.sh index 02e5fe971c65..e541481b43ae 100755 --- a/test/externalTests/brink.sh +++ b/test/externalTests/brink.sh @@ -61,7 +61,7 @@ function brink_test setup_solc "$DIR" "$BINARY_TYPE" "$BINARY_PATH" download_project "$repo" "$ref" "$DIR" - # TODO: Remove this when Brink merges https://github.com/brinktrade/brink-core/pull/52 + # TODO: Remove this once Brink merges PR #52 (https://github.com/brinktrade/brink-core/pull/52). sed -i "s|\(function isValidSignature(bytes \)calldata\( _data, bytes \)calldata\( _signature)\)|\1memory\2memory\3|g" src/Test/MockEIP1271Validator.sol neutralize_package_lock diff --git a/test/externalTests/elementfi.sh b/test/externalTests/elementfi.sh index f34a169e9512..aa73ea768740 100755 --- a/test/externalTests/elementfi.sh +++ b/test/externalTests/elementfi.sh @@ -93,8 +93,8 @@ function elementfi_test sed -i 's|it(\("should prevent withdrawal of Principal Tokens and Interest Tokens before the tranche expires "\)|it.skip(\1|g' test/trancheTest.ts sed -i 's|it(\("should prevent withdrawal of more Principal Tokens and Interest Tokens than the user has"\)|it.skip(\1|g' test/trancheTest.ts - # This test file is very flaky. There's one particular cases that fails randomly (see - # https://github.com/element-fi/elf-contracts/issues/240) but some others also depends on an external + # This test file is very flaky. There's one particular case that fails randomly (see + # https://github.com/element-fi/elf-contracts/issues/240) but some others also depend on an external # service which makes tests time out when that service is down. # "ProviderError: Too Many Requests error received from eth-mainnet.alchemyapi.io" rm test/mockERC20YearnVaultTest.ts From d22a07012e03cd3a942235aa166f00f0c000dcdb Mon Sep 17 00:00:00 2001 From: Skylar Ray <137945430+sky-coderay@users.noreply.github.com> Date: Fri, 14 Mar 2025 10:08:33 +0200 Subject: [PATCH 54/80] fix minor issues Update DataFlowAnalyzer.cpp Update CommonSubexpressionEliminator.cpp /*( -deleted ( --- libyul/CompilabilityChecker.cpp | 2 +- libyul/optimiser/CommonSubexpressionEliminator.cpp | 2 +- libyul/optimiser/DataFlowAnalyzer.cpp | 2 +- libyul/optimiser/Metrics.cpp | 2 +- libyul/optimiser/Rematerialiser.cpp | 2 +- libyul/optimiser/StackCompressor.cpp | 2 +- libyul/optimiser/SyntacticalEquality.cpp | 2 +- libyul/optimiser/UnusedPruner.cpp | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libyul/CompilabilityChecker.cpp b/libyul/CompilabilityChecker.cpp index cc46ecb77000..2df14f211939 100644 --- a/libyul/CompilabilityChecker.cpp +++ b/libyul/CompilabilityChecker.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/CommonSubexpressionEliminator.cpp b/libyul/optimiser/CommonSubexpressionEliminator.cpp index 87a14d259070..1a6f3911a1bb 100644 --- a/libyul/optimiser/CommonSubexpressionEliminator.cpp +++ b/libyul/optimiser/CommonSubexpressionEliminator.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/DataFlowAnalyzer.cpp b/libyul/optimiser/DataFlowAnalyzer.cpp index 2407781354d0..1aecd6bd4a91 100644 --- a/libyul/optimiser/DataFlowAnalyzer.cpp +++ b/libyul/optimiser/DataFlowAnalyzer.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/Metrics.cpp b/libyul/optimiser/Metrics.cpp index 04bfe9a7a06d..5c3a624269d5 100644 --- a/libyul/optimiser/Metrics.cpp +++ b/libyul/optimiser/Metrics.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/Rematerialiser.cpp b/libyul/optimiser/Rematerialiser.cpp index bfcd9d8f630f..1d3535fdae82 100644 --- a/libyul/optimiser/Rematerialiser.cpp +++ b/libyul/optimiser/Rematerialiser.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/StackCompressor.cpp b/libyul/optimiser/StackCompressor.cpp index 97d2c054700d..b0be60d63442 100644 --- a/libyul/optimiser/StackCompressor.cpp +++ b/libyul/optimiser/StackCompressor.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/SyntacticalEquality.cpp b/libyul/optimiser/SyntacticalEquality.cpp index e233b57e9e2d..a032e912be63 100644 --- a/libyul/optimiser/SyntacticalEquality.cpp +++ b/libyul/optimiser/SyntacticalEquality.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify diff --git a/libyul/optimiser/UnusedPruner.cpp b/libyul/optimiser/UnusedPruner.cpp index 5d50e4599bfd..2f982b164093 100644 --- a/libyul/optimiser/UnusedPruner.cpp +++ b/libyul/optimiser/UnusedPruner.cpp @@ -1,4 +1,4 @@ -/*( +/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify From 02d2c9af23c830667ccbce4e581357a163615dea Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:54:18 +0200 Subject: [PATCH 55/80] change into test dir for cmdline tests --- test/cmdlineTests.sh | 45 ++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index f68ed53dc066..b3327ea988c8 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -225,7 +225,7 @@ EOF if jq 'has("ethdebug")' "$stdout_path" --exit-status > /dev/null; then local temporary_file temporary_file=$(mktemp -t cmdline-ethdebug-XXXXXX.tmp) - if [[ -e ${tdir}/strip-ethdebug ]]; then + if [[ -e strip-ethdebug ]]; then jq --indent 4 ' (. | .. | objects | select(has("ethdebug"))) |= (.ethdebug = "") ' "$stdout_path" > "$temporary_file" @@ -350,9 +350,11 @@ test_solc_behaviour "${0}" "ctx:=/some/remapping/target" "" "" 1 "" "Error: Inva printTask "Running general commandline tests..." ( - cd "$REPO_ROOT"/test/cmdlineTests/ for tdir in "${selected_tests[@]}" do + # go back to the test root dir + cd "$REPO_ROOT"/test/cmdlineTests/ + if ! [[ -d $tdir ]] then fail "Test directory not found: $tdir" @@ -377,10 +379,13 @@ printTask "Running general commandline tests..." fi fi - scriptFiles="$(ls -1 "${tdir}/test."* 2> /dev/null || true)" + # jump into test dir + cd "${tdir}" + + scriptFiles="$(ls -1 "test."* 2> /dev/null || true)" scriptCount="$(echo "${scriptFiles}" | wc -w)" - inputFiles="$(ls -1 "${tdir}/input."* 2> /dev/null || true)" + inputFiles="$(ls -1 "input."* 2> /dev/null || true)" inputCount="$(echo "${inputFiles}" | wc -w)" (( 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}" @@ -388,7 +393,7 @@ printTask "Running general commandline tests..." if (( scriptCount == 1 )) then - if ! "$scriptFiles" + if ! "./$scriptFiles" then fail "Test script ${scriptFiles} failed." fi @@ -399,38 +404,38 @@ printTask "Running general commandline tests..." # Use printf to get rid of the trailing newline inputFile=$(printf "%s" "${inputFiles}") - if [ "${inputFile}" = "${tdir}/input.json" ] + if [ "${inputFile}" = "input.json" ] then - ! [ -e "${tdir}/stdin" ] || fail "Found a file called 'stdin' but redirecting standard input in JSON mode is not allowed." + ! [ -e "stdin" ] || fail "Found a file called 'stdin' but redirecting standard input in JSON mode is not allowed." stdin="${inputFile}" inputFile="" - stdout="$(cat "${tdir}/output.json" 2>/dev/null || true)" - stdoutExpectationFile="${tdir}/output.json" + stdout="$(cat "output.json" 2>/dev/null || true)" + stdoutExpectationFile="output.json" prettyPrintFlags="" - if [[ ! -f "${tdir}/no-pretty-print" ]] + if [[ ! -f "no-pretty-print" ]] then prettyPrintFlags="--pretty-json --json-indent 4" fi - command_args="--standard-json ${prettyPrintFlags} "$(cat "${tdir}/args" 2>/dev/null || true) + command_args="--standard-json ${prettyPrintFlags} "$(cat "args" 2>/dev/null || true) else - if [ -e "${tdir}/stdin" ] + if [ -e "stdin" ] then - stdin="${tdir}/stdin" - [ -f "${tdir}/stdin" ] || fail "'stdin' is not a regular file." + stdin="stdin" + [ -f "stdin" ] || fail "'stdin' is not a regular file." else stdin="" fi - stdout="$(cat "${tdir}/output" 2>/dev/null || true)" - stdoutExpectationFile="${tdir}/output" - command_args=$(cat "${tdir}/args" 2>/dev/null || true) + stdout="$(cat "output" 2>/dev/null || true)" + stdoutExpectationFile="output" + command_args=$(cat "args" 2>/dev/null || true) fi - exitCodeExpectationFile="${tdir}/exit" + exitCodeExpectationFile="exit" exitCode=$(cat "$exitCodeExpectationFile" 2>/dev/null || true) - err="$(cat "${tdir}/err" 2>/dev/null || true)" - stderrExpectationFile="${tdir}/err" + err="$(cat "err" 2>/dev/null || true)" + stderrExpectationFile="err" test_solc_behaviour "$inputFile" \ "$command_args" \ "$stdin" \ From 2fa170efc1517f1ddc82c24d015c95d82f4c1534 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:26:42 +0200 Subject: [PATCH 56/80] update test expectations with cwd being in test dir --- test/cmdlineTests/abi_via_ir/output | 4 +- .../abiencoderv2_no_warning/output | 2 +- test/cmdlineTests/asm_json/output | 4 +- .../asm_json_no_pretty_print/output | 4 +- .../ast_compact_json_no_pretty_json/output | 4 +- .../output | 4 +- .../ast_compact_json_with_base_path/output | 10 +- test/cmdlineTests/ast_ir/output | 276 +++++++++--------- test/cmdlineTests/combined_json_abi/output | 2 +- .../combined_json_generated_sources/output | 2 +- .../combined_json_no_pretty_print/output | 2 +- .../combined_json_stop_after_parsing/output | 8 +- .../combined_json_with_base_path/output | 16 +- .../combined_json_with_devdoc/output | 4 +- .../combined_json_with_userdoc/output | 4 +- .../constant_optimizer_yul/output | 4 +- .../output | 16 +- .../output | 16 +- .../output | 10 +- .../debug_info_in_yul_snippet_escaping/output | 24 +- test/cmdlineTests/dup_opt_peephole/output | 18 +- test/cmdlineTests/error_codes/err | 12 +- .../ethdebug_eof_container_osaka/output | 4 +- test/cmdlineTests/events_in_abi/output | 4 +- test/cmdlineTests/evm_version_byzantium/err | 2 +- .../evm_version_constantinople/err | 2 +- .../evmasm_difficulty_post_paris/err | 2 +- .../evmasm_difficulty_post_paris/output | 2 +- .../evmasm_difficulty_pre_paris/output | 2 +- .../evmasm_prevrandao_post_paris/output | 2 +- .../evmasm_prevrandao_pre_paris/err | 2 +- .../evmasm_prevrandao_pre_paris/output | 2 +- .../err | 2 +- .../output | 2 +- .../err | 2 +- .../output | 2 +- .../output | 2 +- .../output | 2 +- test/cmdlineTests/exp_base_literal/output | 4 +- test/cmdlineTests/function_debug_info/output | 2 +- .../function_debug_info_via_yul/output | 2 +- test/cmdlineTests/hashes/output | 4 +- .../inline_assembly_function_name_clash/err | 4 +- .../output | 2 +- .../output | 8 +- test/cmdlineTests/ir_compiler_subobjects/err | 2 +- .../ir_compiler_subobjects/output | 12 +- .../output | 4 +- .../ir_optimized_with_optimize/output | 4 +- test/cmdlineTests/ir_subobject_order/output | 20 +- .../ir_unoptimized_with_optimize/output | 4 +- .../output | 4 +- .../output | 4 +- .../output | 4 +- .../keccak_optimization_deploy_code/output | 4 +- .../keccak_optimization_low_runs/output | 4 +- .../linking_qualified_library_name/args | 2 +- .../contract1.sol | 2 +- .../linking_qualified_library_name/output | 4 +- test/cmdlineTests/linking_solidity/args | 2 +- test/cmdlineTests/linking_solidity/output | 4 +- .../args | 2 +- .../output | 18 +- .../linking_strict_assembly/output | 10 +- .../output | 2 +- .../output | 2 +- .../output | 18 +- .../output | 18 +- .../output | 2 +- .../output | 2 +- .../output | 18 +- .../linking_unqualified_library_name/args | 2 +- .../contract1.sol | 2 +- .../contract2.sol | 2 +- .../linking_unqualified_library_name/output | 16 +- .../mcopy_bytes_array_abi_decode/err | 2 +- .../mcopy_bytes_array_abi_decode/output | 4 +- .../output | 4 +- .../output | 4 +- .../output | 4 +- test/cmdlineTests/message_format/err | 18 +- test/cmdlineTests/message_format_utf8/err | 10 +- test/cmdlineTests/metadata/output | 4 +- .../model_checker_bmc_loop_iterations/err | 2 +- .../err | 2 +- .../model_checker_contracts_all/err | 4 +- .../model_checker_contracts_all_explicit/args | 2 +- .../model_checker_contracts_all_explicit/err | 4 +- .../args | 2 +- .../err | 2 +- .../args | 2 +- .../err | 2 +- .../args | 2 +- .../err | 2 +- .../model_checker_contracts_only_one/args | 2 +- .../model_checker_contracts_only_one/err | 4 +- .../cmdlineTests/model_checker_engine_all/err | 2 +- .../cmdlineTests/model_checker_engine_bmc/err | 2 +- .../cmdlineTests/model_checker_engine_chc/err | 2 +- .../model_checker_ext_calls_trusted_chc/err | 2 +- .../model_checker_ext_calls_untrusted_chc/err | 2 +- .../model_checker_invariants_all/err | 4 +- .../model_checker_invariants_contract/err | 2 +- .../model_checker_invariants_contract_eld/err | 2 +- .../err | 4 +- .../model_checker_invariants_reentrancy/err | 2 +- .../err | 2 +- .../err | 2 +- .../err | 2 +- .../err | 6 +- .../err | 6 +- .../err | 6 +- .../err | 2 +- .../model_checker_show_unproved_true_chc/err | 2 +- .../err | 2 +- .../err | 2 +- .../err | 2 +- .../model_checker_solvers_cvc5/err | 2 +- .../model_checker_solvers_cvc5_eld/err | 2 +- .../model_checker_solvers_eld/err | 2 +- .../cmdlineTests/model_checker_solvers_z3/err | 2 +- .../model_checker_solvers_z3_implicit/err | 2 +- .../model_checker_solvers_z3_smtlib2/err | 2 +- .../model_checker_targets_all_all_engines/err | 14 +- .../model_checker_targets_all_bmc/err | 12 +- .../model_checker_targets_all_chc/err | 12 +- .../model_checker_targets_assert_bmc/err | 2 +- .../model_checker_targets_assert_chc/err | 2 +- .../model_checker_targets_balance_bmc/err | 2 +- .../err | 2 +- .../err | 10 +- .../model_checker_targets_default_bmc/err | 8 +- .../model_checker_targets_default_chc/err | 8 +- .../model_checker_targets_div_by_zero_bmc/err | 2 +- .../model_checker_targets_div_by_zero_chc/err | 2 +- .../err | 2 +- .../model_checker_targets_overflow_bmc/err | 2 +- .../model_checker_targets_overflow_chc/err | 2 +- .../model_checker_targets_pop_empty_chc/err | 2 +- .../model_checker_targets_underflow_bmc/err | 2 +- .../model_checker_targets_underflow_chc/err | 2 +- .../err | 6 +- .../err | 6 +- .../err | 4 +- .../err | 4 +- test/cmdlineTests/name_simplifier/output | 4 +- test/cmdlineTests/no_cbor_metadata/output | 2 +- .../no_contract_combined_json/output | 6 +- test/cmdlineTests/no_import_callback/args | 2 +- test/cmdlineTests/no_import_callback/err | 2 +- test/cmdlineTests/object_compiler/output | 34 +-- .../optimize_full_storage_write/output | 16 +- .../optimizer_BlockDeDuplicator/err | 4 +- .../optimizer_BlockDeDuplicator/output | 20 +- .../cmdlineTests/optimizer_array_sload/output | 4 +- .../cmdlineTests/optimizer_inliner_add/output | 30 +- .../output | 24 +- .../output | 58 ++-- .../output | 66 ++--- .../cmdlineTests/optimizer_inliner_inc/output | 28 +- .../optimizer_inliner_multireturn/output | 30 +- test/cmdlineTests/optimizer_user_yul/output | 56 ++-- test/cmdlineTests/require_overload/err | 2 +- .../cmdlineTests/require_with_error_ir/output | 4 +- .../require_with_string_ir/output | 4 +- test/cmdlineTests/revert_strings/output | 4 +- .../stack_too_deep_from_code_transform/err | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../standard_ir_ast_requested/input.json | 2 +- .../cmdlineTests/standard_metadata/input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../standard_optimizer_no_yul/input.json | 2 +- .../standard_optimizer_yul/input.json | 2 +- .../standard_optimizer_yulDetails/input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 6 +- .../output.json | 4 +- .../standard_urls_missing/input.json | 6 +- .../standard_urls_missing/output.json | 12 +- .../standard_yul_cfg_json_export/input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../standard_yul_ethdebug_ir/input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../stop_after_parsing_ast/output | 4 +- .../input.json | 2 +- .../storage_layout_user_defined/err | 2 +- .../storage_layout_user_defined/output | 18 +- .../output | 2 +- .../strict_asm_ast_compact_json/output | 2 +- .../strict_asm_debug_info_print_all/output | 2 +- .../output | 2 +- .../strict_asm_debug_info_print_none/output | 2 +- .../strict_asm_eof_container_osaka/output | 2 +- .../strict_asm_eof_dataloadn_osaka/output | 2 +- .../strict_asm_evm_version_byzantium/output | 4 +- .../output | 4 +- test/cmdlineTests/strict_asm_jump/err | 2 +- .../strict_asm_msize_with_optimizer/output | 2 +- .../strict_asm_msize_without_optimizer/output | 2 +- test/cmdlineTests/strict_asm_only_cr/err | 2 +- .../strict_asm_optimizer_steps/output | 50 ++-- .../output | 10 +- .../output | 2 +- .../output | 2 +- test/cmdlineTests/strict_asm_warning/err | 2 +- test/cmdlineTests/strict_asm_warning/output | 2 +- .../strict_asm_warning_and_error_optimize/err | 4 +- .../strict_asm_warning_optimize/err | 2 +- .../strict_asm_warning_optimize/output | 2 +- .../err | 2 +- .../output | 2 +- .../strict_asm_yul_cfg_json_export/output | 2 +- .../err | 4 +- test/cmdlineTests/too_long_line/err | 2 +- .../too_long_line_both_sides_short/err | 2 +- test/cmdlineTests/too_long_line_edge_in/err | 2 +- test/cmdlineTests/too_long_line_edge_out/err | 2 +- .../cmdlineTests/too_long_line_left_short/err | 2 +- test/cmdlineTests/too_long_line_multiline/err | 2 +- .../too_long_line_right_short/err | 2 +- .../transient_storage_layout/output | 12 +- .../input.json | 2 +- .../input.json | 2 +- .../input.json | 2 +- .../output | 4 +- test/cmdlineTests/viair_abicoder_v1/err | 2 +- test/cmdlineTests/viair_abicoder_v1/output | 4 +- .../viair_msize_without_optimizer/output | 6 +- .../viair_subobject_optimization/output | 56 ++-- test/cmdlineTests/viair_subobjects/err | 2 +- test/cmdlineTests/viair_subobjects/output | 16 +- test/cmdlineTests/yul_cfg_json_export/output | 6 +- .../yul_function_name_clashes/output | 2 +- .../output | 28 +- test/cmdlineTests/yul_optimize_runs/output | 22 +- .../output | 4 +- test/cmdlineTests/yul_optimizer_steps/output | 4 +- .../output | 4 +- .../yul_optimizer_steps_short_sequence/output | 4 +- .../output | 4 +- .../output | 4 +- .../err | 4 +- .../output | 8 +- test/cmdlineTests/yul_verbatim/output | 34 +-- test/cmdlineTests/yul_verbatim_msize/output | 18 +- 291 files changed, 959 insertions(+), 959 deletions(-) diff --git a/test/cmdlineTests/abi_via_ir/output b/test/cmdlineTests/abi_via_ir/output index 56ba01a4a248..3b3fec68d93b 100644 --- a/test/cmdlineTests/abi_via_ir/output +++ b/test/cmdlineTests/abi_via_ir/output @@ -1,5 +1,5 @@ -======= abi_via_ir/input.sol:C ======= +======= input.sol:C ======= Contract JSON ABI [ { @@ -101,7 +101,7 @@ Contract JSON ABI } ] -======= abi_via_ir/input.sol:L ======= +======= input.sol:L ======= Contract JSON ABI [ { diff --git a/test/cmdlineTests/abiencoderv2_no_warning/output b/test/cmdlineTests/abiencoderv2_no_warning/output index 33f8d2e1fa8f..5b99567cc0fb 100644 --- a/test/cmdlineTests/abiencoderv2_no_warning/output +++ b/test/cmdlineTests/abiencoderv2_no_warning/output @@ -1,4 +1,4 @@ -======= abiencoderv2_no_warning/input.sol:C ======= +======= input.sol:C ======= Function signatures: 3fc03eeb: f((uint256)) diff --git a/test/cmdlineTests/asm_json/output b/test/cmdlineTests/asm_json/output index 820eda6ec4a6..a148e42f0ca7 100644 --- a/test/cmdlineTests/asm_json/output +++ b/test/cmdlineTests/asm_json/output @@ -1,5 +1,5 @@ -======= asm_json/input.sol:C ======= +======= input.sol:C ======= EVM assembly: { ".code": [ @@ -1573,7 +1573,7 @@ EVM assembly: } }, "sourceList": [ - "asm_json/input.sol", + "input.sol", "#utility.yul" ] } diff --git a/test/cmdlineTests/asm_json_no_pretty_print/output b/test/cmdlineTests/asm_json_no_pretty_print/output index 8fce2f4827d9..b2382e1866b5 100644 --- a/test/cmdlineTests/asm_json_no_pretty_print/output +++ b/test/cmdlineTests/asm_json_no_pretty_print/output @@ -1,4 +1,4 @@ -======= asm_json_no_pretty_print/input.sol:C ======= +======= input.sol:C ======= EVM assembly: -{".code":[{"begin":60,"end":160,"name":"PUSH","source":0,"value":"80"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"40"},{"begin":60,"end":160,"name":"MSTORE","source":0},{"begin":60,"end":160,"name":"CALLVALUE","source":0},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"ISZERO","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"REVERT","source":0},{"begin":60,"end":160,"name":"tag","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPDEST","source":0},{"begin":60,"end":160,"name":"POP","source":0},{"begin":60,"end":160,"name":"PUSH #[$]","source":0,"value":"0000000000000000000000000000000000000000000000000000000000000000"},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"PUSH [$]","source":0,"value":"0000000000000000000000000000000000000000000000000000000000000000"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"CODECOPY","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"RETURN","source":0}],".data":{"0":{".auxdata":"",".code":[{"begin":60,"end":160,"name":"PUSH","source":0,"value":"80"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"40"},{"begin":60,"end":160,"name":"MSTORE","source":0},{"begin":60,"end":160,"name":"CALLVALUE","source":0},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"ISZERO","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"REVERT","source":0},{"begin":60,"end":160,"name":"tag","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPDEST","source":0},{"begin":60,"end":160,"name":"POP","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"4"},{"begin":60,"end":160,"name":"CALLDATASIZE","source":0},{"begin":60,"end":160,"name":"LT","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"2"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"CALLDATALOAD","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"E0"},{"begin":60,"end":160,"name":"SHR","source":0},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"B3DE648B"},{"begin":60,"end":160,"name":"EQ","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"3"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"tag","source":0,"value":"2"},{"begin":60,"end":160,"name":"JUMPDEST","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"REVERT","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"3"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"4"},{"begin":77,"end":158,"name":"PUSH","source":0,"value":"4"},{"begin":77,"end":158,"name":"DUP1","source":0},{"begin":77,"end":158,"name":"CALLDATASIZE","source":0},{"begin":77,"end":158,"name":"SUB","source":0},{"begin":77,"end":158,"name":"DUP2","source":0},{"begin":77,"end":158,"name":"ADD","source":0},{"begin":77,"end":158,"name":"SWAP1","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"5"},{"begin":77,"end":158,"name":"SWAP2","source":0},{"begin":77,"end":158,"name":"SWAP1","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"6"},{"begin":77,"end":158,"jumpType":"[in]","name":"JUMP","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"5"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"7"},{"begin":77,"end":158,"jumpType":"[in]","name":"JUMP","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"4"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"STOP","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"7"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":123,"end":125,"name":"PUSH","source":0,"value":"2A"},{"begin":118,"end":125,"name":"DUP2","source":0},{"begin":118,"end":125,"name":"PUSH [tag]","source":0,"value":"9"},{"begin":118,"end":125,"name":"SWAP2","source":0},{"begin":118,"end":125,"name":"SWAP1","source":0},{"begin":118,"end":125,"name":"PUSH [tag]","source":0,"value":"10"},{"begin":118,"end":125,"jumpType":"[in]","name":"JUMP","source":0},{"begin":118,"end":125,"name":"tag","source":0,"value":"9"},{"begin":118,"end":125,"name":"JUMPDEST","source":0},{"begin":118,"end":125,"name":"SWAP1","source":0},{"begin":118,"end":125,"name":"POP","source":0},{"begin":147,"end":150,"name":"PUSH","source":0,"value":"64"},{"begin":143,"end":144,"name":"DUP2","source":0},{"begin":143,"end":150,"name":"GT","source":0},{"begin":135,"end":151,"name":"PUSH [tag]","source":0,"value":"11"},{"begin":135,"end":151,"name":"JUMPI","source":0},{"begin":135,"end":151,"name":"PUSH","source":0,"value":"0"},{"begin":135,"end":151,"name":"PUSH","source":0,"value":"0"},{"begin":135,"end":151,"name":"REVERT","source":0},{"begin":135,"end":151,"name":"tag","source":0,"value":"11"},{"begin":135,"end":151,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"POP","source":0},{"begin":77,"end":158,"jumpType":"[out]","name":"JUMP","source":0},{"begin":88,"end":205,"name":"tag","source":1,"value":"13"},{"begin":88,"end":205,"name":"JUMPDEST","source":1},{"begin":197,"end":198,"name":"PUSH","source":1,"value":"0"},{"begin":194,"end":195,"name":"PUSH","source":1,"value":"0"},{"begin":187,"end":199,"name":"REVERT","source":1},{"begin":334,"end":411,"name":"tag","source":1,"value":"15"},{"begin":334,"end":411,"name":"JUMPDEST","source":1},{"begin":371,"end":378,"name":"PUSH","source":1,"value":"0"},{"begin":400,"end":405,"name":"DUP2","source":1},{"begin":389,"end":405,"name":"SWAP1","source":1},{"begin":389,"end":405,"name":"POP","source":1},{"begin":334,"end":411,"name":"SWAP2","source":1},{"begin":334,"end":411,"name":"SWAP1","source":1},{"begin":334,"end":411,"name":"POP","source":1},{"begin":334,"end":411,"jumpType":"[out]","name":"JUMP","source":1},{"begin":417,"end":539,"name":"tag","source":1,"value":"16"},{"begin":417,"end":539,"name":"JUMPDEST","source":1},{"begin":490,"end":514,"name":"PUSH [tag]","source":1,"value":"25"},{"begin":508,"end":513,"name":"DUP2","source":1},{"begin":490,"end":514,"name":"PUSH [tag]","source":1,"value":"15"},{"begin":490,"end":514,"jumpType":"[in]","name":"JUMP","source":1},{"begin":490,"end":514,"name":"tag","source":1,"value":"25"},{"begin":490,"end":514,"name":"JUMPDEST","source":1},{"begin":483,"end":488,"name":"DUP2","source":1},{"begin":480,"end":515,"name":"EQ","source":1},{"begin":470,"end":533,"name":"PUSH [tag]","source":1,"value":"26"},{"begin":470,"end":533,"name":"JUMPI","source":1},{"begin":529,"end":530,"name":"PUSH","source":1,"value":"0"},{"begin":526,"end":527,"name":"PUSH","source":1,"value":"0"},{"begin":519,"end":531,"name":"REVERT","source":1},{"begin":470,"end":533,"name":"tag","source":1,"value":"26"},{"begin":470,"end":533,"name":"JUMPDEST","source":1},{"begin":417,"end":539,"name":"POP","source":1},{"begin":417,"end":539,"jumpType":"[out]","name":"JUMP","source":1},{"begin":545,"end":684,"name":"tag","source":1,"value":"17"},{"begin":545,"end":684,"name":"JUMPDEST","source":1},{"begin":591,"end":596,"name":"PUSH","source":1,"value":"0"},{"begin":629,"end":635,"name":"DUP2","source":1},{"begin":616,"end":636,"name":"CALLDATALOAD","source":1},{"begin":607,"end":636,"name":"SWAP1","source":1},{"begin":607,"end":636,"name":"POP","source":1},{"begin":645,"end":678,"name":"PUSH [tag]","source":1,"value":"28"},{"begin":672,"end":677,"name":"DUP2","source":1},{"begin":645,"end":678,"name":"PUSH [tag]","source":1,"value":"16"},{"begin":645,"end":678,"jumpType":"[in]","name":"JUMP","source":1},{"begin":645,"end":678,"name":"tag","source":1,"value":"28"},{"begin":645,"end":678,"name":"JUMPDEST","source":1},{"begin":545,"end":684,"name":"SWAP3","source":1},{"begin":545,"end":684,"name":"SWAP2","source":1},{"begin":545,"end":684,"name":"POP","source":1},{"begin":545,"end":684,"name":"POP","source":1},{"begin":545,"end":684,"jumpType":"[out]","name":"JUMP","source":1},{"begin":690,"end":1019,"name":"tag","source":1,"value":"6"},{"begin":690,"end":1019,"name":"JUMPDEST","source":1},{"begin":749,"end":755,"name":"PUSH","source":1,"value":"0"},{"begin":798,"end":800,"name":"PUSH","source":1,"value":"20"},{"begin":786,"end":795,"name":"DUP3","source":1},{"begin":777,"end":784,"name":"DUP5","source":1},{"begin":773,"end":796,"name":"SUB","source":1},{"begin":769,"end":801,"name":"SLT","source":1},{"begin":766,"end":885,"name":"ISZERO","source":1},{"begin":766,"end":885,"name":"PUSH [tag]","source":1,"value":"30"},{"begin":766,"end":885,"name":"JUMPI","source":1},{"begin":804,"end":883,"name":"PUSH [tag]","source":1,"value":"31"},{"begin":804,"end":883,"name":"PUSH [tag]","source":1,"value":"13"},{"begin":804,"end":883,"jumpType":"[in]","name":"JUMP","source":1},{"begin":804,"end":883,"name":"tag","source":1,"value":"31"},{"begin":804,"end":883,"name":"JUMPDEST","source":1},{"begin":766,"end":885,"name":"tag","source":1,"value":"30"},{"begin":766,"end":885,"name":"JUMPDEST","source":1},{"begin":924,"end":925,"name":"PUSH","source":1,"value":"0"},{"begin":949,"end":1002,"name":"PUSH [tag]","source":1,"value":"32"},{"begin":994,"end":1001,"name":"DUP5","source":1},{"begin":985,"end":991,"name":"DUP3","source":1},{"begin":974,"end":983,"name":"DUP6","source":1},{"begin":970,"end":992,"name":"ADD","source":1},{"begin":949,"end":1002,"name":"PUSH [tag]","source":1,"value":"17"},{"begin":949,"end":1002,"jumpType":"[in]","name":"JUMP","source":1},{"begin":949,"end":1002,"name":"tag","source":1,"value":"32"},{"begin":949,"end":1002,"name":"JUMPDEST","source":1},{"begin":939,"end":1002,"name":"SWAP2","source":1},{"begin":939,"end":1002,"name":"POP","source":1},{"begin":895,"end":1012,"name":"POP","source":1},{"begin":690,"end":1019,"name":"SWAP3","source":1},{"begin":690,"end":1019,"name":"SWAP2","source":1},{"begin":690,"end":1019,"name":"POP","source":1},{"begin":690,"end":1019,"name":"POP","source":1},{"begin":690,"end":1019,"jumpType":"[out]","name":"JUMP","source":1},{"begin":1025,"end":1205,"name":"tag","source":1,"value":"18"},{"begin":1025,"end":1205,"name":"JUMPDEST","source":1},{"begin":1073,"end":1150,"name":"PUSH","source":1,"value":"4E487B7100000000000000000000000000000000000000000000000000000000"},{"begin":1070,"end":1071,"name":"PUSH","source":1,"value":"0"},{"begin":1063,"end":1151,"name":"MSTORE","source":1},{"begin":1170,"end":1174,"name":"PUSH","source":1,"value":"11"},{"begin":1167,"end":1168,"name":"PUSH","source":1,"value":"4"},{"begin":1160,"end":1175,"name":"MSTORE","source":1},{"begin":1194,"end":1198,"name":"PUSH","source":1,"value":"24"},{"begin":1191,"end":1192,"name":"PUSH","source":1,"value":"0"},{"begin":1184,"end":1199,"name":"REVERT","source":1},{"begin":1211,"end":1402,"name":"tag","source":1,"value":"10"},{"begin":1211,"end":1402,"name":"JUMPDEST","source":1},{"begin":1251,"end":1254,"name":"PUSH","source":1,"value":"0"},{"begin":1270,"end":1290,"name":"PUSH [tag]","source":1,"value":"35"},{"begin":1288,"end":1289,"name":"DUP3","source":1},{"begin":1270,"end":1290,"name":"PUSH [tag]","source":1,"value":"15"},{"begin":1270,"end":1290,"jumpType":"[in]","name":"JUMP","source":1},{"begin":1270,"end":1290,"name":"tag","source":1,"value":"35"},{"begin":1270,"end":1290,"name":"JUMPDEST","source":1},{"begin":1265,"end":1290,"name":"SWAP2","source":1},{"begin":1265,"end":1290,"name":"POP","source":1},{"begin":1304,"end":1324,"name":"PUSH [tag]","source":1,"value":"36"},{"begin":1322,"end":1323,"name":"DUP4","source":1},{"begin":1304,"end":1324,"name":"PUSH [tag]","source":1,"value":"15"},{"begin":1304,"end":1324,"jumpType":"[in]","name":"JUMP","source":1},{"begin":1304,"end":1324,"name":"tag","source":1,"value":"36"},{"begin":1304,"end":1324,"name":"JUMPDEST","source":1},{"begin":1299,"end":1324,"name":"SWAP3","source":1},{"begin":1299,"end":1324,"name":"POP","source":1},{"begin":1347,"end":1348,"name":"DUP3","source":1},{"begin":1344,"end":1345,"name":"DUP3","source":1},{"begin":1340,"end":1349,"name":"ADD","source":1},{"begin":1333,"end":1349,"name":"SWAP1","source":1},{"begin":1333,"end":1349,"name":"POP","source":1},{"begin":1368,"end":1371,"name":"DUP1","source":1},{"begin":1365,"end":1366,"name":"DUP3","source":1},{"begin":1362,"end":1372,"name":"GT","source":1},{"begin":1359,"end":1395,"name":"ISZERO","source":1},{"begin":1359,"end":1395,"name":"PUSH [tag]","source":1,"value":"37"},{"begin":1359,"end":1395,"name":"JUMPI","source":1},{"begin":1375,"end":1393,"name":"PUSH [tag]","source":1,"value":"38"},{"begin":1375,"end":1393,"name":"PUSH [tag]","source":1,"value":"18"},{"begin":1375,"end":1393,"jumpType":"[in]","name":"JUMP","source":1},{"begin":1375,"end":1393,"name":"tag","source":1,"value":"38"},{"begin":1375,"end":1393,"name":"JUMPDEST","source":1},{"begin":1359,"end":1395,"name":"tag","source":1,"value":"37"},{"begin":1359,"end":1395,"name":"JUMPDEST","source":1},{"begin":1211,"end":1402,"name":"SWAP3","source":1},{"begin":1211,"end":1402,"name":"SWAP2","source":1},{"begin":1211,"end":1402,"name":"POP","source":1},{"begin":1211,"end":1402,"name":"POP","source":1},{"begin":1211,"end":1402,"jumpType":"[out]","name":"JUMP","source":1}]}},"sourceList":["asm_json_no_pretty_print/input.sol","#utility.yul"]} +{".code":[{"begin":60,"end":160,"name":"PUSH","source":0,"value":"80"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"40"},{"begin":60,"end":160,"name":"MSTORE","source":0},{"begin":60,"end":160,"name":"CALLVALUE","source":0},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"ISZERO","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"REVERT","source":0},{"begin":60,"end":160,"name":"tag","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPDEST","source":0},{"begin":60,"end":160,"name":"POP","source":0},{"begin":60,"end":160,"name":"PUSH #[$]","source":0,"value":"0000000000000000000000000000000000000000000000000000000000000000"},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"PUSH [$]","source":0,"value":"0000000000000000000000000000000000000000000000000000000000000000"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"CODECOPY","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"RETURN","source":0}],".data":{"0":{".auxdata":"",".code":[{"begin":60,"end":160,"name":"PUSH","source":0,"value":"80"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"40"},{"begin":60,"end":160,"name":"MSTORE","source":0},{"begin":60,"end":160,"name":"CALLVALUE","source":0},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"ISZERO","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"REVERT","source":0},{"begin":60,"end":160,"name":"tag","source":0,"value":"1"},{"begin":60,"end":160,"name":"JUMPDEST","source":0},{"begin":60,"end":160,"name":"POP","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"4"},{"begin":60,"end":160,"name":"CALLDATASIZE","source":0},{"begin":60,"end":160,"name":"LT","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"2"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"CALLDATALOAD","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"E0"},{"begin":60,"end":160,"name":"SHR","source":0},{"begin":60,"end":160,"name":"DUP1","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"B3DE648B"},{"begin":60,"end":160,"name":"EQ","source":0},{"begin":60,"end":160,"name":"PUSH [tag]","source":0,"value":"3"},{"begin":60,"end":160,"name":"JUMPI","source":0},{"begin":60,"end":160,"name":"tag","source":0,"value":"2"},{"begin":60,"end":160,"name":"JUMPDEST","source":0},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"PUSH","source":0,"value":"0"},{"begin":60,"end":160,"name":"REVERT","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"3"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"4"},{"begin":77,"end":158,"name":"PUSH","source":0,"value":"4"},{"begin":77,"end":158,"name":"DUP1","source":0},{"begin":77,"end":158,"name":"CALLDATASIZE","source":0},{"begin":77,"end":158,"name":"SUB","source":0},{"begin":77,"end":158,"name":"DUP2","source":0},{"begin":77,"end":158,"name":"ADD","source":0},{"begin":77,"end":158,"name":"SWAP1","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"5"},{"begin":77,"end":158,"name":"SWAP2","source":0},{"begin":77,"end":158,"name":"SWAP1","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"6"},{"begin":77,"end":158,"jumpType":"[in]","name":"JUMP","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"5"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"PUSH [tag]","source":0,"value":"7"},{"begin":77,"end":158,"jumpType":"[in]","name":"JUMP","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"4"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"STOP","source":0},{"begin":77,"end":158,"name":"tag","source":0,"value":"7"},{"begin":77,"end":158,"name":"JUMPDEST","source":0},{"begin":123,"end":125,"name":"PUSH","source":0,"value":"2A"},{"begin":118,"end":125,"name":"DUP2","source":0},{"begin":118,"end":125,"name":"PUSH [tag]","source":0,"value":"9"},{"begin":118,"end":125,"name":"SWAP2","source":0},{"begin":118,"end":125,"name":"SWAP1","source":0},{"begin":118,"end":125,"name":"PUSH [tag]","source":0,"value":"10"},{"begin":118,"end":125,"jumpType":"[in]","name":"JUMP","source":0},{"begin":118,"end":125,"name":"tag","source":0,"value":"9"},{"begin":118,"end":125,"name":"JUMPDEST","source":0},{"begin":118,"end":125,"name":"SWAP1","source":0},{"begin":118,"end":125,"name":"POP","source":0},{"begin":147,"end":150,"name":"PUSH","source":0,"value":"64"},{"begin":143,"end":144,"name":"DUP2","source":0},{"begin":143,"end":150,"name":"GT","source":0},{"begin":135,"end":151,"name":"PUSH [tag]","source":0,"value":"11"},{"begin":135,"end":151,"name":"JUMPI","source":0},{"begin":135,"end":151,"name":"PUSH","source":0,"value":"0"},{"begin":135,"end":151,"name":"PUSH","source":0,"value":"0"},{"begin":135,"end":151,"name":"REVERT","source":0},{"begin":135,"end":151,"name":"tag","source":0,"value":"11"},{"begin":135,"end":151,"name":"JUMPDEST","source":0},{"begin":77,"end":158,"name":"POP","source":0},{"begin":77,"end":158,"jumpType":"[out]","name":"JUMP","source":0},{"begin":88,"end":205,"name":"tag","source":1,"value":"13"},{"begin":88,"end":205,"name":"JUMPDEST","source":1},{"begin":197,"end":198,"name":"PUSH","source":1,"value":"0"},{"begin":194,"end":195,"name":"PUSH","source":1,"value":"0"},{"begin":187,"end":199,"name":"REVERT","source":1},{"begin":334,"end":411,"name":"tag","source":1,"value":"15"},{"begin":334,"end":411,"name":"JUMPDEST","source":1},{"begin":371,"end":378,"name":"PUSH","source":1,"value":"0"},{"begin":400,"end":405,"name":"DUP2","source":1},{"begin":389,"end":405,"name":"SWAP1","source":1},{"begin":389,"end":405,"name":"POP","source":1},{"begin":334,"end":411,"name":"SWAP2","source":1},{"begin":334,"end":411,"name":"SWAP1","source":1},{"begin":334,"end":411,"name":"POP","source":1},{"begin":334,"end":411,"jumpType":"[out]","name":"JUMP","source":1},{"begin":417,"end":539,"name":"tag","source":1,"value":"16"},{"begin":417,"end":539,"name":"JUMPDEST","source":1},{"begin":490,"end":514,"name":"PUSH [tag]","source":1,"value":"25"},{"begin":508,"end":513,"name":"DUP2","source":1},{"begin":490,"end":514,"name":"PUSH [tag]","source":1,"value":"15"},{"begin":490,"end":514,"jumpType":"[in]","name":"JUMP","source":1},{"begin":490,"end":514,"name":"tag","source":1,"value":"25"},{"begin":490,"end":514,"name":"JUMPDEST","source":1},{"begin":483,"end":488,"name":"DUP2","source":1},{"begin":480,"end":515,"name":"EQ","source":1},{"begin":470,"end":533,"name":"PUSH [tag]","source":1,"value":"26"},{"begin":470,"end":533,"name":"JUMPI","source":1},{"begin":529,"end":530,"name":"PUSH","source":1,"value":"0"},{"begin":526,"end":527,"name":"PUSH","source":1,"value":"0"},{"begin":519,"end":531,"name":"REVERT","source":1},{"begin":470,"end":533,"name":"tag","source":1,"value":"26"},{"begin":470,"end":533,"name":"JUMPDEST","source":1},{"begin":417,"end":539,"name":"POP","source":1},{"begin":417,"end":539,"jumpType":"[out]","name":"JUMP","source":1},{"begin":545,"end":684,"name":"tag","source":1,"value":"17"},{"begin":545,"end":684,"name":"JUMPDEST","source":1},{"begin":591,"end":596,"name":"PUSH","source":1,"value":"0"},{"begin":629,"end":635,"name":"DUP2","source":1},{"begin":616,"end":636,"name":"CALLDATALOAD","source":1},{"begin":607,"end":636,"name":"SWAP1","source":1},{"begin":607,"end":636,"name":"POP","source":1},{"begin":645,"end":678,"name":"PUSH [tag]","source":1,"value":"28"},{"begin":672,"end":677,"name":"DUP2","source":1},{"begin":645,"end":678,"name":"PUSH [tag]","source":1,"value":"16"},{"begin":645,"end":678,"jumpType":"[in]","name":"JUMP","source":1},{"begin":645,"end":678,"name":"tag","source":1,"value":"28"},{"begin":645,"end":678,"name":"JUMPDEST","source":1},{"begin":545,"end":684,"name":"SWAP3","source":1},{"begin":545,"end":684,"name":"SWAP2","source":1},{"begin":545,"end":684,"name":"POP","source":1},{"begin":545,"end":684,"name":"POP","source":1},{"begin":545,"end":684,"jumpType":"[out]","name":"JUMP","source":1},{"begin":690,"end":1019,"name":"tag","source":1,"value":"6"},{"begin":690,"end":1019,"name":"JUMPDEST","source":1},{"begin":749,"end":755,"name":"PUSH","source":1,"value":"0"},{"begin":798,"end":800,"name":"PUSH","source":1,"value":"20"},{"begin":786,"end":795,"name":"DUP3","source":1},{"begin":777,"end":784,"name":"DUP5","source":1},{"begin":773,"end":796,"name":"SUB","source":1},{"begin":769,"end":801,"name":"SLT","source":1},{"begin":766,"end":885,"name":"ISZERO","source":1},{"begin":766,"end":885,"name":"PUSH [tag]","source":1,"value":"30"},{"begin":766,"end":885,"name":"JUMPI","source":1},{"begin":804,"end":883,"name":"PUSH [tag]","source":1,"value":"31"},{"begin":804,"end":883,"name":"PUSH [tag]","source":1,"value":"13"},{"begin":804,"end":883,"jumpType":"[in]","name":"JUMP","source":1},{"begin":804,"end":883,"name":"tag","source":1,"value":"31"},{"begin":804,"end":883,"name":"JUMPDEST","source":1},{"begin":766,"end":885,"name":"tag","source":1,"value":"30"},{"begin":766,"end":885,"name":"JUMPDEST","source":1},{"begin":924,"end":925,"name":"PUSH","source":1,"value":"0"},{"begin":949,"end":1002,"name":"PUSH [tag]","source":1,"value":"32"},{"begin":994,"end":1001,"name":"DUP5","source":1},{"begin":985,"end":991,"name":"DUP3","source":1},{"begin":974,"end":983,"name":"DUP6","source":1},{"begin":970,"end":992,"name":"ADD","source":1},{"begin":949,"end":1002,"name":"PUSH [tag]","source":1,"value":"17"},{"begin":949,"end":1002,"jumpType":"[in]","name":"JUMP","source":1},{"begin":949,"end":1002,"name":"tag","source":1,"value":"32"},{"begin":949,"end":1002,"name":"JUMPDEST","source":1},{"begin":939,"end":1002,"name":"SWAP2","source":1},{"begin":939,"end":1002,"name":"POP","source":1},{"begin":895,"end":1012,"name":"POP","source":1},{"begin":690,"end":1019,"name":"SWAP3","source":1},{"begin":690,"end":1019,"name":"SWAP2","source":1},{"begin":690,"end":1019,"name":"POP","source":1},{"begin":690,"end":1019,"name":"POP","source":1},{"begin":690,"end":1019,"jumpType":"[out]","name":"JUMP","source":1},{"begin":1025,"end":1205,"name":"tag","source":1,"value":"18"},{"begin":1025,"end":1205,"name":"JUMPDEST","source":1},{"begin":1073,"end":1150,"name":"PUSH","source":1,"value":"4E487B7100000000000000000000000000000000000000000000000000000000"},{"begin":1070,"end":1071,"name":"PUSH","source":1,"value":"0"},{"begin":1063,"end":1151,"name":"MSTORE","source":1},{"begin":1170,"end":1174,"name":"PUSH","source":1,"value":"11"},{"begin":1167,"end":1168,"name":"PUSH","source":1,"value":"4"},{"begin":1160,"end":1175,"name":"MSTORE","source":1},{"begin":1194,"end":1198,"name":"PUSH","source":1,"value":"24"},{"begin":1191,"end":1192,"name":"PUSH","source":1,"value":"0"},{"begin":1184,"end":1199,"name":"REVERT","source":1},{"begin":1211,"end":1402,"name":"tag","source":1,"value":"10"},{"begin":1211,"end":1402,"name":"JUMPDEST","source":1},{"begin":1251,"end":1254,"name":"PUSH","source":1,"value":"0"},{"begin":1270,"end":1290,"name":"PUSH [tag]","source":1,"value":"35"},{"begin":1288,"end":1289,"name":"DUP3","source":1},{"begin":1270,"end":1290,"name":"PUSH [tag]","source":1,"value":"15"},{"begin":1270,"end":1290,"jumpType":"[in]","name":"JUMP","source":1},{"begin":1270,"end":1290,"name":"tag","source":1,"value":"35"},{"begin":1270,"end":1290,"name":"JUMPDEST","source":1},{"begin":1265,"end":1290,"name":"SWAP2","source":1},{"begin":1265,"end":1290,"name":"POP","source":1},{"begin":1304,"end":1324,"name":"PUSH [tag]","source":1,"value":"36"},{"begin":1322,"end":1323,"name":"DUP4","source":1},{"begin":1304,"end":1324,"name":"PUSH [tag]","source":1,"value":"15"},{"begin":1304,"end":1324,"jumpType":"[in]","name":"JUMP","source":1},{"begin":1304,"end":1324,"name":"tag","source":1,"value":"36"},{"begin":1304,"end":1324,"name":"JUMPDEST","source":1},{"begin":1299,"end":1324,"name":"SWAP3","source":1},{"begin":1299,"end":1324,"name":"POP","source":1},{"begin":1347,"end":1348,"name":"DUP3","source":1},{"begin":1344,"end":1345,"name":"DUP3","source":1},{"begin":1340,"end":1349,"name":"ADD","source":1},{"begin":1333,"end":1349,"name":"SWAP1","source":1},{"begin":1333,"end":1349,"name":"POP","source":1},{"begin":1368,"end":1371,"name":"DUP1","source":1},{"begin":1365,"end":1366,"name":"DUP3","source":1},{"begin":1362,"end":1372,"name":"GT","source":1},{"begin":1359,"end":1395,"name":"ISZERO","source":1},{"begin":1359,"end":1395,"name":"PUSH [tag]","source":1,"value":"37"},{"begin":1359,"end":1395,"name":"JUMPI","source":1},{"begin":1375,"end":1393,"name":"PUSH [tag]","source":1,"value":"38"},{"begin":1375,"end":1393,"name":"PUSH [tag]","source":1,"value":"18"},{"begin":1375,"end":1393,"jumpType":"[in]","name":"JUMP","source":1},{"begin":1375,"end":1393,"name":"tag","source":1,"value":"38"},{"begin":1375,"end":1393,"name":"JUMPDEST","source":1},{"begin":1359,"end":1395,"name":"tag","source":1,"value":"37"},{"begin":1359,"end":1395,"name":"JUMPDEST","source":1},{"begin":1211,"end":1402,"name":"SWAP3","source":1},{"begin":1211,"end":1402,"name":"SWAP2","source":1},{"begin":1211,"end":1402,"name":"POP","source":1},{"begin":1211,"end":1402,"name":"POP","source":1},{"begin":1211,"end":1402,"jumpType":"[out]","name":"JUMP","source":1}]}},"sourceList":["input.sol","#utility.yul"]} diff --git a/test/cmdlineTests/ast_compact_json_no_pretty_json/output b/test/cmdlineTests/ast_compact_json_no_pretty_json/output index fb79fd524e24..43806c05506d 100644 --- a/test/cmdlineTests/ast_compact_json_no_pretty_json/output +++ b/test/cmdlineTests/ast_compact_json_no_pretty_json/output @@ -1,5 +1,5 @@ JSON AST (compact format): -======= ast_compact_json_no_pretty_json/input.sol ======= -{"absolutePath":"ast_compact_json_no_pretty_json/input.sol","exportedSymbols":{"C":[2]},"id":3,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity",">=","0.0"],"nodeType":"PragmaDirective","src":"36:22:0"},{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":2,"linearizedBaseContracts":[2],"name":"C","nameLocation":"69:1:0","nodeType":"ContractDefinition","nodes":[],"scope":3,"src":"60:13:0","usedErrors":[],"usedEvents":[]}],"src":"36:38:0"} +======= input.sol ======= +{"absolutePath":"input.sol","exportedSymbols":{"C":[2]},"id":3,"license":"GPL-3.0","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity",">=","0.0"],"nodeType":"PragmaDirective","src":"36:22:0"},{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":2,"linearizedBaseContracts":[2],"name":"C","nameLocation":"69:1:0","nodeType":"ContractDefinition","nodes":[],"scope":3,"src":"60:13:0","usedErrors":[],"usedEvents":[]}],"src":"36:38:0"} diff --git a/test/cmdlineTests/ast_compact_json_storage_layout_specifier/output b/test/cmdlineTests/ast_compact_json_storage_layout_specifier/output index 4fe5fe193be9..994286c3bbe4 100644 --- a/test/cmdlineTests/ast_compact_json_storage_layout_specifier/output +++ b/test/cmdlineTests/ast_compact_json_storage_layout_specifier/output @@ -1,9 +1,9 @@ JSON AST (compact format): -======= ast_compact_json_storage_layout_specifier/input.sol ======= +======= input.sol ======= { - "absolutePath": "ast_compact_json_storage_layout_specifier/input.sol", + "absolutePath": "input.sol", "exportedSymbols": { "C": [ 6 diff --git a/test/cmdlineTests/ast_compact_json_with_base_path/output b/test/cmdlineTests/ast_compact_json_with_base_path/output index c61502020765..93f7df2536b6 100644 --- a/test/cmdlineTests/ast_compact_json_with_base_path/output +++ b/test/cmdlineTests/ast_compact_json_with_base_path/output @@ -1,9 +1,9 @@ JSON AST (compact format): -======= ast_compact_json_with_base_path/c.sol ======= +======= c.sol ======= { - "absolutePath": "ast_compact_json_with_base_path/c.sol", + "absolutePath": "c.sol", "exportedSymbols": { "C": [ 5 @@ -46,9 +46,9 @@ JSON AST (compact format): ], "src": "36:38:0" } -======= ast_compact_json_with_base_path/input.sol ======= +======= input.sol ======= { - "absolutePath": "ast_compact_json_with_base_path/input.sol", + "absolutePath": "input.sol", "exportedSymbols": { "C": [ 5 @@ -69,7 +69,7 @@ JSON AST (compact format): "src": "36:22:1" }, { - "absolutePath": "ast_compact_json_with_base_path/c.sol", + "absolutePath": "c.sol", "file": "./c.sol", "id": 2, "nameLocation": "-1:-1:-1", diff --git a/test/cmdlineTests/ast_ir/output b/test/cmdlineTests/ast_ir/output index 76f111990870..88047ade02b3 100644 --- a/test/cmdlineTests/ast_ir/output +++ b/test/cmdlineTests/ast_ir/output @@ -2,7 +2,7 @@ IR AST: { "code": { "block": { - "nativeSrc": "59:790:0", + "nativeSrc": "52:790:0", "nodeType": "YulBlock", "src": "-1:-1:0", "statements": [ @@ -11,7 +11,7 @@ IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "118:2:0", + "nativeSrc": "111:2:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -21,7 +21,7 @@ IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "134:3:0", + "nativeSrc": "127:3:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -30,32 +30,32 @@ IR AST: ], "functionName": { "name": "memoryguard", - "nativeSrc": "122:11:0", + "nativeSrc": "115:11:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "122:16:0", + "nativeSrc": "115:16:0", "nodeType": "YulFunctionCall", "src": "60:13:0" } ], "functionName": { "name": "mstore", - "nativeSrc": "111:6:0", + "nativeSrc": "104:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "111:28:0", + "nativeSrc": "104:28:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "111:28:0", + "nativeSrc": "104:28:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, { "body": { - "nativeSrc": "163:83:0", + "nativeSrc": "156:83:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ @@ -64,15 +64,15 @@ IR AST: "arguments": [], "functionName": { "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", - "nativeSrc": "165:77:0", + "nativeSrc": "158:77:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "165:79:0", + "nativeSrc": "158:79:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "165:79:0", + "nativeSrc": "158:79:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" } @@ -82,15 +82,15 @@ IR AST: "arguments": [], "functionName": { "name": "callvalue", - "nativeSrc": "151:9:0", + "nativeSrc": "144:9:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "151:11:0", + "nativeSrc": "144:11:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "148:98:0", + "nativeSrc": "141:98:0", "nodeType": "YulIf", "src": "60:13:0" }, @@ -99,38 +99,38 @@ IR AST: "arguments": [], "functionName": { "name": "constructor_C_2", - "nativeSrc": "256:15:0", + "nativeSrc": "249:15:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "256:17:0", + "nativeSrc": "249:17:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "256:17:0", + "nativeSrc": "249:17:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, { - "nativeSrc": "283:30:0", + "nativeSrc": "276:30:0", "nodeType": "YulVariableDeclaration", "src": "60:13:0", "value": { "arguments": [], "functionName": { "name": "allocate_unbounded", - "nativeSrc": "293:18:0", + "nativeSrc": "286:18:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "293:20:0", + "nativeSrc": "286:20:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, "variables": [ { "name": "_1", - "nativeSrc": "287:2:0", + "nativeSrc": "280:2:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -142,7 +142,7 @@ IR AST: "arguments": [ { "name": "_1", - "nativeSrc": "331:2:0", + "nativeSrc": "324:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, @@ -151,7 +151,7 @@ IR AST: { "hexValue": "435f325f6465706c6f796564", "kind": "string", - "nativeSrc": "346:14:0", + "nativeSrc": "339:14:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -160,11 +160,11 @@ IR AST: ], "functionName": { "name": "dataoffset", - "nativeSrc": "335:10:0", + "nativeSrc": "328:10:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "335:26:0", + "nativeSrc": "328:26:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, @@ -173,7 +173,7 @@ IR AST: { "hexValue": "435f325f6465706c6f796564", "kind": "string", - "nativeSrc": "372:14:0", + "nativeSrc": "365:14:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -182,26 +182,26 @@ IR AST: ], "functionName": { "name": "datasize", - "nativeSrc": "363:8:0", + "nativeSrc": "356:8:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "363:24:0", + "nativeSrc": "356:24:0", "nodeType": "YulFunctionCall", "src": "60:13:0" } ], "functionName": { "name": "codecopy", - "nativeSrc": "322:8:0", + "nativeSrc": "315:8:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "322:66:0", + "nativeSrc": "315:66:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "322:66:0", + "nativeSrc": "315:66:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, @@ -210,7 +210,7 @@ IR AST: "arguments": [ { "name": "_1", - "nativeSrc": "405:2:0", + "nativeSrc": "398:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, @@ -219,7 +219,7 @@ IR AST: { "hexValue": "435f325f6465706c6f796564", "kind": "string", - "nativeSrc": "418:14:0", + "nativeSrc": "411:14:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -228,44 +228,44 @@ IR AST: ], "functionName": { "name": "datasize", - "nativeSrc": "409:8:0", + "nativeSrc": "402:8:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "409:24:0", + "nativeSrc": "402:24:0", "nodeType": "YulFunctionCall", "src": "60:13:0" } ], "functionName": { "name": "return", - "nativeSrc": "398:6:0", + "nativeSrc": "391:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "398:36:0", + "nativeSrc": "391:36:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "398:36:0", + "nativeSrc": "391:36:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, { "body": { - "nativeSrc": "484:43:0", + "nativeSrc": "477:43:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ { - "nativeSrc": "498:19:0", + "nativeSrc": "491:19:0", "nodeType": "YulAssignment", "src": "60:13:0", "value": { "arguments": [ { "kind": "number", - "nativeSrc": "514:2:0", + "nativeSrc": "507:2:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -274,18 +274,18 @@ IR AST: ], "functionName": { "name": "mload", - "nativeSrc": "508:5:0", + "nativeSrc": "501:5:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "508:9:0", + "nativeSrc": "501:9:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, "variableNames": [ { "name": "memPtr", - "nativeSrc": "498:6:0", + "nativeSrc": "491:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" } @@ -294,12 +294,12 @@ IR AST: ] }, "name": "allocate_unbounded", - "nativeSrc": "444:83:0", + "nativeSrc": "437:83:0", "nodeType": "YulFunctionDefinition", "returnVariables": [ { "name": "memPtr", - "nativeSrc": "477:6:0", + "nativeSrc": "470:6:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -309,7 +309,7 @@ IR AST: }, { "body": { - "nativeSrc": "626:36:0", + "nativeSrc": "619:36:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ @@ -318,7 +318,7 @@ IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "647:1:0", + "nativeSrc": "640:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -326,7 +326,7 @@ IR AST: }, { "kind": "number", - "nativeSrc": "650:1:0", + "nativeSrc": "643:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -335,34 +335,34 @@ IR AST: ], "functionName": { "name": "revert", - "nativeSrc": "640:6:0", + "nativeSrc": "633:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "640:12:0", + "nativeSrc": "633:12:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "640:12:0", + "nativeSrc": "633:12:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" } ] }, "name": "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb", - "nativeSrc": "537:125:0", + "nativeSrc": "530:125:0", "nodeType": "YulFunctionDefinition", "src": "60:13:0" }, { "body": { - "nativeSrc": "741:59:0", + "nativeSrc": "734:59:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [] }, "name": "constructor_C_2", - "nativeSrc": "714:86:0", + "nativeSrc": "707:86:0", "nodeType": "YulFunctionDefinition", "src": "60:13:0" } @@ -376,7 +376,7 @@ IR AST: { "code": { "block": { - "nativeSrc": "929:588:0", + "nativeSrc": "915:588:0", "nodeType": "YulBlock", "src": "-1:-1:0", "statements": [ @@ -385,7 +385,7 @@ IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "996:2:0", + "nativeSrc": "982:2:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -395,7 +395,7 @@ IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "1012:3:0", + "nativeSrc": "998:3:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -404,26 +404,26 @@ IR AST: ], "functionName": { "name": "memoryguard", - "nativeSrc": "1000:11:0", + "nativeSrc": "986:11:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "1000:16:0", + "nativeSrc": "986:16:0", "nodeType": "YulFunctionCall", "src": "60:13:0" } ], "functionName": { "name": "mstore", - "nativeSrc": "989:6:0", + "nativeSrc": "975:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "989:28:0", + "nativeSrc": "975:28:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "989:28:0", + "nativeSrc": "975:28:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, @@ -432,33 +432,33 @@ IR AST: "arguments": [], "functionName": { "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", - "nativeSrc": "1031:77:0", + "nativeSrc": "1017:77:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "1031:79:0", + "nativeSrc": "1017:79:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "1031:79:0", + "nativeSrc": "1017:79:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, { "body": { - "nativeSrc": "1177:77:0", + "nativeSrc": "1163:77:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ { - "nativeSrc": "1195:44:0", + "nativeSrc": "1181:44:0", "nodeType": "YulAssignment", "src": "60:13:0", "value": { "arguments": [ { "kind": "number", - "nativeSrc": "1228:3:0", + "nativeSrc": "1214:3:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -466,25 +466,25 @@ IR AST: }, { "name": "value", - "nativeSrc": "1233:5:0", + "nativeSrc": "1219:5:0", "nodeType": "YulIdentifier", "src": "60:13:0" } ], "functionName": { "name": "shr", - "nativeSrc": "1224:3:0", + "nativeSrc": "1210:3:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "1224:15:0", + "nativeSrc": "1210:15:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, "variableNames": [ { "name": "newValue", - "nativeSrc": "1195:8:0", + "nativeSrc": "1181:8:0", "nodeType": "YulIdentifier", "src": "60:13:0" } @@ -493,12 +493,12 @@ IR AST: ] }, "name": "shift_right_224_unsigned", - "nativeSrc": "1124:130:0", + "nativeSrc": "1110:130:0", "nodeType": "YulFunctionDefinition", "parameters": [ { "name": "value", - "nativeSrc": "1158:5:0", + "nativeSrc": "1144:5:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -507,7 +507,7 @@ IR AST: "returnVariables": [ { "name": "newValue", - "nativeSrc": "1168:8:0", + "nativeSrc": "1154:8:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -517,19 +517,19 @@ IR AST: }, { "body": { - "nativeSrc": "1308:51:0", + "nativeSrc": "1294:51:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ { - "nativeSrc": "1326:19:0", + "nativeSrc": "1312:19:0", "nodeType": "YulAssignment", "src": "60:13:0", "value": { "arguments": [ { "kind": "number", - "nativeSrc": "1342:2:0", + "nativeSrc": "1328:2:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -538,18 +538,18 @@ IR AST: ], "functionName": { "name": "mload", - "nativeSrc": "1336:5:0", + "nativeSrc": "1322:5:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "1336:9:0", + "nativeSrc": "1322:9:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, "variableNames": [ { "name": "memPtr", - "nativeSrc": "1326:6:0", + "nativeSrc": "1312:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" } @@ -558,12 +558,12 @@ IR AST: ] }, "name": "allocate_unbounded", - "nativeSrc": "1268:91:0", + "nativeSrc": "1254:91:0", "nodeType": "YulFunctionDefinition", "returnVariables": [ { "name": "memPtr", - "nativeSrc": "1301:6:0", + "nativeSrc": "1287:6:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -573,7 +573,7 @@ IR AST: }, { "body": { - "nativeSrc": "1462:44:0", + "nativeSrc": "1448:44:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ @@ -582,7 +582,7 @@ IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "1487:1:0", + "nativeSrc": "1473:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -590,7 +590,7 @@ IR AST: }, { "kind": "number", - "nativeSrc": "1490:1:0", + "nativeSrc": "1476:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -599,22 +599,22 @@ IR AST: ], "functionName": { "name": "revert", - "nativeSrc": "1480:6:0", + "nativeSrc": "1466:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "1480:12:0", + "nativeSrc": "1466:12:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "1480:12:0", + "nativeSrc": "1466:12:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" } ] }, "name": "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74", - "nativeSrc": "1373:133:0", + "nativeSrc": "1359:133:0", "nodeType": "YulFunctionDefinition", "src": "60:13:0" } @@ -637,24 +637,24 @@ Optimized IR AST: { "code": { "block": { - "nativeSrc": "58:315:0", + "nativeSrc": "51:315:0", "nodeType": "YulBlock", "src": "-1:-1:0", "statements": [ { - "nativeSrc": "68:299:0", + "nativeSrc": "61:299:0", "nodeType": "YulBlock", "src": "-1:-1:0", "statements": [ { - "nativeSrc": "128:27:0", + "nativeSrc": "121:27:0", "nodeType": "YulVariableDeclaration", "src": "60:13:0", "value": { "arguments": [ { "kind": "number", - "nativeSrc": "150:4:0", + "nativeSrc": "143:4:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -663,18 +663,18 @@ Optimized IR AST: ], "functionName": { "name": "memoryguard", - "nativeSrc": "138:11:0", + "nativeSrc": "131:11:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "138:17:0", + "nativeSrc": "131:17:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, "variables": [ { "name": "_1", - "nativeSrc": "132:2:0", + "nativeSrc": "125:2:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -686,7 +686,7 @@ Optimized IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "175:2:0", + "nativeSrc": "168:2:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -694,28 +694,28 @@ Optimized IR AST: }, { "name": "_1", - "nativeSrc": "179:2:0", + "nativeSrc": "172:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" } ], "functionName": { "name": "mstore", - "nativeSrc": "168:6:0", + "nativeSrc": "161:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "168:14:0", + "nativeSrc": "161:14:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "168:14:0", + "nativeSrc": "161:14:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, { "body": { - "nativeSrc": "210:16:0", + "nativeSrc": "203:16:0", "nodeType": "YulBlock", "src": "60:13:0", "statements": [ @@ -724,7 +724,7 @@ Optimized IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "219:1:0", + "nativeSrc": "212:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -732,7 +732,7 @@ Optimized IR AST: }, { "kind": "number", - "nativeSrc": "222:1:0", + "nativeSrc": "215:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -741,15 +741,15 @@ Optimized IR AST: ], "functionName": { "name": "revert", - "nativeSrc": "212:6:0", + "nativeSrc": "205:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "212:12:0", + "nativeSrc": "205:12:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "212:12:0", + "nativeSrc": "205:12:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" } @@ -759,20 +759,20 @@ Optimized IR AST: "arguments": [], "functionName": { "name": "callvalue", - "nativeSrc": "198:9:0", + "nativeSrc": "191:9:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "198:11:0", + "nativeSrc": "191:11:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "195:31:0", + "nativeSrc": "188:31:0", "nodeType": "YulIf", "src": "60:13:0" }, { - "nativeSrc": "239:34:0", + "nativeSrc": "232:34:0", "nodeType": "YulVariableDeclaration", "src": "60:13:0", "value": { @@ -780,7 +780,7 @@ Optimized IR AST: { "hexValue": "435f325f6465706c6f796564", "kind": "string", - "nativeSrc": "258:14:0", + "nativeSrc": "251:14:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -789,18 +789,18 @@ Optimized IR AST: ], "functionName": { "name": "datasize", - "nativeSrc": "249:8:0", + "nativeSrc": "242:8:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "249:24:0", + "nativeSrc": "242:24:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, "variables": [ { "name": "_2", - "nativeSrc": "243:2:0", + "nativeSrc": "236:2:0", "nodeType": "YulTypedName", "src": "60:13:0", "type": "" @@ -812,7 +812,7 @@ Optimized IR AST: "arguments": [ { "name": "_1", - "nativeSrc": "295:2:0", + "nativeSrc": "288:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, @@ -821,7 +821,7 @@ Optimized IR AST: { "hexValue": "435f325f6465706c6f796564", "kind": "string", - "nativeSrc": "310:14:0", + "nativeSrc": "303:14:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -830,32 +830,32 @@ Optimized IR AST: ], "functionName": { "name": "dataoffset", - "nativeSrc": "299:10:0", + "nativeSrc": "292:10:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "299:26:0", + "nativeSrc": "292:26:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, { "name": "_2", - "nativeSrc": "327:2:0", + "nativeSrc": "320:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" } ], "functionName": { "name": "codecopy", - "nativeSrc": "286:8:0", + "nativeSrc": "279:8:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "286:44:0", + "nativeSrc": "279:44:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "286:44:0", + "nativeSrc": "279:44:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" }, @@ -864,28 +864,28 @@ Optimized IR AST: "arguments": [ { "name": "_1", - "nativeSrc": "350:2:0", + "nativeSrc": "343:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, { "name": "_2", - "nativeSrc": "354:2:0", + "nativeSrc": "347:2:0", "nodeType": "YulIdentifier", "src": "60:13:0" } ], "functionName": { "name": "return", - "nativeSrc": "343:6:0", + "nativeSrc": "336:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "343:14:0", + "nativeSrc": "336:14:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "343:14:0", + "nativeSrc": "336:14:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" } @@ -901,12 +901,12 @@ Optimized IR AST: { "code": { "block": { - "nativeSrc": "453:118:0", + "nativeSrc": "439:118:0", "nodeType": "YulBlock", "src": "-1:-1:0", "statements": [ { - "nativeSrc": "467:94:0", + "nativeSrc": "453:94:0", "nodeType": "YulBlock", "src": "-1:-1:0", "statements": [ @@ -915,7 +915,7 @@ Optimized IR AST: "arguments": [ { "kind": "number", - "nativeSrc": "542:1:0", + "nativeSrc": "528:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -923,7 +923,7 @@ Optimized IR AST: }, { "kind": "number", - "nativeSrc": "545:1:0", + "nativeSrc": "531:1:0", "nodeType": "YulLiteral", "src": "60:13:0", "type": "", @@ -932,15 +932,15 @@ Optimized IR AST: ], "functionName": { "name": "revert", - "nativeSrc": "535:6:0", + "nativeSrc": "521:6:0", "nodeType": "YulIdentifier", "src": "60:13:0" }, - "nativeSrc": "535:12:0", + "nativeSrc": "521:12:0", "nodeType": "YulFunctionCall", "src": "60:13:0" }, - "nativeSrc": "535:12:0", + "nativeSrc": "521:12:0", "nodeType": "YulExpressionStatement", "src": "60:13:0" } diff --git a/test/cmdlineTests/combined_json_abi/output b/test/cmdlineTests/combined_json_abi/output index 79b539db78d0..ee63ccb3ef6f 100644 --- a/test/cmdlineTests/combined_json_abi/output +++ b/test/cmdlineTests/combined_json_abi/output @@ -1,6 +1,6 @@ { "contracts": { - "combined_json_abi/input.sol:C": { + "input.sol:C": { "abi": [] } }, diff --git a/test/cmdlineTests/combined_json_generated_sources/output b/test/cmdlineTests/combined_json_generated_sources/output index db7c86ce13d7..d863bd73a726 100644 --- a/test/cmdlineTests/combined_json_generated_sources/output +++ b/test/cmdlineTests/combined_json_generated_sources/output @@ -1,6 +1,6 @@ { "contracts": { - "combined_json_generated_sources/input.sol:C": { + "input.sol:C": { "generated-sources": [], "generated-sources-runtime": [ { diff --git a/test/cmdlineTests/combined_json_no_pretty_print/output b/test/cmdlineTests/combined_json_no_pretty_print/output index 081dc4fa4eca..34c019b8f792 100644 --- a/test/cmdlineTests/combined_json_no_pretty_print/output +++ b/test/cmdlineTests/combined_json_no_pretty_print/output @@ -1 +1 @@ -{"contracts":{"combined_json_no_pretty_print/input.sol:C":{"abi":[]}},"version": ""} +{"contracts":{"input.sol:C":{"abi":[]}},"version": ""} diff --git a/test/cmdlineTests/combined_json_stop_after_parsing/output b/test/cmdlineTests/combined_json_stop_after_parsing/output index 64e66e3f1227..fa3707bf2488 100644 --- a/test/cmdlineTests/combined_json_stop_after_parsing/output +++ b/test/cmdlineTests/combined_json_stop_after_parsing/output @@ -1,14 +1,14 @@ { "contracts": { - "combined_json_stop_after_parsing/input.sol:C": {} + "input.sol:C": {} }, "sourceList": [ - "combined_json_stop_after_parsing/input.sol" + "input.sol" ], "sources": { - "combined_json_stop_after_parsing/input.sol": { + "input.sol": { "AST": { - "absolutePath": "combined_json_stop_after_parsing/input.sol", + "absolutePath": "input.sol", "id": 3, "license": "GPL-3.0", "nodeType": "SourceUnit", diff --git a/test/cmdlineTests/combined_json_with_base_path/output b/test/cmdlineTests/combined_json_with_base_path/output index 0a3add37e3b4..fe972a631a7a 100644 --- a/test/cmdlineTests/combined_json_with_base_path/output +++ b/test/cmdlineTests/combined_json_with_base_path/output @@ -1,15 +1,15 @@ { "contracts": { - "combined_json_with_base_path/c.sol:C": {} + "c.sol:C": {} }, "sourceList": [ - "combined_json_with_base_path/c.sol", - "combined_json_with_base_path/input.sol" + "c.sol", + "input.sol" ], "sources": { - "combined_json_with_base_path/c.sol": { + "c.sol": { "AST": { - "absolutePath": "combined_json_with_base_path/c.sol", + "absolutePath": "c.sol", "exportedSymbols": { "C": [ 5 @@ -54,9 +54,9 @@ }, "id": 0 }, - "combined_json_with_base_path/input.sol": { + "input.sol": { "AST": { - "absolutePath": "combined_json_with_base_path/input.sol", + "absolutePath": "input.sol", "exportedSymbols": { "C": [ 5 @@ -77,7 +77,7 @@ "src": "36:22:1" }, { - "absolutePath": "combined_json_with_base_path/c.sol", + "absolutePath": "c.sol", "file": "./c.sol", "id": 2, "nameLocation": "-1:-1:-1", diff --git a/test/cmdlineTests/combined_json_with_devdoc/output b/test/cmdlineTests/combined_json_with_devdoc/output index 817018ea6c58..482245fbc4b4 100644 --- a/test/cmdlineTests/combined_json_with_devdoc/output +++ b/test/cmdlineTests/combined_json_with_devdoc/output @@ -1,6 +1,6 @@ { "contracts": { - "combined_json_with_devdoc/input.sol:C": { + "input.sol:C": { "devdoc": { "details": "This is devdoc.", "kind": "dev", @@ -8,7 +8,7 @@ "version": 1 } }, - "combined_json_with_devdoc/input.sol:D": { + "input.sol:D": { "devdoc": { "kind": "dev", "methods": {}, diff --git a/test/cmdlineTests/combined_json_with_userdoc/output b/test/cmdlineTests/combined_json_with_userdoc/output index 4eb56fe24dd2..0e28af093c1c 100644 --- a/test/cmdlineTests/combined_json_with_userdoc/output +++ b/test/cmdlineTests/combined_json_with_userdoc/output @@ -1,6 +1,6 @@ { "contracts": { - "combined_json_with_userdoc/input.sol:C": { + "input.sol:C": { "userdoc": { "kind": "user", "methods": {}, @@ -8,7 +8,7 @@ "version": 1 } }, - "combined_json_with_userdoc/input.sol:D": { + "input.sol:D": { "userdoc": { "kind": "user", "methods": {}, diff --git a/test/cmdlineTests/constant_optimizer_yul/output b/test/cmdlineTests/constant_optimizer_yul/output index 9c7faa732272..c0d3ab934641 100644 --- a/test/cmdlineTests/constant_optimizer_yul/output +++ b/test/cmdlineTests/constant_optimizer_yul/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"constant_optimizer_yul/input.sol" +/// @use-src 0:"input.sol" object "C_12" { code { { @@ -15,7 +15,7 @@ object "C_12" { return(_1, _2) } } - /// @use-src 0:"constant_optimizer_yul/input.sol" + /// @use-src 0:"input.sol" object "C_12_deployed" { code { { diff --git a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output index 4833a9f620a7..7ad569ba1107 100644 --- a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output +++ b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_all/output @@ -1,7 +1,7 @@ -======= debug_info_in_yul_and_evm_asm_print_all/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "debug_info_in_yul_and_evm_asm_print_all/input.sol":60:101 contract C {... */ + /* "input.sol":60:101 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "debug_info_in_yul_and_evm_asm_print_all/input.sol":60:101 contract C {... */ + /* "input.sol":60:101 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -40,7 +40,7 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "debug_info_in_yul_and_evm_asm_print_all/input.sol":77:99 function f() public {} */ + /* "input.sol":77:99 function f() public {} */ tag_3: stop @@ -49,7 +49,7 @@ sub_0: assembly { IR: -/// @use-src 0:"debug_info_in_yul_and_evm_asm_print_all/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { /// @src 0:60:101 "contract C {..." @@ -80,7 +80,7 @@ object "C_6" { /// @src 0:60:101 "contract C {..." } - /// @use-src 0:"debug_info_in_yul_and_evm_asm_print_all/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { /// @src 0:60:101 "contract C {..." @@ -163,7 +163,7 @@ object "C_6" { Optimized IR: -/// @use-src 0:"debug_info_in_yul_and_evm_asm_print_all/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { { @@ -176,7 +176,7 @@ object "C_6" { return(_1, _2) } } - /// @use-src 0:"debug_info_in_yul_and_evm_asm_print_all/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { { diff --git a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output index 00b04a01ad1f..36ef4d8294ab 100644 --- a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output +++ b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_location_only/output @@ -1,7 +1,7 @@ -======= debug_info_in_yul_and_evm_asm_print_location_only/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "debug_info_in_yul_and_evm_asm_print_location_only/input.sol":60:101 */ + /* "input.sol":60:101 */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "debug_info_in_yul_and_evm_asm_print_location_only/input.sol":60:101 */ + /* "input.sol":60:101 */ mstore(0x40, 0x80) callvalue dup1 @@ -40,7 +40,7 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "debug_info_in_yul_and_evm_asm_print_location_only/input.sol":77:99 */ + /* "input.sol":77:99 */ tag_3: stop @@ -49,7 +49,7 @@ sub_0: assembly { IR: -/// @use-src 0:"debug_info_in_yul_and_evm_asm_print_location_only/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { /// @src 0:60:101 @@ -80,7 +80,7 @@ object "C_6" { /// @src 0:60:101 } - /// @use-src 0:"debug_info_in_yul_and_evm_asm_print_location_only/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { /// @src 0:60:101 @@ -162,7 +162,7 @@ object "C_6" { Optimized IR: -/// @use-src 0:"debug_info_in_yul_and_evm_asm_print_location_only/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { { @@ -175,7 +175,7 @@ object "C_6" { return(_1, _2) } } - /// @use-src 0:"debug_info_in_yul_and_evm_asm_print_location_only/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { { diff --git a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output index 9527edf769a4..ea3cb35a2849 100644 --- a/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output +++ b/test/cmdlineTests/debug_info_in_yul_and_evm_asm_print_none/output @@ -1,5 +1,5 @@ -======= debug_info_in_yul_and_evm_asm_print_none/input.sol:C ======= +======= input.sol:C ======= EVM assembly: mstore(0x40, 0x80) callvalue @@ -46,7 +46,7 @@ sub_0: assembly { IR: -/// @use-src 0:"debug_info_in_yul_and_evm_asm_print_none/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { @@ -73,7 +73,7 @@ object "C_6" { } } - /// @use-src 0:"debug_info_in_yul_and_evm_asm_print_none/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { @@ -153,7 +153,7 @@ object "C_6" { Optimized IR: -/// @use-src 0:"debug_info_in_yul_and_evm_asm_print_none/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { { @@ -165,7 +165,7 @@ object "C_6" { return(_1, _2) } } - /// @use-src 0:"debug_info_in_yul_and_evm_asm_print_none/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { { diff --git a/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output b/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output index 975582f669ba..c29dfd89265d 100644 --- a/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output +++ b/test/cmdlineTests/debug_info_in_yul_snippet_escaping/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" +/// @use-src 0:"input.sol" object "C_2" { code { /// @src 0:265:278 "contract C {}" @@ -31,7 +31,7 @@ object "C_2" { /// @src 0:265:278 "contract C {}" } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { /// @src 0:265:278 "contract C {}" @@ -63,7 +63,7 @@ object "C_2" { Optimized IR: -/// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" +/// @use-src 0:"input.sol" object "C_2" { code { { @@ -76,7 +76,7 @@ object "C_2" { return(_1, _2) } } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { { @@ -90,7 +90,7 @@ object "C_2" { IR: -/// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" +/// @use-src 0:"input.sol" object "D_27" { code { /// @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." @@ -121,7 +121,7 @@ object "D_27" { /// @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "D_27_deployed" { code { /// @src 0:279:599 "contract D /** @src 0:96:165 \"contract D {...\" *\/ {..." @@ -342,7 +342,7 @@ object "D_27" { } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "C_2" { code { /// @src 0:265:278 "contract C {}" @@ -373,7 +373,7 @@ object "D_27" { /// @src 0:265:278 "contract C {}" } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { /// @src 0:265:278 "contract C {}" @@ -410,7 +410,7 @@ object "D_27" { Optimized IR: -/// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" +/// @use-src 0:"input.sol" object "D_27" { code { { @@ -423,7 +423,7 @@ object "D_27" { return(_1, _2) } } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "D_27_deployed" { code { { @@ -499,7 +499,7 @@ object "D_27" { revert(0, 0) } } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "C_2" { code { { @@ -512,7 +512,7 @@ object "D_27" { return(_1, _2) } } - /// @use-src 0:"debug_info_in_yul_snippet_escaping/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { { diff --git a/test/cmdlineTests/dup_opt_peephole/output b/test/cmdlineTests/dup_opt_peephole/output index a9e0203ed1ff..f53e9e2bdb17 100644 --- a/test/cmdlineTests/dup_opt_peephole/output +++ b/test/cmdlineTests/dup_opt_peephole/output @@ -1,7 +1,7 @@ -======= dup_opt_peephole/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "dup_opt_peephole/input.sol":60:171 contract C {... */ + /* "input.sol":60:171 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "dup_opt_peephole/input.sol":60:171 contract C {... */ + /* "input.sol":60:171 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -31,17 +31,17 @@ sub_0: assembly { revert(0x00, 0x00) tag_3: pop - /* "dup_opt_peephole/input.sol":134:135 0 */ + /* "input.sol":134:135 0 */ 0x00 - /* "dup_opt_peephole/input.sol":121:136 calldataload(0) */ + /* "input.sol":121:136 calldataload(0) */ calldataload - /* "dup_opt_peephole/input.sol":160:161 x */ + /* "input.sol":160:161 x */ dup1 - /* "dup_opt_peephole/input.sol":157:158 0 */ + /* "input.sol":157:158 0 */ 0x00 - /* "dup_opt_peephole/input.sol":150:162 sstore(0, x) */ + /* "input.sol":150:162 sstore(0, x) */ sstore - /* "dup_opt_peephole/input.sol":107:166 {... */ + /* "input.sol":107:166 {... */ stop auxdata: diff --git a/test/cmdlineTests/error_codes/err b/test/cmdlineTests/error_codes/err index a10362a863a8..f3f6fe33905c 100644 --- a/test/cmdlineTests/error_codes/err +++ b/test/cmdlineTests/error_codes/err @@ -1,29 +1,29 @@ Warning (1878): SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: " to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information. ---> error_codes/input.sol +--> input.sol Error (4937): No visibility specified. Did you intend to add "public"? - --> error_codes/input.sol:2:5: + --> input.sol:2:5: | 2 | function f() { | ^ (Relevant source part starts here and spans across multiple lines). Warning (3420): Source file does not specify required compiler version! ---> error_codes/input.sol +--> input.sol Error (4247): Expression has to be an lvalue. - --> error_codes/input.sol:3:9: + --> input.sol:3:9: | 3 | 2=0; | ^ Error (7407): Type int_const 0 is not implicitly convertible to expected type int_const 2. - --> error_codes/input.sol:3:11: + --> input.sol:3:11: | 3 | 2=0; | ^ Error (2614): Indexed expression has to be a type, mapping or array (is literal_string "") - --> error_codes/input.sol:4:9: + --> input.sol:4:9: | 4 | ""[2]; | ^^ diff --git a/test/cmdlineTests/ethdebug_eof_container_osaka/output b/test/cmdlineTests/ethdebug_eof_container_osaka/output index 9d002fadc317..b29297ee3749 100644 --- a/test/cmdlineTests/ethdebug_eof_container_osaka/output +++ b/test/cmdlineTests/ethdebug_eof_container_osaka/output @@ -1,4 +1,4 @@ ======= Debug Data (ethdebug/format/info/resources) ======= -{"compilation":{"compiler":{"name":"solc","version": ""},"sources":[{"id":0,"path":"ethdebug_eof_container_osaka/input.sol"}]}} +{"compilation":{"compiler":{"name":"solc","version": ""},"sources":[{"id":0,"path":"input.sol"}]}} -======= ethdebug_eof_container_osaka/input.sol:C ======= +======= input.sol:C ======= diff --git a/test/cmdlineTests/events_in_abi/output b/test/cmdlineTests/events_in_abi/output index ab246ef24a15..220e65ef4a9f 100644 --- a/test/cmdlineTests/events_in_abi/output +++ b/test/cmdlineTests/events_in_abi/output @@ -1,5 +1,5 @@ -======= events_in_abi/input.sol:C ======= +======= input.sol:C ======= Contract JSON ABI [ { @@ -37,7 +37,7 @@ Contract JSON ABI } ] -======= events_in_abi/input.sol:L ======= +======= input.sol:L ======= Contract JSON ABI [ { diff --git a/test/cmdlineTests/evm_version_byzantium/err b/test/cmdlineTests/evm_version_byzantium/err index accbb596cb25..6815a852460a 100644 --- a/test/cmdlineTests/evm_version_byzantium/err +++ b/test/cmdlineTests/evm_version_byzantium/err @@ -1,3 +1,3 @@ Warning: Support for EVM versions older than constantinople is deprecated and will be removed in the future. Warning: Source file does not specify required compiler version! ---> evm_version_byzantium/input.sol +--> input.sol diff --git a/test/cmdlineTests/evm_version_constantinople/err b/test/cmdlineTests/evm_version_constantinople/err index 69f328f54efd..e3815925acb9 100644 --- a/test/cmdlineTests/evm_version_constantinople/err +++ b/test/cmdlineTests/evm_version_constantinople/err @@ -1,2 +1,2 @@ Warning: Source file does not specify required compiler version! ---> evm_version_constantinople/input.sol +--> input.sol diff --git a/test/cmdlineTests/evmasm_difficulty_post_paris/err b/test/cmdlineTests/evmasm_difficulty_post_paris/err index d8210184e1b0..8498f4c460c7 100644 --- a/test/cmdlineTests/evmasm_difficulty_post_paris/err +++ b/test/cmdlineTests/evmasm_difficulty_post_paris/err @@ -1,5 +1,5 @@ Warning: Since the VM version paris, "difficulty" was replaced by "prevrandao", which now returns a random number based on the beacon chain. - --> evmasm_difficulty_post_paris/input.sol:6:21: + --> input.sol:6:21: | 6 | uint256 x = block.difficulty; | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/evmasm_difficulty_post_paris/output b/test/cmdlineTests/evmasm_difficulty_post_paris/output index f8c1611e0274..6ade453b9735 100644 --- a/test/cmdlineTests/evmasm_difficulty_post_paris/output +++ b/test/cmdlineTests/evmasm_difficulty_post_paris/output @@ -1,5 +1,5 @@ -======= evmasm_difficulty_post_paris/input.sol:C ======= +======= input.sol:C ======= EVM assembly: sstore(0x00, prevrandao) stop diff --git a/test/cmdlineTests/evmasm_difficulty_pre_paris/output b/test/cmdlineTests/evmasm_difficulty_pre_paris/output index ad75355f5bcb..26456f276fb7 100644 --- a/test/cmdlineTests/evmasm_difficulty_pre_paris/output +++ b/test/cmdlineTests/evmasm_difficulty_pre_paris/output @@ -1,5 +1,5 @@ -======= evmasm_difficulty_pre_paris/input.sol:C ======= +======= input.sol:C ======= EVM assembly: sstore(0x00, difficulty) stop diff --git a/test/cmdlineTests/evmasm_prevrandao_post_paris/output b/test/cmdlineTests/evmasm_prevrandao_post_paris/output index 47c85bb50fcd..6ade453b9735 100644 --- a/test/cmdlineTests/evmasm_prevrandao_post_paris/output +++ b/test/cmdlineTests/evmasm_prevrandao_post_paris/output @@ -1,5 +1,5 @@ -======= evmasm_prevrandao_post_paris/input.sol:C ======= +======= input.sol:C ======= EVM assembly: sstore(0x00, prevrandao) stop diff --git a/test/cmdlineTests/evmasm_prevrandao_pre_paris/err b/test/cmdlineTests/evmasm_prevrandao_pre_paris/err index 5970ec202066..429c06395086 100644 --- a/test/cmdlineTests/evmasm_prevrandao_pre_paris/err +++ b/test/cmdlineTests/evmasm_prevrandao_pre_paris/err @@ -1,5 +1,5 @@ Warning: "prevrandao" is not supported by the VM version and will be treated as "difficulty". - --> evmasm_prevrandao_pre_paris/input.sol:6:21: + --> input.sol:6:21: | 6 | uint256 x = block.prevrandao; | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/evmasm_prevrandao_pre_paris/output b/test/cmdlineTests/evmasm_prevrandao_pre_paris/output index e41148a8331a..26456f276fb7 100644 --- a/test/cmdlineTests/evmasm_prevrandao_pre_paris/output +++ b/test/cmdlineTests/evmasm_prevrandao_pre_paris/output @@ -1,5 +1,5 @@ -======= evmasm_prevrandao_pre_paris/input.sol:C ======= +======= input.sol:C ======= EVM assembly: sstore(0x00, difficulty) stop diff --git a/test/cmdlineTests/evmasm_transient_storage_inline_assembly/err b/test/cmdlineTests/evmasm_transient_storage_inline_assembly/err index 2e52d9ced0c6..6b7f432f2c92 100644 --- a/test/cmdlineTests/evmasm_transient_storage_inline_assembly/err +++ b/test/cmdlineTests/evmasm_transient_storage_inline_assembly/err @@ -1,5 +1,5 @@ Warning: Transient storage as defined by EIP-1153 can break the composability of smart contracts: Since transient storage is cleared only at the end of the transaction and not at the end of the outermost call frame to the contract within a transaction, your contract may unintentionally misbehave when invoked multiple times in a complex transaction. To avoid this, be sure to clear all transient storage at the end of any call to your contract. The use of transient storage for reentrancy guards that are cleared at the end of the call is safe. - --> evmasm_transient_storage_inline_assembly/input.sol:7:13: + --> input.sol:7:13: | 7 | tstore(0, 123) | ^^^^^^ diff --git a/test/cmdlineTests/evmasm_transient_storage_inline_assembly/output b/test/cmdlineTests/evmasm_transient_storage_inline_assembly/output index 0b4c516baef3..adeb0822c610 100644 --- a/test/cmdlineTests/evmasm_transient_storage_inline_assembly/output +++ b/test/cmdlineTests/evmasm_transient_storage_inline_assembly/output @@ -1,5 +1,5 @@ -======= evmasm_transient_storage_inline_assembly/input.sol:C ======= +======= input.sol:C ======= EVM assembly: mstore(0x40, 0x80) callvalue diff --git a/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/err b/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/err index 154da21b6577..6b7f432f2c92 100644 --- a/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/err +++ b/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/err @@ -1,5 +1,5 @@ Warning: Transient storage as defined by EIP-1153 can break the composability of smart contracts: Since transient storage is cleared only at the end of the transaction and not at the end of the outermost call frame to the contract within a transaction, your contract may unintentionally misbehave when invoked multiple times in a complex transaction. To avoid this, be sure to clear all transient storage at the end of any call to your contract. The use of transient storage for reentrancy guards that are cleared at the end of the call is safe. - --> evmasm_transient_storage_inline_assembly_via_ir/input.sol:7:13: + --> input.sol:7:13: | 7 | tstore(0, 123) | ^^^^^^ diff --git a/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/output b/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/output index 673bdd0a052d..754bc9d455a7 100644 --- a/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/output +++ b/test/cmdlineTests/evmasm_transient_storage_inline_assembly_via_ir/output @@ -1,5 +1,5 @@ -======= evmasm_transient_storage_inline_assembly_via_ir/input.sol:C ======= +======= input.sol:C ======= EVM assembly: 0x80 dup1 diff --git a/test/cmdlineTests/evmasm_transient_storage_state_variable/output b/test/cmdlineTests/evmasm_transient_storage_state_variable/output index e80eb3c57fc7..0f2580c80564 100644 --- a/test/cmdlineTests/evmasm_transient_storage_state_variable/output +++ b/test/cmdlineTests/evmasm_transient_storage_state_variable/output @@ -1,5 +1,5 @@ -======= evmasm_transient_storage_state_variable/input.sol:C ======= +======= input.sol:C ======= EVM assembly: mstore(0x40, 0x80) callvalue diff --git a/test/cmdlineTests/evmasm_transient_storage_state_variable_via_ir/output b/test/cmdlineTests/evmasm_transient_storage_state_variable_via_ir/output index 5959fad952f1..b2f55e1d5724 100644 --- a/test/cmdlineTests/evmasm_transient_storage_state_variable_via_ir/output +++ b/test/cmdlineTests/evmasm_transient_storage_state_variable_via_ir/output @@ -1,5 +1,5 @@ -======= evmasm_transient_storage_state_variable_via_ir/input.sol:C ======= +======= input.sol:C ======= EVM assembly: 0x80 dup1 diff --git a/test/cmdlineTests/exp_base_literal/output b/test/cmdlineTests/exp_base_literal/output index 24e5d29be756..fb5b35ed0fba 100644 --- a/test/cmdlineTests/exp_base_literal/output +++ b/test/cmdlineTests/exp_base_literal/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"exp_base_literal/input.sol" +/// @use-src 0:"input.sol" object "C_81" { code { /// @src 0:82:370 "contract C {..." @@ -31,7 +31,7 @@ object "C_81" { /// @src 0:82:370 "contract C {..." } - /// @use-src 0:"exp_base_literal/input.sol" + /// @use-src 0:"input.sol" object "C_81_deployed" { code { /// @src 0:82:370 "contract C {..." diff --git a/test/cmdlineTests/function_debug_info/output b/test/cmdlineTests/function_debug_info/output index c1346e33ab0c..aa4512352623 100644 --- a/test/cmdlineTests/function_debug_info/output +++ b/test/cmdlineTests/function_debug_info/output @@ -1,6 +1,6 @@ { "contracts": { - "function_debug_info/input.sol:C": { + "input.sol:C": { "function-debug": { "@_34": { "id": 34, diff --git a/test/cmdlineTests/function_debug_info_via_yul/output b/test/cmdlineTests/function_debug_info_via_yul/output index 05c2da48c607..c3a828ab30f0 100644 --- a/test/cmdlineTests/function_debug_info_via_yul/output +++ b/test/cmdlineTests/function_debug_info_via_yul/output @@ -1,6 +1,6 @@ { "contracts": { - "function_debug_info_via_yul/input.sol:C": { + "input.sol:C": { "function-debug": {}, "function-debug-runtime": {} } diff --git a/test/cmdlineTests/hashes/output b/test/cmdlineTests/hashes/output index b010456d3901..45eb1835900a 100644 --- a/test/cmdlineTests/hashes/output +++ b/test/cmdlineTests/hashes/output @@ -1,5 +1,5 @@ -======= hashes/input.sol:C ======= +======= input.sol:C ======= Function signatures: 3fc03eeb: f((uint256)) @@ -12,7 +12,7 @@ Event signatures: 2d4dd5fe18ada5a020a9f5591539a8dc3010a5c074ba6a70e1c956659f02786a: ev(uint256) 81f3fb02f88d32d3bb08c80c9a622ca3b3223292f131c6ad049811f9a8a606dc: libraryEvent(uint256) -======= hashes/input.sol:L ======= +======= input.sol:L ======= Function signatures: Error signatures: diff --git a/test/cmdlineTests/inline_assembly_function_name_clash/err b/test/cmdlineTests/inline_assembly_function_name_clash/err index 5284ffe5ca89..892a312d0f26 100644 --- a/test/cmdlineTests/inline_assembly_function_name_clash/err +++ b/test/cmdlineTests/inline_assembly_function_name_clash/err @@ -1,5 +1,5 @@ Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: " to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information. ---> inline_assembly_function_name_clash/input.sol +--> input.sol Warning: Source file does not specify required compiler version! ---> inline_assembly_function_name_clash/input.sol +--> input.sol diff --git a/test/cmdlineTests/inline_assembly_function_name_clash/output b/test/cmdlineTests/inline_assembly_function_name_clash/output index 2fd6ff1f5592..d21576ff0ba0 100644 --- a/test/cmdlineTests/inline_assembly_function_name_clash/output +++ b/test/cmdlineTests/inline_assembly_function_name_clash/output @@ -1,6 +1,6 @@ { "contracts": { - "inline_assembly_function_name_clash/input.sol:C": { + "input.sol:C": { "function-debug-runtime": { "abi_decode": { "entryPoint": 80, diff --git a/test/cmdlineTests/ir_compiler_inheritance_nosubobjects/output b/test/cmdlineTests/ir_compiler_inheritance_nosubobjects/output index 84fd9d0bc35f..2d715d0abaad 100644 --- a/test/cmdlineTests/ir_compiler_inheritance_nosubobjects/output +++ b/test/cmdlineTests/ir_compiler_inheritance_nosubobjects/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"ir_compiler_inheritance_nosubobjects/input.sol" +/// @use-src 0:"input.sol" object "C_7" { code { { @@ -12,7 +12,7 @@ object "C_7" { return(_1, _2) } } - /// @use-src 0:"ir_compiler_inheritance_nosubobjects/input.sol" + /// @use-src 0:"input.sol" object "C_7_deployed" { code { { @@ -25,7 +25,7 @@ object "C_7" { } Optimized IR: -/// @use-src 0:"ir_compiler_inheritance_nosubobjects/input.sol" +/// @use-src 0:"input.sol" object "D_10" { code { { @@ -38,7 +38,7 @@ object "D_10" { return(_1, _2) } } - /// @use-src 0:"ir_compiler_inheritance_nosubobjects/input.sol" + /// @use-src 0:"input.sol" object "D_10_deployed" { code { { diff --git a/test/cmdlineTests/ir_compiler_subobjects/err b/test/cmdlineTests/ir_compiler_subobjects/err index b300ec124361..66ebf4229caf 100644 --- a/test/cmdlineTests/ir_compiler_subobjects/err +++ b/test/cmdlineTests/ir_compiler_subobjects/err @@ -1,5 +1,5 @@ Warning: Unused local variable. - --> ir_compiler_subobjects/input.sol:8:9: + --> input.sol:8:9: | 8 | C c = new C(); | ^^^ diff --git a/test/cmdlineTests/ir_compiler_subobjects/output b/test/cmdlineTests/ir_compiler_subobjects/output index 39ef53f5529b..08ee8bf5d0b5 100644 --- a/test/cmdlineTests/ir_compiler_subobjects/output +++ b/test/cmdlineTests/ir_compiler_subobjects/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"ir_compiler_subobjects/input.sol" +/// @use-src 0:"input.sol" object "C_3" { code { { @@ -12,7 +12,7 @@ object "C_3" { return(_1, _2) } } - /// @use-src 0:"ir_compiler_subobjects/input.sol" + /// @use-src 0:"input.sol" object "C_3_deployed" { code { { @@ -25,7 +25,7 @@ object "C_3" { } Optimized IR: -/// @use-src 0:"ir_compiler_subobjects/input.sol" +/// @use-src 0:"input.sol" object "D_16" { code { { @@ -38,7 +38,7 @@ object "D_16" { return(_1, _2) } } - /// @use-src 0:"ir_compiler_subobjects/input.sol" + /// @use-src 0:"input.sol" object "D_16_deployed" { code { { @@ -76,7 +76,7 @@ object "D_16" { revert(0, 0) } } - /// @use-src 0:"ir_compiler_subobjects/input.sol" + /// @use-src 0:"input.sol" object "C_3" { code { { @@ -89,7 +89,7 @@ object "D_16" { return(_1, _2) } } - /// @use-src 0:"ir_compiler_subobjects/input.sol" + /// @use-src 0:"input.sol" object "C_3_deployed" { code { { diff --git a/test/cmdlineTests/ir_optimized_transient_storage_value_type/output b/test/cmdlineTests/ir_optimized_transient_storage_value_type/output index 61d289e3f9e0..2f6918cabb36 100644 --- a/test/cmdlineTests/ir_optimized_transient_storage_value_type/output +++ b/test/cmdlineTests/ir_optimized_transient_storage_value_type/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"ir_optimized_transient_storage_value_type/input.sol" +/// @use-src 0:"input.sol" object "C_14" { code { { @@ -11,7 +11,7 @@ object "C_14" { return(_1, _2) } } - /// @use-src 0:"ir_optimized_transient_storage_value_type/input.sol" + /// @use-src 0:"input.sol" object "C_14_deployed" { code { { diff --git a/test/cmdlineTests/ir_optimized_with_optimize/output b/test/cmdlineTests/ir_optimized_with_optimize/output index 8790e45d353d..bae07ea4eb05 100644 --- a/test/cmdlineTests/ir_optimized_with_optimize/output +++ b/test/cmdlineTests/ir_optimized_with_optimize/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"ir_optimized_with_optimize/input.sol" +/// @use-src 0:"input.sol" object "C_2" { code { { @@ -11,7 +11,7 @@ object "C_2" { return(_1, _2) } } - /// @use-src 0:"ir_optimized_with_optimize/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { { revert(0, 0) } } data ".metadata" hex"" diff --git a/test/cmdlineTests/ir_subobject_order/output b/test/cmdlineTests/ir_subobject_order/output index da4390fff055..d41b65bf9a62 100644 --- a/test/cmdlineTests/ir_subobject_order/output +++ b/test/cmdlineTests/ir_subobject_order/output @@ -1,8 +1,8 @@ Optimized IR: -/// @use-src 0:"ir_subobject_order/input.sol" +/// @use-src 0:"input.sol" object "A_13" { code { { revert(0, 0) } } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "A_13_deployed" { code { { revert(0, 0) } } data ".metadata" hex"" @@ -10,10 +10,10 @@ object "A_13" { } Optimized IR: -/// @use-src 0:"ir_subobject_order/input.sol" +/// @use-src 0:"input.sol" object "B_7" { code { { revert(0, 0) } } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "B_7_deployed" { code { { revert(0, 0) } } data ".metadata" hex"" @@ -21,7 +21,7 @@ object "B_7" { } Optimized IR: -/// @use-src 0:"ir_subobject_order/input.sol" +/// @use-src 0:"input.sol" object "C_33" { code { { @@ -69,24 +69,24 @@ object "C_33" { return(_7, _8) } } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "C_33_deployed" { code { { revert(0, 0) } } data ".metadata" hex"" } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "A_13" { code { { revert(0, 0) } } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "A_13_deployed" { code { { revert(0, 0) } } data ".metadata" hex"" } } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "B_7" { code { { revert(0, 0) } } - /// @use-src 0:"ir_subobject_order/input.sol" + /// @use-src 0:"input.sol" object "B_7_deployed" { code { { revert(0, 0) } } data ".metadata" hex"" diff --git a/test/cmdlineTests/ir_unoptimized_with_optimize/output b/test/cmdlineTests/ir_unoptimized_with_optimize/output index c5307123f0f5..b34558d2a49f 100644 --- a/test/cmdlineTests/ir_unoptimized_with_optimize/output +++ b/test/cmdlineTests/ir_unoptimized_with_optimize/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"ir_unoptimized_with_optimize/input.sol" +/// @use-src 0:"input.sol" object "C_2" { code { @@ -27,7 +27,7 @@ object "C_2" { } } - /// @use-src 0:"ir_unoptimized_with_optimize/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { diff --git a/test/cmdlineTests/ir_unoptimized_with_optimize_via_ir/output b/test/cmdlineTests/ir_unoptimized_with_optimize_via_ir/output index f5ecdd8bf5f0..b34558d2a49f 100644 --- a/test/cmdlineTests/ir_unoptimized_with_optimize_via_ir/output +++ b/test/cmdlineTests/ir_unoptimized_with_optimize_via_ir/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"ir_unoptimized_with_optimize_via_ir/input.sol" +/// @use-src 0:"input.sol" object "C_2" { code { @@ -27,7 +27,7 @@ object "C_2" { } } - /// @use-src 0:"ir_unoptimized_with_optimize_via_ir/input.sol" + /// @use-src 0:"input.sol" object "C_2_deployed" { code { diff --git a/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output b/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output index 5c822949a409..03f5564200bf 100644 --- a/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output +++ b/test/cmdlineTests/ir_with_assembly_no_memoryguard_creation/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"ir_with_assembly_no_memoryguard_creation/input.sol" +/// @use-src 0:"input.sol" object "D_12" { code { { @@ -10,7 +10,7 @@ object "D_12" { return(128, _1) } } - /// @use-src 0:"ir_with_assembly_no_memoryguard_creation/input.sol" + /// @use-src 0:"input.sol" object "D_12_deployed" { code { { diff --git a/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output b/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output index f6be1493ec79..9d07cd910e9f 100644 --- a/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output +++ b/test/cmdlineTests/ir_with_assembly_no_memoryguard_runtime/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"ir_with_assembly_no_memoryguard_runtime/input.sol" +/// @use-src 0:"input.sol" object "D_8" { code { { @@ -12,7 +12,7 @@ object "D_8" { return(_1, _2) } } - /// @use-src 0:"ir_with_assembly_no_memoryguard_runtime/input.sol" + /// @use-src 0:"input.sol" object "D_8_deployed" { code { { diff --git a/test/cmdlineTests/keccak_optimization_deploy_code/output b/test/cmdlineTests/keccak_optimization_deploy_code/output index 8b89ea5b6329..839e675210e7 100644 --- a/test/cmdlineTests/keccak_optimization_deploy_code/output +++ b/test/cmdlineTests/keccak_optimization_deploy_code/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"keccak_optimization_deploy_code/input.sol" +/// @use-src 0:"input.sol" object "C_12" { code { { @@ -14,7 +14,7 @@ object "C_12" { return(128, _1) } } - /// @use-src 0:"keccak_optimization_deploy_code/input.sol" + /// @use-src 0:"input.sol" object "C_12_deployed" { code { { diff --git a/test/cmdlineTests/keccak_optimization_low_runs/output b/test/cmdlineTests/keccak_optimization_low_runs/output index c308d737b2f5..328bdd59e621 100644 --- a/test/cmdlineTests/keccak_optimization_low_runs/output +++ b/test/cmdlineTests/keccak_optimization_low_runs/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"keccak_optimization_low_runs/input.sol" +/// @use-src 0:"input.sol" object "C_7" { code { { @@ -12,7 +12,7 @@ object "C_7" { return(_1, _2) } } - /// @use-src 0:"keccak_optimization_low_runs/input.sol" + /// @use-src 0:"input.sol" object "C_7_deployed" { code { { diff --git a/test/cmdlineTests/linking_qualified_library_name/args b/test/cmdlineTests/linking_qualified_library_name/args index dc996f46e236..e8a29e815367 100644 --- a/test/cmdlineTests/linking_qualified_library_name/args +++ b/test/cmdlineTests/linking_qualified_library_name/args @@ -1 +1 @@ -linking_qualified_library_name/contract1.sol --bin --libraries linking_qualified_library_name/math.sol:Log:0x7777777777777777777777777777777777777777 +contract1.sol --bin --libraries math.sol:Log:0x7777777777777777777777777777777777777777 diff --git a/test/cmdlineTests/linking_qualified_library_name/contract1.sol b/test/cmdlineTests/linking_qualified_library_name/contract1.sol index aedea65faaa7..d59420962939 100644 --- a/test/cmdlineTests/linking_qualified_library_name/contract1.sol +++ b/test/cmdlineTests/linking_qualified_library_name/contract1.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.0; -import "linking_qualified_library_name/math.sol"; +import "math.sol"; contract C { function foo() public { diff --git a/test/cmdlineTests/linking_qualified_library_name/output b/test/cmdlineTests/linking_qualified_library_name/output index 834874bf8e87..63359661bcd4 100644 --- a/test/cmdlineTests/linking_qualified_library_name/output +++ b/test/cmdlineTests/linking_qualified_library_name/output @@ -1,8 +1,8 @@ -======= linking_qualified_library_name/contract1.sol:C ======= +======= contract1.sol:C ======= Binary: -======= linking_qualified_library_name/math.sol:Log ======= +======= math.sol:Log ======= Binary: diff --git a/test/cmdlineTests/linking_solidity/args b/test/cmdlineTests/linking_solidity/args index 9a958527fd71..7689b925ae10 100644 --- a/test/cmdlineTests/linking_solidity/args +++ b/test/cmdlineTests/linking_solidity/args @@ -1 +1 @@ ---bin --bin-runtime --libraries linking_solidity/input.sol:L=0x1234567890123456789012345678901234567890 +--bin --bin-runtime --libraries input.sol:L=0x1234567890123456789012345678901234567890 diff --git a/test/cmdlineTests/linking_solidity/output b/test/cmdlineTests/linking_solidity/output index 307b131b5af3..ed60e0ccfc9b 100644 --- a/test/cmdlineTests/linking_solidity/output +++ b/test/cmdlineTests/linking_solidity/output @@ -1,11 +1,11 @@ -======= linking_solidity/input.sol:C ======= +======= input.sol:C ======= Binary: Binary of the runtime part: -======= linking_solidity/input.sol:L ======= +======= input.sol:L ======= Binary: Binary of the runtime part: diff --git a/test/cmdlineTests/linking_solidity_unresolved_references/args b/test/cmdlineTests/linking_solidity_unresolved_references/args index 8909b2779174..fbbed9f870b7 100644 --- a/test/cmdlineTests/linking_solidity_unresolved_references/args +++ b/test/cmdlineTests/linking_solidity_unresolved_references/args @@ -1 +1 @@ ---bin --bin-runtime --libraries linking_solidity_unresolved_references/input.sol:L1=0x1234567890123456789012345678901234567890 +--bin --bin-runtime --libraries input.sol:L1=0x1234567890123456789012345678901234567890 diff --git a/test/cmdlineTests/linking_solidity_unresolved_references/output b/test/cmdlineTests/linking_solidity_unresolved_references/output index f42191f51e0b..5df6611de091 100644 --- a/test/cmdlineTests/linking_solidity_unresolved_references/output +++ b/test/cmdlineTests/linking_solidity_unresolved_references/output @@ -1,23 +1,23 @@ -======= linking_solidity_unresolved_references/input.sol:C ======= +======= input.sol:C ======= Binary: -__$8ef13d1c56d5343bf69cf9444272079aa5$____$8ef13d1c56d5343bf69cf9444272079aa5$__ +__$a7fb54ac3bf4ba657d4a55d066b3521d62$____$a7fb54ac3bf4ba657d4a55d066b3521d62$__ -// $8ef13d1c56d5343bf69cf9444272079aa5$ -> linking_solidity_unresolved_references/input.sol:L2 -// $8ef13d1c56d5343bf69cf9444272079aa5$ -> linking_solidity_unresolved_references/input.sol:L2 +// $a7fb54ac3bf4ba657d4a55d066b3521d62$ -> input.sol:L2 +// $a7fb54ac3bf4ba657d4a55d066b3521d62$ -> input.sol:L2 Binary of the runtime part: -__$8ef13d1c56d5343bf69cf9444272079aa5$____$8ef13d1c56d5343bf69cf9444272079aa5$__ +__$a7fb54ac3bf4ba657d4a55d066b3521d62$____$a7fb54ac3bf4ba657d4a55d066b3521d62$__ -// $8ef13d1c56d5343bf69cf9444272079aa5$ -> linking_solidity_unresolved_references/input.sol:L2 -// $8ef13d1c56d5343bf69cf9444272079aa5$ -> linking_solidity_unresolved_references/input.sol:L2 +// $a7fb54ac3bf4ba657d4a55d066b3521d62$ -> input.sol:L2 +// $a7fb54ac3bf4ba657d4a55d066b3521d62$ -> input.sol:L2 -======= linking_solidity_unresolved_references/input.sol:L1 ======= +======= input.sol:L1 ======= Binary: Binary of the runtime part: -======= linking_solidity_unresolved_references/input.sol:L2 ======= +======= input.sol:L2 ======= Binary: Binary of the runtime part: diff --git a/test/cmdlineTests/linking_strict_assembly/output b/test/cmdlineTests/linking_strict_assembly/output index 4fa6edc0c372..756cc2822d3d 100644 --- a/test/cmdlineTests/linking_strict_assembly/output +++ b/test/cmdlineTests/linking_strict_assembly/output @@ -1,5 +1,5 @@ -======= linking_strict_assembly/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { @@ -16,11 +16,11 @@ Binary representation: 7312345678901234567890123456789012345678905f5500 Text representation: - /* "linking_strict_assembly/input.yul":58:93 */ + /* "input.yul":58:93 */ linkerSymbol("f919ba91ac99f96129544b80b9516b27a80e376b9dc693819d0b18b7e0395612") - /* "linking_strict_assembly/input.yul":113:114 */ + /* "input.yul":113:114 */ 0x00 - /* "linking_strict_assembly/input.yul":106:121 */ + /* "input.yul":106:121 */ sstore - /* "linking_strict_assembly/input.yul":22:137 */ + /* "input.yul":22:137 */ 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 e4fa4fcbd9ab..f347631001b9 100644 --- a/test/cmdlineTests/linking_strict_assembly_qualified_library_qualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_qualified_library_qualified_reference/output @@ -1,5 +1,5 @@ -======= linking_strict_assembly_qualified_library_qualified_reference/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { 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 ebf7f6542c52..d329296eb2c5 100644 --- a/test/cmdlineTests/linking_strict_assembly_qualified_library_unqualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_qualified_library_unqualified_reference/output @@ -1,5 +1,5 @@ -======= linking_strict_assembly_qualified_library_unqualified_reference/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { 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 69c0a21f63c1..f4262400c815 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 @@ -1,5 +1,5 @@ -======= linking_strict_assembly_same_library_name_different_files/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { @@ -18,19 +18,19 @@ Binary representation: 731111111111111111111111111111111111111111732222222222222222222222222222222222222222905f5560015500 Text representation: - /* "linking_strict_assembly_same_library_name_different_files/input.yul":59:89 */ + /* "input.yul":59:89 */ linkerSymbol("f3ffc10c396a7cc41ae954b050792839d20947bf73497d30c49a9fda1ea477ec") - /* "linking_strict_assembly_same_library_name_different_files/input.yul":115:145 */ + /* "input.yul":115:145 */ linkerSymbol("c3523432985587641d17c68161d2f700c57aaf4ed21cda4f25d76193c831f97f") - /* "linking_strict_assembly_same_library_name_different_files/input.yul":158:174 */ + /* "input.yul":158:174 */ swap1 - /* "linking_strict_assembly_same_library_name_different_files/input.yul":165:166 */ + /* "input.yul":165:166 */ 0x00 - /* "linking_strict_assembly_same_library_name_different_files/input.yul":158:174 */ + /* "input.yul":158:174 */ sstore - /* "linking_strict_assembly_same_library_name_different_files/input.yul":194:195 */ + /* "input.yul":194:195 */ 0x01 - /* "linking_strict_assembly_same_library_name_different_files/input.yul":187:203 */ + /* "input.yul":187:203 */ sstore - /* "linking_strict_assembly_same_library_name_different_files/input.yul":22:219 */ + /* "input.yul":22:219 */ 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 14fafa4e4604..a6422d8fbce2 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 @@ -1,5 +1,5 @@ -======= linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { @@ -18,19 +18,19 @@ Binary representation: 73123456789012345678901234567890123456789073__$c3523432985587641d17c68161d2f700c5$__905f5560015500 Text representation: - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":59:89 */ + /* "input.yul":59:89 */ linkerSymbol("f3ffc10c396a7cc41ae954b050792839d20947bf73497d30c49a9fda1ea477ec") - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":115:145 */ + /* "input.yul":115:145 */ linkerSymbol("c3523432985587641d17c68161d2f700c57aaf4ed21cda4f25d76193c831f97f") - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":158:174 */ + /* "input.yul":158:174 */ swap1 - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":165:166 */ + /* "input.yul":165:166 */ 0x00 - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":158:174 */ + /* "input.yul":158:174 */ sstore - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":194:195 */ + /* "input.yul":194:195 */ 0x01 - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":187:203 */ + /* "input.yul":187:203 */ sstore - /* "linking_strict_assembly_same_library_name_different_files_in_link_references/input.yul":22:219 */ + /* "input.yul":22:219 */ 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 aaf03d0733b4..099b0ce54db3 100644 --- a/test/cmdlineTests/linking_strict_assembly_unqualified_library_qualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_unqualified_library_qualified_reference/output @@ -1,5 +1,5 @@ -======= linking_strict_assembly_unqualified_library_qualified_reference/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { 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 d91d89f5ca69..b4bb825435c3 100644 --- a/test/cmdlineTests/linking_strict_assembly_unqualified_library_unqualified_reference/output +++ b/test/cmdlineTests/linking_strict_assembly_unqualified_library_unqualified_reference/output @@ -1,5 +1,5 @@ -======= linking_strict_assembly_unqualified_library_unqualified_reference/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { diff --git a/test/cmdlineTests/linking_strict_assembly_unresolved_references/output b/test/cmdlineTests/linking_strict_assembly_unresolved_references/output index 3b2d84ab3c6b..7b45cae6eb61 100644 --- a/test/cmdlineTests/linking_strict_assembly_unresolved_references/output +++ b/test/cmdlineTests/linking_strict_assembly_unresolved_references/output @@ -1,5 +1,5 @@ -======= linking_strict_assembly_unresolved_references/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { @@ -18,19 +18,19 @@ Binary representation: 73123456789012345678901234567890123456789073__$fb58009a6b1ecea3b9d99bedd645df4ec3$__905f5560015500 Text representation: - /* "linking_strict_assembly_unresolved_references/input.yul":59:95 */ + /* "input.yul":59:95 */ linkerSymbol("05b0326038374a21e0895480a58bda0768cdcc04c8d18f154362d1ca5223d245") - /* "linking_strict_assembly_unresolved_references/input.yul":121:157 */ + /* "input.yul":121:157 */ linkerSymbol("fb58009a6b1ecea3b9d99bedd645df4ec308f17bc0087e5f39d078f77f809177") - /* "linking_strict_assembly_unresolved_references/input.yul":170:186 */ + /* "input.yul":170:186 */ swap1 - /* "linking_strict_assembly_unresolved_references/input.yul":177:178 */ + /* "input.yul":177:178 */ 0x00 - /* "linking_strict_assembly_unresolved_references/input.yul":170:186 */ + /* "input.yul":170:186 */ sstore - /* "linking_strict_assembly_unresolved_references/input.yul":206:207 */ + /* "input.yul":206:207 */ 0x01 - /* "linking_strict_assembly_unresolved_references/input.yul":199:215 */ + /* "input.yul":199:215 */ sstore - /* "linking_strict_assembly_unresolved_references/input.yul":22:231 */ + /* "input.yul":22:231 */ stop diff --git a/test/cmdlineTests/linking_unqualified_library_name/args b/test/cmdlineTests/linking_unqualified_library_name/args index 6118acf02caf..08f3b8cd1c06 100644 --- a/test/cmdlineTests/linking_unqualified_library_name/args +++ b/test/cmdlineTests/linking_unqualified_library_name/args @@ -1 +1 @@ -linking_unqualified_library_name/contract1.sol linking_unqualified_library_name/contract2.sol --bin --libraries Log:0x7777777777777777777777777777777777777777 +contract1.sol contract2.sol --bin --libraries Log:0x7777777777777777777777777777777777777777 diff --git a/test/cmdlineTests/linking_unqualified_library_name/contract1.sol b/test/cmdlineTests/linking_unqualified_library_name/contract1.sol index 38e43f9d493e..893c63af07be 100644 --- a/test/cmdlineTests/linking_unqualified_library_name/contract1.sol +++ b/test/cmdlineTests/linking_unqualified_library_name/contract1.sol @@ -2,7 +2,7 @@ pragma solidity >=0.0; -import "linking_unqualified_library_name/error.sol"; +import "error.sol"; contract C { function foo() public { diff --git a/test/cmdlineTests/linking_unqualified_library_name/contract2.sol b/test/cmdlineTests/linking_unqualified_library_name/contract2.sol index 6ddb8ad6e286..d59420962939 100644 --- a/test/cmdlineTests/linking_unqualified_library_name/contract2.sol +++ b/test/cmdlineTests/linking_unqualified_library_name/contract2.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.0; -import "linking_unqualified_library_name/math.sol"; +import "math.sol"; contract C { function foo() public { diff --git a/test/cmdlineTests/linking_unqualified_library_name/output b/test/cmdlineTests/linking_unqualified_library_name/output index be64a93c9bbc..68e254363fa1 100644 --- a/test/cmdlineTests/linking_unqualified_library_name/output +++ b/test/cmdlineTests/linking_unqualified_library_name/output @@ -1,20 +1,20 @@ -======= linking_unqualified_library_name/contract1.sol:C ======= +======= contract1.sol:C ======= Binary: -__$cdf6d5ab08a9335b02e7c2475aa27d04fa$__ +__$4a937a7d3d68a205b3b2520e23ccff31ea$__ -// $cdf6d5ab08a9335b02e7c2475aa27d04fa$ -> linking_unqualified_library_name/error.sol:Log +// $4a937a7d3d68a205b3b2520e23ccff31ea$ -> error.sol:Log -======= linking_unqualified_library_name/contract2.sol:C ======= +======= contract2.sol:C ======= Binary: -__$22584241c2fc4f2884d5222245463779a8$__ +__$b77e1024bb5d89efefbab5fb1f7cb8fde7$__ -// $22584241c2fc4f2884d5222245463779a8$ -> linking_unqualified_library_name/math.sol:Log +// $b77e1024bb5d89efefbab5fb1f7cb8fde7$ -> math.sol:Log -======= linking_unqualified_library_name/error.sol:Log ======= +======= error.sol:Log ======= Binary: -======= linking_unqualified_library_name/math.sol:Log ======= +======= math.sol:Log ======= Binary: diff --git a/test/cmdlineTests/mcopy_bytes_array_abi_decode/err b/test/cmdlineTests/mcopy_bytes_array_abi_decode/err index de32e66295be..ead85d933e3a 100644 --- a/test/cmdlineTests/mcopy_bytes_array_abi_decode/err +++ b/test/cmdlineTests/mcopy_bytes_array_abi_decode/err @@ -1,5 +1,5 @@ Warning: Statement has no effect. - --> mcopy_bytes_array_abi_decode/input.sol:7:9: + --> input.sol:7:9: | 7 | abi.decode("abcd", (bytes)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/mcopy_bytes_array_abi_decode/output b/test/cmdlineTests/mcopy_bytes_array_abi_decode/output index 2a24ec834fa1..806094f76a15 100644 --- a/test/cmdlineTests/mcopy_bytes_array_abi_decode/output +++ b/test/cmdlineTests/mcopy_bytes_array_abi_decode/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"mcopy_bytes_array_abi_decode/input.sol" +/// @use-src 0:"input.sol" object "C_15" { code { @@ -27,7 +27,7 @@ object "C_15" { } } - /// @use-src 0:"mcopy_bytes_array_abi_decode/input.sol" + /// @use-src 0:"input.sol" object "C_15_deployed" { code { diff --git a/test/cmdlineTests/mcopy_bytes_array_returned_from_function/output b/test/cmdlineTests/mcopy_bytes_array_returned_from_function/output index 170cdf1a7a3a..f3cd766954c5 100644 --- a/test/cmdlineTests/mcopy_bytes_array_returned_from_function/output +++ b/test/cmdlineTests/mcopy_bytes_array_returned_from_function/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"mcopy_bytes_array_returned_from_function/input.sol" +/// @use-src 0:"input.sol" object "C_14" { code { { @@ -11,7 +11,7 @@ object "C_14" { return(_1, _2) } } - /// @use-src 0:"mcopy_bytes_array_returned_from_function/input.sol" + /// @use-src 0:"input.sol" object "C_14_deployed" { code { { diff --git a/test/cmdlineTests/mcopy_string_literal_returned_from_function/output b/test/cmdlineTests/mcopy_string_literal_returned_from_function/output index 548c34de8628..3adeae0f58e6 100644 --- a/test/cmdlineTests/mcopy_string_literal_returned_from_function/output +++ b/test/cmdlineTests/mcopy_string_literal_returned_from_function/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"mcopy_string_literal_returned_from_function/input.sol" +/// @use-src 0:"input.sol" object "C_10" { code { { @@ -11,7 +11,7 @@ object "C_10" { return(_1, _2) } } - /// @use-src 0:"mcopy_string_literal_returned_from_function/input.sol" + /// @use-src 0:"input.sol" object "C_10_deployed" { code { { diff --git a/test/cmdlineTests/memoryguard_shadowing_by_inline_assembly_identifiers/output b/test/cmdlineTests/memoryguard_shadowing_by_inline_assembly_identifiers/output index 842580597d12..1ea3bdf20209 100644 --- a/test/cmdlineTests/memoryguard_shadowing_by_inline_assembly_identifiers/output +++ b/test/cmdlineTests/memoryguard_shadowing_by_inline_assembly_identifiers/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"memoryguard_shadowing_by_inline_assembly_identifiers/input.sol" +/// @use-src 0:"input.sol" object "C_10" { code { @@ -27,7 +27,7 @@ object "C_10" { } } - /// @use-src 0:"memoryguard_shadowing_by_inline_assembly_identifiers/input.sol" + /// @use-src 0:"input.sol" object "C_10_deployed" { code { diff --git a/test/cmdlineTests/message_format/err b/test/cmdlineTests/message_format/err index eee8267e25f3..1bb6a6469273 100644 --- a/test/cmdlineTests/message_format/err +++ b/test/cmdlineTests/message_format/err @@ -1,50 +1,50 @@ Warning: Source file does not specify required compiler version! ---> message_format/input.sol +--> input.sol Warning: Unused local variable. - --> message_format/input.sol:9:27: + --> input.sol:9:27: | 9 | function f() public { int x; } | ^^^^^ Warning: Unused local variable. - --> message_format/input.sol:10:27: + --> input.sol:10:27: | 10 | function g() public { int x; } | ^^^^^ Warning: Unused local variable. - --> message_format/input.sol:99:14: + --> input.sol:99:14: | 99 | /**/ int a; /**/ | ^^^^^ Warning: Unused local variable. - --> message_format/input.sol:100:14: + --> input.sol:100:14: | 100 | /**/ int b; /**/ | ^^^^^ Warning: Unused local variable. - --> message_format/input.sol:101:14: + --> input.sol:101:14: | 101 | /**/ int c; /**/ | ^^^^^ Warning: Function state mutability can be restricted to pure - --> message_format/input.sol:9:5: + --> input.sol:9:5: | 9 | function f() public { int x; } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Function state mutability can be restricted to pure - --> message_format/input.sol:10:5: + --> input.sol:10:5: | 10 | function g() public { int x; } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning: Function state mutability can be restricted to pure - --> message_format/input.sol:11:5: + --> input.sol:11:5: | 11 | function h() public { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/message_format_utf8/err b/test/cmdlineTests/message_format_utf8/err index 58d45127cb3d..e14a048fc54b 100644 --- a/test/cmdlineTests/message_format_utf8/err +++ b/test/cmdlineTests/message_format_utf8/err @@ -1,29 +1,29 @@ Warning: Statement has no effect. - --> message_format_utf8/input.sol:5:51: + --> input.sol:5:51: | 5 | /* ©©©©ᄅ©©©©© 2017 */ constructor () { unicode"©©©©ᄅ©©©©©" ; } | ^^^^^^^^^^^^^^^^^^^ Warning: Statement has no effect. - --> message_format_utf8/input.sol:9:25: + --> input.sol:9:25: | 9 | unicode"S = π × r²"; | ^^^^^^^^^^^^^^^^^^^ Warning: Statement has no effect. - --> message_format_utf8/input.sol:10:39: + --> input.sol:10:39: | 10 | /* ₀₁₂₃₄⁵⁶⁷⁸⁹ */ unicode"∑ 1/n! ≈ 2.7"; // tabs in-between | ^^^^^^^^^^^^^^^^^^^^^ Warning: Statement has no effect. - --> message_format_utf8/input.sol:11:30: + --> input.sol:11:30: | 11 | /* Ŀŏŗėɯ ïƥŝʉɱ */ unicode"μὴ χεῖρον βέλτιστον"; // tabs in-between and inside | ^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^ Warning: Function state mutability can be restricted to pure - --> message_format_utf8/input.sol:15:2: + --> input.sol:15:2: | 15 | function selector() public returns(uint) { // starts with tab | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/metadata/output b/test/cmdlineTests/metadata/output index b6a684b844f3..0910128894df 100644 --- a/test/cmdlineTests/metadata/output +++ b/test/cmdlineTests/metadata/output @@ -1,4 +1,4 @@ -======= metadata/input.sol:C ======= +======= 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":"cancun","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} +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0x5cf617b1707a484e3c4bd59643013dec76ab7d75900b46855214729ae3e0ceb0","license":"GPL-3.0","urls":["bzz-raw://ac418a02dfadf87234150d3568f33269e3f49460345cb39300e017a6d755eff2","dweb:/ipfs/QmQq3owBu25x2WV46HB1WyKzJpxiAPecU7eMKqtXCF7eeS"]}},"version":1} diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations/err b/test/cmdlineTests/model_checker_bmc_loop_iterations/err index cbb2b0f9daca..0ec7a09b6d3c 100644 --- a/test/cmdlineTests/model_checker_bmc_loop_iterations/err +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations/err @@ -1,5 +1,5 @@ Warning: BMC: Assertion violation happens here. - --> model_checker_bmc_loop_iterations/input.sol:10:3: + --> input.sol:10:3: | 10 | assert(x == 3); | ^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err index 1bd45b6c6f57..4b1a2ea3b1fd 100644 --- a/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err +++ b/test/cmdlineTests/model_checker_bmc_loop_iterations_no_argument/err @@ -1 +1 @@ -Error: the argument ('model_checker_bmc_loop_iterations_no_argument/input.sol') for option '--model-checker-bmc-loop-iterations' is invalid +Error: the argument ('input.sol') for option '--model-checker-bmc-loop-iterations' is invalid diff --git a/test/cmdlineTests/model_checker_contracts_all/err b/test/cmdlineTests/model_checker_contracts_all/err index 9135483d5f79..0d19af174c39 100644 --- a/test/cmdlineTests/model_checker_contracts_all/err +++ b/test/cmdlineTests/model_checker_contracts_all/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: B.constructor() B.f(0) - --> model_checker_contracts_all/input.sol:5:9: + --> input.sol:5:9: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -19,7 +19,7 @@ y = 0 Transaction trace: A.constructor() A.g(0) - --> model_checker_contracts_all/input.sol:10:9: + --> input.sol:10:9: | 10 | assert(y > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_contracts_all_explicit/args b/test/cmdlineTests/model_checker_contracts_all_explicit/args index 6e6bee97aed8..151a636fe265 100644 --- a/test/cmdlineTests/model_checker_contracts_all_explicit/args +++ b/test/cmdlineTests/model_checker_contracts_all_explicit/args @@ -1 +1 @@ ---model-checker-engine all --model-checker-contracts model_checker_contracts_all_explicit/input.sol:B,model_checker_contracts_all_explicit/input.sol:A +--model-checker-engine all --model-checker-contracts input.sol:B,input.sol:A diff --git a/test/cmdlineTests/model_checker_contracts_all_explicit/err b/test/cmdlineTests/model_checker_contracts_all_explicit/err index 003c0dffe018..25ce2e5e9947 100644 --- a/test/cmdlineTests/model_checker_contracts_all_explicit/err +++ b/test/cmdlineTests/model_checker_contracts_all_explicit/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: B.constructor() B.f(0) - --> model_checker_contracts_all_explicit/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -19,7 +19,7 @@ y = 0 Transaction trace: A.constructor() A.g(0) - --> model_checker_contracts_all_explicit/input.sol:10:3: + --> input.sol:10:3: | 10 | assert(y > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_contracts_inexistent_contract/args b/test/cmdlineTests/model_checker_contracts_inexistent_contract/args index b3c44af85b87..1128064d8a59 100644 --- a/test/cmdlineTests/model_checker_contracts_inexistent_contract/args +++ b/test/cmdlineTests/model_checker_contracts_inexistent_contract/args @@ -1 +1 @@ ---model-checker-engine all --model-checker-contracts model_checker_contracts_inexistent_contract/input.sol:C +--model-checker-engine all --model-checker-contracts input.sol:C diff --git a/test/cmdlineTests/model_checker_contracts_inexistent_contract/err b/test/cmdlineTests/model_checker_contracts_inexistent_contract/err index 6326537e928c..72f613bf3ccd 100644 --- a/test/cmdlineTests/model_checker_contracts_inexistent_contract/err +++ b/test/cmdlineTests/model_checker_contracts_inexistent_contract/err @@ -1 +1 @@ -Warning: Requested contract "C" does not exist in source "model_checker_contracts_inexistent_contract/input.sol". +Warning: Requested contract "C" does not exist in source "input.sol". diff --git a/test/cmdlineTests/model_checker_contracts_inexistent_source/args b/test/cmdlineTests/model_checker_contracts_inexistent_source/args index 6d91ecc34355..b98256bf4e9b 100644 --- a/test/cmdlineTests/model_checker_contracts_inexistent_source/args +++ b/test/cmdlineTests/model_checker_contracts_inexistent_source/args @@ -1 +1 @@ ---model-checker-engine all --model-checker-contracts model_checker_contracts_inexistent_source/A.sol:A +--model-checker-engine all --model-checker-contracts A.sol:A diff --git a/test/cmdlineTests/model_checker_contracts_inexistent_source/err b/test/cmdlineTests/model_checker_contracts_inexistent_source/err index 218588ad83d2..3c93482595f5 100644 --- a/test/cmdlineTests/model_checker_contracts_inexistent_source/err +++ b/test/cmdlineTests/model_checker_contracts_inexistent_source/err @@ -1 +1 @@ -Warning: Requested source "model_checker_contracts_inexistent_source/A.sol" does not exist. +Warning: Requested source "A.sol" does not exist. diff --git a/test/cmdlineTests/model_checker_contracts_one_contract_missing/args b/test/cmdlineTests/model_checker_contracts_one_contract_missing/args index 7ea3d3f04610..8670db9b57a9 100644 --- a/test/cmdlineTests/model_checker_contracts_one_contract_missing/args +++ b/test/cmdlineTests/model_checker_contracts_one_contract_missing/args @@ -1 +1 @@ ---model-checker-engine all --model-checker-contracts model_checker_contracts_all_explicit/input.sol:,model_checker_contracts_all_explicit/input.sol:A +--model-checker-engine all --model-checker-contracts input.sol:,input.sol:A diff --git a/test/cmdlineTests/model_checker_contracts_one_contract_missing/err b/test/cmdlineTests/model_checker_contracts_one_contract_missing/err index d4e93bcd705e..88e675624e2f 100644 --- a/test/cmdlineTests/model_checker_contracts_one_contract_missing/err +++ b/test/cmdlineTests/model_checker_contracts_one_contract_missing/err @@ -1 +1 @@ -Error: Invalid option for --model-checker-contracts: model_checker_contracts_all_explicit/input.sol:,model_checker_contracts_all_explicit/input.sol:A +Error: Invalid option for --model-checker-contracts: input.sol:,input.sol:A diff --git a/test/cmdlineTests/model_checker_contracts_only_one/args b/test/cmdlineTests/model_checker_contracts_only_one/args index ae76a81d6735..ff3ad9e1d4fe 100644 --- a/test/cmdlineTests/model_checker_contracts_only_one/args +++ b/test/cmdlineTests/model_checker_contracts_only_one/args @@ -1 +1 @@ ---model-checker-engine all --model-checker-contracts model_checker_contracts_only_one/input.sol:A +--model-checker-engine all --model-checker-contracts input.sol:A diff --git a/test/cmdlineTests/model_checker_contracts_only_one/err b/test/cmdlineTests/model_checker_contracts_only_one/err index 9c8ade6931c3..4472abefaf32 100644 --- a/test/cmdlineTests/model_checker_contracts_only_one/err +++ b/test/cmdlineTests/model_checker_contracts_only_one/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: A.constructor() B.f(0) - --> model_checker_contracts_only_one/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -19,7 +19,7 @@ y = 0 Transaction trace: A.constructor() A.g(0) - --> model_checker_contracts_only_one/input.sol:10:3: + --> input.sol:10:3: | 10 | assert(y > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_engine_all/err b/test/cmdlineTests/model_checker_engine_all/err index 12614fd55f82..18b8774650b9 100644 --- a/test/cmdlineTests/model_checker_engine_all/err +++ b/test/cmdlineTests/model_checker_engine_all/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: test.constructor() test.f(0) - --> model_checker_engine_all/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_engine_bmc/err b/test/cmdlineTests/model_checker_engine_bmc/err index ed46539d6510..dcedef48bf09 100644 --- a/test/cmdlineTests/model_checker_engine_bmc/err +++ b/test/cmdlineTests/model_checker_engine_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Assertion violation happens here. - --> model_checker_engine_bmc/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_engine_chc/err b/test/cmdlineTests/model_checker_engine_chc/err index 95198fa2027a..18b8774650b9 100644 --- a/test/cmdlineTests/model_checker_engine_chc/err +++ b/test/cmdlineTests/model_checker_engine_chc/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: test.constructor() test.f(0) - --> model_checker_engine_chc/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_ext_calls_trusted_chc/err b/test/cmdlineTests/model_checker_ext_calls_trusted_chc/err index e9c2d70a9739..58be5002f2d1 100644 --- a/test/cmdlineTests/model_checker_ext_calls_trusted_chc/err +++ b/test/cmdlineTests/model_checker_ext_calls_trusted_chc/err @@ -1,5 +1,5 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_ext_calls_trusted_chc/input.sol:5:2: + --> input.sol:5:2: | 5 | function f() public view returns (uint) { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/model_checker_ext_calls_untrusted_chc/err b/test/cmdlineTests/model_checker_ext_calls_untrusted_chc/err index b06333e43bd5..73b355510e2f 100644 --- a/test/cmdlineTests/model_checker_ext_calls_untrusted_chc/err +++ b/test/cmdlineTests/model_checker_ext_calls_untrusted_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() test.g(0) e.f() -- untrusted external call - --> model_checker_ext_calls_untrusted_chc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x == 0); | ^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_invariants_all/err b/test/cmdlineTests/model_checker_invariants_all/err index dcef00b5fd0e..b47334040b61 100644 --- a/test/cmdlineTests/model_checker_invariants_all/err +++ b/test/cmdlineTests/model_checker_invariants_all/err @@ -1,8 +1,8 @@ Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -Info: Contract invariant(s) for model_checker_invariants_all/input.sol:test: +Info: Contract invariant(s) for input.sol:test: (true || !(x >= 1)) -Reentrancy property(ies) for model_checker_invariants_all/input.sol:test: +Reentrancy property(ies) for input.sol:test: ((( = 0) && (x!6 = x!4) && (x' = x)) || true || true || true || true) = 0 -> no errors = 1 -> Assertion failed at assert(x == 0) diff --git a/test/cmdlineTests/model_checker_invariants_contract/err b/test/cmdlineTests/model_checker_invariants_contract/err index 3ecad6b35d48..2ea993088670 100644 --- a/test/cmdlineTests/model_checker_invariants_contract/err +++ b/test/cmdlineTests/model_checker_invariants_contract/err @@ -1,4 +1,4 @@ Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -Info: Contract invariant(s) for model_checker_invariants_contract/input.sol:test: +Info: Contract invariant(s) for input.sol:test: (true || !(x >= 1)) diff --git a/test/cmdlineTests/model_checker_invariants_contract_eld/err b/test/cmdlineTests/model_checker_invariants_contract_eld/err index 29c5a5bc8eae..4dc823ec8880 100644 --- a/test/cmdlineTests/model_checker_invariants_contract_eld/err +++ b/test/cmdlineTests/model_checker_invariants_contract_eld/err @@ -1,4 +1,4 @@ Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -Info: Contract invariant(s) for model_checker_invariants_contract_eld/input.sol:test: +Info: Contract invariant(s) for input.sol:test: (x = 0) diff --git a/test/cmdlineTests/model_checker_invariants_contract_reentrancy/err b/test/cmdlineTests/model_checker_invariants_contract_reentrancy/err index 7764e89abc59..b47334040b61 100644 --- a/test/cmdlineTests/model_checker_invariants_contract_reentrancy/err +++ b/test/cmdlineTests/model_checker_invariants_contract_reentrancy/err @@ -1,8 +1,8 @@ Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -Info: Contract invariant(s) for model_checker_invariants_contract_reentrancy/input.sol:test: +Info: Contract invariant(s) for input.sol:test: (true || !(x >= 1)) -Reentrancy property(ies) for model_checker_invariants_contract_reentrancy/input.sol:test: +Reentrancy property(ies) for input.sol:test: ((( = 0) && (x!6 = x!4) && (x' = x)) || true || true || true || true) = 0 -> no errors = 1 -> Assertion failed at assert(x == 0) diff --git a/test/cmdlineTests/model_checker_invariants_reentrancy/err b/test/cmdlineTests/model_checker_invariants_reentrancy/err index 8891b0e18c59..42ac3ca73311 100644 --- a/test/cmdlineTests/model_checker_invariants_reentrancy/err +++ b/test/cmdlineTests/model_checker_invariants_reentrancy/err @@ -1,6 +1,6 @@ Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. -Info: Reentrancy property(ies) for model_checker_invariants_reentrancy/input.sol:test: +Info: Reentrancy property(ies) for input.sol:test: ((( = 0) && (x!6 = x!4) && (x' = x)) || true || true || true || true) = 0 -> no errors = 1 -> Assertion failed at assert(x == 0) diff --git a/test/cmdlineTests/model_checker_show_proved_safe_default_all_engines/err b/test/cmdlineTests/model_checker_show_proved_safe_default_all_engines/err index b896b21bc7f9..730e43b9588e 100644 --- a/test/cmdlineTests/model_checker_show_proved_safe_default_all_engines/err +++ b/test/cmdlineTests/model_checker_show_proved_safe_default_all_engines/err @@ -1,5 +1,5 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_show_proved_safe_default_all_engines/input.sol:4:5: + --> input.sol:4:5: | 4 | function f(uint8 x) public { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/model_checker_show_proved_safe_default_bmc/err b/test/cmdlineTests/model_checker_show_proved_safe_default_bmc/err index f4a2d33e053b..7146c519260c 100644 --- a/test/cmdlineTests/model_checker_show_proved_safe_default_bmc/err +++ b/test/cmdlineTests/model_checker_show_proved_safe_default_bmc/err @@ -1,5 +1,5 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_show_proved_safe_default_bmc/input.sol:4:5: + --> input.sol:4:5: | 4 | function f(uint8 x) public { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/model_checker_show_proved_safe_default_chc/err b/test/cmdlineTests/model_checker_show_proved_safe_default_chc/err index ab73c6bf56cd..730e43b9588e 100644 --- a/test/cmdlineTests/model_checker_show_proved_safe_default_chc/err +++ b/test/cmdlineTests/model_checker_show_proved_safe_default_chc/err @@ -1,5 +1,5 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_show_proved_safe_default_chc/input.sol:4:5: + --> input.sol:4:5: | 4 | function f(uint8 x) public { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/model_checker_show_proved_safe_true_all_engines/err b/test/cmdlineTests/model_checker_show_proved_safe_true_all_engines/err index 297eb497a34d..d45cd29d3f6d 100644 --- a/test/cmdlineTests/model_checker_show_proved_safe_true_all_engines/err +++ b/test/cmdlineTests/model_checker_show_proved_safe_true_all_engines/err @@ -1,17 +1,17 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_show_proved_safe_true_all_engines/input.sol:4:5: + --> input.sol:4:5: | 4 | function f(uint8 x) public { | ^ (Relevant source part starts here and spans across multiple lines). Info: CHC: Assertion violation check is safe! - --> model_checker_show_proved_safe_true_all_engines/input.sol:5:9: + --> input.sol:5:9: | 5 | assert(x >= 0); | ^^^^^^^^^^^^^^ Info: CHC: Assertion violation check is safe! - --> model_checker_show_proved_safe_true_all_engines/input.sol:6:9: + --> input.sol:6:9: | 6 | assert(x < 1000); | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_proved_safe_true_bmc/err b/test/cmdlineTests/model_checker_show_proved_safe_true_bmc/err index bcec557f61ae..6bcf720faef7 100644 --- a/test/cmdlineTests/model_checker_show_proved_safe_true_bmc/err +++ b/test/cmdlineTests/model_checker_show_proved_safe_true_bmc/err @@ -1,17 +1,17 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_show_proved_safe_true_bmc/input.sol:4:5: + --> input.sol:4:5: | 4 | function f(uint8 x) public { | ^ (Relevant source part starts here and spans across multiple lines). Info: BMC: Assertion violation check is safe! - --> model_checker_show_proved_safe_true_bmc/input.sol:5:9: + --> input.sol:5:9: | 5 | assert(x >= 0); | ^^^^^^^^^^^^^^ Info: BMC: Assertion violation check is safe! - --> model_checker_show_proved_safe_true_bmc/input.sol:6:9: + --> input.sol:6:9: | 6 | assert(x < 1000); | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_proved_safe_true_chc/err b/test/cmdlineTests/model_checker_show_proved_safe_true_chc/err index fc14f494676f..d45cd29d3f6d 100644 --- a/test/cmdlineTests/model_checker_show_proved_safe_true_chc/err +++ b/test/cmdlineTests/model_checker_show_proved_safe_true_chc/err @@ -1,17 +1,17 @@ Warning: Function state mutability can be restricted to pure - --> model_checker_show_proved_safe_true_chc/input.sol:4:5: + --> input.sol:4:5: | 4 | function f(uint8 x) public { | ^ (Relevant source part starts here and spans across multiple lines). Info: CHC: Assertion violation check is safe! - --> model_checker_show_proved_safe_true_chc/input.sol:5:9: + --> input.sol:5:9: | 5 | assert(x >= 0); | ^^^^^^^^^^^^^^ Info: CHC: Assertion violation check is safe! - --> model_checker_show_proved_safe_true_chc/input.sol:6:9: + --> input.sol:6:9: | 6 | assert(x < 1000); | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_unproved_true_all_engines/err b/test/cmdlineTests/model_checker_show_unproved_true_all_engines/err index 7a338f614952..18f317ac8c85 100644 --- a/test/cmdlineTests/model_checker_show_unproved_true_all_engines/err +++ b/test/cmdlineTests/model_checker_show_unproved_true_all_engines/err @@ -1,5 +1,5 @@ Warning: CHC: Assertion violation might happen here. - --> model_checker_show_unproved_true_all_engines/input.sol:10:9: + --> input.sol:10:9: | 10 | assert(s.x > 0); | ^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_unproved_true_chc/err b/test/cmdlineTests/model_checker_show_unproved_true_chc/err index 8274f4b463f2..e68e08677316 100644 --- a/test/cmdlineTests/model_checker_show_unproved_true_chc/err +++ b/test/cmdlineTests/model_checker_show_unproved_true_chc/err @@ -1,5 +1,5 @@ Warning: CHC: Assertion violation might happen here. - --> model_checker_show_unproved_true_chc/input.sol:10:9: + --> input.sol:10:9: | 10 | assert(s.x > 0); | ^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_unsupported_true_all_engines/err b/test/cmdlineTests/model_checker_show_unsupported_true_all_engines/err index 53c664ffc764..681a5995649d 100644 --- a/test/cmdlineTests/model_checker_show_unsupported_true_all_engines/err +++ b/test/cmdlineTests/model_checker_show_unsupported_true_all_engines/err @@ -1,5 +1,5 @@ Warning: Inline assembly may cause SMTChecker to produce spurious warnings (false positives). - --> model_checker_show_unsupported_true_all_engines/input.sol:5:9: + --> input.sol:5:9: | 5 | assembly {} | ^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_unsupported_true_bmc/err b/test/cmdlineTests/model_checker_show_unsupported_true_bmc/err index 013a7b0f118c..681a5995649d 100644 --- a/test/cmdlineTests/model_checker_show_unsupported_true_bmc/err +++ b/test/cmdlineTests/model_checker_show_unsupported_true_bmc/err @@ -1,5 +1,5 @@ Warning: Inline assembly may cause SMTChecker to produce spurious warnings (false positives). - --> model_checker_show_unsupported_true_bmc/input.sol:5:9: + --> input.sol:5:9: | 5 | assembly {} | ^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_show_unsupported_true_chc/err b/test/cmdlineTests/model_checker_show_unsupported_true_chc/err index 8dad0cc65bce..681a5995649d 100644 --- a/test/cmdlineTests/model_checker_show_unsupported_true_chc/err +++ b/test/cmdlineTests/model_checker_show_unsupported_true_chc/err @@ -1,5 +1,5 @@ Warning: Inline assembly may cause SMTChecker to produce spurious warnings (false positives). - --> model_checker_show_unsupported_true_chc/input.sol:5:9: + --> input.sol:5:9: | 5 | assembly {} | ^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_solvers_cvc5/err b/test/cmdlineTests/model_checker_solvers_cvc5/err index 1c36b103a65d..dcedef48bf09 100644 --- a/test/cmdlineTests/model_checker_solvers_cvc5/err +++ b/test/cmdlineTests/model_checker_solvers_cvc5/err @@ -1,5 +1,5 @@ Warning: BMC: Assertion violation happens here. - --> model_checker_solvers_cvc5/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_solvers_cvc5_eld/err b/test/cmdlineTests/model_checker_solvers_cvc5_eld/err index 81a9f3a56342..b2cb662706f2 100644 --- a/test/cmdlineTests/model_checker_solvers_cvc5_eld/err +++ b/test/cmdlineTests/model_checker_solvers_cvc5_eld/err @@ -1,7 +1,7 @@ Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. Warning: BMC: Condition is always false. - --> model_checker_solvers_cvc5_eld/input.sol:6:7: + --> input.sol:6:7: | 6 | if (y == 0) | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_solvers_eld/err b/test/cmdlineTests/model_checker_solvers_eld/err index ff7ad37b313e..460764a0e997 100644 --- a/test/cmdlineTests/model_checker_solvers_eld/err +++ b/test/cmdlineTests/model_checker_solvers_eld/err @@ -1,5 +1,5 @@ Warning: CHC: Assertion violation happens here. - --> model_checker_solvers_eld/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_solvers_z3/err b/test/cmdlineTests/model_checker_solvers_z3/err index 67349d8e17fe..18b8774650b9 100644 --- a/test/cmdlineTests/model_checker_solvers_z3/err +++ b/test/cmdlineTests/model_checker_solvers_z3/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: test.constructor() test.f(0) - --> model_checker_solvers_z3/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_solvers_z3_implicit/err b/test/cmdlineTests/model_checker_solvers_z3_implicit/err index 98d61828d9c1..18b8774650b9 100644 --- a/test/cmdlineTests/model_checker_solvers_z3_implicit/err +++ b/test/cmdlineTests/model_checker_solvers_z3_implicit/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: test.constructor() test.f(0) - --> model_checker_solvers_z3_implicit/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_solvers_z3_smtlib2/err b/test/cmdlineTests/model_checker_solvers_z3_smtlib2/err index 5699afcdeb3a..18b8774650b9 100644 --- a/test/cmdlineTests/model_checker_solvers_z3_smtlib2/err +++ b/test/cmdlineTests/model_checker_solvers_z3_smtlib2/err @@ -6,7 +6,7 @@ x = 0 Transaction trace: test.constructor() test.f(0) - --> model_checker_solvers_z3_smtlib2/input.sol:5:3: + --> input.sol:5:3: | 5 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_all_all_engines/err b/test/cmdlineTests/model_checker_targets_all_all_engines/err index c67d97b61216..e095ba263c5a 100644 --- a/test/cmdlineTests/model_checker_targets_all_all_engines/err +++ b/test/cmdlineTests/model_checker_targets_all_all_engines/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 0) - --> model_checker_targets_all_all_engines/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -23,7 +23,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 2) - --> model_checker_targets_all_all_engines/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ @@ -38,7 +38,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_all_engines/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ @@ -53,7 +53,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_all_engines/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -68,7 +68,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_all_engines/input.sol:12:3: + --> input.sol:12:3: | 12 | arr.pop(); | ^^^^^^^^^ @@ -83,7 +83,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_all_engines/input.sol:13:3: + --> input.sol:13:3: | 13 | arr[x]; | ^^^^^^ @@ -91,7 +91,7 @@ test.f(0x0, 1) Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. Warning: BMC: Condition is always true. - --> model_checker_targets_all_all_engines/input.sol:6:11: + --> input.sol:6:11: | 6 | require(x >= 0); | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_all_bmc/err b/test/cmdlineTests/model_checker_targets_all_bmc/err index 27a51a67bd63..3887cc6b2a7f 100644 --- a/test/cmdlineTests/model_checker_targets_all_bmc/err +++ b/test/cmdlineTests/model_checker_targets_all_bmc/err @@ -1,12 +1,12 @@ Warning: BMC: Condition is always true. - --> model_checker_targets_all_bmc/input.sol:6:11: + --> input.sol:6:11: | 6 | require(x >= 0); | ^^^^^^ Note: Callstack: Warning: BMC: Underflow (resulting value less than 0) happens here. - --> model_checker_targets_all_bmc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -19,7 +19,7 @@ Note: Callstack: Note: Warning: BMC: Overflow (resulting value larger than 2**256 - 1) happens here. - --> model_checker_targets_all_bmc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ @@ -32,7 +32,7 @@ Note: Callstack: Note: Warning: BMC: Division by zero happens here. - --> model_checker_targets_all_bmc/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ @@ -45,7 +45,7 @@ Note: Callstack: Note: Warning: BMC: Insufficient funds happens here. - --> model_checker_targets_all_bmc/input.sol:10:3: + --> input.sol:10:3: | 10 | a.transfer(x); | ^^^^^^^^^^^^^ @@ -57,7 +57,7 @@ Note: Callstack: Note: Warning: BMC: Assertion violation happens here. - --> model_checker_targets_all_bmc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_all_chc/err b/test/cmdlineTests/model_checker_targets_all_chc/err index 9c257cefe9eb..c3853983af72 100644 --- a/test/cmdlineTests/model_checker_targets_all_chc/err +++ b/test/cmdlineTests/model_checker_targets_all_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 0) - --> model_checker_targets_all_chc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -23,7 +23,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 2) - --> model_checker_targets_all_chc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ @@ -38,7 +38,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_chc/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ @@ -53,7 +53,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_chc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -68,7 +68,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_chc/input.sol:12:3: + --> input.sol:12:3: | 12 | arr.pop(); | ^^^^^^^^^ @@ -83,7 +83,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_all_chc/input.sol:13:3: + --> input.sol:13:3: | 13 | arr[x]; | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_assert_bmc/err b/test/cmdlineTests/model_checker_targets_assert_bmc/err index 90486bf792d9..27395c9dc507 100644 --- a/test/cmdlineTests/model_checker_targets_assert_bmc/err +++ b/test/cmdlineTests/model_checker_targets_assert_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Assertion violation happens here. - --> model_checker_targets_assert_bmc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_assert_chc/err b/test/cmdlineTests/model_checker_targets_assert_chc/err index 1bf48bfa9abb..ada7c3d3dc90 100644 --- a/test/cmdlineTests/model_checker_targets_assert_chc/err +++ b/test/cmdlineTests/model_checker_targets_assert_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_assert_chc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_balance_bmc/err b/test/cmdlineTests/model_checker_targets_balance_bmc/err index 39a8aac56df7..178bd66620bd 100644 --- a/test/cmdlineTests/model_checker_targets_balance_bmc/err +++ b/test/cmdlineTests/model_checker_targets_balance_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Insufficient funds happens here. - --> model_checker_targets_balance_bmc/input.sol:10:3: + --> input.sol:10:3: | 10 | a.transfer(x); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_constant_condition_bmc/err b/test/cmdlineTests/model_checker_targets_constant_condition_bmc/err index 6a376dd7ea5b..a7228dd768e8 100644 --- a/test/cmdlineTests/model_checker_targets_constant_condition_bmc/err +++ b/test/cmdlineTests/model_checker_targets_constant_condition_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Condition is always true. - --> model_checker_targets_constant_condition_bmc/input.sol:6:11: + --> input.sol:6:11: | 6 | require(x >= 0); | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_default_all_engines/err b/test/cmdlineTests/model_checker_targets_default_all_engines/err index 62d3b203cb9c..58cbc01f1436 100644 --- a/test/cmdlineTests/model_checker_targets_default_all_engines/err +++ b/test/cmdlineTests/model_checker_targets_default_all_engines/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_all_engines/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ @@ -23,7 +23,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_all_engines/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -38,7 +38,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_all_engines/input.sol:12:3: + --> input.sol:12:3: | 12 | arr.pop(); | ^^^^^^^^^ @@ -53,7 +53,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_all_engines/input.sol:13:3: + --> input.sol:13:3: | 13 | arr[x]; | ^^^^^^ @@ -61,7 +61,7 @@ test.f(0x0, 1) Info: CHC: 1 verification condition(s) proved safe! Enable the model checker option "show proved safe" to see all of them. Warning: BMC: Condition is always true. - --> model_checker_targets_default_all_engines/input.sol:6:11: + --> input.sol:6:11: | 6 | require(x >= 0); | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_default_bmc/err b/test/cmdlineTests/model_checker_targets_default_bmc/err index 1122be36b061..bc85e3cb4acc 100644 --- a/test/cmdlineTests/model_checker_targets_default_bmc/err +++ b/test/cmdlineTests/model_checker_targets_default_bmc/err @@ -1,12 +1,12 @@ Warning: BMC: Condition is always true. - --> model_checker_targets_default_bmc/input.sol:6:11: + --> input.sol:6:11: | 6 | require(x >= 0); | ^^^^^^ Note: Callstack: Warning: BMC: Division by zero happens here. - --> model_checker_targets_default_bmc/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ @@ -19,7 +19,7 @@ Note: Callstack: Note: Warning: BMC: Insufficient funds happens here. - --> model_checker_targets_default_bmc/input.sol:10:3: + --> input.sol:10:3: | 10 | a.transfer(x); | ^^^^^^^^^^^^^ @@ -31,7 +31,7 @@ Note: Callstack: Note: Warning: BMC: Assertion violation happens here. - --> model_checker_targets_default_bmc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_default_chc/err b/test/cmdlineTests/model_checker_targets_default_chc/err index 70f3c5bc6072..e8b7382168ac 100644 --- a/test/cmdlineTests/model_checker_targets_default_chc/err +++ b/test/cmdlineTests/model_checker_targets_default_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_chc/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ @@ -23,7 +23,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_chc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ @@ -38,7 +38,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_chc/input.sol:12:3: + --> input.sol:12:3: | 12 | arr.pop(); | ^^^^^^^^^ @@ -53,7 +53,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_default_chc/input.sol:13:3: + --> input.sol:13:3: | 13 | arr[x]; | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_div_by_zero_bmc/err b/test/cmdlineTests/model_checker_targets_div_by_zero_bmc/err index bcf2c0c83a18..2d554ebceb7d 100644 --- a/test/cmdlineTests/model_checker_targets_div_by_zero_bmc/err +++ b/test/cmdlineTests/model_checker_targets_div_by_zero_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Division by zero happens here. - --> model_checker_targets_div_by_zero_bmc/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_div_by_zero_chc/err b/test/cmdlineTests/model_checker_targets_div_by_zero_chc/err index 3156dd90bd3f..81616b3bedab 100644 --- a/test/cmdlineTests/model_checker_targets_div_by_zero_chc/err +++ b/test/cmdlineTests/model_checker_targets_div_by_zero_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_div_by_zero_chc/input.sol:9:3: + --> input.sol:9:3: | 9 | 2 / x; | ^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_out_of_bounds_chc/err b/test/cmdlineTests/model_checker_targets_out_of_bounds_chc/err index b4426a80e351..907a19f1e11a 100644 --- a/test/cmdlineTests/model_checker_targets_out_of_bounds_chc/err +++ b/test/cmdlineTests/model_checker_targets_out_of_bounds_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_out_of_bounds_chc/input.sol:13:3: + --> input.sol:13:3: | 13 | arr[x]; | ^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_overflow_bmc/err b/test/cmdlineTests/model_checker_targets_overflow_bmc/err index f2f475c304e8..a0f9ff1e07a9 100644 --- a/test/cmdlineTests/model_checker_targets_overflow_bmc/err +++ b/test/cmdlineTests/model_checker_targets_overflow_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Overflow (resulting value larger than 2**256 - 1) happens here. - --> model_checker_targets_overflow_bmc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_overflow_chc/err b/test/cmdlineTests/model_checker_targets_overflow_chc/err index e7f98ff4dc7a..60298f02285a 100644 --- a/test/cmdlineTests/model_checker_targets_overflow_chc/err +++ b/test/cmdlineTests/model_checker_targets_overflow_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 2) - --> model_checker_targets_overflow_chc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_pop_empty_chc/err b/test/cmdlineTests/model_checker_targets_pop_empty_chc/err index d3478a700420..a01248775704 100644 --- a/test/cmdlineTests/model_checker_targets_pop_empty_chc/err +++ b/test/cmdlineTests/model_checker_targets_pop_empty_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_pop_empty_chc/input.sol:12:3: + --> input.sol:12:3: | 12 | arr.pop(); | ^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_underflow_bmc/err b/test/cmdlineTests/model_checker_targets_underflow_bmc/err index 2162bec3aac9..db14639238c6 100644 --- a/test/cmdlineTests/model_checker_targets_underflow_bmc/err +++ b/test/cmdlineTests/model_checker_targets_underflow_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Underflow (resulting value less than 0) happens here. - --> model_checker_targets_underflow_bmc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ diff --git a/test/cmdlineTests/model_checker_targets_underflow_chc/err b/test/cmdlineTests/model_checker_targets_underflow_chc/err index 448b0e25ca7c..57c6649a40f4 100644 --- a/test/cmdlineTests/model_checker_targets_underflow_chc/err +++ b/test/cmdlineTests/model_checker_targets_underflow_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 0) - --> model_checker_targets_underflow_chc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ diff --git a/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_bmc/err b/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_bmc/err index 9712b8cb7614..670b064ce183 100644 --- a/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_bmc/err +++ b/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Underflow (resulting value less than 0) happens here. - --> model_checker_targets_underflow_overflow_assert_bmc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -12,7 +12,7 @@ Note: Callstack: Note: Warning: BMC: Overflow (resulting value larger than 2**256 - 1) happens here. - --> model_checker_targets_underflow_overflow_assert_bmc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ @@ -25,7 +25,7 @@ Note: Callstack: Note: Warning: BMC: Assertion violation happens here. - --> model_checker_targets_underflow_overflow_assert_bmc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_chc/err b/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_chc/err index a0fbbe61a543..4602e76006dc 100644 --- a/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_chc/err +++ b/test/cmdlineTests/model_checker_targets_underflow_overflow_assert_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 0) - --> model_checker_targets_underflow_overflow_assert_chc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -23,7 +23,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 2) - --> model_checker_targets_underflow_overflow_assert_chc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ @@ -38,7 +38,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 1) - --> model_checker_targets_underflow_overflow_assert_chc/input.sol:11:3: + --> input.sol:11:3: | 11 | assert(x > 0); | ^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_underflow_overflow_bmc/err b/test/cmdlineTests/model_checker_targets_underflow_overflow_bmc/err index f3675ac5acbe..ea6dfb99cb5d 100644 --- a/test/cmdlineTests/model_checker_targets_underflow_overflow_bmc/err +++ b/test/cmdlineTests/model_checker_targets_underflow_overflow_bmc/err @@ -1,5 +1,5 @@ Warning: BMC: Underflow (resulting value less than 0) happens here. - --> model_checker_targets_underflow_overflow_bmc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -12,7 +12,7 @@ Note: Callstack: Note: Warning: BMC: Overflow (resulting value larger than 2**256 - 1) happens here. - --> model_checker_targets_underflow_overflow_bmc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/model_checker_targets_underflow_overflow_chc/err b/test/cmdlineTests/model_checker_targets_underflow_overflow_chc/err index 0dcfb1c254a3..8eed85ac3de3 100644 --- a/test/cmdlineTests/model_checker_targets_underflow_overflow_chc/err +++ b/test/cmdlineTests/model_checker_targets_underflow_overflow_chc/err @@ -8,7 +8,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 0) - --> model_checker_targets_underflow_overflow_chc/input.sol:7:3: + --> input.sol:7:3: | 7 | --x; | ^^^ @@ -23,7 +23,7 @@ Transaction trace: test.constructor() State: arr = [] test.f(0x0, 2) - --> model_checker_targets_underflow_overflow_chc/input.sol:8:3: + --> input.sol:8:3: | 8 | x + type(uint).max; | ^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/name_simplifier/output b/test/cmdlineTests/name_simplifier/output index 04abaf600103..8eeff65b91a6 100644 --- a/test/cmdlineTests/name_simplifier/output +++ b/test/cmdlineTests/name_simplifier/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"name_simplifier/input.sol" +/// @use-src 0:"input.sol" object "C_59" { code { { @@ -12,7 +12,7 @@ object "C_59" { return(_1, _2) } } - /// @use-src 0:"name_simplifier/input.sol" + /// @use-src 0:"input.sol" object "C_59_deployed" { code { { diff --git a/test/cmdlineTests/no_cbor_metadata/output b/test/cmdlineTests/no_cbor_metadata/output index 0328ece3f27c..295bc228bf1e 100644 --- a/test/cmdlineTests/no_cbor_metadata/output +++ b/test/cmdlineTests/no_cbor_metadata/output @@ -1,4 +1,4 @@ -======= no_cbor_metadata/input.sol:C ======= +======= input.sol:C ======= Binary: 608080604052346013576003908160188239f35b5f80fdfe5f80fd diff --git a/test/cmdlineTests/no_contract_combined_json/output b/test/cmdlineTests/no_contract_combined_json/output index 8c454e341442..a408cbdbc957 100644 --- a/test/cmdlineTests/no_contract_combined_json/output +++ b/test/cmdlineTests/no_contract_combined_json/output @@ -1,11 +1,11 @@ { "sourceList": [ - "no_contract_combined_json/input.sol" + "input.sol" ], "sources": { - "no_contract_combined_json/input.sol": { + "input.sol": { "AST": { - "absolutePath": "no_contract_combined_json/input.sol", + "absolutePath": "input.sol", "exportedSymbols": {}, "id": 2, "license": "GPL-3.0", diff --git a/test/cmdlineTests/no_import_callback/args b/test/cmdlineTests/no_import_callback/args index e816120d0db6..7efc6a77b677 100644 --- a/test/cmdlineTests/no_import_callback/args +++ b/test/cmdlineTests/no_import_callback/args @@ -1 +1 @@ ---no-import-callback no_import_callback/contract_1.sol +--no-import-callback contract_1.sol diff --git a/test/cmdlineTests/no_import_callback/err b/test/cmdlineTests/no_import_callback/err index 45690e34c8f2..c4e6d5701e22 100644 --- a/test/cmdlineTests/no_import_callback/err +++ b/test/cmdlineTests/no_import_callback/err @@ -1,5 +1,5 @@ Error: Source "contract_2.sol" not found: No import callback. - --> no_import_callback/contract_1.sol:4:1: + --> contract_1.sol:4:1: | 4 | import "contract_2.sol"; | ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/object_compiler/output b/test/cmdlineTests/object_compiler/output index a88851b96c71..b552b3f241d5 100644 --- a/test/cmdlineTests/object_compiler/output +++ b/test/cmdlineTests/object_compiler/output @@ -1,5 +1,5 @@ -======= object_compiler/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "MyContract" { @@ -26,40 +26,40 @@ Binary representation: 335f55600880600d5f395ff3fe5f545f5260205ff3 Text representation: - /* "object_compiler/input.yul":65:73 */ + /* "input.yul":65:73 */ caller - /* "object_compiler/input.yul":62:63 */ + /* "input.yul":62:63 */ 0x00 - /* "object_compiler/input.yul":55:74 */ + /* "input.yul":55:74 */ sstore - /* "object_compiler/input.yul":97:116 */ + /* "input.yul":97:116 */ dataSize(sub_0) - /* "object_compiler/input.yul":141:162 */ + /* "input.yul":141:162 */ dup1 dataOffset(sub_0) - /* "object_compiler/input.yul":138:139 */ + /* "input.yul":138:139 */ 0x00 - /* "object_compiler/input.yul":129:167 */ + /* "input.yul":129:167 */ codecopy - /* "object_compiler/input.yul":187:188 */ + /* "input.yul":187:188 */ 0x00 - /* "object_compiler/input.yul":180:193 */ + /* "input.yul":180:193 */ return stop sub_0: assembly { - /* "object_compiler/input.yul":294:295 */ + /* "input.yul":294:295 */ 0x00 - /* "object_compiler/input.yul":288:296 */ + /* "input.yul":288:296 */ sload - /* "object_compiler/input.yul":285:286 */ + /* "input.yul":285:286 */ 0x00 - /* "object_compiler/input.yul":278:297 */ + /* "input.yul":278:297 */ mstore - /* "object_compiler/input.yul":324:328 */ + /* "input.yul":324:328 */ 0x20 - /* "object_compiler/input.yul":321:322 */ + /* "input.yul":321:322 */ 0x00 - /* "object_compiler/input.yul":314:329 */ + /* "input.yul":314:329 */ return } diff --git a/test/cmdlineTests/optimize_full_storage_write/output b/test/cmdlineTests/optimize_full_storage_write/output index 9ebec71f0320..53e00008b08a 100644 --- a/test/cmdlineTests/optimize_full_storage_write/output +++ b/test/cmdlineTests/optimize_full_storage_write/output @@ -1,7 +1,7 @@ -======= optimize_full_storage_write/input.sol:OptimizeFullSlotWrite ======= +======= input.sol:OptimizeFullSlotWrite ======= EVM assembly: - /* "optimize_full_storage_write/input.sol":60:213 contract OptimizeFullSlotWrite {... */ + /* "input.sol":60:213 contract OptimizeFullSlotWrite {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "optimize_full_storage_write/input.sol":60:213 contract OptimizeFullSlotWrite {... */ + /* "input.sol":60:213 contract OptimizeFullSlotWrite {... */ mstore(0x40, 0x80) callvalue dup1 @@ -40,16 +40,16 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimize_full_storage_write/input.sol":111:211 function f() public {... */ + /* "input.sol":111:211 function f() public {... */ tag_3: tag_4 - /* "optimize_full_storage_write/input.sol":192:207 nums[3] = 44444 */ + /* "input.sol":192:207 nums[3] = 44444 */ 0xad9c000000000000823500000000000056ce0000000000002b67 - /* "optimize_full_storage_write/input.sol":135:139 nums */ + /* "input.sol":135:139 nums */ 0x00 - /* "optimize_full_storage_write/input.sol":192:207 nums[3] = 44444 */ + /* "input.sol":192:207 nums[3] = 44444 */ sstore - /* "optimize_full_storage_write/input.sol":111:211 function f() public {... */ + /* "input.sol":111:211 function f() public {... */ jump tag_4: stop diff --git a/test/cmdlineTests/optimizer_BlockDeDuplicator/err b/test/cmdlineTests/optimizer_BlockDeDuplicator/err index e29fc4fc3fd7..9d851c2acd29 100644 --- a/test/cmdlineTests/optimizer_BlockDeDuplicator/err +++ b/test/cmdlineTests/optimizer_BlockDeDuplicator/err @@ -1,11 +1,11 @@ Warning: Statement has no effect. - --> optimizer_BlockDeDuplicator/input.sol:7:27: + --> input.sol:7:27: | 7 | function f() public { true ? 1 : 3;} | ^^^^^^^^^^^^ Warning: Function state mutability can be restricted to pure - --> optimizer_BlockDeDuplicator/input.sol:7:5: + --> input.sol:7:5: | 7 | function f() public { true ? 1 : 3;} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/optimizer_BlockDeDuplicator/output b/test/cmdlineTests/optimizer_BlockDeDuplicator/output index fb72e4bc1ee8..b3a645be3569 100644 --- a/test/cmdlineTests/optimizer_BlockDeDuplicator/output +++ b/test/cmdlineTests/optimizer_BlockDeDuplicator/output @@ -1,23 +1,23 @@ -======= optimizer_BlockDeDuplicator/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_BlockDeDuplicator/input.sol":60:213 contract C {... */ + /* "input.sol":60:213 contract C {... */ mstore(0x40, 0x80) - /* "optimizer_BlockDeDuplicator/input.sol":179:210 function() r = true ? fun_x : f */ + /* "input.sol":179:210 function() r = true ? fun_x : f */ 0x00 dup1 sload not(sub(shl(0x40, 0x01), 0x01)) and - /* "optimizer_BlockDeDuplicator/input.sol":201:206 fun_x */ + /* "input.sol":201:206 fun_x */ or(tag_0_7, shl(0x20, tag_2)) sub(shl(0x40, 0x01), 0x01) - /* "optimizer_BlockDeDuplicator/input.sol":179:210 function() r = true ? fun_x : f */ + /* "input.sol":179:210 function() r = true ? fun_x : f */ and or swap1 sstore - /* "optimizer_BlockDeDuplicator/input.sol":60:213 contract C {... */ + /* "input.sol":60:213 contract C {... */ callvalue dup1 iszero @@ -27,10 +27,10 @@ EVM assembly: tag_5: pop jump(tag_6) - /* "optimizer_BlockDeDuplicator/input.sol":138:174 function f() public { true ? 1 : 3;} */ + /* "input.sol":138:174 function f() public { true ? 1 : 3;} */ tag_2: jump // out - /* "optimizer_BlockDeDuplicator/input.sol":60:213 contract C {... */ + /* "input.sol":60:213 contract C {... */ tag_6: dataSize(sub_0) dup1 @@ -42,7 +42,7 @@ tag_6: stop sub_0: assembly { - /* "optimizer_BlockDeDuplicator/input.sol":60:213 contract C {... */ + /* "input.sol":60:213 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -71,7 +71,7 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_BlockDeDuplicator/input.sol":138:174 function f() public { true ? 1 : 3;} */ + /* "input.sol":138:174 function f() public { true ? 1 : 3;} */ tag_3: stop tag_7: diff --git a/test/cmdlineTests/optimizer_array_sload/output b/test/cmdlineTests/optimizer_array_sload/output index c1e0796f56fa..a16ac43a0fda 100644 --- a/test/cmdlineTests/optimizer_array_sload/output +++ b/test/cmdlineTests/optimizer_array_sload/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"optimizer_array_sload/input.sol" +/// @use-src 0:"input.sol" object "Arraysum_34" { code { { @@ -12,7 +12,7 @@ object "Arraysum_34" { return(_1, _2) } } - /// @use-src 0:"optimizer_array_sload/input.sol" + /// @use-src 0:"input.sol" object "Arraysum_34_deployed" { code { { diff --git a/test/cmdlineTests/optimizer_inliner_add/output b/test/cmdlineTests/optimizer_inliner_add/output index 9ebc9977daab..e4076c2fbc62 100644 --- a/test/cmdlineTests/optimizer_inliner_add/output +++ b/test/cmdlineTests/optimizer_inliner_add/output @@ -1,7 +1,7 @@ -======= optimizer_inliner_add/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_inliner_add/input.sol":165:305 contract C {... */ + /* "input.sol":165:305 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "optimizer_inliner_add/input.sol":165:305 contract C {... */ + /* "input.sol":165:305 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -40,7 +40,7 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_inliner_add/input.sol":182:303 function f() public pure {... */ + /* "input.sol":182:303 function f() public pure {... */ tag_3: tag_4 tag_5 @@ -48,32 +48,32 @@ sub_0: assembly { tag_4: stop tag_5: - /* "optimizer_inliner_add/input.sol":221:227 uint x */ + /* "input.sol":221:227 uint x */ 0x00 - /* "optimizer_inliner_add/input.sol":217:297 for(uint x = 0; x < 10; x = unsafe_add(x, unsafe_add(x, 1)))... */ + /* "input.sol":217:297 for(uint x = 0; x < 10; x = unsafe_add(x, unsafe_add(x, 1)))... */ tag_7: - /* "optimizer_inliner_add/input.sol":237:239 10 */ + /* "input.sol":237:239 10 */ 0x0a - /* "optimizer_inliner_add/input.sol":233:234 x */ + /* "input.sol":233:234 x */ dup2 - /* "optimizer_inliner_add/input.sol":233:239 x < 10 */ + /* "input.sol":233:239 x < 10 */ lt - /* "optimizer_inliner_add/input.sol":217:297 for(uint x = 0; x < 10; x = unsafe_add(x, unsafe_add(x, 1)))... */ + /* "input.sol":217:297 for(uint x = 0; x < 10; x = unsafe_add(x, unsafe_add(x, 1)))... */ iszero tag_8 jumpi - /* "optimizer_inliner_add/input.sol":149:154 x + y */ + /* "input.sol":149:154 x + y */ dup1 add - /* "optimizer_inliner_add/input.sol":273:274 1 */ + /* "input.sol":273:274 1 */ 0x01 - /* "optimizer_inliner_add/input.sol":149:154 x + y */ + /* "input.sol":149:154 x + y */ add - /* "optimizer_inliner_add/input.sol":217:297 for(uint x = 0; x < 10; x = unsafe_add(x, unsafe_add(x, 1)))... */ + /* "input.sol":217:297 for(uint x = 0; x < 10; x = unsafe_add(x, unsafe_add(x, 1)))... */ jump(tag_7) tag_8: pop - /* "optimizer_inliner_add/input.sol":182:303 function f() public pure {... */ + /* "input.sol":182:303 function f() public pure {... */ jump // out auxdata: diff --git a/test/cmdlineTests/optimizer_inliner_call_from_constructor/output b/test/cmdlineTests/optimizer_inliner_call_from_constructor/output index f42f9de094c6..8c7b544bbdd6 100644 --- a/test/cmdlineTests/optimizer_inliner_call_from_constructor/output +++ b/test/cmdlineTests/optimizer_inliner_call_from_constructor/output @@ -1,9 +1,9 @@ -======= optimizer_inliner_call_from_constructor/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_inliner_call_from_constructor/input.sol":60:263 contract C {... */ + /* "input.sol":60:263 contract C {... */ mstore(0x40, 0x80) - /* "optimizer_inliner_call_from_constructor/input.sol":89:115 constructor() { x = a(); } */ + /* "input.sol":89:115 constructor() { x = a(); } */ callvalue dup1 iszero @@ -12,13 +12,13 @@ EVM assembly: revert(0x00, 0x00) tag_1: pop - /* "optimizer_inliner_call_from_constructor/input.sol":257:258 6 */ + /* "input.sol":257:258 6 */ 0x06 - /* "optimizer_inliner_call_from_constructor/input.sol":105:106 x */ + /* "input.sol":105:106 x */ 0x00 - /* "optimizer_inliner_call_from_constructor/input.sol":105:112 x = a() */ + /* "input.sol":105:112 x = a() */ sstore - /* "optimizer_inliner_call_from_constructor/input.sol":60:263 contract C {... */ + /* "input.sol":60:263 contract C {... */ dataSize(sub_0) dup1 dataOffset(sub_0) @@ -29,7 +29,7 @@ tag_1: stop sub_0: assembly { - /* "optimizer_inliner_call_from_constructor/input.sol":60:263 contract C {... */ + /* "input.sol":60:263 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -48,11 +48,11 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_inliner_call_from_constructor/input.sol":120:175 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":120:175 function a() public pure returns (uint) { return f(); } */ tag_3: - /* "optimizer_inliner_call_from_constructor/input.sol":257:258 6 */ + /* "input.sol":257:258 6 */ 0x06 - /* "optimizer_inliner_call_from_constructor/input.sol":120:175 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":120:175 function a() public pure returns (uint) { return f(); } */ mload(0x40) /* "#utility.yul":160:185 */ swap1 @@ -62,7 +62,7 @@ sub_0: assembly { 0x20 /* "#utility.yul":133:151 */ add - /* "optimizer_inliner_call_from_constructor/input.sol":120:175 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":120:175 function a() public pure returns (uint) { return f(); } */ mload(0x40) dup1 swap2 diff --git a/test/cmdlineTests/optimizer_inliner_dynamic_reference/output b/test/cmdlineTests/optimizer_inliner_dynamic_reference/output index b1c5c74d9037..5313893fc735 100644 --- a/test/cmdlineTests/optimizer_inliner_dynamic_reference/output +++ b/test/cmdlineTests/optimizer_inliner_dynamic_reference/output @@ -1,7 +1,7 @@ -======= optimizer_inliner_dynamic_reference/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_inliner_dynamic_reference/input.sol":60:367 contract C {... */ + /* "input.sol":60:367 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "optimizer_inliner_dynamic_reference/input.sol":60:367 contract C {... */ + /* "input.sol":60:367 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -50,11 +50,11 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_inliner_dynamic_reference/input.sol":160:215 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":160:215 function a() public pure returns (uint) { return f(); } */ tag_3: - /* "optimizer_inliner_dynamic_reference/input.sol":361:362 6 */ + /* "input.sol":361:362 6 */ 0x06 - /* "optimizer_inliner_dynamic_reference/input.sol":160:215 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":160:215 function a() public pure returns (uint) { return f(); } */ tag_6: mload(0x40) /* "#utility.yul":160:185 */ @@ -65,78 +65,78 @@ sub_0: assembly { 0x20 /* "#utility.yul":133:151 */ add - /* "optimizer_inliner_dynamic_reference/input.sol":160:215 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":160:215 function a() public pure returns (uint) { return f(); } */ mload(0x40) dup1 swap2 sub swap1 return - /* "optimizer_inliner_dynamic_reference/input.sol":246:305 function h() public view returns (uint) { return x() + 1; } */ + /* "input.sol":246:305 function h() public view returns (uint) { return x() + 1; } */ tag_4: tag_6 tag_11 jump // in - /* "optimizer_inliner_dynamic_reference/input.sol":125:155 function g() public { x = f; } */ + /* "input.sol":125:155 function g() public { x = f; } */ tag_5: - /* "optimizer_inliner_dynamic_reference/input.sol":147:148 x */ + /* "input.sol":147:148 x */ 0x00 - /* "optimizer_inliner_dynamic_reference/input.sol":147:152 x = f */ + /* "input.sol":147:152 x = f */ dup1 sload not(0xffffffffffffffff) and - /* "optimizer_inliner_dynamic_reference/input.sol":151:152 f */ + /* "input.sol":151:152 f */ tag_17 - /* "optimizer_inliner_dynamic_reference/input.sol":147:152 x = f */ + /* "input.sol":147:152 x = f */ or swap1 sstore - /* "optimizer_inliner_dynamic_reference/input.sol":125:155 function g() public { x = f; } */ + /* "input.sol":125:155 function g() public { x = f; } */ stop - /* "optimizer_inliner_dynamic_reference/input.sol":209:212 f() */ + /* "input.sol":209:212 f() */ tag_16: - /* "optimizer_inliner_dynamic_reference/input.sol":202:212 return f() */ + /* "input.sol":202:212 return f() */ swap1 pop - /* "optimizer_inliner_dynamic_reference/input.sol":160:215 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":160:215 function a() public pure returns (uint) { return f(); } */ swap1 jump // out - /* "optimizer_inliner_dynamic_reference/input.sol":246:305 function h() public view returns (uint) { return x() + 1; } */ + /* "input.sol":246:305 function h() public view returns (uint) { return x() + 1; } */ tag_11: - /* "optimizer_inliner_dynamic_reference/input.sol":280:284 uint */ + /* "input.sol":280:284 uint */ 0x00 - /* "optimizer_inliner_dynamic_reference/input.sol":295:296 x */ + /* "input.sol":295:296 x */ dup1 sload - /* "optimizer_inliner_dynamic_reference/input.sol":295:298 x() */ + /* "input.sol":295:298 x() */ tag_19 swap1 - /* "optimizer_inliner_dynamic_reference/input.sol":295:296 x */ + /* "input.sol":295:296 x */ dup1 iszero tag_20 mul or - /* "optimizer_inliner_dynamic_reference/input.sol":295:298 x() */ + /* "input.sol":295:298 x() */ 0xffffffff and jump // in tag_19: - /* "optimizer_inliner_dynamic_reference/input.sol":295:302 x() + 1 */ + /* "input.sol":295:302 x() + 1 */ tag_16 swap1 - /* "optimizer_inliner_dynamic_reference/input.sol":301:302 1 */ + /* "input.sol":301:302 1 */ 0x01 - /* "optimizer_inliner_dynamic_reference/input.sol":295:302 x() + 1 */ + /* "input.sol":295:302 x() + 1 */ tag_22 jump // in - /* "optimizer_inliner_dynamic_reference/input.sol":310:365 function f() internal pure returns (uint) { return 6; } */ + /* "input.sol":310:365 function f() internal pure returns (uint) { return 6; } */ tag_17: - /* "optimizer_inliner_dynamic_reference/input.sol":361:362 6 */ + /* "input.sol":361:362 6 */ 0x06 swap1 - /* "optimizer_inliner_dynamic_reference/input.sol":310:365 function f() internal pure returns (uint) { return 6; } */ + /* "input.sol":310:365 function f() internal pure returns (uint) { return 6; } */ jump // out tag_20: tag_25 diff --git a/test/cmdlineTests/optimizer_inliner_dynamic_reference_constructor/output b/test/cmdlineTests/optimizer_inliner_dynamic_reference_constructor/output index 24ecaede0787..5997bd1c7b60 100644 --- a/test/cmdlineTests/optimizer_inliner_dynamic_reference_constructor/output +++ b/test/cmdlineTests/optimizer_inliner_dynamic_reference_constructor/output @@ -1,9 +1,9 @@ -======= optimizer_inliner_dynamic_reference_constructor/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":60:361 contract C {... */ + /* "input.sol":60:361 contract C {... */ mstore(0x40, 0x80) - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":77:101 constructor() { x = f; } */ + /* "input.sol":77:101 constructor() { x = f; } */ callvalue dup1 iszero @@ -12,31 +12,31 @@ EVM assembly: revert(0x00, 0x00) tag_1: pop - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":93:94 x */ + /* "input.sol":93:94 x */ 0x00 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":93:98 x = f */ + /* "input.sol":93:98 x = f */ dup1 sload not(sub(shl(0x40, 0x01), 0x01)) and - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":97:98 f */ + /* "input.sol":97:98 f */ or(tag_0_12, shl(0x20, tag_4)) sub(shl(0x40, 0x01), 0x01) - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":93:98 x = f */ + /* "input.sol":93:98 x = f */ and or swap1 sstore - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":60:361 contract C {... */ + /* "input.sol":60:361 contract C {... */ jump(tag_5) - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ + /* "input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ tag_4: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":355:356 6 */ + /* "input.sol":355:356 6 */ 0x06 swap1 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ + /* "input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ jump // out - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":60:361 contract C {... */ + /* "input.sol":60:361 contract C {... */ tag_5: dataSize(sub_0) dup1 @@ -48,7 +48,7 @@ tag_5: stop sub_0: assembly { - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":60:361 contract C {... */ + /* "input.sol":60:361 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -72,11 +72,11 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":154:209 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":154:209 function a() public pure returns (uint) { return f(); } */ tag_3: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":355:356 6 */ + /* "input.sol":355:356 6 */ 0x06 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":154:209 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":154:209 function a() public pure returns (uint) { return f(); } */ tag_5: mload(0x40) /* "#utility.yul":160:185 */ @@ -87,61 +87,61 @@ sub_0: assembly { 0x20 /* "#utility.yul":133:151 */ add - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":154:209 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":154:209 function a() public pure returns (uint) { return f(); } */ mload(0x40) dup1 swap2 sub swap1 return - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":240:299 function h() public view returns (uint) { return x() + 1; } */ + /* "input.sol":240:299 function h() public view returns (uint) { return x() + 1; } */ tag_4: tag_5 tag_10 jump // in - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":203:206 f() */ + /* "input.sol":203:206 f() */ tag_14: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":196:206 return f() */ + /* "input.sol":196:206 return f() */ swap1 pop - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":154:209 function a() public pure returns (uint) { return f(); } */ + /* "input.sol":154:209 function a() public pure returns (uint) { return f(); } */ swap1 jump // out - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":240:299 function h() public view returns (uint) { return x() + 1; } */ + /* "input.sol":240:299 function h() public view returns (uint) { return x() + 1; } */ tag_10: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":274:278 uint */ + /* "input.sol":274:278 uint */ 0x00 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":289:290 x */ + /* "input.sol":289:290 x */ dup1 sload - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":289:292 x() */ + /* "input.sol":289:292 x() */ tag_16 swap1 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":289:290 x */ + /* "input.sol":289:290 x */ dup1 iszero tag_17 mul or - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":289:292 x() */ + /* "input.sol":289:292 x() */ 0xffffffff and jump // in tag_16: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":289:296 x() + 1 */ + /* "input.sol":289:296 x() + 1 */ tag_14 swap1 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":295:296 1 */ + /* "input.sol":295:296 1 */ 0x01 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":289:296 x() + 1 */ + /* "input.sol":289:296 x() + 1 */ tag_19 jump // in - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ + /* "input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ tag_12: - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":355:356 6 */ + /* "input.sol":355:356 6 */ 0x06 swap1 - /* "optimizer_inliner_dynamic_reference_constructor/input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ + /* "input.sol":304:359 function f() internal pure returns (uint) { return 6; } */ jump // out tag_17: tag_21 diff --git a/test/cmdlineTests/optimizer_inliner_inc/output b/test/cmdlineTests/optimizer_inliner_inc/output index 3a3639e190a5..d634bf2d431b 100644 --- a/test/cmdlineTests/optimizer_inliner_inc/output +++ b/test/cmdlineTests/optimizer_inliner_inc/output @@ -1,7 +1,7 @@ -======= optimizer_inliner_inc/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_inliner_inc/input.sol":157:279 contract C {... */ + /* "input.sol":157:279 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "optimizer_inliner_inc/input.sol":157:279 contract C {... */ + /* "input.sol":157:279 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -40,7 +40,7 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_inliner_inc/input.sol":174:277 function f() public pure {... */ + /* "input.sol":174:277 function f() public pure {... */ tag_3: tag_4 tag_5 @@ -48,29 +48,29 @@ sub_0: assembly { tag_4: stop tag_5: - /* "optimizer_inliner_inc/input.sol":213:219 uint x */ + /* "input.sol":213:219 uint x */ 0x00 - /* "optimizer_inliner_inc/input.sol":209:271 for(uint x = 0; x < 10; x = unsafe_inc(x))... */ + /* "input.sol":209:271 for(uint x = 0; x < 10; x = unsafe_inc(x))... */ tag_7: - /* "optimizer_inliner_inc/input.sol":229:231 10 */ + /* "input.sol":229:231 10 */ 0x0a - /* "optimizer_inliner_inc/input.sol":225:226 x */ + /* "input.sol":225:226 x */ dup2 - /* "optimizer_inliner_inc/input.sol":225:231 x < 10 */ + /* "input.sol":225:231 x < 10 */ lt - /* "optimizer_inliner_inc/input.sol":209:271 for(uint x = 0; x < 10; x = unsafe_inc(x))... */ + /* "input.sol":209:271 for(uint x = 0; x < 10; x = unsafe_inc(x))... */ iszero tag_8 jumpi - /* "optimizer_inliner_inc/input.sol":145:146 1 */ + /* "input.sol":145:146 1 */ 0x01 - /* "optimizer_inliner_inc/input.sol":141:146 x + 1 */ + /* "input.sol":141:146 x + 1 */ add - /* "optimizer_inliner_inc/input.sol":209:271 for(uint x = 0; x < 10; x = unsafe_inc(x))... */ + /* "input.sol":209:271 for(uint x = 0; x < 10; x = unsafe_inc(x))... */ jump(tag_7) tag_8: pop - /* "optimizer_inliner_inc/input.sol":174:277 function f() public pure {... */ + /* "input.sol":174:277 function f() public pure {... */ jump // out auxdata: diff --git a/test/cmdlineTests/optimizer_inliner_multireturn/output b/test/cmdlineTests/optimizer_inliner_multireturn/output index 46d74055a208..20de1c219961 100644 --- a/test/cmdlineTests/optimizer_inliner_multireturn/output +++ b/test/cmdlineTests/optimizer_inliner_multireturn/output @@ -1,7 +1,7 @@ -======= optimizer_inliner_multireturn/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_inliner_multireturn/input.sol":162:298 contract C {... */ + /* "input.sol":162:298 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -21,7 +21,7 @@ tag_1: stop sub_0: assembly { - /* "optimizer_inliner_multireturn/input.sol":162:298 contract C {... */ + /* "input.sol":162:298 contract C {... */ mstore(0x40, 0x80) callvalue dup1 @@ -40,7 +40,7 @@ sub_0: assembly { jumpi tag_2: revert(0x00, 0x00) - /* "optimizer_inliner_multireturn/input.sol":179:296 function f() public pure {... */ + /* "input.sol":179:296 function f() public pure {... */ tag_3: tag_4 tag_5 @@ -48,35 +48,35 @@ sub_0: assembly { tag_4: stop tag_5: - /* "optimizer_inliner_multireturn/input.sol":219:225 uint x */ + /* "input.sol":219:225 uint x */ 0x00 - /* "optimizer_inliner_multireturn/input.sol":241:242 1 */ + /* "input.sol":241:242 1 */ 0x01 - /* "optimizer_inliner_multireturn/input.sol":214:290 for((uint x, uint y) = (0, 1); x < 10; (x, y) = test(x))... */ + /* "input.sol":214:290 for((uint x, uint y) = (0, 1); x < 10; (x, y) = test(x))... */ tag_7: - /* "optimizer_inliner_multireturn/input.sol":249:251 10 */ + /* "input.sol":249:251 10 */ 0x0a - /* "optimizer_inliner_multireturn/input.sol":245:246 x */ + /* "input.sol":245:246 x */ dup3 - /* "optimizer_inliner_multireturn/input.sol":245:251 x < 10 */ + /* "input.sol":245:251 x < 10 */ lt - /* "optimizer_inliner_multireturn/input.sol":214:290 for((uint x, uint y) = (0, 1); x < 10; (x, y) = test(x))... */ + /* "input.sol":214:290 for((uint x, uint y) = (0, 1); x < 10; (x, y) = test(x))... */ iszero tag_8 jumpi pop - /* "optimizer_inliner_multireturn/input.sol":146:147 1 */ + /* "input.sol":146:147 1 */ 0x01 - /* "optimizer_inliner_multireturn/input.sol":142:147 x + 1 */ + /* "input.sol":142:147 x + 1 */ dup2 add swap1 - /* "optimizer_inliner_multireturn/input.sol":214:290 for((uint x, uint y) = (0, 1); x < 10; (x, y) = test(x))... */ + /* "input.sol":214:290 for((uint x, uint y) = (0, 1); x < 10; (x, y) = test(x))... */ jump(tag_7) tag_8: pop pop - /* "optimizer_inliner_multireturn/input.sol":179:296 function f() public pure {... */ + /* "input.sol":179:296 function f() public pure {... */ jump // out auxdata: diff --git a/test/cmdlineTests/optimizer_user_yul/output b/test/cmdlineTests/optimizer_user_yul/output index c106c011b37c..b18e155bf947 100644 --- a/test/cmdlineTests/optimizer_user_yul/output +++ b/test/cmdlineTests/optimizer_user_yul/output @@ -1,71 +1,71 @@ -======= optimizer_user_yul/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "optimizer_user_yul/input.sol":60:518 contract C... */ + /* "input.sol":60:518 contract C... */ mstore(0x40, 0x80) - /* "optimizer_user_yul/input.sol":101:106 int a */ + /* "input.sol":101:106 int a */ 0x00 - /* "optimizer_user_yul/input.sol":181:190 let x,y,z */ + /* "input.sol":181:190 let x,y,z */ 0x00 0x00 0x00 - /* "optimizer_user_yul/input.sol":205:206 1 */ + /* "input.sol":205:206 1 */ 0x01 - /* "optimizer_user_yul/input.sol":202:203 0 */ + /* "input.sol":202:203 0 */ 0x00 - /* "optimizer_user_yul/input.sol":195:207 sstore(0, 1) */ + /* "input.sol":195:207 sstore(0, 1) */ sstore - /* "optimizer_user_yul/input.sol":212:258 for { } sload(4) { } {... */ + /* "input.sol":212:258 for { } sload(4) { } {... */ tag_3: - /* "optimizer_user_yul/input.sol":226:227 4 */ + /* "input.sol":226:227 4 */ 0x04 - /* "optimizer_user_yul/input.sol":220:228 sload(4) */ + /* "input.sol":220:228 sload(4) */ sload - /* "optimizer_user_yul/input.sol":212:258 for { } sload(4) { } {... */ + /* "input.sol":212:258 for { } sload(4) { } {... */ iszero tag_5 jumpi pop - /* "optimizer_user_yul/input.sol":244:253 exp(x, y) */ + /* "input.sol":244:253 exp(x, y) */ dup1 dup3 exp - /* "optimizer_user_yul/input.sol":212:258 for { } sload(4) { } {... */ + /* "input.sol":212:258 for { } sload(4) { } {... */ jump(tag_3) tag_5: - /* "optimizer_user_yul/input.sol":216:219 { } */ + /* "input.sol":216:219 { } */ pop pop pop - /* "optimizer_user_yul/input.sol":268:269 2 */ + /* "input.sol":268:269 2 */ 0x02 - /* "optimizer_user_yul/input.sol":263:269 a := 2 */ + /* "input.sol":263:269 a := 2 */ swap1 pop - /* "optimizer_user_yul/input.sol":369:370 3 */ + /* "input.sol":369:370 3 */ 0x03 - /* "optimizer_user_yul/input.sol":366:367 2 */ + /* "input.sol":366:367 2 */ 0x02 - /* "optimizer_user_yul/input.sol":359:371 sstore(2, 3) */ + /* "input.sol":359:371 sstore(2, 3) */ sstore - /* "optimizer_user_yul/input.sol":390:391 5 */ + /* "input.sol":390:391 5 */ 0x05 - /* "optimizer_user_yul/input.sol":384:392 sload(5) */ + /* "input.sol":384:392 sload(5) */ sload iszero - /* "optimizer_user_yul/input.sol":376:509 for { } sload(5) { } {... */ + /* "input.sol":376:509 for { } sload(5) { } {... */ tag_6: - /* "optimizer_user_yul/input.sol":384:392 sload(5) */ + /* "input.sol":384:392 sload(5) */ dup1 - /* "optimizer_user_yul/input.sol":376:509 for { } sload(5) { } {... */ + /* "input.sol":376:509 for { } sload(5) { } {... */ iszero tag_6 jumpi - /* "optimizer_user_yul/input.sol":380:383 { } */ + /* "input.sol":380:383 { } */ pop - /* "optimizer_user_yul/input.sol":340:513 {... */ + /* "input.sol":340:513 {... */ pop - /* "optimizer_user_yul/input.sol":60:518 contract C... */ + /* "input.sol":60:518 contract C... */ dataSize(sub_0) dup1 dataOffset(sub_0) @@ -76,7 +76,7 @@ tag_6: stop sub_0: assembly { - /* "optimizer_user_yul/input.sol":60:518 contract C... */ + /* "input.sol":60:518 contract C... */ mstore(0x40, 0x80) revert(0x00, 0x00) diff --git a/test/cmdlineTests/require_overload/err b/test/cmdlineTests/require_overload/err index 184c8c22bdd0..c267269fe43b 100644 --- a/test/cmdlineTests/require_overload/err +++ b/test/cmdlineTests/require_overload/err @@ -1,5 +1,5 @@ Error: No matching declaration found after argument-dependent lookup. - --> require_overload/input.sol:5:9: + --> input.sol:5:9: | 5 | require(this); | ^^^^^^^ diff --git a/test/cmdlineTests/require_with_error_ir/output b/test/cmdlineTests/require_with_error_ir/output index 09515f3cd82e..236931eea4cf 100644 --- a/test/cmdlineTests/require_with_error_ir/output +++ b/test/cmdlineTests/require_with_error_ir/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"require_with_error_ir/input.sol" +/// @use-src 0:"input.sol" object "C_36" { code { @@ -27,7 +27,7 @@ object "C_36" { } } - /// @use-src 0:"require_with_error_ir/input.sol" + /// @use-src 0:"input.sol" object "C_36_deployed" { code { diff --git a/test/cmdlineTests/require_with_string_ir/output b/test/cmdlineTests/require_with_string_ir/output index 3a19db372796..9b0bd869fe3b 100644 --- a/test/cmdlineTests/require_with_string_ir/output +++ b/test/cmdlineTests/require_with_string_ir/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"require_with_string_ir/input.sol" +/// @use-src 0:"input.sol" object "C_28" { code { @@ -27,7 +27,7 @@ object "C_28" { } } - /// @use-src 0:"require_with_string_ir/input.sol" + /// @use-src 0:"input.sol" object "C_28_deployed" { code { diff --git a/test/cmdlineTests/revert_strings/output b/test/cmdlineTests/revert_strings/output index 0f16ff9d0f8f..1fdb4b884c2d 100644 --- a/test/cmdlineTests/revert_strings/output +++ b/test/cmdlineTests/revert_strings/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"revert_strings/input.sol" +/// @use-src 0:"input.sol" object "C_15" { code { /// @src 0:59:147 "contract C {..." @@ -46,7 +46,7 @@ object "C_15" { /// @src 0:59:147 "contract C {..." } - /// @use-src 0:"revert_strings/input.sol" + /// @use-src 0:"input.sol" object "C_15_deployed" { code { /// @src 0:59:147 "contract C {..." diff --git a/test/cmdlineTests/stack_too_deep_from_code_transform/err b/test/cmdlineTests/stack_too_deep_from_code_transform/err index 588f4d437945..8820cce05aff 100644 --- a/test/cmdlineTests/stack_too_deep_from_code_transform/err +++ b/test/cmdlineTests/stack_too_deep_from_code_transform/err @@ -1,6 +1,6 @@ Error: Cannot swap Variable value23 with Slot 0x20: too deep in the stack by 9 slots in [ RET value23 value22 value21 value20 value19 value18 value17 value16 value15 value14 value13 value12 value11 value10 value9 value8 value7 value6 value5 value4 value3 value2 value1 value0 pos 0x20 ] memoryguard was present. - --> stack_too_deep_from_code_transform/input.sol:1:1: + --> input.sol:1:1: | 1 | contract C { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/input.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/input.json index 3059e1ecd3e3..14dec3178f24 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_all/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_in_yul_and_evm_asm_print_all/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "debug": {"debugInfo": ["*"]}, diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/input.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/input.json index 8e338322b0c7..f2311603a09f 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_location_only/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_in_yul_and_evm_asm_print_location_only/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "debug": {"debugInfo": ["location"]}, diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/input.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/input.json index c9184d944bfd..09386f2bef3d 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_none/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_in_yul_and_evm_asm_print_none/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "debug": {"debugInfo": []}, diff --git a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_snippet_only/input.json b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_snippet_only/input.json index 962688913096..cb6ac84463ee 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_snippet_only/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_and_evm_asm_print_snippet_only/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_in_yul_and_evm_asm_print_snippet_only/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "debug": {"debugInfo": ["snippet"]}, diff --git a/test/cmdlineTests/standard_irOptimized_ast_requested/input.json b/test/cmdlineTests/standard_irOptimized_ast_requested/input.json index fd16983068aa..23f17f4ae40d 100644 --- a/test/cmdlineTests/standard_irOptimized_ast_requested/input.json +++ b/test/cmdlineTests/standard_irOptimized_ast_requested/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_irOptimized_ast_requested/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": {"*": {"*": ["irOptimizedAst"]}} diff --git a/test/cmdlineTests/standard_ir_ast_requested/input.json b/test/cmdlineTests/standard_ir_ast_requested/input.json index 1cb1083a2ef6..07cfc13edee7 100644 --- a/test/cmdlineTests/standard_ir_ast_requested/input.json +++ b/test/cmdlineTests/standard_ir_ast_requested/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_ir_ast_requested/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": {"*": {"*": ["irAst"]}} diff --git a/test/cmdlineTests/standard_metadata/input.json b/test/cmdlineTests/standard_metadata/input.json index ae4bfe8f5965..8ca8da20a260 100644 --- a/test/cmdlineTests/standard_metadata/input.json +++ b/test/cmdlineTests/standard_metadata/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_metadata/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_optimizer_invalid_detail_type/input.json b/test/cmdlineTests/standard_optimizer_invalid_detail_type/input.json index 5d65bb2e2269..52c0b9c7ac82 100644 --- a/test/cmdlineTests/standard_optimizer_invalid_detail_type/input.json +++ b/test/cmdlineTests/standard_optimizer_invalid_detail_type/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_invalid_detail_type/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": {"details": {"peephole": 7}} diff --git a/test/cmdlineTests/standard_optimizer_invalid_details/input.json b/test/cmdlineTests/standard_optimizer_invalid_details/input.json index dbab578d6175..b6c590b5e87a 100644 --- a/test/cmdlineTests/standard_optimizer_invalid_details/input.json +++ b/test/cmdlineTests/standard_optimizer_invalid_details/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_invalid_details/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": {"details": {"notThere": true}} diff --git a/test/cmdlineTests/standard_optimizer_no_yul/input.json b/test/cmdlineTests/standard_optimizer_no_yul/input.json index 42ab767be632..ad1199dcf318 100644 --- a/test/cmdlineTests/standard_optimizer_no_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_no_yul/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_no_yul/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yul/input.json b/test/cmdlineTests/standard_optimizer_yul/input.json index cf40ef970bbb..7d27780e54c1 100644 --- a/test/cmdlineTests/standard_optimizer_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_yul/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yul/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails/input.json b/test/cmdlineTests/standard_optimizer_yulDetails/input.json index 6cdf504fd854..53f1981d492a 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_no_object/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_no_object/input.json index 4aba68350fb6..d132a4797ed2 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_no_object/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_no_object/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_no_object/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps/input.json index 584b8bf83e42..dca784c63fd6 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_abbreviation/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_abbreviation/input.json index 48de0cce3f51..ebdf48e3a478 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_abbreviation/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_abbreviation/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_invalid_abbreviation/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json index 5be769f7676a..a93f21739315 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json index 0bddd9d9dc23..4caee0761778 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nested_brackets/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nested_brackets/input.json index 2baf7a7235fc..bddd8d531ff4 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nested_brackets/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nested_brackets/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_nested_brackets/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nesting_too_deep/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nesting_too_deep/input.json index 1c055d91545e..08aba5ccc7f0 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nesting_too_deep/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_nesting_too_deep/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_nesting_too_deep/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_no_yul/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_no_yul/input.json index 511860250476..586560917fa0 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_no_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_no_yul/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_no_yul/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_type/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_type/input.json index e6f2abaa2847..0166a4248ee3 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_type/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_type/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_type/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_closing_bracket/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_closing_bracket/input.json index e3cd50027b17..554bfe2e5797 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_closing_bracket/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_closing_bracket/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_unbalanced_closing_bracket/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_opening_bracket/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_opening_bracket/input.json index 6cf7a233479c..aa4b172bbd0d 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_opening_bracket/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_unbalanced_opening_bracket/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_unbalanced_opening_bracket/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json index b557a9662d8e..c3dde4dd3bbe 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json index 7d2f529ccf7f..c293911639f2 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json index 9c603d6f7f0b..8c4801da597a 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json index 5780bea83aa8..9d126b88ee4f 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence_no_yul/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence_no_yul/input.json index 8e6add377cac..aecf8d9d5c1e 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence_no_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence_no_yul/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence_no_yul/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_whitespace_newline_sequence_no_yul/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_whitespace_newline_sequence_no_yul/input.json index 321ac8e99ab8..1396b4269ab5 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_whitespace_newline_sequence_no_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_whitespace_newline_sequence_no_yul/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_whitespace_newline_sequence_no_yul/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_without_yul/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_without_yul/input.json index abd8cc0c8bac..8ccf21992999 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_without_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_without_yul/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_without_yul/in.sol"]} + "A": {"urls": ["in.sol"]} }, "settings": { "optimizer": {"details": {"yulDetails": 7} diff --git a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json index b640f033dc46..c157a2724884 100644 --- a/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_fatal/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_outputs_on_analysis_error_fatal/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { 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 index 0214e00e8406..c157a2724884 100644 --- 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 @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_outputs_on_analysis_error_fatal_after_current_step/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { 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 index 904ebc5bf287..c157a2724884 100644 --- a/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/input.json +++ b/test/cmdlineTests/standard_outputs_on_analysis_error_non_fatal/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_outputs_on_analysis_error_non_fatal/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_outputs_on_compilation_error/input.json b/test/cmdlineTests/standard_outputs_on_compilation_error/input.json index 855f007689b8..0555ba5e93f9 100644 --- a/test/cmdlineTests/standard_outputs_on_compilation_error/input.json +++ b/test/cmdlineTests/standard_outputs_on_compilation_error/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_outputs_on_compilation_error/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "optimizer": {"enabled": true}, diff --git a/test/cmdlineTests/standard_outputs_on_parsing_error/input.json b/test/cmdlineTests/standard_outputs_on_parsing_error/input.json index a0d00c4e9e39..c157a2724884 100644 --- a/test/cmdlineTests/standard_outputs_on_parsing_error/input.json +++ b/test/cmdlineTests/standard_outputs_on_parsing_error/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_outputs_on_parsing_error/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_stack_too_deep_from_code_transform/input.json b/test/cmdlineTests/standard_stack_too_deep_from_code_transform/input.json index a01e842b384d..dc86ac68494e 100644 --- a/test/cmdlineTests/standard_stack_too_deep_from_code_transform/input.json +++ b/test/cmdlineTests/standard_stack_too_deep_from_code_transform/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "in.sol": {"urls": ["standard_stack_too_deep_from_code_transform/in.sol"]} + "in.sol": {"urls": ["in.sol"]} }, "settings": { "viaIR": true, diff --git a/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json index 34f157495034..c09db6a6ed84 100644 --- a/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json +++ b/test/cmdlineTests/standard_stop_after_parsing_ast_requested/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_stop_after_parsing_ast_requested/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "stopAfter": "parsing", diff --git a/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json index 7ef3d37fd305..274ca87c44e4 100644 --- a/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json +++ b/test/cmdlineTests/standard_stop_after_parsing_bytecode_requested/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_stop_after_parsing_bytecode_requested/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "stopAfter": "parsing", 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 index ac4d623c7103..597468e20432 100644 --- 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 @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_stop_after_parsing_non_binary_output_requested/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "stopAfter": "parsing", diff --git a/test/cmdlineTests/standard_undeployable_contract_all_outputs/input.json b/test/cmdlineTests/standard_undeployable_contract_all_outputs/input.json index 4d2aea1f147a..ecb97bef2c3a 100644 --- a/test/cmdlineTests/standard_undeployable_contract_all_outputs/input.json +++ b/test/cmdlineTests/standard_undeployable_contract_all_outputs/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_undeployable_contract_all_outputs/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_urls_existing_and_missing/input.json b/test/cmdlineTests/standard_urls_existing_and_missing/input.json index 686e8128eca2..575145836b39 100644 --- a/test/cmdlineTests/standard_urls_existing_and_missing/input.json +++ b/test/cmdlineTests/standard_urls_existing_and_missing/input.json @@ -3,9 +3,9 @@ "sources": { "url_not_found.sol": { "urls": [ - "standard_urls_existing_and_missing/non-existent-contract-1.sol", - "standard_urls_existing_and_missing/contract.sol", - "standard_urls_existing_and_missing/non-existent-contract-2.sol" + "non-existent-contract-1.sol", + "contract.sol", + "non-existent-contract-2.sol" ] } }, diff --git a/test/cmdlineTests/standard_urls_existing_and_missing/output.json b/test/cmdlineTests/standard_urls_existing_and_missing/output.json index e9db1135d764..4204cdb45b99 100644 --- a/test/cmdlineTests/standard_urls_existing_and_missing/output.json +++ b/test/cmdlineTests/standard_urls_existing_and_missing/output.json @@ -2,8 +2,8 @@ "errors": [ { "component": "general", - "formattedMessage": "Cannot import url (\"standard_urls_existing_and_missing/non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", - "message": "Cannot import url (\"standard_urls_existing_and_missing/non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", + "formattedMessage": "Cannot import url (\"non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", + "message": "Cannot import url (\"non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", "severity": "warning", "type": "Warning" } diff --git a/test/cmdlineTests/standard_urls_missing/input.json b/test/cmdlineTests/standard_urls_missing/input.json index fecc50eb03a6..5ba6e71619c6 100644 --- a/test/cmdlineTests/standard_urls_missing/input.json +++ b/test/cmdlineTests/standard_urls_missing/input.json @@ -3,9 +3,9 @@ "sources": { "url_not_found.sol": { "urls": [ - "standard_urls_missing/non-existent-contract-1.sol", - "standard_urls_missing/non-existent-contract.sol", - "standard_urls_missing/non-existent-contract-2.sol" + "non-existent-contract-1.sol", + "non-existent-contract.sol", + "non-existent-contract-2.sol" ] } }, diff --git a/test/cmdlineTests/standard_urls_missing/output.json b/test/cmdlineTests/standard_urls_missing/output.json index 7e2bb3dd59c2..8f766b055718 100644 --- a/test/cmdlineTests/standard_urls_missing/output.json +++ b/test/cmdlineTests/standard_urls_missing/output.json @@ -2,22 +2,22 @@ "errors": [ { "component": "general", - "formattedMessage": "Cannot import url (\"standard_urls_missing/non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", - "message": "Cannot import url (\"standard_urls_missing/non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", + "formattedMessage": "Cannot import url (\"non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", + "message": "Cannot import url (\"non-existent-contract-1.sol\"): File not found. Searched the following locations: \"\".", "severity": "error", "type": "IOError" }, { "component": "general", - "formattedMessage": "Cannot import url (\"standard_urls_missing/non-existent-contract.sol\"): File not found. Searched the following locations: \"\".", - "message": "Cannot import url (\"standard_urls_missing/non-existent-contract.sol\"): File not found. Searched the following locations: \"\".", + "formattedMessage": "Cannot import url (\"non-existent-contract.sol\"): File not found. Searched the following locations: \"\".", + "message": "Cannot import url (\"non-existent-contract.sol\"): File not found. Searched the following locations: \"\".", "severity": "error", "type": "IOError" }, { "component": "general", - "formattedMessage": "Cannot import url (\"standard_urls_missing/non-existent-contract-2.sol\"): File not found. Searched the following locations: \"\".", - "message": "Cannot import url (\"standard_urls_missing/non-existent-contract-2.sol\"): File not found. Searched the following locations: \"\".", + "formattedMessage": "Cannot import url (\"non-existent-contract-2.sol\"): File not found. Searched the following locations: \"\".", + "message": "Cannot import url (\"non-existent-contract-2.sol\"): File not found. Searched the following locations: \"\".", "severity": "error", "type": "IOError" } diff --git a/test/cmdlineTests/standard_yul_cfg_json_export/input.json b/test/cmdlineTests/standard_yul_cfg_json_export/input.json index aee56abf8600..b5353721ee09 100644 --- a/test/cmdlineTests/standard_yul_cfg_json_export/input.json +++ b/test/cmdlineTests/standard_yul_cfg_json_export/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_yul_cfg_json_export/in.sol"]} + "C": {"urls": ["in.sol"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_yul_code_generation_error/input.json b/test/cmdlineTests/standard_yul_code_generation_error/input.json index 905eef6c758a..0f4da43fc66d 100644 --- a/test/cmdlineTests/standard_yul_code_generation_error/input.json +++ b/test/cmdlineTests/standard_yul_code_generation_error/input.json @@ -1,6 +1,6 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_code_generation_error/in.yul"]} + "C": {"urls": ["in.yul"]} } } diff --git a/test/cmdlineTests/standard_yul_debug_info_ethdebug_compatible_output/input.json b/test/cmdlineTests/standard_yul_debug_info_ethdebug_compatible_output/input.json index 3e5b81c5ef69..e52867fa329d 100644 --- a/test/cmdlineTests/standard_yul_debug_info_ethdebug_compatible_output/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_ethdebug_compatible_output/input.json @@ -3,7 +3,7 @@ "sources": { "C": { "urls": [ - "standard_yul_debug_info_ethdebug_compatible_output/in.yul" + "in.yul" ] } }, diff --git a/test/cmdlineTests/standard_yul_debug_info_ethdebug_incompatible_output/input.json b/test/cmdlineTests/standard_yul_debug_info_ethdebug_incompatible_output/input.json index f05e6f361aca..c2c501c96616 100644 --- a/test/cmdlineTests/standard_yul_debug_info_ethdebug_incompatible_output/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_ethdebug_incompatible_output/input.json @@ -3,7 +3,7 @@ "sources": { "C": { "urls": [ - "standard_yul_debug_info_ethdebug_incompatible_output/in.yul" + "in.yul" ] } }, diff --git a/test/cmdlineTests/standard_yul_debug_info_ethdebug_verbatim_unimplemented/input.json b/test/cmdlineTests/standard_yul_debug_info_ethdebug_verbatim_unimplemented/input.json index be4fbb64fce3..16ef6ef33f74 100644 --- a/test/cmdlineTests/standard_yul_debug_info_ethdebug_verbatim_unimplemented/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_ethdebug_verbatim_unimplemented/input.json @@ -3,7 +3,7 @@ "sources": { "C": { "urls": [ - "standard_yul_debug_info_ethdebug_verbatim_unimplemented/in.yul" + "in.yul" ] } }, diff --git a/test/cmdlineTests/standard_yul_debug_info_print_all/input.json b/test/cmdlineTests/standard_yul_debug_info_print_all/input.json index 1e6ed81a43a5..705c9ba7cc41 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_all/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_all/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_debug_info_print_all/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "debug": {"debugInfo": ["*"]}, diff --git a/test/cmdlineTests/standard_yul_debug_info_print_location_only/input.json b/test/cmdlineTests/standard_yul_debug_info_print_location_only/input.json index 867bc6e705ff..84ad0edadf18 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_location_only/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_location_only/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_debug_info_print_location_only/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "debug": {"debugInfo": ["location"]}, diff --git a/test/cmdlineTests/standard_yul_debug_info_print_none/input.json b/test/cmdlineTests/standard_yul_debug_info_print_none/input.json index 705cf3879e4e..13681dd8b114 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_none/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_none/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_debug_info_print_none/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "debug": {"debugInfo": []}, diff --git a/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/input.json b/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/input.json index ee247218f33e..ed74c075288f 100644 --- a/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/input.json +++ b/test/cmdlineTests/standard_yul_debug_info_print_snippet_only/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_debug_info_print_snippet_only/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "debug": {"debugInfo": ["snippet"]}, diff --git a/test/cmdlineTests/standard_yul_ethdebug_assign_immutable/input.json b/test/cmdlineTests/standard_yul_ethdebug_assign_immutable/input.json index 83acd4c42085..652620bedd51 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_assign_immutable/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_assign_immutable/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_assign_immutable/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_bytecode_ir/input.json b/test/cmdlineTests/standard_yul_ethdebug_bytecode_ir/input.json index abfb7ee863af..67c5fedc7fd0 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_bytecode_ir/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_bytecode_ir/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_bytecode_ir/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_bytecode_iroptimized/input.json b/test/cmdlineTests/standard_yul_ethdebug_bytecode_iroptimized/input.json index 54094c67305f..17949761f0f2 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_bytecode_iroptimized/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_bytecode_iroptimized/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_bytecode_iroptimized/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode/input.json b/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode/input.json index e222dfeda8c2..5c5e9c5f76e1 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_deployed_bytecode/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode_and_bytecode/input.json b/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode_and_bytecode/input.json index 20779012030d..655def5c1abf 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode_and_bytecode/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_deployed_bytecode_and_bytecode/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_deployed_bytecode/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_ir/input.json b/test/cmdlineTests/standard_yul_ethdebug_ir/input.json index 3153a378db84..67c5fedc7fd0 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_ir/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_ir/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_ir/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_iroptimize/input.json b/test/cmdlineTests/standard_yul_ethdebug_iroptimize/input.json index 180abcf31f8d..b08c9dcd7286 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_iroptimize/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_iroptimize/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_iroptimize/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_optimize_ir/input.json b/test/cmdlineTests/standard_yul_ethdebug_optimize_ir/input.json index 9f0c8b0d5cef..d7aec1f0889c 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_optimize_ir/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_optimize_ir/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_optimize_ir/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/standard_yul_ethdebug_optimize_iroptimized/input.json b/test/cmdlineTests/standard_yul_ethdebug_optimize_iroptimized/input.json index 81b637abd5b5..eeabdbcb9845 100644 --- a/test/cmdlineTests/standard_yul_ethdebug_optimize_iroptimized/input.json +++ b/test/cmdlineTests/standard_yul_ethdebug_optimize_iroptimized/input.json @@ -1,7 +1,7 @@ { "language": "Yul", "sources": { - "C": {"urls": ["standard_yul_ethdebug_optimize_iroptimized/in.yul"]} + "C": {"urls": ["in.yul"]} }, "settings": { "optimizer": { diff --git a/test/cmdlineTests/stop_after_parsing_ast/output b/test/cmdlineTests/stop_after_parsing_ast/output index 6cca9557da1b..e6d54c42615c 100644 --- a/test/cmdlineTests/stop_after_parsing_ast/output +++ b/test/cmdlineTests/stop_after_parsing_ast/output @@ -1,9 +1,9 @@ JSON AST (compact format): -======= stop_after_parsing_ast/input.sol ======= +======= input.sol ======= { - "absolutePath": "stop_after_parsing_ast/input.sol", + "absolutePath": "input.sol", "id": 4, "license": "GPL-3.0", "nodeType": "SourceUnit", diff --git a/test/cmdlineTests/storage_layout_transient_value_types/input.json b/test/cmdlineTests/storage_layout_transient_value_types/input.json index 8c90a7dde233..7a12ca85c985 100644 --- a/test/cmdlineTests/storage_layout_transient_value_types/input.json +++ b/test/cmdlineTests/storage_layout_transient_value_types/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "fileA": {"urls": ["storage_layout_transient_value_types/in.sol"]} + "fileA": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/storage_layout_user_defined/err b/test/cmdlineTests/storage_layout_user_defined/err index a9b5f07b19a0..e3815925acb9 100644 --- a/test/cmdlineTests/storage_layout_user_defined/err +++ b/test/cmdlineTests/storage_layout_user_defined/err @@ -1,2 +1,2 @@ Warning: Source file does not specify required compiler version! ---> storage_layout_user_defined/input.sol +--> input.sol diff --git a/test/cmdlineTests/storage_layout_user_defined/output b/test/cmdlineTests/storage_layout_user_defined/output index bb7819c66f12..d5be033ffe45 100644 --- a/test/cmdlineTests/storage_layout_user_defined/output +++ b/test/cmdlineTests/storage_layout_user_defined/output @@ -1,11 +1,11 @@ -======= storage_layout_user_defined/input.sol:C ======= +======= input.sol:C ======= Contract Storage Layout: { "storage": [ { "astId": 7, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "a", "offset": 0, "slot": "0", @@ -13,7 +13,7 @@ Contract Storage Layout: }, { "astId": 10, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "b", "offset": 16, "slot": "0", @@ -21,7 +21,7 @@ Contract Storage Layout: }, { "astId": 13, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "c", "offset": 0, "slot": "1", @@ -29,7 +29,7 @@ Contract Storage Layout: }, { "astId": 16, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "d", "offset": 16, "slot": "1", @@ -37,7 +37,7 @@ Contract Storage Layout: }, { "astId": 19, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "e", "offset": 17, "slot": "1", @@ -45,7 +45,7 @@ Contract Storage Layout: }, { "astId": 22, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "f", "offset": 18, "slot": "1", @@ -53,7 +53,7 @@ Contract Storage Layout: }, { "astId": 25, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "g", "offset": 19, "slot": "1", @@ -61,7 +61,7 @@ Contract Storage Layout: }, { "astId": 28, - "contract": "storage_layout_user_defined/input.sol:C", + "contract": "input.sol:C", "label": "h", "offset": 20, "slot": "1", diff --git a/test/cmdlineTests/storage_layout_user_defined_no_pretty_print/output b/test/cmdlineTests/storage_layout_user_defined_no_pretty_print/output index 1be4da0b6ee9..54276e472651 100644 --- a/test/cmdlineTests/storage_layout_user_defined_no_pretty_print/output +++ b/test/cmdlineTests/storage_layout_user_defined_no_pretty_print/output @@ -1,4 +1,4 @@ -======= storage_layout_user_defined_no_pretty_print/input.sol:C ======= +======= input.sol:C ======= Contract Storage Layout: {"storage":[]} diff --git a/test/cmdlineTests/strict_asm_ast_compact_json/output b/test/cmdlineTests/strict_asm_ast_compact_json/output index b2271c36cb05..1099f0c12a37 100644 --- a/test/cmdlineTests/strict_asm_ast_compact_json/output +++ b/test/cmdlineTests/strict_asm_ast_compact_json/output @@ -1,5 +1,5 @@ -======= strict_asm_ast_compact_json/input.yul (EVM) ======= +======= input.yul (EVM) ======= AST: { diff --git a/test/cmdlineTests/strict_asm_debug_info_print_all/output b/test/cmdlineTests/strict_asm_debug_info_print_all/output index 0e58baf578e6..ea8afb6a2f06 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_all/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_all/output @@ -1,5 +1,5 @@ -======= strict_asm_debug_info_print_all/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: /// @use-src 0:"input.sol" 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 17d2f50e2e15..06448d25ab42 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_location_only/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_location_only/output @@ -1,5 +1,5 @@ -======= strict_asm_debug_info_print_location_only/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: /// @use-src 0:"input.sol" diff --git a/test/cmdlineTests/strict_asm_debug_info_print_none/output b/test/cmdlineTests/strict_asm_debug_info_print_none/output index 51f779490ab7..93fc5c73e53b 100644 --- a/test/cmdlineTests/strict_asm_debug_info_print_none/output +++ b/test/cmdlineTests/strict_asm_debug_info_print_none/output @@ -1,5 +1,5 @@ -======= strict_asm_debug_info_print_none/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: /// @use-src 0:"input.sol" diff --git a/test/cmdlineTests/strict_asm_eof_container_osaka/output b/test/cmdlineTests/strict_asm_eof_container_osaka/output index 81f01798a766..3582e09d6cb6 100644 --- a/test/cmdlineTests/strict_asm_eof_container_osaka/output +++ b/test/cmdlineTests/strict_asm_eof_container_osaka/output @@ -1,5 +1,5 @@ -======= strict_asm_eof_container_osaka/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/output b/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/output index 677c49b88a1b..9d256a5dd493 100644 --- a/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/output +++ b/test/cmdlineTests/strict_asm_eof_dataloadn_osaka/output @@ -1,5 +1,5 @@ -======= strict_asm_eof_dataloadn_osaka/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "a" { diff --git a/test/cmdlineTests/strict_asm_evm_version_byzantium/output b/test/cmdlineTests/strict_asm_evm_version_byzantium/output index 2840e1d2b697..a43e6e47c34c 100644 --- a/test/cmdlineTests/strict_asm_evm_version_byzantium/output +++ b/test/cmdlineTests/strict_asm_evm_version_byzantium/output @@ -1,5 +1,5 @@ -======= strict_asm_evm_version_byzantium/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { @@ -11,5 +11,5 @@ Binary representation: 00 Text representation: - /* "strict_asm_evm_version_byzantium/input.yul":27:34 */ + /* "input.yul":27:34 */ stop diff --git a/test/cmdlineTests/strict_asm_evm_version_constantinople/output b/test/cmdlineTests/strict_asm_evm_version_constantinople/output index 9362866b43dc..a43e6e47c34c 100644 --- a/test/cmdlineTests/strict_asm_evm_version_constantinople/output +++ b/test/cmdlineTests/strict_asm_evm_version_constantinople/output @@ -1,5 +1,5 @@ -======= strict_asm_evm_version_constantinople/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { @@ -11,5 +11,5 @@ Binary representation: 00 Text representation: - /* "strict_asm_evm_version_constantinople/input.yul":27:34 */ + /* "input.yul":27:34 */ stop diff --git a/test/cmdlineTests/strict_asm_jump/err b/test/cmdlineTests/strict_asm_jump/err index c0001f382533..419701b46660 100644 --- a/test/cmdlineTests/strict_asm_jump/err +++ b/test/cmdlineTests/strict_asm_jump/err @@ -1,5 +1,5 @@ Error: Function "jump" not found. - --> strict_asm_jump/input.yul:1:3: + --> input.yul:1:3: | 1 | { jump(1) } | ^^^^ diff --git a/test/cmdlineTests/strict_asm_msize_with_optimizer/output b/test/cmdlineTests/strict_asm_msize_with_optimizer/output index fbc1e69fac24..7f170e22f699 100644 --- a/test/cmdlineTests/strict_asm_msize_with_optimizer/output +++ b/test/cmdlineTests/strict_asm_msize_with_optimizer/output @@ -1,5 +1,5 @@ -======= strict_asm_msize_with_optimizer/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_msize_without_optimizer/output b/test/cmdlineTests/strict_asm_msize_without_optimizer/output index ac19efbcbc78..2ba00372efca 100644 --- a/test/cmdlineTests/strict_asm_msize_without_optimizer/output +++ b/test/cmdlineTests/strict_asm_msize_without_optimizer/output @@ -1,5 +1,5 @@ -======= strict_asm_msize_without_optimizer/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_only_cr/err b/test/cmdlineTests/strict_asm_only_cr/err index 0879e4f212db..334ade78f75e 100644 --- a/test/cmdlineTests/strict_asm_only_cr/err +++ b/test/cmdlineTests/strict_asm_only_cr/err @@ -1,5 +1,5 @@ Error: Expected keyword "object". - --> strict_asm_only_cr/input.yul:1:2: + --> input.yul:1:2: | 1 | | ^ diff --git a/test/cmdlineTests/strict_asm_optimizer_steps/output b/test/cmdlineTests/strict_asm_optimizer_steps/output index 58c91976185c..4e20c6218f87 100644 --- a/test/cmdlineTests/strict_asm_optimizer_steps/output +++ b/test/cmdlineTests/strict_asm_optimizer_steps/output @@ -1,5 +1,5 @@ -======= strict_asm_optimizer_steps/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "C_6" { @@ -27,58 +27,58 @@ Binary representation: 608060405234601357600c60185f39600c5ff35b5f80fdfe608060405236155f555f80fd Text representation: - /* "strict_asm_optimizer_steps/input.yul":59:62 */ + /* "input.yul":59:62 */ 0x80 - /* "strict_asm_optimizer_steps/input.yul":55:57 */ + /* "input.yul":55:57 */ 0x40 - /* "strict_asm_optimizer_steps/input.yul":48:63 */ + /* "input.yul":48:63 */ mstore - /* "strict_asm_optimizer_steps/input.yul":79:90 */ + /* "input.yul":79:90 */ callvalue - /* "strict_asm_optimizer_steps/input.yul":76:107 */ + /* "input.yul":76:107 */ tag_1 jumpi - /* "strict_asm_optimizer_steps/input.yul":160:184 */ + /* "input.yul":160:184 */ dataSize(sub_0) - /* "strict_asm_optimizer_steps/input.yul":132:158 */ + /* "input.yul":132:158 */ dataOffset(sub_0) - /* "strict_asm_optimizer_steps/input.yul":129:130 */ + /* "input.yul":129:130 */ 0x00 - /* "strict_asm_optimizer_steps/input.yul":120:185 */ + /* "input.yul":120:185 */ codecopy - /* "strict_asm_optimizer_steps/input.yul":208:232 */ + /* "input.yul":208:232 */ dataSize(sub_0) - /* "strict_asm_optimizer_steps/input.yul":205:206 */ + /* "input.yul":205:206 */ 0x00 - /* "strict_asm_optimizer_steps/input.yul":198:233 */ + /* "input.yul":198:233 */ return - /* "strict_asm_optimizer_steps/input.yul":91:107 */ + /* "input.yul":91:107 */ tag_1: - /* "strict_asm_optimizer_steps/input.yul":103:104 */ + /* "input.yul":103:104 */ 0x00 - /* "strict_asm_optimizer_steps/input.yul":93:105 */ + /* "input.yul":93:105 */ dup1 revert stop sub_0: assembly { - /* "strict_asm_optimizer_steps/input.yul":334:337 */ + /* "input.yul":334:337 */ 0x80 - /* "strict_asm_optimizer_steps/input.yul":330:332 */ + /* "input.yul":330:332 */ 0x40 - /* "strict_asm_optimizer_steps/input.yul":323:338 */ + /* "input.yul":323:338 */ mstore - /* "strict_asm_optimizer_steps/input.yul":372:386 */ + /* "input.yul":372:386 */ calldatasize - /* "strict_asm_optimizer_steps/input.yul":365:387 */ + /* "input.yul":365:387 */ iszero - /* "strict_asm_optimizer_steps/input.yul":362:363 */ + /* "input.yul":362:363 */ 0x00 - /* "strict_asm_optimizer_steps/input.yul":355:388 */ + /* "input.yul":355:388 */ sstore - /* "strict_asm_optimizer_steps/input.yul":415:416 */ + /* "input.yul":415:416 */ 0x00 - /* "strict_asm_optimizer_steps/input.yul":405:417 */ + /* "input.yul":405:417 */ dup1 revert } diff --git a/test/cmdlineTests/strict_asm_output_selection_asm_only/output b/test/cmdlineTests/strict_asm_output_selection_asm_only/output index 317c9a9ae2fd..08932887f114 100644 --- a/test/cmdlineTests/strict_asm_output_selection_asm_only/output +++ b/test/cmdlineTests/strict_asm_output_selection_asm_only/output @@ -1,12 +1,12 @@ -======= strict_asm_output_selection_asm_only/input.yul (EVM) ======= +======= input.yul (EVM) ======= Text representation: - /* "strict_asm_output_selection_asm_only/input.yul":41:43 */ + /* "input.yul":41:43 */ 0x2a - /* "strict_asm_output_selection_asm_only/input.yul":38:39 */ + /* "input.yul":38:39 */ 0x00 - /* "strict_asm_output_selection_asm_only/input.yul":31:44 */ + /* "input.yul":31:44 */ sstore - /* "strict_asm_output_selection_asm_only/input.yul":27:48 */ + /* "input.yul":27:48 */ stop diff --git a/test/cmdlineTests/strict_asm_output_selection_bin_only/output b/test/cmdlineTests/strict_asm_output_selection_bin_only/output index 86d249576805..4edd88b33146 100644 --- a/test/cmdlineTests/strict_asm_output_selection_bin_only/output +++ b/test/cmdlineTests/strict_asm_output_selection_bin_only/output @@ -1,5 +1,5 @@ -======= strict_asm_output_selection_bin_only/input.yul (EVM) ======= +======= input.yul (EVM) ======= Binary representation: 602a5f5500 diff --git a/test/cmdlineTests/strict_asm_output_selection_ir_optimized_only/output b/test/cmdlineTests/strict_asm_output_selection_ir_optimized_only/output index 1fa4b72c7e2b..15174c71c8d3 100644 --- a/test/cmdlineTests/strict_asm_output_selection_ir_optimized_only/output +++ b/test/cmdlineTests/strict_asm_output_selection_ir_optimized_only/output @@ -1,5 +1,5 @@ -======= strict_asm_output_selection_ir_optimized_only/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_warning/err b/test/cmdlineTests/strict_asm_warning/err index 0661ae1ffec2..be47fb6ad90d 100644 --- a/test/cmdlineTests/strict_asm_warning/err +++ b/test/cmdlineTests/strict_asm_warning/err @@ -1,5 +1,5 @@ Warning: "selfdestruct" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode. - --> strict_asm_warning/input.yul:4:5: + --> input.yul:4:5: | 4 | selfdestruct(0) | ^^^^^^^^^^^^ diff --git a/test/cmdlineTests/strict_asm_warning/output b/test/cmdlineTests/strict_asm_warning/output index 71cb2ce69a09..b71411dae89d 100644 --- a/test/cmdlineTests/strict_asm_warning/output +++ b/test/cmdlineTests/strict_asm_warning/output @@ -1,5 +1,5 @@ -======= strict_asm_warning/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_warning_and_error_optimize/err b/test/cmdlineTests/strict_asm_warning_and_error_optimize/err index 22366e3e7bf3..b008c021a832 100644 --- a/test/cmdlineTests/strict_asm_warning_and_error_optimize/err +++ b/test/cmdlineTests/strict_asm_warning_and_error_optimize/err @@ -1,11 +1,11 @@ Warning: "selfdestruct" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode. - --> strict_asm_warning_and_error_optimize/input.yul:4:5: + --> input.yul:4:5: | 4 | selfdestruct() | ^^^^^^^^^^^^ Error: Function "selfdestruct" expects 1 arguments but got 0. - --> strict_asm_warning_and_error_optimize/input.yul:4:5: + --> input.yul:4:5: | 4 | selfdestruct() | ^^^^^^^^^^^^ diff --git a/test/cmdlineTests/strict_asm_warning_optimize/err b/test/cmdlineTests/strict_asm_warning_optimize/err index 098aa00baf69..be47fb6ad90d 100644 --- a/test/cmdlineTests/strict_asm_warning_optimize/err +++ b/test/cmdlineTests/strict_asm_warning_optimize/err @@ -1,5 +1,5 @@ Warning: "selfdestruct" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode. - --> strict_asm_warning_optimize/input.yul:4:5: + --> input.yul:4:5: | 4 | selfdestruct(0) | ^^^^^^^^^^^^ diff --git a/test/cmdlineTests/strict_asm_warning_optimize/output b/test/cmdlineTests/strict_asm_warning_optimize/output index d933dcb05525..b71411dae89d 100644 --- a/test/cmdlineTests/strict_asm_warning_optimize/output +++ b/test/cmdlineTests/strict_asm_warning_optimize/output @@ -1,5 +1,5 @@ -======= strict_asm_warning_optimize/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_warning_optimize_unreachable/err b/test/cmdlineTests/strict_asm_warning_optimize_unreachable/err index 4535680baa59..4465b2c242d9 100644 --- a/test/cmdlineTests/strict_asm_warning_optimize_unreachable/err +++ b/test/cmdlineTests/strict_asm_warning_optimize_unreachable/err @@ -1,5 +1,5 @@ Warning: "selfdestruct" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode. - --> strict_asm_warning_optimize_unreachable/input.yul:7:5: + --> input.yul:7:5: | 7 | selfdestruct(0) | ^^^^^^^^^^^^ diff --git a/test/cmdlineTests/strict_asm_warning_optimize_unreachable/output b/test/cmdlineTests/strict_asm_warning_optimize_unreachable/output index 508e9d8ed4ef..a2c2516af78d 100644 --- a/test/cmdlineTests/strict_asm_warning_optimize_unreachable/output +++ b/test/cmdlineTests/strict_asm_warning_optimize_unreachable/output @@ -1,5 +1,5 @@ -======= strict_asm_warning_optimize_unreachable/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/strict_asm_yul_cfg_json_export/output b/test/cmdlineTests/strict_asm_yul_cfg_json_export/output index c79692c3c035..e0bb1af40952 100644 --- a/test/cmdlineTests/strict_asm_yul_cfg_json_export/output +++ b/test/cmdlineTests/strict_asm_yul_cfg_json_export/output @@ -1,5 +1,5 @@ -======= strict_asm_yul_cfg_json_export/input.yul (EVM) ======= +======= input.yul (EVM) ======= Yul Control Flow Graph: { diff --git a/test/cmdlineTests/structured_documentation_source_location/err b/test/cmdlineTests/structured_documentation_source_location/err index 1f69adf4f63d..51d3a652ee77 100644 --- a/test/cmdlineTests/structured_documentation_source_location/err +++ b/test/cmdlineTests/structured_documentation_source_location/err @@ -1,11 +1,11 @@ Error: Documentation tag "@return No value returned" does not contain the name of its return parameter. - --> structured_documentation_source_location/input.sol:4:5: + --> input.sol:4:5: | 4 | /// @param id Some identifier | ^ (Relevant source part starts here and spans across multiple lines). Error: Documentation tag "@return No value returned" does not contain the name of its return parameter. - --> structured_documentation_source_location/input.sol:8:5: + --> input.sol:8:5: | 8 | /// @return No value returned | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/too_long_line/err b/test/cmdlineTests/too_long_line/err index 25620bd4c5e2..626812e5f7bd 100644 --- a/test/cmdlineTests/too_long_line/err +++ b/test/cmdlineTests/too_long_line/err @@ -1,5 +1,5 @@ Error: Identifier not found or not unique. - --> too_long_line/input.sol:5:164: + --> input.sol:5:164: | 5 | ... ffffffffffffffffffffffffffffffffff(announcementType Type, string Announcement, string ... | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/too_long_line_both_sides_short/err b/test/cmdlineTests/too_long_line_both_sides_short/err index 5992d6ea9387..194047c580b4 100644 --- a/test/cmdlineTests/too_long_line_both_sides_short/err +++ b/test/cmdlineTests/too_long_line_both_sides_short/err @@ -1,5 +1,5 @@ Error: Identifier not found or not unique. - --> too_long_line_both_sides_short/input.sol:5:15: + --> input.sol:5:15: | 5 | function f(announcementTypeXXXXXXXXXXXXXXXXXXX ... XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Type, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/too_long_line_edge_in/err b/test/cmdlineTests/too_long_line_edge_in/err index 1d96ea4cdc03..161e3a20bc93 100644 --- a/test/cmdlineTests/too_long_line_edge_in/err +++ b/test/cmdlineTests/too_long_line_edge_in/err @@ -1,5 +1,5 @@ Error: Identifier not found or not unique. - --> too_long_line_edge_in/input.sol:5:36: + --> input.sol:5:36: | 5 | function ffffffffffffffffffffff(announcementTypeTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT Ty, string A) onlyOwner external { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/too_long_line_edge_out/err b/test/cmdlineTests/too_long_line_edge_out/err index 3b3b4ee490b9..6aa17fc0335f 100644 --- a/test/cmdlineTests/too_long_line_edge_out/err +++ b/test/cmdlineTests/too_long_line_edge_out/err @@ -1,5 +1,5 @@ Error: Identifier not found or not unique. - --> too_long_line_edge_out/input.sol:5:37: + --> input.sol:5:37: | 5 | ... function fffffffffffffffffffffff(announcementTypeTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT Typ, string A) onlyOwner external ... | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/too_long_line_left_short/err b/test/cmdlineTests/too_long_line_left_short/err index 4f2359739076..25c35177d344 100644 --- a/test/cmdlineTests/too_long_line_left_short/err +++ b/test/cmdlineTests/too_long_line_left_short/err @@ -1,5 +1,5 @@ Error: Identifier not found or not unique. - --> too_long_line_left_short/input.sol:5:15: + --> input.sol:5:15: | 5 | function f(announcementType Type, string Announcement, string ... | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/too_long_line_multiline/err b/test/cmdlineTests/too_long_line_multiline/err index 4523938c6ee7..bfa99eed3c8b 100644 --- a/test/cmdlineTests/too_long_line_multiline/err +++ b/test/cmdlineTests/too_long_line_multiline/err @@ -1,5 +1,5 @@ Error: No visibility specified. Did you intend to add "public"? - --> too_long_line_multiline/input.sol:5:5: + --> input.sol:5:5: | 5 | function f() returns (bytes1 _b, by ... _b7, bytes22 _b22, bytes32 _b32) { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/too_long_line_right_short/err b/test/cmdlineTests/too_long_line_right_short/err index 7aa26ff074c5..f17f273b1c4e 100644 --- a/test/cmdlineTests/too_long_line_right_short/err +++ b/test/cmdlineTests/too_long_line_right_short/err @@ -1,5 +1,5 @@ Error: Identifier not found or not unique. - --> too_long_line_right_short/input.sol:5:164: + --> input.sol:5:164: | 5 | ... ffffffffffffffffffffffffffffffffff(announcementType Type, | ^^^^^^^^^^^^^^^^ diff --git a/test/cmdlineTests/transient_storage_layout/output b/test/cmdlineTests/transient_storage_layout/output index 0736271b44ad..846cb947d885 100644 --- a/test/cmdlineTests/transient_storage_layout/output +++ b/test/cmdlineTests/transient_storage_layout/output @@ -1,11 +1,11 @@ -======= transient_storage_layout/input.sol:C ======= +======= input.sol:C ======= Contract Transient Storage Layout: { "storage": [ { "astId": 4, - "contract": "transient_storage_layout/input.sol:C", + "contract": "input.sol:C", "label": "x", "offset": 0, "slot": "0", @@ -13,7 +13,7 @@ Contract Transient Storage Layout: }, { "astId": 8, - "contract": "transient_storage_layout/input.sol:C", + "contract": "input.sol:C", "label": "w", "offset": 0, "slot": "1", @@ -21,7 +21,7 @@ Contract Transient Storage Layout: }, { "astId": 12, - "contract": "transient_storage_layout/input.sol:C", + "contract": "input.sol:C", "label": "b", "offset": 20, "slot": "1", @@ -29,7 +29,7 @@ Contract Transient Storage Layout: }, { "astId": 15, - "contract": "transient_storage_layout/input.sol:C", + "contract": "input.sol:C", "label": "d", "offset": 0, "slot": "2", @@ -60,7 +60,7 @@ Contract Transient Storage Layout: } } -======= transient_storage_layout/input.sol:D ======= +======= input.sol:D ======= Contract Transient Storage Layout: { "storage": [] diff --git a/test/cmdlineTests/transient_storage_layout_value_types/input.json b/test/cmdlineTests/transient_storage_layout_value_types/input.json index 65d9a2231b90..2b903a2aea0d 100644 --- a/test/cmdlineTests/transient_storage_layout_value_types/input.json +++ b/test/cmdlineTests/transient_storage_layout_value_types/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "fileA": {"urls": ["transient_storage_layout_value_types/in.sol"]} + "fileA": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/transient_storage_layout_value_types_interleaved_with_storage/input.json b/test/cmdlineTests/transient_storage_layout_value_types_interleaved_with_storage/input.json index e649fc838b82..7a12ca85c985 100644 --- a/test/cmdlineTests/transient_storage_layout_value_types_interleaved_with_storage/input.json +++ b/test/cmdlineTests/transient_storage_layout_value_types_interleaved_with_storage/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "fileA": {"urls": ["transient_storage_layout_value_types_interleaved_with_storage/in.sol"]} + "fileA": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/transient_storage_layout_value_types_packed/input.json b/test/cmdlineTests/transient_storage_layout_value_types_packed/input.json index ee7fb0dec3b7..2b903a2aea0d 100644 --- a/test/cmdlineTests/transient_storage_layout_value_types_packed/input.json +++ b/test/cmdlineTests/transient_storage_layout_value_types_packed/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "fileA": {"urls": ["transient_storage_layout_value_types_packed/in.sol"]} + "fileA": {"urls": ["in.sol"]} }, "settings": { "outputSelection": { diff --git a/test/cmdlineTests/undeployable_contract_empty_outputs/output b/test/cmdlineTests/undeployable_contract_empty_outputs/output index 123edc75ddd6..71059f17f1d5 100644 --- a/test/cmdlineTests/undeployable_contract_empty_outputs/output +++ b/test/cmdlineTests/undeployable_contract_empty_outputs/output @@ -1,5 +1,5 @@ -======= undeployable_contract_empty_outputs/input.sol:C ======= +======= input.sol:C ======= EVM assembly: null Gas estimation: @@ -21,7 +21,7 @@ Function signatures: Contract JSON ABI [] -======= undeployable_contract_empty_outputs/input.sol:I ======= +======= input.sol:I ======= EVM assembly: null Gas estimation: diff --git a/test/cmdlineTests/viair_abicoder_v1/err b/test/cmdlineTests/viair_abicoder_v1/err index 55f8ba4b91b3..29fa2acd04a0 100644 --- a/test/cmdlineTests/viair_abicoder_v1/err +++ b/test/cmdlineTests/viair_abicoder_v1/err @@ -1,5 +1,5 @@ Warning (2066): Contract requests the ABI coder v1, which is incompatible with the IR. Using ABI coder v2 instead. - --> viair_abicoder_v1/input.sol:4:1: + --> input.sol:4:1: | 4 | contract test { | ^ (Relevant source part starts here and spans across multiple lines). diff --git a/test/cmdlineTests/viair_abicoder_v1/output b/test/cmdlineTests/viair_abicoder_v1/output index 1c4d6c90e260..3d6a582889df 100644 --- a/test/cmdlineTests/viair_abicoder_v1/output +++ b/test/cmdlineTests/viair_abicoder_v1/output @@ -1,6 +1,6 @@ IR: -/// @use-src 0:"viair_abicoder_v1/input.sol" +/// @use-src 0:"input.sol" object "test_11" { code { /// @src 0:79:169 "contract test {..." @@ -31,7 +31,7 @@ object "test_11" { /// @src 0:79:169 "contract test {..." } - /// @use-src 0:"viair_abicoder_v1/input.sol" + /// @use-src 0:"input.sol" object "test_11_deployed" { code { /// @src 0:79:169 "contract test {..." diff --git a/test/cmdlineTests/viair_msize_without_optimizer/output b/test/cmdlineTests/viair_msize_without_optimizer/output index f94c973bff3a..90c18ef947a1 100644 --- a/test/cmdlineTests/viair_msize_without_optimizer/output +++ b/test/cmdlineTests/viair_msize_without_optimizer/output @@ -1,5 +1,5 @@ -======= viair_msize_without_optimizer/input.sol:C ======= +======= input.sol:C ======= EVM assembly: mstore(0x40, 0x80) jumpi(tag_4, iszero(callvalue)) @@ -173,7 +173,7 @@ sub_0: assembly { } Optimized IR: -/// @use-src 0:"viair_msize_without_optimizer/input.sol" +/// @use-src 0:"input.sol" object "C_7" { code { mstore(64, memoryguard(128)) @@ -192,7 +192,7 @@ object "C_7" { function constructor_C_7() { } } - /// @use-src 0:"viair_msize_without_optimizer/input.sol" + /// @use-src 0:"input.sol" object "C_7_deployed" { code { mstore(64, memoryguard(128)) diff --git a/test/cmdlineTests/viair_subobject_optimization/output b/test/cmdlineTests/viair_subobject_optimization/output index dafba2771c5d..523cff79e0fa 100644 --- a/test/cmdlineTests/viair_subobject_optimization/output +++ b/test/cmdlineTests/viair_subobject_optimization/output @@ -1,7 +1,7 @@ -======= viair_subobject_optimization/input.sol:C ======= +======= input.sol:C ======= EVM assembly: - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ 0x80 jumpi(tag_7, callvalue) 0x1f @@ -44,12 +44,12 @@ EVM assembly: jumpi mload sub(shl(0x48, 0x01), 0xbe) - /* "viair_subobject_optimization/input.sol":620:645 x == 0xFFFFFFFFFFFFFFFF42 */ + /* "input.sol":620:645 x == 0xFFFFFFFFFFFFFFFF42 */ eq - /* "viair_subobject_optimization/input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ + /* "input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ tag_7 jumpi - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ mload(0x40) dataSize(sub_0) swap1 @@ -58,13 +58,13 @@ EVM assembly: dup3 codecopy return - /* "viair_subobject_optimization/input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ + /* "input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ tag_7: 0x00 - /* "viair_subobject_optimization/input.sol":653:661 revert() */ + /* "input.sol":653:661 revert() */ dup1 revert - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ tag_3: mstore(0x00, shl(0xe0, 0x4e487b71)) mstore(0x04, 0x41) @@ -72,7 +72,7 @@ tag_3: stop sub_0: assembly { - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ 0x00 dup1 revert @@ -81,9 +81,9 @@ sub_0: assembly { } -======= viair_subobject_optimization/input.sol:D ======= +======= input.sol:D ======= EVM assembly: - /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ + /* "input.sol":669:772 contract D {... */ 0x80 dup1 0x40 @@ -103,7 +103,7 @@ tag_1: stop sub_0: assembly { - /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ + /* "input.sol":669:772 contract D {... */ 0x80 jumpi(tag_1, iszero(lt(calldatasize, 0x04))) 0x00 @@ -117,10 +117,10 @@ sub_0: assembly { tag_3: jumpi(tag_7, callvalue) jumpi(tag_7, slt(add(not(0x03), calldatasize), 0x00)) - /* "viair_subobject_optimization/input.sol":745:765 type(C).creationCode */ + /* "input.sol":745:765 type(C).creationCode */ dataSize(sub_0) swap1 - /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ + /* "input.sol":669:772 contract D {... */ 0x3f dup3 add @@ -142,7 +142,7 @@ sub_0: assembly { swap2 dup3 mstore - /* "viair_subobject_optimization/input.sol":745:765 type(C).creationCode */ + /* "input.sol":745:765 type(C).creationCode */ dup3 dup2 mstore @@ -153,24 +153,24 @@ sub_0: assembly { dataOffset(sub_0) dup5 codecopy - /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ + /* "input.sol":669:772 contract D {... */ dup2 mload swap3 dup4 swap2 - /* "viair_subobject_optimization/input.sol":745:765 type(C).creationCode */ + /* "input.sol":745:765 type(C).creationCode */ 0x20 - /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ + /* "input.sol":669:772 contract D {... */ dup4 mstore mload dup1 swap2 dup2 - /* "viair_subobject_optimization/input.sol":745:765 type(C).creationCode */ + /* "input.sol":745:765 type(C).creationCode */ 0x20 - /* "viair_subobject_optimization/input.sol":669:772 contract D {... */ + /* "input.sol":669:772 contract D {... */ dup6 add mstore @@ -206,7 +206,7 @@ sub_0: assembly { stop sub_0: assembly { - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ 0x80 jumpi(tag_7, callvalue) 0x1f @@ -249,12 +249,12 @@ sub_0: assembly { jumpi mload sub(shl(0x48, 0x01), 0xbe) - /* "viair_subobject_optimization/input.sol":620:645 x == 0xFFFFFFFFFFFFFFFF42 */ + /* "input.sol":620:645 x == 0xFFFFFFFFFFFFFFFF42 */ eq - /* "viair_subobject_optimization/input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ + /* "input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ tag_7 jumpi - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ mload(0x40) dataSize(sub_0) swap1 @@ -263,13 +263,13 @@ sub_0: assembly { dup3 codecopy return - /* "viair_subobject_optimization/input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ + /* "input.sol":616:661 if (x == 0xFFFFFFFFFFFFFFFF42)... */ tag_7: 0x00 - /* "viair_subobject_optimization/input.sol":653:661 revert() */ + /* "input.sol":653:661 revert() */ dup1 revert - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ tag_3: mstore(0x00, shl(0xe0, 0x4e487b71)) mstore(0x04, 0x41) @@ -277,7 +277,7 @@ sub_0: assembly { stop sub_0: assembly { - /* "viair_subobject_optimization/input.sol":61:668 contract C {... */ + /* "input.sol":61:668 contract C {... */ 0x00 dup1 revert diff --git a/test/cmdlineTests/viair_subobjects/err b/test/cmdlineTests/viair_subobjects/err index 5046525bef7a..66ebf4229caf 100644 --- a/test/cmdlineTests/viair_subobjects/err +++ b/test/cmdlineTests/viair_subobjects/err @@ -1,5 +1,5 @@ Warning: Unused local variable. - --> viair_subobjects/input.sol:8:9: + --> input.sol:8:9: | 8 | C c = new C(); | ^^^ diff --git a/test/cmdlineTests/viair_subobjects/output b/test/cmdlineTests/viair_subobjects/output index 7a6bc8e6570b..783756e67681 100644 --- a/test/cmdlineTests/viair_subobjects/output +++ b/test/cmdlineTests/viair_subobjects/output @@ -1,11 +1,11 @@ -======= viair_subobjects/input.sol:C ======= +======= input.sol:C ======= Binary: Binary of the runtime part: Optimized IR: -/// @use-src 0:"viair_subobjects/input.sol" +/// @use-src 0:"input.sol" object "C_3" { code { { @@ -18,7 +18,7 @@ object "C_3" { return(_1, _2) } } - /// @use-src 0:"viair_subobjects/input.sol" + /// @use-src 0:"input.sol" object "C_3_deployed" { code { { @@ -31,13 +31,13 @@ object "C_3" { } -======= viair_subobjects/input.sol:D ======= +======= input.sol:D ======= Binary: Binary of the runtime part: Optimized IR: -/// @use-src 0:"viair_subobjects/input.sol" +/// @use-src 0:"input.sol" object "D_16" { code { { @@ -50,7 +50,7 @@ object "D_16" { return(_1, _2) } } - /// @use-src 0:"viair_subobjects/input.sol" + /// @use-src 0:"input.sol" object "D_16_deployed" { code { { @@ -88,7 +88,7 @@ object "D_16" { revert(0, 0) } } - /// @use-src 0:"viair_subobjects/input.sol" + /// @use-src 0:"input.sol" object "C_3" { code { { @@ -101,7 +101,7 @@ object "D_16" { return(_1, _2) } } - /// @use-src 0:"viair_subobjects/input.sol" + /// @use-src 0:"input.sol" object "C_3_deployed" { code { { diff --git a/test/cmdlineTests/yul_cfg_json_export/output b/test/cmdlineTests/yul_cfg_json_export/output index 0508769d7cb0..9affc4206939 100644 --- a/test/cmdlineTests/yul_cfg_json_export/output +++ b/test/cmdlineTests/yul_cfg_json_export/output @@ -1,5 +1,5 @@ -======= yul_cfg_json_export/input.sol:C ======= +======= input.sol:C ======= Yul Control Flow Graph: { "C_19": { @@ -447,7 +447,7 @@ Yul Control Flow Graph: "type": "Object" } -======= yul_cfg_json_export/input.sol:D ======= +======= input.sol:D ======= Yul Control Flow Graph: { "D_38": { @@ -2127,6 +2127,6 @@ Yul Control Flow Graph: "type": "Object" } -======= yul_cfg_json_export/input.sol:I ======= +======= input.sol:I ======= Yul Control Flow Graph: null diff --git a/test/cmdlineTests/yul_function_name_clashes/output b/test/cmdlineTests/yul_function_name_clashes/output index 2c54b6f50893..1d319d284e5b 100644 --- a/test/cmdlineTests/yul_function_name_clashes/output +++ b/test/cmdlineTests/yul_function_name_clashes/output @@ -1,5 +1,5 @@ -======= yul_function_name_clashes/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { diff --git a/test/cmdlineTests/yul_function_name_clashes_different_params/output b/test/cmdlineTests/yul_function_name_clashes_different_params/output index 85884a6a0ede..fdffb0c31270 100644 --- a/test/cmdlineTests/yul_function_name_clashes_different_params/output +++ b/test/cmdlineTests/yul_function_name_clashes_different_params/output @@ -1,5 +1,5 @@ -======= yul_function_name_clashes_different_params/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { @@ -23,37 +23,37 @@ Binary representation: 60056011565b600d60706016565b9055005b5f3590565b359056 Text representation: - /* "yul_function_name_clashes_different_params/input.yul":92:95 */ + /* "input.yul":92:95 */ tag_3 tag_1 jump // in tag_3: - /* "yul_function_name_clashes_different_params/input.yul":113:122 */ + /* "input.yul":113:122 */ tag_4 - /* "yul_function_name_clashes_different_params/input.yul":117:121 */ + /* "input.yul":117:121 */ 0x70 - /* "yul_function_name_clashes_different_params/input.yul":113:122 */ + /* "input.yul":113:122 */ tag_2 jump // in tag_4: - /* "yul_function_name_clashes_different_params/input.yul":135:147 */ + /* "input.yul":135:147 */ swap1 sstore - /* "yul_function_name_clashes_different_params/input.yul":27:284 */ + /* "input.yul":27:284 */ stop - /* "yul_function_name_clashes_different_params/input.yul":166:216 */ + /* "input.yul":166:216 */ tag_1: - /* "yul_function_name_clashes_different_params/input.yul":212:213 */ + /* "input.yul":212:213 */ 0x00 - /* "yul_function_name_clashes_different_params/input.yul":199:214 */ + /* "input.yul":199:214 */ calldataload - /* "yul_function_name_clashes_different_params/input.yul":166:216 */ + /* "input.yul":166:216 */ swap1 jump // out - /* "yul_function_name_clashes_different_params/input.yul":225:278 */ + /* "input.yul":225:278 */ tag_2: - /* "yul_function_name_clashes_different_params/input.yul":261:276 */ + /* "input.yul":261:276 */ calldataload - /* "yul_function_name_clashes_different_params/input.yul":225:278 */ + /* "input.yul":225:278 */ swap1 jump // out diff --git a/test/cmdlineTests/yul_optimize_runs/output b/test/cmdlineTests/yul_optimize_runs/output index 589f8ce1a12c..ec3dab457213 100644 --- a/test/cmdlineTests/yul_optimize_runs/output +++ b/test/cmdlineTests/yul_optimize_runs/output @@ -1,5 +1,5 @@ -======= yul_optimize_runs/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "RunsTest1" { @@ -24,28 +24,28 @@ Binary representation: 602480600a5f395ff3fe7fabc12345000000000000000000000000000000000000000000000000000000005f5500 Text representation: - /* "yul_optimize_runs/input.yul":64:92 */ + /* "input.yul":64:92 */ dataSize(sub_0) - /* "yul_optimize_runs/input.yul":117:147 */ + /* "input.yul":117:147 */ dup1 dataOffset(sub_0) - /* "yul_optimize_runs/input.yul":114:115 */ + /* "input.yul":114:115 */ 0x00 - /* "yul_optimize_runs/input.yul":105:152 */ + /* "input.yul":105:152 */ codecopy - /* "yul_optimize_runs/input.yul":172:173 */ + /* "input.yul":172:173 */ 0x00 - /* "yul_optimize_runs/input.yul":165:178 */ + /* "input.yul":165:178 */ return stop sub_0: assembly { - /* "yul_optimize_runs/input.yul":282:348 */ + /* "input.yul":282:348 */ 0xabc1234500000000000000000000000000000000000000000000000000000000 - /* "yul_optimize_runs/input.yul":279:280 */ + /* "input.yul":279:280 */ 0x00 - /* "yul_optimize_runs/input.yul":272:349 */ + /* "input.yul":272:349 */ sstore - /* "yul_optimize_runs/input.yul":240:373 */ + /* "input.yul":240:373 */ stop } diff --git a/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output b/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output index 7b948303ee43..744bc03a8c6e 100644 --- a/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output +++ b/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output @@ -1,4 +1,4 @@ -======= yul_optimizer_disabled_sequence_empty/input.sol:C ======= +======= input.sol:C ======= Metadata: -{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"yul_optimizer_disabled_sequence_empty/input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"yul_optimizer_disabled_sequence_empty/input.sol":{"keccak256":"0xc2db3500808896ce1e69de2fe20cecab7ae2ffbb47cdf6ba8321296d95f49fc5","license":"GPL-3.0","urls":["bzz-raw://fde21393c068cd9f2d2b10ba4782db54f6f1c9a725074b17fa742531076be8a4","dweb:/ipfs/QmeTD6mR7YrWNyRowKRS7xs6cJNeMF3T49GAHzGM1bquyM"]}},"version":1} +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0xc2db3500808896ce1e69de2fe20cecab7ae2ffbb47cdf6ba8321296d95f49fc5","license":"GPL-3.0","urls":["bzz-raw://fde21393c068cd9f2d2b10ba4782db54f6f1c9a725074b17fa742531076be8a4","dweb:/ipfs/QmeTD6mR7YrWNyRowKRS7xs6cJNeMF3T49GAHzGM1bquyM"]}},"version":1} diff --git a/test/cmdlineTests/yul_optimizer_steps/output b/test/cmdlineTests/yul_optimizer_steps/output index bb68a48fa809..f9484d2b4491 100644 --- a/test/cmdlineTests/yul_optimizer_steps/output +++ b/test/cmdlineTests/yul_optimizer_steps/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"yul_optimizer_steps/input.sol" +/// @use-src 0:"input.sol" object "C_7" { code { { @@ -18,7 +18,7 @@ object "C_7" { function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() { revert(0, 0) } } - /// @use-src 0:"yul_optimizer_steps/input.sol" + /// @use-src 0:"input.sol" object "C_7_deployed" { code { { diff --git a/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output b/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output index 9687abf643b3..26be9469862a 100644 --- a/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output +++ b/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"yul_optimizer_steps_nested_brackets/input.sol" +/// @use-src 0:"input.sol" object "C_6" { code { { @@ -21,7 +21,7 @@ object "C_6" { function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() { revert(0, 0) } } - /// @use-src 0:"yul_optimizer_steps_nested_brackets/input.sol" + /// @use-src 0:"input.sol" object "C_6_deployed" { code { { diff --git a/test/cmdlineTests/yul_optimizer_steps_short_sequence/output b/test/cmdlineTests/yul_optimizer_steps_short_sequence/output index dc77ce3c53e7..e93958a5d619 100644 --- a/test/cmdlineTests/yul_optimizer_steps_short_sequence/output +++ b/test/cmdlineTests/yul_optimizer_steps_short_sequence/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"yul_optimizer_steps_short_sequence/input.sol" +/// @use-src 0:"input.sol" object "C_8" { code { { @@ -9,7 +9,7 @@ object "C_8" { revert(0, 0) } } - /// @use-src 0:"yul_optimizer_steps_short_sequence/input.sol" + /// @use-src 0:"input.sol" object "C_8_deployed" { code { { diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output index 01641c53bc30..bbfd22e9bdfe 100644 --- a/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"yul_optimizer_steps_with_empty_cleanup_sequence/input.sol" +/// @use-src 0:"input.sol" object "C_8" { code { { @@ -10,7 +10,7 @@ object "C_8" { revert(0, usr$a) } } - /// @use-src 0:"yul_optimizer_steps_with_empty_cleanup_sequence/input.sol" + /// @use-src 0:"input.sol" object "C_8_deployed" { code { { diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output index b13e6e2823ff..bbfd22e9bdfe 100644 --- a/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output @@ -1,5 +1,5 @@ Optimized IR: -/// @use-src 0:"yul_optimizer_steps_with_empty_optimization_sequence/input.sol" +/// @use-src 0:"input.sol" object "C_8" { code { { @@ -10,7 +10,7 @@ object "C_8" { revert(0, usr$a) } } - /// @use-src 0:"yul_optimizer_steps_with_empty_optimization_sequence/input.sol" + /// @use-src 0:"input.sol" object "C_8_deployed" { code { { diff --git a/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/err b/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/err index 95e30df2e83d..d87be1839ccb 100644 --- a/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/err +++ b/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/err @@ -1,11 +1,11 @@ Warning: Unused local variable. - --> yul_optimizer_steps_without_optimize_empty_sequence/input.sol:13:9: + --> input.sol:13:9: | 13 | uint b = a; | ^^^^^^ Warning: Unused local variable. - --> yul_optimizer_steps_without_optimize_empty_sequence/input.sol:14:9: + --> input.sol:14:9: | 14 | uint c = a; | ^^^^^^ diff --git a/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output b/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output index 6873abe60e47..a7b037775f2c 100644 --- a/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output +++ b/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output @@ -1,7 +1,7 @@ -======= yul_optimizer_steps_without_optimize_empty_sequence/input.sol:C ======= +======= input.sol:C ======= Optimized IR: -/// @use-src 0:"yul_optimizer_steps_without_optimize_empty_sequence/input.sol" +/// @use-src 0:"input.sol" object "C_28" { code { { @@ -24,7 +24,7 @@ object "C_28" { function constructor_C() { } } - /// @use-src 0:"yul_optimizer_steps_without_optimize_empty_sequence/input.sol" + /// @use-src 0:"input.sol" object "C_28_deployed" { code { { @@ -130,4 +130,4 @@ object "C_28" { } Metadata: -{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"foo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"yul_optimizer_steps_without_optimize_empty_sequence/input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"yul_optimizer_steps_without_optimize_empty_sequence/input.sol":{"keccak256":"0x3fc910e345ce1ee62bfa6b0f66931ee632c08265b25b6139cfbbfe4d2f8d5dd8","license":"GPL-3.0","urls":["bzz-raw://e557e9ad2c2e420a669c06ae456b0b790d77d2d6d492cd8540e6b244388a5140","dweb:/ipfs/QmaNiZmC2Mo3YxGiehs1n3dVTjZwD7FguX7EUtpeshMVuR"]}},"version":1} +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"foo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0x3fc910e345ce1ee62bfa6b0f66931ee632c08265b25b6139cfbbfe4d2f8d5dd8","license":"GPL-3.0","urls":["bzz-raw://e557e9ad2c2e420a669c06ae456b0b790d77d2d6d492cd8540e6b244388a5140","dweb:/ipfs/QmaNiZmC2Mo3YxGiehs1n3dVTjZwD7FguX7EUtpeshMVuR"]}},"version":1} diff --git a/test/cmdlineTests/yul_verbatim/output b/test/cmdlineTests/yul_verbatim/output index 60fc7e6d1f46..33f86b2992be 100644 --- a/test/cmdlineTests/yul_verbatim/output +++ b/test/cmdlineTests/yul_verbatim/output @@ -1,5 +1,5 @@ -======= yul_verbatim/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { @@ -20,38 +20,38 @@ Binary representation: 6002808103808261626382815564656678797a010203040506070900010203040506070900010203040506070900010201020304050607090001020304050607090001020304050607090001026009905050505050 Text representation: - /* "yul_verbatim/input.yul":15:16 */ + /* "input.yul":15:16 */ 0x02 - /* "yul_verbatim/input.yul":37:38 */ + /* "input.yul":37:38 */ dup1 - /* "yul_verbatim/input.yul":34:35 */ + /* "input.yul":34:35 */ dup2 - /* "yul_verbatim/input.yul":30:39 */ + /* "input.yul":30:39 */ sub - /* "yul_verbatim/input.yul":78:79 */ + /* "input.yul":78:79 */ dup1 - /* "yul_verbatim/input.yul":75:76 */ + /* "input.yul":75:76 */ dup3 - /* "yul_verbatim/input.yul":53:80 */ + /* "input.yul":53:80 */ verbatimbytecode_616263 - /* "yul_verbatim/input.yul":95:96 */ + /* "input.yul":95:96 */ dup3 - /* "yul_verbatim/input.yul":92:93 */ + /* "input.yul":92:93 */ dup2 - /* "yul_verbatim/input.yul":85:97 */ + /* "input.yul":85:97 */ sstore - /* "yul_verbatim/input.yul":111:132 */ + /* "input.yul":111:132 */ verbatimbytecode_646566 - /* "yul_verbatim/input.yul":137:158 */ + /* "input.yul":137:158 */ verbatimbytecode_78797a - /* "yul_verbatim/input.yul":189:326 */ + /* "input.yul":189:326 */ verbatimbytecode_01020304050607090001020304050607090001020304050607090001020102030405060709000102030405060709000102030405060709000102 - /* "yul_verbatim/input.yul":336:337 */ + /* "input.yul":336:337 */ 0x09 - /* "yul_verbatim/input.yul":331:337 */ + /* "input.yul":331:337 */ swap1 pop - /* "yul_verbatim/input.yul":0:339 */ + /* "input.yul":0:339 */ pop pop pop diff --git a/test/cmdlineTests/yul_verbatim_msize/output b/test/cmdlineTests/yul_verbatim_msize/output index f684bac21752..b0acd819d8d1 100644 --- a/test/cmdlineTests/yul_verbatim_msize/output +++ b/test/cmdlineTests/yul_verbatim_msize/output @@ -1,5 +1,5 @@ -======= yul_verbatim_msize/input.yul (EVM) ======= +======= input.yul (EVM) ======= Pretty printed source: object "object" { @@ -17,19 +17,19 @@ Binary representation: 6120005150616160025f5500 Text representation: - /* "yul_verbatim_msize/input.yul":61:67 */ + /* "input.yul":61:67 */ 0x2000 - /* "yul_verbatim_msize/input.yul":55:68 */ + /* "input.yul":55:68 */ mload - /* "yul_verbatim_msize/input.yul":51:69 */ + /* "input.yul":51:69 */ pop - /* "yul_verbatim_msize/input.yul":82:102 */ + /* "input.yul":82:102 */ verbatimbytecode_6161 - /* "yul_verbatim_msize/input.yul":125:126 */ + /* "input.yul":125:126 */ 0x02 - /* "yul_verbatim_msize/input.yul":122:123 */ + /* "input.yul":122:123 */ 0x00 - /* "yul_verbatim_msize/input.yul":115:127 */ + /* "input.yul":115:127 */ sstore - /* "yul_verbatim_msize/input.yul":27:143 */ + /* "input.yul":27:143 */ stop From 880b61bd33f6df5c05d77671f6b534be2957e100 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Thu, 13 Feb 2025 15:30:25 +0100 Subject: [PATCH 57/80] SMTChecker: Refactor handling of ConstantCondition verification target --- libsolidity/formal/BMC.cpp | 149 +++++++++++++++++-------------------- libsolidity/formal/BMC.h | 30 +++++--- 2 files changed, 90 insertions(+), 89 deletions(-) diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index 6dcd856ee2af..4b494d6236ac 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -247,14 +247,8 @@ bool BMC::visit(IfStatement const& _node) m_context.pushSolver(); _node.condition().accept(*this); - // We ignore called functions here because they have - // specific input values. - if (isRootFunction() && !isInsideLoop()) - addVerificationTarget( - VerificationTargetType::ConstantCondition, - expr(_node.condition()), - &_node.condition() - ); + checkIfConditionIsConstant(_node.condition()); + m_context.popSolver(); resetVariableIndices(std::move(indicesBeforePush)); @@ -283,13 +277,7 @@ bool BMC::visit(Conditional const& _op) auto indicesBeforePush = copyVariableIndices(); m_context.pushSolver(); _op.condition().accept(*this); - - if (isRootFunction() && !isInsideLoop()) - addVerificationTarget( - VerificationTargetType::ConstantCondition, - expr(_op.condition()), - &_op.condition() - ); + checkIfConditionIsConstant(_op.condition()); m_context.popSolver(); resetVariableIndices(std::move(indicesBeforePush)); @@ -690,12 +678,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() && !isInsideLoop()) - addVerificationTarget( - VerificationTargetType::ConstantCondition, - expr(*args.front()), - args.front().get() - ); + checkIfConditionIsConstant(*args.front()); } void BMC::visitAddMulMod(FunctionCall const& _funCall) @@ -933,9 +916,6 @@ void BMC::checkVerificationTarget(BMCVerificationTarget& _target) switch (_target.type) { - case VerificationTargetType::ConstantCondition: - checkConstantCondition(_target); - break; case VerificationTargetType::Underflow: checkUnderflow(_target); break; @@ -951,19 +931,70 @@ void BMC::checkVerificationTarget(BMCVerificationTarget& _target) case VerificationTargetType::Assert: checkAssert(_target); break; + case VerificationTargetType::ConstantCondition: + solAssert(false, "Checks for constant condition are handled separately"); default: solAssert(false, ""); } } -void BMC::checkConstantCondition(BMCVerificationTarget& _target) +void BMC::checkIfConditionIsConstant(Expression const& _condition) { - checkBooleanNotConstant( - *_target.expression, - _target.constraints, - _target.value, - _target.callStack - ); + if ( + !m_settings.targets.has(VerificationTargetType::ConstantCondition) || + (m_currentContract && !shouldEncode(*m_currentContract)) + ) + return; + + // We ignore called functions here because they have specific input values. + // Also, expressions inside loop can have different values in different iterations. + if (!isRootFunction() || isInsideLoop()) + return; + + // Do not check for const-ness if this is a literal. + if (dynamic_cast(&_condition)) + return; + + auto [canBeTrue, canBeFalse] = checkBooleanNotConstant(currentPathConditions() && m_context.assertions(), expr(_condition)); + + // Report based on the result of the checks + if (canBeTrue == CheckResult::ERROR || canBeFalse == CheckResult::ERROR) + m_errorReporter.warning(8592_error, _condition.location(), "BMC: Error trying to invoke SMT solver."); + else if (canBeTrue == CheckResult::CONFLICTING || canBeFalse == CheckResult::CONFLICTING) + m_errorReporter.warning(3356_error, _condition.location(), "BMC: At least two SMT solvers provided conflicting answers. Results might not be sound."); + else if (canBeTrue == CheckResult::UNKNOWN || canBeFalse == CheckResult::UNKNOWN) + { + // Not enough information to make definite claims. + } + else if (canBeTrue == CheckResult::SATISFIABLE && canBeFalse == CheckResult::SATISFIABLE) + { + // Condition can be both true and false for some program runs. + } + + else if (canBeTrue == CheckResult::UNSATISFIABLE && canBeFalse == CheckResult::UNSATISFIABLE) + m_errorReporter.warning(2512_error, _condition.location(), "BMC: Condition unreachable.", SMTEncoder::callStackMessage(m_callStack)); + else + { + std::string description; + if (canBeFalse == smtutil::CheckResult::UNSATISFIABLE) + { + smtAssert(canBeTrue == smtutil::CheckResult::SATISFIABLE); + description = "BMC: Condition is always true."; + } + else + { + smtAssert(canBeTrue == smtutil::CheckResult::UNSATISFIABLE); + smtAssert(canBeFalse == smtutil::CheckResult::SATISFIABLE); + description = "BMC: Condition is always false."; + } + m_errorReporter.warning( + 6838_error, + _condition.location(), + description, + SMTEncoder::callStackMessage(m_callStack) + ); + } + } void BMC::checkUnderflow(BMCVerificationTarget& _target) @@ -1068,6 +1099,7 @@ void BMC::addVerificationTarget( Expression const* _expression ) { + smtAssert(_type != VerificationTargetType::ConstantCondition, "Checks for constant condition are handled separately"); if (!m_settings.targets.has(_type) || (m_currentContract && !shouldAnalyzeVerificationTargetsFor(*m_currentContract))) return; @@ -1081,10 +1113,7 @@ void BMC::addVerificationTarget( m_callStack, modelExpressions() }; - if (_type == VerificationTargetType::ConstantCondition) - checkVerificationTarget(target); - else - m_verificationTargets.emplace_back(std::move(target)); + m_verificationTargets.emplace_back(std::move(target)); } /// Solving. @@ -1188,62 +1217,22 @@ void BMC::checkCondition( m_interface->pop(); } -void BMC::checkBooleanNotConstant( - Expression const& _condition, +BMC::ConstantExpressionCheckResult BMC::checkBooleanNotConstant( smtutil::Expression const& _constraints, - smtutil::Expression const& _value, - std::vector const& _callStack + smtutil::Expression const& _condition ) { - // Do not check for const-ness if this is a constant. - if (dynamic_cast(&_condition)) - return; - m_interface->push(); - m_interface->addAssertion(_constraints && _value); + m_interface->addAssertion(_constraints && _condition); auto positiveResult = checkSatisfiable(); m_interface->pop(); m_interface->push(); - m_interface->addAssertion(_constraints && !_value); + m_interface->addAssertion(_constraints && !_condition); auto negatedResult = checkSatisfiable(); m_interface->pop(); - if (positiveResult == smtutil::CheckResult::ERROR || negatedResult == smtutil::CheckResult::ERROR) - m_errorReporter.warning(8592_error, _condition.location(), "BMC: Error trying to invoke SMT solver."); - else if (positiveResult == smtutil::CheckResult::CONFLICTING || negatedResult == smtutil::CheckResult::CONFLICTING) - m_errorReporter.warning(3356_error, _condition.location(), "BMC: At least two SMT solvers provided conflicting answers. Results might not be sound."); - else if (positiveResult == smtutil::CheckResult::SATISFIABLE && negatedResult == smtutil::CheckResult::SATISFIABLE) - { - // everything fine. - } - else if (positiveResult == smtutil::CheckResult::UNKNOWN || negatedResult == smtutil::CheckResult::UNKNOWN) - { - // can't do anything. - } - else if (positiveResult == smtutil::CheckResult::UNSATISFIABLE && negatedResult == smtutil::CheckResult::UNSATISFIABLE) - m_errorReporter.warning(2512_error, _condition.location(), "BMC: Condition unreachable.", SMTEncoder::callStackMessage(_callStack)); - else - { - std::string description; - if (positiveResult == smtutil::CheckResult::SATISFIABLE) - { - solAssert(negatedResult == smtutil::CheckResult::UNSATISFIABLE, ""); - description = "BMC: Condition is always true."; - } - else - { - solAssert(positiveResult == smtutil::CheckResult::UNSATISFIABLE, ""); - solAssert(negatedResult == smtutil::CheckResult::SATISFIABLE, ""); - description = "BMC: Condition is always false."; - } - m_errorReporter.warning( - 6838_error, - _condition.location(), - description, - SMTEncoder::callStackMessage(_callStack) - ); - } + return {.canBeTrue = positiveResult, .canBeFalse = negatedResult}; } std::pair> diff --git a/libsolidity/formal/BMC.h b/libsolidity/formal/BMC.h index a0ee9a3749c2..67d930c79194 100644 --- a/libsolidity/formal/BMC.h +++ b/libsolidity/formal/BMC.h @@ -161,7 +161,6 @@ class BMC: public SMTEncoder void checkVerificationTargets(); void checkVerificationTarget(BMCVerificationTarget& _target); - void checkConstantCondition(BMCVerificationTarget& _target); void checkUnderflow(BMCVerificationTarget& _target); void checkOverflow(BMCVerificationTarget& _target); void checkDivByZero(BMCVerificationTarget& _target); @@ -172,8 +171,13 @@ class BMC: public SMTEncoder smtutil::Expression const& _value, Expression const* _expression ); + /// Special handling of ConstantCondition verification target. + /// The target is checked immediately, unlike the other targets that are queued for checking at the end of analysis. + void checkIfConditionIsConstant(Expression const& _condition); //@} + + /// Solver related. //@{ /// Check that a condition can be satisfied. @@ -188,13 +192,18 @@ class BMC: public SMTEncoder std::string const& _additionalValueName = "", smtutil::Expression const* _additionalValue = nullptr ); - /// Checks that a boolean condition is not constant. Do not warn if the expression - /// is a literal constant. - void checkBooleanNotConstant( - Expression const& _condition, + + struct ConstantExpressionCheckResult + { + smtutil::CheckResult canBeTrue; + smtutil::CheckResult canBeFalse; + }; + + /// Checks whether the given boolean condition is either true or always false under given constraints. + /// Returns the results from the solver for these two checks. + ConstantExpressionCheckResult checkBooleanNotConstant( smtutil::Expression const& _constraints, - smtutil::Expression const& _value, - std::vector const& _callStack + smtutil::Expression const& _condition ); std::pair> checkSatisfiableAndGenerateModel(std::vector const& _expressionsToEvaluate); @@ -222,20 +231,23 @@ class BMC: public SMTEncoder /// Number of verification conditions that could not be proved. size_t m_unprovedAmt = 0; + /// Loop analysis + //@{ enum class LoopControlKind { Continue, Break }; - // Current path conditions and SSA indices for break or continue statement + /// 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 + /// Loop control statements for every loop std::stack> m_loopCheckpoints; + //@} }; } From d9083dc11aa70eb3fa6089102c637b31fc9e0a31 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Fri, 21 Mar 2025 18:04:51 +0100 Subject: [PATCH 58/80] SMTChecker: Loop conditions should be analyzed as in loop context in BMC Value of loop condition can change between iterations of the loop. Therefore, BMC should be in the "inside loop" state when analyzing loop conditions. --- Changelog.md | 1 + libsolidity/formal/BMC.cpp | 10 +++++++--- ..._first_iteration_and_constant_false_in_second.sol | 10 ++++++++++ ..._first_iteration_and_constant_false_in_second.sol | 12 ++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/libsolidity/smtCheckerTests/loops/for_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol create mode 100644 test/libsolidity/smtCheckerTests/loops/while_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol diff --git a/Changelog.md b/Changelog.md index 525ed2d9e58b..e8ccbb525302 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,6 +8,7 @@ Compiler Features: Bugfixes: +* SMTChecker: Do not consider loop conditions as constant-condition verification target as this could cause incorrect reports and internal compiler errors. * SMTChecker: Fix incorrect analysis when only a subset of contracts is selected with `--model-checker-contracts`. * SMTChecker: Fix internal compiler error when string literal is used to initialize user-defined type based on fixed bytes. diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index 4b494d6236ac..8401c8dbfc0b 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -363,7 +363,9 @@ bool BMC::visit(WhileStatement const& _node) { //after loop iterations are done, we check the loop condition last final time auto indices = copyVariableIndices(); + m_loopCheckpoints.emplace(); _node.condition().accept(*this); + m_loopCheckpoints.pop(); loopCondition = expr(_node.condition()); // assert that the loop is complete m_context.addAssertion(!loopCondition || broke || !loopConditionOnPreviousIterations); @@ -391,13 +393,13 @@ bool BMC::visit(ForStatement const& _node) for (unsigned int i = 0; i < bmcLoopIterations; ++i) { auto indicesBefore = copyVariableIndices(); + m_loopCheckpoints.emplace(); 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(); pushPathCondition(forCondition); @@ -443,8 +445,10 @@ bool BMC::visit(ForStatement const& _node) auto indices = copyVariableIndices(); if (_node.condition()) { + m_loopCheckpoints.emplace(); _node.condition()->accept(*this); forCondition = expr(*_node.condition()); + m_loopCheckpoints.pop(); } // assert that the loop is complete m_context.addAssertion(!forCondition || broke || !forConditionOnPreviousIterations); @@ -932,9 +936,9 @@ void BMC::checkVerificationTarget(BMCVerificationTarget& _target) checkAssert(_target); break; case VerificationTargetType::ConstantCondition: - solAssert(false, "Checks for constant condition are handled separately"); + smtAssert(false, "Checks for constant condition are handled separately"); default: - solAssert(false, ""); + smtAssert(false); } } diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol new file mode 100644 index 000000000000..7e0a85b9b401 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/for_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol @@ -0,0 +1,10 @@ +contract Test { + function loop() public pure { + for (uint k = 0; (k == 0 ? true : false); k++) { + } + } +} +// ==== +// SMTEngine: bmc +// SMTTargets: constantCondition +// ---- diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol new file mode 100644 index 000000000000..b367cb803647 --- /dev/null +++ b/test/libsolidity/smtCheckerTests/loops/while_loop_condition_constant_true_in_first_iteration_and_constant_false_in_second.sol @@ -0,0 +1,12 @@ +contract Test { + function loop() public pure { + uint k = 0; + while (k == 0 ? true : false) { + ++k; + } + } +} +// ==== +// SMTEngine: bmc +// SMTTargets: constantCondition +// ---- From b1a9031f5875e8bfd2e8ac670818c954096b8543 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Sat, 29 Mar 2025 20:11:58 +0100 Subject: [PATCH 59/80] SMTChecker: Clean up includes --- libsmtutil/SMTLib2Interface.cpp | 3 ++- libsmtutil/SMTPortfolio.h | 3 --- libsmtutil/SolverInterface.h | 3 ++- libsolidity/formal/ArraySlicePredicate.cpp | 2 ++ libsolidity/formal/ArraySlicePredicate.h | 4 ++-- libsolidity/formal/EncodingContext.cpp | 7 +++++++ libsolidity/formal/EncodingContext.h | 5 +---- libsolidity/formal/ExpressionFormatter.cpp | 2 ++ libsolidity/formal/Predicate.cpp | 2 +- libsolidity/formal/Predicate.h | 3 ++- libsolidity/formal/SymbolicTypes.cpp | 1 + libsolidity/formal/SymbolicTypes.h | 1 - libsolidity/formal/SymbolicVariables.cpp | 2 ++ libsolidity/formal/VariableUsage.cpp | 5 +---- 14 files changed, 25 insertions(+), 18 deletions(-) diff --git a/libsmtutil/SMTLib2Interface.cpp b/libsmtutil/SMTLib2Interface.cpp index 0430f0d21ea0..403989ca1aad 100644 --- a/libsmtutil/SMTLib2Interface.cpp +++ b/libsmtutil/SMTLib2Interface.cpp @@ -25,7 +25,8 @@ #include #include -#include +#include +#include #include #include diff --git a/libsmtutil/SMTPortfolio.h b/libsmtutil/SMTPortfolio.h index b445f40a2b69..59e0752a3471 100644 --- a/libsmtutil/SMTPortfolio.h +++ b/libsmtutil/SMTPortfolio.h @@ -20,10 +20,7 @@ #include -#include -#include -#include #include namespace solidity::smtutil diff --git a/libsmtutil/SolverInterface.h b/libsmtutil/SolverInterface.h index 2639ae024034..c434322d5d0f 100644 --- a/libsmtutil/SolverInterface.h +++ b/libsmtutil/SolverInterface.h @@ -26,7 +26,8 @@ #include #include -#include +#include +#include #include #include diff --git a/libsolidity/formal/ArraySlicePredicate.cpp b/libsolidity/formal/ArraySlicePredicate.cpp index 21d5fb1add29..67e635deb39c 100644 --- a/libsolidity/formal/ArraySlicePredicate.cpp +++ b/libsolidity/formal/ArraySlicePredicate.cpp @@ -18,6 +18,8 @@ #include +#include + #include using namespace solidity; diff --git a/libsolidity/formal/ArraySlicePredicate.h b/libsolidity/formal/ArraySlicePredicate.h index 180a9d1898ed..565dba657b9c 100644 --- a/libsolidity/formal/ArraySlicePredicate.h +++ b/libsolidity/formal/ArraySlicePredicate.h @@ -16,9 +16,9 @@ */ // SPDX-License-Identifier: GPL-3.0 -#include +#pragma once + #include -#include #include diff --git a/libsolidity/formal/EncodingContext.cpp b/libsolidity/formal/EncodingContext.cpp index e0a09bcf7b8f..cc046cf0337d 100644 --- a/libsolidity/formal/EncodingContext.cpp +++ b/libsolidity/formal/EncodingContext.cpp @@ -18,12 +18,19 @@ #include +#include + #include using namespace solidity; using namespace solidity::util; using namespace solidity::frontend::smt; +bool EncodingContext::IdCompare::operator()(ASTNode const* lhs, ASTNode const* rhs) const +{ + return lhs->id() < rhs->id(); +} + EncodingContext::EncodingContext(): m_state(*this) { diff --git a/libsolidity/formal/EncodingContext.h b/libsolidity/formal/EncodingContext.h index 5387184ee0c9..e7d577bbf52c 100644 --- a/libsolidity/formal/EncodingContext.h +++ b/libsolidity/formal/EncodingContext.h @@ -68,10 +68,7 @@ class EncodingContext struct IdCompare { - bool operator()(ASTNode const* lhs, ASTNode const* rhs) const - { - return lhs->id() < rhs->id(); - } + bool operator()(ASTNode const* lhs, ASTNode const* rhs) const; }; /// Variables. diff --git a/libsolidity/formal/ExpressionFormatter.cpp b/libsolidity/formal/ExpressionFormatter.cpp index 865a568f62da..dff84c860aab 100644 --- a/libsolidity/formal/ExpressionFormatter.cpp +++ b/libsolidity/formal/ExpressionFormatter.cpp @@ -20,6 +20,8 @@ #include +#include + #include #include diff --git a/libsolidity/formal/Predicate.cpp b/libsolidity/formal/Predicate.cpp index 66d8c2405538..7f742ec18d0b 100644 --- a/libsolidity/formal/Predicate.cpp +++ b/libsolidity/formal/Predicate.cpp @@ -28,7 +28,7 @@ #include -#include +#include #include using namespace solidity; diff --git a/libsolidity/formal/Predicate.h b/libsolidity/formal/Predicate.h index 7e4ba0f00fe8..d523f955404c 100644 --- a/libsolidity/formal/Predicate.h +++ b/libsolidity/formal/Predicate.h @@ -19,7 +19,8 @@ #pragma once -#include +#include +#include #include #include diff --git a/libsolidity/formal/SymbolicTypes.cpp b/libsolidity/formal/SymbolicTypes.cpp index 738a48f706c3..11c92a83af40 100644 --- a/libsolidity/formal/SymbolicTypes.cpp +++ b/libsolidity/formal/SymbolicTypes.cpp @@ -20,6 +20,7 @@ #include +#include #include #include #include diff --git a/libsolidity/formal/SymbolicTypes.h b/libsolidity/formal/SymbolicTypes.h index d38dcc04514a..9259ff64a4c6 100644 --- a/libsolidity/formal/SymbolicTypes.h +++ b/libsolidity/formal/SymbolicTypes.h @@ -19,7 +19,6 @@ #pragma once #include -#include #include namespace solidity::frontend::smt diff --git a/libsolidity/formal/SymbolicVariables.cpp b/libsolidity/formal/SymbolicVariables.cpp index f0cebc46c291..29301d095ca4 100644 --- a/libsolidity/formal/SymbolicVariables.cpp +++ b/libsolidity/formal/SymbolicVariables.cpp @@ -18,6 +18,8 @@ #include +#include + #include #include diff --git a/libsolidity/formal/VariableUsage.cpp b/libsolidity/formal/VariableUsage.cpp index ab7c425ae46c..000dcbc8175a 100644 --- a/libsolidity/formal/VariableUsage.cpp +++ b/libsolidity/formal/VariableUsage.cpp @@ -18,12 +18,9 @@ #include -#include #include -#include - -#include +#include using namespace solidity; using namespace solidity::util; From 629bb285394593aa5271d1a8dbdf335e71d99ce4 Mon Sep 17 00:00:00 2001 From: Martin Blicha Date: Sat, 29 Mar 2025 21:29:24 +0100 Subject: [PATCH 60/80] SMTChecker: Remove unused functionality --- libsolidity/CMakeLists.txt | 2 - libsolidity/formal/BMC.cpp | 1 - libsolidity/formal/SMTEncoder.cpp | 9 --- libsolidity/formal/SMTEncoder.h | 2 - libsolidity/formal/VariableUsage.cpp | 115 --------------------------- libsolidity/formal/VariableUsage.h | 65 --------------- 6 files changed, 194 deletions(-) delete mode 100644 libsolidity/formal/VariableUsage.cpp delete mode 100644 libsolidity/formal/VariableUsage.h diff --git a/libsolidity/CMakeLists.txt b/libsolidity/CMakeLists.txt index f0289acac3a8..62f0576dc59f 100644 --- a/libsolidity/CMakeLists.txt +++ b/libsolidity/CMakeLists.txt @@ -137,8 +137,6 @@ set(sources formal/SymbolicTypes.h formal/SymbolicVariables.cpp formal/SymbolicVariables.h - formal/VariableUsage.cpp - formal/VariableUsage.h formal/Z3CHCSmtLib2Interface.cpp formal/Z3CHCSmtLib2Interface.h formal/Z3SMTLib2Interface.cpp diff --git a/libsolidity/formal/BMC.cpp b/libsolidity/formal/BMC.cpp index 8401c8dbfc0b..bcd88b6dac59 100644 --- a/libsolidity/formal/BMC.cpp +++ b/libsolidity/formal/BMC.cpp @@ -80,7 +80,6 @@ void BMC::analyze(SourceUnit const& _source, std::map SMTEncoder::touchedVariables(ASTNode const& _node) -{ - std::vector callStack; - for (auto const& call: m_callStack) - callStack.push_back(call.first); - return m_variableUsage.touchedVariables(_node, callStack); -} - Declaration const* SMTEncoder::expressionToDeclaration(Expression const& _expr) const { if (auto const* identifier = dynamic_cast(&_expr)) diff --git a/libsolidity/formal/SMTEncoder.h b/libsolidity/formal/SMTEncoder.h index 5bfb70d8126d..60cfb9cf90cd 100644 --- a/libsolidity/formal/SMTEncoder.h +++ b/libsolidity/formal/SMTEncoder.h @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -454,7 +453,6 @@ class SMTEncoder: public ASTConstVisitor smtutil::Expression constraints; }; - smt::VariableUsage m_variableUsage; bool m_arrayAssignmentHappened = false; /// Stores the instances of an Uninterpreted Function applied to arguments. diff --git a/libsolidity/formal/VariableUsage.cpp b/libsolidity/formal/VariableUsage.cpp deleted file mode 100644 index 000dcbc8175a..000000000000 --- a/libsolidity/formal/VariableUsage.cpp +++ /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 - -#include - -#include - -#include - -using namespace solidity; -using namespace solidity::util; -using namespace solidity::frontend; -using namespace solidity::frontend::smt; - -std::set VariableUsage::touchedVariables(ASTNode const& _node, std::vector const& _outerCallstack) -{ - m_touchedVariables.clear(); - m_callStack.clear(); - m_callStack += _outerCallstack; - if (!m_callStack.empty()) - m_lastCall = m_callStack.back(); - _node.accept(*this); - return m_touchedVariables; -} - -void VariableUsage::endVisit(Identifier const& _identifier) -{ - if (_identifier.annotation().willBeWrittenTo) - checkIdentifier(_identifier); -} - -void VariableUsage::endVisit(IndexAccess const& _indexAccess) -{ - if (_indexAccess.annotation().willBeWrittenTo) - { - /// identifier.annotation().willBeWrittenTo == false, that's why we - /// need to check that before. - auto identifier = dynamic_cast(SMTEncoder::leftmostBase(_indexAccess)); - if (identifier) - checkIdentifier(*identifier); - } -} - -void VariableUsage::endVisit(FunctionCall const& _funCall) -{ - auto scopeContract = currentScopeContract(); - if (m_inlineFunctionCalls(_funCall, scopeContract, m_currentContract)) - if (auto funDef = SMTEncoder::functionCallToDefinition(_funCall, scopeContract, m_currentContract)) - if (find(m_callStack.begin(), m_callStack.end(), funDef) == m_callStack.end()) - funDef->accept(*this); -} - -bool VariableUsage::visit(FunctionDefinition const& _function) -{ - m_callStack.push_back(&_function); - return true; -} - -void VariableUsage::endVisit(FunctionDefinition const&) -{ - solAssert(!m_callStack.empty(), ""); - m_callStack.pop_back(); -} - -void VariableUsage::endVisit(ModifierInvocation const& _modifierInv) -{ - auto const& modifierDef = dynamic_cast(_modifierInv.name().annotation().referencedDeclaration); - if (modifierDef) - modifierDef->accept(*this); -} - -void VariableUsage::endVisit(PlaceholderStatement const&) -{ - solAssert(!m_callStack.empty(), ""); - FunctionDefinition const* funDef = nullptr; - for (auto it = m_callStack.rbegin(); it != m_callStack.rend() && !funDef; ++it) - funDef = dynamic_cast(*it); - solAssert(funDef, ""); - if (funDef->isImplemented()) - funDef->body().accept(*this); -} - -void VariableUsage::checkIdentifier(Identifier const& _identifier) -{ - Declaration const* declaration = _identifier.annotation().referencedDeclaration; - solAssert(declaration, ""); - if (VariableDeclaration const* varDecl = dynamic_cast(declaration)) - { - if (!varDecl->isLocalVariable() || (m_lastCall && varDecl->functionOrModifierDefinition() == m_lastCall)) - m_touchedVariables.insert(varDecl); - } -} - -ContractDefinition const* VariableUsage::currentScopeContract() -{ - for (auto&& f: m_callStack | ranges::views::reverse) - if (auto fun = dynamic_cast(f)) - return fun->annotation().contract; - return nullptr; -} diff --git a/libsolidity/formal/VariableUsage.h b/libsolidity/formal/VariableUsage.h deleted file mode 100644 index 4dc90f8c07a7..000000000000 --- a/libsolidity/formal/VariableUsage.h +++ /dev/null @@ -1,65 +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 -#include - -namespace solidity::frontend::smt -{ - -/** - * This class computes information about which variables are modified in a certain subtree. - */ -class VariableUsage: private ASTConstVisitor -{ -public: - /// @param _outerCallstack the current callstack in the callers context. - std::set touchedVariables(ASTNode const& _node, std::vector const& _outerCallstack); - - /// Sets whether to inline function calls. - void setFunctionInlining(std::function _inlineFunctionCalls) { m_inlineFunctionCalls = _inlineFunctionCalls; } - - void setCurrentContract(ContractDefinition const& _contract) { m_currentContract = &_contract; } - -private: - void endVisit(Identifier const& _node) override; - void endVisit(IndexAccess const& _node) override; - void endVisit(FunctionCall const& _node) override; - bool visit(FunctionDefinition const& _node) override; - void endVisit(FunctionDefinition const& _node) override; - void endVisit(ModifierInvocation const& _node) override; - void endVisit(PlaceholderStatement const& _node) override; - - /// Checks whether an identifier should be added to touchedVariables. - void checkIdentifier(Identifier const& _identifier); - - ContractDefinition const* currentScopeContract(); - - std::set m_touchedVariables; - std::vector m_callStack; - CallableDeclaration const* m_lastCall = nullptr; - ContractDefinition const* m_currentContract = nullptr; - - std::function m_inlineFunctionCalls = [](FunctionCall const&, ContractDefinition const*, ContractDefinition const*) { return false; }; -}; - -} From ae3da8c12ec9f1f22c3e2e1a9b29e5896a8313cf Mon Sep 17 00:00:00 2001 From: Maxim Ryabykh Date: Wed, 2 Oct 2024 11:56:08 +0300 Subject: [PATCH 61/80] docs: fixed a mismatch in the name of the function referenced in the micropayment example --- docs/examples/micropayment.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/micropayment.rst b/docs/examples/micropayment.rst index 9a3ad845ce1a..a7b26bb51b8b 100644 --- a/docs/examples/micropayment.rst +++ b/docs/examples/micropayment.rst @@ -274,8 +274,8 @@ Opening the Payment Channel To open the payment channel, Alice deploys the smart contract, attaching the Ether to be escrowed and specifying the intended recipient and a -maximum duration for the channel to exist. This is the function -``SimplePaymentChannel`` in the contract, at the end of this section. +maximum duration for the channel to exist. This is the ``constructor`` +in the ``SimplePaymentChannel`` contract, at the end of this section. Making Payments --------------- From fe7411114cc0c62ad386975a8ea491650b5c709a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Wed, 16 Apr 2025 13:37:43 +0200 Subject: [PATCH 62/80] EVMAssemblyStack: Add extra accessors that do not require contract name --- libevmasm/EVMAssemblyStack.cpp | 24 +++++++++++++++++------- libevmasm/EVMAssemblyStack.h | 6 ++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/libevmasm/EVMAssemblyStack.cpp b/libevmasm/EVMAssemblyStack.cpp index 7cb05bf8bf00..bed4ff744ec4 100644 --- a/libevmasm/EVMAssemblyStack.cpp +++ b/libevmasm/EVMAssemblyStack.cpp @@ -74,13 +74,13 @@ void EVMAssemblyStack::assemble() LinkerObject const& EVMAssemblyStack::object(std::string const& _contractName) const { solAssert(_contractName == m_name); - return m_object; + return object(); } LinkerObject const& EVMAssemblyStack::runtimeObject(std::string const& _contractName) const { solAssert(_contractName == m_name); - return m_runtimeObject; + return runtimeObject(); } std::map EVMAssemblyStack::sourceIndices() const @@ -95,13 +95,13 @@ std::map EVMAssemblyStack::sourceIndices() const std::string const* EVMAssemblyStack::sourceMapping(std::string const& _contractName) const { solAssert(_contractName == m_name); - return &m_sourceMapping; + return &sourceMapping(); } std::string const* EVMAssemblyStack::runtimeSourceMapping(std::string const& _contractName) const { solAssert(_contractName == m_name); - return &m_runtimeSourceMapping; + return &runtimeSourceMapping(); } Json EVMAssemblyStack::ethdebug(std::string const& _contractName) const @@ -123,20 +123,30 @@ Json EVMAssemblyStack::ethdebug() const return {}; } -Json EVMAssemblyStack::assemblyJSON(std::string const& _contractName) const +Json EVMAssemblyStack::assemblyJSON() const { - solAssert(_contractName == m_name); solAssert(m_evmAssembly); return m_evmAssembly->assemblyJSON(sourceIndices()); } -std::string EVMAssemblyStack::assemblyString(std::string const& _contractName, StringMap const& _sourceCodes) const +Json EVMAssemblyStack::assemblyJSON(std::string const& _contractName) const { solAssert(_contractName == m_name); + return assemblyJSON(); +} + +std::string EVMAssemblyStack::assemblyString(StringMap const& _sourceCodes) const +{ solAssert(m_evmAssembly); return m_evmAssembly->assemblyString(m_debugInfoSelection, _sourceCodes); } +std::string EVMAssemblyStack::assemblyString(std::string const& _contractName, StringMap const& _sourceCodes) const +{ + solAssert(_contractName == m_name); + return assemblyString(_sourceCodes); +} + std::string const EVMAssemblyStack::filesystemFriendlyName(std::string const& _contractName) const { solAssert(_contractName == m_name); diff --git a/libevmasm/EVMAssemblyStack.h b/libevmasm/EVMAssemblyStack.h index 2fe63c11c2ec..444d444ba9e2 100644 --- a/libevmasm/EVMAssemblyStack.h +++ b/libevmasm/EVMAssemblyStack.h @@ -58,20 +58,26 @@ class EVMAssemblyStack: public AbstractAssemblyStack std::string const& name() const { return m_name; } + LinkerObject const& object() const { return m_object; } LinkerObject const& object(std::string const& _contractName) const override; + LinkerObject const& runtimeObject() const { return m_runtimeObject; } LinkerObject const& runtimeObject(std::string const& _contractName) const override; std::shared_ptr const& evmAssembly() const { return m_evmAssembly; } std::shared_ptr const& evmRuntimeAssembly() const { return m_evmRuntimeAssembly; } + std::string const& sourceMapping() const { return m_sourceMapping; } std::string const* sourceMapping(std::string const& _contractName) const override; + std::string const& runtimeSourceMapping() const { return m_runtimeSourceMapping; } std::string const* runtimeSourceMapping(std::string const& _contractName) const override; Json ethdebug(std::string const& _contractName) const override; Json ethdebugRuntime(std::string const& _contractName) const override; Json ethdebug() const override; + Json assemblyJSON() const; Json assemblyJSON(std::string const& _contractName) const override; + std::string assemblyString(StringMap const& _sourceCodes) const; std::string assemblyString(std::string const& _contractName, StringMap const& _sourceCodes) const override; std::string const filesystemFriendlyName(std::string const& _contractName) const override; From dd01ddda2379e6b9a2cf212e086e2d1ef6eb9340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 14 Mar 2025 04:04:14 +0100 Subject: [PATCH 63/80] TestCaseReader: Expose fileName() --- test/TestCaseReader.h | 1 + 1 file changed, 1 insertion(+) diff --git a/test/TestCaseReader.h b/test/TestCaseReader.h index d1ef95be3c2c..5830e97f3666 100644 --- a/test/TestCaseReader.h +++ b/test/TestCaseReader.h @@ -59,6 +59,7 @@ class TestCaseReader std::size_t lineNumber() const { return m_lineNumber; } std::map const& settings() const { return m_settings; } std::ifstream& stream() { return m_fileStream; } + boost::filesystem::path const& fileName() const { return m_fileName; } std::string simpleExpectations(); From d3238c08ff61516a6d86a3035a0582aaeb5e5894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Sat, 19 Apr 2025 04:36:11 +0200 Subject: [PATCH 64/80] Add a transparent comparator to c_instructions to allow string_view lookups --- libevmasm/Instruction.cpp | 2 +- libevmasm/Instruction.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libevmasm/Instruction.cpp b/libevmasm/Instruction.cpp index dad9804d09a8..b5568763573a 100644 --- a/libevmasm/Instruction.cpp +++ b/libevmasm/Instruction.cpp @@ -26,7 +26,7 @@ using namespace solidity; using namespace solidity::util; using namespace solidity::evmasm; -std::map const solidity::evmasm::c_instructions = +std::map> const solidity::evmasm::c_instructions = { { "STOP", Instruction::STOP }, { "ADD", Instruction::ADD }, diff --git a/libevmasm/Instruction.h b/libevmasm/Instruction.h index 137144715296..cfdb85d2fa4c 100644 --- a/libevmasm/Instruction.h +++ b/libevmasm/Instruction.h @@ -322,6 +322,6 @@ InstructionInfo instructionInfo(Instruction _inst, langutil::EVMVersion _evmVers bool isValidInstruction(Instruction _inst); /// Convert from string mnemonic to Instruction type. -extern const std::map c_instructions; +extern const std::map> c_instructions; } From 266c7d49a8b9a9524d841b088410957bb7335e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 14 Mar 2025 04:51:35 +0100 Subject: [PATCH 65/80] EVM assembly test case with JSON input --- test/CMakeLists.txt | 2 + test/InteractiveTests.h | 3 + test/TestCase.cpp | 7 +- test/libevmasm/EVMAssemblyTest.cpp | 158 ++++++++++++++++++ test/libevmasm/EVMAssemblyTest.h | 70 ++++++++ .../code_generation_error.asmjson | 14 ++ .../isoltestTesting/invalid_json.asmjson | 3 + .../settings_eof_version.asmjson | 13 ++ .../settings_evm_version.asmjson | 13 ++ ...tings_optimizer_constant_optimizer.asmjson | 14 ++ .../settings_optimizer_cse.asmjson | 16 ++ .../settings_optimizer_deduplicate.asmjson | 26 +++ ...expected_executions_per_deployment.asmjson | 26 +++ .../settings_optimizer_inliner.asmjson | 33 ++++ ...ettings_optimizer_jumpdest_remover.asmjson | 14 ++ .../settings_optimizer_peephole.asmjson | 15 ++ .../settings_optimizer_preset.asmjson | 18 ++ .../isoltestTesting/settings_outputs.asmjson | 10 ++ .../isoltestTesting/smoke.asmjson | 11 ++ test/tools/CMakeLists.txt | 1 + test/tools/isoltest.cpp | 2 +- 21 files changed, 465 insertions(+), 4 deletions(-) create mode 100644 test/libevmasm/EVMAssemblyTest.cpp create mode 100644 test/libevmasm/EVMAssemblyTest.h create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/code_generation_error.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/invalid_json.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_eof_version.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_evm_version.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_constant_optimizer.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_cse.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_deduplicate.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_expected_executions_per_deployment.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_inliner.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_jumpdest_remover.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_peephole.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_preset.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/settings_outputs.asmjson create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/smoke.asmjson diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index da115f0d4a5b..6f48b8a8469e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -51,6 +51,8 @@ detect_stray_source_files("${libsolutil_sources}" "libsolutil/") set(libevmasm_sources libevmasm/Assembler.cpp + libevmasm/EVMAssemblyTest.cpp + libevmasm/EVMAssemblyTest.h libevmasm/Optimiser.cpp ) detect_stray_source_files("${libevmasm_sources}" "libevmasm/") diff --git a/test/InteractiveTests.h b/test/InteractiveTests.h index e043fcdbe676..107a6aae0bef 100644 --- a/test/InteractiveTests.h +++ b/test/InteractiveTests.h @@ -42,6 +42,8 @@ #include #include +#include + #include namespace solidity::frontend::test @@ -64,6 +66,7 @@ struct Testsuite Testsuite const g_interactiveTestsuites[] = { /* Title Path Subpath SMT NeedsVM Creator function */ + {"EVM Assembly", "libevmasm", "evmAssemblyTests", false, false, &evmasm::test::EVMAssemblyTest::create}, {"Yul Optimizer", "libyul", "yulOptimizerTests", false, false, &yul::test::YulOptimizerTest::create}, {"Yul Interpreter", "libyul", "yulInterpreterTests", false, false, &yul::test::YulInterpreterTest::create}, {"Yul Object Compiler", "libyul", "objectCompiler", false, false, &yul::test::ObjectCompilerTest::create}, diff --git a/test/TestCase.cpp b/test/TestCase.cpp index da47c26fde90..8a8d2451d1f2 100644 --- a/test/TestCase.cpp +++ b/test/TestCase.cpp @@ -51,9 +51,10 @@ void TestCase::printUpdatedSettings(std::ostream& _stream, std::string const& _l bool TestCase::isTestFilename(boost::filesystem::path const& _filename) { std::string extension = _filename.extension().string(); - return (extension == ".sol" || extension == ".yul" || extension == ".stack") && - !boost::starts_with(_filename.string(), "~") && - !boost::starts_with(_filename.string(), "."); + // NOTE: .asmjson rather than .json because JSON files that do not represent test cases exist in some test dirs. + return (extension == ".sol" || extension == ".yul" || extension == ".asmjson" || extension == ".stack") && + !_filename.string().starts_with('~') && + !_filename.string().starts_with('.'); } bool TestCase::shouldRun() diff --git a/test/libevmasm/EVMAssemblyTest.cpp b/test/libevmasm/EVMAssemblyTest.cpp new file mode 100644 index 000000000000..b497c51476e6 --- /dev/null +++ b/test/libevmasm/EVMAssemblyTest.cpp @@ -0,0 +1,158 @@ +/* + 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 std::string_literals; +using namespace solidity; +using namespace solidity::test; +using namespace solidity::evmasm; +using namespace solidity::evmasm::test; +using namespace solidity::frontend; +using namespace solidity::frontend::test; +using namespace solidity::langutil; +using namespace solidity::util; + +std::vector const EVMAssemblyTest::c_outputLabels = { + "Assembly", + "Bytecode", + "Opcodes", + "SourceMappings", +}; + +std::unique_ptr EVMAssemblyTest::create(Config const& _config) +{ + return std::make_unique(_config.filename); +} + +EVMAssemblyTest::EVMAssemblyTest(std::string const& _filename): + EVMVersionRestrictedTestCase(_filename) +{ + m_source = m_reader.source(); + m_expectation = m_reader.simpleExpectations(); + + if (!_filename.ends_with(".asmjson")) + BOOST_THROW_EXCEPTION(std::runtime_error("Not an assembly test: \"" + _filename + "\". Allowed extensions: .asmjson.")); + + m_selectedOutputs = m_reader.stringSetting("outputs", "Assembly,Bytecode,Opcodes,SourceMappings"); + OptimisationPreset optimizationPreset = m_reader.enumSetting( + "optimizationPreset", + { + {"none", OptimisationPreset::None}, + {"minimal", OptimisationPreset::Minimal}, + {"standard", OptimisationPreset::Standard}, + {"full", OptimisationPreset::Full}, + }, + "none" + ); + m_optimizerSettings = Assembly::OptimiserSettings::translateSettings(OptimiserSettings::preset(optimizationPreset)); + m_optimizerSettings.expectedExecutionsPerDeployment = m_reader.sizetSetting( + "optimizer.expectedExecutionsPerDeployment", + m_optimizerSettings.expectedExecutionsPerDeployment + ); + + auto const optimizerComponentSetting = [&](std::string const& _component, bool& _setting) { + _setting = m_reader.boolSetting("optimizer." + _component, _setting); + }; + optimizerComponentSetting("inliner", m_optimizerSettings.runInliner); + optimizerComponentSetting("jumpdestRemover", m_optimizerSettings.runJumpdestRemover); + optimizerComponentSetting("peephole", m_optimizerSettings.runPeephole); + optimizerComponentSetting("deduplicate", m_optimizerSettings.runDeduplicate); + optimizerComponentSetting("cse", m_optimizerSettings.runCSE); + optimizerComponentSetting("constantOptimizer", m_optimizerSettings.runConstantOptimiser); + + // TODO: Enable when assembly import for EOF is implemented. + if (CommonOptions::get().eofVersion().has_value()) + m_shouldRun = false; +} + +TestCase::TestResult EVMAssemblyTest::run(std::ostream& _stream, std::string const& _linePrefix, bool const _formatted) +{ + EVMAssemblyStack evmAssemblyStack( + CommonOptions::get().evmVersion(), + CommonOptions::get().eofVersion(), + m_optimizerSettings + ); + + evmAssemblyStack.selectDebugInfo(DebugInfoSelection::AllExceptExperimental()); + + try + { + evmAssemblyStack.parseAndAnalyze(m_reader.fileName().filename().string(), m_source); + } + catch (AssemblyImportException const& _exception) + { + m_obtainedResult = "AssemblyImportException: "s + _exception.what() + "\n"; + return checkResult(_stream, _linePrefix, _formatted); + } + + try + { + evmAssemblyStack.assemble(); + } + catch (Error const& _error) + { + // TODO: EVMAssemblyStack should catch these on its own and provide an error reporter. + soltestAssert(_error.comment(), "Errors must include a message for the user."); + m_obtainedResult = Error::formatErrorType(_error.type()) + ": " + *_error.comment() + "\n"; + return checkResult(_stream, _linePrefix, _formatted); + } + soltestAssert(evmAssemblyStack.compilationSuccessful()); + + auto const produceOutput = [&](std::string const& _output) { + if (_output == "Assembly") + return evmAssemblyStack.assemblyString({{m_reader.fileName().filename().string(), m_source}}); + if (_output == "Bytecode") + return util::toHex(evmAssemblyStack.object().bytecode); + if (_output == "Opcodes") + return disassemble(evmAssemblyStack.object().bytecode, CommonOptions::get().evmVersion()); + if (_output == "SourceMappings") + return evmAssemblyStack.sourceMapping(); + soltestAssert(false); + unreachable(); + }; + + std::set selectedOutputSet; + boost::split(selectedOutputSet, m_selectedOutputs, boost::is_any_of(",")); + for (std::string const& output: c_outputLabels) + if (selectedOutputSet.contains(output)) + { + if (!m_obtainedResult.empty() && m_obtainedResult.back() != '\n') + m_obtainedResult += "\n"; + + // Don't trim on the left to avoid stripping indentation. + std::string content = produceOutput(output); + boost::trim_right(content); + std::string separator = (content.empty() ? "" : (output == "Assembly" ? "\n" : " ")); + m_obtainedResult += output + ":" + separator + content; + } + if (!m_obtainedResult.empty() && m_obtainedResult.back() != '\n') + m_obtainedResult += "\n"; + + return checkResult(_stream, _linePrefix, _formatted); +} diff --git a/test/libevmasm/EVMAssemblyTest.h b/test/libevmasm/EVMAssemblyTest.h new file mode 100644 index 000000000000..f8923c0dc1a1 --- /dev/null +++ b/test/libevmasm/EVMAssemblyTest.h @@ -0,0 +1,70 @@ +/* + 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 + +#include +#include +#include +#include + +namespace solidity::evmasm::test +{ + +/// Custom test case that runs the final part of the compiler pipeline (assembling into bytecode). +/// Supports assembly JSON format produced by --asm-json. +/// +/// Available settings: +/// - EVMVersion: The range of EVM versions to run the test for. Inherited from EVMVersionRestrictedTestCase. +/// - bytecodeFormat: The range of bytecode formats (EOF/legacy) to run the test for. Inherited from EVMVersionRestrictedTestCase. +/// - outputs: List of outputs to include in the test. The order of values does NOT determine the order +/// in which the outputs are printed. Supported outputs: Assembly, Bytecode, Opcodes, SourceMappings. +/// The default is to print all outputs. +/// - optimizationPreset: Preset to load as the base optimizer settings. +/// One of: none, minimal, standard, full. The default is none. +/// - optimizer.*: A set of detailed optimizer settings applied on top of the base preset. +/// Each one corresponds to a field in Assembly::OptimiserSettings and uses the value from the +/// preset as its default. Available settings: +/// - optimizer.expectedExecutionsPerDeployment (integer) +/// - optimizer.inliner (bool) +/// - optimizer.jumpdestRemover (bool) +/// - optimizer.peephole (bool) +/// - optimizer.deduplicate (bool) +/// - optimizer.cse (bool) +/// - optimizer.constantOptimizer (bool) +class EVMAssemblyTest: public frontend::test::EVMVersionRestrictedTestCase +{ +public: + static std::unique_ptr create(Config const& _config); + + EVMAssemblyTest(std::string const& _filename); + + TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool const _formatted = false) override; + +private: + static std::vector const c_outputLabels; + + std::string m_selectedOutputs; + evmasm::Assembly::OptimiserSettings m_optimizerSettings; +}; + +} diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/code_generation_error.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/code_generation_error.asmjson new file mode 100644 index 000000000000..4297c5f35b80 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/code_generation_error.asmjson @@ -0,0 +1,14 @@ +{ + ".code": [ + {"name": "PUSH [$]", "value": "0"} + ], + ".data": { + "0": { + ".code": [ + {"name": "PUSHIMMUTABLE", "value": "x"} + ] + } + } +} +// ---- +// CodeGenerationError: Some immutables were read from but never assigned, possibly because of optimization. diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/invalid_json.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/invalid_json.asmjson new file mode 100644 index 000000000000..a834108d1ad7 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/invalid_json.asmjson @@ -0,0 +1,3 @@ +{ +// ---- +// AssemblyImportException: Could not parse JSON file. diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_eof_version.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_eof_version.asmjson new file mode 100644 index 000000000000..5785b4b8931e --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_eof_version.asmjson @@ -0,0 +1,13 @@ +{ + ".code": [ + {"name": "CODESIZE"} + ] +} +// ==== +// bytecodeFormat: legacy +// ---- +// Assembly: +// codesize +// Bytecode: 38 +// Opcodes: CODESIZE +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_evm_version.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_evm_version.asmjson new file mode 100644 index 000000000000..a0f042b32e88 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_evm_version.asmjson @@ -0,0 +1,13 @@ +{ + ".code": [ + {"name": "BLOBBASEFEE"} + ] +} +// ==== +// EVMVersion: >=cancun +// ---- +// Assembly: +// blobbasefee +// Bytecode: 4a +// Opcodes: BLOBBASEFEE +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_constant_optimizer.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_constant_optimizer.asmjson new file mode 100644 index 000000000000..a3610217fbaf --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_constant_optimizer.asmjson @@ -0,0 +1,14 @@ +{ + ".code": [ + {"name": "PUSH", "value": "ffffffffffffffff"} + ] +} +// ==== +// optimizationPreset: none +// optimizer.constantOptimizer: true +// ---- +// Assembly: +// sub(shl(0x40, 0x01), 0x01) +// Bytecode: 6001600160401b03 +// Opcodes: PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB +// SourceMappings: :::-:0;;;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_cse.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_cse.asmjson new file mode 100644 index 000000000000..c8133b43f799 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_cse.asmjson @@ -0,0 +1,16 @@ +{ + ".code": [ + {"name": "PUSH", "value": "0"}, + {"name": "DUP2"}, + {"name": "SUB"} + ] +} +// ==== +// optimizationPreset: none +// optimizer.cse: true +// ---- +// Assembly: +// dup1 +// Bytecode: 80 +// Opcodes: DUP1 +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_deduplicate.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_deduplicate.asmjson new file mode 100644 index 000000000000..67b87e59e9ee --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_deduplicate.asmjson @@ -0,0 +1,26 @@ +{ + ".code": [ + {"name": "PUSH [tag]", "value": "1"}, + {"name": "PUSH [tag]", "value": "2"}, + {"name": "tag", "value": "1"}, + {"name": "JUMPDEST"}, + {"name": "JUMP"}, + {"name": "tag", "value": "2"}, + {"name": "JUMPDEST"}, + {"name": "JUMP"} + ] +} +// ==== +// optimizationPreset: none +// optimizer.deduplicate: true +// ---- +// Assembly: +// tag_1 +// tag_1 +// tag_1: +// jump +// tag_2: +// jump +// Bytecode: 600460045b565b56 +// Opcodes: PUSH1 0x4 PUSH1 0x4 JUMPDEST JUMP JUMPDEST JUMP +// SourceMappings: :::-:0;;;;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_expected_executions_per_deployment.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_expected_executions_per_deployment.asmjson new file mode 100644 index 000000000000..b9fd814d5c8e --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_expected_executions_per_deployment.asmjson @@ -0,0 +1,26 @@ +{ + ".code": [ + {"name": "PUSH [$]", "value": "0"} + ], + ".data": { + "0": { + ".code": [ + {"name": "PUSH", "value": "ffffffffffffffff"} + ] + } + } +} +// ==== +// optimizationPreset: standard +// optimizer.expectedExecutionsPerDeployment: 0 +// ---- +// Assembly: +// dataOffset(sub_0) +// stop +// +// sub_0: assembly { +// sub(shl(0x40, 0x01), 0x01) +// } +// Bytecode: 6003fe6001600160401b03 +// Opcodes: PUSH1 0x3 INVALID PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_inliner.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_inliner.asmjson new file mode 100644 index 000000000000..81be6392c444 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_inliner.asmjson @@ -0,0 +1,33 @@ +{ + ".code": [ + {"name": "PUSH [tag]", "value": "1"}, + {"name": "PUSH [tag]", "value": "2"}, + {"name": "JUMP"}, + {"name": "tag", "value": "1"}, + {"name": "JUMPDEST"}, + {"name": "STOP"}, + {"name": "tag", "value": "2"}, + {"name": "JUMPDEST"}, + {"name": "CALLVALUE"}, + {"name": "SWAP1"}, + {"name": "JUMP"} + ] +} +// ==== +// optimizationPreset: none +// optimizer.inliner: true +// ---- +// Assembly: +// tag_1 +// callvalue +// swap1 +// jump +// tag_1: +// stop +// tag_2: +// callvalue +// swap1 +// jump +// Bytecode: 60053490565b005b349056 +// Opcodes: PUSH1 0x5 CALLVALUE SWAP1 JUMP JUMPDEST STOP JUMPDEST CALLVALUE SWAP1 JUMP +// SourceMappings: :::-:0;;;;;;;;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_jumpdest_remover.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_jumpdest_remover.asmjson new file mode 100644 index 000000000000..baca77b992fc --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_jumpdest_remover.asmjson @@ -0,0 +1,14 @@ +{ + ".code": [ + {"name": "tag", "value": "1"}, + {"name": "JUMPDEST"} + ] +} +// ==== +// optimizationPreset: none +// optimizer.jumpdestRemover: true +// ---- +// Assembly: +// Bytecode: +// Opcodes: +// SourceMappings: diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_peephole.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_peephole.asmjson new file mode 100644 index 000000000000..f9e7c3b8d550 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_peephole.asmjson @@ -0,0 +1,15 @@ +{ + ".code": [ + {"name": "STOP"}, + {"name": "STOP"} + ] +} +// ==== +// optimizationPreset: none +// optimizer.peephole: true +// ---- +// Assembly: +// stop +// Bytecode: 00 +// Opcodes: STOP +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_preset.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_preset.asmjson new file mode 100644 index 000000000000..706a3ae8b61a --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_optimizer_preset.asmjson @@ -0,0 +1,18 @@ +{ + ".code": [ + {"name": "PUSH", "value": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, + {"name": "PUSH", "value": "42"}, + {"name": "PUSH", "value": "24"}, + {"name": "SWAP1"}, + {"name": "ADD"} + ] +} +// ==== +// optimizationPreset: full +// ---- +// Assembly: +// not(0x00) +// 0x66 +// Bytecode: 5f196066 +// Opcodes: PUSH0 NOT PUSH1 0x66 +// SourceMappings: :::-:0;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_outputs.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_outputs.asmjson new file mode 100644 index 000000000000..2af7b57c3e75 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/settings_outputs.asmjson @@ -0,0 +1,10 @@ +{ + ".code": [ + {"name": "CALLVALUE"} + ] +} +// ==== +// outputs: SourceMappings,Opcodes +// ---- +// Opcodes: CALLVALUE +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/smoke.asmjson b/test/libevmasm/evmAssemblyTests/isoltestTesting/smoke.asmjson new file mode 100644 index 000000000000..99e527a72587 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/smoke.asmjson @@ -0,0 +1,11 @@ +{ + ".code": [ + {"name": "CALLVALUE"} + ] +} +// ---- +// Assembly: +// callvalue +// Bytecode: 34 +// Opcodes: CALLVALUE +// SourceMappings: :::-:0 diff --git a/test/tools/CMakeLists.txt b/test/tools/CMakeLists.txt index 5c1d41b7f595..13018bf18512 100644 --- a/test/tools/CMakeLists.txt +++ b/test/tools/CMakeLists.txt @@ -18,6 +18,7 @@ add_executable(isoltest ../EVMHost.cpp ../TestCase.cpp ../TestCaseReader.cpp + ../libevmasm/EVMAssemblyTest.cpp ../libsolidity/util/BytesUtils.cpp ../libsolidity/util/Common.cpp ../libsolidity/util/ContractABIUtils.cpp diff --git a/test/tools/isoltest.cpp b/test/tools/isoltest.cpp index 57ab4af16034..32309b005507 100644 --- a/test/tools/isoltest.cpp +++ b/test/tools/isoltest.cpp @@ -75,7 +75,7 @@ class TestFilter boost::replace_all(filter, "/", "\\/"); boost::replace_all(filter, "*", ".*"); - m_filterExpression = std::regex{"(" + filter + "(\\.sol|\\.yul|\\.stack))"}; + m_filterExpression = std::regex{"(" + filter + "(\\.sol|\\.yul|\\.asmjson|\\.stack))"}; } bool matches(fs::path const& _path, std::string const& _name) const From fe3955111883851f64939783b9f542ccf33f6998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 18 Apr 2025 03:18:05 +0200 Subject: [PATCH 66/80] Support human-readable assembly in EVM assembly test case --- test/CMakeLists.txt | 2 + test/TestCase.cpp | 2 +- test/libevmasm/EVMAssemblyTest.cpp | 29 ++- test/libevmasm/EVMAssemblyTest.h | 16 +- test/libevmasm/PlainAssemblyParser.cpp | 180 ++++++++++++++++++ test/libevmasm/PlainAssemblyParser.h | 79 ++++++++ .../isoltestTesting/comments.asm | 34 ++++ .../isoltestTesting/jumps.asm | 56 ++++++ .../isoltestTesting/operations.asm | 53 ++++++ .../evmAssemblyTests/isoltestTesting/push.asm | 35 ++++ .../isoltestTesting/smoke_plain.asm | 16 ++ test/tools/CMakeLists.txt | 1 + test/tools/isoltest.cpp | 2 +- 13 files changed, 497 insertions(+), 8 deletions(-) create mode 100644 test/libevmasm/PlainAssemblyParser.cpp create mode 100644 test/libevmasm/PlainAssemblyParser.h create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/comments.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/jumps.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/operations.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/push.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/smoke_plain.asm diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6f48b8a8469e..c66963c190d4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -54,6 +54,8 @@ set(libevmasm_sources libevmasm/EVMAssemblyTest.cpp libevmasm/EVMAssemblyTest.h libevmasm/Optimiser.cpp + libevmasm/PlainAssemblyParser.cpp + libevmasm/PlainAssemblyParser.h ) detect_stray_source_files("${libevmasm_sources}" "libevmasm/") diff --git a/test/TestCase.cpp b/test/TestCase.cpp index 8a8d2451d1f2..efc455ff6ff1 100644 --- a/test/TestCase.cpp +++ b/test/TestCase.cpp @@ -52,7 +52,7 @@ bool TestCase::isTestFilename(boost::filesystem::path const& _filename) { std::string extension = _filename.extension().string(); // NOTE: .asmjson rather than .json because JSON files that do not represent test cases exist in some test dirs. - return (extension == ".sol" || extension == ".yul" || extension == ".asmjson" || extension == ".stack") && + return (extension == ".sol" || extension == ".yul" || extension == ".asm" || extension == ".asmjson" || extension == ".stack") && !_filename.string().starts_with('~') && !_filename.string().starts_with('.'); } diff --git a/test/libevmasm/EVMAssemblyTest.cpp b/test/libevmasm/EVMAssemblyTest.cpp index b497c51476e6..0c1dbb07ed7c 100644 --- a/test/libevmasm/EVMAssemblyTest.cpp +++ b/test/libevmasm/EVMAssemblyTest.cpp @@ -17,6 +17,8 @@ #include +#include + #include #include @@ -39,6 +41,7 @@ using namespace solidity::langutil; using namespace solidity::util; std::vector const EVMAssemblyTest::c_outputLabels = { + "InputAssemblyJSON", "Assembly", "Bytecode", "Opcodes", @@ -56,8 +59,12 @@ EVMAssemblyTest::EVMAssemblyTest(std::string const& _filename): m_source = m_reader.source(); m_expectation = m_reader.simpleExpectations(); - if (!_filename.ends_with(".asmjson")) - BOOST_THROW_EXCEPTION(std::runtime_error("Not an assembly test: \"" + _filename + "\". Allowed extensions: .asmjson.")); + if (_filename.ends_with(".asmjson")) + m_assemblyFormat = AssemblyFormat::JSON; + else if (_filename.ends_with(".asm")) + m_assemblyFormat = AssemblyFormat::Plain; + else + BOOST_THROW_EXCEPTION(std::runtime_error("Not an assembly test: \"" + _filename + "\". Allowed extensions: .asm, .asmjson.")); m_selectedOutputs = m_reader.stringSetting("outputs", "Assembly,Bytecode,Opcodes,SourceMappings"); OptimisationPreset optimizationPreset = m_reader.enumSetting( @@ -101,9 +108,23 @@ TestCase::TestResult EVMAssemblyTest::run(std::ostream& _stream, std::string con evmAssemblyStack.selectDebugInfo(DebugInfoSelection::AllExceptExperimental()); + std::string assemblyJSON; + switch (m_assemblyFormat) + { + case AssemblyFormat::JSON: + assemblyJSON = m_source; + break; + case AssemblyFormat::Plain: + assemblyJSON = jsonPrint( + PlainAssemblyParser{}.parse(m_reader.fileName().filename().string(), m_source), + {JsonFormat::Pretty, 4} + ); + break; + } + try { - evmAssemblyStack.parseAndAnalyze(m_reader.fileName().filename().string(), m_source); + evmAssemblyStack.parseAndAnalyze(m_reader.fileName().filename().string(), assemblyJSON); } catch (AssemblyImportException const& _exception) { @@ -125,6 +146,8 @@ TestCase::TestResult EVMAssemblyTest::run(std::ostream& _stream, std::string con soltestAssert(evmAssemblyStack.compilationSuccessful()); auto const produceOutput = [&](std::string const& _output) { + if (_output == "InputAssemblyJSON") + return assemblyJSON; if (_output == "Assembly") return evmAssemblyStack.assemblyString({{m_reader.fileName().filename().string(), m_source}}); if (_output == "Bytecode") diff --git a/test/libevmasm/EVMAssemblyTest.h b/test/libevmasm/EVMAssemblyTest.h index f8923c0dc1a1..9059fd716d81 100644 --- a/test/libevmasm/EVMAssemblyTest.h +++ b/test/libevmasm/EVMAssemblyTest.h @@ -31,14 +31,17 @@ namespace solidity::evmasm::test { /// Custom test case that runs the final part of the compiler pipeline (assembling into bytecode). -/// Supports assembly JSON format produced by --asm-json. +/// Supports two kinds of input (depending on file extension): +/// - .asmjson: assembly JSON format produced by --asm-json. +/// - .asm: plain assembly, a more limited but human-readable format that is internally converted +/// to assembly JSON. /// /// Available settings: /// - EVMVersion: The range of EVM versions to run the test for. Inherited from EVMVersionRestrictedTestCase. /// - bytecodeFormat: The range of bytecode formats (EOF/legacy) to run the test for. Inherited from EVMVersionRestrictedTestCase. /// - outputs: List of outputs to include in the test. The order of values does NOT determine the order -/// in which the outputs are printed. Supported outputs: Assembly, Bytecode, Opcodes, SourceMappings. -/// The default is to print all outputs. +/// in which the outputs are printed. Supported outputs: InputAssemblyJSON, Assembly, Bytecode, Opcodes, SourceMappings. +/// The default is to print all outputs except InputAssemblyJSON. /// - optimizationPreset: Preset to load as the base optimizer settings. /// One of: none, minimal, standard, full. The default is none. /// - optimizer.*: A set of detailed optimizer settings applied on top of the base preset. @@ -61,8 +64,15 @@ class EVMAssemblyTest: public frontend::test::EVMVersionRestrictedTestCase TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool const _formatted = false) override; private: + enum class AssemblyFormat + { + JSON, + Plain, + }; + static std::vector const c_outputLabels; + AssemblyFormat m_assemblyFormat{}; std::string m_selectedOutputs; evmasm::Assembly::OptimiserSettings m_optimizerSettings; }; diff --git a/test/libevmasm/PlainAssemblyParser.cpp b/test/libevmasm/PlainAssemblyParser.cpp new file mode 100644 index 000000000000..0fb9d62c8c10 --- /dev/null +++ b/test/libevmasm/PlainAssemblyParser.cpp @@ -0,0 +1,180 @@ +/* + 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 std::string_literals; +using namespace solidity; +using namespace solidity::test; +using namespace solidity::evmasm; +using namespace solidity::evmasm::test; +using namespace solidity::langutil; + +Json PlainAssemblyParser::parse(std::string _sourceName, std::string const& _source) +{ + m_sourceName = std::move(_sourceName); + Json codeJSON = Json::array(); + std::istringstream sourceStream(_source); + while (getline(sourceStream, m_line)) + { + advanceLine(m_line); + if (m_lineTokens.empty()) + continue; + + if (c_instructions.contains(currentToken().value)) + { + expectNoMoreArguments(); + codeJSON.push_back({{"name", currentToken().value}}); + } + else if (currentToken().value == "PUSH") + { + if (hasMoreTokens() && nextToken().value == "[tag]") + { + advanceToken(); + std::string_view tagID = expectArgument(); + expectNoMoreArguments(); + codeJSON.push_back({{"name", "PUSH [tag]"}, {"value", tagID}}); + } + else + { + std::string_view immediateArgument = expectArgument(); + expectNoMoreArguments(); + + if (!immediateArgument.starts_with("0x")) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("The immediate argument to PUSH must be a hex number prefixed with '0x'."))); + + immediateArgument.remove_prefix("0x"s.size()); + codeJSON.push_back({{"name", "PUSH"}, {"value", immediateArgument}}); + } + } + else if (currentToken().value == "tag") + { + std::string_view tagID = expectArgument(); + expectNoMoreArguments(); + + codeJSON.push_back({{"name", "tag"}, {"value", tagID}}); + codeJSON.push_back({{"name", "JUMPDEST"}}); + } + else + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Unknown instruction."))); + } + return {{".code", codeJSON}}; +} + +PlainAssemblyParser::Token const& PlainAssemblyParser::currentToken() const +{ + soltestAssert(m_tokenIndex < m_lineTokens.size()); + return m_lineTokens[m_tokenIndex]; +} + +PlainAssemblyParser::Token const& PlainAssemblyParser::nextToken() const +{ + soltestAssert(m_tokenIndex + 1 < m_lineTokens.size()); + return m_lineTokens[m_tokenIndex + 1]; +} + +bool PlainAssemblyParser::advanceToken() +{ + if (!hasMoreTokens()) + return false; + + ++m_tokenIndex; + return true; +} + +std::string_view PlainAssemblyParser::expectArgument() +{ + bool hasArgument = advanceToken(); + if (!hasArgument) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Missing argument(s)."))); + + return currentToken().value; +} + +void PlainAssemblyParser::expectNoMoreArguments() +{ + bool hasArgument = advanceToken(); + if (hasArgument) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Too many arguments."))); +} + +void PlainAssemblyParser::advanceLine(std::string_view _line) +{ + ++m_lineNumber; + m_line = _line; + m_lineTokens = tokenizeLine(m_line); + m_tokenIndex = 0; +} + +std::vector PlainAssemblyParser::tokenizeLine(std::string_view _line) +{ + auto const notWhiteSpace = [](char _c) { return !isWhiteSpace(_c); }; + + std::vector tokens; + auto tokenLocation = boost::find_token(_line, notWhiteSpace, boost::token_compress_on); + while (!tokenLocation.empty()) + { + std::string_view value{tokenLocation.begin(), tokenLocation.end()}; + if (value.starts_with("//")) + break; + + tokens.push_back({ + .value = value, + .position = static_cast(std::distance(_line.begin(), tokenLocation.begin())), + }); + soltestAssert(!value.empty()); + soltestAssert(tokens.back().position < _line.size()); + soltestAssert(tokens.back().position + value.size() <= _line.size()); + + std::string_view tail{tokenLocation.end(), _line.end()}; + tokenLocation = boost::find_token(tail, notWhiteSpace, boost::token_compress_on); + } + + return tokens; +} + +std::string PlainAssemblyParser::formatError(std::string_view _message) const +{ + std::string lineNumberString = std::to_string(m_lineNumber); + std::string padding(lineNumberString.size(), ' '); + std::string underline = std::string(currentToken().position, ' ') + std::string(currentToken().value.size(), '^'); + return fmt::format( + "Error while parsing plain assembly: {}\n" + "{}--> {}\n" + "{} | \n" + "{} | {}\n" + "{} | {}\n", + _message, + padding, m_sourceName, + padding, + m_lineNumber, m_line, + padding, underline + ); +} diff --git a/test/libevmasm/PlainAssemblyParser.h b/test/libevmasm/PlainAssemblyParser.h new file mode 100644 index 000000000000..0154af5f7f19 --- /dev/null +++ b/test/libevmasm/PlainAssemblyParser.h @@ -0,0 +1,79 @@ +/* + 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 +#include +#include + +namespace solidity::evmasm::test +{ + +/// Parser for the plain assembly format. The format is meant to be good enough for humans to read +/// while being straightforward to map to the assembly JSON format that solc can import. +/// +/// Syntax: +/// - Every line consists of zero or more whitespace-separated tokens. +/// - A token that begins with `//` starts a comment, which extends to the end of the line. +/// - A non-empty line represents a single assembly item. +/// - The name of the item is the first thing on the line and may consist of one or more tokens. +/// - One or more arguments follow the name. +/// +/// Supported items: +/// - All instruction names. +/// - PUSH +/// - PUSH [tag] +/// - tag +class PlainAssemblyParser +{ +public: + /// Parses plain assembly format and returns the equivalent assembly JSON. + /// Errors are reported by throwing runtime_error. + Json parse(std::string _sourceName, std::string const& _source); + +protected: + struct Token + { + std::string_view value; ///< Substring of m_line that represents a complete token. + size_t position; ///< Position of the first character of the token within m_line. + }; + + Token const& currentToken() const; + Token const& nextToken() const; + bool hasMoreTokens() const { return m_tokenIndex + 1 < m_lineTokens.size(); } + + bool advanceToken(); + std::string_view expectArgument(); + void expectNoMoreArguments(); + void advanceLine(std::string_view _line); + + static std::vector tokenizeLine(std::string_view _line); + std::string formatError(std::string_view _message) const; + +private: + std::string m_sourceName; ///< Name of the file the source comes from. + size_t m_lineNumber = 0; ///< The number of the current line within the source, 1-based. + std::string m_line; ///< The current line, unparsed. + std::vector m_lineTokens; ///< Decomposition of the current line into tokens (does not include comments). + size_t m_tokenIndex = 0; ///< Points at a token within m_lineTokens. +}; + +} diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/comments.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/comments.asm new file mode 100644 index 000000000000..13dca3ad1b2f --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/comments.asm @@ -0,0 +1,34 @@ +// +//// comment + // comment +CALLVALUE // 0xff +CALLVALUE //0xff + +PUSH 0xff // comment // //0xff +// + +// +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "CALLVALUE" +// }, +// { +// "name": "CALLVALUE" +// }, +// { +// "name": "PUSH", +// "value": "ff" +// } +// ] +// } +// Assembly: +// callvalue +// callvalue +// 0xff +// Bytecode: 343460ff +// Opcodes: CALLVALUE CALLVALUE PUSH1 0xFF +// SourceMappings: :::-:0;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/jumps.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/jumps.asm new file mode 100644 index 000000000000..be92671d8141 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/jumps.asm @@ -0,0 +1,56 @@ +PUSH [tag] 1 +JUMP +tag 1 +PUSH 0x01 +JUMPI +PUSH [tag] 0x012AB +tag 0x012AB +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "PUSH [tag]", +// "value": "1" +// }, +// { +// "name": "JUMP" +// }, +// { +// "name": "tag", +// "value": "1" +// }, +// { +// "name": "JUMPDEST" +// }, +// { +// "name": "PUSH", +// "value": "01" +// }, +// { +// "name": "JUMPI" +// }, +// { +// "name": "PUSH [tag]", +// "value": "0x012AB" +// }, +// { +// "name": "tag", +// "value": "0x012AB" +// }, +// { +// "name": "JUMPDEST" +// } +// ] +// } +// Assembly: +// jump(tag_1) +// tag_1: +// 0x01 +// jumpi +// tag_4779 +// tag_4779: +// Bytecode: 6003565b60015760095b +// Opcodes: PUSH1 0x3 JUMP JUMPDEST PUSH1 0x1 JUMPI PUSH1 0x9 JUMPDEST +// SourceMappings: :::-:0;;;;;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/operations.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/operations.asm new file mode 100644 index 000000000000..923b0a6b1f37 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/operations.asm @@ -0,0 +1,53 @@ +NUMBER +SLOAD +ADDRESS +ORIGIN +ADD +DUP1 +SWAP1 +MSTORE8 +STOP +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "NUMBER" +// }, +// { +// "name": "SLOAD" +// }, +// { +// "name": "ADDRESS" +// }, +// { +// "name": "ORIGIN" +// }, +// { +// "name": "ADD" +// }, +// { +// "name": "DUP1" +// }, +// { +// "name": "SWAP1" +// }, +// { +// "name": "MSTORE8" +// }, +// { +// "name": "STOP" +// } +// ] +// } +// Assembly: +// sload(number) +// add(origin, address) +// dup1 +// swap1 +// mstore8 +// stop +// Bytecode: 435430320180905300 +// Opcodes: NUMBER SLOAD ADDRESS ORIGIN ADD DUP1 SWAP1 MSTORE8 STOP +// SourceMappings: :::-:0;;;;;;;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/push.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/push.asm new file mode 100644 index 000000000000..51bc160507c7 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/push.asm @@ -0,0 +1,35 @@ +PUSH 0x0 +PUSH 0x1 +PUSH 0x0123456789ABCDEF +PUSH 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "PUSH", +// "value": "0" +// }, +// { +// "name": "PUSH", +// "value": "1" +// }, +// { +// "name": "PUSH", +// "value": "0123456789ABCDEF" +// }, +// { +// "name": "PUSH", +// "value": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" +// } +// ] +// } +// Assembly: +// 0x00 +// 0x01 +// 0x0123456789abcdef +// 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +// Bytecode: 5f6001670123456789abcdef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +// Opcodes: PUSH0 PUSH1 0x1 PUSH8 0x123456789ABCDEF PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +// SourceMappings: :::-:0;;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/smoke_plain.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/smoke_plain.asm new file mode 100644 index 000000000000..a1714241fb86 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/smoke_plain.asm @@ -0,0 +1,16 @@ +CALLVALUE +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "CALLVALUE" +// } +// ] +// } +// Assembly: +// callvalue +// Bytecode: 34 +// Opcodes: CALLVALUE +// SourceMappings: :::-:0 diff --git a/test/tools/CMakeLists.txt b/test/tools/CMakeLists.txt index 13018bf18512..289f2f2def35 100644 --- a/test/tools/CMakeLists.txt +++ b/test/tools/CMakeLists.txt @@ -19,6 +19,7 @@ add_executable(isoltest ../TestCase.cpp ../TestCaseReader.cpp ../libevmasm/EVMAssemblyTest.cpp + ../libevmasm/PlainAssemblyParser.cpp ../libsolidity/util/BytesUtils.cpp ../libsolidity/util/Common.cpp ../libsolidity/util/ContractABIUtils.cpp diff --git a/test/tools/isoltest.cpp b/test/tools/isoltest.cpp index 32309b005507..26efc089020b 100644 --- a/test/tools/isoltest.cpp +++ b/test/tools/isoltest.cpp @@ -75,7 +75,7 @@ class TestFilter boost::replace_all(filter, "/", "\\/"); boost::replace_all(filter, "*", ".*"); - m_filterExpression = std::regex{"(" + filter + "(\\.sol|\\.yul|\\.asmjson|\\.stack))"}; + m_filterExpression = std::regex{"(" + filter + "(\\.sol|\\.yul|\\.asm|\\.asmjson|\\.stack))"}; } bool matches(fs::path const& _path, std::string const& _name) const From 975ee1325833c6784adff85072c55c3ecf9439fc Mon Sep 17 00:00:00 2001 From: rodiazet Date: Wed, 9 Apr 2025 15:30:26 +0200 Subject: [PATCH 67/80] eof: Enable peephole optimizer for EOF. --- libevmasm/Assembly.cpp | 3 +- libevmasm/AssemblyItem.h | 2 +- libevmasm/PeepholeOptimiser.cpp | 12 ++++-- test/Common.cpp | 7 ++++ test/Common.h | 4 ++ test/libevmasm/Optimiser.cpp | 40 +++++++++++++++++++ .../objectCompiler/eof/256_subcontainers.yul | 8 ++-- 7 files changed, 65 insertions(+), 11 deletions(-) diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp index a0711cd41756..9dd203a0f802 100644 --- a/libevmasm/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -843,8 +843,7 @@ std::map const& Assembly::optimiseInternal( } } - // TODO: verify this for EOF. - if (_settings.runPeephole && !m_eofVersion.has_value()) + if (_settings.runPeephole) { for (auto& codeSection: m_codeSections) { diff --git a/libevmasm/AssemblyItem.h b/libevmasm/AssemblyItem.h index 8b65d77c91e9..0dfe0749768a 100644 --- a/libevmasm/AssemblyItem.h +++ b/libevmasm/AssemblyItem.h @@ -244,7 +244,7 @@ class AssemblyItem /// Shortcut that avoids constructing an AssemblyItem just to perform the comparison. bool operator==(Instruction _instr) const { - return type() == Operation && instruction() == _instr; + return hasInstruction() && instruction() == _instr; } bool operator!=(Instruction _instr) const { return !operator==(_instr); } diff --git a/libevmasm/PeepholeOptimiser.cpp b/libevmasm/PeepholeOptimiser.cpp index cc22db9fa2fd..267700e457cd 100644 --- a/libevmasm/PeepholeOptimiser.cpp +++ b/libevmasm/PeepholeOptimiser.cpp @@ -563,7 +563,9 @@ struct TruthyAnd: SimplePeepholeOptimizerMethod } }; -/// Removes everything after a JUMP (or similar) until the next JUMPDEST. +/// Removes everything after an non-continuing instruction until the next Tag. +/// Note: JUMPF can return but to the caller's parent call frame. +/// So it won't continue from the next to the JUMPF instruction struct UnreachableCode { static bool apply(OptimiserState& _state) @@ -572,14 +574,18 @@ struct UnreachableCode auto end = _state.items.end(); if (it == end) return false; + if ( it[0] != Instruction::JUMP && - it[0] != Instruction::RJUMP && it[0] != Instruction::RETURN && it[0] != Instruction::STOP && it[0] != Instruction::INVALID && it[0] != Instruction::SELFDESTRUCT && - it[0] != Instruction::REVERT + it[0] != Instruction::REVERT && + it[0] != Instruction::RJUMP && + it[0] != Instruction::JUMPF && + it[0] != Instruction::RETF && + it[0] != Instruction::RETURNCONTRACT ) return false; diff --git a/test/Common.cpp b/test/Common.cpp index d39c6db1ea9e..142afda22e9f 100644 --- a/test/Common.cpp +++ b/test/Common.cpp @@ -313,6 +313,13 @@ boost::unit_test::precondition::predicate_t nonEOF() }; } +boost::unit_test::precondition::predicate_t onEOF() +{ + return [](boost::unit_test::test_unit_id) { + return solidity::test::CommonOptions::get().eofVersion().has_value(); + }; +} + boost::unit_test::precondition::predicate_t minEVMVersionCheck(langutil::EVMVersion _minEVMVersion) { return [_minEVMVersion](boost::unit_test::test_unit_id) { diff --git a/test/Common.h b/test/Common.h index 27c2081346fc..e331c497a47f 100644 --- a/test/Common.h +++ b/test/Common.h @@ -116,6 +116,10 @@ boost::unit_test::precondition::predicate_t minEVMVersionCheck(langutil::EVMVers /// @return A predicate (function) that can be passed into @a boost::unit_test::precondition(). boost::unit_test::precondition::predicate_t nonEOF(); +/// Helper that can be used to skip tests when the legacy bytecode is not supported by the test case. +/// @return A predicate (function) that can be passed into @a boost::unit_test::precondition(). +boost::unit_test::precondition::predicate_t onEOF(); + bool loadVMs(CommonOptions const& _options); /** diff --git a/test/libevmasm/Optimiser.cpp b/test/libevmasm/Optimiser.cpp index f4b7034de544..4e344c174e00 100644 --- a/test/libevmasm/Optimiser.cpp +++ b/test/libevmasm/Optimiser.cpp @@ -1009,6 +1009,46 @@ BOOST_AUTO_TEST_CASE(clear_unreachable_code) ); } +BOOST_AUTO_TEST_CASE(clear_unreachable_code_eof, *boost::unit_test::precondition(onEOF())) +{ + for (auto const& blockTerminatingItem: + { + AssemblyItem::relativeJumpTo(AssemblyItem(Tag, 1)), + AssemblyItem::jumpToFunction(1, 0, 0), + AssemblyItem::functionReturn(), + AssemblyItem::returnContract(0), + } + ) + { + AssemblyItems items{ + blockTerminatingItem, + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 2), + u256(5), + u256(6), + Instruction::SSTORE, + blockTerminatingItem, + u256(5), + u256(6) + }; + AssemblyItems expectation{ + blockTerminatingItem, + AssemblyItem(Tag, 2), + u256(5), + u256(6), + Instruction::SSTORE, + blockTerminatingItem, + }; + PeepholeOptimiser peepOpt(items, solidity::test::CommonOptions::get().evmVersion()); + BOOST_REQUIRE(peepOpt.optimise()); + BOOST_CHECK_EQUAL_COLLECTIONS( + items.begin(), items.end(), + expectation.begin(), expectation.end() + ); + } +} + BOOST_AUTO_TEST_CASE(deduplicateNextTagBlockSize3) { AssemblyItems items{ diff --git a/test/libyul/objectCompiler/eof/256_subcontainers.yul b/test/libyul/objectCompiler/eof/256_subcontainers.yul index fac0f7b5df29..9306dcbbdeb3 100644 --- a/test/libyul/objectCompiler/eof/256_subcontainers.yul +++ b/test/libyul/objectCompiler/eof/256_subcontainers.yul @@ -2823,8 +2823,6 @@ object "a" { // dup1 // eofcreate{255} // /* "source":12286:12321 */ -// pop -// /* "source":22:12337 */ // stop // stop // @@ -4107,6 +4105,6 @@ object "a" { // /* "source":24612:24619 */ // stop // } -// Bytecode: ef00010100040200010701030100001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001404000000008000045f808080ec00505f808080ec01505f808080ec02505f808080ec03505f808080ec04505f808080ec05505f808080ec06505f808080ec07505f808080ec08505f808080ec09505f808080ec0a505f808080ec0b505f808080ec0c505f808080ec0d505f808080ec0e505f808080ec0f505f808080ec10505f808080ec11505f808080ec12505f808080ec13505f808080ec14505f808080ec15505f808080ec16505f808080ec17505f808080ec18505f808080ec19505f808080ec1a505f808080ec1b505f808080ec1c505f808080ec1d505f808080ec1e505f808080ec1f505f808080ec20505f808080ec21505f808080ec22505f808080ec23505f808080ec24505f808080ec25505f808080ec26505f808080ec27505f808080ec28505f808080ec29505f808080ec2a505f808080ec2b505f808080ec2c505f808080ec2d505f808080ec2e505f808080ec2f505f808080ec30505f808080ec31505f808080ec32505f808080ec33505f808080ec34505f808080ec35505f808080ec36505f808080ec37505f808080ec38505f808080ec39505f808080ec3a505f808080ec3b505f808080ec3c505f808080ec3d505f808080ec3e505f808080ec3f505f808080ec40505f808080ec41505f808080ec42505f808080ec43505f808080ec44505f808080ec45505f808080ec46505f808080ec47505f808080ec48505f808080ec49505f808080ec4a505f808080ec4b505f808080ec4c505f808080ec4d505f808080ec4e505f808080ec4f505f808080ec50505f808080ec51505f808080ec52505f808080ec53505f808080ec54505f808080ec55505f808080ec56505f808080ec57505f808080ec58505f808080ec59505f808080ec5a505f808080ec5b505f808080ec5c505f808080ec5d505f808080ec5e505f808080ec5f505f808080ec60505f808080ec61505f808080ec62505f808080ec63505f808080ec64505f808080ec65505f808080ec66505f808080ec67505f808080ec68505f808080ec69505f808080ec6a505f808080ec6b505f808080ec6c505f808080ec6d505f808080ec6e505f808080ec6f505f808080ec70505f808080ec71505f808080ec72505f808080ec73505f808080ec74505f808080ec75505f808080ec76505f808080ec77505f808080ec78505f808080ec79505f808080ec7a505f808080ec7b505f808080ec7c505f808080ec7d505f808080ec7e505f808080ec7f505f808080ec80505f808080ec81505f808080ec82505f808080ec83505f808080ec84505f808080ec85505f808080ec86505f808080ec87505f808080ec88505f808080ec89505f808080ec8a505f808080ec8b505f808080ec8c505f808080ec8d505f808080ec8e505f808080ec8f505f808080ec90505f808080ec91505f808080ec92505f808080ec93505f808080ec94505f808080ec95505f808080ec96505f808080ec97505f808080ec98505f808080ec99505f808080ec9a505f808080ec9b505f808080ec9c505f808080ec9d505f808080ec9e505f808080ec9f505f808080eca0505f808080eca1505f808080eca2505f808080eca3505f808080eca4505f808080eca5505f808080eca6505f808080eca7505f808080eca8505f808080eca9505f808080ecaa505f808080ecab505f808080ecac505f808080ecad505f808080ecae505f808080ecaf505f808080ecb0505f808080ecb1505f808080ecb2505f808080ecb3505f808080ecb4505f808080ecb5505f808080ecb6505f808080ecb7505f808080ecb8505f808080ecb9505f808080ecba505f808080ecbb505f808080ecbc505f808080ecbd505f808080ecbe505f808080ecbf505f808080ecc0505f808080ecc1505f808080ecc2505f808080ecc3505f808080ecc4505f808080ecc5505f808080ecc6505f808080ecc7505f808080ecc8505f808080ecc9505f808080ecca505f808080eccb505f808080eccc505f808080eccd505f808080ecce505f808080eccf505f808080ecd0505f808080ecd1505f808080ecd2505f808080ecd3505f808080ecd4505f808080ecd5505f808080ecd6505f808080ecd7505f808080ecd8505f808080ecd9505f808080ecda505f808080ecdb505f808080ecdc505f808080ecdd505f808080ecde505f808080ecdf505f808080ece0505f808080ece1505f808080ece2505f808080ece3505f808080ece4505f808080ece5505f808080ece6505f808080ece7505f808080ece8505f808080ece9505f808080ecea505f808080eceb505f808080ecec505f808080eced505f808080ecee505f808080ecef505f808080ecf0505f808080ecf1505f808080ecf2505f808080ecf3505f808080ecf4505f808080ecf5505f808080ecf6505f808080ecf7505f808080ecf8505f808080ecf9505f808080ecfa505f808080ecfb505f808080ecfc505f808080ecfd505f808080ecfe505f808080ecff5000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000 -// Opcodes: 0xEF STOP ADD ADD STOP DIV MUL STOP ADD SMOD ADD SUB ADD STOP STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ DIV STOP STOP STOP STOP DUP1 STOP DIV PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x10 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x11 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x12 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x13 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x14 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x15 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x16 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x17 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x18 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x19 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x20 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x21 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x22 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x23 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x24 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x25 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x26 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x27 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x28 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x29 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x30 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x31 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x32 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x33 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x34 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x35 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x36 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x37 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x38 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x39 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x40 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x41 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x42 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x43 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x44 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x45 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x46 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x47 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x48 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x49 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x50 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x51 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x52 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x53 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x54 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x55 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x56 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x57 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x58 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x59 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x60 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x61 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x62 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x63 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x64 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x65 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x66 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x67 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x68 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x69 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x70 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x71 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x72 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x73 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x74 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x75 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x76 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x77 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x78 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x79 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x80 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x81 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x82 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x83 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x84 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x85 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x86 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x87 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x88 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x89 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x90 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x91 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x92 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x93 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x94 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x95 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x96 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x97 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x98 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x99 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xED POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFF POP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP -// SourceMappings: 78:1:0:-:0;50:30;;;;46:35;126:1;98:30;;;;94:35;174:1;146:30;;;;142:35;222:1;194:30;;;;190:35;270:1;242:30;;;;238:35;318:1;290:30;;;;286:35;366:1;338:30;;;;334:35;414:1;386:30;;;;382:35;462:1;434:30;;;;430:35;510:1;482:30;;;;478:35;558:1;530:30;;;;526:35;606:1;578:30;;;;574:35;654:1;626:30;;;;622:35;702:1;674:30;;;;670:35;750:1;722:30;;;;718:35;798:1;770:30;;;;766:35;846:1;818:30;;;;814:35;894:1;866:30;;;;862:35;942:1;914:30;;;;910:35;990:1;962:30;;;;958:35;1038:1;1010:30;;;;1006:35;1086:1;1058:30;;;;1054:35;1134:1;1106:30;;;;1102:35;1182:1;1154:30;;;;1150:35;1230:1;1202:30;;;;1198:35;1278:1;1250:30;;;;1246:35;1326:1;1298:30;;;;1294:35;1374:1;1346:30;;;;1342:35;1422:1;1394:30;;;;1390:35;1470:1;1442:30;;;;1438:35;1518:1;1490:30;;;;1486:35;1566:1;1538:30;;;;1534:35;1614:1;1586:30;;;;1582:35;1662:1;1634:30;;;;1630:35;1710:1;1682:30;;;;1678:35;1758:1;1730:30;;;;1726:35;1806:1;1778:30;;;;1774:35;1854:1;1826:30;;;;1822:35;1902:1;1874:30;;;;1870:35;1950:1;1922:30;;;;1918:35;1998:1;1970:30;;;;1966:35;2046:1;2018:30;;;;2014:35;2094:1;2066:30;;;;2062:35;2142:1;2114:30;;;;2110:35;2190:1;2162:30;;;;2158:35;2238:1;2210:30;;;;2206:35;2286:1;2258:30;;;;2254:35;2334:1;2306:30;;;;2302:35;2382:1;2354:30;;;;2350:35;2430:1;2402:30;;;;2398:35;2478:1;2450:30;;;;2446:35;2526:1;2498:30;;;;2494:35;2574:1;2546:30;;;;2542:35;2622:1;2594:30;;;;2590:35;2670:1;2642:30;;;;2638:35;2718:1;2690:30;;;;2686:35;2766:1;2738:30;;;;2734:35;2814:1;2786:30;;;;2782:35;2862:1;2834:30;;;;2830:35;2910:1;2882:30;;;;2878:35;2958:1;2930:30;;;;2926:35;3006:1;2978:30;;;;2974:35;3054:1;3026:30;;;;3022:35;3102:1;3074:30;;;;3070:35;3150:1;3122:30;;;;3118:35;3198:1;3170:30;;;;3166:35;3246:1;3218:30;;;;3214:35;3294:1;3266:30;;;;3262:35;3342:1;3314:30;;;;3310:35;3390:1;3362:30;;;;3358:35;3438:1;3410:30;;;;3406:35;3486:1;3458:30;;;;3454:35;3534:1;3506:30;;;;3502:35;3582:1;3554:30;;;;3550:35;3630:1;3602:30;;;;3598:35;3678:1;3650:30;;;;3646:35;3726:1;3698:30;;;;3694:35;3774:1;3746:30;;;;3742:35;3822:1;3794:30;;;;3790:35;3870:1;3842:30;;;;3838:35;3918:1;3890:30;;;;3886:35;3966:1;3938:30;;;;3934:35;4014:1;3986:30;;;;3982:35;4062:1;4034:30;;;;4030:35;4110:1;4082:30;;;;4078:35;4158:1;4130:30;;;;4126:35;4206:1;4178:30;;;;4174:35;4254:1;4226:30;;;;4222:35;4302:1;4274:30;;;;4270:35;4350:1;4322:30;;;;4318:35;4398:1;4370:30;;;;4366:35;4446:1;4418:30;;;;4414:35;4494:1;4466:30;;;;4462:35;4542:1;4514:30;;;;4510:35;4590:1;4562:30;;;;4558:35;4638:1;4610:30;;;;4606:35;4686:1;4658:30;;;;4654:35;4734:1;4706:30;;;;4702:35;4782:1;4754:30;;;;4750:35;4830:1;4802:30;;;;4798:35;4878:1;4850:30;;;;4846:35;4926:1;4898:30;;;;4894:35;4974:1;4946:30;;;;4942:35;5022:1;4994:30;;;;4990:35;5070:1;5042:30;;;;5038:35;5118:1;5090:30;;;;5086:35;5166:1;5138:30;;;;5134:35;5214:1;5186:30;;;;5182:35;5262:1;5234:30;;;;5230:35;5310:1;5282:30;;;;5278:35;5358:1;5330:30;;;;5326:35;5406:1;5378:30;;;;5374:35;5454:1;5426:30;;;;5422:35;5502:1;5474:30;;;;5470:35;5550:1;5522:30;;;;5518:35;5598:1;5570:30;;;;5566:35;5646:1;5618:30;;;;5614:35;5694:1;5666:30;;;;5662:35;5742:1;5714:30;;;;5710:35;5790:1;5762:30;;;;5758:35;5838:1;5810:30;;;;5806:35;5886:1;5858:30;;;;5854:35;5934:1;5906:30;;;;5902:35;5982:1;5954:30;;;;5950:35;6030:1;6002:30;;;;5998:35;6078:1;6050:30;;;;6046:35;6126:1;6098:30;;;;6094:35;6174:1;6146:30;;;;6142:35;6222:1;6194:30;;;;6190:35;6270:1;6242:30;;;;6238:35;6318:1;6290:30;;;;6286:35;6366:1;6338:30;;;;6334:35;6414:1;6386:30;;;;6382:35;6462:1;6434:30;;;;6430:35;6510:1;6482:30;;;;6478:35;6558:1;6530:30;;;;6526:35;6606:1;6578:30;;;;6574:35;6654:1;6626:30;;;;6622:35;6702:1;6674:30;;;;6670:35;6750:1;6722:30;;;;6718:35;6798:1;6770:30;;;;6766:35;6846:1;6818:30;;;;6814:35;6894:1;6866:30;;;;6862:35;6942:1;6914:30;;;;6910:35;6990:1;6962:30;;;;6958:35;7038:1;7010:30;;;;7006:35;7086:1;7058:30;;;;7054:35;7134:1;7106:30;;;;7102:35;7182:1;7154:30;;;;7150:35;7230:1;7202:30;;;;7198:35;7278:1;7250:30;;;;7246:35;7326:1;7298:30;;;;7294:35;7374:1;7346:30;;;;7342:35;7422:1;7394:30;;;;7390:35;7470:1;7442:30;;;;7438:35;7518:1;7490:30;;;;7486:35;7566:1;7538:30;;;;7534:35;7614:1;7586:30;;;;7582:35;7662:1;7634:30;;;;7630:35;7710:1;7682:30;;;;7678:35;7758:1;7730:30;;;;7726:35;7806:1;7778:30;;;;7774:35;7854:1;7826:30;;;;7822:35;7902:1;7874:30;;;;7870:35;7950:1;7922:30;;;;7918:35;7998:1;7970:30;;;;7966:35;8046:1;8018:30;;;;8014:35;8094:1;8066:30;;;;8062:35;8142:1;8114:30;;;;8110:35;8190:1;8162:30;;;;8158:35;8238:1;8210:30;;;;8206:35;8286:1;8258:30;;;;8254:35;8334:1;8306:30;;;;8302:35;8382:1;8354:30;;;;8350:35;8430:1;8402:30;;;;8398:35;8478:1;8450:30;;;;8446:35;8526:1;8498:30;;;;8494:35;8574:1;8546:30;;;;8542:35;8622:1;8594:30;;;;8590:35;8670:1;8642:30;;;;8638:35;8718:1;8690:30;;;;8686:35;8766:1;8738:30;;;;8734:35;8814:1;8786:30;;;;8782:35;8862:1;8834:30;;;;8830:35;8910:1;8882:30;;;;8878:35;8958:1;8930:30;;;;8926:35;9006:1;8978:30;;;;8974:35;9054:1;9026:30;;;;9022:35;9102:1;9074:30;;;;9070:35;9150:1;9122:30;;;;9118:35;9198:1;9170:30;;;;9166:35;9246:1;9218:30;;;;9214:35;9294:1;9266:30;;;;9262:35;9342:1;9314:30;;;;9310:35;9390:1;9362:30;;;;9358:35;9438:1;9410:30;;;;9406:35;9486:1;9458:30;;;;9454:35;9534:1;9506:30;;;;9502:35;9582:1;9554:30;;;;9550:35;9630:1;9602:30;;;;9598:35;9678:1;9650:30;;;;9646:35;9726:1;9698:30;;;;9694:35;9774:1;9746:30;;;;9742:35;9822:1;9794:30;;;;9790:35;9870:1;9842:30;;;;9838:35;9918:1;9890:30;;;;9886:35;9966:1;9938:30;;;;9934:35;10014:1;9986:30;;;;9982:35;10062:1;10034:30;;;;10030:35;10110:1;10082:30;;;;10078:35;10158:1;10130:30;;;;10126:35;10206:1;10178:30;;;;10174:35;10254:1;10226:30;;;;10222:35;10302:1;10274:30;;;;10270:35;10350:1;10322:30;;;;10318:35;10398:1;10370:30;;;;10366:35;10446:1;10418:30;;;;10414:35;10494:1;10466:30;;;;10462:35;10542:1;10514:30;;;;10510:35;10590:1;10562:30;;;;10558:35;10638:1;10610:30;;;;10606:35;10686:1;10658:30;;;;10654:35;10734:1;10706:30;;;;10702:35;10782:1;10754:30;;;;10750:35;10830:1;10802:30;;;;10798:35;10878:1;10850:30;;;;10846:35;10926:1;10898:30;;;;10894:35;10974:1;10946:30;;;;10942:35;11022:1;10994:30;;;;10990:35;11070:1;11042:30;;;;11038:35;11118:1;11090:30;;;;11086:35;11166:1;11138:30;;;;11134:35;11214:1;11186:30;;;;11182:35;11262:1;11234:30;;;;11230:35;11310:1;11282:30;;;;11278:35;11358:1;11330:30;;;;11326:35;11406:1;11378:30;;;;11374:35;11454:1;11426:30;;;;11422:35;11502:1;11474:30;;;;11470:35;11550:1;11522:30;;;;11518:35;11598:1;11570:30;;;;11566:35;11646:1;11618:30;;;;11614:35;11694:1;11666:30;;;;11662:35;11742:1;11714:30;;;;11710:35;11790:1;11762:30;;;;11758:35;11838:1;11810:30;;;;11806:35;11886:1;11858:30;;;;11854:35;11934:1;11906:30;;;;11902:35;11982:1;11954:30;;;;11950:35;12030:1;12002:30;;;;11998:35;12078:1;12050:30;;;;12046:35;12126:1;12098:30;;;;12094:35;12174:1;12146:30;;;;12142:35;12222:1;12194:30;;;;12190:35;12270:1;12242:30;;;;12238:35;12318:1;12290:30;;;;12286:35;22:12315 +// Bytecode: ef00010100040200010700030100001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001400140014001404000000008000045f808080ec00505f808080ec01505f808080ec02505f808080ec03505f808080ec04505f808080ec05505f808080ec06505f808080ec07505f808080ec08505f808080ec09505f808080ec0a505f808080ec0b505f808080ec0c505f808080ec0d505f808080ec0e505f808080ec0f505f808080ec10505f808080ec11505f808080ec12505f808080ec13505f808080ec14505f808080ec15505f808080ec16505f808080ec17505f808080ec18505f808080ec19505f808080ec1a505f808080ec1b505f808080ec1c505f808080ec1d505f808080ec1e505f808080ec1f505f808080ec20505f808080ec21505f808080ec22505f808080ec23505f808080ec24505f808080ec25505f808080ec26505f808080ec27505f808080ec28505f808080ec29505f808080ec2a505f808080ec2b505f808080ec2c505f808080ec2d505f808080ec2e505f808080ec2f505f808080ec30505f808080ec31505f808080ec32505f808080ec33505f808080ec34505f808080ec35505f808080ec36505f808080ec37505f808080ec38505f808080ec39505f808080ec3a505f808080ec3b505f808080ec3c505f808080ec3d505f808080ec3e505f808080ec3f505f808080ec40505f808080ec41505f808080ec42505f808080ec43505f808080ec44505f808080ec45505f808080ec46505f808080ec47505f808080ec48505f808080ec49505f808080ec4a505f808080ec4b505f808080ec4c505f808080ec4d505f808080ec4e505f808080ec4f505f808080ec50505f808080ec51505f808080ec52505f808080ec53505f808080ec54505f808080ec55505f808080ec56505f808080ec57505f808080ec58505f808080ec59505f808080ec5a505f808080ec5b505f808080ec5c505f808080ec5d505f808080ec5e505f808080ec5f505f808080ec60505f808080ec61505f808080ec62505f808080ec63505f808080ec64505f808080ec65505f808080ec66505f808080ec67505f808080ec68505f808080ec69505f808080ec6a505f808080ec6b505f808080ec6c505f808080ec6d505f808080ec6e505f808080ec6f505f808080ec70505f808080ec71505f808080ec72505f808080ec73505f808080ec74505f808080ec75505f808080ec76505f808080ec77505f808080ec78505f808080ec79505f808080ec7a505f808080ec7b505f808080ec7c505f808080ec7d505f808080ec7e505f808080ec7f505f808080ec80505f808080ec81505f808080ec82505f808080ec83505f808080ec84505f808080ec85505f808080ec86505f808080ec87505f808080ec88505f808080ec89505f808080ec8a505f808080ec8b505f808080ec8c505f808080ec8d505f808080ec8e505f808080ec8f505f808080ec90505f808080ec91505f808080ec92505f808080ec93505f808080ec94505f808080ec95505f808080ec96505f808080ec97505f808080ec98505f808080ec99505f808080ec9a505f808080ec9b505f808080ec9c505f808080ec9d505f808080ec9e505f808080ec9f505f808080eca0505f808080eca1505f808080eca2505f808080eca3505f808080eca4505f808080eca5505f808080eca6505f808080eca7505f808080eca8505f808080eca9505f808080ecaa505f808080ecab505f808080ecac505f808080ecad505f808080ecae505f808080ecaf505f808080ecb0505f808080ecb1505f808080ecb2505f808080ecb3505f808080ecb4505f808080ecb5505f808080ecb6505f808080ecb7505f808080ecb8505f808080ecb9505f808080ecba505f808080ecbb505f808080ecbc505f808080ecbd505f808080ecbe505f808080ecbf505f808080ecc0505f808080ecc1505f808080ecc2505f808080ecc3505f808080ecc4505f808080ecc5505f808080ecc6505f808080ecc7505f808080ecc8505f808080ecc9505f808080ecca505f808080eccb505f808080eccc505f808080eccd505f808080ecce505f808080eccf505f808080ecd0505f808080ecd1505f808080ecd2505f808080ecd3505f808080ecd4505f808080ecd5505f808080ecd6505f808080ecd7505f808080ecd8505f808080ecd9505f808080ecda505f808080ecdb505f808080ecdc505f808080ecdd505f808080ecde505f808080ecdf505f808080ece0505f808080ece1505f808080ece2505f808080ece3505f808080ece4505f808080ece5505f808080ece6505f808080ece7505f808080ece8505f808080ece9505f808080ecea505f808080eceb505f808080ecec505f808080eced505f808080ecee505f808080ecef505f808080ecf0505f808080ecf1505f808080ecf2505f808080ecf3505f808080ecf4505f808080ecf5505f808080ecf6505f808080ecf7505f808080ecf8505f808080ecf9505f808080ecfa505f808080ecfb505f808080ecfc505f808080ecfd505f808080ecfe505f808080ecff00ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000ef00010100040200010001040000000080000000 +// Opcodes: 0xEF STOP ADD ADD STOP DIV MUL STOP ADD SMOD STOP SUB ADD STOP STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ STOP EQ DIV STOP STOP STOP STOP DUP1 STOP DIV PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x10 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x11 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x12 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x13 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x14 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x15 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x16 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x17 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x18 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x19 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x1F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x20 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x21 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x22 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x23 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x24 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x25 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x26 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x27 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x28 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x29 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x2F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x30 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x31 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x32 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x33 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x34 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x35 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x36 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x37 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x38 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x39 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x3F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x40 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x41 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x42 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x43 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x44 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x45 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x46 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x47 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x48 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x49 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x4F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x50 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x51 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x52 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x53 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x54 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x55 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x56 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x57 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x58 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x59 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x5F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x60 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x61 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x62 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x63 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x64 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x65 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x66 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x67 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x68 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x69 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x6F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x70 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x71 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x72 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x73 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x74 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x75 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x76 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x77 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x78 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x79 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x7F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x80 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x81 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x82 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x83 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x84 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x85 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x86 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x87 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x88 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x89 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x8F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x90 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x91 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x92 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x93 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x94 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x95 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x96 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x97 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x98 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x99 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9A POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9B POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9C POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9D POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9E POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0x9F POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xA9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xAF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xB9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xBF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xC9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xCF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xD9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xDF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xE9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xED POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xEF POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF0 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF1 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF2 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF3 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF4 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF5 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF6 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF7 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF8 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xF9 POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFA POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFB POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFC POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFD POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFE POP PUSH0 DUP1 DUP1 DUP1 EOFCREATE 0xFF STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP 0xEF STOP ADD ADD STOP DIV MUL STOP ADD STOP ADD DIV STOP STOP STOP STOP DUP1 STOP STOP STOP +// SourceMappings: 78:1:0:-:0;50:30;;;;46:35;126:1;98:30;;;;94:35;174:1;146:30;;;;142:35;222:1;194:30;;;;190:35;270:1;242:30;;;;238:35;318:1;290:30;;;;286:35;366:1;338:30;;;;334:35;414:1;386:30;;;;382:35;462:1;434:30;;;;430:35;510:1;482:30;;;;478:35;558:1;530:30;;;;526:35;606:1;578:30;;;;574:35;654:1;626:30;;;;622:35;702:1;674:30;;;;670:35;750:1;722:30;;;;718:35;798:1;770:30;;;;766:35;846:1;818:30;;;;814:35;894:1;866:30;;;;862:35;942:1;914:30;;;;910:35;990:1;962:30;;;;958:35;1038:1;1010:30;;;;1006:35;1086:1;1058:30;;;;1054:35;1134:1;1106:30;;;;1102:35;1182:1;1154:30;;;;1150:35;1230:1;1202:30;;;;1198:35;1278:1;1250:30;;;;1246:35;1326:1;1298:30;;;;1294:35;1374:1;1346:30;;;;1342:35;1422:1;1394:30;;;;1390:35;1470:1;1442:30;;;;1438:35;1518:1;1490:30;;;;1486:35;1566:1;1538:30;;;;1534:35;1614:1;1586:30;;;;1582:35;1662:1;1634:30;;;;1630:35;1710:1;1682:30;;;;1678:35;1758:1;1730:30;;;;1726:35;1806:1;1778:30;;;;1774:35;1854:1;1826:30;;;;1822:35;1902:1;1874:30;;;;1870:35;1950:1;1922:30;;;;1918:35;1998:1;1970:30;;;;1966:35;2046:1;2018:30;;;;2014:35;2094:1;2066:30;;;;2062:35;2142:1;2114:30;;;;2110:35;2190:1;2162:30;;;;2158:35;2238:1;2210:30;;;;2206:35;2286:1;2258:30;;;;2254:35;2334:1;2306:30;;;;2302:35;2382:1;2354:30;;;;2350:35;2430:1;2402:30;;;;2398:35;2478:1;2450:30;;;;2446:35;2526:1;2498:30;;;;2494:35;2574:1;2546:30;;;;2542:35;2622:1;2594:30;;;;2590:35;2670:1;2642:30;;;;2638:35;2718:1;2690:30;;;;2686:35;2766:1;2738:30;;;;2734:35;2814:1;2786:30;;;;2782:35;2862:1;2834:30;;;;2830:35;2910:1;2882:30;;;;2878:35;2958:1;2930:30;;;;2926:35;3006:1;2978:30;;;;2974:35;3054:1;3026:30;;;;3022:35;3102:1;3074:30;;;;3070:35;3150:1;3122:30;;;;3118:35;3198:1;3170:30;;;;3166:35;3246:1;3218:30;;;;3214:35;3294:1;3266:30;;;;3262:35;3342:1;3314:30;;;;3310:35;3390:1;3362:30;;;;3358:35;3438:1;3410:30;;;;3406:35;3486:1;3458:30;;;;3454:35;3534:1;3506:30;;;;3502:35;3582:1;3554:30;;;;3550:35;3630:1;3602:30;;;;3598:35;3678:1;3650:30;;;;3646:35;3726:1;3698:30;;;;3694:35;3774:1;3746:30;;;;3742:35;3822:1;3794:30;;;;3790:35;3870:1;3842:30;;;;3838:35;3918:1;3890:30;;;;3886:35;3966:1;3938:30;;;;3934:35;4014:1;3986:30;;;;3982:35;4062:1;4034:30;;;;4030:35;4110:1;4082:30;;;;4078:35;4158:1;4130:30;;;;4126:35;4206:1;4178:30;;;;4174:35;4254:1;4226:30;;;;4222:35;4302:1;4274:30;;;;4270:35;4350:1;4322:30;;;;4318:35;4398:1;4370:30;;;;4366:35;4446:1;4418:30;;;;4414:35;4494:1;4466:30;;;;4462:35;4542:1;4514:30;;;;4510:35;4590:1;4562:30;;;;4558:35;4638:1;4610:30;;;;4606:35;4686:1;4658:30;;;;4654:35;4734:1;4706:30;;;;4702:35;4782:1;4754:30;;;;4750:35;4830:1;4802:30;;;;4798:35;4878:1;4850:30;;;;4846:35;4926:1;4898:30;;;;4894:35;4974:1;4946:30;;;;4942:35;5022:1;4994:30;;;;4990:35;5070:1;5042:30;;;;5038:35;5118:1;5090:30;;;;5086:35;5166:1;5138:30;;;;5134:35;5214:1;5186:30;;;;5182:35;5262:1;5234:30;;;;5230:35;5310:1;5282:30;;;;5278:35;5358:1;5330:30;;;;5326:35;5406:1;5378:30;;;;5374:35;5454:1;5426:30;;;;5422:35;5502:1;5474:30;;;;5470:35;5550:1;5522:30;;;;5518:35;5598:1;5570:30;;;;5566:35;5646:1;5618:30;;;;5614:35;5694:1;5666:30;;;;5662:35;5742:1;5714:30;;;;5710:35;5790:1;5762:30;;;;5758:35;5838:1;5810:30;;;;5806:35;5886:1;5858:30;;;;5854:35;5934:1;5906:30;;;;5902:35;5982:1;5954:30;;;;5950:35;6030:1;6002:30;;;;5998:35;6078:1;6050:30;;;;6046:35;6126:1;6098:30;;;;6094:35;6174:1;6146:30;;;;6142:35;6222:1;6194:30;;;;6190:35;6270:1;6242:30;;;;6238:35;6318:1;6290:30;;;;6286:35;6366:1;6338:30;;;;6334:35;6414:1;6386:30;;;;6382:35;6462:1;6434:30;;;;6430:35;6510:1;6482:30;;;;6478:35;6558:1;6530:30;;;;6526:35;6606:1;6578:30;;;;6574:35;6654:1;6626:30;;;;6622:35;6702:1;6674:30;;;;6670:35;6750:1;6722:30;;;;6718:35;6798:1;6770:30;;;;6766:35;6846:1;6818:30;;;;6814:35;6894:1;6866:30;;;;6862:35;6942:1;6914:30;;;;6910:35;6990:1;6962:30;;;;6958:35;7038:1;7010:30;;;;7006:35;7086:1;7058:30;;;;7054:35;7134:1;7106:30;;;;7102:35;7182:1;7154:30;;;;7150:35;7230:1;7202:30;;;;7198:35;7278:1;7250:30;;;;7246:35;7326:1;7298:30;;;;7294:35;7374:1;7346:30;;;;7342:35;7422:1;7394:30;;;;7390:35;7470:1;7442:30;;;;7438:35;7518:1;7490:30;;;;7486:35;7566:1;7538:30;;;;7534:35;7614:1;7586:30;;;;7582:35;7662:1;7634:30;;;;7630:35;7710:1;7682:30;;;;7678:35;7758:1;7730:30;;;;7726:35;7806:1;7778:30;;;;7774:35;7854:1;7826:30;;;;7822:35;7902:1;7874:30;;;;7870:35;7950:1;7922:30;;;;7918:35;7998:1;7970:30;;;;7966:35;8046:1;8018:30;;;;8014:35;8094:1;8066:30;;;;8062:35;8142:1;8114:30;;;;8110:35;8190:1;8162:30;;;;8158:35;8238:1;8210:30;;;;8206:35;8286:1;8258:30;;;;8254:35;8334:1;8306:30;;;;8302:35;8382:1;8354:30;;;;8350:35;8430:1;8402:30;;;;8398:35;8478:1;8450:30;;;;8446:35;8526:1;8498:30;;;;8494:35;8574:1;8546:30;;;;8542:35;8622:1;8594:30;;;;8590:35;8670:1;8642:30;;;;8638:35;8718:1;8690:30;;;;8686:35;8766:1;8738:30;;;;8734:35;8814:1;8786:30;;;;8782:35;8862:1;8834:30;;;;8830:35;8910:1;8882:30;;;;8878:35;8958:1;8930:30;;;;8926:35;9006:1;8978:30;;;;8974:35;9054:1;9026:30;;;;9022:35;9102:1;9074:30;;;;9070:35;9150:1;9122:30;;;;9118:35;9198:1;9170:30;;;;9166:35;9246:1;9218:30;;;;9214:35;9294:1;9266:30;;;;9262:35;9342:1;9314:30;;;;9310:35;9390:1;9362:30;;;;9358:35;9438:1;9410:30;;;;9406:35;9486:1;9458:30;;;;9454:35;9534:1;9506:30;;;;9502:35;9582:1;9554:30;;;;9550:35;9630:1;9602:30;;;;9598:35;9678:1;9650:30;;;;9646:35;9726:1;9698:30;;;;9694:35;9774:1;9746:30;;;;9742:35;9822:1;9794:30;;;;9790:35;9870:1;9842:30;;;;9838:35;9918:1;9890:30;;;;9886:35;9966:1;9938:30;;;;9934:35;10014:1;9986:30;;;;9982:35;10062:1;10034:30;;;;10030:35;10110:1;10082:30;;;;10078:35;10158:1;10130:30;;;;10126:35;10206:1;10178:30;;;;10174:35;10254:1;10226:30;;;;10222:35;10302:1;10274:30;;;;10270:35;10350:1;10322:30;;;;10318:35;10398:1;10370:30;;;;10366:35;10446:1;10418:30;;;;10414:35;10494:1;10466:30;;;;10462:35;10542:1;10514:30;;;;10510:35;10590:1;10562:30;;;;10558:35;10638:1;10610:30;;;;10606:35;10686:1;10658:30;;;;10654:35;10734:1;10706:30;;;;10702:35;10782:1;10754:30;;;;10750:35;10830:1;10802:30;;;;10798:35;10878:1;10850:30;;;;10846:35;10926:1;10898:30;;;;10894:35;10974:1;10946:30;;;;10942:35;11022:1;10994:30;;;;10990:35;11070:1;11042:30;;;;11038:35;11118:1;11090:30;;;;11086:35;11166:1;11138:30;;;;11134:35;11214:1;11186:30;;;;11182:35;11262:1;11234:30;;;;11230:35;11310:1;11282:30;;;;11278:35;11358:1;11330:30;;;;11326:35;11406:1;11378:30;;;;11374:35;11454:1;11426:30;;;;11422:35;11502:1;11474:30;;;;11470:35;11550:1;11522:30;;;;11518:35;11598:1;11570:30;;;;11566:35;11646:1;11618:30;;;;11614:35;11694:1;11666:30;;;;11662:35;11742:1;11714:30;;;;11710:35;11790:1;11762:30;;;;11758:35;11838:1;11810:30;;;;11806:35;11886:1;11858:30;;;;11854:35;11934:1;11906:30;;;;11902:35;11982:1;11954:30;;;;11950:35;12030:1;12002:30;;;;11998:35;12078:1;12050:30;;;;12046:35;12126:1;12098:30;;;;12094:35;12174:1;12146:30;;;;12142:35;12222:1;12194:30;;;;12190:35;12270:1;12242:30;;;;12238:35;12318:1;12290:30;;;;12286:35 From 03fde2ae36f3a306d14788c175c649d508d6ed42 Mon Sep 17 00:00:00 2001 From: rodiazet Date: Wed, 23 Apr 2025 12:27:48 +0200 Subject: [PATCH 68/80] eof: Add peephole optimiser tests for EOF specific optimisations --- test/libevmasm/Optimiser.cpp | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/test/libevmasm/Optimiser.cpp b/test/libevmasm/Optimiser.cpp index 4e344c174e00..b53205e959e5 100644 --- a/test/libevmasm/Optimiser.cpp +++ b/test/libevmasm/Optimiser.cpp @@ -1049,6 +1049,142 @@ BOOST_AUTO_TEST_CASE(clear_unreachable_code_eof, *boost::unit_test::precondition } } +BOOST_AUTO_TEST_CASE(is_zero_is_zero_rjumpi, *boost::unit_test::precondition(onEOF())) +{ + AssemblyItems items{ + u256(1), + Instruction::ISZERO, + Instruction::ISZERO, + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 1)), + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 1), + }; + + AssemblyItems expectation{ + u256(1), + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 1)), + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 1), + }; + + PeepholeOptimiser peepOpt(items, solidity::test::CommonOptions::get().evmVersion()); + BOOST_REQUIRE(peepOpt.optimise()); + BOOST_CHECK_EQUAL_COLLECTIONS( + items.begin(), items.end(), + expectation.begin(), expectation.end() + ); +} + +BOOST_AUTO_TEST_CASE(equal_is_zero_rjumpi, *boost::unit_test::precondition(onEOF())) +{ + AssemblyItems items{ + u256(1), + u256(2), + Instruction::EQ, + Instruction::ISZERO, + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 1)), + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 1), + }; + + AssemblyItems expectation{ + u256(1), + u256(2), + Instruction::SUB, + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 1)), + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 1), + }; + + PeepholeOptimiser peepOpt(items, solidity::test::CommonOptions::get().evmVersion()); + BOOST_REQUIRE(peepOpt.optimise()); + BOOST_CHECK_EQUAL_COLLECTIONS( + items.begin(), items.end(), + expectation.begin(), expectation.end() + ); +} + +BOOST_AUTO_TEST_CASE(double_rjump, *boost::unit_test::precondition(onEOF())) +{ + AssemblyItems items{ + u256(1), + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 1)), + AssemblyItem::relativeJumpTo(AssemblyItem(Tag, 2)), + AssemblyItem(Tag, 1), + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 2), + }; + + AssemblyItems expectation{ + u256(1), + Instruction::ISZERO, + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 2)), + AssemblyItem(Tag, 1), + u256(0), + Instruction::SLOAD, + AssemblyItem(Tag, 2), + }; + + PeepholeOptimiser peepOpt(items, solidity::test::CommonOptions::get().evmVersion()); + BOOST_REQUIRE(peepOpt.optimise()); + BOOST_CHECK_EQUAL_COLLECTIONS( + items.begin(), items.end(), + expectation.begin(), expectation.end() + ); +} + +BOOST_AUTO_TEST_CASE(rjump_to_next, *boost::unit_test::precondition(onEOF())) +{ + AssemblyItems items{ + AssemblyItem::relativeJumpTo(AssemblyItem(Tag, 1)), + AssemblyItem(Tag, 1), + u256(0), + Instruction::SLOAD, + }; + + AssemblyItems expectation{ + AssemblyItem(Tag, 1), + u256(0), + Instruction::SLOAD, + }; + + PeepholeOptimiser peepOpt(items, solidity::test::CommonOptions::get().evmVersion()); + BOOST_REQUIRE(peepOpt.optimise()); + BOOST_CHECK_EQUAL_COLLECTIONS( + items.begin(), items.end(), + expectation.begin(), expectation.end() + ); +} + +BOOST_AUTO_TEST_CASE(rjumpi_to_next, *boost::unit_test::precondition(onEOF())) +{ + AssemblyItems items{ + AssemblyItem::conditionalRelativeJumpTo(AssemblyItem(Tag, 1)), + AssemblyItem(Tag, 1), + u256(0), + Instruction::SLOAD, + }; + + AssemblyItems expectation{ + Instruction::POP, + AssemblyItem(Tag, 1), + u256(0), + Instruction::SLOAD, + }; + + PeepholeOptimiser peepOpt(items, solidity::test::CommonOptions::get().evmVersion()); + BOOST_REQUIRE(peepOpt.optimise()); + BOOST_CHECK_EQUAL_COLLECTIONS( + items.begin(), items.end(), + expectation.begin(), expectation.end() + ); +} + BOOST_AUTO_TEST_CASE(deduplicateNextTagBlockSize3) { AssemblyItems items{ From 649c8ee32826476600f67e2f879859563c92dc00 Mon Sep 17 00:00:00 2001 From: Maximilian Hubert <64627729+gap-editor@users.noreply.github.com> Date: Sat, 26 Apr 2025 17:40:13 +0200 Subject: [PATCH 69/80] Update SMTPortfolio.cpp --- libsmtutil/SMTPortfolio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsmtutil/SMTPortfolio.cpp b/libsmtutil/SMTPortfolio.cpp index 94c92f390a53..e6f6e9913a59 100644 --- a/libsmtutil/SMTPortfolio.cpp +++ b/libsmtutil/SMTPortfolio.cpp @@ -78,7 +78,7 @@ void SMTPortfolio::addAssertion(Expression const& _expr) * Ideally all solvers answer the query and agree on what the answer is * (all say SAT or all say UNSAT). * - * The actual logic as as follows: + * The actual logic as follows: * 1) If at least one solver answers the query, all the non-answer results are ignored. * Here SAT/UNSAT is preferred over UNKNOWN since it's an actual answer, and over ERROR * because one buggy solver/integration shouldn't break the portfolio. From 76e80168f10e560f159309edf3448f48fb80dc0e Mon Sep 17 00:00:00 2001 From: Maximilian Hubert <64627729+gap-editor@users.noreply.github.com> Date: Mon, 28 Apr 2025 11:27:07 +0200 Subject: [PATCH 70/80] Update SMTPortfolio.cpp --- libsmtutil/SMTPortfolio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsmtutil/SMTPortfolio.cpp b/libsmtutil/SMTPortfolio.cpp index e6f6e9913a59..fb82f3c69361 100644 --- a/libsmtutil/SMTPortfolio.cpp +++ b/libsmtutil/SMTPortfolio.cpp @@ -78,7 +78,7 @@ void SMTPortfolio::addAssertion(Expression const& _expr) * Ideally all solvers answer the query and agree on what the answer is * (all say SAT or all say UNSAT). * - * The actual logic as follows: + * The actual logic is as follows: * 1) If at least one solver answers the query, all the non-answer results are ignored. * Here SAT/UNSAT is preferred over UNKNOWN since it's an actual answer, and over ERROR * because one buggy solver/integration shouldn't break the portfolio. From 09fc1d4a21504a9cfd0c645a7754015c18933eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 25 Apr 2025 06:10:31 +0200 Subject: [PATCH 71/80] PlainAssemblyParser: Store the stream globally in the class --- test/libevmasm/PlainAssemblyParser.cpp | 37 +++++++++++++++++++------- test/libevmasm/PlainAssemblyParser.h | 14 +++++----- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/test/libevmasm/PlainAssemblyParser.cpp b/test/libevmasm/PlainAssemblyParser.cpp index 0fb9d62c8c10..4d09043b1623 100644 --- a/test/libevmasm/PlainAssemblyParser.cpp +++ b/test/libevmasm/PlainAssemblyParser.cpp @@ -28,8 +28,6 @@ #include -#include - using namespace std::string_literals; using namespace solidity; using namespace solidity::test; @@ -39,15 +37,21 @@ using namespace solidity::langutil; Json PlainAssemblyParser::parse(std::string _sourceName, std::string const& _source) { + m_sourceStream = std::istringstream(_source); m_sourceName = std::move(_sourceName); Json codeJSON = Json::array(); - std::istringstream sourceStream(_source); - while (getline(sourceStream, m_line)) + m_lineNumber = 0; + + if (!m_line.has_value()) + advanceLine(); + + while (m_line.has_value()) { - advanceLine(m_line); if (m_lineTokens.empty()) + { + advanceLine(); continue; - + } if (c_instructions.contains(currentToken().value)) { expectNoMoreArguments(); @@ -84,6 +88,8 @@ Json PlainAssemblyParser::parse(std::string _sourceName, std::string const& _sou } else BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Unknown instruction."))); + + advanceLine(); } return {{".code", codeJSON}}; } @@ -125,12 +131,20 @@ void PlainAssemblyParser::expectNoMoreArguments() BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Too many arguments."))); } -void PlainAssemblyParser::advanceLine(std::string_view _line) +bool PlainAssemblyParser::advanceLine() { + std::string line; + if (!getline(m_sourceStream, line)) + { + m_line = std::nullopt; + return false; + } + ++m_lineNumber; - m_line = _line; - m_lineTokens = tokenizeLine(m_line); + m_line = std::move(line); + m_lineTokens = tokenizeLine(*m_line); m_tokenIndex = 0; + return true; } std::vector PlainAssemblyParser::tokenizeLine(std::string_view _line) @@ -162,6 +176,9 @@ std::vector PlainAssemblyParser::tokenizeLine(std::s std::string PlainAssemblyParser::formatError(std::string_view _message) const { + soltestAssert(m_line.has_value()); + soltestAssert(!m_lineTokens.empty()); + std::string lineNumberString = std::to_string(m_lineNumber); std::string padding(lineNumberString.size(), ' '); std::string underline = std::string(currentToken().position, ' ') + std::string(currentToken().value.size(), '^'); @@ -174,7 +191,7 @@ std::string PlainAssemblyParser::formatError(std::string_view _message) const _message, padding, m_sourceName, padding, - m_lineNumber, m_line, + m_lineNumber, *m_line, padding, underline ); } diff --git a/test/libevmasm/PlainAssemblyParser.h b/test/libevmasm/PlainAssemblyParser.h index 0154af5f7f19..95cc3ee8f84e 100644 --- a/test/libevmasm/PlainAssemblyParser.h +++ b/test/libevmasm/PlainAssemblyParser.h @@ -20,6 +20,7 @@ #include +#include #include #include #include @@ -63,17 +64,18 @@ class PlainAssemblyParser bool advanceToken(); std::string_view expectArgument(); void expectNoMoreArguments(); - void advanceLine(std::string_view _line); + bool advanceLine(); static std::vector tokenizeLine(std::string_view _line); std::string formatError(std::string_view _message) const; private: - std::string m_sourceName; ///< Name of the file the source comes from. - size_t m_lineNumber = 0; ///< The number of the current line within the source, 1-based. - std::string m_line; ///< The current line, unparsed. - std::vector m_lineTokens; ///< Decomposition of the current line into tokens (does not include comments). - size_t m_tokenIndex = 0; ///< Points at a token within m_lineTokens. + std::istringstream m_sourceStream; ///< The source code being parsed. + std::string m_sourceName; ///< Name of the file the source comes from. + size_t m_lineNumber = 0; ///< The number of the current line within the source, 1-based. + std::optional m_line; ///< The current line, unparsed. + std::vector m_lineTokens; ///< Decomposition of the current line into tokens (does not include comments). + size_t m_tokenIndex = 0; ///< Points at a token within m_lineTokens. }; } From 73af6528bdd323d8c62fea2788525ad191a8ee3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 25 Apr 2025 06:17:46 +0200 Subject: [PATCH 72/80] PlainAssemblyParser: Syntax for subassemblies --- test/libevmasm/PlainAssemblyParser.cpp | 56 +++++- test/libevmasm/PlainAssemblyParser.h | 11 ++ .../isoltestTesting/empty.asm | 10 + .../isoltestTesting/subassemblies.asm | 69 +++++++ .../isoltestTesting/subassemblies_empty.asm | 34 ++++ .../isoltestTesting/subassemblies_nested.asm | 171 ++++++++++++++++++ 6 files changed, 347 insertions(+), 4 deletions(-) create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/empty.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_empty.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_nested.asm diff --git a/test/libevmasm/PlainAssemblyParser.cpp b/test/libevmasm/PlainAssemblyParser.cpp index 4d09043b1623..c8fbfeaeb451 100644 --- a/test/libevmasm/PlainAssemblyParser.cpp +++ b/test/libevmasm/PlainAssemblyParser.cpp @@ -39,11 +39,16 @@ Json PlainAssemblyParser::parse(std::string _sourceName, std::string const& _sou { m_sourceStream = std::istringstream(_source); m_sourceName = std::move(_sourceName); - Json codeJSON = Json::array(); m_lineNumber = 0; - if (!m_line.has_value()) - advanceLine(); + advanceLine(); + return parseAssembly(0); +} + +Json PlainAssemblyParser::parseAssembly(size_t _nestingLevel) +{ + Json assemblyJSON = {{".code", Json::array()}}; + Json& codeJSON = assemblyJSON[".code"]; while (m_line.has_value()) { @@ -52,6 +57,25 @@ Json PlainAssemblyParser::parse(std::string _sourceName, std::string const& _sou advanceLine(); continue; } + + size_t newLevel = parseNestingLevel(); + if (newLevel > _nestingLevel) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Indentation does not match the current subassembly nesting level."))); + + if (newLevel < _nestingLevel) + return assemblyJSON; + + if (currentToken().value == ".sub") + { + advanceLine(); + + std::string nextDataIndex = std::to_string(assemblyJSON[".data"].size()); + assemblyJSON[".data"][nextDataIndex] = parseAssembly(_nestingLevel + 1); + continue; + } + else if (assemblyJSON.contains(".data")) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("The code of an assembly must be specified before its subassemblies."))); + if (c_instructions.contains(currentToken().value)) { expectNoMoreArguments(); @@ -91,7 +115,21 @@ Json PlainAssemblyParser::parse(std::string _sourceName, std::string const& _sou advanceLine(); } - return {{".code", codeJSON}}; + + return assemblyJSON; +} + +size_t PlainAssemblyParser::parseNestingLevel() const +{ + std::string_view indentationString = indentation(); + + if (indentationString != std::string(indentationString.size(), ' ')) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Non-space characters used for indentation."))); + + if (indentationString.size() % 4 != 0) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("Each indentation level must consist of 4 spaces."))); + + return indentationString.size() / 4; } PlainAssemblyParser::Token const& PlainAssemblyParser::currentToken() const @@ -106,6 +144,16 @@ PlainAssemblyParser::Token const& PlainAssemblyParser::nextToken() const return m_lineTokens[m_tokenIndex + 1]; } +std::string_view PlainAssemblyParser::indentation() const +{ + soltestAssert(m_line.has_value()); + + if (m_lineTokens.empty()) + return *m_line; + + return std::string_view(*m_line).substr(0, m_lineTokens.at(0).position); +} + bool PlainAssemblyParser::advanceToken() { if (!hasMoreTokens()) diff --git a/test/libevmasm/PlainAssemblyParser.h b/test/libevmasm/PlainAssemblyParser.h index 95cc3ee8f84e..5332b3202f7b 100644 --- a/test/libevmasm/PlainAssemblyParser.h +++ b/test/libevmasm/PlainAssemblyParser.h @@ -37,12 +37,18 @@ namespace solidity::evmasm::test /// - A non-empty line represents a single assembly item. /// - The name of the item is the first thing on the line and may consist of one or more tokens. /// - One or more arguments follow the name. +/// - Indentation determines assembly nesting level (4 spaces per level). +/// - A new subassembly starts with '.sub' and contains all subsequent lines at a higher nesting level. +/// The first line at the same or lower nesting level ends the subassembly. +/// - Subassemblies can be nested to arbitrary depth. +/// - The code of an assembly must be specified before its subassemblies. /// /// Supported items: /// - All instruction names. /// - PUSH /// - PUSH [tag] /// - tag +/// - .sub class PlainAssemblyParser { public: @@ -57,10 +63,15 @@ class PlainAssemblyParser size_t position; ///< Position of the first character of the token within m_line. }; + Json parseAssembly(size_t _nestingLevel); + size_t parseNestingLevel() const; + Token const& currentToken() const; Token const& nextToken() const; bool hasMoreTokens() const { return m_tokenIndex + 1 < m_lineTokens.size(); } + std::string_view indentation() const; + bool advanceToken(); std::string_view expectArgument(); void expectNoMoreArguments(); diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/empty.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/empty.asm new file mode 100644 index 000000000000..a3c0ef5396a1 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/empty.asm @@ -0,0 +1,10 @@ +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [] +// } +// Assembly: +// Bytecode: +// Opcodes: +// SourceMappings: diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies.asm new file mode 100644 index 000000000000..7dc1a515067d --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies.asm @@ -0,0 +1,69 @@ +PUSH 0x2 +DUP1 +ADD + +.sub + PUSH 0x42 + DUP1 + MUL + +.sub + STOP +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "PUSH", +// "value": "2" +// }, +// { +// "name": "DUP1" +// }, +// { +// "name": "ADD" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "PUSH", +// "value": "42" +// }, +// { +// "name": "DUP1" +// }, +// { +// "name": "MUL" +// } +// ] +// }, +// "1": { +// ".code": [ +// { +// "name": "STOP" +// } +// ] +// } +// } +// } +// Assembly: +// 0x02 +// dup1 +// add +// stop +// +// sub_0: assembly { +// 0x42 +// dup1 +// mul +// } +// +// sub_1: assembly { +// stop +// } +// Bytecode: 60028001fe +// Opcodes: PUSH1 0x2 DUP1 ADD INVALID +// SourceMappings: :::-:0;; diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_empty.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_empty.asm new file mode 100644 index 000000000000..8914710dbf34 --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_empty.asm @@ -0,0 +1,34 @@ +.sub +.sub +.sub +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [], +// ".data": { +// "0": { +// ".code": [] +// }, +// "1": { +// ".code": [] +// }, +// "2": { +// ".code": [] +// } +// } +// } +// Assembly: +// stop +// +// sub_0: assembly { +// } +// +// sub_1: assembly { +// } +// +// sub_2: assembly { +// } +// Bytecode: fe +// Opcodes: INVALID +// SourceMappings: diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_nested.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_nested.asm new file mode 100644 index 000000000000..59beb9b69ece --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/subassemblies_nested.asm @@ -0,0 +1,171 @@ +TIMESTAMP +TIMESTAMP + +.sub + TIMESTAMP + + .sub + TIMESTAMP + .sub + TIMESTAMP + .sub + TIMESTAMP + .sub + TIMESTAMP + .sub + TIMESTAMP +.sub + NUMBER + SLOAD + .sub + NUMBER + MLOAD + .sub + NUMBER + TLOAD + +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "TIMESTAMP" +// }, +// { +// "name": "TIMESTAMP" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "TIMESTAMP" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "TIMESTAMP" +// } +// ] +// }, +// "1": { +// ".code": [ +// { +// "name": "TIMESTAMP" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "TIMESTAMP" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "TIMESTAMP" +// } +// ] +// } +// } +// } +// } +// }, +// "2": { +// ".code": [ +// { +// "name": "TIMESTAMP" +// } +// ] +// } +// } +// }, +// "1": { +// ".code": [ +// { +// "name": "NUMBER" +// }, +// { +// "name": "SLOAD" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "NUMBER" +// }, +// { +// "name": "MLOAD" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "NUMBER" +// }, +// { +// "name": "TLOAD" +// } +// ] +// } +// } +// } +// } +// } +// } +// } +// Assembly: +// timestamp +// timestamp +// stop +// +// sub_0: assembly { +// timestamp +// stop +// +// sub_0: assembly { +// timestamp +// } +// +// sub_1: assembly { +// timestamp +// stop +// +// sub_0: assembly { +// timestamp +// stop +// +// sub_0: assembly { +// timestamp +// } +// } +// } +// +// sub_2: assembly { +// timestamp +// } +// } +// +// sub_1: assembly { +// sload(number) +// stop +// +// sub_0: assembly { +// mload(number) +// stop +// +// sub_0: assembly { +// tload(number) +// } +// } +// } +// Bytecode: 4242fe +// Opcodes: TIMESTAMP TIMESTAMP INVALID +// SourceMappings: :::-:0; From 202933bf14e3bd8349416f3cd185dfda488ef33f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 25 Apr 2025 07:58:58 +0200 Subject: [PATCH 73/80] PlainAssemblyParser: Support pushing assembly sizes and offsets --- test/libevmasm/PlainAssemblyParser.cpp | 15 +++- test/libevmasm/PlainAssemblyParser.h | 2 + .../isoltestTesting/pushsize.asm | 33 +++++++++ .../isoltestTesting/pushsubsize.asm | 72 +++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/pushsize.asm create mode 100644 test/libevmasm/evmAssemblyTests/isoltestTesting/pushsubsize.asm diff --git a/test/libevmasm/PlainAssemblyParser.cpp b/test/libevmasm/PlainAssemblyParser.cpp index c8fbfeaeb451..07b680474cb9 100644 --- a/test/libevmasm/PlainAssemblyParser.cpp +++ b/test/libevmasm/PlainAssemblyParser.cpp @@ -76,7 +76,7 @@ Json PlainAssemblyParser::parseAssembly(size_t _nestingLevel) else if (assemblyJSON.contains(".data")) BOOST_THROW_EXCEPTION(std::runtime_error(formatError("The code of an assembly must be specified before its subassemblies."))); - if (c_instructions.contains(currentToken().value)) + if (c_instructions.contains(currentToken().value) || currentToken().value == "PUSHSIZE") { expectNoMoreArguments(); codeJSON.push_back({{"name", currentToken().value}}); @@ -90,6 +90,19 @@ Json PlainAssemblyParser::parseAssembly(size_t _nestingLevel) expectNoMoreArguments(); codeJSON.push_back({{"name", "PUSH [tag]"}, {"value", tagID}}); } + else if (hasMoreTokens() && (nextToken().value == "[$]" || nextToken().value == "#[$]")) + { + std::string pushType = std::string(nextToken().value); + advanceToken(); + std::string_view subassemblyID = expectArgument(); + expectNoMoreArguments(); + + if (!subassemblyID.starts_with("0x")) + BOOST_THROW_EXCEPTION(std::runtime_error(formatError("The subassembly ID must be a hex number prefixed with '0x'."))); + + subassemblyID.remove_prefix("0x"s.size()); + codeJSON.push_back({{"name", "PUSH " + pushType}, {"value", subassemblyID}}); + } else { std::string_view immediateArgument = expectArgument(); diff --git a/test/libevmasm/PlainAssemblyParser.h b/test/libevmasm/PlainAssemblyParser.h index 5332b3202f7b..9318d1662389 100644 --- a/test/libevmasm/PlainAssemblyParser.h +++ b/test/libevmasm/PlainAssemblyParser.h @@ -48,6 +48,8 @@ namespace solidity::evmasm::test /// - PUSH /// - PUSH [tag] /// - tag +/// - PUSH [$] +/// - PUSH #[$] /// - .sub class PlainAssemblyParser { diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/pushsize.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/pushsize.asm new file mode 100644 index 000000000000..3c92687c425a --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/pushsize.asm @@ -0,0 +1,33 @@ +PUSHSIZE + +.sub + PUSHSIZE +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "PUSHSIZE" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "PUSHSIZE" +// } +// ] +// } +// } +// } +// Assembly: +// bytecodeSize +// stop +// +// sub_0: assembly { +// bytecodeSize +// } +// Bytecode: 6003fe +// Opcodes: PUSH1 0x3 INVALID +// SourceMappings: :::-:0 diff --git a/test/libevmasm/evmAssemblyTests/isoltestTesting/pushsubsize.asm b/test/libevmasm/evmAssemblyTests/isoltestTesting/pushsubsize.asm new file mode 100644 index 000000000000..1b51c22a84ef --- /dev/null +++ b/test/libevmasm/evmAssemblyTests/isoltestTesting/pushsubsize.asm @@ -0,0 +1,72 @@ +PUSH [$] 0x0000 +PUSH #[$] 0x0000 + +.sub + PUSH [$] 0x0 + PUSH #[$] 0x2 + + .sub + .sub + .sub +// ==== +// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings +// ---- +// InputAssemblyJSON: { +// ".code": [ +// { +// "name": "PUSH [$]", +// "value": "0000" +// }, +// { +// "name": "PUSH #[$]", +// "value": "0000" +// } +// ], +// ".data": { +// "0": { +// ".code": [ +// { +// "name": "PUSH [$]", +// "value": "0" +// }, +// { +// "name": "PUSH #[$]", +// "value": "2" +// } +// ], +// ".data": { +// "0": { +// ".code": [] +// }, +// "1": { +// ".code": [] +// }, +// "2": { +// ".code": [] +// } +// } +// } +// } +// } +// Assembly: +// dataOffset(sub_0) +// dataSize(sub_0) +// stop +// +// sub_0: assembly { +// dataOffset(sub_0) +// dataSize(sub_2) +// stop +// +// sub_0: assembly { +// } +// +// sub_1: assembly { +// } +// +// sub_2: assembly { +// } +// } +// Bytecode: 60056005fe60056000fe +// Opcodes: PUSH1 0x5 PUSH1 0x5 INVALID PUSH1 0x5 PUSH1 0x0 INVALID +// SourceMappings: :::-:0; From 78107e344ce526695a5a989250d01812a248d536 Mon Sep 17 00:00:00 2001 From: clonker <1685266+clonker@users.noreply.github.com> Date: Sun, 27 Apr 2025 11:01:00 +0200 Subject: [PATCH 74/80] Assembly item asserts that it's not implicity constructed by instruction for swapn/dupn --- libevmasm/AssemblyItem.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libevmasm/AssemblyItem.h b/libevmasm/AssemblyItem.h index 0dfe0749768a..8386bf2dd4bc 100644 --- a/libevmasm/AssemblyItem.h +++ b/libevmasm/AssemblyItem.h @@ -85,7 +85,10 @@ class AssemblyItem m_type(Operation), m_instruction(_i), m_debugData(std::move(_debugData)) - {} + { + solAssert(_i != Instruction::SWAPN, "Construct via AssemblyItem::swapN"); + solAssert(_i != Instruction::DUPN, "Construct via AssemblyItem::dupN"); + } AssemblyItem(AssemblyItemType _type, u256 _data = 0, langutil::DebugData::ConstPtr _debugData = langutil::DebugData::create()): m_type(_type), m_debugData(std::move(_debugData)) From 49c2e551c12f8fde4dccd59d07be0ad5637060dd Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Mon, 28 Apr 2025 17:57:02 -0300 Subject: [PATCH 75/80] Set prague as EVM default version --- .circleci/config.yml | 2 +- .circleci/soltest_all.sh | 2 +- Changelog.md | 1 + docs/using-the-compiler.rst | 8 ++--- liblangutil/EVMVersion.h | 2 +- scripts/externalTests/common.sh | 2 +- scripts/externalTests/runners/base.py | 2 +- scripts/tests.sh | 2 +- .../mcopy_bytes_array_abi_decode/args | 2 +- .../args | 2 +- .../args | 2 +- test/cmdlineTests/metadata/output | 2 +- .../standard_metadata/output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 4 +-- .../output | 2 +- .../output | 2 +- test/libsolidity/StandardCompiler.cpp | 32 ++++--------------- 20 files changed, 30 insertions(+), 47 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 09b1281c5630..80b3c5358825 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -34,7 +34,7 @@ parameters: default: "solbuildpackpusher/solidity-buildpack-deps@sha256:98f963ed799a0d206ef8e7b5475f847e0dea53b7fdea9618bbc6106a62730bd2" evm-version: type: string - default: cancun + default: prague orbs: win: circleci/windows@2.2.0 diff --git a/.circleci/soltest_all.sh b/.circleci/soltest_all.sh index 216b1ee3815a..56aa1c3be640 100755 --- a/.circleci/soltest_all.sh +++ b/.circleci/soltest_all.sh @@ -38,7 +38,7 @@ EVMS_WITH_EOF=(osaka) # set EVM_VALUES to the default values. IFS=" " read -ra EVM_VALUES <<< "${1:-${DEFAULT_EVM_VALUES[@]}}" -DEFAULT_EVM=cancun +DEFAULT_EVM=prague OPTIMIZE_VALUES=(0 1) EOF_VERSIONS=(0 1) diff --git a/Changelog.md b/Changelog.md index e8ccbb525302..cbaa4252151c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ Language Features: Compiler Features: +* EVM: Set default EVM Version to `prague`. * NatSpec: Capture Natspec documentation of `enum` values in the AST. diff --git a/docs/using-the-compiler.rst b/docs/using-the-compiler.rst index 23e83baec4e6..a3943ea94da2 100644 --- a/docs/using-the-compiler.rst +++ b/docs/using-the-compiler.rst @@ -176,12 +176,12 @@ at each version. Backward compatibility is not guaranteed between each version. - Introduces ``prevrandao()`` and ``block.prevrandao``, and changes the semantics of the now deprecated ``block.difficulty``, disallowing ``difficulty()`` in inline assembly (see `EIP-4399 `_). - ``shanghai`` - Smaller code size and gas savings due to the introduction of ``push0`` (see `EIP-3855 `_). -- ``cancun`` (**default**) +- ``cancun`` - The block's blob base fee (`EIP-7516 `_ and `EIP-4844 `_) can be accessed via the global ``block.blobbasefee`` or ``blobbasefee()`` in inline assembly. - Introduces ``blobhash()`` in inline assembly and a corresponding global function to retrieve versioned hashes of blobs associated with the transaction (see `EIP-4844 `_). - Opcode ``mcopy`` is available in assembly (see `EIP-5656 `_). - Opcodes ``tstore`` and ``tload`` are available in assembly (see `EIP-1153 `_). -- ``prague`` (**experimental**) +- ``prague`` (**default**) - ``osaka`` (**experimental**) - Experimental compilation to EOF is available starting from this version. (`EIP-7692 `_) @@ -356,8 +356,8 @@ Input Description // Version of the EVM to compile for (optional). // Affects type checking and code generation. Can be homestead, // tangerineWhistle, spuriousDragon, byzantium, constantinople, - // petersburg, istanbul, berlin, london, paris, shanghai, cancun (default), prague (experimental) or osaka (experimental). - "evmVersion": "cancun", + // petersburg, istanbul, berlin, london, paris, shanghai, cancun, prague (default) or osaka (experimental). + "evmVersion": "prague", // EVM Object Format version to compile for (optional, experimental). // Currently the only valid value is 1. If not specified, legacy non-EOF bytecode will be generated. "eofVersion": null, diff --git a/liblangutil/EVMVersion.h b/liblangutil/EVMVersion.h index a159f2e4bb2f..38580621a45e 100644 --- a/liblangutil/EVMVersion.h +++ b/liblangutil/EVMVersion.h @@ -167,7 +167,7 @@ class EVMVersion: EVMVersion(Version _version): m_version(_version) {} - Version m_version = Version::Cancun; + Version m_version = Version::Prague; }; } diff --git a/scripts/externalTests/common.sh b/scripts/externalTests/common.sh index 2983b30c296a..26f27b07baca 100644 --- a/scripts/externalTests/common.sh +++ b/scripts/externalTests/common.sh @@ -22,7 +22,7 @@ set -e # Requires $REPO_ROOT to be defined and "${REPO_ROOT}/scripts/common.sh" to be included before. -CURRENT_EVM_VERSION=cancun +CURRENT_EVM_VERSION=prague AVAILABLE_PRESETS=( legacy-no-optimize diff --git a/scripts/externalTests/runners/base.py b/scripts/externalTests/runners/base.py index 4778206150e2..20ba67ddb4a4 100644 --- a/scripts/externalTests/runners/base.py +++ b/scripts/externalTests/runners/base.py @@ -41,7 +41,7 @@ from test_helpers import settings_from_preset from test_helpers import SettingsPreset -CURRENT_EVM_VERSION: str = "cancun" +CURRENT_EVM_VERSION: str = "prague" @dataclass class TestConfig: diff --git a/scripts/tests.sh b/scripts/tests.sh index 3d2849369eca..5ff962be6506 100755 --- a/scripts/tests.sh +++ b/scripts/tests.sh @@ -115,7 +115,7 @@ do for vm in $EVM_VERSIONS do FORCE_ABIV1_RUNS="no" - if [[ "$vm" == "cancun" ]] + if [[ "$vm" == "prague" ]] then FORCE_ABIV1_RUNS="no yes" # run both in paris fi diff --git a/test/cmdlineTests/mcopy_bytes_array_abi_decode/args b/test/cmdlineTests/mcopy_bytes_array_abi_decode/args index 4a03d8d932b9..a346a1eb7963 100644 --- a/test/cmdlineTests/mcopy_bytes_array_abi_decode/args +++ b/test/cmdlineTests/mcopy_bytes_array_abi_decode/args @@ -1 +1 @@ ---evm-version cancun --no-cbor-metadata --via-ir --ir --debug-info none +--no-cbor-metadata --via-ir --ir --debug-info none diff --git a/test/cmdlineTests/mcopy_bytes_array_returned_from_function/args b/test/cmdlineTests/mcopy_bytes_array_returned_from_function/args index c74711ba8aec..a582f88e9c3d 100644 --- a/test/cmdlineTests/mcopy_bytes_array_returned_from_function/args +++ b/test/cmdlineTests/mcopy_bytes_array_returned_from_function/args @@ -1 +1 @@ ---evm-version cancun --no-cbor-metadata --via-ir --optimize --ir-optimized --debug-info none +--no-cbor-metadata --via-ir --optimize --ir-optimized --debug-info none diff --git a/test/cmdlineTests/mcopy_string_literal_returned_from_function/args b/test/cmdlineTests/mcopy_string_literal_returned_from_function/args index c74711ba8aec..a582f88e9c3d 100644 --- a/test/cmdlineTests/mcopy_string_literal_returned_from_function/args +++ b/test/cmdlineTests/mcopy_string_literal_returned_from_function/args @@ -1 +1 @@ ---evm-version cancun --no-cbor-metadata --via-ir --optimize --ir-optimized --debug-info none +--no-cbor-metadata --via-ir --optimize --ir-optimized --debug-info none diff --git a/test/cmdlineTests/metadata/output b/test/cmdlineTests/metadata/output index 0910128894df..a62f2ed145f8 100644 --- a/test/cmdlineTests/metadata/output +++ b/test/cmdlineTests/metadata/output @@ -1,4 +1,4 @@ ======= input.sol:C ======= Metadata: -{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0x5cf617b1707a484e3c4bd59643013dec76ab7d75900b46855214729ae3e0ceb0","license":"GPL-3.0","urls":["bzz-raw://ac418a02dfadf87234150d3568f33269e3f49460345cb39300e017a6d755eff2","dweb:/ipfs/QmQq3owBu25x2WV46HB1WyKzJpxiAPecU7eMKqtXCF7eeS"]}},"version":1} +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0x5cf617b1707a484e3c4bd59643013dec76ab7d75900b46855214729ae3e0ceb0","license":"GPL-3.0","urls":["bzz-raw://ac418a02dfadf87234150d3568f33269e3f49460345cb39300e017a6d755eff2","dweb:/ipfs/QmQq3owBu25x2WV46HB1WyKzJpxiAPecU7eMKqtXCF7eeS"]}},"version":1} diff --git a/test/cmdlineTests/standard_metadata/output.json b/test/cmdlineTests/standard_metadata/output.json index 5b9c8504f386..155e15db1761 100644 --- a/test/cmdlineTests/standard_metadata/output.json +++ b/test/cmdlineTests/standard_metadata/output.json @@ -2,7 +2,7 @@ "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\":\"cancun\",\"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}" + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"prague\",\"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}" } } }, diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_metadata/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_metadata/output.json index c461a1485bda..07087b30fdb3 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_metadata/output.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_metadata/output.json @@ -2,7 +2,7 @@ "contracts": { "A": { "C": { - "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"A\":\"C\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"details\":{\"constantOptimizer\":false,\"cse\":false,\"deduplicate\":false,\"inliner\":false,\"jumpdestRemover\":true,\"orderLiterals\":false,\"peephole\":true,\"simpleCounterForLoopUncheckedIncrement\":true,\"yul\":false,\"yulDetails\":{\"optimizerSteps\":\":\"}},\"runs\":200},\"remappings\":[]},\"sources\":{\"A\":{\"keccak256\":\"0xb284c39999cb85b80be315a6e9e322adf67a783c66e91ba4439168694580a66d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://098cee915fad095b8a996813768bd7d5e8c9e40c405e8c43d0572bb7bbc17334\",\"dweb:/ipfs/QmZmUzvSryrrD7pJ9S32iQnEWn4QBL4J1NdbQqL2Xc3yTr\"]}},\"version\":1}" + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"A\":\"C\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"details\":{\"constantOptimizer\":false,\"cse\":false,\"deduplicate\":false,\"inliner\":false,\"jumpdestRemover\":true,\"orderLiterals\":false,\"peephole\":true,\"simpleCounterForLoopUncheckedIncrement\":true,\"yul\":false,\"yulDetails\":{\"optimizerSteps\":\":\"}},\"runs\":200},\"remappings\":[]},\"sources\":{\"A\":{\"keccak256\":\"0xb284c39999cb85b80be315a6e9e322adf67a783c66e91ba4439168694580a66d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://098cee915fad095b8a996813768bd7d5e8c9e40c405e8c43d0572bb7bbc17334\",\"dweb:/ipfs/QmZmUzvSryrrD7pJ9S32iQnEWn4QBL4J1NdbQqL2Xc3yTr\"]}},\"version\":1}" } } }, diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_whitespaces_metadata/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_whitespaces_metadata/output.json index c461a1485bda..07087b30fdb3 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_whitespaces_metadata/output.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_empty_sequence_whitespaces_metadata/output.json @@ -2,7 +2,7 @@ "contracts": { "A": { "C": { - "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"A\":\"C\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"details\":{\"constantOptimizer\":false,\"cse\":false,\"deduplicate\":false,\"inliner\":false,\"jumpdestRemover\":true,\"orderLiterals\":false,\"peephole\":true,\"simpleCounterForLoopUncheckedIncrement\":true,\"yul\":false,\"yulDetails\":{\"optimizerSteps\":\":\"}},\"runs\":200},\"remappings\":[]},\"sources\":{\"A\":{\"keccak256\":\"0xb284c39999cb85b80be315a6e9e322adf67a783c66e91ba4439168694580a66d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://098cee915fad095b8a996813768bd7d5e8c9e40c405e8c43d0572bb7bbc17334\",\"dweb:/ipfs/QmZmUzvSryrrD7pJ9S32iQnEWn4QBL4J1NdbQqL2Xc3yTr\"]}},\"version\":1}" + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"A\":\"C\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"details\":{\"constantOptimizer\":false,\"cse\":false,\"deduplicate\":false,\"inliner\":false,\"jumpdestRemover\":true,\"orderLiterals\":false,\"peephole\":true,\"simpleCounterForLoopUncheckedIncrement\":true,\"yul\":false,\"yulDetails\":{\"optimizerSteps\":\":\"}},\"runs\":200},\"remappings\":[]},\"sources\":{\"A\":{\"keccak256\":\"0xb284c39999cb85b80be315a6e9e322adf67a783c66e91ba4439168694580a66d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://098cee915fad095b8a996813768bd7d5e8c9e40c405e8c43d0572bb7bbc17334\",\"dweb:/ipfs/QmZmUzvSryrrD7pJ9S32iQnEWn4QBL4J1NdbQqL2Xc3yTr\"]}},\"version\":1}" } } }, diff --git a/test/cmdlineTests/standard_outputs_on_compilation_error/output.json b/test/cmdlineTests/standard_outputs_on_compilation_error/output.json index 0fa7fcff3cda..eae7a321f05b 100644 --- a/test/cmdlineTests/standard_outputs_on_compilation_error/output.json +++ b/test/cmdlineTests/standard_outputs_on_compilation_error/output.json @@ -32,7 +32,7 @@ "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\":\"cancun\",\"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}", + "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\":\"prague\",\"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 diff --git a/test/cmdlineTests/standard_undeployable_contract_all_outputs/output.json b/test/cmdlineTests/standard_undeployable_contract_all_outputs/output.json index 3869f7c652bd..be87a5176d06 100644 --- a/test/cmdlineTests/standard_undeployable_contract_all_outputs/output.json +++ b/test/cmdlineTests/standard_undeployable_contract_all_outputs/output.json @@ -35,7 +35,7 @@ "irAst": null, "irOptimized": "", "irOptimizedAst": null, - "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"C\":{\"keccak256\":\"0xa8b7bfe5eff9112e6573d2860721faef28e8920ee251acb458303a05c1ec7df2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a2333e25b5034de4f98729e0a737309ba8e0db4371016f312e8f991f6f01613f\",\"dweb:/ipfs/QmVLwS2grVYV6qiDvNmeEYWzb6WDne9Ze47NXERSLPM4fJ\"]}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"C\":{\"keccak256\":\"0xa8b7bfe5eff9112e6573d2860721faef28e8920ee251acb458303a05c1ec7df2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a2333e25b5034de4f98729e0a737309ba8e0db4371016f312e8f991f6f01613f\",\"dweb:/ipfs/QmVLwS2grVYV6qiDvNmeEYWzb6WDne9Ze47NXERSLPM4fJ\"]}},\"version\":1}", "storageLayout": { "storage": [], "types": null @@ -84,7 +84,7 @@ "irAst": null, "irOptimized": "", "irOptimizedAst": null, - "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"I\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"C\":{\"keccak256\":\"0xa8b7bfe5eff9112e6573d2860721faef28e8920ee251acb458303a05c1ec7df2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a2333e25b5034de4f98729e0a737309ba8e0db4371016f312e8f991f6f01613f\",\"dweb:/ipfs/QmVLwS2grVYV6qiDvNmeEYWzb6WDne9Ze47NXERSLPM4fJ\"]}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"I\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"C\":{\"keccak256\":\"0xa8b7bfe5eff9112e6573d2860721faef28e8920ee251acb458303a05c1ec7df2\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a2333e25b5034de4f98729e0a737309ba8e0db4371016f312e8f991f6f01613f\",\"dweb:/ipfs/QmVLwS2grVYV6qiDvNmeEYWzb6WDne9Ze47NXERSLPM4fJ\"]}},\"version\":1}", "storageLayout": { "storage": [], "types": null diff --git a/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output b/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output index 744bc03a8c6e..de60e7d1dcd8 100644 --- a/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output +++ b/test/cmdlineTests/yul_optimizer_disabled_sequence_empty/output @@ -1,4 +1,4 @@ ======= input.sol:C ======= Metadata: -{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0xc2db3500808896ce1e69de2fe20cecab7ae2ffbb47cdf6ba8321296d95f49fc5","license":"GPL-3.0","urls":["bzz-raw://fde21393c068cd9f2d2b10ba4782db54f6f1c9a725074b17fa742531076be8a4","dweb:/ipfs/QmeTD6mR7YrWNyRowKRS7xs6cJNeMF3T49GAHzGM1bquyM"]}},"version":1} +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0xc2db3500808896ce1e69de2fe20cecab7ae2ffbb47cdf6ba8321296d95f49fc5","license":"GPL-3.0","urls":["bzz-raw://fde21393c068cd9f2d2b10ba4782db54f6f1c9a725074b17fa742531076be8a4","dweb:/ipfs/QmeTD6mR7YrWNyRowKRS7xs6cJNeMF3T49GAHzGM1bquyM"]}},"version":1} diff --git a/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output b/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output index a7b037775f2c..2b32c23ee319 100644 --- a/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output +++ b/test/cmdlineTests/yul_optimizer_steps_without_optimize_empty_sequence/output @@ -130,4 +130,4 @@ object "C_28" { } Metadata: -{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"foo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0x3fc910e345ce1ee62bfa6b0f66931ee632c08265b25b6139cfbbfe4d2f8d5dd8","license":"GPL-3.0","urls":["bzz-raw://e557e9ad2c2e420a669c06ae456b0b790d77d2d6d492cd8540e6b244388a5140","dweb:/ipfs/QmaNiZmC2Mo3YxGiehs1n3dVTjZwD7FguX7EUtpeshMVuR"]}},"version":1} +{"compiler":{"version": ""},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"foo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"input.sol":"C"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"details":{"constantOptimizer":false,"cse":false,"deduplicate":false,"inliner":false,"jumpdestRemover":true,"orderLiterals":false,"peephole":true,"simpleCounterForLoopUncheckedIncrement":true,"yul":false,"yulDetails":{"optimizerSteps":":"}},"runs":200},"remappings":[]},"sources":{"input.sol":{"keccak256":"0x3fc910e345ce1ee62bfa6b0f66931ee632c08265b25b6139cfbbfe4d2f8d5dd8","license":"GPL-3.0","urls":["bzz-raw://e557e9ad2c2e420a669c06ae456b0b790d77d2d6d492cd8540e6b244388a5140","dweb:/ipfs/QmaNiZmC2Mo3YxGiehs1n3dVTjZwD7FguX7EUtpeshMVuR"]}},"version":1} diff --git a/test/libsolidity/StandardCompiler.cpp b/test/libsolidity/StandardCompiler.cpp index b17f566613a1..5360a2778677 100644 --- a/test/libsolidity/StandardCompiler.cpp +++ b/test/libsolidity/StandardCompiler.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -1170,33 +1171,14 @@ BOOST_AUTO_TEST_CASE(evm_version) )"; }; Json result; - result = compile(inputForVersion("\"evmVersion\": \"homestead\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"homestead\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"tangerineWhistle\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"tangerineWhistle\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"spuriousDragon\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"spuriousDragon\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"byzantium\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"byzantium\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"constantinople\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"constantinople\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"petersburg\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"petersburg\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"istanbul\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"istanbul\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"berlin\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"berlin\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"london\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"london\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"paris\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"paris\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"shanghai\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"shanghai\"") != std::string::npos); - result = compile(inputForVersion("\"evmVersion\": \"cancun\",")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"cancun\"") != std::string::npos); + for (auto const& version: langutil::EVMVersion::allVersions()) + { + result = compile(inputForVersion(fmt::format("\"evmVersion\": \"{}\",", version.name()))); + BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find(fmt::format("\"evmVersion\":\"{}\"", version.name())) != std::string::npos); + } // test default result = compile(inputForVersion("")); - BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"cancun\"") != std::string::npos); + BOOST_CHECK(result["contracts"]["fileA"]["A"]["metadata"].get().find("\"evmVersion\":\"prague\"") != std::string::npos); // test invalid result = compile(inputForVersion("\"evmVersion\": \"invalid\",")); BOOST_CHECK(result["errors"][0]["message"].get() == "Invalid EVM version requested."); From ca699f9b02a59270afd8f43c28d15c9a63d301ff Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Tue, 6 May 2025 11:47:39 -0300 Subject: [PATCH 76/80] bump hardhat version --- test/externalTests/gp2.sh | 5 +---- test/externalTests/pool-together.sh | 4 +--- test/externalTests/uniswap.sh | 5 +---- test/externalTests/zeppelin.sh | 5 +---- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/test/externalTests/gp2.sh b/test/externalTests/gp2.sh index 20ea586f5f09..d648de592058 100755 --- a/test/externalTests/gp2.sh +++ b/test/externalTests/gp2.sh @@ -66,10 +66,7 @@ function gp2_test force_hardhat_compiler_settings "$config_file" "$(first_word "$SELECTED_PRESETS")" "$config_var" force_hardhat_unlimited_contract_size "$config_file" "$config_var" yarn - # We require to install hardhat 2.20.0 due to support for evm version cancun, otherwise we get the following error: - # Invalid value {"blockGasLimit":12500000,"hardfork":"cancun","allowUnlimitedContractSize":true} for HardhatConfig.networks.hardhat - Expected a value of type HardhatNetworkConfig. - # See: https://github.com/NomicFoundation/hardhat/issues/4176 - yarn add hardhat@2.20.0 + yarn add hardhat # Ignore bench directory which fails to compile with current hardhat and ethers versions. # bench/trace/gas.ts:123:19 - error TS2339: Property 'equals' does not exist on type 'Uint8Array'. diff --git a/test/externalTests/pool-together.sh b/test/externalTests/pool-together.sh index 0fc8aafbd69d..2eb47912c8b1 100755 --- a/test/externalTests/pool-together.sh +++ b/test/externalTests/pool-together.sh @@ -66,9 +66,7 @@ function pool_together_test force_hardhat_compiler_binary "$config_file" "$BINARY_TYPE" "$BINARY_PATH" force_hardhat_compiler_settings "$config_file" "$(first_word "$SELECTED_PRESETS")" "$config_var" yarn install - # Hardhat 2.20.0 is the last version that works. Newer versions throw this error: - # Unexpected config HardhatConfig.networks.hardhat.initialBaseFeePerGas found - This field is only valid for networks with EIP-1559. Try a newer hardfork or remove it. - yarn add hardhat@2.20.0 + yarn add hardhat # These come with already compiled artifacts. We want them recompiled with latest compiler. rm -r node_modules/@pooltogether/yield-source-interface/artifacts/ diff --git a/test/externalTests/uniswap.sh b/test/externalTests/uniswap.sh index f3d78e6e3397..575fcf309cd2 100755 --- a/test/externalTests/uniswap.sh +++ b/test/externalTests/uniswap.sh @@ -90,10 +90,7 @@ function uniswap_test # TODO: Remove when https://github.com/ethers-io/ethers.js/discussions/2849 is resolved. pnpm install ethers@5.6.1 - # We set hardhat version to 2.20.0 since version 2.21.0 has issues with solidity-coverage plugin - # that often causes out-of-memory errors. - # See hardhat note about the issue here: https://github.com/NomicFoundation/hardhat/releases/tag/hardhat@2.21.0 - pnpm install hardhat@2.20.0 + pnpm install hardhat replace_version_pragmas diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index b9e65562e08f..86d2495da30b 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -105,10 +105,7 @@ function zeppelin_test force_hardhat_compiler_binary "$config_file" "$BINARY_TYPE" "$BINARY_PATH" force_hardhat_compiler_settings "$config_file" "$(first_word "$SELECTED_PRESETS")" npm install - # We require to install hardhat 2.20.0 due to support for evm version cancun, otherwise we get the following error: - # Invalid value {"blockGasLimit":10000000,"allowUnlimitedContractSize":true,"hardfork":"cancun"} for HardhatConfig.networks.hardhat - Expected a value of type HardhatNetworkConfig. - # See: https://github.com/NomicFoundation/hardhat/issues/4176 - npm install hardhat@2.20.0 + npm install hardhat replace_version_pragmas for preset in $SELECTED_PRESETS; do From 24d534f67009c62feb336940e6711526d0905390 Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Tue, 6 May 2025 14:59:13 -0300 Subject: [PATCH 77/80] Increase resource for uniswap ext test --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 80b3c5358825..6c88b9d19f7c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -831,6 +831,7 @@ defaults: project: uniswap binary_type: native image: cimg/node:18.16 + resource_class: medium # Tests run out of memory on a smaller machine - job_native_test_ext_prb_math: &job_native_test_ext_prb_math <<: *requires_b_ubu_static From 13d734fd22990508a256c4c591310e78b8247112 Mon Sep 17 00:00:00 2001 From: Matheus Aguiar Date: Tue, 6 May 2025 17:24:18 -0300 Subject: [PATCH 78/80] Workaround for openzepellin ext test --- test/externalTests/zeppelin.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/externalTests/zeppelin.sh b/test/externalTests/zeppelin.sh index 86d2495da30b..9bc3e29132aa 100755 --- a/test/externalTests/zeppelin.sh +++ b/test/externalTests/zeppelin.sh @@ -101,6 +101,10 @@ function zeppelin_test # 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 + # TODO: Remove when next hardhat version releases, the fix is already merged: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/5663 + # Fails with ProviderError: Invalid transaction: GasFloorMoreThanGasLimit + sed -i "177s|+ 2_000n|+ 10_000n|" test/metatx/ERC2771Forwarder.test.js + neutralize_package_json_hooks force_hardhat_compiler_binary "$config_file" "$BINARY_TYPE" "$BINARY_PATH" force_hardhat_compiler_settings "$config_file" "$(first_word "$SELECTED_PRESETS")" From 1e6842c2c312a124c8ffb28fa0097ebd58f5e990 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 7 May 2025 09:39:30 +0200 Subject: [PATCH 79/80] Fix broken docs links --- docs/contracts/inheritance.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contracts/inheritance.rst b/docs/contracts/inheritance.rst index fccfee609587..8a2d12afd839 100644 --- a/docs/contracts/inheritance.rst +++ b/docs/contracts/inheritance.rst @@ -548,7 +548,7 @@ Multiple Inheritance and Linearization Languages that allow multiple inheritance have to deal with several problems. One is the `Diamond Problem `_. -Solidity is similar to Python in that it uses "`C3 Linearization `_" +Solidity is similar to Python in that it uses C3 Linearization to force a specific order in the directed acyclic graph (DAG) of base classes. This results in the desirable property of monotonicity but disallows some inheritance graphs. Especially, the order in From 1c8d4016f5394d9804864339515b995210eaff5a Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 7 May 2025 10:46:23 +0200 Subject: [PATCH 80/80] Set changelog release date --- Changelog.md | 5 +---- docs/bugs_by_version.json | 4 ++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Changelog.md b/Changelog.md index cbaa4252151c..9a1139e9ce84 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,7 +1,4 @@ -### 0.8.30 (unreleased) - -Language Features: - +### 0.8.30 (2025-05-07) Compiler Features: * EVM: Set default EVM Version to `prague`. diff --git a/docs/bugs_by_version.json b/docs/bugs_by_version.json index 60fcdd049a0f..1a210b885c2a 100644 --- a/docs/bugs_by_version.json +++ b/docs/bugs_by_version.json @@ -1923,6 +1923,10 @@ ], "released": "2021-03-23" }, + "0.8.30": { + "bugs": [], + "released": "2025-05-07" + }, "0.8.4": { "bugs": [ "FullInlinerNonExpressionSplitArgumentEvaluationOrder",