2019-08-03 05:29:50 +03:00
|
|
|
#!/bin/bash
|
2019-08-04 12:25:20 +03:00
|
|
|
cat <<EOF | gcc -xc -c -o tmp2.o -
|
|
|
|
int ret3() { return 3; }
|
|
|
|
int ret5() { return 5; }
|
2019-08-04 13:03:46 +03:00
|
|
|
int add(int x, int y) { return x+y; }
|
|
|
|
int sub(int x, int y) { return x-y; }
|
|
|
|
|
|
|
|
int add6(int a, int b, int c, int d, int e, int f) {
|
|
|
|
return a+b+c+d+e+f;
|
|
|
|
}
|
2019-08-04 12:25:20 +03:00
|
|
|
EOF
|
|
|
|
|
2019-08-03 05:29:50 +03:00
|
|
|
assert() {
|
|
|
|
expected="$1"
|
|
|
|
input="$2"
|
|
|
|
|
|
|
|
./chibicc "$input" > tmp.s || exit
|
2019-08-04 12:25:20 +03:00
|
|
|
gcc -static -o tmp tmp.s tmp2.o
|
2019-08-03 05:29:50 +03:00
|
|
|
./tmp
|
|
|
|
actual="$?"
|
|
|
|
|
|
|
|
if [ "$actual" = "$expected" ]; then
|
|
|
|
echo "$input => $actual"
|
|
|
|
else
|
|
|
|
echo "$input => $expected expected, but got $actual"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2020-09-04 13:01:33 +03:00
|
|
|
assert 0 'int main() { return 0; }'
|
|
|
|
assert 42 'int main() { return 42; }'
|
|
|
|
assert 21 'int main() { return 5+20-4; }'
|
|
|
|
assert 41 'int main() { return 12 + 34 - 5 ; }'
|
|
|
|
assert 47 'int main() { return 5+6*7; }'
|
|
|
|
assert 15 'int main() { return 5*(9-6); }'
|
|
|
|
assert 4 'int main() { return (3+5)/2; }'
|
|
|
|
assert 10 'int main() { return -10+20; }'
|
|
|
|
assert 10 'int main() { return - -10; }'
|
|
|
|
assert 10 'int main() { return - - +10; }'
|
|
|
|
|
|
|
|
assert 0 'int main() { return 0==1; }'
|
|
|
|
assert 1 'int main() { return 42==42; }'
|
|
|
|
assert 1 'int main() { return 0!=1; }'
|
|
|
|
assert 0 'int main() { return 42!=42; }'
|
|
|
|
|
|
|
|
assert 1 'int main() { return 0<1; }'
|
|
|
|
assert 0 'int main() { return 1<1; }'
|
|
|
|
assert 0 'int main() { return 2<1; }'
|
|
|
|
assert 1 'int main() { return 0<=1; }'
|
|
|
|
assert 1 'int main() { return 1<=1; }'
|
|
|
|
assert 0 'int main() { return 2<=1; }'
|
|
|
|
|
|
|
|
assert 1 'int main() { return 1>0; }'
|
|
|
|
assert 0 'int main() { return 1>1; }'
|
|
|
|
assert 0 'int main() { return 1>2; }'
|
|
|
|
assert 1 'int main() { return 1>=0; }'
|
|
|
|
assert 1 'int main() { return 1>=1; }'
|
|
|
|
assert 0 'int main() { return 1>=2; }'
|
|
|
|
|
|
|
|
assert 3 'int main() { int a; a=3; return a; }'
|
|
|
|
assert 3 'int main() { int a=3; return a; }'
|
|
|
|
assert 8 'int main() { int a=3; int z=5; return a+z; }'
|
|
|
|
|
|
|
|
assert 1 'int main() { return 1; 2; 3; }'
|
|
|
|
assert 2 'int main() { 1; return 2; 3; }'
|
|
|
|
assert 3 'int main() { 1; 2; return 3; }'
|
|
|
|
|
|
|
|
assert 3 'int main() { int a=3; return a; }'
|
|
|
|
assert 8 'int main() { int a=3; int z=5; return a+z; }'
|
|
|
|
assert 6 'int main() { int a; int b; a=b=3; return a+b; }'
|
|
|
|
assert 3 'int main() { int foo=3; return foo; }'
|
|
|
|
assert 8 'int main() { int foo123=3; int bar=5; return foo123+bar; }'
|
|
|
|
|
|
|
|
assert 3 'int main() { if (0) return 2; return 3; }'
|
|
|
|
assert 3 'int main() { if (1-1) return 2; return 3; }'
|
|
|
|
assert 2 'int main() { if (1) return 2; return 3; }'
|
|
|
|
assert 2 'int main() { if (2-1) return 2; return 3; }'
|
|
|
|
|
|
|
|
assert 55 'int main() { int i=0; int j=0; for (i=0; i<=10; i=i+1) j=i+j; return j; }'
|
|
|
|
assert 3 'int main() { for (;;) return 3; return 5; }'
|
|
|
|
|
|
|
|
assert 10 'int main() { int i=0; while(i<10) i=i+1; return i; }'
|
|
|
|
|
|
|
|
assert 3 'int main() { {1; {2;} return 3;} }'
|
|
|
|
assert 5 'int main() { ;;; return 5; }'
|
|
|
|
|
|
|
|
assert 10 'int main() { int i=0; while(i<10) i=i+1; return i; }'
|
|
|
|
assert 55 'int main() { int i=0; int j=0; while(i<=10) {j=i+j; i=i+1;} return j; }'
|
|
|
|
|
|
|
|
assert 3 'int main() { int x=3; return *&x; }'
|
|
|
|
assert 3 'int main() { int x=3; int *y=&x; int **z=&y; return **z; }'
|
|
|
|
assert 5 'int main() { int x=3; int y=5; return *(&x+1); }'
|
|
|
|
assert 3 'int main() { int x=3; int y=5; return *(&y-1); }'
|
|
|
|
assert 5 'int main() { int x=3; int y=5; return *(&x-(-1)); }'
|
|
|
|
assert 5 'int main() { int x=3; int *y=&x; *y=5; return x; }'
|
|
|
|
assert 7 'int main() { int x=3; int y=5; *(&x+1)=7; return y; }'
|
|
|
|
assert 7 'int main() { int x=3; int y=5; *(&y-2+1)=7; return x; }'
|
|
|
|
assert 5 'int main() { int x=3; return (&x+2)-&x+3; }'
|
|
|
|
assert 8 'int main() { int x, y; x=3; y=5; return x+y; }'
|
|
|
|
assert 8 'int main() { int x=3, y=5; return x+y; }'
|
|
|
|
|
|
|
|
assert 3 'int main() { return ret3(); }'
|
|
|
|
assert 5 'int main() { return ret5(); }'
|
|
|
|
assert 8 'int main() { return add(3, 5); }'
|
|
|
|
assert 2 'int main() { return sub(5, 3); }'
|
|
|
|
assert 21 'int main() { return add6(1,2,3,4,5,6); }'
|
|
|
|
assert 66 'int main() { return add6(1,2,add6(3,4,5,6,7,8),9,10,11); }'
|
|
|
|
assert 136 'int main() { return add6(1,2,add6(3,add6(4,5,6,7,8,9),10,11,12,13),14,15,16); }'
|
|
|
|
|
|
|
|
assert 32 'int main() { return ret32(); } int ret32() { return 32; }'
|
2019-08-04 12:25:20 +03:00
|
|
|
|
2019-08-03 05:29:50 +03:00
|
|
|
echo OK
|