lower+backend: 배열, 경계검사, 구조체, 그리고 실행 테스트 스위트

인덱스는 부호 없는 비교와 트랩으로 펴진다. --no-checks 는 메시지가 아니라
비교와 분기 자체를 없앤다 -- 그게 그 플래그의 전부다.

버그 셋:

- 값으로 넘긴 구조체 파라미터는 주소로 도착하는데 lowering 이 그걸 몰라서
  포인터를 구조체로 읽었다. 변수마다 by_address 를 기록한다.
- 덩어리 반환의 숨은 결과 인자를 지역이 아니라 임시값으로 다뤘다.
- store 에 폭이 없어서 1바이트 bool 을 4바이트로 썼다. 옆 지역변수가
  뭉개졌고 logic 프로그램이 틀린 답을 냈다.

tests/exec.py 가 새 스위트다. run.py 는 컴파일러가 프로그램에 대해 뭐라고
하는지 보고, 이쪽은 프로그램이 실제로 무엇을 하는지 본다. 보고만 되고
방출되지 않는 경계검사는 저기서는 통과하고 여기서는 실패한다.

run.py 194/194, exec.py 6/6.
This commit is contained in:
2026-08-17 06:00:33 +09:00
parent e5093e690d
commit 43555b261c
11 changed files with 333 additions and 20 deletions
+12
View File
@@ -0,0 +1,12 @@
// EXIT:10
unit arith;
fn main() -> i32 {
let a: i32 = 7;
let b: i32 = 6;
var r: i32 = a * b;
r = r - 2;
r = r / 4;
if r == 10 { return r; }
return 99;
}
+13
View File
@@ -0,0 +1,13 @@
// EXIT:100
unit array;
fn main() -> i32 {
let a: [4]i32 = [10, 20, 30, 40];
var sum: i32 = 0;
var i: i32 = 0;
while i < 4 {
sum = sum + a[i];
i = i + 1;
}
return sum;
}
+10
View File
@@ -0,0 +1,10 @@
// EXIT:3
// OUTPUT:index out of bounds
// NOCHECKS:0
unit bounds;
fn main() -> i32 {
let a: [2]i32 = [1, 2];
let x: i32 = a[2];
return x - x;
}
+12
View File
@@ -0,0 +1,12 @@
// EXIT:1
unit logic;
fn side(v: i32) -> bool { return v > 0; }
fn main() -> i32 {
let a: bool = true and side(1);
let b: bool = false or side(2);
let c: bool = not side(0);
if a and b and c { return 1; }
return 0;
}
+14
View File
@@ -0,0 +1,14 @@
// EXIT:55
unit loopcall;
fn add(a: i32, b: i32) -> i32 { return a + b; }
fn main() -> i32 {
var total: i32 = 0;
var i: i32 = 0;
while i < 10 {
total = total + add(i, 1);
i = i + 1;
}
return total;
}
+20
View File
@@ -0,0 +1,20 @@
// EXIT:97
unit structs;
struct Point { x: i32, y: i32, }
fn make(a: i32, b: i32) -> Point { return Point{ x: a, y: b }; }
fn swap(p: Point) -> Point { return Point{ x: p.y, y: p.x }; }
fn main() -> i32 {
let p: Point = make(3, 8);
let q: Point = swap(p);
let grid: [3]Point = [make(1,1), make(2,2), make(3,3)];
var s: i32 = 0;
var i: i32 = 0;
while i < 3 {
s = s + grid[i].x * grid[i].y;
i = i + 1;
}
return q.x * 10 + q.y + s;
}