[v2] fix(diagnostics): Gate yul builtins on version and target - #2036
[v2] fix(diagnostics): Gate yul builtins on version and target#2036teofr wants to merge 2 commits into
Conversation
|
There was a problem hiding this comment.
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 throughp6_resolve_yuland 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. |
|
| Branch | teofr/gate-yul-builtins |
| Testbed | ci |
🐰 View full continuous benchmarking report in Bencher
⚠️ WARNING: Truncated view!The full continuous benchmarking report exceeds the maximum length allowed on this platform.
| "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." | ||
| } |
There was a problem hiding this comment.
This should go away once we treat warnings as successes
| // TODO: this checks against built-ins across all versions/targets, but we | ||
| // should restrict it to the current version/target. |
There was a problem hiding this comment.
This PR essentially solves this TODO, but opens a new one
a8fd1b3 to
54cc152
Compare
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
mcopybefore 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
chainidwas reserved even before the Istanbul fork. That remains as future work.Two next PRs will tackle: