mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Mangling: consider bound generic types for substitutions
This shrinks the name length if the same bound generic type is used multiple times, like: func foo(_ x: [Int], _ y: [Int])
This commit is contained in:
@@ -997,7 +997,7 @@ Types
|
||||
type ::= context decl-name 'a' // Type alias (DWARF only)
|
||||
type ::= function-signature 'c' // function type
|
||||
type ::= function-signature 'X' FUNCTION-KIND // special function type
|
||||
type ::= type 'y' (type* '_')* type* 'G' // bound generic type (one type-list per nesting level of type)
|
||||
type ::= bound-generic-type
|
||||
type ::= type 'Sg' // optional type, shortcut for: type 'ySqG'
|
||||
type ::= type 'Xo' // @unowned type
|
||||
type ::= type 'Xu' // @unowned(unsafe) type
|
||||
@@ -1013,7 +1013,9 @@ Types
|
||||
type ::= type 'Xp' // existential metatype without representation
|
||||
type ::= type 'Xm' METATYPE-REPR // existential metatype with representation
|
||||
type ::= 'Xe' // error or unresolved type
|
||||
|
||||
|
||||
bound-generic-type ::= type 'y' (type* '_')* type* 'G' // one type-list per nesting level of type
|
||||
bound-generic-type ::= substitution
|
||||
|
||||
FUNCTION-KIND ::= 'f' // @thin function type
|
||||
FUNCTION-KIND ::= 'U' // uncurried function type (currently not used)
|
||||
|
||||
@@ -589,18 +589,24 @@ void ASTMangler::appendType(Type type) {
|
||||
case TypeKind::BoundGenericEnum:
|
||||
case TypeKind::BoundGenericStruct:
|
||||
if (type->isSpecialized()) {
|
||||
// Try to mangle the entire name as a substitution.
|
||||
if (tryMangleSubstitution(type.getPointer()))
|
||||
return;
|
||||
|
||||
NominalTypeDecl *NDecl = type->getAnyNominal();
|
||||
if (isStdlibType(NDecl) && NDecl->getName().str() == "Optional") {
|
||||
auto GenArgs = type->castTo<BoundGenericType>()->getGenericArgs();
|
||||
assert(GenArgs.size() == 1);
|
||||
appendType(GenArgs[0]);
|
||||
return appendOperator("Sg");
|
||||
appendOperator("Sg");
|
||||
} else {
|
||||
appendNominalType(NDecl);
|
||||
bool isFirstArgList = true;
|
||||
appendBoundGenericArgs(type, isFirstArgList);
|
||||
appendOperator("G");
|
||||
}
|
||||
|
||||
appendNominalType(NDecl);
|
||||
bool isFirstArgList = true;
|
||||
appendBoundGenericArgs(type, isFirstArgList);
|
||||
return appendOperator("G");
|
||||
addSubstitution(type.getPointer());
|
||||
return;
|
||||
}
|
||||
appendNominalType(tybase->getAnyNominal());
|
||||
return;
|
||||
|
||||
@@ -694,10 +694,14 @@ NodePointer Demangler::demangleKnownType() {
|
||||
return createSwiftType(Node::Kind::Structure, "String");
|
||||
case 'u':
|
||||
return createSwiftType(Node::Kind::Structure, "UInt");
|
||||
case 'g':
|
||||
return createType(createWithChildren(Node::Kind::BoundGenericEnum,
|
||||
createSwiftType(Node::Kind::Enum, "Optional"),
|
||||
createWithChild(Node::Kind::TypeList, popNode(Node::Kind::Type))));
|
||||
case 'g': {
|
||||
NodePointer OptionalTy =
|
||||
createType(createWithChildren(Node::Kind::BoundGenericEnum,
|
||||
createSwiftType(Node::Kind::Enum, "Optional"),
|
||||
createWithChild(Node::Kind::TypeList, popNode(Node::Kind::Type))));
|
||||
addSubstitution(OptionalTy);
|
||||
return OptionalTy;
|
||||
}
|
||||
default:
|
||||
return nullptr;
|
||||
}
|
||||
@@ -1043,7 +1047,9 @@ NodePointer Demangler::demangleBoundGenericType() {
|
||||
return nullptr;
|
||||
}
|
||||
NodePointer Nominal = popTypeAndGetNominal();
|
||||
return createType(demangleBoundGenericArgs(Nominal, TypeListList, 0));
|
||||
NodePointer NTy = createType(demangleBoundGenericArgs(Nominal, TypeListList, 0));
|
||||
addSubstitution(NTy);
|
||||
return NTy;
|
||||
}
|
||||
|
||||
NodePointer Demangler::demangleBoundGenericArgs(NodePointer Nominal,
|
||||
|
||||
@@ -410,11 +410,16 @@ void Remangler::mangleNominalType(Node *node, char TypeOp) {
|
||||
|
||||
void Remangler::mangleAnyNominalType(Node *node) {
|
||||
if (isSpecialized(node)) {
|
||||
SubstitutionEntry entry;
|
||||
if (trySubstitution(node, entry))
|
||||
return;
|
||||
|
||||
NodePointer unboundType = getUnspecialized(node, Factory);
|
||||
mangleAnyNominalType(unboundType);
|
||||
char Separator = 'y';
|
||||
mangleGenericArgs(node, Separator);
|
||||
Buffer << 'G';
|
||||
addSubstitution(entry);
|
||||
return;
|
||||
}
|
||||
switch (node->getKind()) {
|
||||
@@ -510,8 +515,12 @@ void Remangler::mangleBoundGenericEnum(Node *node) {
|
||||
Node *Id = Enum->getChild(1);
|
||||
if (Mod->getKind() == Node::Kind::Module && Mod->getText() == STDLIB_NAME &&
|
||||
Id->getKind() == Node::Kind::Identifier && Id->getText() == "Optional") {
|
||||
SubstitutionEntry entry;
|
||||
if (trySubstitution(node, entry))
|
||||
return;
|
||||
mangleSingleChildNode(node->getChild(1));
|
||||
Buffer << "Sg";
|
||||
addSubstitution(entry);
|
||||
return;
|
||||
}
|
||||
mangleAnyNominalType(node);
|
||||
|
||||
@@ -97,7 +97,7 @@ public func testTopLevel() {
|
||||
|
||||
// CHECK-LABEL: define linkonce_odr hidden {{.+}} @_T0So3BarCSQyABGs5Int32V2___tcfcTO
|
||||
// CHECK: @"\01L_selector(init:)"
|
||||
// CHECK-LABEL: define linkonce_odr hidden {{.+}} @_T0So3BarCSQyABGs5Int32V9__twoArgs_AD5othertcfcTO
|
||||
// CHECK-LABEL: define linkonce_odr hidden {{.+}} @_T0So3BarCSQyABGs5Int32V9__twoArgs_AE5othertcfcTO
|
||||
// CHECK: @"\01L_selector(initWithTwoArgs:other:)"
|
||||
// CHECK-LABEL: define linkonce_odr hidden {{.+}} @_T0So3BarCSQyABGs5Int32V8__oneArg_tcfcTO
|
||||
// CHECK: @"\01L_selector(initWithOneArg:)"
|
||||
|
||||
@@ -6,7 +6,7 @@ public struct S<Type>
|
||||
|
||||
public func foo<Type>(_ values : [S<Type>])
|
||||
{
|
||||
// CHECK: define {{.*}}_T012generic_arg53fooySayAA1SVyxGGlFADyxGSgADyxGcfU_
|
||||
// CHECK: define {{.*}}_T012generic_arg53fooySayAA1SVyxGGlFAESgAEcfU_
|
||||
// CHECK: store %[[TY:.*]]* %1, %[[TY]]** %[[ALLOCA:.*]], align
|
||||
// CHECK: call void @llvm.dbg.declare(metadata %[[TY]]** %[[ALLOCA]],
|
||||
// CHECK-SAME: metadata ![[ARG:.*]], metadata ![[EXPR:.*]])
|
||||
|
||||
@@ -33,7 +33,7 @@ public func mangle(s: [UnicodeScalar]) -> [UnicodeScalar] {
|
||||
// which shares the storage with the expression in the switch statement. Make
|
||||
// sure we only emit live range extensions for the storage once per basic block.
|
||||
|
||||
// CHECK: define {{.*}}@_T011patternvars6mangleSayAA13UnicodeScalarVGSayADG1s_tFAdDcfU_
|
||||
// CHECK: define {{.*}}@_T011patternvars6mangleSayAA13UnicodeScalarVGAE1s_tFAdDcfU_
|
||||
// CHECK: call void asm sideeffect "", "r"
|
||||
// CHECK-NOT: call void asm sideeffect "", "r"
|
||||
// CHECK: br {{.*}}label
|
||||
|
||||
@@ -192,7 +192,7 @@ _TTSrq5Si___TF4test7genericurFxx ---> generic not re-abstracted specialization <
|
||||
_TPA__TTRXFo_oSSoSS_dSb_XFo_iSSiSS_dSb_ ---> {T:_TTRXFo_oSSoSS_dSb_XFo_iSSiSS_dSb_} partial apply forwarder for reabstraction thunk helper from @callee_owned (@owned Swift.String, @owned Swift.String) -> (@unowned Swift.Bool) to @callee_owned (@in Swift.String, @in Swift.String) -> (@unowned Swift.Bool)
|
||||
_TPAo__TTRGrXFo_dGSPx__dGSPx_zoPs5Error__XFo_iGSPx__iGSPx_zoPS___ ---> {T:_TTRGrXFo_dGSPx__dGSPx_zoPs5Error__XFo_iGSPx__iGSPx_zoPS___} partial apply ObjC forwarder for reabstraction thunk helper <A> from @callee_owned (@unowned Swift.UnsafePointer<A>) -> (@unowned Swift.UnsafePointer<A>, @error @owned Swift.Error) to @callee_owned (@in Swift.UnsafePointer<A>) -> (@out Swift.UnsafePointer<A>, @error @owned Swift.Error)
|
||||
_T0SSSSSbIxxxd_SSSSSbIxiid_TRTA ---> {T:_T0SSSSSbIxxxd_SSSSSbIxiid_TR} partial apply forwarder for reabstraction thunk helper from @callee_owned (@owned Swift.String, @owned Swift.String) -> (@unowned Swift.Bool) to @callee_owned (@in Swift.String, @in Swift.String) -> (@unowned Swift.Bool)
|
||||
_T0SPyxGSPyxGs5Error_pIxydzo_SPyxGSPyxGsAA_pIxirzo_lTRTa ---> {T:_T0SPyxGSPyxGs5Error_pIxydzo_SPyxGSPyxGsAA_pIxirzo_lTR} partial apply ObjC forwarder for reabstraction thunk helper <A> from @callee_owned (@unowned Swift.UnsafePointer<A>) -> (@unowned Swift.UnsafePointer<A>, @error @owned Swift.Error) to @callee_owned (@in Swift.UnsafePointer<A>) -> (@out Swift.UnsafePointer<A>, @error @owned Swift.Error)
|
||||
_T0SPyxGAAs5Error_pIxydzo_AaAsAB_pIxirzo_lTRTa ---> {T:_T0SPyxGAAs5Error_pIxydzo_AaAsAB_pIxirzo_lTR} partial apply ObjC forwarder for reabstraction thunk helper <A> from @callee_owned (@unowned Swift.UnsafePointer<A>) -> (@unowned Swift.UnsafePointer<A>, @error @owned Swift.Error) to @callee_owned (@in Swift.UnsafePointer<A>) -> (@out Swift.UnsafePointer<A>, @error @owned Swift.Error)
|
||||
_TiC4Meow5MyCls9subscriptFT1iSi_Sf ---> Meow.MyCls.subscript (i : Swift.Int) -> Swift.Float
|
||||
_TF8manglingX22egbpdajGbuEbxfgehfvwxnFT_T_ ---> mangling.ليهمابتكلموشعربي؟ () -> ()
|
||||
_TF8manglingX24ihqwcrbEcvIaIdqgAFGpqjyeFT_T_ ---> mangling.他们为什么不说中文 () -> ()
|
||||
|
||||
@@ -41,8 +41,8 @@ struct GenericWithUniversal<T> : Assocked {
|
||||
// Witness table for Fulfilled : Assocked.
|
||||
// GLOBAL-LABEL: @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzlWP = hidden constant [3 x i8*] [
|
||||
// GLOBAL-SAME: i8* bitcast (%swift.type* (%swift.type*, i8**)* @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocWt to i8*)
|
||||
// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaEPWT to i8*)
|
||||
// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaFPWT to i8*)
|
||||
// GLOBAL-SAME: i8* bitcast (i8** (%swift.type*, %swift.type*, i8**)* @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaGPWT to i8*)
|
||||
// GLOBAL-SAME: ]
|
||||
struct Fulfilled<T : P & Q> : Assocked {
|
||||
typealias Assoc = T
|
||||
@@ -56,14 +56,14 @@ struct Fulfilled<T : P & Q> : Assocked {
|
||||
// CHECK-NEXT: ret %swift.type* [[T2]]
|
||||
|
||||
// Associated type witness table access function for Fulfilled.Assoc : P.
|
||||
// CHECK-LABEL: define internal i8** @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaEPWT(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
|
||||
// CHECK-LABEL: define internal i8** @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaFPWT(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
|
||||
// CHECK: [[T0:%.*]] = bitcast %swift.type* %"Fulfilled<T>" to i8***
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 4
|
||||
// CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** [[T1]], align 8, !invariant.load
|
||||
// CHECK-NEXT: ret i8** [[T2]]
|
||||
|
||||
// Associated type witness table access function for Fulfilled.Assoc : Q.
|
||||
// CHECK-LABEL: define internal i8** @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaFPWT(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
|
||||
// CHECK-LABEL: define internal i8** @_T023associated_type_witness9FulfilledVyxGAA8AssockedAaA1PRzAA1QRzl5AssocAaGPWT(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
|
||||
// CHECK: [[T0:%.*]] = bitcast %swift.type* %"Fulfilled<T>" to i8***
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 5
|
||||
// CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** [[T1]], align 8, !invariant.load
|
||||
|
||||
@@ -8,7 +8,7 @@ protocol A {
|
||||
}
|
||||
|
||||
struct X<Y> : A {
|
||||
// CHECK-LABEL: define hidden swiftcc void @_T023dependent_reabstraction1XVyxGAA1AAAlAaDP1by1BQzFTW(%swift.type** noalias nocapture dereferenceable({{.*}}), %T23dependent_reabstraction1XV* noalias nocapture swiftself, %swift.type* %Self, i8** %SelfWitnessTable)
|
||||
// CHECK-LABEL: define hidden swiftcc void @_T023dependent_reabstraction1XVyxGAA1AAAlAaEP1by1BQzFTW(%swift.type** noalias nocapture dereferenceable({{.*}}), %T23dependent_reabstraction1XV* noalias nocapture swiftself, %swift.type* %Self, i8** %SelfWitnessTable)
|
||||
func b(_ b: X.Type) {
|
||||
let x: Any = b
|
||||
markUsed(b as X.Type)
|
||||
|
||||
@@ -132,14 +132,14 @@ public func anchor() -> Bool {
|
||||
}
|
||||
|
||||
class ObjCTest {
|
||||
// CHECK-LABEL: define hidden %0* @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAFSgFTo
|
||||
// CHECK-LABEL: define hidden %0* @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAGFTo
|
||||
// CHECK: [[CASTED:%.+]] = ptrtoint %0* %2 to i{{32|64}}
|
||||
// CHECK: [[RESULT:%.+]] = call swiftcc i{{32|64}} @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAFSgF(i{{32|64}} [[CASTED]], %T7newtype8ObjCTestC* swiftself {{%.+}})
|
||||
// CHECK: [[RESULT:%.+]] = call swiftcc i{{32|64}} @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAGF(i{{32|64}} [[CASTED]], %T7newtype8ObjCTestC* swiftself {{%.+}})
|
||||
// CHECK: [[OPAQUE_RESULT:%.+]] = inttoptr i{{32|64}} [[RESULT]] to %0*
|
||||
// CHECK: ret %0* [[OPAQUE_RESULT]]
|
||||
// CHECK: {{^}$}}
|
||||
|
||||
// OPT-LABEL: define hidden %0* @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAFSgFTo
|
||||
// OPT-LABEL: define hidden %0* @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAGFTo
|
||||
// OPT: ret %0* %2
|
||||
// OPT: {{^}$}}
|
||||
@objc func optionalPassThrough(_ ed: ErrorDomain?) -> ErrorDomain? {
|
||||
|
||||
@@ -9,5 +9,5 @@ protocol P {
|
||||
|
||||
extension Foo: P {}
|
||||
|
||||
// SIL-LABEL: sil hidden [transparent] [thunk] @_T0So3FooCyxG33objc_generic_protocol_conformance1PACs9AnyObjectRzlAcDP3fooyyFTW {{.*}} @pseudogeneric
|
||||
// IR-LABEL: define hidden swiftcc void @_T0So3FooCyxG33objc_generic_protocol_conformance1PACs9AnyObjectRzlAcDP3fooyyFTW(%TSo3FooC** noalias nocapture swiftself dereferenceable({{4|8}}), %swift.type*{{( %Self)?}}, i8**{{( %SelfWitnessTable)?}})
|
||||
// SIL-LABEL: sil hidden [transparent] [thunk] @_T0So3FooCyxG33objc_generic_protocol_conformance1PADs9AnyObjectRzlAdEP3fooyyFTW {{.*}} @pseudogeneric
|
||||
// IR-LABEL: define hidden swiftcc void @_T0So3FooCyxG33objc_generic_protocol_conformance1PADs9AnyObjectRzlAdEP3fooyyFTW(%TSo3FooC** noalias nocapture swiftself dereferenceable({{4|8}}), %swift.type*{{( %Self)?}}, i8**{{( %SelfWitnessTable)?}})
|
||||
|
||||
@@ -15,7 +15,7 @@ public extension P where Foo == DefaultFoo<Self> {
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define{{( protected)?}} swiftcc void @_T021same_type_constraints1PPAaaBRzAA10DefaultFooVyxG0E0RtzlE3fooAEyxGyF
|
||||
// CHECK: define{{( protected)?}} swiftcc void @_T021same_type_constraints1PPAaaBRzAA10DefaultFooVyxG0E0RtzlE3fooAFyF
|
||||
|
||||
// <rdar://26873036> IRGen crash with derived class declaring same-type constraint on constrained associatedtype.
|
||||
public class C1<T: Equatable> { }
|
||||
|
||||
@@ -9,13 +9,13 @@ struct Foo<T>: P {
|
||||
typealias A = T.Type
|
||||
|
||||
func f(_ t: T.Type) {}
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T025dependent_member_lowering3FooVyxGAA1PAAlAaDP1fy1AQzFTW : $@convention(witness_method) <τ_0_0> (@in @thick τ_0_0.Type, @in_guaranteed Foo<τ_0_0>) -> ()
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T025dependent_member_lowering3FooVyxGAA1PAAlAaEP1fy1AQzFTW : $@convention(witness_method) <τ_0_0> (@in @thick τ_0_0.Type, @in_guaranteed Foo<τ_0_0>) -> ()
|
||||
// CHECK: bb0(%0 : $*@thick τ_0_0.Type, %1 : $*Foo<τ_0_0>):
|
||||
}
|
||||
struct Bar<T>: P {
|
||||
typealias A = (Int) -> T
|
||||
|
||||
func f(_ t: @escaping (Int) -> T) {}
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T025dependent_member_lowering3BarVyxGAA1PAAlAaDP1fy1AQzFTW : $@convention(witness_method) <τ_0_0> (@in @callee_owned (@in Int) -> @out τ_0_0, @in_guaranteed Bar<τ_0_0>) -> ()
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T025dependent_member_lowering3BarVyxGAA1PAAlAaEP1fy1AQzFTW : $@convention(witness_method) <τ_0_0> (@in @callee_owned (@in Int) -> @out τ_0_0, @in_guaranteed Bar<τ_0_0>) -> ()
|
||||
// CHECK: bb0(%0 : $*@callee_owned (@in Int) -> @out τ_0_0, %1 : $*Bar<τ_0_0>):
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ hasNoPrototype()
|
||||
// CHECK: [[NSANSE_RESULT:%.*]] = apply [[NSANSE]]([[ANSIBLE]])
|
||||
// CHECK: destroy_value [[ANSIBLE]] : $Optional<Ansible>
|
||||
// -- Referencing unapplied C function goes through a thunk
|
||||
// CHECK: [[NSANSE:%.*]] = function_ref @_T0SC6NSAnseSQySo7AnsibleCGSQyACGFTO : $@convention(thin) (@owned Optional<Ansible>) -> @owned Optional<Ansible>
|
||||
// CHECK: [[NSANSE:%.*]] = function_ref @_T0SC6NSAnseSQySo7AnsibleCGADFTO : $@convention(thin) (@owned Optional<Ansible>) -> @owned Optional<Ansible>
|
||||
// -- Referencing unprototyped C function passes no parameters
|
||||
// CHECK: [[NOPROTO:%.*]] = function_ref @hasNoPrototype : $@convention(c) () -> ()
|
||||
// CHECK: apply [[NOPROTO]]()
|
||||
@@ -32,7 +32,7 @@ hasNoPrototype()
|
||||
// CHECK-LABEL: sil shared @_T0So8NSObjectC{{[_0-9a-zA-Z]*}}fC : $@convention(method) (@thick NSObject.Type) -> @owned NSObject
|
||||
|
||||
// -- Native Swift thunk for NSAnse
|
||||
// CHECK: sil shared [fragile] [thunk] @_T0SC6NSAnseSQySo7AnsibleCGSQyACGFTO : $@convention(thin) (@owned Optional<Ansible>) -> @owned Optional<Ansible> {
|
||||
// CHECK: sil shared [fragile] [thunk] @_T0SC6NSAnseSQySo7AnsibleCGADFTO : $@convention(thin) (@owned Optional<Ansible>) -> @owned Optional<Ansible> {
|
||||
// CHECK: bb0(%0 : $Optional<Ansible>):
|
||||
// CHECK: %1 = function_ref @NSAnse : $@convention(c) (Optional<Ansible>) -> @autoreleased Optional<Ansible>
|
||||
// CHECK: %2 = apply %1(%0) : $@convention(c) (Optional<Ansible>) -> @autoreleased Optional<Ansible>
|
||||
|
||||
@@ -122,54 +122,54 @@ struct AddrOnly {
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T019function_conversion19convOptionalTrivialyAA0E0VADSgcF
|
||||
func convOptionalTrivial(_ t1: @escaping (Trivial?) -> Trivial) {
|
||||
// CHECK: function_ref @_T019function_conversion7TrivialVSgACIxyd_AcCSgIxyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion7TrivialVSgACIxyd_AcDIxyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Trivial) -> Trivial? = t1
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion7TrivialVSgACIxyd_ACSgACSgIxyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion7TrivialVSgACIxyd_AdDIxyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Trivial!) -> Trivial? = t1
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion7TrivialVSgACIxyd_AcCSgIxyd_TR : $@convention(thin) (Trivial, @owned @callee_owned (Optional<Trivial>) -> Trivial) -> Optional<Trivial>
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion7TrivialVSgACIxyd_AcDIxyd_TR : $@convention(thin) (Trivial, @owned @callee_owned (Optional<Trivial>) -> Trivial) -> Optional<Trivial>
|
||||
// CHECK: enum $Optional<Trivial>
|
||||
// CHECK-NEXT: apply %1(%2)
|
||||
// CHECK-NEXT: enum $Optional<Trivial>
|
||||
// CHECK-NEXT: return
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion7TrivialVSgACIxyd_ACSgACSgIxyd_TR : $@convention(thin) (Optional<Trivial>, @owned @callee_owned (Optional<Trivial>) -> Trivial) -> Optional<Trivial>
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion7TrivialVSgACIxyd_AdDIxyd_TR : $@convention(thin) (Optional<Trivial>, @owned @callee_owned (Optional<Trivial>) -> Trivial) -> Optional<Trivial>
|
||||
// CHECK: apply %1(%0)
|
||||
// CHECK-NEXT: enum $Optional<Trivial>
|
||||
// CHECK-NEXT: return
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T019function_conversion20convOptionalLoadableyAA0E0VADSgcF
|
||||
func convOptionalLoadable(_ l1: @escaping (Loadable?) -> Loadable) {
|
||||
// CHECK: function_ref @_T019function_conversion8LoadableVSgACIxxo_AcCSgIxxo_TR
|
||||
// CHECK: function_ref @_T019function_conversion8LoadableVSgACIxxo_AcDIxxo_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Loadable) -> Loadable? = l1
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion8LoadableVSgACIxxo_ACSgACSgIxxo_TR
|
||||
// CHECK: function_ref @_T019function_conversion8LoadableVSgACIxxo_AdDIxxo_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Loadable!) -> Loadable? = l1
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion8LoadableVSgACIxxo_ACSgACSgIxxo_TR : $@convention(thin) (@owned Optional<Loadable>, @owned @callee_owned (@owned Optional<Loadable>) -> @owned Loadable) -> @owned Optional<Loadable>
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion8LoadableVSgACIxxo_AdDIxxo_TR : $@convention(thin) (@owned Optional<Loadable>, @owned @callee_owned (@owned Optional<Loadable>) -> @owned Loadable) -> @owned Optional<Loadable>
|
||||
// CHECK: apply %1(%0)
|
||||
// CHECK-NEXT: enum $Optional<Loadable>
|
||||
// CHECK-NEXT: return
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T019function_conversion20convOptionalAddrOnlyyAA0eF0VADSgcF
|
||||
func convOptionalAddrOnly(_ a1: @escaping (AddrOnly?) -> AddrOnly) {
|
||||
// CHECK: function_ref @_T019function_conversion8AddrOnlyVSgACIxir_ACSgACSgIxir_TR
|
||||
// CHECK: function_ref @_T019function_conversion8AddrOnlyVSgACIxir_AdDIxir_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (AddrOnly?) -> AddrOnly? = a1
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion8AddrOnlyVSgACIxir_ACSgACSgIxir_TR
|
||||
// CHECK: function_ref @_T019function_conversion8AddrOnlyVSgACIxir_AdDIxir_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (AddrOnly!) -> AddrOnly? = a1
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion8AddrOnlyVSgACIxir_ACSgACSgIxir_TR : $@convention(thin) (@in Optional<AddrOnly>, @owned @callee_owned (@in Optional<AddrOnly>) -> @out AddrOnly) -> @out Optional<AddrOnly>
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion8AddrOnlyVSgACIxir_AdDIxir_TR : $@convention(thin) (@in Optional<AddrOnly>, @owned @callee_owned (@in Optional<AddrOnly>) -> @out AddrOnly) -> @out Optional<AddrOnly>
|
||||
// CHECK: alloc_stack $AddrOnly
|
||||
// CHECK-NEXT: apply %2(%3, %1)
|
||||
// CHECK-NEXT: init_enum_data_addr %0 : $*Optional<AddrOnly>
|
||||
@@ -197,7 +197,7 @@ func convExistentialTrivial(_ t2: @escaping (Q) -> Trivial, t3: @escaping (Q?) -
|
||||
// CHECK: partial_apply
|
||||
let _: (Trivial) -> P = t2
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pSgAA7TrivialVIxid_ADSgAA1P_pIxyr_TR
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pSgAA7TrivialVIxid_AESgAA1P_pIxyr_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Trivial?) -> P = t3
|
||||
|
||||
@@ -215,7 +215,7 @@ func convExistentialTrivial(_ t2: @escaping (Q) -> Trivial, t3: @escaping (Q?) -
|
||||
// CHECK-NEXT: store
|
||||
// CHECK: return
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pSgAA7TrivialVIxid_ADSgAA1P_pIxyr_TR
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pSgAA7TrivialVIxid_AESgAA1P_pIxyr_TR
|
||||
// CHECK: select_enum
|
||||
// CHECK: cond_br
|
||||
// CHECK: bb1:
|
||||
@@ -247,20 +247,20 @@ func convExistentialTrivial(_ t2: @escaping (Q) -> Trivial, t3: @escaping (Q?) -
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T019function_conversion23convExistentialMetatypeyAA7TrivialVmAA1Q_pXpSgcF
|
||||
func convExistentialMetatype(_ em: @escaping (Q.Type?) -> Trivial.Type) {
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_ADXMtAA1P_pXmTIxyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AEXMtAA1P_pXmTIxyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Trivial.Type) -> P.Type = em
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_ADXMtSgAA1P_pXmTIxyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AEXMtSgAA1P_pXmTIxyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Trivial.Type?) -> P.Type = em
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AA1P_pXmTAaE_pXmTIxyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AA1P_pXmTAaF_pXmTIxyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (P.Type) -> P.Type = em
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_ADXMtAA1P_pXmTIxyd_TR : $@convention(thin) (@thin Trivial.Type, @owned @callee_owned (Optional<@thick Q.Type>) -> @thin Trivial.Type) -> @thick P.Type
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AEXMtAA1P_pXmTIxyd_TR : $@convention(thin) (@thin Trivial.Type, @owned @callee_owned (Optional<@thick Q.Type>) -> @thin Trivial.Type) -> @thick P.Type
|
||||
// CHECK: metatype $@thick Trivial.Type
|
||||
// CHECK-NEXT: init_existential_metatype %2 : $@thick Trivial.Type, $@thick Q.Type
|
||||
// CHECK-NEXT: enum $Optional<@thick Q.Type>
|
||||
@@ -269,7 +269,7 @@ func convExistentialMetatype(_ em: @escaping (Q.Type?) -> Trivial.Type) {
|
||||
// CHECK-NEXT: init_existential_metatype {{.*}} : $@thick Trivial.Type, $@thick P.Type
|
||||
// CHECK-NEXT: return
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_ADXMtSgAA1P_pXmTIxyd_TR : $@convention(thin) (Optional<@thin Trivial.Type>, @owned @callee_owned (Optional<@thick Q.Type>) -> @thin Trivial.Type) -> @thick P.Type
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AEXMtSgAA1P_pXmTIxyd_TR : $@convention(thin) (Optional<@thin Trivial.Type>, @owned @callee_owned (Optional<@thick Q.Type>) -> @thin Trivial.Type) -> @thick P.Type
|
||||
// CHECK: select_enum %0 : $Optional<@thin Trivial.Type>
|
||||
// CHECK-NEXT: cond_br
|
||||
// CHECK: bb1:
|
||||
@@ -285,7 +285,7 @@ func convExistentialMetatype(_ em: @escaping (Q.Type?) -> Trivial.Type) {
|
||||
// CHECK-NEXT: init_existential_metatype {{.*}} : $@thick Trivial.Type, $@thick P.Type
|
||||
// CHECK-NEXT: return
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AA1P_pXmTAaE_pXmTIxyd_TR : $@convention(thin) (@thick P.Type, @owned @callee_owned (Optional<@thick Q.Type>) -> @thin Trivial.Type) -> @thick P.Type
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion1Q_pXmTSgAA7TrivialVXMtIxyd_AA1P_pXmTAaF_pXmTIxyd_TR : $@convention(thin) (@thick P.Type, @owned @callee_owned (Optional<@thick Q.Type>) -> @thin Trivial.Type) -> @thick P.Type
|
||||
// CHECK: open_existential_metatype %0 : $@thick P.Type to $@thick (@opened({{.*}}) P).Type
|
||||
// CHECK-NEXT: init_existential_metatype %2 : $@thick (@opened({{.*}}) P).Type, $@thick Q.Type
|
||||
// CHECK-NEXT: enum $Optional<@thick Q.Type>
|
||||
@@ -302,36 +302,36 @@ class Child : Parent {}
|
||||
// Note: we add a Trivial => Trivial? conversion here to force a thunk
|
||||
// to be generated
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T019function_conversion18convUpcastMetatypeyAA5ChildCmAA6ParentCm_AA7TrivialVSgtc_ADmAFmSg_AHSgtc2c5tF
|
||||
// CHECK-LABEL: sil hidden @_T019function_conversion18convUpcastMetatypeyAA5ChildCmAA6ParentCm_AA7TrivialVSgtc_ADmAFmSg_AItc2c5tF
|
||||
func convUpcastMetatype(_ c4: @escaping (Parent.Type, Trivial?) -> Child.Type,
|
||||
c5: @escaping (Parent.Type?, Trivial?) -> Child.Type) {
|
||||
// CHECK: function_ref @_T019function_conversion6ParentCXMTAA7TrivialVSgAA5ChildCXMTIxyyd_AGXMTAeCXMTIxyyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion6ParentCXMTAA7TrivialVSgAA5ChildCXMTIxyyd_AHXMTAeCXMTIxyyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Child.Type, Trivial) -> Parent.Type = c4
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AGXMTAeCXMTIxyyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AIXMTAfCXMTIxyyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Child.Type, Trivial) -> Parent.Type = c5
|
||||
|
||||
// CHECK: function_ref @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AGXMTSgAeCXMTSgIxyyd_TR
|
||||
// CHECK: function_ref @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AIXMTSgAfDIxyyd_TR
|
||||
// CHECK: partial_apply
|
||||
let _: (Child.Type?, Trivial) -> Parent.Type? = c5
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion6ParentCXMTAA7TrivialVSgAA5ChildCXMTIxyyd_AGXMTAeCXMTIxyyd_TR : $@convention(thin) (@thick Child.Type, Trivial, @owned @callee_owned (@thick Parent.Type, Optional<Trivial>) -> @thick Child.Type) -> @thick Parent.Type
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion6ParentCXMTAA7TrivialVSgAA5ChildCXMTIxyyd_AHXMTAeCXMTIxyyd_TR : $@convention(thin) (@thick Child.Type, Trivial, @owned @callee_owned (@thick Parent.Type, Optional<Trivial>) -> @thick Child.Type) -> @thick Parent.Type
|
||||
// CHECK: upcast %0 : $@thick Child.Type to $@thick Parent.Type
|
||||
// CHECK: apply
|
||||
// CHECK: upcast {{.*}} : $@thick Child.Type to $@thick Parent.Type
|
||||
// CHECK: return
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AGXMTAeCXMTIxyyd_TR : $@convention(thin) (@thick Child.Type, Trivial, @owned @callee_owned (Optional<@thick Parent.Type>, Optional<Trivial>) -> @thick Child.Type) -> @thick Parent.Type
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AIXMTAfCXMTIxyyd_TR : $@convention(thin) (@thick Child.Type, Trivial, @owned @callee_owned (Optional<@thick Parent.Type>, Optional<Trivial>) -> @thick Child.Type) -> @thick Parent.Type
|
||||
// CHECK: upcast %0 : $@thick Child.Type to $@thick Parent.Type
|
||||
// CHECK: enum $Optional<@thick Parent.Type>
|
||||
// CHECK: apply
|
||||
// CHECK: upcast {{.*}} : $@thick Child.Type to $@thick Parent.Type
|
||||
// CHECK: return
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AGXMTSgAeCXMTSgIxyyd_TR : $@convention(thin) (Optional<@thick Child.Type>, Trivial, @owned @callee_owned (Optional<@thick Parent.Type>, Optional<Trivial>) -> @thick Child.Type) -> Optional<@thick Parent.Type>
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T019function_conversion6ParentCXMTSgAA7TrivialVSgAA5ChildCXMTIxyyd_AIXMTSgAfDIxyyd_TR : $@convention(thin) (Optional<@thick Child.Type>, Trivial, @owned @callee_owned (Optional<@thick Parent.Type>, Optional<Trivial>) -> @thick Child.Type) -> Optional<@thick Parent.Type>
|
||||
// CHECK: unchecked_trivial_bit_cast %0 : $Optional<@thick Child.Type> to $Optional<@thick Parent.Type>
|
||||
// CHECK: apply
|
||||
// CHECK: upcast {{.*}} : $@thick Child.Type to $@thick Parent.Type
|
||||
|
||||
@@ -50,7 +50,7 @@ struct Canvas<I : Ink> where I.Paint : Pen {
|
||||
|
||||
extension Canvas : Medium {}
|
||||
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015generic_witness6CanvasVyxGAA6MediumAaA3InkRzAA3Pen5PaintRpzlAaDP4drawy6StrokeQyd__5paint_qd__6penciltAA6PencilRd__7Texture_AGQZALRSlFTW : $@convention(witness_method) <τ_0_0 where τ_0_0 : Ink><τ_1_0 where τ_1_0 : Pencil, τ_0_0.Paint == τ_1_0.Stroke> (@in τ_0_0.Paint, @in τ_1_0, @in_guaranteed Canvas<τ_0_0>) -> () {
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015generic_witness6CanvasVyxGAA6MediumAaA3InkRzAA3Pen5PaintRpzlAaEP4drawy6StrokeQyd__5paint_qd__6penciltAA6PencilRd__7Texture_AHQZAMRSlFTW : $@convention(witness_method) <τ_0_0 where τ_0_0 : Ink><τ_1_0 where τ_1_0 : Pencil, τ_0_0.Paint == τ_1_0.Stroke> (@in τ_0_0.Paint, @in τ_1_0, @in_guaranteed Canvas<τ_0_0>) -> () {
|
||||
// CHECK: [[FN:%.*]] = function_ref @_T015generic_witness6CanvasV4drawy5PaintQz5paint_qd__6penciltAA6PencilRd__6StrokeQyd__AFRSlF : $@convention(method) <τ_0_0 where τ_0_0 : Ink><τ_1_0 where τ_1_0 : Pencil, τ_0_0.Paint == τ_1_0.Stroke> (@in τ_0_0.Paint, @in τ_1_0, Canvas<τ_0_0>) -> ()
|
||||
// CHECK: apply [[FN]]<τ_0_0, τ_1_0>({{.*}}) : $@convention(method) <τ_0_0 where τ_0_0 : Ink><τ_1_0 where τ_1_0 : Pencil, τ_0_0.Paint == τ_1_0.Stroke> (@in τ_0_0.Paint, @in τ_1_0, Canvas<τ_0_0>) -> ()
|
||||
// CHECK: }
|
||||
|
||||
@@ -248,7 +248,7 @@ struct AO<T>: Fooable {
|
||||
}
|
||||
|
||||
// Witness for nonmutating 'foo'
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015guaranteed_self2AOVyxGAA7FooableAAlAaDP3foo{{[_0-9a-zA-Z]*}}FTW : $@convention(witness_method) <τ_0_0> (Int, @in_guaranteed AO<τ_0_0>) -> ()
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015guaranteed_self2AOVyxGAA7FooableAAlAaEP3foo{{[_0-9a-zA-Z]*}}FTW : $@convention(witness_method) <τ_0_0> (Int, @in_guaranteed AO<τ_0_0>) -> ()
|
||||
// CHECK: bb0({{.*}} [[SELF_ADDR:%.*]] : $*AO<τ_0_0>):
|
||||
// TODO: This copy isn't necessary.
|
||||
// CHECK: copy_addr [[SELF_ADDR]] to [initialization] [[SELF_COPY:%.*]] :
|
||||
@@ -257,7 +257,7 @@ struct AO<T>: Fooable {
|
||||
// CHECK-NOT: destroy_addr [[SELF_ADDR]]
|
||||
|
||||
// Witness for 'bar', which is mutating in protocol but nonmutating in impl
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015guaranteed_self2AOVyxGAA7FooableAAlAaDP3bar{{[_0-9a-zA-Z]*}}FTW : $@convention(witness_method) <τ_0_0> (@inout AO<τ_0_0>) -> ()
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015guaranteed_self2AOVyxGAA7FooableAAlAaEP3bar{{[_0-9a-zA-Z]*}}FTW : $@convention(witness_method) <τ_0_0> (@inout AO<τ_0_0>) -> ()
|
||||
// CHECK: bb0([[SELF_ADDR:%.*]] : $*AO<τ_0_0>):
|
||||
// -- NB: This copy *is* necessary, unless we're willing to assume an inout
|
||||
// parameter is not mutably aliased.
|
||||
|
||||
@@ -6,7 +6,7 @@ indirect enum TreeA<T> {
|
||||
case Branch(left: TreeA<T>, right: TreeA<T>)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T013indirect_enum11TreeA_casesyx_AA0C1AOyxG1lADyxG1rtlF : $@convention(thin) <T> (@in T, @owned TreeA<T>, @owned TreeA<T>) -> () {
|
||||
// CHECK-LABEL: sil hidden @_T013indirect_enum11TreeA_casesyx_AA0C1AOyxG1lAE1rtlF : $@convention(thin) <T> (@in T, @owned TreeA<T>, @owned TreeA<T>) -> () {
|
||||
func TreeA_cases<T>(_ t: T, l: TreeA<T>, r: TreeA<T>) {
|
||||
// CHECK: bb0([[ARG1:%.*]] : $*T, [[ARG2:%.*]] : $TreeA<T>, [[ARG3:%.*]] : $TreeA<T>):
|
||||
// CHECK: [[METATYPE:%.*]] = metatype $@thin TreeA<T>.Type
|
||||
@@ -43,7 +43,7 @@ func TreeA_cases<T>(_ t: T, l: TreeA<T>, r: TreeA<T>) {
|
||||
let _ = TreeA<T>.Branch(left: l, right: r)
|
||||
|
||||
}
|
||||
// CHECK: // end sil function '_T013indirect_enum11TreeA_casesyx_AA0C1AOyxG1lADyxG1rtlF'
|
||||
// CHECK: // end sil function '_T013indirect_enum11TreeA_casesyx_AA0C1AOyxG1lAE1rtlF'
|
||||
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T013indirect_enum16TreeA_reabstractySiSicF : $@convention(thin) (@owned @callee_owned (Int) -> Int) -> () {
|
||||
@@ -72,7 +72,7 @@ enum TreeB<T> {
|
||||
indirect case Branch(left: TreeB<T>, right: TreeB<T>)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil hidden @_T013indirect_enum11TreeB_casesyx_AA0C1BOyxG1lADyxG1rtlF
|
||||
// CHECK-LABEL: sil hidden @_T013indirect_enum11TreeB_casesyx_AA0C1BOyxG1lAE1rtlF
|
||||
func TreeB_cases<T>(_ t: T, l: TreeB<T>, r: TreeB<T>) {
|
||||
|
||||
// CHECK: [[METATYPE:%.*]] = metatype $@thin TreeB<T>.Type
|
||||
|
||||
@@ -215,10 +215,10 @@ struct GenericTypeContext<T>: GenericWitnessTest {
|
||||
}
|
||||
|
||||
// CHECK-LABEL: protocol witness for interface_type_mangling.GenericWitnessTest.closureInGenericContext <A> (A1) -> () in conformance <A> interface_type_mangling.GenericTypeContext<A> : interface_type_mangling.GenericWitnessTest in interface_type_mangling
|
||||
// CHECK-LABEL: @_T023interface_type_mangling18GenericTypeContextVyxGAA0D11WitnessTestAAlAaDP09closureIndF0yqd__lFTW
|
||||
// CHECK-LABEL: @_T023interface_type_mangling18GenericTypeContextVyxGAA0D11WitnessTestAAlAaEP09closureIndF0yqd__lFTW
|
||||
|
||||
// CHECK-LABEL: protocol witness for interface_type_mangling.GenericWitnessTest.closureInGenericPropertyContext.getter : A.Tee in conformance <A> interface_type_mangling.GenericTypeContext<A> : interface_type_mangling.GenericWitnessTest in interface_type_mangling
|
||||
// CHECK-LABEL: @_T023interface_type_mangling18GenericTypeContextVyxGAA0D11WitnessTestAAlAaDP09closureInd8PropertyF03TeeQzfgTW
|
||||
// CHECK-LABEL: @_T023interface_type_mangling18GenericTypeContextVyxGAA0D11WitnessTestAAlAaEP09closureInd8PropertyF03TeeQzfgTW
|
||||
|
||||
// CHECK-LABEL: protocol witness for interface_type_mangling.GenericWitnessTest.twoParamsAtDepth <A, B> (A1, y : B1) -> () in conformance <A> interface_type_mangling.GenericTypeContext<A> : interface_type_mangling.GenericWitnessTest in interface_type_mangling
|
||||
// CHECK-LABEL: @_T023interface_type_mangling18GenericTypeContextVyxGAA0D11WitnessTestAAlAaDP16twoParamsAtDepthyqd___qd_0_1ytr0_lFTW
|
||||
// CHECK-LABEL: @_T023interface_type_mangling18GenericTypeContextVyxGAA0D11WitnessTestAAlAaEP16twoParamsAtDepthyqd___qd_0_1ytr0_lFTW
|
||||
|
||||
@@ -90,7 +90,7 @@ func uses_clang_struct(r r: NSRect) {}
|
||||
func uses_optionals(x x: Int?) -> UnicodeScalar? { return nil }
|
||||
|
||||
enum GenericUnion<T> {
|
||||
// CHECK-LABEL: sil shared [transparent] @_T08mangling12GenericUnionO3FooACyxGSicACyxGmlF
|
||||
// CHECK-LABEL: sil shared [transparent] @_T08mangling12GenericUnionO3FooACyxGSicAEmlF
|
||||
case Foo(Int)
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ struct Lunch<T : Pizza where T.Topping : CuredMeat> {
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics5LunchV6DinnerV15coolCombinationy7ToppingQz1t_AA4DeliC7MustardOyAA6PepperV_G1utF : $@convention(method) <T where T : Pizza, T.Topping : CuredMeat><U where U : HotDog, U.Condiment == Deli<Pepper>.Mustard> (@in T.Topping, Deli<Pepper>.Mustard, @in_guaranteed Lunch<T>.Dinner<U>) -> ()
|
||||
|
||||
// CHECK-LABEL: // nested_generics.Lunch.Dinner.(coolCombination (t : A.Topping, u : nested_generics.Deli<nested_generics.Pepper>.Mustard) -> ()).(nestedGeneric #1) <A><A1><A2, B2 where A: nested_generics.Pizza, A1: nested_generics.HotDog, A.Topping: nested_generics.CuredMeat, A1.Condiment == nested_generics.Deli<nested_generics.Pepper>.Mustard> (x : A2, y : B2) -> (A2, B2)
|
||||
// CHECK-LABEL: sil shared @_T015nested_generics5LunchV6DinnerV15coolCombinationy7ToppingQz1t_AA4DeliC7MustardOyAA6PepperV_G1utF0A7GenericL_qd0___qd0_0_tqd0__1x_qd0_0_1ytAA5PizzaRzAA6HotDogRd__AA9CuredMeatAHRQAMyAO_G9CondimentRtd__r__0_lF : $@convention(thin) <T where T : Pizza, T.Topping : CuredMeat><U where U : HotDog, U.Condiment == Deli<Pepper>.Mustard><X, Y> (@in X, @in Y) -> (@out X, @out Y)
|
||||
// CHECK-LABEL: sil shared @_T015nested_generics5LunchV6DinnerV15coolCombinationy7ToppingQz1t_AA4DeliC7MustardOyAA6PepperV_G1utF0A7GenericL_qd0___qd0_0_tqd0__1x_qd0_0_1ytAA5PizzaRzAA6HotDogRd__AA9CuredMeatAHRQAP9CondimentRtd__r__0_lF : $@convention(thin) <T where T : Pizza, T.Topping : CuredMeat><U where U : HotDog, U.Condiment == Deli<Pepper>.Mustard><X, Y> (@in X, @in Y) -> (@out X, @out Y)
|
||||
|
||||
// CHECK-LABEL: // nested_generics.Lunch.Dinner.init (firstCourse : A, secondCourse : Swift.Optional<A1>, leftovers : A, transformation : (A) -> A1) -> nested_generics.Lunch<A>.Dinner<A1>
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics5LunchV6DinnerVAEyx_qd__Gx11firstCourse_qd__Sg06secondF0x9leftoversqd__xc14transformationtcfC : $@convention(method) <T where T : Pizza, T.Topping : CuredMeat><U where U : HotDog, U.Condiment == Deli<Pepper>.Mustard> (@owned T, @in Optional<U>, @owned T, @owned @callee_owned (@owned T) -> @out U, @thin Lunch<T>.Dinner<U>.Type) -> @out Lunch<T>.Dinner<U>
|
||||
@@ -116,7 +116,7 @@ struct Pepper {}
|
||||
struct ChiliFlakes {}
|
||||
|
||||
// CHECK-LABEL: // nested_generics.eatDinnerGeneric <A, B where A: nested_generics.Pizza, B: nested_generics.HotDog, A.Topping: nested_generics.CuredMeat, B.Condiment == nested_generics.Deli<nested_generics.Pepper>.Mustard> (d : inout nested_generics.Lunch<A>.Dinner<B>, t : A.Topping, u : nested_generics.Deli<nested_generics.Pepper>.Mustard) -> ()
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics16eatDinnerGenericyAA5LunchV0D0Vyx_q_Gz1d_7ToppingQz1tAA4DeliC7MustardOyAA6PepperV_G1utAA5PizzaRzAA6HotDogR_AA9CuredMeatAIRQANyAP_G9CondimentRt_r0_lF : $@convention(thin) <T, U where T : Pizza, U : HotDog, T.Topping : CuredMeat, U.Condiment == Deli<Pepper>.Mustard> (@inout Lunch<T>.Dinner<U>, @in T.Topping, Deli<Pepper>.Mustard) -> ()
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics16eatDinnerGenericyAA5LunchV0D0Vyx_q_Gz1d_7ToppingQz1tAA4DeliC7MustardOyAA6PepperV_G1utAA5PizzaRzAA6HotDogR_AA9CuredMeatAJRQAR9CondimentRt_r0_lF : $@convention(thin) <T, U where T : Pizza, U : HotDog, T.Topping : CuredMeat, U.Condiment == Deli<Pepper>.Mustard> (@inout Lunch<T>.Dinner<U>, @in T.Topping, Deli<Pepper>.Mustard) -> ()
|
||||
|
||||
func eatDinnerGeneric<T, U>(d: inout Lunch<T>.Dinner<U>, t: T.Topping, u: U.Condiment) {
|
||||
// Method call
|
||||
@@ -135,7 +135,7 @@ func eatDinnerGeneric<T, U>(d: inout Lunch<T>.Dinner<U>, t: T.Topping, u: U.Cond
|
||||
// Overloading concrete function with different bound generic arguments in parent type
|
||||
|
||||
// CHECK-LABEL: // nested_generics.eatDinnerConcrete (d : inout nested_generics.Lunch<nested_generics.Pizzas<nested_generics.ChiliFlakes>.NewYork>.Dinner<nested_generics.HotDogs.American>, t : nested_generics.Deli<nested_generics.ChiliFlakes>.Pepperoni, u : nested_generics.Deli<nested_generics.Pepper>.Mustard) -> ()
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics17eatDinnerConcreteyAA5LunchV0D0VyAA6PizzasV7NewYorkCyAA11ChiliFlakesV_G_AA7HotDogsC8AmericanVGz1d_AA4DeliC9PepperoniCyAL_G1tAS7MustardOyAA6PepperV_G1utF : $@convention(thin) (@inout Lunch<Pizzas<ChiliFlakes>.NewYork>.Dinner<HotDogs.American>, @owned Deli<ChiliFlakes>.Pepperoni, Deli<Pepper>.Mustard) -> ()
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics17eatDinnerConcreteyAA5LunchV0D0VyAA6PizzasV7NewYorkCyAA11ChiliFlakesV_G_AA7HotDogsC8AmericanVGz1d_AA4DeliC9PepperoniCyAL_G1tAU7MustardOyAA6PepperV_G1utF : $@convention(thin) (@inout Lunch<Pizzas<ChiliFlakes>.NewYork>.Dinner<HotDogs.American>, @owned Deli<ChiliFlakes>.Pepperoni, Deli<Pepper>.Mustard) -> ()
|
||||
|
||||
func eatDinnerConcrete(d: inout Lunch<Pizzas<ChiliFlakes>.NewYork>.Dinner<HotDogs.American>,
|
||||
t: Deli<ChiliFlakes>.Pepperoni,
|
||||
@@ -154,10 +154,10 @@ func eatDinnerConcrete(d: inout Lunch<Pizzas<ChiliFlakes>.NewYork>.Dinner<HotDog
|
||||
}
|
||||
|
||||
// CHECK-LABEL: // reabstraction thunk helper from @callee_owned (@owned nested_generics.Pizzas<nested_generics.ChiliFlakes>.NewYork) -> (@out nested_generics.HotDogs.American) to @callee_owned (@owned nested_generics.Pizzas<nested_generics.ChiliFlakes>.NewYork) -> (@unowned nested_generics.HotDogs.American)
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T015nested_generics6PizzasV7NewYorkCyAA11ChiliFlakesV_GAA7HotDogsC8AmericanVIxxr_AEyAG_GAKIxxd_TR : $@convention(thin) (@owned Pizzas<ChiliFlakes>.NewYork, @owned @callee_owned (@owned Pizzas<ChiliFlakes>.NewYork) -> @out HotDogs.American) -> HotDogs.American
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T015nested_generics6PizzasV7NewYorkCyAA11ChiliFlakesV_GAA7HotDogsC8AmericanVIxxr_AhLIxxd_TR : $@convention(thin) (@owned Pizzas<ChiliFlakes>.NewYork, @owned @callee_owned (@owned Pizzas<ChiliFlakes>.NewYork) -> @out HotDogs.American) -> HotDogs.American
|
||||
|
||||
// CHECK-LABEL: // nested_generics.eatDinnerConcrete (d : inout nested_generics.Lunch<nested_generics.Pizzas<nested_generics.Pepper>.NewYork>.Dinner<nested_generics.HotDogs.American>, t : nested_generics.Deli<nested_generics.Pepper>.Pepperoni, u : nested_generics.Deli<nested_generics.Pepper>.Mustard) -> ()
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics17eatDinnerConcreteyAA5LunchV0D0VyAA6PizzasV7NewYorkCyAA6PepperV_G_AA7HotDogsC8AmericanVGz1d_AA4DeliC9PepperoniCyAL_G1tAS7MustardOyAL_G1utF : $@convention(thin) (@inout Lunch<Pizzas<Pepper>.NewYork>.Dinner<HotDogs.American>, @owned Deli<Pepper>.Pepperoni, Deli<Pepper>.Mustard) -> ()
|
||||
// CHECK-LABEL: sil hidden @_T015nested_generics17eatDinnerConcreteyAA5LunchV0D0VyAA6PizzasV7NewYorkCyAA6PepperV_G_AA7HotDogsC8AmericanVGz1d_AA4DeliC9PepperoniCyAL_G1tAU7MustardOyAL_G1utF : $@convention(thin) (@inout Lunch<Pizzas<Pepper>.NewYork>.Dinner<HotDogs.American>, @owned Deli<Pepper>.Pepperoni, Deli<Pepper>.Mustard) -> ()
|
||||
|
||||
func eatDinnerConcrete(d: inout Lunch<Pizzas<Pepper>.NewYork>.Dinner<HotDogs.American>,
|
||||
t: Deli<Pepper>.Pepperoni,
|
||||
@@ -176,7 +176,7 @@ func eatDinnerConcrete(d: inout Lunch<Pizzas<Pepper>.NewYork>.Dinner<HotDogs.Ame
|
||||
}
|
||||
|
||||
// CHECK-LABEL: // reabstraction thunk helper from @callee_owned (@owned nested_generics.Pizzas<nested_generics.Pepper>.NewYork) -> (@out nested_generics.HotDogs.American) to @callee_owned (@owned nested_generics.Pizzas<nested_generics.Pepper>.NewYork) -> (@unowned nested_generics.HotDogs.American)
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T015nested_generics6PizzasV7NewYorkCyAA6PepperV_GAA7HotDogsC8AmericanVIxxr_AEyAG_GAKIxxd_TR : $@convention(thin) (@owned Pizzas<Pepper>.NewYork, @owned @callee_owned (@owned Pizzas<Pepper>.NewYork) -> @out HotDogs.American) -> HotDogs.American
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T015nested_generics6PizzasV7NewYorkCyAA6PepperV_GAA7HotDogsC8AmericanVIxxr_AhLIxxd_TR : $@convention(thin) (@owned Pizzas<Pepper>.NewYork, @owned @callee_owned (@owned Pizzas<Pepper>.NewYork) -> @out HotDogs.American) -> HotDogs.American
|
||||
|
||||
// CHECK-LABEL: // nested_generics.(calls () -> ()).(closure #1)
|
||||
// CHECK-LABEL: sil shared @_T015nested_generics5callsyyFAA7HotDogsC8AmericanVAA6PizzasV7NewYorkCyAA6PepperV_GcfU_ : $@convention(thin) (@owned Pizzas<Pepper>.NewYork) -> HotDogs.American
|
||||
@@ -223,9 +223,9 @@ class SubclassOfInner<T, U> : OuterRing<T>.InnerRing<U> {
|
||||
}
|
||||
|
||||
// CHECK-LABEL: // reabstraction thunk helper from @callee_owned (@owned nested_generics.Pizzas<nested_generics.Pepper>.NewYork) -> (@unowned nested_generics.HotDogs.American) to @callee_owned (@owned nested_generics.Pizzas<nested_generics.Pepper>.NewYork) -> (@out nested_generics.HotDogs.American)
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T015nested_generics6PizzasV7NewYorkCyAA6PepperV_GAA7HotDogsC8AmericanVIxxd_AEyAG_GAKIxxr_TR : $@convention(thin) (@owned Pizzas<Pepper>.NewYork, @owned @callee_owned (@owned Pizzas<Pepper>.NewYork) -> HotDogs.American) -> @out HotDogs.American
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T015nested_generics6PizzasV7NewYorkCyAA6PepperV_GAA7HotDogsC8AmericanVIxxd_AhLIxxr_TR : $@convention(thin) (@owned Pizzas<Pepper>.NewYork, @owned @callee_owned (@owned Pizzas<Pepper>.NewYork) -> HotDogs.American) -> @out HotDogs.American
|
||||
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015nested_generics9OuterRingC05InnerD0Cyx_qd__GAA30ProtocolWithGenericRequirementAAr__lAaFP6method1TQz_1UQzqd__tAJ1t_AL1uqd__1vtlFTW : $@convention(witness_method) <τ_0_0><τ_1_0><τ_2_0> (@in τ_0_0, @in τ_1_0, @in τ_2_0, @in_guaranteed OuterRing<τ_0_0>.InnerRing<τ_1_0>) -> (@out τ_0_0, @out τ_1_0, @out τ_2_0) {
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T015nested_generics9OuterRingC05InnerD0Cyx_qd__GAA30ProtocolWithGenericRequirementAAr__lAaGP6method1TQz_1UQzqd__tAK1t_AM1uqd__1vtlFTW : $@convention(witness_method) <τ_0_0><τ_1_0><τ_2_0> (@in τ_0_0, @in τ_1_0, @in τ_2_0, @in_guaranteed OuterRing<τ_0_0>.InnerRing<τ_1_0>) -> (@out τ_0_0, @out τ_1_0, @out τ_2_0) {
|
||||
// CHECK: bb0([[T:%[0-9]+]] : $*τ_0_0, [[U:%[0-9]+]] : $*τ_1_0, [[V:%[0-9]+]] : $*τ_2_0, [[TOut:%[0-9]+]] : $*τ_0_0, [[UOut:%[0-9]+]] : $*τ_1_0, [[VOut:%[0-9]+]] : $*τ_2_0, [[SELF:%[0-9]+]] : $*OuterRing<τ_0_0>.InnerRing<τ_1_0>):
|
||||
// CHECK: [[SELF_COPY:%[0-9]+]] = alloc_stack $OuterRing<τ_0_0>.InnerRing<τ_1_0>
|
||||
// CHECK: copy_addr [[SELF]] to [initialization] [[SELF_COPY]] : $*OuterRing<τ_0_0>.InnerRing<τ_1_0>
|
||||
|
||||
@@ -43,8 +43,8 @@ func getRawValue(ed: ErrorDomain) -> String {
|
||||
// CHECK-RAW: return [[STRING_RESULT]]
|
||||
|
||||
class ObjCTest {
|
||||
// CHECK-RAW-LABEL: sil hidden @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAFSgF : $@convention(method) (@owned Optional<ErrorDomain>, @guaranteed ObjCTest) -> @owned Optional<ErrorDomain> {
|
||||
// CHECK-RAW: sil hidden [thunk] @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAFSgFTo : $@convention(objc_method) (Optional<ErrorDomain>, ObjCTest) -> Optional<ErrorDomain> {
|
||||
// CHECK-RAW-LABEL: sil hidden @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAGF : $@convention(method) (@owned Optional<ErrorDomain>, @guaranteed ObjCTest) -> @owned Optional<ErrorDomain> {
|
||||
// CHECK-RAW: sil hidden [thunk] @_T07newtype8ObjCTestC19optionalPassThroughSC11ErrorDomainVSgAGFTo : $@convention(objc_method) (Optional<ErrorDomain>, ObjCTest) -> Optional<ErrorDomain> {
|
||||
@objc func optionalPassThrough(_ ed: ErrorDomain?) -> ErrorDomain? {
|
||||
return ed
|
||||
}
|
||||
|
||||
@@ -38,12 +38,12 @@ import Foundation
|
||||
return f(x)
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil hidden [thunk] @_T020objc_blocks_bridging3FooC3basSSSgSSSgSSSgc_SSSg1xtFTo : $@convention(objc_method) (@convention(block) (Optional<NSString>) -> @autoreleased Optional<NSString>, Optional<NSString>, Foo) -> @autoreleased Optional<NSString> {
|
||||
// CHECK-LABEL: sil hidden [thunk] @_T020objc_blocks_bridging3FooC3basSSSgAeEc_AE1xtFTo : $@convention(objc_method) (@convention(block) (Optional<NSString>) -> @autoreleased Optional<NSString>, Optional<NSString>, Foo) -> @autoreleased Optional<NSString> {
|
||||
// CHECK: bb0([[BLOCK:%.*]] : $@convention(block) (Optional<NSString>) -> @autoreleased Optional<NSString>, [[OPT_STRING:%.*]] : $Optional<NSString>, [[SELF:%.*]] : $Foo):
|
||||
// CHECK: [[BLOCK_COPY:%.*]] = copy_block [[BLOCK]]
|
||||
// CHECK: [[OPT_STRING_COPY:%.*]] = copy_value [[OPT_STRING]]
|
||||
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @_T0So8NSStringCSgABSgIyBya_SSSgSSSgIxxo_TR
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @_T0So8NSStringCSgACIyBya_SSSgADIxxo_TR
|
||||
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[BLOCK_COPY]])
|
||||
// CHECK: [[BORROWED_SELF_COPY:%.*]] = begin_borrow [[SELF_COPY]]
|
||||
// CHECK: [[NATIVE:%.*]] = function_ref @_T020objc_blocks_bridging3FooC3bas{{[_0-9a-zA-Z]*}}F : $@convention(method) (@owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>, @owned Optional<String>, @guaranteed Foo) -> @owned Optional<String>
|
||||
@@ -116,7 +116,7 @@ func callBlocks(_ x: Foo,
|
||||
|
||||
// CHECK: [[BORROWED_ARG0:%.*]] = begin_borrow [[ARG0]]
|
||||
// CHECK: [[BAS:%.*]] = class_method [volatile] [[BORROWED_ARG0]] : $Foo, #Foo.bas!1.foreign
|
||||
// CHECK: [[H_BLOCK_INVOKE:%.*]] = function_ref @_T0SSSgSSSgIxxo_So8NSStringCSgABSgIyBya_TR
|
||||
// CHECK: [[H_BLOCK_INVOKE:%.*]] = function_ref @_T0SSSgAAIxxo_So8NSStringCSgADIyBya_TR
|
||||
// CHECK: [[H_STACK_BLOCK:%.*]] = init_block_storage_header {{.*}}, invoke [[H_BLOCK_INVOKE]]
|
||||
// CHECK: [[H_BLOCK:%.*]] = copy_block [[H_STACK_BLOCK]]
|
||||
// CHECK: apply [[BAS]]([[H_BLOCK]]
|
||||
|
||||
@@ -39,20 +39,20 @@ func curry_pod(_ x: CurryTest) -> (Int) -> Int {
|
||||
func curry_bridged(_ x: CurryTest) -> (String!) -> String! {
|
||||
return x.bridged
|
||||
}
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying13curry_bridgedSQySSGSQySSGcSo9CurryTestCF : $@convention(thin) (@owned CurryTest) -> @owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying13curry_bridgedSQySSGACcSo9CurryTestCF : $@convention(thin) (@owned CurryTest) -> @owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>
|
||||
// CHECK: bb0([[ARG1:%.*]] : $CurryTest):
|
||||
// CHECK: [[BORROWED_ARG1:%.*]] = begin_borrow [[ARG1]]
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @[[THUNK_BAR_1:_T0So9CurryTestC7bridgedSQySSGSQySSGFTcTO]]
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @[[THUNK_BAR_1:_T0So9CurryTestC7bridgedSQySSGADFTcTO]]
|
||||
// CHECK: [[ARG1_COPY:%.*]] = copy_value [[BORROWED_ARG1]]
|
||||
// CHECK: [[FN:%.*]] = apply [[THUNK]]([[ARG1_COPY]])
|
||||
// CHECK: end_borrow [[BORROWED_ARG1]] from [[ARG1]]
|
||||
// CHECK: destroy_value [[ARG1]]
|
||||
// CHECK: return [[FN]]
|
||||
// CHECK: } // end sil function '_T013objc_currying13curry_bridgedSQySSGSQySSGcSo9CurryTestCF'
|
||||
// CHECK: } // end sil function '_T013objc_currying13curry_bridgedSQySSGACcSo9CurryTestCF'
|
||||
|
||||
// CHECK: sil shared [thunk] @[[THUNK_BAR_1]] : $@convention(thin) (@owned CurryTest) -> @owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>
|
||||
// CHECK: bb0([[ARG1:%.*]] : $CurryTest):
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @[[THUNK_BAR_2:_T0So9CurryTestC7bridgedSQySSGSQySSGFTO]]
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @[[THUNK_BAR_2:_T0So9CurryTestC7bridgedSQySSGADFTO]]
|
||||
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]]([[ARG1]])
|
||||
// CHECK: return [[FN]]
|
||||
// CHECK: } // end sil function '[[THUNK_BAR_1]]'
|
||||
@@ -143,7 +143,7 @@ func curry_pod_AnyObject(_ x: AnyObject) -> (Int) -> Int {
|
||||
}
|
||||
|
||||
// normalOwnership requires a thunk to bring the method to Swift conventions
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying31curry_normalOwnership_AnyObjectSQySo9CurryTestCGSQyADGcs0fG0_pF : $@convention(thin) (@owned AnyObject) -> @owned @callee_owned (@owned Optional<CurryTest>) -> @owned Optional<CurryTest> {
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying31curry_normalOwnership_AnyObjectSQySo9CurryTestCGAEcs0fG0_pF : $@convention(thin) (@owned AnyObject) -> @owned @callee_owned (@owned Optional<CurryTest>) -> @owned Optional<CurryTest> {
|
||||
// CHECK: bb0([[ANY:%.*]] : $AnyObject):
|
||||
// CHECK: [[BORROWED_ANY:%.*]] = begin_borrow [[ANY]]
|
||||
// CHECK: [[OPENED_ANY:%.*]] = open_existential_ref [[BORROWED_ANY]]
|
||||
@@ -152,16 +152,16 @@ func curry_pod_AnyObject(_ x: AnyObject) -> (Int) -> Int {
|
||||
// CHECK: [[HAS_METHOD]]([[METHOD:%.*]] : $@convention(objc_method) (Optional<CurryTest>, @opened({{.*}}) AnyObject) -> @autoreleased Optional<CurryTest>):
|
||||
// CHECK: [[OPENED_ANY_COPY_2:%.*]] = copy_value [[OPENED_ANY_COPY]]
|
||||
// CHECK: [[PA:%.*]] = partial_apply [[METHOD]]([[OPENED_ANY_COPY_2]])
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @_T0So9CurryTestCSgABSgIxyo_ABSgABSgIxxo_TR
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @_T0So9CurryTestCSgACIxyo_AcCIxxo_TR
|
||||
// CHECK: partial_apply [[THUNK]]([[PA]])
|
||||
// CHECK: } // end sil function '_T013objc_currying31curry_normalOwnership_AnyObjectSQySo9CurryTestCGSQyADGcs0fG0_pF'
|
||||
// CHECK: } // end sil function '_T013objc_currying31curry_normalOwnership_AnyObjectSQySo9CurryTestCGAEcs0fG0_pF'
|
||||
func curry_normalOwnership_AnyObject(_ x: AnyObject) -> (CurryTest!) -> CurryTest! {
|
||||
return x.normalOwnership!
|
||||
}
|
||||
|
||||
// weirdOwnership is NS_RETURNS_RETAINED and NS_CONSUMES_SELF so already
|
||||
// follows Swift conventions
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying30curry_weirdOwnership_AnyObjectSQySo9CurryTestCGSQyADGcs0fG0_pF : $@convention(thin) (@owned AnyObject) -> @owned @callee_owned (@owned Optional<CurryTest>) -> @owned Optional<CurryTest>
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying30curry_weirdOwnership_AnyObjectSQySo9CurryTestCGAEcs0fG0_pF : $@convention(thin) (@owned AnyObject) -> @owned @callee_owned (@owned Optional<CurryTest>) -> @owned Optional<CurryTest>
|
||||
// CHECK: bb0([[ANY:%.*]] : $AnyObject):
|
||||
// CHECK: [[BORROWED_ANY:%.*]] = begin_borrow [[ANY]]
|
||||
// CHECK: [[OPENED_ANY:%.*]] = open_existential_ref [[BORROWED_ANY]]
|
||||
@@ -170,13 +170,13 @@ func curry_normalOwnership_AnyObject(_ x: AnyObject) -> (CurryTest!) -> CurryTes
|
||||
// CHECK: bb1([[METHOD:%.*]] : $@convention(objc_method) (@owned Optional<CurryTest>, @owned @opened({{.*}}) AnyObject) -> @owned Optional<CurryTest>):
|
||||
// CHECK: [[OPENED_ANY_COPY_2:%.*]] = copy_value [[OPENED_ANY_COPY]]
|
||||
// CHECK: partial_apply [[METHOD]]([[OPENED_ANY_COPY_2]])
|
||||
// CHECK: } // end sil function '_T013objc_currying30curry_weirdOwnership_AnyObjectSQySo9CurryTestCGSQyADGcs0fG0_pF'
|
||||
// CHECK: } // end sil function '_T013objc_currying30curry_weirdOwnership_AnyObjectSQySo9CurryTestCGAEcs0fG0_pF'
|
||||
func curry_weirdOwnership_AnyObject(_ x: AnyObject) -> (CurryTest!) -> CurryTest! {
|
||||
return x.weirdOwnership!
|
||||
}
|
||||
|
||||
// bridged requires a thunk to handle bridging conversions
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying23curry_bridged_AnyObjectSQySSGSQySSGcs0eF0_pF : $@convention(thin) (@owned AnyObject) -> @owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>
|
||||
// CHECK-LABEL: sil hidden @_T013objc_currying23curry_bridged_AnyObjectSQySSGACcs0eF0_pF : $@convention(thin) (@owned AnyObject) -> @owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>
|
||||
// CHECK: bb0([[ANY:%.*]] : $AnyObject):
|
||||
// CHECK: [[BORROWED_ANY:%.*]] = begin_borrow [[ANY]]
|
||||
// CHECK: [[OPENED_ANY:%.*]] = open_existential_ref [[BORROWED_ANY]]
|
||||
@@ -185,9 +185,9 @@ func curry_weirdOwnership_AnyObject(_ x: AnyObject) -> (CurryTest!) -> CurryTest
|
||||
// CHECK: [[HAS_METHOD]]([[METHOD:%.*]] : $@convention(objc_method) (Optional<NSString>, @opened({{.*}}) AnyObject) -> @autoreleased Optional<NSString>):
|
||||
// CHECK: [[OPENED_ANY_COPY_2:%.*]] = copy_value [[OPENED_ANY_COPY]]
|
||||
// CHECK: [[PA:%.*]] = partial_apply [[METHOD]]([[OPENED_ANY_COPY_2]])
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @_T0So8NSStringCSgABSgIxyo_SSSgSSSgIxxo_TR
|
||||
// CHECK: [[THUNK:%.*]] = function_ref @_T0So8NSStringCSgACIxyo_SSSgADIxxo_TR
|
||||
// CHECK: partial_apply [[THUNK]]([[PA]])
|
||||
// CHECK: } // end sil function '_T013objc_currying23curry_bridged_AnyObjectSQySSGSQySSGcs0eF0_pF'
|
||||
// CHECK: } // end sil function '_T013objc_currying23curry_bridged_AnyObjectSQySSGACcs0eF0_pF'
|
||||
func curry_bridged_AnyObject(_ x: AnyObject) -> (String!) -> String! {
|
||||
return x.bridged!
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ func testClonable(c: Clonable) {
|
||||
// CHECK: [[THUNK:%.*]] = partial_apply [[THUNK_FN]]<@opened("{{.*}}") Clonable>({{.*}}) : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out τ_0_0) -> @out Clonable
|
||||
let _: () -> Clonable = c.clone
|
||||
|
||||
// CHECK: [[THUNK_FN:%.*]] = function_ref @_T0xSgIxr_22partial_apply_protocol8Clonable_pSgIxr_AaBRzlTR : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
// CHECK: [[THUNK_FN:%.*]] = function_ref @_T0xSgIxr_22partial_apply_protocol8Clonable_pSgIxr_AbCRzlTR : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
// CHECK: [[THUNK:%.*]] = partial_apply [[THUNK_FN]]<@opened("{{.*}}") Clonable>({{.*}}) : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
let _: () -> Clonable? = c.maybeClone
|
||||
|
||||
@@ -51,7 +51,7 @@ func testClonable(c: Clonable) {
|
||||
|
||||
// FIXME: This is horribly inefficient, too much alloc_stack / copy_addr!
|
||||
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T0xSgIxr_22partial_apply_protocol8Clonable_pSgIxr_AaBRzlTR : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T0xSgIxr_22partial_apply_protocol8Clonable_pSgIxr_AbCRzlTR : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
// CHECK: bb0(%0 : $*Optional<Clonable>, %1 : $@callee_owned () -> @out Optional<τ_0_0>):
|
||||
// CHECK-NEXT: [[INNER_RESULT:%.*]] = alloc_stack $Optional<τ_0_0>
|
||||
// CHECK-NEXT: apply %1([[INNER_RESULT]])
|
||||
@@ -103,7 +103,7 @@ func testClonableInGenericContext<T>(c: Clonable, t: T) {
|
||||
// CHECK: [[THUNK:%.*]] = partial_apply [[THUNK_FN]]<@opened("{{.*}}") Clonable>({{.*}}) : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out τ_0_0) -> @out Clonable
|
||||
let _: () -> Clonable = c.clone
|
||||
|
||||
// CHECK: [[THUNK_FN:%.*]] = function_ref @_T0xSgIxr_22partial_apply_protocol8Clonable_pSgIxr_AaBRzlTR : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
// CHECK: [[THUNK_FN:%.*]] = function_ref @_T0xSgIxr_22partial_apply_protocol8Clonable_pSgIxr_AbCRzlTR : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
// CHECK: [[THUNK:%.*]] = partial_apply [[THUNK_FN]]<@opened("{{.*}}") Clonable>({{.*}}) : $@convention(thin) <τ_0_0 where τ_0_0 : Clonable> (@owned @callee_owned () -> @out Optional<τ_0_0>) -> @out Optional<Clonable>
|
||||
let _: () -> Clonable? = c.maybeClone
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public class CC<T : PP> {
|
||||
|
||||
// CHECK-LABEL: sil hidden [_specialize exported: false, kind: full, where T == Int, U == Float] @_T015specialize_attr0A4Thisyx_q_1utr0_lF : $@convention(thin) <T, U> (@in T, @in U) -> () {
|
||||
|
||||
// CHECK-LABEL: sil [noinline] [_specialize exported: false, kind: full, where T == RR, U == SS] @_T015specialize_attr2CCC3fooqd___AA2GGVyxGtqd___AFyxG1gtAA2QQRd__lF : $@convention(method) <T where T : PP><U where U : QQ> (@in U, GG<T>, @guaranteed CC<T>) -> (@out U, GG<T>) {
|
||||
// CHECK-LABEL: sil [noinline] [_specialize exported: false, kind: full, where T == RR, U == SS] @_T015specialize_attr2CCC3fooqd___AA2GGVyxGtqd___AG1gtAA2QQRd__lF : $@convention(method) <T where T : PP><U where U : QQ> (@in U, GG<T>, @guaranteed CC<T>) -> (@out U, GG<T>) {
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Test user-specialized subscript accessors.
|
||||
|
||||
@@ -30,7 +30,7 @@ class GenericSub<U: AnyObject>: GenericSuper<U>, Barrable {
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T033vtable_thunks_reabstraction_final10GenericSubCyxGAA8BarrableAAs9AnyObjectRzlAaDP3foo3BarQzSgAIFTW
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T033vtable_thunks_reabstraction_final10GenericSubCyxGAA8BarrableAAs9AnyObjectRzlAaEP3foo3BarQzSgAJFTW
|
||||
// CHECK: class_method {{%.*}} : $GenericSub<τ_0_0>, #GenericSub.foo!1 {{.*}}, $@convention(method) <τ_0_0 where τ_0_0 : AnyObject> (@in τ_0_0, @guaranteed GenericSub<τ_0_0>) -> @out Optional<τ_0_0>
|
||||
|
||||
class C {}
|
||||
|
||||
@@ -19,7 +19,7 @@ struct Foo: Fooable {
|
||||
}
|
||||
|
||||
// rdar://problem/19049566
|
||||
// CHECK-LABEL: sil [transparent] [thunk] @_T017witness_same_type14LazySequenceOfVyxq_Gs0E0AAsADRz8Iterator_7ElementQZRs_r0_lsADP04makeG0AEQzyFTW : $@convention(witness_method) <τ_0_0, τ_0_1 where τ_0_0 : Sequence, τ_0_1 == τ_0_0.Iterator.Element> (@in_guaranteed LazySequenceOf<τ_0_0, τ_0_1>) -> @out AnyIterator<τ_0_1>
|
||||
// CHECK-LABEL: sil [transparent] [thunk] @_T017witness_same_type14LazySequenceOfVyxq_Gs0E0AAsAERz8Iterator_7ElementQZRs_r0_lsAEP04makeG0AFQzyFTW : $@convention(witness_method) <τ_0_0, τ_0_1 where τ_0_0 : Sequence, τ_0_1 == τ_0_0.Iterator.Element> (@in_guaranteed LazySequenceOf<τ_0_0, τ_0_1>) -> @out AnyIterator<τ_0_1>
|
||||
public struct LazySequenceOf<SS : Sequence, A where SS.Iterator.Element == A> : Sequence {
|
||||
public func makeIterator() -> AnyIterator<A> {
|
||||
var opt: AnyIterator<A>?
|
||||
|
||||
@@ -298,11 +298,11 @@ func <~> <R: AssocReqt>(x: ConformingGeneric<R>, y: ConformingGeneric<R>) {}
|
||||
// TABLE-NEXT: associated_type AssocType: SomeAssoc
|
||||
// TABLE-NEXT: associated_type AssocWithReqt: R
|
||||
// TABLE-NEXT: associated_type_protocol (AssocWithReqt: AssocReqt): dependent
|
||||
// TABLE-NEXT: method #AnyProtocol.method!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP6method{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.generic!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP7generic{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.assocTypesMethod!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP16assocTypesMethod{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.staticMethod!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP12staticMethod{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: method #AnyProtocol."<~>"!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP3ltgoi{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: method #AnyProtocol.method!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP6method{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.generic!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP7generic{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.assocTypesMethod!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP16assocTypesMethod{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.staticMethod!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP12staticMethod{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: method #AnyProtocol."<~>"!1: {{.*}} : @_T014witness_tables17ConformingGenericVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP3ltgoi{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: }
|
||||
|
||||
protocol AnotherProtocol {}
|
||||
@@ -325,11 +325,11 @@ func <~> <AA: AnotherProtocol, BB: AnotherProtocol>(x: AA, y: BB) {}
|
||||
// TABLE-NEXT: associated_type AssocType: SomeAssoc
|
||||
// TABLE-NEXT: associated_type AssocWithReqt: S
|
||||
// TABLE-NEXT: associated_type_protocol (AssocWithReqt: AssocReqt): dependent
|
||||
// TABLE-NEXT: method #AnyProtocol.method!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP6method{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.generic!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP7generic{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.assocTypesMethod!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP16assocTypesMethod{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.staticMethod!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP12staticMethod{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: method #AnyProtocol."<~>"!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaDP3ltgoi{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: method #AnyProtocol.method!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP6method{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.generic!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP7generic{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.assocTypesMethod!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP16assocTypesMethod{{[_0-9a-zA-Z]*}}FTW
|
||||
// TABLE-NEXT: method #AnyProtocol.staticMethod!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP12staticMethod{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: method #AnyProtocol."<~>"!1: {{.*}} : @_T014witness_tables025ConformingGenericWithMoreD9WitnessesVyxGAA11AnyProtocolAaA9AssocReqtRzlAaEP3ltgoi{{[_0-9a-zA-Z]*}}FZTW
|
||||
// TABLE-NEXT: }
|
||||
|
||||
protocol InheritedProtocol1 : AnyProtocol {
|
||||
|
||||
@@ -433,12 +433,12 @@ protocol GenericParameterNameCollisionProtocol {
|
||||
struct GenericParameterNameCollision<T: HasAssoc> :
|
||||
GenericParameterNameCollisionProtocol {
|
||||
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T09witnesses29GenericParameterNameCollisionVyxGAA0bcdE8ProtocolAaA8HasAssocRzlAaDP3fooyqd__lFTW : $@convention(witness_method) <τ_0_0 where τ_0_0 : HasAssoc><τ_1_0> (@in τ_1_0, @in_guaranteed GenericParameterNameCollision<τ_0_0>) -> () {
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T09witnesses29GenericParameterNameCollisionVyxGAA0bcdE8ProtocolAaA8HasAssocRzlAaEP3fooyqd__lFTW : $@convention(witness_method) <τ_0_0 where τ_0_0 : HasAssoc><τ_1_0> (@in τ_1_0, @in_guaranteed GenericParameterNameCollision<τ_0_0>) -> () {
|
||||
// CHECK: bb0(%0 : $*τ_1_0, %1 : $*GenericParameterNameCollision<τ_0_0>):
|
||||
// CHECK: apply {{%.*}}<τ_0_0, τ_1_0>
|
||||
func foo<U>(_ x: U) {}
|
||||
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T09witnesses29GenericParameterNameCollisionVyxGAA0bcdE8ProtocolAaA8HasAssocRzlAaDP3bary6Assoc2Qzqd__clFTW : $@convention(witness_method) <τ_0_0 where τ_0_0 : HasAssoc><τ_1_0> (@owned @callee_owned (@in τ_1_0) -> @out τ_0_0.Assoc, @in_guaranteed GenericParameterNameCollision<τ_0_0>) -> () {
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T09witnesses29GenericParameterNameCollisionVyxGAA0bcdE8ProtocolAaA8HasAssocRzlAaEP3bary6Assoc2Qzqd__clFTW : $@convention(witness_method) <τ_0_0 where τ_0_0 : HasAssoc><τ_1_0> (@owned @callee_owned (@in τ_1_0) -> @out τ_0_0.Assoc, @in_guaranteed GenericParameterNameCollision<τ_0_0>) -> () {
|
||||
// CHECK: bb0(%0 : $@callee_owned (@in τ_1_0) -> @out τ_0_0.Assoc, %1 : $*GenericParameterNameCollision<τ_0_0>):
|
||||
// CHECK: apply {{%.*}}<τ_0_0, τ_1_0>
|
||||
func bar<V>(_ x: (V) -> T.Assoc) {}
|
||||
@@ -507,7 +507,7 @@ class CrashableBase {
|
||||
func crash() {}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T09witnesses16GenericCrashableCyxGAA0C0AAlAaDP5crashyyFTW : $@convention(witness_method) <τ_0_0> (@in_guaranteed GenericCrashable<τ_0_0>) -> ()
|
||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_T09witnesses16GenericCrashableCyxGAA0C0AAlAaEP5crashyyFTW : $@convention(witness_method) <τ_0_0> (@in_guaranteed GenericCrashable<τ_0_0>) -> ()
|
||||
// CHECK: bb0(%0 : $*GenericCrashable<τ_0_0>):
|
||||
// CHECK-NEXT: [[BOX:%.*]] = alloc_stack $GenericCrashable<τ_0_0>
|
||||
// CHECK-NEXT: copy_addr %0 to [initialization] [[BOX]] : $*GenericCrashable<τ_0_0>
|
||||
|
||||
@@ -81,7 +81,7 @@ bb0(%0 : $*Container, %1 : $*Container.Elt, %2 : $G<Container>):
|
||||
}
|
||||
|
||||
// getGenericContainer<A where ...> (G<A>, e : A.Elt) -> A
|
||||
sil [_specialize where T == S] @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AFRQlF : $@convention(thin) <T where T : HasElt, T.Elt : AnElt> (G<T>, @in T.Elt) -> @out T {
|
||||
sil [_specialize where T == S] @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AGRQlF : $@convention(thin) <T where T : HasElt, T.Elt : AnElt> (G<T>, @in T.Elt) -> @out T {
|
||||
bb0(%0 : $*T, %1 : $G<T>, %2 : $*T.Elt):
|
||||
// function_ref G.getContainer(A.Elt) -> A
|
||||
%5 = function_ref @_T016eager_specialize1GV12getContainerx3EltQzF : $@convention(method) <τ_0_0 where τ_0_0 : HasElt> (@in τ_0_0.Elt, G<τ_0_0>) -> @out τ_0_0
|
||||
@@ -92,13 +92,13 @@ bb0(%0 : $*T, %1 : $G<T>, %2 : $*T.Elt):
|
||||
|
||||
// Specialization getGenericContainer<S, X>
|
||||
//
|
||||
// CHECK-LABEL: sil shared @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AFRQlF4main1SV_Tg5 : $@convention(thin) (G<S>, X) -> S {
|
||||
// CHECK-LABEL: sil shared @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AGRQlF4main1SV_Tg5 : $@convention(thin) (G<S>, X) -> S {
|
||||
// CHECK: bb0(%0 : $G<S>, %1 : $X):
|
||||
// CHECK: return %{{.*}} : $S
|
||||
|
||||
// Generic with specialized dispatch. No more [specialize] attribute.
|
||||
//
|
||||
// CHECK-LABEL: sil @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AFRQlF : $@convention(thin) <T where T : HasElt, T.Elt : AnElt> (G<T>, @in T.Elt) -> @out T {
|
||||
// CHECK-LABEL: sil @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AGRQlF : $@convention(thin) <T where T : HasElt, T.Elt : AnElt> (G<T>, @in T.Elt) -> @out T {
|
||||
// CHECK: bb0(%0 : $*T, %1 : $G<T>, %2 : $*T.Elt):
|
||||
// CHECK: %3 = metatype $@thick T.Type
|
||||
// CHECK: %4 = metatype $@thick S.Type
|
||||
@@ -122,7 +122,7 @@ bb0(%0 : $*T, %1 : $G<T>, %2 : $*T.Elt):
|
||||
// CHECK: %16 = unchecked_addr_cast %2 : $*T.Elt to $*X
|
||||
// CHECK: %17 = load %16 : $*X
|
||||
// function_ref specialized getGenericContainer<A where ...> (G<A>, e : A.Elt) -> A
|
||||
// CHECK: %18 = function_ref @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AFRQlF4main1SV_Tg5 : $@convention(thin) (G<S>, X) -> S
|
||||
// CHECK: %18 = function_ref @_T016eager_specialize19getGenericContainerxAA1GVyxG_3EltQz1etAA03HasF0RzAA02AnF0AGRQlF4main1SV_Tg5 : $@convention(thin) (G<S>, X) -> S
|
||||
// CHECK: %19 = apply %18(%15, %17) : $@convention(thin) (G<S>, X) -> S
|
||||
// CHECK: store %19 to %14 : $*S
|
||||
// CHECK: %21 = tuple ()
|
||||
|
||||
@@ -54,4 +54,4 @@ class CC<T : PP> {
|
||||
|
||||
// CHECK-DAG: sil hidden [fragile] [_specialize exported: false, kind: full, where T == Int, U == Float] @_T014serialize_attr14specializeThisyx_q_1utr0_lF : $@convention(thin) <T, U> (@in T, @in U) -> () {
|
||||
|
||||
// CHECK-DAG: sil hidden [fragile] [noinline] [_specialize exported: false, kind: full, where T == RR, U == SS] @_T014serialize_attr2CCC3fooqd___AA2GGVyxGtqd___AFyxG1gtAA2QQRd__lF : $@convention(method) <T where T : PP><U where U : QQ> (@in U, GG<T>, @guaranteed CC<T>) -> (@out U, GG<T>) {
|
||||
// CHECK-DAG: sil hidden [fragile] [noinline] [_specialize exported: false, kind: full, where T == RR, U == SS] @_T014serialize_attr2CCC3fooqd___AA2GGVyxGtqd___AG1gtAA2QQRd__lF : $@convention(method) <T where T : PP><U where U : QQ> (@in U, GG<T>, @guaranteed CC<T>) -> (@out U, GG<T>) {
|
||||
|
||||
@@ -374,7 +374,7 @@ Runtime.test("Generic class ObjC runtime names") {
|
||||
expectEqual("_T01a12GenericClassCySo9NSCopying_AA9ProtocolAAA0D1BpGD",
|
||||
NSStringFromClass(GenericClass<ProtocolB & NSCopying & ProtocolA>.self))
|
||||
|
||||
expectEqual("_T01a17MultiGenericClassCyAA0B6StructVySiGAA0B4EnumOyAGySiGGGD",
|
||||
expectEqual("_T01a17MultiGenericClassCyAA0B6StructVySiGAA0B4EnumOyAHySiGGGD",
|
||||
NSStringFromClass(MultiGenericClass<GenericStruct<Int>,
|
||||
GenericEnum<GenericEnum<Int>>>.self))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user