-
Notifications
You must be signed in to change notification settings - Fork 213
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: try_unify
no longer binds types on failure
#3697
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
kevaundray
approved these changes
Dec 5, 2023
can you add a regression test? |
vezenovm
approved these changes
Dec 5, 2023
# Description ## Problem & Summary Checking a trait function's type previously was very ad-hoc. When a `TraitMethodReference` was found, it'd manually create a function type from the trait function's definition and instantiate it - even though instantiating a `Type::Function` does nothing. I've changed the TraitFunction struct to add a `Type` field for the whole function type, which includes generics. The type now should usually be a `Type::Forall`. In addition, I've added the trait's `Self` type to the list of generics in the Type::Forall. This fixes the issue where the `Self` type would be bound after certain function calls which would affect callsites but not a function body leading to a type mismatch between function return type and a call's return type. This is the issue we were encountering after adding traits to noir-protocol-circuits. ## Additional Information No tests are provided since I was unable to make a minimal repro from the thousands of lines of noir-protocol-circuits unfortunately. I'll keep experimenting while this PR is up. I'm also merging into jf/fix-3089 since this was somewhat accidentally built on top of it. The two changes are otherwise unrelated. ## Documentation\* Check one: - [x] No documentation needed. - [ ] Documentation included in this PR. - [ ] **[Exceptional Case]** Documentation to be submitted in a separate PR. # PR Checklist\* - [x] I have tested the changes locally. - [x] I have formatted the changes with [Prettier](https://prettier.io/) and/or `cargo fmt` on default settings.
@kevaundray added a regression |
TomAFrench
added a commit
that referenced
this pull request
Dec 11, 2023
* master: (120 commits) feat: allow passing custom foreign call handlers when creating proofs in NoirJS (#3764) fix: add missing assertion to test (#3765) chore: re-export the items needed for the lsp from the fm crate instead of importing codespan_reporting (#3757) chore: remove special casing for `pedersen_hash` black box function (#3744) chore: remove extraneous dbg statement (#3761) chore: fix un-needed fully qualified path (#3755) feat: aztec-packages (#3754) feat: allow underscores in integer literals (#3746) fix: deserialize odd length hex literals (#3747) feat: optimize out unnecessary truncation instructions (#3717) chore: use `tsx` instead of `ts-node` for `noir_js` (#3750) chore(ci): fail `tests-end` job if any dependants failed (#3737) chore: allow common ascii punctuation in attributes (#3733) chore: fix broken onboarding link in README (#3732) feat: Dockerfile to test cargo and JS packages (#3684) feat(lsp): add goto definition for locals (#3705) feat: docs landing page with a playground (#3667) fix: `try_unify` no longer binds types on failure (#3697) fix: parse negative integer literals (#3698) fix: unsigned integers cannot be negated (#3688) ...
kevaundray
added a commit
that referenced
this pull request
Dec 15, 2023
🤖 I have created a release *beep* *boop* --- <details><summary>0.21.0</summary> ## [0.21.0](v0.20.0...v0.21.0) (2023-12-15) ### ⚠ BREAKING CHANGES * remove unused `source-resolver` package ([#3791](#3791)) * Make file manager read-only to the compiler ([#3760](#3760)) ### Features * Add `prelude.nr` ([#3693](#3693)) ([5f0f81f](5f0f81f)) * Add some traits to the stdlib ([#3796](#3796)) ([8e11352](8e11352)) * Add support for writing tracing debug info to file ([#3790](#3790)) ([98a5004](98a5004)) * Allow passing custom foreign call handlers when creating proofs in NoirJS ([#3764](#3764)) ([6076e08](6076e08)) * Allow underscores in integer literals ([#3746](#3746)) ([2c06a64](2c06a64)) * Avoid overflow checks on boolean multiplication ([#3745](#3745)) ([9b5b686](9b5b686)) * Aztec-packages ([#3754](#3754)) ([c043265](c043265)) * Dockerfile to test cargo and JS packages ([#3684](#3684)) ([513d619](513d619)) * Docs landing page with a playground ([#3667](#3667)) ([9a95fbe](9a95fbe)) * Enhance test information output ([#3696](#3696)) ([468fbbc](468fbbc)) * Implement print without newline ([#3650](#3650)) ([9827dfe](9827dfe)) * **lsp:** Add goto definition for locals ([#3705](#3705)) ([9dd465c](9dd465c)) * **lsp:** Add goto definition for structs ([#3718](#3718)) ([a576c5b](a576c5b)) * Optimize out unnecessary truncation instructions ([#3717](#3717)) ([c9c72ae](c9c72ae)) * Remove experimental feature warning for traits ([#3783](#3783)) ([cb52242](cb52242)) * Reorganizing docs to fit diataxis framework ([#3711](#3711)) ([54a1ed5](54a1ed5)) * Simplify explicit equality assertions to assert equality directly ([#3708](#3708)) ([2fc46e2](2fc46e2)) * Speed up transformation of debug messages ([#3815](#3815)) ([2a8af1e](2a8af1e)) ### Bug Fixes * `try_unify` no longer binds types on failure ([#3697](#3697)) ([f03e581](f03e581)) * Add missing assertion to test ([#3765](#3765)) ([bcbe116](bcbe116)) * Add negative integer literals ([#3690](#3690)) ([8b3a68f](8b3a68f)) * Allow trait method references from the trait name ([#3774](#3774)) ([cfa34d4](cfa34d4)) * Deserialize odd length hex literals ([#3747](#3747)) ([4000fb2](4000fb2)) * **docs:** Trigger `update-docs` workflow when the `release-please` PR gets merged and not on every merge to master ([#3677](#3677)) ([9a3d1d2](9a3d1d2)) * Initialise strings as u8 array ([#3682](#3682)) ([8da40b7](8da40b7)) * **lsp:** Package resolution on save ([#3794](#3794)) ([14f2fff](14f2fff)) * Parse negative integer literals ([#3698](#3698)) ([463ab06](463ab06)) * Pub is required on return for entry points ([#3616](#3616)) ([7f1d796](7f1d796)) * Remove `noirc_driver/aztec` feature flag in docker ([#3784](#3784)) ([a48d562](a48d562)) * Remove include-keys option ([#3692](#3692)) ([95d7ce2](95d7ce2)) * Revert chnage to modify version in workspace file for acvm dependencies ([#3673](#3673)) ([0696f75](0696f75)) * Sequence update-lockfile workflow so it gets modified after the ACVM version in the root has been changed ([#3676](#3676)) ([c00cd85](c00cd85)) * **ssa:** Handle array arguments to side effectual constrain statements ([#3740](#3740)) ([028d65e](028d65e)) * Stop cloning Traits! ([#3736](#3736)) ([fcff412](fcff412)) * Stop issuing unused variable warnings for variables in trait definitions ([#3797](#3797)) ([0bb44c3](0bb44c3)) * Unsigned integers cannot be negated ([#3688](#3688)) ([f904ae1](f904ae1)) ### Miscellaneous Chores * Make file manager read-only to the compiler ([#3760](#3760)) ([e3dcc21](e3dcc21)) * Remove unused `source-resolver` package ([#3791](#3791)) ([57d2505](57d2505)) </details> <details><summary>0.37.1</summary> ## [0.37.1](v0.37.0...v0.37.1) (2023-12-15) ### Features * Aztec-packages ([#3754](#3754)) ([c043265](c043265)) * Speed up transformation of debug messages ([#3815](#3815)) ([2a8af1e](2a8af1e)) ### Bug Fixes * Deserialize odd length hex literals ([#3747](#3747)) ([4000fb2](4000fb2)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
Problem*
Resolves #3089. This issue also affected impl search which uses
try_unify
to compare against every impl candidate. In some programs this could cause invalid type bindings, eventually leading to various mismatched/unexpected types panics during SSA.Summary*
I've refactored
try_unify
to instead return a set of type bindings which must be applied afterward if the function was successful. Each caller oftry_unify
must do this manually now. Additionally,lookup_trait_implementation
must now juggle several sets of type bindings and only commit to those that are not instantiation bindings (otherwise the generic trait would be permanently bound to another type), and even then only commit to them on success.Additional Context
Documentation*
Check one:
PR Checklist*
cargo fmt
on default settings.