@@ -372,6 +372,11 @@ indirect enum MyEnum {
372372 case myCons( Int , MyEnum )
373373}
374374
375+ func mkMyEnum1( _ v: Int ) -> MyEnum { return MyEnum . mySingle ( v) }
376+ func mkMyEnum2( _ v: Int ) -> MyEnum { return MyEnum . myNone } // modelled flow
377+ func mkOptional1( _ v: Int ) -> Int ? { return Optional . some ( v) }
378+ func mkOptional2( _ v: Int ) -> Int ? { return nil } // modelled flow
379+
375380func testEnums( ) {
376381 var a : MyEnum = . myNone
377382
@@ -401,7 +406,7 @@ func testEnums() {
401406 case . myNone:
402407 ( )
403408 case . mySingle( let a) :
404- sink ( arg: a) // $ flow=398
409+ sink ( arg: a) // $ flow=403
405410 case . myPair( let a, let b) :
406411 sink ( arg: a)
407412 sink ( arg: b)
@@ -410,7 +415,7 @@ func testEnums() {
410415 }
411416
412417 if case . mySingle( let x) = a {
413- sink ( arg: x) // $ flow=398
418+ sink ( arg: x) // $ flow=403
414419 }
415420 if case . myPair( let x, let y) = a {
416421 sink ( arg: x)
@@ -426,7 +431,7 @@ func testEnums() {
426431 sink ( arg: a)
427432 case . myPair( let a, let b) :
428433 sink ( arg: a)
429- sink ( arg: b) // $ flow=420
434+ sink ( arg: b) // $ flow=425
430435 case let . myCons( a, _) :
431436 sink ( arg: a)
432437 }
@@ -436,7 +441,7 @@ func testEnums() {
436441 }
437442 if case . myPair( let x, let y) = a {
438443 sink ( arg: x)
439- sink ( arg: y) // $ flow=420
444+ sink ( arg: y) // $ flow=425
440445 }
441446
442447 let b : MyEnum = . myCons( 42 , a)
@@ -452,7 +457,7 @@ func testEnums() {
452457 case let . myCons( a, . myPair( b, c) ) :
453458 sink ( arg: a)
454459 sink ( arg: b)
455- sink ( arg: c) // $ flow=420
460+ sink ( arg: c) // $ flow=425
456461 case let . myCons( a, _) :
457462 sink ( arg: a)
458463 }
@@ -461,23 +466,49 @@ func testEnums() {
461466 sink ( arg: x)
462467 }
463468 if case MyEnum . myPair( let x, let y) = . myPair( source ( ) , 0 ) {
464- sink ( arg: x) // $ flow=463
469+ sink ( arg: x) // $ flow=468
465470 sink ( arg: y)
466471 }
467472 if case let . myCons( _, . myPair( _, c) ) = b {
468- sink ( arg: c) // $ flow=420
473+ sink ( arg: c) // $ flow=425
469474 }
470475
471476 switch ( a, b) {
472477 case let ( . myPair( a, b) , . myCons( c, . myPair( d, e) ) ) :
473478 sink ( arg: a)
474- sink ( arg: b) // $ flow=420
479+ sink ( arg: b) // $ flow=425
475480 sink ( arg: c)
476481 sink ( arg: d)
477- sink ( arg: e) // $ flow=420
482+ sink ( arg: e) // $ flow=425
478483 default :
479484 ( )
480485 }
486+
487+ let c1 = MyEnum . mySingle ( 0 )
488+ let c2 = MyEnum . mySingle ( source ( ) )
489+ let c3 = mkMyEnum1 ( 0 )
490+ let c4 = mkMyEnum1 ( source ( ) )
491+ let c5 = mkMyEnum2 ( 0 )
492+ let c6 = mkMyEnum2 ( source ( ) )
493+ if case MyEnum . mySingle( let d1) = c1 { sink ( arg: d1) }
494+ if case MyEnum . mySingle( let d2) = c2 { sink ( arg: d2) } // $ flow=488
495+ if case MyEnum . mySingle( let d3) = c3 { sink ( arg: d3) }
496+ if case MyEnum . mySingle( let d4) = c4 { sink ( arg: d4) } // $ flow=490
497+ if case MyEnum . mySingle( let d5) = c5 { sink ( arg: d5) }
498+ if case MyEnum . mySingle( let d6) = c6 { sink ( arg: d6) } // $ flow=492
499+
500+ let e1 = Optional . some ( 0 )
501+ let e2 = Optional . some ( source ( ) )
502+ let e3 = mkOptional1 ( 0 )
503+ let e4 = mkOptional1 ( source ( ) )
504+ let e5 = mkOptional2 ( 0 )
505+ let e6 = mkOptional2 ( source ( ) )
506+ sink ( arg: e1!)
507+ sink ( arg: e2!) // $ flow=501
508+ sink ( arg: e3!)
509+ sink ( arg: e4!) // $ flow=503
510+ sink ( arg: e5!)
511+ sink ( arg: e6!) // $ flow=505
481512}
482513
483514func source2( ) -> ( Int , Int ) ? { return nil }
@@ -523,8 +554,8 @@ func testOptionalPropertyAccess(y: Int?) {
523554}
524555
525556func testIdentityArithmetic( ) {
526- sink ( arg: + source( ) ) // $ flow=526
527- sink ( arg: ( source ( ) ) ) // $ flow=527
557+ sink ( arg: + source( ) ) // $ flow=557
558+ sink ( arg: ( source ( ) ) ) // $ flow=558
528559}
529560
530561func sink( str: String ) { }
@@ -541,13 +572,13 @@ class MyClass {
541572extension MyClass {
542573 convenience init ( contentsOfFile: String ) {
543574 self . init ( s: source3 ( ) )
544- sink ( str: str) // $ flow=543
575+ sink ( str: str) // $ flow=574
545576 }
546577}
547578
548579func extensionInits( path: String ) {
549- sink ( str: MyClass ( s: source3 ( ) ) . str) // $ flow=549
550- sink ( str: MyClass ( contentsOfFile: path) . str) // $ flow=543
580+ sink ( str: MyClass ( s: source3 ( ) ) . str) // $ flow=580
581+ sink ( str: MyClass ( contentsOfFile: path) . str) // $ flow=574
551582}
552583
553584class InoutConstructorClass {
@@ -572,10 +603,10 @@ struct S {
572603func testKeyPath( ) {
573604 let s = S ( x: source ( ) )
574605 let f = \S . x
575- sink ( arg: s [ keyPath: f] ) // $ flow=573
606+ sink ( arg: s [ keyPath: f] ) // $ flow=604
576607
577608 let inferred : KeyPath < S , Int > = \. x
578- sink ( arg: s [ keyPath: inferred] ) // $ flow=573
609+ sink ( arg: s [ keyPath: inferred] ) // $ flow=604
579610}
580611
581612struct S2 {
@@ -590,13 +621,13 @@ func testNestedKeyPath() {
590621 let s = S ( x: source ( ) )
591622 let s2 = S2 ( s: s)
592623 let f = \S2 . s. x
593- sink ( arg: s2 [ keyPath: f] ) // $ flow=590
624+ sink ( arg: s2 [ keyPath: f] ) // $ flow=621
594625}
595626
596627func testArrayKeyPath( ) {
597628 let array = [ source ( ) ]
598629 let f = \[ Int ] . [ 0 ]
599- sink ( arg: array [ keyPath: f] ) // $ MISSING: flow=597
630+ sink ( arg: array [ keyPath: f] ) // $ MISSING: flow=628
600631}
601632
602633struct S2_Optional {
@@ -611,7 +642,7 @@ func testOptionalKeyPath() {
611642 let s = S ( x: source ( ) )
612643 let s2 = S2_Optional ( s: s)
613644 let f = \S2_Optional . s? . x
614- sink ( opt: s2 [ keyPath: f] ) // $ MISSING: flow=611
645+ sink ( opt: s2 [ keyPath: f] ) // $ MISSING: flow=642
615646}
616647
617648func testSwap( ) {
@@ -623,11 +654,11 @@ func testSwap() {
623654 x = y
624655 y = t
625656 sink ( arg: x)
626- sink ( arg: y) // $ flow=618
657+ sink ( arg: y) // $ flow=649
627658
628659 x = source ( )
629660 y = 0
630661 swap ( & x, & y)
631- sink ( arg: x) // $ SPURIOUS: flow=628
632- sink ( arg: y) // $ flow=628
662+ sink ( arg: x) // $ SPURIOUS: flow=659
663+ sink ( arg: y) // $ flow=659
633664}
0 commit comments