@@ -33,6 +33,25 @@ module Hidden_int : sig type t : immediate val hide : int -> t end
33
33
module Hidden_float_u : sig type t : float64 val hide : float # -> t end
34
34
| }]
35
35
36
+ module Immediate : sig
37
+ val id : ('a : immediate ). 'a -> 'a
38
+ val ignore : ('a : immediate ). 'a -> unit
39
+ val unique : ('a : immediate ). unique_ 'a -> 'a
40
+ end = struct
41
+ let id x = x
42
+ let ignore _ = ()
43
+ let unique (unique_ x ) = x
44
+ end
45
+
46
+ [%% expect{|
47
+ module Immediate :
48
+ sig
49
+ val id : ('a : immediate ). 'a -> 'a
50
+ val ignore : ('a : immediate ). 'a -> unit
51
+ val unique : ('a : immediate ). unique_ 'a -> 'a
52
+ end
53
+ | }]
54
+
36
55
module Float_u : sig
37
56
val id : ('a : float64 ). 'a -> 'a
38
57
val ignore : ('a : float64 ). 'a -> unit
@@ -141,24 +160,17 @@ Line 1, characters 50-51:
141
160
Error : This value escapes its region
142
161
| }]
143
162
144
- let float_u_escape = let local_ x : float# = #3.14 in x
163
+ let float_u_escape () = let local_ x : float# = #3.14 in x
145
164
146
- (* CR layouts v2.8: this should succeed *)
147
165
[%% expect{|
148
- Line 1 , characters 54-55 :
149
- 1 | let float_u_escape = let local_ x : float# = #3.14 in x
150
- ^
151
- Error : This value escapes its region
166
+ val float_u_escape : unit -> float # = < fun>
152
167
|}]
153
168
154
- let hidden_float_u_escape =
169
+ let hidden_float_u_escape () =
155
170
let local_ x : Hidden_float_u.t = Hidden_float_u. hide #3.14 in x
156
171
157
172
[%% expect{|
158
- Line 2 , characters 65-66 :
159
- 2 | let local_ x : Hidden_float_u.t = Hidden_float_u. hide #3.14 in x
160
- ^
161
- Error : This value escapes its region
173
+ val hidden_float_u_escape : unit -> Hidden_float_u .t = < fun>
162
174
|}]
163
175
164
176
let float_u_record_escape =
@@ -188,13 +200,9 @@ let foo () =
188
200
(* [r.x] is allocated global and can escape. *)
189
201
r.x
190
202
191
- (* CR layouts v2.8: this should succeed *)
192
203
[%% expect{|
193
204
type r = { x : float ; y : float ; }
194
- Line 6 , characters 2-5 :
195
- 6 | r .x
196
- ^^^
197
- Error : This value escapes its region
205
+ val foo : unit -> float = < fun>
198
206
|}]
199
207
200
208
let function_escape = let local_ x : int -> int = fun y -> y in x
@@ -304,24 +312,17 @@ Line 1, characters 59-60:
304
312
Error : Found a once value where a many value was expected
305
313
| }]
306
314
307
- let float_u_duplicate = let once_ x : float# = #3.14 in Float_u. id x
315
+ let float_u_duplicate () = let once_ x : float# = #3.14 in Float_u. id x
308
316
309
- (* CR layouts v2.8: this should succeed *)
310
317
[%% expect{|
311
- Line 1 , characters 67-68 :
312
- 1 | let float_u_duplicate = let once_ x : float# = #3.14 in Float_u. id x
313
- ^
314
- Error : Found a once value where a many value was expected
318
+ val float_u_duplicate : unit -> float # = < fun>
315
319
|}]
316
320
317
- let hidden_float_u_duplicate =
321
+ let hidden_float_u_duplicate () =
318
322
let once_ x : Hidden_float_u.t = Hidden_float_u. hide #3.14 in Float_u. id x
319
323
320
324
[%% expect{|
321
- Line 2 , characters 75-76 :
322
- 2 | let once_ x : Hidden_float_u.t = Hidden_float_u. hide #3.14 in Float_u. id x
323
- ^
324
- Error : Found a once value where a many value was expected
325
+ val hidden_float_u_duplicate : unit -> Hidden_float_u .t = < fun>
325
326
|}]
326
327
327
328
let float_u_record_duplicate =
@@ -493,29 +494,50 @@ Line 1, characters 51-52:
493
494
494
495
| }]
495
496
496
- let float_u_unshare = let x : float# = #3.14 in Float_u. ignore x; Float_u. unique x
497
+ (* CR layouts v2.8: The following should pass, even in principal mode, because the
498
+ argument kind is known to cross mode. *)
499
+
500
+ let float_u_unshare () = let x : float# = #3.14 in Float_u. ignore x; Float_u. unique x
497
501
498
- (* CR layouts v2.8: this should succeed *)
499
502
[%% expect{|
500
- Line 1 , characters 81-82 :
501
- 1 | let float_u_unshare = let x : float# = #3.14 in Float_u. ignore x; Float_u. unique x
502
- ^
503
+ val float_u_unshare : unit -> float # = < fun>
504
+ |}, Principal {|
505
+ Line 1 , characters 84-85 :
506
+ 1 | let float_u_unshare () = let x : float# = #3.14 in Float_u. ignore x; Float_u. unique x
507
+ ^
503
508
Error : This value is used here as unique, but it has already been used :
504
- Line 1 , characters 63-64 :
505
- 1 | let float_u_unshare = let x : float # = #3.14 in Float_u .ignore x ; Float_u. unique x
506
- ^
509
+ Line 1 , characters 66-67 :
510
+ 1 | let float_u_unshare () = let x : float # = #3.14 in Float_u .ignore x ; Float_u. unique x
511
+ ^
512
+
513
+ | }]
507
514
515
+ let imm_escape () = Immediate. id (local_ 42 ) [@ nontail]
516
+
517
+ [%% expect{|
518
+ val imm_escape : unit -> int = < fun>
519
+ |}, Principal {|
520
+ Line 1 , characters 33-44 :
521
+ 1 | let imm_escape () = Immediate. id (local_ 42 ) [@ nontail]
522
+ ^^^^^^^^^^^
523
+ Error : This value escapes its region
508
524
| }]
509
525
510
- let hidden_float_u_unshare =
526
+ let hidden_float_u_unshare () =
511
527
let x : Hidden_float_u.t = Hidden_float_u. hide #3.14 in
512
528
Float_u. ignore x; Float_u. unique x
513
529
514
530
[%% expect{|
531
+ val hidden_float_u_unshare : unit -> Hidden_float_u .t = < fun>
532
+ |}, Principal {|
515
533
Line 3 , characters 35-36 :
516
534
3 | Float_u. ignore x; Float_u. unique x
517
535
^
518
- Error : Found a shared value where a unique value was expected
536
+ Error : This value is used here as unique, but it has already been used :
537
+ Line 3 , characters 17-18 :
538
+ 3 | Float_u .ignore x ; Float_u. unique x
539
+ ^
540
+
519
541
| }]
520
542
521
543
let float_u_record_unshare =
0 commit comments