@@ -305,6 +305,93 @@ variadics6(x: 1, 2, 3) // expected-error{{missing argument for parameter 'z' in
305305variadics6 ( x: 1 ) // expected-error{{missing argument for parameter 'z' in call}}
306306variadics6 ( ) // expected-error{{missing argument for parameter 'z' in call}}
307307
308+ func variadics7( _ x: Int ... , y: Int ... ) { }
309+
310+ // Using multiple variadics (in order, complete)
311+ variadics7 ( 1 , y: 2 )
312+ variadics7 ( 1 , 2 , 3 , y: 4 , 5 , 6 )
313+ variadics7 ( 1 , 2 , y: 2 )
314+ variadics7 ( 1 , y: 2 , 1 )
315+
316+ // multiple variadics, in order, some missing
317+ variadics7 ( y: 1 )
318+ variadics7 ( 1 )
319+ variadics7 ( y: 4 , 5 , 6 )
320+ variadics7 ( 1 , 2 , 3 )
321+
322+ func variadics8( x: Int ... , y: Int ... ) { }
323+
324+ // multiple variadics, out of order
325+ variadics8 ( y: 1 , x: 2 ) // expected-error {{argument 'x' must precede argument 'y'}} {{12-12=x: 2, }} {{16-22=}}
326+ variadics8 ( y: 1 , 2 , 3 , x: 4 ) // expected-error {{argument 'x' must precede argument 'y'}} {{12-12=x: 4, }} {{22-28=}}
327+ variadics8 ( y: 1 , x: 2 , 3 , 4 ) // expected-error {{argument 'x' must precede argument 'y'}} {{12-12=x: 2, 3, 4, }} {{16-28=}}
328+ variadics8 ( y: 1 , 2 , 3 , x: 4 , 5 , 6 ) // expected-error {{argument 'x' must precede argument 'y'}} {{12-12=x: 4, 5, 6, }} {{22-34=}}
329+
330+ func variadics9( _ a: Int ... , b: Int , _ c: Int ... ) { } // expected-note {{'variadics9(_:b:_:)' declared here}}
331+
332+ // multiple split variadics, in order, complete
333+ variadics9 ( 1 , b: 2 , 3 )
334+ variadics9 ( 1 , 2 , 3 , b: 2 , 3 )
335+ variadics9 ( 1 , b: 2 , 3 , 2 , 1 )
336+ variadics9 ( 1 , 2 , 3 , b: 2 , 3 , 2 , 1 )
337+
338+ // multiple split variadics, in order, some missing
339+ variadics9 ( b: 2 , 3 )
340+ variadics9 ( 1 , b: 2 )
341+ variadics9 ( 1 , 2 , b: 2 )
342+ variadics9 ( b: 2 , 3 , 2 , 1 )
343+
344+ // multiple split variadics, required missing
345+ variadics9 ( 1 ) // expected-error {{missing argument for parameter 'b' in call}}
346+
347+ func variadics10( _ a: Int ... , b: Int = 2 , _ c: Int ... ) { }
348+
349+ // multiple unlabeled variadics split by defaulted param, in order, complete
350+ variadics10 ( 1 , b: 2 , 3 )
351+ variadics10 ( 1 , 2 , 3 , b: 2 , 3 )
352+ variadics10 ( 1 , b: 2 , 3 , 2 , 1 )
353+ variadics10 ( 1 , 2 , 3 , b: 2 , 3 , 2 , 1 )
354+
355+ // multiple unlabeled variadics split by defaulted param, in order, some missing
356+ variadics10 ( 1 , 2 , 3 )
357+ variadics10 ( 1 , 2 , 3 , b: 3 )
358+ variadics10 ( b: 3 )
359+
360+ func variadics11( _ a: Int ... , b: Bool = false , _ c: String ... ) { }
361+
362+ variadics11 ( 1 , 2 , 3 , b: true , " hello " , " world " )
363+ variadics11 ( b: true , " hello " , " world " )
364+ variadics11 ( 1 , 2 , 3 , b: true )
365+ variadics11 ( b: true )
366+ variadics11 ( )
367+ variadics11 ( 1 , 2 , 3 , " hello " , " world " ) // expected-error 2 {{cannot convert value of type 'String' to expected argument type 'Int'}}
368+
369+ func variadics12( a: Int ... , b: Int , c: Int ... ) { }
370+
371+ variadics12 ( a: 1 , 2 , 3 , b: 4 , c: 5 , 6 , 7 )
372+ variadics12 ( b: 4 , c: 5 , 6 , 7 )
373+ variadics12 ( a: 1 , 2 , 3 , b: 4 )
374+
375+ variadics12 ( c: 5 , 6 , 7 , b: 4 , a: 1 , 2 , 3 ) // expected-error {{incorrect argument labels in call (have 'c:_:_:b:a:_:_:', expected 'a:b:c:')}} {{13-14=a}} {{19-19=b: }} {{22-22=c: }} {{25-28=}} {{31-34=}}
376+
377+
378+ // Edge cases involving multiple trailing closures and forward matching.
379+ func variadics13( a: Int ... , b: ( ( ) -> Void ) ... ) { }
380+
381+ variadics13 ( )
382+ variadics13 ( a: 1 , 2 , 3 ) { } _: { } _: { }
383+ variadics13 ( ) { } _: { } _: { }
384+ variadics13 ( a: 1 , 2 , 3 )
385+ variadics13 ( a: 1 , 2 , 3 ) { }
386+
387+ func variadics14( a: ( ( ) -> Void ) ... , b: ( ( ) -> Void ) ... ) { } // expected-note {{'variadics14(a:b:)' declared here}}
388+
389+ variadics14 ( a: { } , { } , b: { } , { } )
390+ variadics14 ( a: { } , { } ) { } _: { }
391+ variadics14 { } _: { } b: { } _: { }
392+ variadics14 { } b: { }
393+ variadics14 { } // expected-warning {{backward matching of the unlabeled trailing closure is deprecated; label the argument with 'b' to suppress this warning}}
394+
308395func outOfOrder( _ a : Int , b: Int ) {
309396 outOfOrder ( b: 42 , 52 ) // expected-error {{unnamed argument #2 must precede argument 'b'}} {{14-14=52, }} {{19-23=}}
310397}
@@ -1336,6 +1423,26 @@ d = sub2[d] // expected-error{{missing argument label 'd:' in subscript}} {{10-1
13361423d = sub2 [ d: d]
13371424d = sub2 [ f: d] // expected-error{{incorrect argument label in subscript (have 'f:', expected 'd:')}} {{10-11=d}}
13381425
1426+ struct Sub3 {
1427+ subscript ( a: Int ... , b b: Int ... ) -> Int { 42 }
1428+ }
1429+
1430+ let sub3 = Sub3 ( )
1431+ _ = sub3 [ 1 , 2 , 3 , b: 4 , 5 , 6 ]
1432+ _ = sub3 [ b: 4 , 5 , 6 ]
1433+ _ = sub3 [ 1 , 2 , 3 ]
1434+ _ = sub3 [ 1 , c: 4 ] // expected-error {{incorrect argument label in subscript (have '_:c:', expected '_:b:')}}
1435+
1436+ struct Sub4 {
1437+ subscript ( a: Int ... , b b: Int = 0 , c: Int ... ) -> Int { 42 }
1438+ }
1439+
1440+ let sub4 = Sub4 ( )
1441+ _ = sub4 [ 1 , 2 , 3 , b: 2 , 1 , 2 , 3 ]
1442+ _ = sub4 [ 1 , 2 , 3 , b: 2 ]
1443+ _ = sub4 [ 1 , 2 , 3 ]
1444+ _ = sub4 [ ]
1445+
13391446// -------------------------------------------
13401447// Closures
13411448// -------------------------------------------
0 commit comments