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:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user