// RUN: %target-swift-frontend -primary-file %s -emit-ir -enable-objc-interop | %FileCheck %s --check-prefixes=CHECK,CHECK-objc // RUN: %target-swift-frontend -primary-file %s -emit-ir -disable-objc-interop | %FileCheck %s --check-prefixes=CHECK,CHECK-native // REQUIRES: CPU=x86_64 sil_stage canonical import Builtin import Swift class A { } sil_vtable A {} protocol P { func operate() } class B {} sil_vtable B {} // CHECK-LABEL: define hidden swiftcc void @thick_metatype(ptr %0) sil hidden @thick_metatype : $@convention(thin) (@thick A.Type) -> () { bb0(%0 : $@thick A.Type): %2 = tuple () return %2 : $() } sil hidden_external @use_all : $@convention(thin) () -> () // CHECK-LABEL: define hidden swiftcc void @class_pointer(ptr %0, ptr %T.P) // CHECK: [[METADATA:%.*]] = load ptr, ptr %0, align 8 // CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 10 // CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 7 // CHECK-NEXT: %T = load ptr, ptr [[T1]], align 8 // CHECK: store // CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 11 // CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 8 // CHECK-NEXT: %U = load ptr, ptr [[T1]], align 8 // CHECK: store // CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 12 // CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 9 // CHECK-NEXT: %U.P = load ptr, ptr [[T1]], align 8 sil hidden @class_pointer : $@convention(thin) (@guaranteed B) -> () { bb0(%0 : $B): %f = function_ref @use_all : $@convention(thin) () -> () apply %f() : $@convention(thin) () -> () %3 = tuple () return %3 : $() } // CHECK-LABEL: define hidden swiftcc void @test_23121786(ptr %0, ptr %1) sil hidden @test_23121786 : $@convention(thin) (@owned A>, @owned A) -> () { bb0(%0 : $A>, %1 : $A): %2 = tuple () return %2 : $() } protocol A2 { associatedtype AssocTy } protocol C { } extension A2 where Self.AssocTy : C { } class K : A2 where T : C { typealias AssocTy = T } sil @callee : $@convention(method) <τ_0_0 where τ_0_0 : A2, τ_0_0.AssocTy : C> (@in_guaranteed τ_0_0) -> () // CHECK-LABEL: define{{.*}} swiftcc void @caller(ptr {{.*}}, ptr %Self, ptr %SelfWitnessTable) // CHECK: entry: // CHECK-objc: %1 = getelementptr inbounds ptr, ptr %Self, i64 11 // CHECK-native: %1 = getelementptr inbounds ptr, ptr %Self, i64 8 // CHECK: %"\CF\84_1_0.C" = load ptr, ptr %1 // CHECK: call swiftcc void @callee(ptr %Self, ptr %SelfWitnessTable, ptr %"\CF\84_1_0.C" sil @caller : $@convention(witness_method: A2) <τ_0_0><τ_1_0 where τ_0_0 : K<τ_1_0>, τ_1_0 : C> (@in_guaranteed τ_0_0) -> () { bb0(%0 : $*τ_0_0): %1 = function_ref @callee : $@convention(method) <τ_0_0 where τ_0_0 : A2, τ_0_0.AssocTy : C> (@in_guaranteed τ_0_0) -> () %2 = apply %1<τ_0_0>(%0) : $@convention(method) <τ_0_0 where τ_0_0 : A2, τ_0_0.AssocTy : C> (@in_guaranteed τ_0_0) -> () %3 = tuple () return %3 : $() }