Skip to content

Commit 65ed946

Browse files
authored
Fix for loop panic when variable declared inside and used (#207)
* initial enum impl and match * fix for loop panic when var declared inside and used
1 parent 0e60ff9 commit 65ed946

4 files changed

Lines changed: 17 additions & 4 deletions

File tree

examples/for_loop_var.con

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
mod foo {
2+
pub fn main() -> i64 {
3+
for (let mut i: i32 = 0; i < 10; i = i + 1) {
4+
let mut b: i8 = 0;
5+
b = b + 1;
6+
}
7+
8+
return 0;
9+
}
10+
}

src/ir/lowering/expressions.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) fn lower_expression(
3030
) -> Result<(Rvalue, TypeIndex, Span), LoweringError> {
3131
Ok(match info {
3232
Expression::Value(info, span) => {
33-
debug!("lowering value");
33+
debug!("lowering value expr");
3434
let value = lower_value_expr(builder, info, type_hint)?;
3535
(value.0, value.1, *span)
3636
}
@@ -410,7 +410,6 @@ pub(crate) fn find_expression_type(
410410
fn_builder: &mut FnIrBuilder,
411411
info: &Expression,
412412
) -> Result<Option<TypeIndex>, LoweringError> {
413-
debug!("finding expression type");
414413
Ok(match info {
415414
Expression::Value(value, _) => match value {
416415
ValueExpr::ConstBool(_, _) => Some(fn_builder.builder.ir.get_bool_ty()),

src/ir/lowering/statements.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,8 @@ pub(crate) fn lower_statement(
5656
Ok(())
5757
}
5858

59-
#[instrument(level = "debug", skip_all, fields(name, variant))]
59+
#[instrument(level = "debug", skip_all, fields(name, variant, ty))]
6060
fn lower_let(builder: &mut FnIrBuilder, info: &LetStmt) -> Result<(), LoweringError> {
61-
debug!("begin lowering let");
6261
match &info.target {
6362
LetStmtTarget::Simple { id: name, r#type } => {
6463
tracing::Span::current().record("name", &name.name);
@@ -814,6 +813,10 @@ fn lower_for(builder: &mut FnIrBuilder, info: &ForStmt) -> Result<(), LoweringEr
814813
// keep idx for switch targets
815814
let first_then_block_idx = builder.body.basic_blocks.len();
816815

816+
for stmt in &info.block_stmts {
817+
get_locals(builder, stmt)?;
818+
}
819+
817820
for stmt in &info.block_stmts {
818821
lower_statement(builder, stmt, builder.body.locals[builder.ret_local].ty)?;
819822
}

tests/examples.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ mod common;
3434
#[test_case(include_str!("../examples/malloc.con"), "malloc", false, 5 ; "malloc.con")]
3535
#[test_case(include_str!("../examples/while_if_false.con"), "while_if_false", false, 7 ; "while_if_false.con")]
3636
#[test_case(include_str!("../examples/if_if_false.con"), "if_if_false", false, 7 ; "if_if_false.con")]
37+
#[test_case(include_str!("../examples/for_loop_var.con"), "for", false, 0 ; "for_loop_var.con")]
3738
#[test_case(include_str!("../examples/for.con"), "for", false, 10 ; "for.con")]
3839
#[test_case(include_str!("../examples/for_while.con"), "for_while", false, 10 ; "for_while.con")]
3940
#[test_case(include_str!("../examples/arrays.con"), "arrays", false, 5 ; "arrays.con")]

0 commit comments

Comments
 (0)