diff --git a/compiler/noirc_frontend/src/elaborator/mod.rs b/compiler/noirc_frontend/src/elaborator/mod.rs index c47dd49e567..6dd7dde4ede 100644 --- a/compiler/noirc_frontend/src/elaborator/mod.rs +++ b/compiler/noirc_frontend/src/elaborator/mod.rs @@ -1318,10 +1318,11 @@ impl<'context> Elaborator<'context> { { for trait_constrain in &trait_implementation.borrow().where_clause { let trait_bound = &trait_constrain.trait_bound; - self.interner.add_assumed_trait_implementation( - trait_constrain.typ.clone(), + self.add_trait_bound_to_scope( + trait_bound.location, + &trait_constrain.typ, + trait_bound, trait_bound.trait_id, - trait_bound.trait_generics.clone(), ); } } diff --git a/compiler/noirc_frontend/src/tests/traits.rs b/compiler/noirc_frontend/src/tests/traits.rs index 92eed274bdc..f38d01aecb1 100644 --- a/compiler/noirc_frontend/src/tests/traits.rs +++ b/compiler/noirc_frontend/src/tests/traits.rs @@ -1613,3 +1613,23 @@ fn errors_on_incorrect_generics_in_type_trait_call() { "#; check_errors!(src); } + +#[named] +#[test] +fn trait_impl_with_child_constraint() { + let src = r#" + trait Parent {} + + trait Child: Parent { + fn child() {} + } + + pub struct Struct {} + + impl Parent for Struct {} + impl Child for Struct {} + + fn main() {} + "#; + assert_no_errors!(src); +} diff --git a/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/Nargo.toml b/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/Nargo.toml new file mode 100644 index 00000000000..8724bb370d2 --- /dev/null +++ b/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/Nargo.toml @@ -0,0 +1,7 @@ + + [package] + name = "noirc_frontend_tests_traits_trait_impl_with_child_constraint" + type = "bin" + authors = [""] + + [dependencies] \ No newline at end of file diff --git a/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/src/main.nr b/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/src/main.nr new file mode 100644 index 00000000000..4c421e0155e --- /dev/null +++ b/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/src/main.nr @@ -0,0 +1,14 @@ + + trait Parent {} + + trait Child: Parent { + fn child() {} + } + + pub struct Struct {} + + impl Parent for Struct {} + impl Child for Struct {} + + fn main() {} + \ No newline at end of file diff --git a/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/src_hash.txt b/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/src_hash.txt new file mode 100644 index 00000000000..933732ada78 --- /dev/null +++ b/test_programs/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/src_hash.txt @@ -0,0 +1 @@ +8780780344867922157 \ No newline at end of file diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/execute__tests__expanded.snap new file mode 100644 index 00000000000..077be9b9e01 --- /dev/null +++ b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_traits_trait_impl_with_child_constraint/execute__tests__expanded.snap @@ -0,0 +1,28 @@ +--- +source: tooling/nargo_cli/tests/execute.rs +expression: expanded_code +--- +trait Parent {} + +trait Child: Parent { + fn child() {} +} + +pub struct Struct {} + +impl Parent for Struct +where + T: Parent, +{} + +impl Child for Struct +where + T: Child, +{ + fn child() + where + T: Child, + {} +} + +fn main() {}