Backport from sid to buster
[hcoop/debian/mlton.git] / regression / flexrecord.sml
1 (* flexrecord.sml *)
2
3 (* Checks type inference for flexible records. *)
4
5 (* flexrecord1 *)
6 fun f(r as {...}) =
7 let
8 fun g() = r
9 in
10 [r, {a=1}]
11 end;
12 (* flexrecord1 *)
13
14 (* flexrecord2 *)
15 val _ =
16 let
17 val g = #foo
18 val _ = g {foo = 13}
19 val _ = g {foo = "yes"}
20 in
21 ()
22 end
23 (* flexrecord2 *)
24
25 (* flexrecord3 *)
26 val _ =
27 let
28 val g = #foo
29 val _ = g {foo = 13, goo = 1.0}
30 val _ = g {foo = "yes", goo = 1.0}
31 in
32 ()
33 end
34 (* flexrecord3 *)
35
36 (* flexrecord4 *)
37 val _ =
38 let
39 val g = #foo
40 val _ = g {foo = 13, goo = 1.0}
41 val _ = g {foo = "yes", goo = false}
42 in
43 ()
44 end
45 (* flexrecord4 *)
46
47 (* flexrecord5 *)
48 val _ =
49 let
50 val f = #foo
51 val g = fn h => fn y => h (f y)
52 val h = fn x => f x
53 val _ = f {foo=0, bar=1}
54 in
55 ()
56 end
57 (* flexrecord5 *)
58
59 (* flexrecord6 *)
60 val _ =
61 fn x =>
62 let
63 val _: string = #1 x
64 fun id z = z
65 fun g () =
66 let
67 val (_, a) = x
68 in a
69 end
70 in
71 g ()
72 end
73 (* flexrecord6 *)
74
75 (* flexrecord7 *)
76 val _ =
77 let
78 fun f r = { a = #a r, b = #b r }
79 val _ = f { a = 0.0, b = 0.0 }
80 in
81 ()
82 end
83 (* flexrecord7 *)
84
85 (* flexrecord8 *)
86 val _ =
87 fn _ =>
88 let
89 val f = #foo
90 val g = (fn x => x) f
91 val _ = f {foo=0, bar=1}
92 in
93 ()
94 end
95 (* flexrecord8 *)
96
97 (* flexrecord9 *)
98 val g = fn {...} => ()
99 and h = fn () => ()
100 val () = (h (); g {a = 13})
101 (* flexrecord9 *)