@@ -365,6 +365,25 @@ func testTuples2() {
365
365
sink ( arg: c)
366
366
}
367
367
368
+ func tupleShiftLeft1( _ t: ( Int , Int ) ) -> ( Int , Int ) {
369
+ return ( t. 1 , 0 )
370
+ }
371
+
372
+ func tupleShiftLeft2( _ t: ( Int , Int ) ) -> ( Int , Int ) { return ( 0 , 0 ) } // modelled flow
373
+
374
+ func testTuples3( ) {
375
+ let t1 = ( 1 , source ( ) )
376
+ let t2 = tupleShiftLeft1 ( t1)
377
+ let t3 = tupleShiftLeft2 ( t1)
378
+
379
+ sink ( arg: t1. 0 )
380
+ sink ( arg: t1. 1 ) // $ flow=375
381
+ sink ( arg: t2. 0 ) // $ flow=375
382
+ sink ( arg: t2. 1 )
383
+ sink ( arg: t3. 0 ) // $ flow=375
384
+ sink ( arg: t3. 1 )
385
+ }
386
+
368
387
indirect enum MyEnum {
369
388
case myNone
370
389
case mySingle( Int )
@@ -406,7 +425,7 @@ func testEnums() {
406
425
case . myNone:
407
426
( )
408
427
case . mySingle( let a) :
409
- sink ( arg: a) // $ flow=403
428
+ sink ( arg: a) // $ flow=422
410
429
case . myPair( let a, let b) :
411
430
sink ( arg: a)
412
431
sink ( arg: b)
@@ -415,7 +434,7 @@ func testEnums() {
415
434
}
416
435
417
436
if case . mySingle( let x) = a {
418
- sink ( arg: x) // $ flow=403
437
+ sink ( arg: x) // $ flow=422
419
438
}
420
439
if case . myPair( let x, let y) = a {
421
440
sink ( arg: x)
@@ -431,7 +450,7 @@ func testEnums() {
431
450
sink ( arg: a)
432
451
case . myPair( let a, let b) :
433
452
sink ( arg: a)
434
- sink ( arg: b) // $ flow=425
453
+ sink ( arg: b) // $ flow=444
435
454
case let . myCons( a, _) :
436
455
sink ( arg: a)
437
456
}
@@ -441,7 +460,7 @@ func testEnums() {
441
460
}
442
461
if case . myPair( let x, let y) = a {
443
462
sink ( arg: x)
444
- sink ( arg: y) // $ flow=425
463
+ sink ( arg: y) // $ flow=444
445
464
}
446
465
447
466
let b : MyEnum = . myCons( 42 , a)
@@ -457,7 +476,7 @@ func testEnums() {
457
476
case let . myCons( a, . myPair( b, c) ) :
458
477
sink ( arg: a)
459
478
sink ( arg: b)
460
- sink ( arg: c) // $ flow=425
479
+ sink ( arg: c) // $ flow=444
461
480
case let . myCons( a, _) :
462
481
sink ( arg: a)
463
482
}
@@ -466,20 +485,20 @@ func testEnums() {
466
485
sink ( arg: x)
467
486
}
468
487
if case MyEnum . myPair( let x, let y) = . myPair( source ( ) , 0 ) {
469
- sink ( arg: x) // $ flow=468
488
+ sink ( arg: x) // $ flow=487
470
489
sink ( arg: y)
471
490
}
472
491
if case let . myCons( _, . myPair( _, c) ) = b {
473
- sink ( arg: c) // $ flow=425
492
+ sink ( arg: c) // $ flow=444
474
493
}
475
494
476
495
switch ( a, b) {
477
496
case let ( . myPair( a, b) , . myCons( c, . myPair( d, e) ) ) :
478
497
sink ( arg: a)
479
- sink ( arg: b) // $ flow=425
498
+ sink ( arg: b) // $ flow=444
480
499
sink ( arg: c)
481
500
sink ( arg: d)
482
- sink ( arg: e) // $ flow=425
501
+ sink ( arg: e) // $ flow=444
483
502
default :
484
503
( )
485
504
}
@@ -491,11 +510,11 @@ func testEnums() {
491
510
let c5 = mkMyEnum2 ( 0 )
492
511
let c6 = mkMyEnum2 ( source ( ) )
493
512
if case MyEnum . mySingle( let d1) = c1 { sink ( arg: d1) }
494
- if case MyEnum . mySingle( let d2) = c2 { sink ( arg: d2) } // $ flow=488
513
+ if case MyEnum . mySingle( let d2) = c2 { sink ( arg: d2) } // $ flow=507
495
514
if case MyEnum . mySingle( let d3) = c3 { sink ( arg: d3) }
496
- if case MyEnum . mySingle( let d4) = c4 { sink ( arg: d4) } // $ flow=490
515
+ if case MyEnum . mySingle( let d4) = c4 { sink ( arg: d4) } // $ flow=509
497
516
if case MyEnum . mySingle( let d5) = c5 { sink ( arg: d5) }
498
- if case MyEnum . mySingle( let d6) = c6 { sink ( arg: d6) } // $ flow=492
517
+ if case MyEnum . mySingle( let d6) = c6 { sink ( arg: d6) } // $ flow=511
499
518
500
519
let e1 = Optional . some ( 0 )
501
520
let e2 = Optional . some ( source ( ) )
@@ -504,11 +523,11 @@ func testEnums() {
504
523
let e5 = mkOptional2 ( 0 )
505
524
let e6 = mkOptional2 ( source ( ) )
506
525
sink ( arg: e1!)
507
- sink ( arg: e2!) // $ flow=501
526
+ sink ( arg: e2!) // $ flow=520
508
527
sink ( arg: e3!)
509
- sink ( arg: e4!) // $ flow=503
528
+ sink ( arg: e4!) // $ flow=522
510
529
sink ( arg: e5!)
511
- sink ( arg: e6!) // $ flow=505
530
+ sink ( arg: e6!) // $ flow=524
512
531
}
513
532
514
533
func source2( ) -> ( Int , Int ) ? { return nil }
@@ -554,8 +573,8 @@ func testOptionalPropertyAccess(y: Int?) {
554
573
}
555
574
556
575
func testIdentityArithmetic( ) {
557
- sink ( arg: + source( ) ) // $ flow=557
558
- sink ( arg: ( source ( ) ) ) // $ flow=558
576
+ sink ( arg: + source( ) ) // $ flow=576
577
+ sink ( arg: ( source ( ) ) ) // $ flow=577
559
578
}
560
579
561
580
func sink( str: String ) { }
@@ -572,13 +591,13 @@ class MyClass {
572
591
extension MyClass {
573
592
convenience init ( contentsOfFile: String ) {
574
593
self . init ( s: source3 ( ) )
575
- sink ( str: str) // $ flow=574
594
+ sink ( str: str) // $ flow=593
576
595
}
577
596
}
578
597
579
598
func extensionInits( path: String ) {
580
- sink ( str: MyClass ( s: source3 ( ) ) . str) // $ flow=580
581
- sink ( str: MyClass ( contentsOfFile: path) . str) // $ flow=574
599
+ sink ( str: MyClass ( s: source3 ( ) ) . str) // $ flow=599
600
+ sink ( str: MyClass ( contentsOfFile: path) . str) // $ flow=593
582
601
}
583
602
584
603
class InoutConstructorClass {
@@ -603,10 +622,10 @@ struct S {
603
622
func testKeyPath( ) {
604
623
let s = S ( x: source ( ) )
605
624
let f = \S . x
606
- sink ( arg: s [ keyPath: f] ) // $ flow=604
625
+ sink ( arg: s [ keyPath: f] ) // $ flow=623
607
626
608
627
let inferred : KeyPath < S , Int > = \. x
609
- sink ( arg: s [ keyPath: inferred] ) // $ flow=604
628
+ sink ( arg: s [ keyPath: inferred] ) // $ flow=623
610
629
}
611
630
612
631
struct S2 {
@@ -621,13 +640,13 @@ func testNestedKeyPath() {
621
640
let s = S ( x: source ( ) )
622
641
let s2 = S2 ( s: s)
623
642
let f = \S2 . s. x
624
- sink ( arg: s2 [ keyPath: f] ) // $ flow=621
643
+ sink ( arg: s2 [ keyPath: f] ) // $ flow=640
625
644
}
626
645
627
646
func testArrayKeyPath( ) {
628
647
let array = [ source ( ) ]
629
648
let f = \[ Int ] . [ 0 ]
630
- sink ( arg: array [ keyPath: f] ) // $ flow=628
649
+ sink ( arg: array [ keyPath: f] ) // $ flow=647
631
650
}
632
651
633
652
struct S2_Optional {
@@ -642,7 +661,7 @@ func testOptionalKeyPath() {
642
661
let s = S ( x: source ( ) )
643
662
let s2 = S2_Optional ( s: s)
644
663
let f = \S2_Optional . s? . x
645
- sink ( opt: s2 [ keyPath: f] ) // $ MISSING: flow=642
664
+ sink ( opt: s2 [ keyPath: f] ) // $ MISSING: flow=661
646
665
}
647
666
648
667
func testSwap( ) {
@@ -654,57 +673,57 @@ func testSwap() {
654
673
x = y
655
674
y = t
656
675
sink ( arg: x)
657
- sink ( arg: y) // $ flow=649
676
+ sink ( arg: y) // $ flow=668
658
677
659
678
x = source ( )
660
679
y = 0
661
680
swap ( & x, & y)
662
- sink ( arg: x) // $ SPURIOUS: flow=659
663
- sink ( arg: y) // $ flow=659
681
+ sink ( arg: x) // $ SPURIOUS: flow=678
682
+ sink ( arg: y) // $ flow=678
664
683
}
665
684
666
685
func testArray( ) {
667
686
var arr1 = [ 1 , 2 , 3 ]
668
687
sink ( arg: arr1 [ 0 ] )
669
688
arr1 [ 1 ] = source ( )
670
- sink ( arg: arr1 [ 0 ] ) // $ flow=669
689
+ sink ( arg: arr1 [ 0 ] ) // $ flow=688
671
690
sink ( arg: arr1)
672
691
673
692
var arr2 = [ source ( ) ]
674
- sink ( arg: arr2 [ 0 ] ) // $ flow=673
693
+ sink ( arg: arr2 [ 0 ] ) // $ flow=692
675
694
676
695
var matrix = [ [ source ( ) ] ]
677
696
sink ( arg: matrix [ 0 ] )
678
- sink ( arg: matrix [ 0 ] [ 0 ] ) // $ flow=676
697
+ sink ( arg: matrix [ 0 ] [ 0 ] ) // $ flow=695
679
698
680
699
var matrix2 = [ [ 1 ] ]
681
700
matrix2 [ 0 ] [ 0 ] = source ( )
682
- sink ( arg: matrix2 [ 0 ] [ 0 ] ) // $ flow=681
701
+ sink ( arg: matrix2 [ 0 ] [ 0 ] ) // $ flow=700
683
702
684
703
var arr3 = [ 1 ]
685
704
var arr4 = arr2 + arr3
686
705
sink ( arg: arr3 [ 0 ] )
687
- sink ( arg: arr4 [ 0 ] ) // $ MISSING: flow=673
706
+ sink ( arg: arr4 [ 0 ] ) // $ MISSING: flow=692
688
707
689
708
var arr5 = Array ( repeating: source ( ) , count: 2 )
690
- sink ( arg: arr5 [ 0 ] ) // $ MISSING: flow=689
709
+ sink ( arg: arr5 [ 0 ] ) // $ MISSING: flow=708
691
710
692
711
var arr6 = [ 1 , 2 , 3 ]
693
712
arr6. insert ( source ( ) , at: 2 )
694
- sink ( arg: arr6 [ 0 ] ) // $ flow=693
713
+ sink ( arg: arr6 [ 0 ] ) // $ flow=712
695
714
696
715
var arr7 = [ source ( ) ]
697
- sink ( arg: arr7. randomElement ( ) !) // $ flow=696
716
+ sink ( arg: arr7. randomElement ( ) !) // $ flow=715
698
717
}
699
718
700
719
func testSetCollections( ) {
701
720
var set1 : Set = [ 1 , 2 , 3 ]
702
721
sink ( arg: set1. randomElement ( ) !)
703
722
set1. insert ( source ( ) )
704
- sink ( arg: set1. randomElement ( ) !) // $flow=703
723
+ sink ( arg: set1. randomElement ( ) !) // $ flow=722
705
724
706
725
let set2 = Set ( [ source ( ) ] )
707
- sink ( arg: set2. randomElement ( ) !) // $ flow=706
726
+ sink ( arg: set2. randomElement ( ) !) // $ flow=725
708
727
}
709
728
710
729
struct MyOptionals {
@@ -730,13 +749,13 @@ func testWriteOptional() {
730
749
mo2!. v2 = source ( )
731
750
mo2!. v3 = source ( )
732
751
733
- sink ( arg: v1!) // $ flow=723
734
- sink ( arg: v2!) // $ flow=724
735
- sink ( arg: v3) // $ flow=725
736
- sink ( arg: mo1. v1!) // $ MISSING:flow=726
737
- sink ( arg: mo1. v2!) // $ flow=727
738
- sink ( arg: mo1. v3) // $ flow=728
739
- sink ( arg: mo2!. v1!) // $ MISSING:flow=729
740
- sink ( arg: mo2!. v2!) // $ MISSING:flow=730
741
- sink ( arg: mo2!. v3) // $ MISSING:flow=731
752
+ sink ( arg: v1!) // $ flow=742
753
+ sink ( arg: v2!) // $ flow=743
754
+ sink ( arg: v3) // $ flow=744
755
+ sink ( arg: mo1. v1!) // $ MISSING:flow=745
756
+ sink ( arg: mo1. v2!) // $ flow=746
757
+ sink ( arg: mo1. v3) // $ flow=747
758
+ sink ( arg: mo2!. v1!) // $ MISSING:flow=748
759
+ sink ( arg: mo2!. v2!) // $ MISSING:flow=749
760
+ sink ( arg: mo2!. v3) // $ MISSING:flow=750
742
761
}
0 commit comments