Skip to content
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: allow multiple trait impls for the same trait as long as one is in scope #6987

Merged
merged 3 commits into from
Jan 8, 2025

Conversation

asterite
Copy link
Collaborator

@asterite asterite commented Jan 8, 2025

Description

Problem

This code used to give an error saying multiple traits (Convert and Convert) were in scope:

struct Foo {
    inner: Field,
}

trait Converter<N> {
    fn convert(self) -> N;
}

impl Converter<Field> for Foo {
    fn convert(self) -> Field {
        self.inner
    }
}

impl Converter<u32> for Foo {
    fn convert(self) -> u32 {
        self.inner as u32
    }
}

fn main() {
    let foo = Foo { inner: 42 };
    let _: u32 = foo.convert();
}

Summary

Now the error is gone. We search if there's only one trait, not one trait method, in scope. In the snippet above there are two but they are for the same trait so it's fine. Later on the type-checker checks that it's only bound to the one for u32.

If we remove the u32 type annotation, we get this error:

error: Multiple trait impls match the object type `Foo`
   ┌─ src/main.nr:25:13
   │
25 │     let x = foo.convert();
   │             ----------- Ambiguous impl
   │
   = Candidate 1: `Foo: Converter<Field>`
   = Candidate 2: `Foo: Converter<u32>`

Additional Context

To be honest, I'm not sure where's the code that eventually checks what's the impl for foo.convert() that matches against u32, but seeing it work, and seeing the error we get when there are multiple matching impls, I'm confident it's working fine (it seems to be in verify_trait_constraint right before we end analyzing a function)

Documentation

Check one:

  • No documentation needed.
  • Documentation included in this PR.
  • [For Experimental Features] Documentation to be submitted in a separate PR.

PR Checklist

  • I have tested the changes locally.
  • I have formatted the changes with Prettier and/or cargo fmt on default settings.

Copy link
Contributor

github-actions bot commented Jan 8, 2025

Execution Report

Program Execution Time
sha256_regression 0.054s
regression_4709 0.001s
ram_blowup_regression 0.575s
rollup-root 0.105s
rollup-block-merge 0.106s
rollup-base-public 1.330s
rollup-base-private 0.521s

Copy link
Contributor

github-actions bot commented Jan 8, 2025

Compilation Report

Program Compilation Time
sha256_regression 1.040s
regression_4709 0.771s
ram_blowup_regression 14.800s
rollup-root 3.720s
rollup-block-merge 3.820s
rollup-base-public 30.400s
rollup-base-private 12.300s

Copy link
Contributor

github-actions bot commented Jan 8, 2025

Compilation Memory Report

Program Peak Memory %
keccak256 78.55M 0%
workspace 123.47M 0%
regression_4709 422.96M 0%
ram_blowup_regression 1.58G 0%
rollup-base-public 2.55G 0%
rollup-base-private 1.24G 0%
private-kernel-tail 168.56M -16%
private-kernel-reset 168.59M -77%
private-kernel-inner 168.56M -43%

Copy link
Contributor

github-actions bot commented Jan 8, 2025

Execution Memory Report

Program Peak Memory %
keccak256 74.65M 0%
workspace 123.28M 0%
regression_4709 315.98M 0%
ram_blowup_regression 512.41M 0%
rollup-base-public 492.17M 0%
rollup-base-private 332.89M 0%
private-kernel-tail 168.56M -8%
private-kernel-reset 168.59M -34%
private-kernel-inner 168.56M -21%

Copy link
Contributor

@jfecher jfecher left a comment

Choose a reason for hiding this comment

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

LGTM

lookup_struct_method has gotten way too large, we should break it up into pieces sometime

@asterite
Copy link
Collaborator Author

asterite commented Jan 8, 2025

lookup_struct_method has gotten way too large, we should break it up into pieces sometime

Makes sense. There are a couple more trait PRs. After those I'll try to simplify things.

@asterite asterite enabled auto-merge January 8, 2025 17:26
@asterite asterite added this pull request to the merge queue Jan 8, 2025
Merged via the queue into master with commit 7328f0b Jan 8, 2025
84 of 87 checks passed
@asterite asterite deleted the ab/multiple-trait-impls-for-the-same-trait branch January 8, 2025 17:45
@TomAFrench
Copy link
Member

TomAFrench commented Jan 8, 2025

@asterite This is causing errors in aztec-packages, is there an issue tracking this?

@asterite
Copy link
Collaborator Author

asterite commented Jan 8, 2025

Oh, I didn't notice. All tests passed. Was it because what you found in the other PR?

@asterite
Copy link
Collaborator Author

asterite commented Jan 8, 2025

Where can I see the errors?

@TomAFrench
Copy link
Member

Nope, we're failing to compile the private_kernel_reset package as part of the benchmarking workflow here.

@TomAFrench
Copy link
Member

@asterite
Copy link
Collaborator Author

asterite commented Jan 8, 2025

Strange, I don't understand why it errors. That said, I have a workaround, I'll push that for now.

AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 9, 2025
…eir trait in scope (noir-lang/noir#6901)

feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 10, 2025
…hem (noir-lang/noir#6913)

feat!: require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 10, 2025
…ng/noir#6913)

feat!: require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 10, 2025
chore: delete docs for versions which aren't used (noir-lang/noir#7020)
feat!: Disable mocks in `execute` (noir-lang/noir#6869)
chore(docs): backport 1.0.0-beta.0 doc fixes (noir-lang/noir#7014)
feat(cli): Add CLI option to filter by contract function name (noir-lang/noir#7018)
chore: Add more Field use info (noir-lang/noir#7019)
fix: let static_assert fail with the provided message (noir-lang/noir#7005)
chore: mark `aztec-nr` as expected to compile (noir-lang/noir#7015)
chore: clarity fix in docs (noir-lang/noir#7016)
fix: require generic trait impls to be in scope to call them (noir-lang/noir#6913)
feat!: require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 10, 2025
chore: delete docs for versions which aren't used (noir-lang/noir#7020)
feat!: Disable mocks in `execute` (noir-lang/noir#6869)
chore(docs): backport 1.0.0-beta.0 doc fixes (noir-lang/noir#7014)
feat(cli): Add CLI option to filter by contract function name (noir-lang/noir#7018)
chore: Add more Field use info (noir-lang/noir#7019)
fix: let static_assert fail with the provided message (noir-lang/noir#7005)
chore: mark `aztec-nr` as expected to compile (noir-lang/noir#7015)
chore: clarity fix in docs (noir-lang/noir#7016)
fix: require generic trait impls to be in scope to call them (noir-lang/noir#6913)
feat!: require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 11, 2025
…ang/noir#6985)

feat!: disallow calling unconstrained functions outside of `unsafe` blocks and passing unconstrained functions in place of constrained functions (noir-lang/noir#6938)
chore: simplify a couple of enum variants (noir-lang/noir#7025)
chore: disallow inserting ACIR-only instructions into brillig functions (noir-lang/noir#7017)
feat: unchecked math operations in SSA (noir-lang/noir#7011)
chore: delete docs for versions which aren't used (noir-lang/noir#7020)
feat!: Disable mocks in `execute` (noir-lang/noir#6869)
chore(docs): backport 1.0.0-beta.0 doc fixes (noir-lang/noir#7014)
feat(cli): Add CLI option to filter by contract function name (noir-lang/noir#7018)
chore: Add more Field use info (noir-lang/noir#7019)
fix: let static_assert fail with the provided message (noir-lang/noir#7005)
chore: mark `aztec-nr` as expected to compile (noir-lang/noir#7015)
chore: clarity fix in docs (noir-lang/noir#7016)
fix: require generic trait impls to be in scope to call them (noir-lang/noir#6913)
feat!: require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 11, 2025
feat!: disallow calling unconstrained functions outside of `unsafe` blocks and passing unconstrained functions in place of constrained functions (noir-lang/noir#6938)
chore: simplify a couple of enum variants (noir-lang/noir#7025)
chore: disallow inserting ACIR-only instructions into brillig functions (noir-lang/noir#7017)
feat: unchecked math operations in SSA (noir-lang/noir#7011)
chore: delete docs for versions which aren't used (noir-lang/noir#7020)
feat!: Disable mocks in `execute` (noir-lang/noir#6869)
chore(docs): backport 1.0.0-beta.0 doc fixes (noir-lang/noir#7014)
feat(cli): Add CLI option to filter by contract function name (noir-lang/noir#7018)
chore: Add more Field use info (noir-lang/noir#7019)
fix: let static_assert fail with the provided message (noir-lang/noir#7005)
chore: mark `aztec-nr` as expected to compile (noir-lang/noir#7015)
chore: clarity fix in docs (noir-lang/noir#7016)
fix: require generic trait impls to be in scope to call them (noir-lang/noir#6913)
feat!: require trait primitive functions/calls to have their trait in scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover (noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI (noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter (noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions (noir-lang/noir#7007)
chore: Only resolved globals monomorphization (noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass (noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety` (noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup (noir-lang/noir#6972)
chore: mark casts as able to be deduplicated (noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one (noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks` (noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer (noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords (noir-lang/noir#6961)
TomAFrench added a commit to AztecProtocol/aztec-packages that referenced this pull request Jan 11, 2025
Automated pull of development from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
feat!: require trait primitive functions/calls to have their trait in
scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover
(noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI
(noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter
(noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions
(noir-lang/noir#7007)
chore: Only resolved globals monomorphization
(noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass
(noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety`
(noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup
(noir-lang/noir#6972)
chore: mark casts as able to be deduplicated
(noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one
(noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks`
(noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in
scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer
(noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords
(noir-lang/noir#6961)
END_COMMIT_OVERRIDE

---------

Co-authored-by: Tom French <[email protected]>
AztecBot added a commit to AztecProtocol/aztec-nr that referenced this pull request Jan 12, 2025
Automated pull of development from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
feat!: require trait primitive functions/calls to have their trait in
scope (noir-lang/noir#6901)
feat(lsp): use trait method docs for trait impl method docs on hover
(noir-lang/noir#7003)
chore: turn on averaging for protocol circuits metrics in CI
(noir-lang/noir#6999)
feat(comptime): Implement to_be_bits and to_le_bits in the interpreter
(noir-lang/noir#7008)
chore: Add short circuit in ssa-gen for known if conditions
(noir-lang/noir#7007)
chore: Only resolved globals monomorphization
(noir-lang/noir#7006)
chore: Remove resolve_is_unconstrained pass
(noir-lang/noir#7004)
chore: require safety doc comment for unsafe instead of `//@safety`
(noir-lang/noir#6992)
fix: Reproduce and fix bytecode blowup
(noir-lang/noir#6972)
chore: mark casts as able to be deduplicated
(noir-lang/noir#6996)
fix: return trait impl method as FuncId if there's only one
(noir-lang/noir#6989)
chore(ci): fail properly in `external-repo-checks`
(noir-lang/noir#6988)
fix: allow multiple trait impls for the same trait as long as one is in
scope (noir-lang/noir#6987)
chore: Use DFG in SSA printer
(noir-lang/noir#6986)
chore!: Reserve `enum` and `match` keywords
(noir-lang/noir#6961)
END_COMMIT_OVERRIDE

---------

Co-authored-by: Tom French <[email protected]>
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.

3 participants