Skip to content

[v2] fix(diagnostics): Gate yul builtins on version and target - #2036

Open
teofr wants to merge 2 commits into
mainfrom
teofr/gate-yul-builtins
Open

[v2] fix(diagnostics): Gate yul builtins on version and target#2036
teofr wants to merge 2 commits into
mainfrom
teofr/gate-yul-builtins

Conversation

@teofr

@teofr teofr commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

We were checking for redeclarations errors on Yul against builtin regardless of version and target, this is a problem since solc allows to use built ins as identifiers in yul before they become available (for example mcopy before Cancun).

This PR makes slang more lenient than solc, in particular we are lacking another concept of identifier checking, reserved identifiers. Within Yul, certain identifiers are reserved for future builtin, for example chainid was reserved even before the Istanbul fork. That remains as future work.

Two next PRs will tackle:

  • gating solidity builtins, not only yul builtins
  • Also gating builtin references, otherwise the following example fails (a bug already present, but exposed by this fix):
assembly {
    let mcopy := 1
    let x := mcopy   // Error: "This built-in was introduced in EVM target 'Cancun'"
}

@teofr
teofr requested a review from Copilot August 7, 2026 15:27
@changeset-bot

changeset-bot Bot commented Aug 7, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 54cc152

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts Slang v2’s Yul diagnostics so Yul built-in name redeclaration is only rejected when the built-in is actually available for the configured language version and EVM target (matching solc’s “grace period” behavior for names like mcopy before Cancun). It also introduces snapshot coverage documenting current intentional divergences where solc treats some identifiers as reserved even when the built-in is not available.

Changes:

  • Gate Yul built-in redeclaration checks on (LanguageVersion, EvmTarget) by threading both through p6_resolve_yul and using an availability predicate.
  • Centralize built-in version/target specifiers into a single generated source (built_in_specifiers) used by both availability checks and diagnostics validation.
  • Add/extend diagnostics snapshot suites to cover “not yet reserved”, “reserved before fork”, and “reserved after fork” cases (including expected solc divergences).

Reviewed changes

Copilot reviewed 21 out of 40 changed files in this pull request and generated no comments.

Show a summary per file
File Description
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_before_own_fork/input.sol New snapshot input demonstrating chainid reserved-by-solc behavior before its fork.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_before_own_fork/generated/solc/0.8.0-failure.txt Records solc’s failure diagnostic for the reserved identifier case.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_before_own_fork/generated/slang/0.8.0-success.txt Records Slang’s current acceptance (documented divergence) for the reserved-before-availability case.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_before_own_fork/.tests.config.json Configures matrix + expected solc divergence for the reserved-before-fork scenario.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/input.sol New snapshot input demonstrating difficulty behavior across the Paris boundary.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/generated/solc/10-paris-failure.txt Captures solc’s “reserved identifier” failure post-Paris.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/generated/solc/05-constantinople-failure.txt Captures solc’s pre-Paris builtin-name identifier failure.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/generated/solc/01-homestead-failure.txt Captures solc’s pre-Constantinople warnings + failure output for the same scenario.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/generated/solc/00-frontier-failure.txt Captures solc’s invalid EVM target behavior for Frontier in the matrix.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/generated/slang/10-paris-success.txt Records Slang’s current acceptance post-Paris (documented divergence).
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/generated/slang/00-frontier-failure.txt Records Slang’s Frontier failure in this suite’s expectations.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/reserved_after_own_fork/.tests.config.json Configures matrix + expected solc divergence for the reserved-after-own-fork scenario.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/input.sol New snapshot input for mcopy grace-period behavior before Cancun.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/generated/solc/12-cancun-failure.txt Captures solc’s failure once Cancun introduces the built-in.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/generated/solc/05-constantinople-failure.txt Captures solc’s pre-Cancun warning output for mcopy.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/generated/solc/01-homestead-failure.txt Captures solc warnings on older targets for the same case.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/generated/solc/00-frontier-failure.txt Captures solc’s invalid EVM target behavior for Frontier in the matrix.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/generated/slang/12-cancun-failure.txt Records Slang’s failure once the built-in becomes available (matches intent).
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/generated/slang/00-frontier-success.txt Records Slang’s acceptance prior to built-in availability.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_yet_reserved_until_fork/.tests.config.json Configures matrix + expected solc divergence (warnings/invalid-target handling).
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/input.sol New snapshot input for mcopy one compiler version before introduction (always allowed).
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/generated/solc/12-cancun-failure.txt Captures solc’s invalid EVM target behavior when the compiler predates Cancun.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/generated/solc/05-constantinople-success.txt Captures solc success on supported targets for that older compiler version.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/generated/solc/01-homestead-failure.txt Captures solc’s deprecation warning behavior in the matrix.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/generated/solc/00-frontier-failure.txt Captures solc’s invalid EVM target behavior for Frontier in the matrix.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/generated/slang/00-frontier-success.txt Records Slang acceptance for the older-version, pre-introduction case.
crates/solidity-v2/testing/snapshots/diagnostics_output/resolution/built_in_redeclaration/not_reserved_before_own_version/.tests.config.json Configures matrix + expected solc divergence for the pre-introduction case.
crates/solidity-v2/outputs/cargo/tests/src/diagnostics_output/snapshots.generated.rs Registers the newly added snapshot suites in the Rust test runner.
crates/solidity-v2/outputs/cargo/semantic/src/passes/tests/binder.rs Updates binder pass test harness to call p6_resolve_yul with version + target.
crates/solidity-v2/outputs/cargo/semantic/src/passes/p8_code_analysis/built_ins/validate_built_ins.rs.jinja2 Removes the old codegen template for built-in validation (replaced by shared specifiers).
crates/solidity-v2/outputs/cargo/semantic/src/passes/p8_code_analysis/built_ins/validate_built_ins.rs Adds non-generated validator that consumes centralized specifiers.
crates/solidity-v2/outputs/cargo/semantic/src/passes/p8_code_analysis/built_ins/validate_built_ins.generated.rs Removes old generated validator implementation.
crates/solidity-v2/outputs/cargo/semantic/src/passes/p8_code_analysis/built_ins/mod.rs Switches module wiring to use the new non-generated validator.
crates/solidity-v2/outputs/cargo/semantic/src/passes/p6_resolve_yul/mod.rs Threads LanguageVersion + EvmTarget into the Yul resolution pass.
crates/solidity-v2/outputs/cargo/semantic/src/passes/p6_resolve_yul/conflicts.rs Gates Yul built-in redeclaration conflicts on built-in availability.
crates/solidity-v2/outputs/cargo/semantic/src/context/mod.rs Passes language_version and evm_target into p6_resolve_yul::run from the semantic pipeline.
crates/solidity-v2/outputs/cargo/semantic/src/built_ins/specifiers.rs.jinja2 New template: generates the single source of truth for built-in version/target specifiers.
crates/solidity-v2/outputs/cargo/semantic/src/built_ins/specifiers.generated.rs Generated specifier mapping used by both diagnostics and availability.
crates/solidity-v2/outputs/cargo/semantic/src/built_ins/mod.rs Adds availability + specifier modules and re-exports the shared helpers.
crates/solidity-v2/outputs/cargo/semantic/src/built_ins/availability.rs Implements is_built_in_available based on the shared specifiers.

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Branchteofr/gate-yul-builtins
Testbedci

⚠️ WARNING: Truncated view!

The full continuous benchmarking report exceeds the maximum length allowed on this platform.

🐰 View full continuous benchmarking report in Bencher

Comment on lines +18 to +24
"specifier": {
"type": "Range",
"from": "Homestead",
"till": "Cancun"
},
"reason": "Before Cancun solc accepts `let mcopy := 1` with only a warning ('mcopy' will be promoted to a Yul reserved identifier in the future; plus a deprecated-EVM warning on the oldest targets), which counts as a rejection. slang correctly accepts the grace-period name until the built-in exists, so the statuses differ until warnings are distinguished from errors."
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This should go away once we treat warnings as successes

Comment on lines -64 to -65
// TODO: this checks against built-ins across all versions/targets, but we
// should restrict it to the current version/target.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This PR essentially solves this TODO, but opens a new one

@teofr
teofr force-pushed the teofr/gate-yul-builtins branch from a8fd1b3 to 54cc152 Compare August 7, 2026 16:53
@teofr
teofr marked this pull request as ready for review August 7, 2026 16:54
@teofr
teofr requested review from a team as code owners August 7, 2026 16:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants