mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
39 lines
1.2 KiB
Swift
39 lines
1.2 KiB
Swift
// RUN: %target-typecheck-verify-swift -dump-ast > %t.ast
|
|
// RUN: %FileCheck %s < %t.ast
|
|
|
|
// Verify that upcasts of array literals upcast the individual elements in place
|
|
// rather than introducing a collection_upcast_expr.
|
|
|
|
protocol P { }
|
|
struct X : P { }
|
|
|
|
struct TakesArray<T> {
|
|
init(_: [(T) -> Void]) { }
|
|
}
|
|
|
|
// CHECK-LABEL: func_decl{{.*}}"arrayUpcast(_:_:)"
|
|
// CHECK: assign_expr
|
|
// CHECK-NOT: collection_upcast_expr
|
|
// CHECK: array_expr type='[(X) -> Void]'
|
|
// CHECK: function_conversion_expr implicit type='(X) -> Void'
|
|
// CHECK-NEXT: {{declref_expr.*x1}}
|
|
// CHECK-NEXT: function_conversion_expr implicit type='(X) -> Void'
|
|
// CHECK-NEXT: {{declref_expr.*x2}}
|
|
func arrayUpcast(_ x1: @escaping (P) -> Void, _ x2: @escaping (P) -> Void) {
|
|
_ = TakesArray<X>([x1, x2])
|
|
}
|
|
|
|
struct TakesDictionary<T> {
|
|
init(_: [Int : (T) -> Void]) { }
|
|
}
|
|
|
|
// CHECK-LABEL: func_decl{{.*}}"dictionaryUpcast(_:_:)"
|
|
// CHECK: assign_expr
|
|
// CHECK-NOT: collection_upcast_expr
|
|
// CHECK: paren_expr type='([Int : (X) -> Void])'
|
|
// CHECK-NOT: collection_upcast_expr
|
|
// CHECK: (dictionary_expr type='[Int : (X) -> Void]'
|
|
func dictionaryUpcast(_ x1: @escaping (P) -> Void, _ x2: @escaping (P) -> Void) {
|
|
_ = TakesDictionary<X>(([1: x1, 2: x2]))
|
|
}
|