From 03d20c2f1cf36dc643321520777fa5e5bc85e095 Mon Sep 17 00:00:00 2001 From: TomerStarkware <144585788+TomerStarkware@users.noreply.github.com> Date: Mon, 29 Jul 2024 15:06:30 +0300 Subject: [PATCH] fixed usage of for iterator variable (#6086) --- corelib/src/test/array_test.cairo | 11 +++++ .../src/lower/test_data/usage | 40 +++++++++++++++++++ crates/cairo-lang-lowering/src/lower/usage.rs | 4 ++ 3 files changed, 55 insertions(+) diff --git a/corelib/src/test/array_test.cairo b/corelib/src/test/array_test.cairo index bde51b2b576..9b3f68e514c 100644 --- a/corelib/src/test/array_test.cairo +++ b/corelib/src/test/array_test.cairo @@ -216,3 +216,14 @@ fn test_array_snap_into_span() { fn test_span_into_array_snap() { assert_eq!(@array![1, 2, 3], array![1, 2, 3].span().into()); } +#[test] +fn nested_for_loop() { + let mat = array![array![1, 2], array![3, 4], array![5, 6]]; + let mut result = 0; + for arr in mat { + for i in arr { + result += i; + }; + }; + assert_eq!(result, 21); +} diff --git a/crates/cairo-lang-lowering/src/lower/test_data/usage b/crates/cairo-lang-lowering/src/lower/test_data/usage index 35daae3ea2c..6eb4c43c861 100644 --- a/crates/cairo-lang-lowering/src/lower/test_data/usage +++ b/crates/cairo-lang-lowering/src/lower/test_data/usage @@ -124,3 +124,43 @@ Block 6:27: Usage: ParamId(test::a)::b::c, Changes: ParamId(test::a)::b::c, Introductions: LocalVarId(test::c), LocalVarId(test::only_used_in_condition), + +//! > ========================================================================== + +//! > Test for usage + +//! > test_runner_name +test_function_usage + +//! > function +fn foo(a: u32) { + let arr = array![1, 2, 3]; + for b in arr { + a + b; + }; +} + +//! > function_name +foo + +//! > module_code + +//! > semantic_diagnostics + +//! > usage +Block 0:0: + Usage: + Changes: + Introductions: LocalVarId(test::__array_builder_macro_result__), +Block 2:17: + Usage: ParamId(test::a), LocalVarId(test::b), + Changes: + Introductions: +For 2:4: + Usage: LocalVarId(test::in), ParamId(test::a), + Changes: LocalVarId(test::in), + Introductions: LocalVarId(test::b), +Block 0:15: + Usage: ParamId(test::a), + Changes: + Introductions: LocalVarId(test::arr), LocalVarId(test::in), diff --git a/crates/cairo-lang-lowering/src/lower/usage.rs b/crates/cairo-lang-lowering/src/lower/usage.rs index d4f76157f5c..8c9965e956c 100644 --- a/crates/cairo-lang-lowering/src/lower/usage.rs +++ b/crates/cairo-lang-lowering/src/lower/usage.rs @@ -8,6 +8,7 @@ use cairo_lang_semantic::{ self as semantic, Expr, ExprFunctionCallArg, ExprId, ExprVarMemberPath, FunctionBody, Pattern, Statement, VarId, }; +use cairo_lang_utils::extract_matches; use cairo_lang_utils::ordered_hash_map::OrderedHashMap; use cairo_lang_utils::ordered_hash_set::OrderedHashSet; use id_arena::Arena; @@ -209,6 +210,9 @@ impl BlockUsages { self.block_usages.insert(expr_id, usage); } Expr::For(expr) => { + current.introductions.insert( + extract_matches!(&expr.into_iter_member_path, ExprVarMemberPath::Var).var, + ); let mut usage: Usage = Default::default(); usage.usage.insert( (&expr.into_iter_member_path).into(),