From c4f04e64be4c98d8491b41da5088e11bc6c0247e Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 24 Sep 2026 19:59:09 +0200 Subject: [PATCH] Fixed incorrect loop counter value --- src/core/compileLoop.go | 11 ++++++++++- tests/array-static-loop.q | 33 +++++++++++++++++++++++++++++++++ tests/tests_test.go | 1 + 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 tests/array-static-loop.q diff --git a/src/core/compileLoop.go b/src/core/compileLoop.go index ea24120..79d0c5d 100644 --- a/src/core/compileLoop.go +++ b/src/core/compileLoop.go @@ -55,6 +55,15 @@ func (f *Function) compileLoop(node *ast.Loop) error { // We check that the condition to jump to the loop body is true, // otherwise we jump to the loop exit. f.AddBlock(loopHead) + + counter := &ssa.Phi{ + Name: name, + Typ: fromValue.Type(), + Arguments: ssa.Arguments{fromValue}, + } + + loopHead.InsertAt(0, counter) + loopHead.ReplaceIdentifier(name, fromValue, counter) toValue, err := f.evaluateRight(to) if err != nil { @@ -67,7 +76,7 @@ func (f *Function) compileLoop(node *ast.Loop) error { condition := f.Append(&ssa.BinaryOp{ Op: token.Less, - Left: fromValue, + Left: counter, Right: toValue, }) diff --git a/tests/array-static-loop.q b/tests/array-static-loop.q new file mode 100644 index 0000000..34332df --- /dev/null +++ b/tests/array-static-loop.q @@ -0,0 +1,33 @@ +Map { + grid [4][4]int +} + +main() { + map := new(Map) + + loop x := 0..4 { + loop y := 0..4 { + map.grid[y][x] = x * y + } + } + + assert map.grid[0][0] == 0 + assert map.grid[0][1] == 0 + assert map.grid[0][2] == 0 + assert map.grid[0][3] == 0 + + assert map.grid[1][0] == 0 + assert map.grid[1][1] == 1 + assert map.grid[1][2] == 2 + assert map.grid[1][3] == 3 + + assert map.grid[2][0] == 0 + assert map.grid[2][1] == 2 + assert map.grid[2][2] == 4 + assert map.grid[2][3] == 6 + + assert map.grid[3][0] == 0 + assert map.grid[3][1] == 3 + assert map.grid[3][2] == 6 + assert map.grid[3][3] == 9 +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index 6e24958..412c420 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -167,6 +167,7 @@ var tests = []run{ {"array-static", nil, "", "", 0}, {"array-static-global", nil, "", "", 0}, {"array-static-global-grid", nil, "", "", 0}, + {"array-static-loop", nil, "", "", 0}, {"signed-load-8", nil, "", "", 0}, {"signed-load-16", nil, "", "", 0}, {"signed-load-32", nil, "", "", 0}, -- 2.51.2