// RUN: %target-swift-emit-sil -O -Xllvm -sil-inline-generics=false -Xllvm -sil-partial-specialization=false -primary-file %s -o - | %FileCheck %s // check if the compiler does not crash if a function is specialized // which contains a collection cast class MyClass {} class KeyClass : Hashable { func hash(into hasher: inout Hasher) {} } func ==(lhs: KeyClass, rhs: KeyClass) -> Bool { return true } // CHECK-LABEL: sil{{.*}}@{{.*}}arrayUpCast{{.*}} func arrayUpCast(_ arr: [Ct]) -> [MyClass] { // CHECK: apply %{{[0-9]*}}(%{{[0-9]*}}) return arr // CHECK: return } // CHECK-LABEL: sil{{.*}}@{{.*}}arrayDownCast{{.*}} func arrayDownCast(_ arr: [MyClass]) -> [Ct] { // CHECK: apply %{{[0-9]*}}<{{.*}}Ct>(%{{[0-9]*}}) return arr as! [Ct] // CHECK: return } // CHECK-LABEL: sil{{.*}}@{{.*}}dictUpCast{{.*}} func dictUpCast(_ dict: [KeyClass:Ct]) -> [KeyClass:MyClass] { // CHECK: apply %{{[0-9]*}}<{{.*}}Ct{{.*}}>(%{{[0-9]*}}) return dict as [KeyClass:MyClass] // CHECK: return } // CHECK-LABEL: sil{{.*}}@{{.*}}dictDownCast{{.*}} func dictDownCast(_ dict: [KeyClass:MyClass]) -> [KeyClass:Ct] { // CHECK: apply %{{[0-9]*}}(%{{[0-9]*}}) return dict as! [KeyClass:Ct] // CHECK: return } func setUpCast(_ s: Set) -> Set { // CHECK: apply %{{[0-9]*}}(%{{[0-9]*}}) return s as Set // CHECK: return } func setDownCast(_ s : Set) -> Set { // CHECK: apply %{{[0-9]*}}(%{{[0-9]*}}) return s as! Set // CHECK: return } let arr: [MyClass] = [MyClass()] arrayUpCast(arr) arrayDownCast(arr) let dict: [KeyClass:MyClass] = [KeyClass() : MyClass()] dictUpCast(dict) dictDownCast(dict) let s: Set = Set() setUpCast(s) setDownCast(s)