Skip to content

Commit

Permalink
Fixed available generic args for default impls, and lowering diagnost…
Browse files Browse the repository at this point in the history
…ics of trait fn bodies.

Fixes #7031
Fixes #7038

commit-id:c29f1286
  • Loading branch information
orizi committed Jan 12, 2025
1 parent a2dd9e0 commit 0f7151e
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 2 deletions.
11 changes: 10 additions & 1 deletion crates/cairo-lang-lowering/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,16 @@ fn module_lowering_diagnostics(
ModuleItemId::Enum(_) => {}
ModuleItemId::TypeAlias(_) => {}
ModuleItemId::ImplAlias(_) => {}
ModuleItemId::Trait(_) => {}
ModuleItemId::Trait(trait_id) => {
for trait_func in db.trait_functions(*trait_id)?.values() {
if matches!(db.trait_function_body(*trait_func), Ok(Some(_))) {
let function_id = defs::ids::FunctionWithBodyId::Trait(*trait_func);
diagnostics.extend(
db.semantic_function_with_body_lowering_diagnostics(function_id)?,
);
}
}
}
ModuleItemId::Impl(impl_def_id) => {
for impl_func in db.impl_functions(*impl_def_id)?.values() {
let function_id = defs::ids::FunctionWithBodyId::Impl(*impl_func);
Expand Down
2 changes: 1 addition & 1 deletion crates/cairo-lang-semantic/src/items/trt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1355,7 +1355,7 @@ pub fn priv_trait_function_body_data(
// Compute declaration semantic.
let trait_function_declaration_data =
db.priv_trait_function_declaration_data(trait_function_id)?;
let parent_resolver_data = db.trait_resolver_data(trait_id)?;
let parent_resolver_data = trait_function_declaration_data.resolver_data;
let inference_id = InferenceId::LookupItemDefinition(LookupItemId::TraitItem(
TraitItemId::Function(trait_function_id),
));
Expand Down
25 changes: 25 additions & 0 deletions tests/bug_samples/issue7031.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
pub trait IteratorEx<T, impl I: Iterator<T>, +Destruct<T>, +Drop<I::Item>> {
fn advance_by(
ref self: T, n: usize,
) -> Result<
(), NonZero<usize>,
> {
let mut res = Result::Ok(());
for i in 0..n {
if self.next().is_none() {
res = Result::Err((n - i).try_into().unwrap());
break;
}
};
res
}
}
impl ItratorExImpl<T, impl I: Iterator<T>, +Destruct<T>, +Drop<I::Item>> of IteratorEx<T, I> {}

#[test]
fn test_advance_by() {
let mut iter = array![1_u8, 2, 3, 4].into_iter();
assert_eq!(iter.advance_by(2), Result::Ok(()));
assert_eq!(iter.next(), Option::Some(3));
assert_eq!(iter.advance_by(0), Result::Ok(()));
}
5 changes: 5 additions & 0 deletions tests/bug_samples/issue7038.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
trait DefaultTraitImpl {
fn call<T, F, +Drop<F>, impl func: core::ops::FnOnce<F, ()>[Output: T], +Drop<T>>(f: F) {
f();
}
}
2 changes: 2 additions & 0 deletions tests/bug_samples/lib.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ mod issue6623;
mod issue6755;
mod issue6920;
mod issue6968;
mod issue7031;
mod issue7038;
mod loop_break_in_match;
mod loop_only_change;
mod partial_param_local;
Expand Down

0 comments on commit 0f7151e

Please sign in to comment.