% Type-correct tests for all syntactic constructs

1:int;;
true:bool;;
if true:bool then 1 else 2:int;;
if false:bool then 1 else 2:int;;
1=2;;
1<2;;
1+2;;
1-2;;
1*2;;
~1;;
1 mod 2;;
sqrt 1.0;;
1.0+.2.0;;
1.0*.2.0;;
fun f(x) is if x then 1 else f x:bool->int;;
(fun f(x) is if x=0 then 1 else x*f(x-1):int->int) 4;;
let x = 1:int in x+2:int;;
let x = 1:int in let x = 2:int in x:int;;
(fun f(x) is if x then 1 else f x:bool->int) true;;
():1;;
(1,true,in1 1,fun f(x) is x+1:int*bool*(int+bool)*(int->int));;
(1,true,in1 1,fun f(x) is x+1:int*bool*(int+bool)*(int->int)).1+2;;
if (1,true,in1 1,fun f(x) is x+1:int*bool*(int+bool)*(int->int)).2 then 3 else 4:int;;
case (1,true,in1 1,fun f(x) is x+1:int*bool*(int+bool)*(int->int)).3
  of in1 x => x+2 | in2 x => fail:int;;
(1,true,in1 1,fun f(x) is x+1:int*bool*(int+bool)*(int->int)).4 2;;
fun f(x) is abort x:0->int;;
in1 1:int+bool+(int->int);;
in2 true:int+bool+(int->int);;
in3 fun f(x) is x+1:int+bool+(int->int);;
case in1 1:int+bool of in1 x => x+2 | in2 y => if y then 3 else 4:int;;
case in2 true:int+bool of in1 x => x+2 | in2 y => if y then 3 else fail:int;;
case in3 fun f(x) is x+1:int+bool+(int->int) of in1 x => fail | in2 x => fail | in3 f => f 2:int;;
1+(letcc k in 2);;
1+(letcc k in if throw 2 to k:bool then 3 else 4);;
(try 1 ow 2)+3;;
1+try 2+fail ow 42;;
let type a = int*int in (1,2:a).1 : int;;
let x=1:int in let type a=int*int in let y=2:int in x+y+3:int;;
itof (1:int):float;;
ref 1:int ref;;
!(ref 1:int ref);;
let r=ref 1:int ref in !r, r:=2, !r+3:int*int*int;;
let r=ref 1:int ref in !r; r:=2; !r+3:int;;
gen a in fun f(x) is x : !a a -> a;;
(gen a in fun f(x) is x : !a a -> a)[int];;
pack int, 1, 2 : ?a a * a;;
unpack a, x = (pack int, 1, 2 : ?a a * int) in x.2:int;;
