@@ -78,6 +78,10 @@ function expr() {
7878expr 0 0
7979expr 42 42
8080
81+ # octal constant (satisfying re(0[0-7]+))
82+ expr 10 012
83+ expr 65 0101
84+
8185# arithmetic
8286expr 42 " 24 + 18"
8387expr 30 " 58 - 28"
@@ -95,6 +99,9 @@ expr 55 "((((((((1 + 2) + 3) + 4) + 5) + 6) + 7) + 8) + 9) + 10"
9599expr 55 " 1 + (2 + (3 + (4 + (5 + (6 + (7 + (8 + (9 + 10))))))))"
96100expr 210 " 1 + (2 + (3 + (4 + (5 + (6 + (7 + (8 + (9 + (10 + (11 + (12 + (13 + (14 + (15 + (16 + (17 + (18 + (19 + 20))))))))))))))))))"
97101
102+ expr 11 " 1 + 012" # oct(012) = dec(10)
103+ expr 25 " 017 + 012" # oct(017) = dec(15), oct(012) = dec(10)
104+
98105# expr 21 "+1+20"
99106# expr 10 "-15+(+35-10)"
100107
@@ -108,6 +115,16 @@ expr 0 "5 >= 10"
108115expr 1 " 5 >= 5"
109116expr 1 " 30 != 20"
110117
118+ # value satisfying re(0[0-7]+) should be parsed as octal
119+ expr 1 " 010 == 8"
120+ expr 1 " 011 < 11"
121+ expr 0 " 021 >= 21"
122+ expr 1 " (012 - 5) == 5"
123+ expr 16 " 0100 >> 2"
124+
125+ # oct(355) = bin(1110_1101), oct(~355) = bin(0001_0010) = dec(18)
126+ expr 18 " ~0355"
127+
111128expr 0 " !237"
112129expr 18 " ~237"
113130
@@ -139,12 +156,21 @@ items 10 "int var; var = 10; return var;"
139156items 42 " int va; int vb; va = 11; vb = 31; int vc; vc = va + vb; return vc;"
140157items 50 " int v; v = 30; v = 50; return v;"
141158
159+ # variable with octal literals
160+ items 10 " int var; var = 012; return var;"
161+ items 100 " int var; var = 10 * 012; return var;"
162+ items 32 " int var; var = 0100 / 2; return var;"
163+ items 65 " int var; var = 010 << 3; var += 1; return var;"
164+
142165# if
143166items 5 " if (1) return 5; else return 20;"
144167items 10 " if (0) return 5; else if (0) return 20; else return 10;"
145168items 10 " int a; a = 0; int b; b = 0; if (a) b = 10; else if (0) return a; else if (a) return b; else return 10;"
146169items 27 " int a; a = 15; int b; b = 2; if(a - 15) b = 10; else if (b) return a + b + 10; else if (a) return b; else return 10;"
147170
171+ items 8 " if (1) return 010; else return 11;"
172+ items 10 " int a; a = 012 - 10; int b; b = 0100 - 64; if (a) b = 10; else if (0) return a; else if (a) return b; else return 10;"
173+
148174# compound
149175items 5 " { return 5; }"
150176items 10 " { int a; a = 5; { a = 5 + a; } return a; }"
@@ -197,6 +223,21 @@ int main() {
197223}
198224EOF
199225
226+ try_ 55 << EOF
227+ int fib(int n, int a, int b)
228+ {
229+ if (n == 0)
230+ return a;
231+ else if (n == 1)
232+ return b;
233+ return fib(n - 1, b, a + b);
234+ }
235+
236+ int main() {
237+ return fib(012, 0, 1); /* octal(12) = dec(10) */
238+ }
239+ EOF
240+
200241try_ 1 << EOF
201242int is_odd(int x);
202243
@@ -656,6 +697,15 @@ int main()
656697}
657698EOF
658699
700+ # octal(155) = dec(109), expect same output with above test suite
701+ try_output 0 " 12 -1" << EOF
702+ int main()
703+ {
704+ printf("%d %d", -0155 / -9, -0155 % -9);
705+ return 0;
706+ }
707+ EOF
708+
659709try_output 0 " 1365 0" << EOF
660710int main()
661711{
0 commit comments