@@ -513,6 +513,64 @@ func getE(_ i: Int) -> E {
513
513
}
514
514
}
515
515
516
+ func test_labeled_splats( ) {
517
+ enum E {
518
+ case multi( a: String , b: String )
519
+ case tuple( ( a: Int , b: Int ) )
520
+ case single( result: Int )
521
+ case single_multi( result: ( a: Int , q: String ) )
522
+ }
523
+
524
+ func test_answer( _: String ) -> Int { 42 }
525
+ func test_question( _: Int ) -> String { " ultimate question " }
526
+
527
+ let e : E = E . single ( result: 42 )
528
+
529
+ tuplify ( true ) { _ in
530
+ switch e {
531
+ case . single( let result) :
532
+ test_question ( result)
533
+ case let . single_multi( result) :
534
+ test_answer ( result. q)
535
+ test_question ( result. a)
536
+ case let . multi( value) : // tuple splat preserves labels
537
+ test_answer ( value. a)
538
+ test_answer ( value. b)
539
+ case let . tuple( a: a, b: b) : // un-splat preserves labels too
540
+ test_question ( a)
541
+ test_question ( b)
542
+ }
543
+
544
+ // compound names still work with and without splat
545
+ switch e {
546
+ case . single( _) : 42
547
+ case . single_multi( result: ( let a, let q) ) :
548
+ test_answer ( q)
549
+ test_question ( a)
550
+ case let . multi( a: a, b: b) :
551
+ test_answer ( a)
552
+ test_answer ( b)
553
+ case let . tuple( ( a: a, b: b) ) :
554
+ test_question ( a)
555
+ test_question ( b)
556
+ }
557
+
558
+ // no labels, no problem regardless of splatting
559
+ switch e {
560
+ case . single( _) : 42
561
+ case let . single_multi( result: ( a, q) ) :
562
+ test_question ( a)
563
+ test_answer ( q)
564
+ case let . multi( a, b) :
565
+ test_answer ( a)
566
+ test_answer ( b)
567
+ case let . tuple( ( a, b) ) :
568
+ test_question ( a)
569
+ test_question ( b)
570
+ }
571
+ }
572
+ }
573
+
516
574
tuplify ( true ) { c in
517
575
" testIfLetMatching "
518
576
if let theValue = getOptionalInt ( c) {
0 commit comments