@@ -224,6 +224,20 @@ fn multi_lifetime_covariant_struct() {
224
224
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
225
225
]}"
226
226
}
227
+ goal {
228
+ forall<' a, ' b> {
229
+ exists<U > {
230
+ Subtype ( Foo <U >, Foo <& ' a u32 >) ,
231
+ Subtype ( Foo <U >, Foo <& ' b u32 >)
232
+ }
233
+ }
234
+ } yields {
235
+ // Result should be identical to multi_lifetime result.
236
+ "Unique; for<?U1> { substitution [?0 := (&'^0.0 Uint(U32))], lifetime constraints [\
237
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
238
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
239
+ ]}"
240
+ }
227
241
}
228
242
}
229
243
@@ -250,6 +264,20 @@ fn multi_lifetime_contravariant_struct() {
250
264
InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
251
265
]}"
252
266
}
267
+ goal {
268
+ forall<' a, ' b> {
269
+ exists<U > {
270
+ Subtype ( Foo <U >, Foo <& ' a u32 >) ,
271
+ Subtype ( Foo <U >, Foo <& ' b u32 >)
272
+ }
273
+ }
274
+ } yields {
275
+ // Result should be opposite multi_lifetime result.
276
+ "Unique; for<?U1> { substitution [?0 := (&'^0.0 Uint(U32))], lifetime constraints [\
277
+ InEnvironment { environment: Env([]), goal: '!1_0: '^0.0 }, \
278
+ InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
279
+ ]}"
280
+ }
253
281
}
254
282
}
255
283
@@ -282,6 +310,27 @@ fn multi_lifetime_invariant_struct() {
282
310
InEnvironment { environment: Env([]), goal: '!1_1: '!1_0 } \
283
311
]"
284
312
}
313
+
314
+ goal {
315
+ forall<' a, ' b> {
316
+ exists<U > {
317
+ Subtype ( Foo <U >, Foo <& ' a u32 >) ,
318
+ Subtype ( Foo <U >, Foo <& ' b u32 >)
319
+ }
320
+ }
321
+ } yields[ SolverChoice :: recursive( ) ] {
322
+ // Because A is invariant, we require the lifetimes to be equal
323
+ "Unique; substitution [?0 := (&'!1_0 Uint(U32))], lifetime constraints [\
324
+ InEnvironment { environment: Env([]), goal: '!1_0: '!1_1 }, \
325
+ InEnvironment { environment: Env([]), goal: '!1_1: '!1_0 } \
326
+ ]"
327
+ } yields[ SolverChoice :: slg_default( ) ] {
328
+ // Because A is invariant, we require the lifetimes to be equal
329
+ "Unique; substitution [?0 := (&'!1_1 Uint(U32))], lifetime constraints [\
330
+ InEnvironment { environment: Env([]), goal: '!1_0: '!1_1 }, \
331
+ InEnvironment { environment: Env([]), goal: '!1_1: '!1_0 } \
332
+ ]"
333
+ }
285
334
}
286
335
}
287
336
@@ -306,6 +355,20 @@ fn multi_lifetime_slice() {
306
355
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
307
356
]}"
308
357
}
358
+ goal {
359
+ forall<' a, ' b> {
360
+ exists<U > {
361
+ Subtype ( [ U ] , [ & ' a u32 ] ) ,
362
+ Subtype ( [ U ] , [ & ' b u32 ] )
363
+ }
364
+ }
365
+ } yields {
366
+ // Result should be identical to multi_lifetime result.
367
+ "Unique; for<?U1> { substitution [?0 := (&'^0.0 Uint(U32))], lifetime constraints [\
368
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
369
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
370
+ ]}"
371
+ }
309
372
}
310
373
}
311
374
@@ -330,6 +393,20 @@ fn multi_lifetime_tuple() {
330
393
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
331
394
]}"
332
395
}
396
+ goal {
397
+ forall<' a, ' b> {
398
+ exists<U > {
399
+ Subtype ( ( U , ) , ( & ' a u32 , ) ) ,
400
+ Subtype ( ( U , ) , ( & ' b u32 , ) )
401
+ }
402
+ }
403
+ } yields {
404
+ // Result should be identical to multi_lifetime result.
405
+ "Unique; for<?U1> { substitution [?0 := (&'^0.0 Uint(U32))], lifetime constraints [\
406
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
407
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
408
+ ]}"
409
+ }
333
410
}
334
411
}
335
412
@@ -354,6 +431,20 @@ fn multi_lifetime_array() {
354
431
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
355
432
]}"
356
433
}
434
+ goal {
435
+ forall<' a, ' b> {
436
+ exists<U > {
437
+ Subtype ( [ U ; 16 ] , [ & ' a u32 ; 16 ] ) ,
438
+ Subtype ( [ U ; 16 ] , [ & ' b u32 ; 16 ] )
439
+ }
440
+ }
441
+ } yields {
442
+ // Result should be identical to multi_lifetime result.
443
+ "Unique; for<?U1> { substitution [?0 := (&'^0.0 Uint(U32))], lifetime constraints [\
444
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
445
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
446
+ ]}"
447
+ }
357
448
}
358
449
}
359
450
@@ -460,6 +551,20 @@ fn generalize_slice() {
460
551
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
461
552
] }"
462
553
}
554
+ goal {
555
+ forall<' a, ' b> {
556
+ exists<U > {
557
+ Subtype ( U , [ & ' a u32 ] ) ,
558
+ Subtype ( U , [ & ' b u32 ] )
559
+ }
560
+ }
561
+ } yields {
562
+ // Result should be identical to generalize_covariant_struct result.
563
+ "Unique; for<?U1> { substitution [?0 := [(&'^0.0 Uint(U32))]], lifetime constraints [\
564
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
565
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
566
+ ] }"
567
+ }
463
568
}
464
569
}
465
570
@@ -484,6 +589,20 @@ fn generalize_tuple() {
484
589
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
485
590
] }"
486
591
}
592
+ goal {
593
+ forall<' a, ' b> {
594
+ exists<U > {
595
+ Subtype ( U , ( & ' a u32 , ) ) ,
596
+ Subtype ( U , ( & ' b u32 , ) )
597
+ }
598
+ }
599
+ } yields {
600
+ // Result should be identical to generalize_covariant_struct result.
601
+ "Unique; for<?U1> { substitution [?0 := 1<(&'^0.0 Uint(U32))>], lifetime constraints [\
602
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
603
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
604
+ ] }"
605
+ }
487
606
}
488
607
}
489
608
@@ -509,6 +628,21 @@ fn generalize_2tuple() {
509
628
InEnvironment { environment: Env([]), goal: '!1_3: '^0.1 } \
510
629
] }"
511
630
}
631
+ goal {
632
+ forall<' a, ' b, ' c, ' d> {
633
+ exists<U > {
634
+ Subtype ( U , ( & ' a u32 , & ' c u32 ) ) ,
635
+ Subtype ( U , ( & ' b u32 , & ' d u32 ) )
636
+ }
637
+ }
638
+ } yields {
639
+ "Unique; for<?U1, ?U1> { substitution [?0 := 2<(&'^0.0 Uint(U32)), (&'^0.1 Uint(U32))>], lifetime constraints [\
640
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
641
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 }, \
642
+ InEnvironment { environment: Env([]), goal: '^0.1: '!1_2 }, \
643
+ InEnvironment { environment: Env([]), goal: '^0.1: '!1_3 } \
644
+ ] }"
645
+ }
512
646
}
513
647
}
514
648
@@ -533,5 +667,20 @@ fn generalize_array() {
533
667
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 } \
534
668
] }"
535
669
}
670
+
671
+ goal {
672
+ forall<' a, ' b> {
673
+ exists<U > {
674
+ Subtype ( U , [ & ' a u32 ; 16 ] ) ,
675
+ Subtype ( U , [ & ' b u32 ; 16 ] )
676
+ }
677
+ }
678
+ } yields {
679
+ // Result should be identical to generalize_covariant_struct result.
680
+ "Unique; for<?U1> { substitution [?0 := [(&'^0.0 Uint(U32)); 16]], lifetime constraints [\
681
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_0 }, \
682
+ InEnvironment { environment: Env([]), goal: '^0.0: '!1_1 } \
683
+ ] }"
684
+ }
536
685
}
537
686
}
0 commit comments