@@ -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