mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Turn on +0 self by default.
The only caveat is that: 1. We do not properly recognize when we have a let binding and we perform a guaranteed dynamic call. In such a case, we add an extra retain, release pair around the call. In order to get that case I will need to refactor some code in Callee. I want to make this change, but not at the expense of getting the rest of this work in. 2. Some of the protocol witness thunks generated have unnecessary retains or releases in a similar manner. But this is a good first step. I am going to send a large follow up email with all of the relevant results, so I can let the bots chew on this a little bit. rdar://19933044 Swift SVN r27241
This commit is contained in:
@@ -90,7 +90,7 @@ public:
|
|||||||
bool EnableFuncSigOpts = true;
|
bool EnableFuncSigOpts = true;
|
||||||
|
|
||||||
/// Should we emit self as a guaranteed parameter?
|
/// Should we emit self as a guaranteed parameter?
|
||||||
bool EnableGuaranteedSelf = false;
|
bool EnableGuaranteedSelf = true;
|
||||||
|
|
||||||
/// Instrument code to generate profiling information.
|
/// Instrument code to generate profiling information.
|
||||||
bool GenerateProfile = false;
|
bool GenerateProfile = false;
|
||||||
|
|||||||
@@ -2719,6 +2719,20 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasGuaranteedSelfParam() const {
|
||||||
|
switch (getRepresentation()) {
|
||||||
|
case Representation::Thick:
|
||||||
|
case Representation::Block:
|
||||||
|
case Representation::Thin:
|
||||||
|
case Representation::CFunctionPointer:
|
||||||
|
case Representation::ObjCMethod:
|
||||||
|
return false;
|
||||||
|
case Representation::Method:
|
||||||
|
case Representation::WitnessMethod:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// True if the function representation carries context.
|
/// True if the function representation carries context.
|
||||||
bool hasContext() const {
|
bool hasContext() const {
|
||||||
switch (getRepresentation()) {
|
switch (getRepresentation()) {
|
||||||
|
|||||||
@@ -2647,13 +2647,10 @@ public:
|
|||||||
|
|
||||||
void verifySILFunctionType(CanSILFunctionType FTy) {
|
void verifySILFunctionType(CanSILFunctionType FTy) {
|
||||||
// Make sure that if FTy's calling convention implies that it must have a
|
// Make sure that if FTy's calling convention implies that it must have a
|
||||||
// self parameter, it is not empty if we do not have canonical sil.
|
// self parameter.
|
||||||
if (F.getModule().getStage() == SILStage::Raw &&
|
require(!FTy->hasSelfParam() || !FTy->getParameters().empty(),
|
||||||
FTy->hasSelfParam()) {
|
|
||||||
require(!FTy->getParameters().empty(),
|
|
||||||
"Functions with a calling convention with self parameter must "
|
"Functions with a calling convention with self parameter must "
|
||||||
"have at least one argument for self.");
|
"have at least one argument for self.");
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure that FTy does not have any out parameters except for the first
|
// Make sure that FTy does not have any out parameters except for the first
|
||||||
// parameter.
|
// parameter.
|
||||||
@@ -2784,6 +2781,40 @@ public:
|
|||||||
SILVisitor::visitSILBasicBlock(BB);
|
SILVisitor::visitSILBasicBlock(BB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void verifySILSelfParameterType(SILFunction *F, CanSILFunctionType FTy) {
|
||||||
|
SILModule &M = F->getModule();
|
||||||
|
SILParameterInfo PInfo = FTy->getSelfParameter();
|
||||||
|
CanType CTy = PInfo.getType();
|
||||||
|
SILType Ty = SILType::getPrimitiveObjectType(CTy);
|
||||||
|
|
||||||
|
// We do not care about trivial parameters (for now). There seem to be
|
||||||
|
// cases where we lower them as unowned.
|
||||||
|
//
|
||||||
|
// *NOTE* We do not run this check when we have a generic type since
|
||||||
|
// *generic types do not have type lowering and are always treated as
|
||||||
|
// *non-trivial since we do not know the type.
|
||||||
|
if (CTy->hasArchetype() || CTy->isDependentType() ||
|
||||||
|
M.getTypeLowering(Ty).isTrivial())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If we don't have a decl ref, return.
|
||||||
|
auto DeclRef = M.lookUpDeclRef(F);
|
||||||
|
if (!DeclRef)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If this function is a constructor or destructor, bail. These have @owned
|
||||||
|
// parameters.
|
||||||
|
if (DeclRef.getValue().isConstructor() || DeclRef.getValue().isDestructor())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Otherwise, if this function type has a guaranteed self parameter type,
|
||||||
|
// make sure that we have a +0 self param.
|
||||||
|
require(!FTy->getExtInfo().hasGuaranteedSelfParam() ||
|
||||||
|
PInfo.isGuaranteed() || PInfo.isIndirectInOut(),
|
||||||
|
"Function with guaranteed self, but self param is not "
|
||||||
|
"+0?!");
|
||||||
|
}
|
||||||
|
|
||||||
void visitSILFunction(SILFunction *F) {
|
void visitSILFunction(SILFunction *F) {
|
||||||
PrettyStackTraceSILFunction stackTrace("verifying", F);
|
PrettyStackTraceSILFunction stackTrace("verifying", F);
|
||||||
|
|
||||||
@@ -2802,6 +2833,13 @@ public:
|
|||||||
CanSILFunctionType FTy = F->getLoweredFunctionType();
|
CanSILFunctionType FTy = F->getLoweredFunctionType();
|
||||||
verifySILFunctionType(FTy);
|
verifySILFunctionType(FTy);
|
||||||
|
|
||||||
|
// If this function has a self parameter, make sure that it has a +0 calling
|
||||||
|
// convention. This can not be done for general function types, since
|
||||||
|
// function_ref's SILFunctionTypes do not have archetypes associated with
|
||||||
|
// it.
|
||||||
|
if (F->getModule().getStage() == SILStage::Canonical && FTy->hasSelfParam())
|
||||||
|
verifySILSelfParameterType(F, FTy);
|
||||||
|
|
||||||
if (F->isExternalDeclaration()) {
|
if (F->isExternalDeclaration()) {
|
||||||
assert(F->isAvailableExternally() &&
|
assert(F->isAvailableExternally() &&
|
||||||
"external declaration of internal SILFunction not allowed");
|
"external declaration of internal SILFunction not allowed");
|
||||||
|
|||||||
@@ -1643,8 +1643,13 @@ void SILGenFunction::emitProtocolWitness(ProtocolConformance *conformance,
|
|||||||
|
|
||||||
if (selfInstanceType.getClassOrBoundGenericClass()) {
|
if (selfInstanceType.getClassOrBoundGenericClass()) {
|
||||||
if (selfInstanceType != witnessInstanceType) {
|
if (selfInstanceType != witnessInstanceType) {
|
||||||
SILValue upcast = B.createUpcast(loc, selfOrigParam.getValue(),
|
// Match the category of selfOrigParam. We leave the loading to
|
||||||
SILType::getPrimitiveObjectType(witnessType));
|
// TranslateArguments.
|
||||||
|
auto upcastCategory = selfOrigParam.getValue().getType().getCategory();
|
||||||
|
SILType upcastTy =
|
||||||
|
SILType::getPrimitiveType(witnessType, upcastCategory);
|
||||||
|
SILValue upcast =
|
||||||
|
B.createUpcast(loc, selfOrigParam.getValue(), upcastTy);
|
||||||
selfOrigParam = ManagedValue(upcast, selfOrigParam.getCleanup());
|
selfOrigParam = ManagedValue(upcast, selfOrigParam.getCleanup());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1053,10 +1053,15 @@ void LifetimeChecker::handleLoadUseFailure(const DIMemoryUse &Use,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the upcast is used by a class_method + apply, then this is a call of
|
// If the upcast is used by a class_method + apply, then this is a call of a
|
||||||
// a superclass method or property accessor.
|
// superclass method or property accessor. If we have a guaranteed method,
|
||||||
|
// we will have a release due to a missing optimization in SILGen that will
|
||||||
|
// be removed.
|
||||||
|
//
|
||||||
|
// TODO: Implement the SILGen fixes so this can be removed.
|
||||||
ClassMethodInst *CMI = nullptr;
|
ClassMethodInst *CMI = nullptr;
|
||||||
ApplyInst *AI = nullptr;
|
ApplyInst *AI = nullptr;
|
||||||
|
SILInstruction *Release = nullptr;
|
||||||
for (auto UI : SILValue(UCI, 0).getUses()) {
|
for (auto UI : SILValue(UCI, 0).getUses()) {
|
||||||
auto *User = UI->getUser();
|
auto *User = UI->getUser();
|
||||||
if (auto *TAI = dyn_cast<ApplyInst>(User)) {
|
if (auto *TAI = dyn_cast<ApplyInst>(User)) {
|
||||||
@@ -1072,12 +1077,27 @@ void LifetimeChecker::handleLoadUseFailure(const DIMemoryUse &Use,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isa<ReleaseValueInst>(User) || isa<StrongReleaseInst>(User)) {
|
||||||
|
if (!Release) {
|
||||||
|
Release = User;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Not a pattern we recognize, conservatively generate a generic
|
// Not a pattern we recognize, conservatively generate a generic
|
||||||
// diagnostic.
|
// diagnostic.
|
||||||
CMI = nullptr;
|
CMI = nullptr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we have a release, make sure that AI is guaranteed. If it is not, emit
|
||||||
|
// the generic error that we would emit before.
|
||||||
|
//
|
||||||
|
// That is the only case where we support pattern matching a release.
|
||||||
|
if (Release &&
|
||||||
|
!AI->getSubstCalleeType()->getExtInfo().hasGuaranteedSelfParam())
|
||||||
|
CMI = nullptr;
|
||||||
|
|
||||||
if (AI && CMI) {
|
if (AI && CMI) {
|
||||||
// TODO: Could handle many other members more specifically.
|
// TODO: Could handle many other members more specifically.
|
||||||
auto *Decl = CMI->getMember().getDecl();
|
auto *Decl = CMI->getMember().getDecl();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class A {
|
|||||||
// CHECK: sil hidden @_TToFC8optional1A3foofS0_FT_GSqSS_ : $@cc(objc_method) @thin (A) -> @autoreleased Optional<NSString>
|
// CHECK: sil hidden @_TToFC8optional1A3foofS0_FT_GSqSS_ : $@cc(objc_method) @thin (A) -> @autoreleased Optional<NSString>
|
||||||
// CHECK: [[T0:%.*]] = function_ref @_TFC8optional1A3foofS0_FT_GSqSS_
|
// CHECK: [[T0:%.*]] = function_ref @_TFC8optional1A3foofS0_FT_GSqSS_
|
||||||
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]](%0)
|
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]](%0)
|
||||||
|
// CHECK-NEXT: strong_release
|
||||||
// CHECK-NEXT: [[TMP_OPTNSSTR:%.*]] = alloc_stack $Optional<NSString>
|
// CHECK-NEXT: [[TMP_OPTNSSTR:%.*]] = alloc_stack $Optional<NSString>
|
||||||
// CHECK-NEXT: [[TMP_OPTSTR:%.*]] = alloc_stack $Optional<String>
|
// CHECK-NEXT: [[TMP_OPTSTR:%.*]] = alloc_stack $Optional<String>
|
||||||
// CHECK-NEXT: store [[T1]] to [[TMP_OPTSTR]]#1
|
// CHECK-NEXT: store [[T1]] to [[TMP_OPTSTR]]#1
|
||||||
@@ -64,6 +65,7 @@ class A {
|
|||||||
// CHECK-NEXT: dealloc_stack [[TMP_OPTSTR]]
|
// CHECK-NEXT: dealloc_stack [[TMP_OPTSTR]]
|
||||||
// CHECK: [[T1:%.*]] = function_ref @_TFC8optional1A3barfS0_FT1xGSqSS__T_
|
// CHECK: [[T1:%.*]] = function_ref @_TFC8optional1A3barfS0_FT1xGSqSS__T_
|
||||||
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], %1)
|
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], %1)
|
||||||
|
// CHECK-NEXT: strong_release %1
|
||||||
// CHECK-NEXT: return [[T2]] : $()
|
// CHECK-NEXT: return [[T2]] : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ func main(x: Int) -> Void
|
|||||||
{
|
{
|
||||||
var result = my_class.do_something(x)
|
var result = my_class.do_something(x)
|
||||||
print ("Here is something you might consider doing: \(result).\n")
|
print ("Here is something you might consider doing: \(result).\n")
|
||||||
|
// CHECK: call {{.*}} @swift_release {{.*}}
|
||||||
// CHECK: call {{.*}} @swift_release {{.*}}, !dbg ![[CLOSURE_END:.*]]
|
// CHECK: call {{.*}} @swift_release {{.*}}, !dbg ![[CLOSURE_END:.*]]
|
||||||
// CHECK-NEXT: ret void, !dbg ![[CLOSURE_END]]
|
// CHECK-NEXT: ret void, !dbg ![[CLOSURE_END]]
|
||||||
// CHECK: ![[CLOSURE_END]] = !MDLocation(line: [[@LINE+1]],
|
// CHECK: ![[CLOSURE_END]] = !MDLocation(line: [[@LINE+1]],
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ public func ifelseexpr() -> Int {
|
|||||||
// CHECK: [[X:%.*]] = call %C6return1X* @_TFC6return1XCfMS0_FT1iSi_S0_(i{{32|64}} 0, %swift.type* [[META]])
|
// CHECK: [[X:%.*]] = call %C6return1X* @_TFC6return1XCfMS0_FT1iSi_S0_(i{{32|64}} 0, %swift.type* [[META]])
|
||||||
// CHECK: @swift_release to void (%C6return1X*)*)(%C6return1X* [[X]])
|
// CHECK: @swift_release to void (%C6return1X*)*)(%C6return1X* [[X]])
|
||||||
if true {
|
if true {
|
||||||
// CHECK: @swift_release to void (%C6return1X*)*)(%C6return1X* [[X]])
|
|
||||||
x.x++;
|
x.x++;
|
||||||
} else {
|
} else {
|
||||||
x.x--;
|
x.x--;
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ bb0(%0 : $D):
|
|||||||
return %1 : $()
|
return %1 : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
sil hidden @_TFC5class1D8multiplyfS0_fT1xBi8__FT1yBi16__Bi32_ : $@cc(method) @thin (Builtin.Int16, Builtin.Int8, @owned D) -> Builtin.Int32 {
|
sil hidden @_TFC5class1D8multiplyfS0_fT1xBi8__FT1yBi16__Bi32_ : $@cc(method) @thin (Builtin.Int16, Builtin.Int8, @guaranteed D) -> Builtin.Int32 {
|
||||||
bb0(%0 : $Builtin.Int16, %1 : $Builtin.Int8, %2 : $D):
|
bb0(%0 : $Builtin.Int16, %1 : $Builtin.Int8, %2 : $D):
|
||||||
%3 = integer_literal $Builtin.Int32, 0
|
%3 = integer_literal $Builtin.Int32, 0
|
||||||
return %3 : $Builtin.Int32
|
return %3 : $Builtin.Int32
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ func class_bounded_archetype_method<T : ClassBoundBinary>(x: T, y: T) {
|
|||||||
x.classBoundBinaryMethod(y)
|
x.classBoundBinaryMethod(y)
|
||||||
// CHECK: [[WITNESS_ENTRY:%.*]] = getelementptr inbounds i8*, i8** %T.ClassBoundBinary, i32 1
|
// CHECK: [[WITNESS_ENTRY:%.*]] = getelementptr inbounds i8*, i8** %T.ClassBoundBinary, i32 1
|
||||||
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ENTRY]], align 8
|
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ENTRY]], align 8
|
||||||
// CHECK: call void bitcast (void (%swift.refcounted*)* @swift_unknownRetain to void (%objc_object*)*)(%objc_object* %0)
|
|
||||||
// CHECK: call void bitcast (void (%swift.refcounted*)* @swift_unknownRetain to void (%objc_object*)*)(%objc_object* [[Y:%.*]])
|
// CHECK: call void bitcast (void (%swift.refcounted*)* @swift_unknownRetain to void (%objc_object*)*)(%objc_object* [[Y:%.*]])
|
||||||
// CHECK: [[WITNESS_FUNC:%.*]] = bitcast i8* [[WITNESS]] to void (%objc_object*, %objc_object*, %swift.type*)
|
// CHECK: [[WITNESS_FUNC:%.*]] = bitcast i8* [[WITNESS]] to void (%objc_object*, %objc_object*, %swift.type*)
|
||||||
// CHECK: call void [[WITNESS_FUNC]](%objc_object* [[Y]], %objc_object* %0, %swift.type* {{.*}})
|
// CHECK: call void [[WITNESS_FUNC]](%objc_object* [[Y]], %objc_object* %0, %swift.type* {{.*}})
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ sil_vtable Purebred {}
|
|||||||
// CHECK: getelementptr inbounds {{.*}} [[VTABLE]]
|
// CHECK: getelementptr inbounds {{.*}} [[VTABLE]]
|
||||||
sil @purebred_method : $@thin (@owned Purebred) -> () {
|
sil @purebred_method : $@thin (@owned Purebred) -> () {
|
||||||
entry(%0 : $Purebred):
|
entry(%0 : $Purebred):
|
||||||
%m = class_method %0 : $Purebred, #Purebred.method!1 : Purebred -> () -> (), $@cc(method) @thin (@owned Purebred) -> ()
|
%m = class_method %0 : $Purebred, #Purebred.method!1 : Purebred -> () -> (), $@cc(method) @thin (@guaranteed Purebred) -> ()
|
||||||
%z = apply %m(%0) : $@cc(method) @thin (@owned Purebred) -> ()
|
%z = apply %m(%0) : $@cc(method) @thin (@guaranteed Purebred) -> ()
|
||||||
return %z : $()
|
return %z : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,8 +48,8 @@ sil_vtable Mongrel {}
|
|||||||
// CHECK: getelementptr inbounds {{.*}} [[VTABLE]]
|
// CHECK: getelementptr inbounds {{.*}} [[VTABLE]]
|
||||||
sil @mongrel_method : $@thin (@owned Mongrel) -> () {
|
sil @mongrel_method : $@thin (@owned Mongrel) -> () {
|
||||||
entry(%0 : $Mongrel):
|
entry(%0 : $Mongrel):
|
||||||
%m = class_method %0 : $Mongrel, #Mongrel.method!1 : Mongrel -> () -> (), $@cc(method) @thin (@owned Mongrel) -> ()
|
%m = class_method %0 : $Mongrel, #Mongrel.method!1 : Mongrel -> () -> (), $@cc(method) @thin (@guaranteed Mongrel) -> ()
|
||||||
%z = apply %m(%0) : $@cc(method) @thin (@owned Mongrel) -> ()
|
%z = apply %m(%0) : $@cc(method) @thin (@guaranteed Mongrel) -> ()
|
||||||
return %z : $()
|
return %z : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ class CustomDeallocator {
|
|||||||
// CHECK: define hidden void @_TFC10deallocate17CustomDeallocatorD([[CD:%.*]]*
|
// CHECK: define hidden void @_TFC10deallocate17CustomDeallocatorD([[CD:%.*]]*
|
||||||
// CHECK: [[T0:%.*]] = call [[OBJECT:%.*]]* @_TFC10deallocate17CustomDeallocatord(
|
// CHECK: [[T0:%.*]] = call [[OBJECT:%.*]]* @_TFC10deallocate17CustomDeallocatord(
|
||||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[OBJECT]]* [[T0]] to [[CD]]*
|
// CHECK-NEXT: [[T1:%.*]] = bitcast [[OBJECT]]* [[T0]] to [[CD]]*
|
||||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[CD]]* [[T1]] to [[OBJECT]]*
|
|
||||||
// CHECK-NEXT: call void @swift_retain_noresult([[OBJECT]]* [[T2]])
|
|
||||||
// CHECK-NEXT: [[T3:%.*]] = call { i64, i64 } @_TFC10deallocate17CustomDeallocator29__getInstanceSizeAndAlignMaskfS0_FT_TSiSi_([[CD]]* [[T1]])
|
// CHECK-NEXT: [[T3:%.*]] = call { i64, i64 } @_TFC10deallocate17CustomDeallocator29__getInstanceSizeAndAlignMaskfS0_FT_TSiSi_([[CD]]* [[T1]])
|
||||||
// CHECK-NEXT: [[SIZE:%.*]] = extractvalue { i64, i64 } [[T3]], 0
|
// CHECK-NEXT: [[SIZE:%.*]] = extractvalue { i64, i64 } [[T3]], 0
|
||||||
// CHECK-NEXT: [[ALIGNMASK:%.*]] = extractvalue { i64, i64 } [[T3]], 1
|
// CHECK-NEXT: [[ALIGNMASK:%.*]] = extractvalue { i64, i64 } [[T3]], 1
|
||||||
|
|||||||
@@ -23,6 +23,5 @@ class C {
|
|||||||
// CHECK: store i64 0, i64* [[CAST1]], align 8
|
// CHECK: store i64 0, i64* [[CAST1]], align 8
|
||||||
// CHECK: [[CAST2:%[a-zA-Z0-9]+]] = bitcast [[TYPE]]* [[ALLOCA]] to i64*
|
// CHECK: [[CAST2:%[a-zA-Z0-9]+]] = bitcast [[TYPE]]* [[ALLOCA]] to i64*
|
||||||
// CHECK: [[LOAD:%[a-zA-Z0-9]+]] = load i64, i64* [[CAST2]], align 8
|
// CHECK: [[LOAD:%[a-zA-Z0-9]+]] = load i64, i64* [[CAST2]], align 8
|
||||||
// CHECK: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%C21dynamic_self_metadata1C*)*)(%C21dynamic_self_metadata1C* %0)
|
|
||||||
// CHECK: ret i64 [[LOAD]]
|
// CHECK: ret i64 [[LOAD]]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class ParentNode : Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pic_crash.Node.init (pic_crash.Node.Type)(index : Swift.Int) -> pic_crash.Node
|
// pic_crash.Node.init (pic_crash.Node.Type)(index : Swift.Int) -> pic_crash.Node
|
||||||
sil @_TFC9pic_crash4Node5checkfS0_FT_Si : $@cc(method) @thin (@owned Node) -> Int {
|
sil @_TFC9pic_crash4Node5checkfS0_FT_Si : $@cc(method) @thin (@guaranteed Node) -> Int {
|
||||||
bb0(%0 : $Node):
|
bb0(%0 : $Node):
|
||||||
//CHECK-LABEL: @_TFC9pic_crash4Node5checkfS0_FT_Si
|
//CHECK-LABEL: @_TFC9pic_crash4Node5checkfS0_FT_Si
|
||||||
//CHECK: load %swift.type
|
//CHECK: load %swift.type
|
||||||
@@ -42,12 +42,12 @@ bb3: // Preds: bb0
|
|||||||
|
|
||||||
sil @_TFC9pic_crash4NodecfMS0_FT5indexSi_S0_ : $@cc(method) @thin (Int, @owned Node) -> @owned Node
|
sil @_TFC9pic_crash4NodecfMS0_FT5indexSi_S0_ : $@cc(method) @thin (Int, @owned Node) -> @owned Node
|
||||||
sil @_TFC9pic_crash4NodeCfMS0_FT5indexSi_S0_ : $@thin (Int, @thick Node.Type) -> @owned Node
|
sil @_TFC9pic_crash4NodeCfMS0_FT5indexSi_S0_ : $@thin (Int, @thick Node.Type) -> @owned Node
|
||||||
sil [transparent] @_TFC9pic_crash4Nodeg5indexSi : $@cc(method) @thin (@owned Node) -> Int
|
sil [transparent] @_TFC9pic_crash4Nodeg5indexSi : $@cc(method) @thin (@guaranteed Node) -> Int
|
||||||
sil [transparent] @_TFC9pic_crash4Nodes5indexSi : $@cc(method) @thin (Int, @owned Node) -> ()
|
sil [transparent] @_TFC9pic_crash4Nodes5indexSi : $@cc(method) @thin (Int, @guaranteed Node) -> ()
|
||||||
sil @_TFC9pic_crash10ParentNodecfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_ : $@cc(method) @thin (@owned Node, @owned Node, Int, @owned ParentNode) -> @owned ParentNode
|
sil @_TFC9pic_crash10ParentNodecfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_ : $@cc(method) @thin (@owned Node, @owned Node, Int, @owned ParentNode) -> @owned ParentNode
|
||||||
sil @_TFC9pic_crash10ParentNodeCfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_ : $@thin (@owned Node, @owned Node, Int, @thick ParentNode.Type) -> @owned ParentNode
|
sil @_TFC9pic_crash10ParentNodeCfMS0_FT4leftCS_4Node5rightS1_5indexSi_S0_ : $@thin (@owned Node, @owned Node, Int, @thick ParentNode.Type) -> @owned ParentNode
|
||||||
sil @_TFC9pic_crash10ParentNoded : $@cc(method) @thin (@owned ParentNode) -> @owned Builtin.NativeObject
|
sil @_TFC9pic_crash10ParentNoded : $@cc(method) @thin (@guaranteed ParentNode) -> @owned Builtin.NativeObject
|
||||||
sil @_TFC9pic_crash10ParentNodeD : $@cc(method) @thin (@owned ParentNode) -> ()
|
sil @_TFC9pic_crash10ParentNodeD : $@cc(method) @thin (@guaranteed ParentNode) -> ()
|
||||||
sil @_TFC9pic_crash10ParentNodecfMS0_FT5indexSi_S0_ : $@cc(method) @thin (Int, @owned ParentNode) -> @owned ParentNode
|
sil @_TFC9pic_crash10ParentNodecfMS0_FT5indexSi_S0_ : $@cc(method) @thin (Int, @owned ParentNode) -> @owned ParentNode
|
||||||
sil @_TFC9pic_crash10ParentNodeCfMS0_FT5indexSi_S0_ : $@thin (Int, @thick ParentNode.Type) -> @owned ParentNode
|
sil @_TFC9pic_crash10ParentNodeCfMS0_FT5indexSi_S0_ : $@thin (Int, @thick ParentNode.Type) -> @owned ParentNode
|
||||||
|
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ sil @_TFC4main4HashcfMS0_FT_S0_ : $@cc(method) @thin (@owned Hash) -> @owned Has
|
|||||||
sil @_TFC4main4HashCfMS0_FT_S0_ : $@thin (@thick Hash.Type) -> @owned Hash
|
sil @_TFC4main4HashCfMS0_FT_S0_ : $@thin (@thick Hash.Type) -> @owned Hash
|
||||||
|
|
||||||
// main.Hash.update (main.Hash)() -> ()
|
// main.Hash.update (main.Hash)() -> ()
|
||||||
sil @_TFC4main4Hash6updatefS0_FT_T_ : $@cc(method) @thin (@owned Hash) -> () {
|
sil @_TFC4main4Hash6updatefS0_FT_T_ : $@cc(method) @thin (@guaranteed Hash) -> () {
|
||||||
bb0(%0 : $Hash):
|
bb0(%0 : $Hash):
|
||||||
%1 = class_method %0 : $Hash, #Hash.hash!1 : Hash -> () -> () , $@cc(method) @thin (@owned Hash) -> () // user: %9
|
%1 = class_method %0 : $Hash, #Hash.hash!1 : Hash -> () -> () , $@cc(method) @thin (@guaranteed Hash) -> () // user: %9
|
||||||
checked_cast_br [exact] %0 : $Hash to $MD5, bb2, bb3 // id: %2
|
checked_cast_br [exact] %0 : $Hash to $MD5, bb2, bb3 // id: %2
|
||||||
|
|
||||||
bb1: // Preds: bb2 bb3
|
bb1: // Preds: bb2 bb3
|
||||||
@@ -34,16 +34,14 @@ bb1: // Preds: bb2 bb3
|
|||||||
return %3 : $() // id: %4
|
return %3 : $() // id: %4
|
||||||
|
|
||||||
bb2(%5 : $MD5): // Preds: bb0
|
bb2(%5 : $MD5): // Preds: bb0
|
||||||
%6 = upcast %5 : $MD5 to $Hash // user: %7
|
|
||||||
strong_release %6 : $Hash // id: %7
|
|
||||||
br bb1 // id: %8
|
br bb1 // id: %8
|
||||||
|
|
||||||
bb3: // Preds: bb0
|
bb3: // Preds: bb0
|
||||||
%9 = apply %1(%0) : $@cc(method) @thin (@owned Hash) -> ()
|
%9 = apply %1(%0) : $@cc(method) @thin (@guaranteed Hash) -> ()
|
||||||
br bb1 // id: %10
|
br bb1 // id: %10
|
||||||
}
|
}
|
||||||
|
|
||||||
sil @_TFC4main4Hash4hashfS0_FT_T_ : $@cc(method) @thin (@owned Hash) -> ()
|
sil @_TFC4main4Hash4hashfS0_FT_T_ : $@cc(method) @thin (@guaranteed Hash) -> ()
|
||||||
sil @_TFC4main4Hashd : $@cc(method) @thin (@owned Hash) -> @owned Builtin.NativeObject
|
sil @_TFC4main4Hashd : $@cc(method) @thin (@owned Hash) -> @owned Builtin.NativeObject
|
||||||
sil @_TFC4main4HashD : $@cc(method) @thin (@owned Hash) -> ()
|
sil @_TFC4main4HashD : $@cc(method) @thin (@owned Hash) -> ()
|
||||||
sil @_TFC4main3MD5cfMS0_FT_S0_ : $@cc(method) @thin (@owned MD5) -> @owned MD5
|
sil @_TFC4main3MD5cfMS0_FT_S0_ : $@cc(method) @thin (@owned MD5) -> @owned MD5
|
||||||
|
|||||||
@@ -124,11 +124,11 @@ class RootGeneric<T> {
|
|||||||
}
|
}
|
||||||
sil @_TFC15generic_classes11RootGenericD : $@cc(method) @thin <T> (RootGeneric<T>) -> ()
|
sil @_TFC15generic_classes11RootGenericD : $@cc(method) @thin <T> (RootGeneric<T>) -> ()
|
||||||
|
|
||||||
sil @_TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_ : $@cc(method) @thin <T> (@owned RootGeneric<T>) -> ()
|
sil @_TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_ : $@cc(method) @thin <T> (@guaranteed RootGeneric<T>) -> ()
|
||||||
|
|
||||||
sil @_TFC15generic_classes11RootGeneric3barU__fGS0_Q__FT_T_ : $@cc(method) @thin <T> (@owned RootGeneric<T>) -> ()
|
sil @_TFC15generic_classes11RootGeneric3barU__fGS0_Q__FT_T_ : $@cc(method) @thin <T> (@guaranteed RootGeneric<T>) -> ()
|
||||||
|
|
||||||
sil @_TFC15generic_classes11RootGeneric3basU__fGS0_Q__FT_T_ : $@cc(method) @thin <T> (@owned RootGeneric<T>) -> ()
|
sil @_TFC15generic_classes11RootGeneric3basU__fGS0_Q__FT_T_ : $@cc(method) @thin <T> (@guaranteed RootGeneric<T>) -> ()
|
||||||
|
|
||||||
sil_vtable RootGeneric {
|
sil_vtable RootGeneric {
|
||||||
#RootGeneric.foo!1: _TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_
|
#RootGeneric.foo!1: _TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_
|
||||||
@@ -167,11 +167,11 @@ class GenericInheritsGeneric<A, B> : RootGeneric<A> {
|
|||||||
}
|
}
|
||||||
sil @_TFC15generic_classes22GenericInheritsGenericD : $@cc(method) @thin <T,U> (GenericInheritsGeneric<T,U>) -> ()
|
sil @_TFC15generic_classes22GenericInheritsGenericD : $@cc(method) @thin <T,U> (GenericInheritsGeneric<T,U>) -> ()
|
||||||
|
|
||||||
sil @_TFC15generic_classes22GenericInheritsGeneric7zippityU___fGS0_Q_Q0__FT_T_ : $@cc(method) @thin <A, B> (@owned GenericInheritsGeneric<A, B>) -> ()
|
sil @_TFC15generic_classes22GenericInheritsGeneric7zippityU___fGS0_Q_Q0__FT_T_ : $@cc(method) @thin <A, B> (@guaranteed GenericInheritsGeneric<A, B>) -> ()
|
||||||
|
|
||||||
sil @_TFC15generic_classes22GenericInheritsGeneric3dooU___fGS0_Q_Q0__FT_T_ : $@cc(method) @thin <A, B> (@owned GenericInheritsGeneric<A, B>) -> ()
|
sil @_TFC15generic_classes22GenericInheritsGeneric3dooU___fGS0_Q_Q0__FT_T_ : $@cc(method) @thin <A, B> (@guaranteed GenericInheritsGeneric<A, B>) -> ()
|
||||||
|
|
||||||
sil @_TFC15generic_classes22GenericInheritsGeneric3dahU___fGS0_Q_Q0__FT_T_ : $@cc(method) @thin <A, B> (@owned GenericInheritsGeneric<A, B>) -> ()
|
sil @_TFC15generic_classes22GenericInheritsGeneric3dahU___fGS0_Q_Q0__FT_T_ : $@cc(method) @thin <A, B> (@guaranteed GenericInheritsGeneric<A, B>) -> ()
|
||||||
|
|
||||||
sil_vtable GenericInheritsGeneric {
|
sil_vtable GenericInheritsGeneric {
|
||||||
#RootGeneric.foo!1: _TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_
|
#RootGeneric.foo!1: _TFC15generic_classes11RootGeneric3fooU__fGS0_Q__FT_T_
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ bb0:
|
|||||||
%O = unchecked_ref_cast %C : $C to $Builtin.UnknownObject
|
%O = unchecked_ref_cast %C : $C to $Builtin.UnknownObject
|
||||||
|
|
||||||
// CHECK: class_method {{.*}} : $C, #C.doIt!1
|
// CHECK: class_method {{.*}} : $C, #C.doIt!1
|
||||||
%2 = class_method %C : $C, #C.doIt!1 : C -> () -> () , $@cc(method) @thin (@owned C) -> ()
|
%2 = class_method %C : $C, #C.doIt!1 : C -> () -> () , $@cc(method) @thin (@guaranteed C) -> ()
|
||||||
|
|
||||||
// CHECK: alloc_ref $D
|
// CHECK: alloc_ref $D
|
||||||
%D = alloc_ref $D
|
%D = alloc_ref $D
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// RUN: rm -rf %t
|
// RUN: rm -rf %t
|
||||||
// RUN: mkdir %t
|
// RUN: mkdir %t
|
||||||
// RUN: %target-swift-frontend -emit-module -sil-serialize-all -o %t %S/Inputs/def_generic.swift
|
// RUN: %target-swift-frontend -emit-module -sil-serialize-all -o %t %S/Inputs/def_generic.swift
|
||||||
// RUN: %target-sil-opt -linker -I %t %s | FileCheck %s
|
// RUN: %target-sil-opt -enable-guaranteed-self -linker -I %t %s | FileCheck %s
|
||||||
|
|
||||||
// Make sure that SILFunctionType with GenericSignature can match up with
|
// Make sure that SILFunctionType with GenericSignature can match up with
|
||||||
// SILFunctionType deserialized from module.
|
// SILFunctionType deserialized from module.
|
||||||
@@ -16,11 +16,11 @@ import Swift
|
|||||||
// CHECK: function_ref @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__
|
// CHECK: function_ref @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__
|
||||||
sil @top_level_code : $@thin () -> () {
|
sil @top_level_code : $@thin () -> () {
|
||||||
bb0:
|
bb0:
|
||||||
%3 = function_ref @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__ : $@cc(method) @thin <T> (@owned Array<T>, @owned A<T>) -> @owned A<T>
|
%3 = function_ref @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__ : $@cc(method) @thin <T> (@owned Array<T>, @guaranteed A<T>) -> @owned A<T>
|
||||||
%0 = tuple () // user: %1
|
%0 = tuple () // user: %1
|
||||||
return %0 : $() // id: %1
|
return %0 : $() // id: %1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure the function body is deserialized.
|
// Make sure the function body is deserialized.
|
||||||
// CHECK-LABEL: @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__ : $@cc(method) @thin <T> (@owned Array<T>, @owned A<T>) -> @owned A<T> {
|
// CHECK-LABEL: @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__ : $@cc(method) @thin <T> (@owned Array<T>, @guaranteed A<T>) -> @owned A<T> {
|
||||||
sil @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__ : $@cc(method) @thin <T> (@owned Array<T>, @owned A<T>) -> @owned A<T>
|
sil @_TFC11def_generic1A23convertFromArrayLiteralU__fGS0_Q__FtGSaQ___GS0_Q__ : $@cc(method) @thin <T> (@owned Array<T>, @guaranteed A<T>) -> @owned A<T>
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ func test0(ref: A) {
|
|||||||
// CHECK-NEXT: [[INDEX1:%.*]] = apply [[T0]]()
|
// CHECK-NEXT: [[INDEX1:%.*]] = apply [[T0]]()
|
||||||
// Formal access to RHS.
|
// Formal access to RHS.
|
||||||
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $OrdinarySub
|
// CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $OrdinarySub
|
||||||
// CHECK-NEXT: strong_retain %0
|
|
||||||
// CHECK-NEXT: [[T0:%.*]] = class_method %0 : $A, #A.array!getter.1
|
// CHECK-NEXT: [[T0:%.*]] = class_method %0 : $A, #A.array!getter.1
|
||||||
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]](%0)
|
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]](%0)
|
||||||
// CHECK-NEXT: store [[T1]] to [[TEMP]]
|
// CHECK-NEXT: store [[T1]] to [[TEMP]]
|
||||||
@@ -43,10 +42,10 @@ func test0(ref: A) {
|
|||||||
// CHECK-NEXT: // function_ref accessors.OrdinarySub.subscript.getter (Swift.Int) -> Swift.Int
|
// CHECK-NEXT: // function_ref accessors.OrdinarySub.subscript.getter (Swift.Int) -> Swift.Int
|
||||||
// CHECK-NEXT: [[T1:%.*]] = function_ref @_TFV9accessors11OrdinarySubg9subscriptFSiSi
|
// CHECK-NEXT: [[T1:%.*]] = function_ref @_TFV9accessors11OrdinarySubg9subscriptFSiSi
|
||||||
// CHECK-NEXT: [[VALUE:%.*]] = apply [[T1]]([[INDEX1]], [[T0]])
|
// CHECK-NEXT: [[VALUE:%.*]] = apply [[T1]]([[INDEX1]], [[T0]])
|
||||||
|
// CHECK-NEXT: release_value [[T0]]
|
||||||
// Formal access to LHS.
|
// Formal access to LHS.
|
||||||
// CHECK-NEXT: [[STORAGE:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
// CHECK-NEXT: [[STORAGE:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
||||||
// CHECK-NEXT: [[BUFFER:%.*]] = alloc_stack $OrdinarySub
|
// CHECK-NEXT: [[BUFFER:%.*]] = alloc_stack $OrdinarySub
|
||||||
// CHECK-NEXT: strong_retain %0
|
|
||||||
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER]]
|
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER]]
|
||||||
// CHECK-NEXT: [[T1:%.*]] = class_method %0 : $A, #A.array!materializeForSet.1
|
// CHECK-NEXT: [[T1:%.*]] = class_method %0 : $A, #A.array!materializeForSet.1
|
||||||
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE]]#1, %0)
|
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE]]#1, %0)
|
||||||
@@ -102,7 +101,6 @@ func test1(ref: B) {
|
|||||||
// Formal access to RHS.
|
// Formal access to RHS.
|
||||||
// CHECK-NEXT: [[STORAGE:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
// CHECK-NEXT: [[STORAGE:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
||||||
// CHECK-NEXT: [[BUFFER:%.*]] = alloc_stack $MutatingSub
|
// CHECK-NEXT: [[BUFFER:%.*]] = alloc_stack $MutatingSub
|
||||||
// CHECK-NEXT: strong_retain %0
|
|
||||||
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER]]
|
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER]]
|
||||||
// CHECK-NEXT: [[T1:%.*]] = class_method %0 : $B, #B.array!materializeForSet.1
|
// CHECK-NEXT: [[T1:%.*]] = class_method %0 : $B, #B.array!materializeForSet.1
|
||||||
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE]]#1, %0)
|
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE]]#1, %0)
|
||||||
@@ -126,7 +124,6 @@ func test1(ref: B) {
|
|||||||
// Formal access to LHS.
|
// Formal access to LHS.
|
||||||
// CHECK-NEXT: [[STORAGE2:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
// CHECK-NEXT: [[STORAGE2:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
||||||
// CHECK-NEXT: [[BUFFER2:%.*]] = alloc_stack $MutatingSub
|
// CHECK-NEXT: [[BUFFER2:%.*]] = alloc_stack $MutatingSub
|
||||||
// CHECK-NEXT: strong_retain %0
|
|
||||||
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER2]]
|
// CHECK-NEXT: [[T0:%.*]] = address_to_pointer [[BUFFER2]]
|
||||||
// CHECK-NEXT: [[T1:%.*]] = class_method %0 : $B, #B.array!materializeForSet.1
|
// CHECK-NEXT: [[T1:%.*]] = class_method %0 : $B, #B.array!materializeForSet.1
|
||||||
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE2]]#1, %0)
|
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[T0]], [[STORAGE2]]#1, %0)
|
||||||
|
|||||||
@@ -263,16 +263,15 @@ class F {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: sil hidden @_TFC10addressors1Flo5valueVSs5Int32 : $@cc(method) @thin (@owned F) -> @owned (UnsafePointer<Int32>, Builtin.NativeObject) {
|
// CHECK: sil hidden @_TFC10addressors1Flo5valueVSs5Int32 : $@cc(method) @thin (@guaranteed F) -> @owned (UnsafePointer<Int32>, Builtin.NativeObject) {
|
||||||
// CHECK: sil hidden @_TFC10addressors1Fao5valueVSs5Int32 : $@cc(method) @thin (@owned F) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject) {
|
// CHECK: sil hidden @_TFC10addressors1Fao5valueVSs5Int32 : $@cc(method) @thin (@guaranteed F) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject) {
|
||||||
|
|
||||||
func test_f0(f: F) -> Int32 {
|
func test_f0(f: F) -> Int32 {
|
||||||
return f.value
|
return f.value
|
||||||
}
|
}
|
||||||
// CHECK: sil hidden @_TF10addressors7test_f0FCS_1FVSs5Int32 : $@thin (@owned F) -> Int32 {
|
// CHECK: sil hidden @_TF10addressors7test_f0FCS_1FVSs5Int32 : $@thin (@owned F) -> Int32 {
|
||||||
// CHECK: bb0([[SELF:%0]] : $F):
|
// CHECK: bb0([[SELF:%0]] : $F):
|
||||||
// CHECK: strong_retain [[SELF]] : $F
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Flo5valueVSs5Int32 : $@cc(method) @thin (@guaranteed F) -> @owned (UnsafePointer<Int32>, Builtin.NativeObject)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Flo5valueVSs5Int32 : $@cc(method) @thin (@owned F) -> @owned (UnsafePointer<Int32>, Builtin.NativeObject)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 1
|
||||||
@@ -291,8 +290,7 @@ func test_f1(f: F) {
|
|||||||
// CHECK: bb0([[SELF:%0]] : $F):
|
// CHECK: bb0([[SELF:%0]] : $F):
|
||||||
// CHECK: [[T0:%.*]] = integer_literal $Builtin.Int32, 14
|
// CHECK: [[T0:%.*]] = integer_literal $Builtin.Int32, 14
|
||||||
// CHECK: [[VALUE:%.*]] = struct $Int32 ([[T0]] : $Builtin.Int32)
|
// CHECK: [[VALUE:%.*]] = struct $Int32 ([[T0]] : $Builtin.Int32)
|
||||||
// CHECK: strong_retain [[SELF]] : $F
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Fao5valueVSs5Int32 : $@cc(method) @thin (@guaranteed F) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Fao5valueVSs5Int32 : $@cc(method) @thin (@owned F) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
||||||
@@ -315,10 +313,9 @@ class G {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// CHECK: sil hidden [transparent] @_TFC10addressors1Gg5valueVSs5Int32 : $@cc(method) @thin (@owned G) -> Int32 {
|
// CHECK: sil hidden [transparent] @_TFC10addressors1Gg5valueVSs5Int32 : $@cc(method) @thin (@guaranteed G) -> Int32 {
|
||||||
// CHECK: bb0([[SELF:%0]] : $G):
|
// CHECK: bb0([[SELF:%0]] : $G):
|
||||||
// CHECK: strong_retain [[SELF]]
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Glo5valueVSs5Int32 : $@cc(method) @thin (@guaranteed G) -> @owned (UnsafePointer<Int32>, Builtin.NativeObject)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Glo5valueVSs5Int32 : $@cc(method) @thin (@owned G) -> @owned (UnsafePointer<Int32>, Builtin.NativeObject)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Builtin.NativeObject), 1
|
||||||
@@ -327,13 +324,11 @@ class G {
|
|||||||
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Builtin.NativeObject
|
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Builtin.NativeObject
|
||||||
// CHECK: [[VALUE:%.*]] = load [[T2]] : $*Int32
|
// CHECK: [[VALUE:%.*]] = load [[T2]] : $*Int32
|
||||||
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
|
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
|
||||||
// CHECK: strong_release [[SELF]] : $G
|
|
||||||
// CHECK: return [[VALUE]] : $Int32
|
// CHECK: return [[VALUE]] : $Int32
|
||||||
|
|
||||||
// CHECK: sil hidden [transparent] @_TFC10addressors1Gs5valueVSs5Int32 : $@cc(method) @thin (Int32, @owned G) -> () {
|
// CHECK: sil hidden [transparent] @_TFC10addressors1Gs5valueVSs5Int32 : $@cc(method) @thin (Int32, @guaranteed G) -> () {
|
||||||
// CHECK: bb0([[VALUE:%0]] : $Int32, [[SELF:%1]] : $G):
|
// CHECK: bb0([[VALUE:%0]] : $Int32, [[SELF:%1]] : $G):
|
||||||
// CHECK: strong_retain [[SELF]] : $G
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Gao5valueVSs5Int32 : $@cc(method) @thin (@guaranteed G) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Gao5valueVSs5Int32 : $@cc(method) @thin (@owned G) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
||||||
@@ -342,14 +337,12 @@ class G {
|
|||||||
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Builtin.NativeObject
|
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Builtin.NativeObject
|
||||||
// CHECK: store [[VALUE]] to [[T2]] : $*Int32
|
// CHECK: store [[VALUE]] to [[T2]] : $*Int32
|
||||||
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
|
// CHECK: strong_release [[OWNER]] : $Builtin.NativeObject
|
||||||
// CHECK: strong_release [[SELF]] : $G
|
|
||||||
|
|
||||||
// materializeForSet for G.value
|
// materializeForSet for G.value
|
||||||
// CHECK: sil hidden [transparent] @_TFC10addressors1Gm5valueVSs5Int32 : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned G) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout G, @thick G.Type) -> ()>) {
|
// CHECK: sil hidden [transparent] @_TFC10addressors1Gm5valueVSs5Int32 : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed G) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout G, @thick G.Type) -> ()>) {
|
||||||
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $G):
|
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $G):
|
||||||
// Call the addressor.
|
// Call the addressor.
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Gao5valueVSs5Int32 : $@cc(method) @thin (@owned G) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject)
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Gao5valueVSs5Int32 : $@cc(method) @thin (@guaranteed G) -> @owned (UnsafeMutablePointer<Int32>, Builtin.NativeObject)
|
||||||
// CHECK: strong_retain [[SELF]] : $G
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[T1:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
// CHECK: [[T1:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
||||||
// CHECK: [[T2:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
// CHECK: [[T2:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
||||||
@@ -363,6 +356,7 @@ class G {
|
|||||||
// CHECK: store [[T3]] to [[T2]] : $*Builtin.NativeObject
|
// CHECK: store [[T3]] to [[T2]] : $*Builtin.NativeObject
|
||||||
// Pull out the address.
|
// Pull out the address.
|
||||||
// CHECK: [[T0:%.*]] = tuple_extract [[TUPLE]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
// CHECK: [[T0:%.*]] = tuple_extract [[TUPLE]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 0
|
||||||
|
// CHECK: [[ADDR_OWNER:%.*]] = tuple_extract [[TUPLE]] : $(UnsafeMutablePointer<Int32>, Builtin.NativeObject), 1
|
||||||
// CHECK: [[PTR:%.*]] = struct_extract [[T0]] :
|
// CHECK: [[PTR:%.*]] = struct_extract [[T0]] :
|
||||||
// Set up the callback.
|
// Set up the callback.
|
||||||
// CHECK: [[TEMP:%.*]] = alloc_stack $Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout G, @thick G.Type) -> ()>
|
// CHECK: [[TEMP:%.*]] = alloc_stack $Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout G, @thick G.Type) -> ()>
|
||||||
@@ -373,8 +367,8 @@ class G {
|
|||||||
// CHECK: [[CALLBACK:%.*]] = load [[TEMP]]#1 :
|
// CHECK: [[CALLBACK:%.*]] = load [[TEMP]]#1 :
|
||||||
// Epilogue.
|
// Epilogue.
|
||||||
// CHECK: [[RESULT:%.*]] = tuple ([[PTR]] : $Builtin.RawPointer, [[CALLBACK]] : $Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout G, @thick G.Type) -> ()>)
|
// CHECK: [[RESULT:%.*]] = tuple ([[PTR]] : $Builtin.RawPointer, [[CALLBACK]] : $Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout G, @thick G.Type) -> ()>)
|
||||||
|
// CHECK: strong_release [[ADDR_OWNER]]
|
||||||
// CHECK: release_value [[TUPLE]]
|
// CHECK: release_value [[TUPLE]]
|
||||||
// CHECK: strong_release [[SELF]]
|
|
||||||
// CHECK: return [[RESULT]]
|
// CHECK: return [[RESULT]]
|
||||||
|
|
||||||
// materializeForSet callback for G.value
|
// materializeForSet callback for G.value
|
||||||
@@ -400,16 +394,15 @@ class H {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: sil hidden @_TFC10addressors1Hlp5valueVSs5Int32 : $@cc(method) @thin (@owned H) -> @owned (UnsafePointer<Int32>, Optional<Builtin.NativeObject>) {
|
// CHECK: sil hidden @_TFC10addressors1Hlp5valueVSs5Int32 : $@cc(method) @thin (@guaranteed H) -> @owned (UnsafePointer<Int32>, Optional<Builtin.NativeObject>) {
|
||||||
// CHECK: sil hidden @_TFC10addressors1Hap5valueVSs5Int32 : $@cc(method) @thin (@owned H) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>) {
|
// CHECK: sil hidden @_TFC10addressors1Hap5valueVSs5Int32 : $@cc(method) @thin (@guaranteed H) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>) {
|
||||||
|
|
||||||
func test_h0(f: H) -> Int32 {
|
func test_h0(f: H) -> Int32 {
|
||||||
return f.value
|
return f.value
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @_TF10addressors7test_h0FCS_1HVSs5Int32 : $@thin (@owned H) -> Int32 {
|
// CHECK-LABEL: sil hidden @_TF10addressors7test_h0FCS_1HVSs5Int32 : $@thin (@owned H) -> Int32 {
|
||||||
// CHECK: bb0([[SELF:%0]] : $H):
|
// CHECK: bb0([[SELF:%0]] : $H):
|
||||||
// CHECK: strong_retain [[SELF]] : $H
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Hlp5valueVSs5Int32 : $@cc(method) @thin (@guaranteed H) -> @owned (UnsafePointer<Int32>, Optional<Builtin.NativeObject>)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Hlp5valueVSs5Int32 : $@cc(method) @thin (@owned H) -> @owned (UnsafePointer<Int32>, Optional<Builtin.NativeObject>)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
||||||
@@ -428,8 +421,7 @@ func test_h1(f: H) {
|
|||||||
// CHECK: bb0([[SELF:%0]] : $H):
|
// CHECK: bb0([[SELF:%0]] : $H):
|
||||||
// CHECK: [[T0:%.*]] = integer_literal $Builtin.Int32, 14
|
// CHECK: [[T0:%.*]] = integer_literal $Builtin.Int32, 14
|
||||||
// CHECK: [[VALUE:%.*]] = struct $Int32 ([[T0]] : $Builtin.Int32)
|
// CHECK: [[VALUE:%.*]] = struct $Int32 ([[T0]] : $Builtin.Int32)
|
||||||
// CHECK: strong_retain [[SELF]] : $H
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Hap5valueVSs5Int32 : $@cc(method) @thin (@guaranteed H) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Hap5valueVSs5Int32 : $@cc(method) @thin (@owned H) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
||||||
@@ -452,10 +444,9 @@ class I {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Ig5valueVSs5Int32 : $@cc(method) @thin (@owned I) -> Int32 {
|
// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Ig5valueVSs5Int32 : $@cc(method) @thin (@guaranteed I) -> Int32 {
|
||||||
// CHECK: bb0([[SELF:%0]] : $I):
|
// CHECK: bb0([[SELF:%0]] : $I):
|
||||||
// CHECK: strong_retain [[SELF]]
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Ilp5valueVSs5Int32 : $@cc(method) @thin (@guaranteed I) -> @owned (UnsafePointer<Int32>, Optional<Builtin.NativeObject>)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Ilp5valueVSs5Int32 : $@cc(method) @thin (@owned I) -> @owned (UnsafePointer<Int32>, Optional<Builtin.NativeObject>)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
||||||
@@ -464,13 +455,11 @@ class I {
|
|||||||
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Optional<Builtin.NativeObject>
|
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Optional<Builtin.NativeObject>
|
||||||
// CHECK: [[VALUE:%.*]] = load [[T2]] : $*Int32
|
// CHECK: [[VALUE:%.*]] = load [[T2]] : $*Int32
|
||||||
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
|
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
|
||||||
// CHECK: strong_release [[SELF]] : $I
|
|
||||||
// CHECK: return [[VALUE]] : $Int32
|
// CHECK: return [[VALUE]] : $Int32
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Is5valueVSs5Int32 : $@cc(method) @thin (Int32, @owned I) -> () {
|
// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Is5valueVSs5Int32 : $@cc(method) @thin (Int32, @guaranteed I) -> () {
|
||||||
// CHECK: bb0([[VALUE:%0]] : $Int32, [[SELF:%1]] : $I):
|
// CHECK: bb0([[VALUE:%0]] : $Int32, [[SELF:%1]] : $I):
|
||||||
// CHECK: strong_retain [[SELF]] : $I
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Iap5valueVSs5Int32 : $@cc(method) @thin (@guaranteed I) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>)
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Iap5valueVSs5Int32 : $@cc(method) @thin (@owned I) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>)
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
// CHECK: [[PTR:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
||||||
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
// CHECK: [[OWNER:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
||||||
@@ -479,13 +468,11 @@ class I {
|
|||||||
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Optional<Builtin.NativeObject>
|
// CHECK: [[T2:%.*]] = mark_dependence [[T1]] : $*Int32 on [[OWNER]] : $Optional<Builtin.NativeObject>
|
||||||
// CHECK: store [[VALUE]] to [[T2]] : $*Int32
|
// CHECK: store [[VALUE]] to [[T2]] : $*Int32
|
||||||
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
|
// CHECK: strong_unpin [[OWNER]] : $Optional<Builtin.NativeObject>
|
||||||
// CHECK: strong_release [[SELF]] : $I
|
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Im5valueVSs5Int32 : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned I) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout I, @thick I.Type) -> ()>) {
|
// CHECK-LABEL: sil hidden [transparent] @_TFC10addressors1Im5valueVSs5Int32 : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed I) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout I, @thick I.Type) -> ()>) {
|
||||||
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $I):
|
// CHECK: bb0([[BUFFER:%0]] : $Builtin.RawPointer, [[STORAGE:%1]] : $*Builtin.UnsafeValueBuffer, [[SELF:%2]] : $I):
|
||||||
// Call the addressor.
|
// Call the addressor.
|
||||||
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Iap5valueVSs5Int32 : $@cc(method) @thin (@owned I) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>)
|
// CHECK: [[ADDRESSOR:%.*]] = function_ref @_TFC10addressors1Iap5valueVSs5Int32 : $@cc(method) @thin (@guaranteed I) -> @owned (UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>)
|
||||||
// CHECK: strong_retain [[SELF]] : $I
|
|
||||||
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
// CHECK: [[T0:%.*]] = apply [[ADDRESSOR]]([[SELF]])
|
||||||
// CHECK: [[T1:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
// CHECK: [[T1:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 0
|
||||||
// CHECK: [[T2:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
// CHECK: [[T2:%.*]] = tuple_extract [[T0]] : $(UnsafeMutablePointer<Int32>, Optional<Builtin.NativeObject>), 1
|
||||||
@@ -510,7 +497,6 @@ class I {
|
|||||||
// Epilogue.
|
// Epilogue.
|
||||||
// CHECK: [[RESULT:%.*]] = tuple ([[PTR]] : $Builtin.RawPointer, [[CALLBACK]] : $Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout I, @thick I.Type) -> ()>)
|
// CHECK: [[RESULT:%.*]] = tuple ([[PTR]] : $Builtin.RawPointer, [[CALLBACK]] : $Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout I, @thick I.Type) -> ()>)
|
||||||
// CHECK: release_value [[TUPLE]]
|
// CHECK: release_value [[TUPLE]]
|
||||||
// CHECK: strong_release [[SELF]]
|
|
||||||
// CHECK: return [[RESULT]]
|
// CHECK: return [[RESULT]]
|
||||||
|
|
||||||
// materializeForSet callback for I.value
|
// materializeForSet callback for I.value
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class Sub : Base {
|
public class Sub : Base {
|
||||||
// CHECK-LABEL: sil hidden @_TFC13auto_closures3Subg1xVS_4Bool : $@cc(method) @thin (@owned Sub) -> Bool {
|
// CHECK-LABEL: sil hidden @_TFC13auto_closures3Subg1xVS_4Bool : $@cc(method) @thin (@guaranteed Sub) -> Bool {
|
||||||
// CHECK: [[AUTOCLOSURE:%.*]] = function_ref @_TFFC13auto_closures3Subg1xVS_4Boolu_KT_S1_ : $@thin (@owned Sub) -> Bool
|
// CHECK: [[AUTOCLOSURE:%.*]] = function_ref @_TFFC13auto_closures3Subg1xVS_4Boolu_KT_S1_ : $@thin (@owned Sub) -> Bool
|
||||||
// CHECK: = partial_apply [[AUTOCLOSURE]](%0)
|
// CHECK: = partial_apply [[AUTOCLOSURE]](%0)
|
||||||
// CHECK: return {{%.*}} : $Bool
|
// CHECK: return {{%.*}} : $Bool
|
||||||
|
|||||||
@@ -68,11 +68,10 @@ extension _ErrorType {
|
|||||||
func test_extension_method(error: _ErrorType) {
|
func test_extension_method(error: _ErrorType) {
|
||||||
// CHECK: [[VALUE:%.*]] = open_existential_box %0
|
// CHECK: [[VALUE:%.*]] = open_existential_box %0
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: copy_addr [[VALUE]] to [initialization] [[COPY:%.*]]#1 :
|
// CHECK-NOT: copy_addr
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[COPY]]#1)
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK-NOT: destroy_addr [[COPY]]
|
// CHECK-NOT: destroy_addr [[COPY]]
|
||||||
// CHECK-NOT: destroy_addr [[VALUE]]
|
// CHECK-NOT: destroy_addr [[VALUE]]
|
||||||
// CHECK: dealloc_stack [[COPY]]#0
|
|
||||||
// CHECK-NOT: destroy_addr [[VALUE]]
|
// CHECK-NOT: destroy_addr [[VALUE]]
|
||||||
// -- release the owned argument
|
// -- release the owned argument
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
@@ -91,9 +90,8 @@ func test_open_existential_semantics(guaranteed: _ErrorType,
|
|||||||
// CHECK-NOT: strong_retain %0
|
// CHECK-NOT: strong_retain %0
|
||||||
// CHECK: [[VALUE:%.*]] = open_existential_box %0
|
// CHECK: [[VALUE:%.*]] = open_existential_box %0
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: copy_addr [[VALUE]] to [initialization] [[COPY:%.*]]#1 :
|
// CHECK-NOT: copy_addr
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[COPY]]#1)
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK: dealloc_stack [[COPY]]#0
|
|
||||||
// CHECK-NOT: strong_release %0
|
// CHECK-NOT: strong_release %0
|
||||||
|
|
||||||
// GUARANTEED-NOT: strong_retain %0
|
// GUARANTEED-NOT: strong_retain %0
|
||||||
@@ -109,9 +107,8 @@ func test_open_existential_semantics(guaranteed: _ErrorType,
|
|||||||
// CHECK: strong_retain [[IMMEDIATE]]
|
// CHECK: strong_retain [[IMMEDIATE]]
|
||||||
// CHECK: [[VALUE:%.*]] = open_existential_box [[IMMEDIATE]]
|
// CHECK: [[VALUE:%.*]] = open_existential_box [[IMMEDIATE]]
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: copy_addr [[VALUE]] to [initialization] [[COPY:%.*]]#1 :
|
// CHECK-NOT: copy_addr
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[COPY]]#1)
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK: dealloc_stack [[COPY]]#0
|
|
||||||
// -- end the guarantee
|
// -- end the guarantee
|
||||||
// -- TODO: could in theory do this sooner, after the value's been copied
|
// -- TODO: could in theory do this sooner, after the value's been copied
|
||||||
// out.
|
// out.
|
||||||
@@ -132,9 +129,8 @@ func test_open_existential_semantics(guaranteed: _ErrorType,
|
|||||||
// CHECK: [[PLUS_ONE:%.*]] = apply [[F]]()
|
// CHECK: [[PLUS_ONE:%.*]] = apply [[F]]()
|
||||||
// CHECK: [[VALUE:%.*]] = open_existential_box [[PLUS_ONE]]
|
// CHECK: [[VALUE:%.*]] = open_existential_box [[PLUS_ONE]]
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: copy_addr [[VALUE]] to [initialization] [[COPY:%.*]]#1 :
|
// CHECK-NOT: copy_addr
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[COPY]]#1)
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK: dealloc_stack [[COPY]]#0
|
|
||||||
// CHECK: strong_release [[PLUS_ONE]]
|
// CHECK: strong_release [[PLUS_ONE]]
|
||||||
|
|
||||||
// GUARANTEED: [[F:%.*]] = function_ref {{.*}}plusOneErrorType
|
// GUARANTEED: [[F:%.*]] = function_ref {{.*}}plusOneErrorType
|
||||||
|
|||||||
@@ -495,7 +495,7 @@ class SuperSub : SuperBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TFC8closures24UnownedSelfNestedCapture13nestedCapturefS0_FT_T_ : $@cc(method) @thin (@owned UnownedSelfNestedCapture) -> ()
|
// CHECK-LABEL: sil hidden @_TFC8closures24UnownedSelfNestedCapture13nestedCapturefS0_FT_T_ : $@cc(method) @thin (@guaranteed UnownedSelfNestedCapture) -> ()
|
||||||
// CHECK: [[OUTER_SELF_CAPTURE:%.*]] = alloc_box $@sil_unowned UnownedSelfNestedCapture
|
// CHECK: [[OUTER_SELF_CAPTURE:%.*]] = alloc_box $@sil_unowned UnownedSelfNestedCapture
|
||||||
// CHECK: [[UNOWNED_SELF:%.*]] = ref_to_unowned [[SELF_PARAM:%.*]] :
|
// CHECK: [[UNOWNED_SELF:%.*]] = ref_to_unowned [[SELF_PARAM:%.*]] :
|
||||||
// -- TODO: A lot of fussy r/r traffic and owned/unowned conversions here.
|
// -- TODO: A lot of fussy r/r traffic and owned/unowned conversions here.
|
||||||
@@ -516,12 +516,12 @@ class SuperSub : SuperBase {
|
|||||||
// -- call consumes closure
|
// -- call consumes closure
|
||||||
// -- strong +1, unowned +1
|
// -- strong +1, unowned +1
|
||||||
// CHECK: [[INNER_CLOSURE:%.*]] = apply [[OUTER_CLOSURE]]
|
// CHECK: [[INNER_CLOSURE:%.*]] = apply [[OUTER_CLOSURE]]
|
||||||
// CHECK: apply [[INNER_CLOSURE]]()
|
// CHECK: [[CONSUMED_RESULT:%.*]] = apply [[INNER_CLOSURE]]()
|
||||||
|
// CHECK: strong_release [[CONSUMED_RESULT]]
|
||||||
// -- releases unowned self in box
|
// -- releases unowned self in box
|
||||||
// -- strong +1, unowned +0
|
// -- strong +1, unowned +0
|
||||||
// CHECK: strong_release [[OUTER_SELF_CAPTURE]]
|
// CHECK: strong_release [[OUTER_SELF_CAPTURE]]
|
||||||
// -- strong +0, unowned +0
|
// -- strong +0, unowned +0
|
||||||
// CHECK: strong_release [[SELF_PARAM]]
|
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
|
|
||||||
// -- outer closure
|
// -- outer closure
|
||||||
|
|||||||
@@ -420,7 +420,7 @@ public class Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class Sub : Base {
|
public class Sub : Base {
|
||||||
// CHECK-LABEL: sil hidden @_TFC7dynamic3Subg1xSb : $@cc(method) @thin (@owned Sub) -> Bool {
|
// CHECK-LABEL: sil hidden @_TFC7dynamic3Subg1xSb : $@cc(method) @thin (@guaranteed Sub) -> Bool {
|
||||||
// CHECK: [[AUTOCLOSURE:%.*]] = function_ref @_TFFC7dynamic3Subg1xSbu_KT_Sb : $@thin (@owned Sub) -> Bool
|
// CHECK: [[AUTOCLOSURE:%.*]] = function_ref @_TFFC7dynamic3Subg1xSbu_KT_Sb : $@thin (@owned Sub) -> Bool
|
||||||
// CHECK: = partial_apply [[AUTOCLOSURE]](%0)
|
// CHECK: = partial_apply [[AUTOCLOSURE]](%0)
|
||||||
// CHECK: return {{%.*}} : $Bool
|
// CHECK: return {{%.*}} : $Bool
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ protocol CP : class {
|
|||||||
class X : P, CP {
|
class X : P, CP {
|
||||||
required init(int i: Int) { }
|
required init(int i: Int) { }
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TFC12dynamic_self1X1ffDS0_FT_DS0_ : $@cc(method) @thin (@owned X) -> @owned
|
// CHECK-LABEL: sil hidden @_TFC12dynamic_self1X1ffDS0_FT_DS0_ : $@cc(method) @thin (@guaranteed X) -> @owned
|
||||||
func f() -> Self { return self }
|
func f() -> Self { return self }
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TZFC12dynamic_self1X7factory{{.*}} : $@thin (Int, @thick X.Type) -> @owned X
|
// CHECK-LABEL: sil hidden @_TZFC12dynamic_self1X7factory{{.*}} : $@thin (Int, @thick X.Type) -> @owned X
|
||||||
@@ -34,22 +34,28 @@ class GY<T> : GX<[T]> { }
|
|||||||
// CHECK-LABEL: sil hidden @_TF12dynamic_self23testDynamicSelfDispatch{{.*}} : $@thin (@owned Y) -> ()
|
// CHECK-LABEL: sil hidden @_TF12dynamic_self23testDynamicSelfDispatch{{.*}} : $@thin (@owned Y) -> ()
|
||||||
func testDynamicSelfDispatch(y: Y) {
|
func testDynamicSelfDispatch(y: Y) {
|
||||||
// CHECK: bb0([[Y:%[0-9]+]] : $Y):
|
// CHECK: bb0([[Y:%[0-9]+]] : $Y):
|
||||||
|
// CHECK: strong_retain [[Y]]
|
||||||
// CHECK: [[Y_AS_X:%[0-9]+]] = upcast [[Y]] : $Y to $X
|
// CHECK: [[Y_AS_X:%[0-9]+]] = upcast [[Y]] : $Y to $X
|
||||||
// CHECK: [[X_F:%[0-9]+]] = class_method [[Y_AS_X]] : $X, #X.f!1 : Self -> () -> Self , $@cc(method) @thin (@owned X) -> @owned X
|
// CHECK: [[X_F:%[0-9]+]] = class_method [[Y_AS_X]] : $X, #X.f!1 : Self -> () -> Self , $@cc(method) @thin (@guaranteed X) -> @owned X
|
||||||
// CHECK: [[X_RESULT:%[0-9]+]] = apply [[X_F]]([[Y_AS_X]]) : $@cc(method) @thin (@owned X) -> @owned X
|
// CHECK: [[X_RESULT:%[0-9]+]] = apply [[X_F]]([[Y_AS_X]]) : $@cc(method) @thin (@guaranteed X) -> @owned X
|
||||||
|
// CHECK: strong_release [[Y_AS_X]]
|
||||||
// CHECK: [[Y_RESULT:%[0-9]+]] = unchecked_ref_cast [[X_RESULT]] : $X to $Y
|
// CHECK: [[Y_RESULT:%[0-9]+]] = unchecked_ref_cast [[X_RESULT]] : $X to $Y
|
||||||
// CHECK: strong_release [[Y_RESULT]] : $Y
|
// CHECK: strong_release [[Y_RESULT]] : $Y
|
||||||
|
// CHECK: strong_release [[Y]] : $Y
|
||||||
y.f()
|
y.f()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF12dynamic_self30testDynamicSelfDispatchGeneric{{.*}} : $@thin (@owned GY<Int>) -> ()
|
// CHECK-LABEL: sil hidden @_TF12dynamic_self30testDynamicSelfDispatchGeneric{{.*}} : $@thin (@owned GY<Int>) -> ()
|
||||||
func testDynamicSelfDispatchGeneric(gy: GY<Int>) {
|
func testDynamicSelfDispatchGeneric(gy: GY<Int>) {
|
||||||
// CHECK: bb0([[GY:%[0-9]+]] : $GY<Int>):
|
// CHECK: bb0([[GY:%[0-9]+]] : $GY<Int>):
|
||||||
|
// CHECK: strong_retain [[GY]]
|
||||||
// CHECK: [[GY_AS_GX:%[0-9]+]] = upcast [[GY]] : $GY<Int> to $GX<Array<Int>>
|
// CHECK: [[GY_AS_GX:%[0-9]+]] = upcast [[GY]] : $GY<Int> to $GX<Array<Int>>
|
||||||
// CHECK: [[GX_F:%[0-9]+]] = class_method [[GY_AS_GX]] : $GX<Array<Int>>, #GX.f!1 : <T> Self -> () -> Self , $@cc(method) @thin <τ_0_0> (@owned GX<τ_0_0>) -> @owned GX<τ_0_0>
|
// CHECK: [[GX_F:%[0-9]+]] = class_method [[GY_AS_GX]] : $GX<Array<Int>>, #GX.f!1 : <T> Self -> () -> Self , $@cc(method) @thin <τ_0_0> (@guaranteed GX<τ_0_0>) -> @owned GX<τ_0_0>
|
||||||
// CHECK: [[GX_RESULT:%[0-9]+]] = apply [[GX_F]]<[Int]>([[GY_AS_GX]]) : $@cc(method) @thin <τ_0_0> (@owned GX<τ_0_0>) -> @owned GX<τ_0_0>
|
// CHECK: [[GX_RESULT:%[0-9]+]] = apply [[GX_F]]<[Int]>([[GY_AS_GX]]) : $@cc(method) @thin <τ_0_0> (@guaranteed GX<τ_0_0>) -> @owned GX<τ_0_0>
|
||||||
|
// CHECK: strong_release [[GY_AS_GX]]
|
||||||
// CHECK: [[GY_RESULT:%[0-9]+]] = unchecked_ref_cast [[GX_RESULT]] : $GX<Array<Int>> to $GY<Int>
|
// CHECK: [[GY_RESULT:%[0-9]+]] = unchecked_ref_cast [[GX_RESULT]] : $GX<Array<Int>> to $GY<Int>
|
||||||
// CHECK: strong_release [[GY_RESULT]] : $GY<Int>
|
// CHECK: strong_release [[GY_RESULT]] : $GY<Int>
|
||||||
|
// CHECK: strong_release [[GY]]
|
||||||
gy.f()
|
gy.f()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,8 +86,8 @@ func testExistentialDispatch(p: P) {
|
|||||||
func testExistentialDispatchClass(cp: CP) {
|
func testExistentialDispatchClass(cp: CP) {
|
||||||
// CHECK: bb0([[CP:%[0-9]+]] : $CP):
|
// CHECK: bb0([[CP:%[0-9]+]] : $CP):
|
||||||
// CHECK: [[CP_ADDR:%[0-9]+]] = open_existential_ref [[CP]] : $CP to $@opened([[N:".*"]]) CP
|
// CHECK: [[CP_ADDR:%[0-9]+]] = open_existential_ref [[CP]] : $CP to $@opened([[N:".*"]]) CP
|
||||||
// CHECK: [[CP_F:%[0-9]+]] = witness_method $@opened([[N]]) CP, #CP.f!1, [[CP_ADDR]]{{.*}} : $@cc(witness_method) @thin <τ_0_0 where τ_0_0 : CP> (@owned τ_0_0) -> @owned τ_0_0
|
// CHECK: [[CP_F:%[0-9]+]] = witness_method $@opened([[N]]) CP, #CP.f!1, [[CP_ADDR]]{{.*}} : $@cc(witness_method) @thin <τ_0_0 where τ_0_0 : CP> (@guaranteed τ_0_0) -> @owned τ_0_0
|
||||||
// CHECK: [[CP_F_RESULT:%[0-9]+]] = apply [[CP_F]]<@opened([[N]]) CP>([[CP_ADDR]]) : $@cc(witness_method) @thin <τ_0_0 where τ_0_0 : CP> (@owned τ_0_0) -> @owned τ_0_0
|
// CHECK: [[CP_F_RESULT:%[0-9]+]] = apply [[CP_F]]<@opened([[N]]) CP>([[CP_ADDR]]) : $@cc(witness_method) @thin <τ_0_0 where τ_0_0 : CP> (@guaranteed τ_0_0) -> @owned τ_0_0
|
||||||
// CHECK: [[RESULT_EXISTENTIAL:%[0-9]+]] = init_existential_ref [[CP_F_RESULT]] : $@opened([[N]]) CP : $@opened([[N]]) CP, $CP
|
// CHECK: [[RESULT_EXISTENTIAL:%[0-9]+]] = init_existential_ref [[CP_F_RESULT]] : $@opened([[N]]) CP : $@opened([[N]]) CP, $CP
|
||||||
// CHECK: strong_release [[CP_F_RESULT]] : $@opened([[N]]) CP
|
// CHECK: strong_release [[CP_F_RESULT]] : $@opened([[N]]) CP
|
||||||
cp.f()
|
cp.f()
|
||||||
@@ -123,14 +129,13 @@ func testObjCInit(meta: ObjCInit.Type) {
|
|||||||
class OptionalResult {
|
class OptionalResult {
|
||||||
func foo() -> Self? { return self }
|
func foo() -> Self? { return self }
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @_TFC12dynamic_self14OptionalResult3foofDS0_FT_GSqDS0__ : $@cc(method) @thin (@owned OptionalResult) -> @owned Optional<OptionalResult>
|
// CHECK-LABEL: sil hidden @_TFC12dynamic_self14OptionalResult3foofDS0_FT_GSqDS0__ : $@cc(method) @thin (@guaranteed OptionalResult) -> @owned Optional<OptionalResult>
|
||||||
// CHECK: [[SOME:%.*]] = init_enum_data_addr [[OPT:%[0-9]+]]
|
// CHECK: [[SOME:%.*]] = init_enum_data_addr [[OPT:%[0-9]+]]
|
||||||
// CHECK-NEXT: strong_retain [[VALUE:%[0-9]+]]
|
// CHECK-NEXT: strong_retain [[VALUE:%[0-9]+]]
|
||||||
// CHECK-NEXT: store [[VALUE]] to [[SOME]]
|
// CHECK-NEXT: store [[VALUE]] to [[SOME]]
|
||||||
// CHECK-NEXT: inject_enum_addr [[OPT]]{{.*}}Some
|
// CHECK-NEXT: inject_enum_addr [[OPT]]{{.*}}Some
|
||||||
// CHECK-NEXT: [[T0:%.*]] = load [[OPT]]#1
|
// CHECK-NEXT: [[T0:%.*]] = load [[OPT]]#1
|
||||||
// CHECK-NEXT: dealloc_stack [[OPT]]#0
|
// CHECK-NEXT: dealloc_stack [[OPT]]#0
|
||||||
// CHECK-NEXT: strong_release [[VALUE]]
|
|
||||||
// CHECK-NEXT: return [[T0]] : $Optional<OptionalResult>
|
// CHECK-NEXT: return [[T0]] : $Optional<OptionalResult>
|
||||||
|
|
||||||
class OptionalResultInheritor : OptionalResult {
|
class OptionalResultInheritor : OptionalResult {
|
||||||
@@ -141,7 +146,7 @@ func testOptionalResult(v : OptionalResultInheritor) {
|
|||||||
v.foo()?.bar()
|
v.foo()?.bar()
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @_TF12dynamic_self18testOptionalResult{{.*}} : $@thin (@owned OptionalResultInheritor) -> ()
|
// CHECK-LABEL: sil hidden @_TF12dynamic_self18testOptionalResult{{.*}} : $@thin (@owned OptionalResultInheritor) -> ()
|
||||||
// CHECK: [[T0:%.*]] = class_method [[V:%.*]] : $OptionalResult, #OptionalResult.foo!1 : Self -> () -> Self? , $@cc(method) @thin (@owned OptionalResult) -> @owned Optional<OptionalResult>
|
// CHECK: [[T0:%.*]] = class_method [[V:%.*]] : $OptionalResult, #OptionalResult.foo!1 : Self -> () -> Self? , $@cc(method) @thin (@guaranteed OptionalResult) -> @owned Optional<OptionalResult>
|
||||||
// CHECK-NEXT: apply [[T0]]([[V]])
|
// CHECK-NEXT: apply [[T0]]([[V]])
|
||||||
// CHECK: select_enum_addr
|
// CHECK: select_enum_addr
|
||||||
// CHECK: [[T1:%.*]] = unchecked_take_enum_data_addr
|
// CHECK: [[T1:%.*]] = unchecked_take_enum_data_addr
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class C {}
|
|||||||
class D: C {}
|
class D: C {}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF27force_cast_chained_optional4testFCS_3FooCS_1D
|
// CHECK-LABEL: sil hidden @_TF27force_cast_chained_optional4testFCS_3FooCS_1D
|
||||||
// CHECK: class_method %0 : $Foo, #Foo.bar!getter.1 : Foo -> () -> Bar! , $@cc(method) @thin (@owned Foo) ->
|
// CHECK: class_method %0 : $Foo, #Foo.bar!getter.1 : Foo -> () -> Bar! , $@cc(method) @thin (@guaranteed Foo) ->
|
||||||
// CHECK: select_enum_addr
|
// CHECK: select_enum_addr
|
||||||
// CHECK: cond_br {{%.*}}, [[SOME_BAR:bb[0-9]+]], [[NO_BAR:bb[0-9]+]]
|
// CHECK: cond_br {{%.*}}, [[SOME_BAR:bb[0-9]+]], [[NO_BAR:bb[0-9]+]]
|
||||||
// CHECK: [[NO_BAR]]:
|
// CHECK: [[NO_BAR]]:
|
||||||
@@ -20,7 +20,7 @@ class D: C {}
|
|||||||
// CHECK: [[SOME_BAR]]:
|
// CHECK: [[SOME_BAR]]:
|
||||||
// CHECK: [[PAYLOAD_ADDR:%.*]] = unchecked_take_enum_data_addr {{%.*}} : $*ImplicitlyUnwrappedOptional<Bar>
|
// CHECK: [[PAYLOAD_ADDR:%.*]] = unchecked_take_enum_data_addr {{%.*}} : $*ImplicitlyUnwrappedOptional<Bar>
|
||||||
// CHECK: [[BAR:%.*]] = load [[PAYLOAD_ADDR]]
|
// CHECK: [[BAR:%.*]] = load [[PAYLOAD_ADDR]]
|
||||||
// CHECK: class_method {{%.*}} : $Bar, #Bar.bas!getter.1 : Bar -> () -> C! , $@cc(method) @thin (@owned Bar) ->
|
// CHECK: class_method {{%.*}} : $Bar, #Bar.bas!getter.1 : Bar -> () -> C! , $@cc(method) @thin (@guaranteed Bar) ->
|
||||||
// CHECK: function_ref @_TFSs36_getImplicitlyUnwrappedOptionalValueU__FGSQQ__Q_
|
// CHECK: function_ref @_TFSs36_getImplicitlyUnwrappedOptionalValueU__FGSQQ__Q_
|
||||||
// CHECK: unconditional_checked_cast {{%.*}} : $C to $D
|
// CHECK: unconditional_checked_cast {{%.*}} : $C to $D
|
||||||
// CHECK: [[TRAP]]:
|
// CHECK: [[TRAP]]:
|
||||||
|
|||||||
@@ -80,11 +80,11 @@ class SomeClass {
|
|||||||
// CHECK: bb0(%0 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $@thick SomeClass.Type):
|
// CHECK: bb0(%0 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $@thick SomeClass.Type):
|
||||||
init(x:Int, y:Int) {}
|
init(x:Int, y:Int) {}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TFC9functions9SomeClass6method{{.*}} : $@cc(method) @thin (Builtin.Int64, @owned SomeClass) -> ()
|
// CHECK-LABEL: sil hidden @_TFC9functions9SomeClass6method{{.*}} : $@cc(method) @thin (Builtin.Int64, @guaranteed SomeClass) -> ()
|
||||||
// CHECK: bb0(%0 : $Builtin.Int64, %1 : $SomeClass):
|
// CHECK: bb0(%0 : $Builtin.Int64, %1 : $SomeClass):
|
||||||
func method(x: Int) {}
|
func method(x: Int) {}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TFC9functions9SomeClass14curried_method{{.*}} : $@cc(method) @thin (Builtin.Int64, Builtin.Int64, @owned SomeClass) -> ()
|
// CHECK-LABEL: sil hidden @_TFC9functions9SomeClass14curried_method{{.*}} : $@cc(method) @thin (Builtin.Int64, Builtin.Int64, @guaranteed SomeClass) -> ()
|
||||||
// CHECK: bb0(%0 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $SomeClass):
|
// CHECK: bb0(%0 : $Builtin.Int64, %1 : $Builtin.Int64, %2 : $SomeClass):
|
||||||
func curried_method(x: Int)(y: Int) {}
|
func curried_method(x: Int)(y: Int) {}
|
||||||
|
|
||||||
@@ -325,7 +325,7 @@ func calls(var i:Int, var j:Int, var k:Int) {
|
|||||||
// CHECK: [[C:%[0-9]+]] = load [[CADDR]]
|
// CHECK: [[C:%[0-9]+]] = load [[CADDR]]
|
||||||
// CHECK: [[J:%[0-9]+]] = load [[JADDR]]
|
// CHECK: [[J:%[0-9]+]] = load [[JADDR]]
|
||||||
// CHECK: [[K:%[0-9]+]] = load [[KADDR]]
|
// CHECK: [[K:%[0-9]+]] = load [[KADDR]]
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = class_method [[C]] : $SomeClass, #SomeClass.subscript!getter.1 : SomeClass -> (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 , $@cc(method) @thin (Builtin.Int64, Builtin.Int64, @owned SomeClass) -> Builtin.Int64
|
// CHECK: [[GETTER:%[0-9]+]] = class_method [[C]] : $SomeClass, #SomeClass.subscript!getter.1 : SomeClass -> (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 , $@cc(method) @thin (Builtin.Int64, Builtin.Int64, @guaranteed SomeClass) -> Builtin.Int64
|
||||||
// CHECK: apply [[GETTER]]([[J]], [[K]], [[C]])
|
// CHECK: apply [[GETTER]]([[J]], [[K]], [[C]])
|
||||||
i = c[j, k]
|
i = c[j, k]
|
||||||
|
|
||||||
@@ -333,7 +333,7 @@ func calls(var i:Int, var j:Int, var k:Int) {
|
|||||||
// CHECK: [[I:%[0-9]+]] = load [[IADDR]]
|
// CHECK: [[I:%[0-9]+]] = load [[IADDR]]
|
||||||
// CHECK: [[J:%[0-9]+]] = load [[JADDR]]
|
// CHECK: [[J:%[0-9]+]] = load [[JADDR]]
|
||||||
// CHECK: [[K:%[0-9]+]] = load [[KADDR]]
|
// CHECK: [[K:%[0-9]+]] = load [[KADDR]]
|
||||||
// CHECK: [[SETTER:%[0-9]+]] = class_method [[C]] : $SomeClass, #SomeClass.subscript!setter.1 : SomeClass -> (Builtin.Int64, Builtin.Int64, Builtin.Int64) -> () , $@cc(method) @thin (Builtin.Int64, Builtin.Int64, Builtin.Int64, @owned SomeClass) -> ()
|
// CHECK: [[SETTER:%[0-9]+]] = class_method [[C]] : $SomeClass, #SomeClass.subscript!setter.1 : SomeClass -> (Builtin.Int64, Builtin.Int64, Builtin.Int64) -> () , $@cc(method) @thin (Builtin.Int64, Builtin.Int64, Builtin.Int64, @guaranteed SomeClass) -> ()
|
||||||
// CHECK: apply [[SETTER]]([[K]], [[I]], [[J]], [[C]])
|
// CHECK: apply [[SETTER]]([[K]], [[I]], [[J]], [[C]])
|
||||||
c[i, j] = k
|
c[i, j] = k
|
||||||
|
|
||||||
@@ -567,8 +567,8 @@ final class r17828355Class {
|
|||||||
// CHECK-LABEL: sil shared @_TFC9functions14r17828355Class6methodFS0_FBi64_T_
|
// CHECK-LABEL: sil shared @_TFC9functions14r17828355Class6methodFS0_FBi64_T_
|
||||||
// CHECK-NEXT: bb0(%0 : $r17828355Class):
|
// CHECK-NEXT: bb0(%0 : $r17828355Class):
|
||||||
// CHECK-NEXT: // function_ref functions.r17828355Class.method (functions.r17828355Class)(Builtin.Int64) -> ()
|
// CHECK-NEXT: // function_ref functions.r17828355Class.method (functions.r17828355Class)(Builtin.Int64) -> ()
|
||||||
// CHECK-NEXT: %1 = function_ref @_TFC9functions14r17828355Class6methodfS0_FBi64_T_ : $@cc(method) @thin (Builtin.Int64, @owned r17828355Class) -> ()
|
// CHECK-NEXT: %1 = function_ref @_TFC9functions14r17828355Class6methodfS0_FBi64_T_ : $@cc(method) @thin (Builtin.Int64, @guaranteed r17828355Class) -> ()
|
||||||
// CHECK-NEXT: partial_apply %1(%0) : $@cc(method) @thin (Builtin.Int64, @owned r17828355Class) -> ()
|
// CHECK-NEXT: partial_apply %1(%0) : $@cc(method) @thin (Builtin.Int64, @guaranteed r17828355Class) -> ()
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ protocol ProtocolB {
|
|||||||
// CHECK: strong_retain [[PROJECTION]]
|
// CHECK: strong_retain [[PROJECTION]]
|
||||||
// CHECK: apply {{%.*}}<@opened{{.*}}>([[PROJECTION]])
|
// CHECK: apply {{%.*}}<@opened{{.*}}>([[PROJECTION]])
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
|
// CHECK-NOT: strong_release
|
||||||
func getIntPropExistential(a: ProtocolA) -> Int {
|
func getIntPropExistential(a: ProtocolA) -> Int {
|
||||||
return a.intProp
|
return a.intProp
|
||||||
}
|
}
|
||||||
@@ -27,12 +28,13 @@ func getIntPropExistential(a: ProtocolA) -> Int {
|
|||||||
// CHECK: strong_retain [[PROJECTION]]
|
// CHECK: strong_retain [[PROJECTION]]
|
||||||
// CHECK: apply {{%.*}}<@opened{{.*}}>({{%.*}}, [[PROJECTION]])
|
// CHECK: apply {{%.*}}<@opened{{.*}}>({{%.*}}, [[PROJECTION]])
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
|
// CHECK_NOT: strong_release
|
||||||
func setIntPropExistential(a: ProtocolA) {
|
func setIntPropExistential(a: ProtocolA) {
|
||||||
a.intProp = 0
|
a.intProp = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17getIntPropGenericUS_9ProtocolA__FQ_Si
|
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17getIntPropGenericUS_9ProtocolA__FQ_Si
|
||||||
// CHECK: strong_retain %0
|
// CHECK-NOT: strong_retain %0
|
||||||
// CHECK: apply {{%.*}}<T>(%0)
|
// CHECK: apply {{%.*}}<T>(%0)
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
func getIntPropGeneric<T: ProtocolA>(a: T) -> Int {
|
func getIntPropGeneric<T: ProtocolA>(a: T) -> Int {
|
||||||
@@ -40,7 +42,7 @@ func getIntPropGeneric<T: ProtocolA>(a: T) -> Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17setIntPropGenericUS_9ProtocolA__FQ_T_
|
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17setIntPropGenericUS_9ProtocolA__FQ_T_
|
||||||
// CHECK: strong_retain %0
|
// CHECK-NOT: strong_retain %0
|
||||||
// CHECK: apply {{%.*}}<T>({{%.*}}, %0)
|
// CHECK: apply {{%.*}}<T>({{%.*}}, %0)
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
func setIntPropGeneric<T: ProtocolA>(a: T) {
|
func setIntPropGeneric<T: ProtocolA>(a: T) {
|
||||||
@@ -97,19 +99,19 @@ func setIntPropExistential(a: ProtocolO) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17getIntPropGenericUS_9ProtocolO__FQ_Si
|
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17getIntPropGenericUS_9ProtocolO__FQ_Si
|
||||||
// CHECK: strong_retain %0
|
// CHECK-NOT: strong_retain %0
|
||||||
// CHECK: apply {{%.*}}<T>(%0)
|
// CHECK: apply {{%.*}}<T>(%0)
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
// CHECK: strong_release %0
|
// CHECK-NOT: strong_release %0
|
||||||
func getIntPropGeneric<T: ProtocolO>(a: T) -> Int {
|
func getIntPropGeneric<T: ProtocolO>(a: T) -> Int {
|
||||||
return a.intProp
|
return a.intProp
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17setIntPropGenericUS_9ProtocolO__FQ_T_
|
// CHECK-LABEL: sil hidden @_TF30generic_property_base_lifetime17setIntPropGenericUS_9ProtocolO__FQ_T_
|
||||||
// CHECK: strong_retain %0
|
// CHECK-NOT: strong_retain %0
|
||||||
// CHECK: apply {{%.*}}<T>({{%.*}}, %0)
|
// CHECK: apply {{%.*}}<T>({{%.*}}, %0)
|
||||||
// CHECK: strong_release %0
|
// CHECK: strong_release %0
|
||||||
// CHECK: strong_release %0
|
// CHECK-NOT: strong_release %0
|
||||||
func setIntPropGeneric<T: ProtocolO>(a: T) {
|
func setIntPropGeneric<T: ProtocolO>(a: T) {
|
||||||
a.intProp = 0
|
a.intProp = 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -395,30 +395,30 @@ struct StructMemberTest {
|
|||||||
func testIntMemberLoad() -> Int {
|
func testIntMemberLoad() -> Int {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}testIntMemberLoad
|
// CHECK-LABEL: sil hidden @{{.*}}testIntMemberLoad{{.*}} : $@cc(method) @thin (@guaranteed StructMemberTest)
|
||||||
// CHECK: bb0(%0 : $StructMemberTest):
|
// CHECK: bb0(%0 : $StructMemberTest):
|
||||||
// CHECK: debug_value %0 : $StructMemberTest // let self
|
// CHECK: debug_value %0 : $StructMemberTest // let self
|
||||||
// CHECK: %2 = struct_extract %0 : $StructMemberTest, #StructMemberTest.i
|
// CHECK: %2 = struct_extract %0 : $StructMemberTest, #StructMemberTest.i
|
||||||
// CHECK: release_value %0 : $StructMemberTest
|
// CHECK-NOT: release_value %0 : $StructMemberTest
|
||||||
// CHECK: return %2 : $Int
|
// CHECK: return %2 : $Int
|
||||||
|
|
||||||
// Accessing the int member in s should not retain the whole struct.
|
// Accessing the int member in s should not retain the whole struct.
|
||||||
func testRecursiveIntMemberLoad() -> Int {
|
func testRecursiveIntMemberLoad() -> Int {
|
||||||
return s.i
|
return s.i
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}testRecursiveIntMemberLoad
|
// CHECK-LABEL: sil hidden @{{.*}}testRecursiveIntMemberLoad{{.*}} : $@cc(method) @thin (@guaranteed StructMemberTest)
|
||||||
// CHECK: bb0(%0 : $StructMemberTest):
|
// CHECK: bb0(%0 : $StructMemberTest):
|
||||||
// CHECK: debug_value %0 : $StructMemberTest // let self
|
// CHECK: debug_value %0 : $StructMemberTest // let self
|
||||||
// CHECK: %2 = struct_extract %0 : $StructMemberTest, #StructMemberTest.s
|
// CHECK: %2 = struct_extract %0 : $StructMemberTest, #StructMemberTest.s
|
||||||
// CHECK: %3 = struct_extract %2 : $AnotherStruct, #AnotherStruct.i
|
// CHECK: %3 = struct_extract %2 : $AnotherStruct, #AnotherStruct.i
|
||||||
// CHECK: release_value %0 : $StructMemberTest
|
// CHECK-NOT: release_value %0 : $StructMemberTest
|
||||||
// CHECK: return %3 : $Int
|
// CHECK: return %3 : $Int
|
||||||
|
|
||||||
func testTupleMemberLoad() -> Int {
|
func testTupleMemberLoad() -> Int {
|
||||||
return t.1.i
|
return t.1.i
|
||||||
}
|
}
|
||||||
// FIXME: these retains and releases are unnecessary
|
// FIXME: these retains and releases are unnecessary
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}testTupleMemberLoad
|
// CHECK-LABEL: sil hidden @{{.*}}testTupleMemberLoad{{.*}} : $@cc(method) @thin (@guaranteed StructMemberTest)
|
||||||
// CHECK: bb0(%0 : $StructMemberTest):
|
// CHECK: bb0(%0 : $StructMemberTest):
|
||||||
// CHECK: debug_value %0 : $StructMemberTest // let self
|
// CHECK: debug_value %0 : $StructMemberTest // let self
|
||||||
// CHECK: [[T0:%.*]] = struct_extract %0 : $StructMemberTest, #StructMemberTest.t
|
// CHECK: [[T0:%.*]] = struct_extract %0 : $StructMemberTest, #StructMemberTest.t
|
||||||
@@ -427,7 +427,7 @@ struct StructMemberTest {
|
|||||||
// CHECK: [[T2:%.*]] = tuple_extract [[T0]] : $(Int, AnotherStruct), 1
|
// CHECK: [[T2:%.*]] = tuple_extract [[T0]] : $(Int, AnotherStruct), 1
|
||||||
// CHECK: [[T3:%.*]] = struct_extract [[T2]] : $AnotherStruct, #AnotherStruct.i
|
// CHECK: [[T3:%.*]] = struct_extract [[T2]] : $AnotherStruct, #AnotherStruct.i
|
||||||
// CHECK: release_value [[T2]] : $AnotherStruct
|
// CHECK: release_value [[T2]] : $AnotherStruct
|
||||||
// CHECK: release_value %0 : $StructMemberTest
|
// CHECK-NOT: release_value %0 : $StructMemberTest
|
||||||
// CHECK: return [[T3]] : $Int
|
// CHECK: return [[T3]] : $Int
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -439,25 +439,24 @@ struct GenericStruct<T> {
|
|||||||
func getA() -> T {
|
func getA() -> T {
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}GenericStruct4getA
|
// CHECK-LABEL: sil hidden @{{.*}}GenericStruct4getA{{.*}} : $@cc(method) @thin <T> (@out T, @in_guaranteed GenericStruct<T>)
|
||||||
// CHECK-NEXT: bb0(%0 : $*T, %1 : $*GenericStruct<T>):
|
// CHECK-NEXT: bb0(%0 : $*T, %1 : $*GenericStruct<T>):
|
||||||
// CHECK-NEXT: debug_value_addr %1 : $*GenericStruct<T> // let self
|
// CHECK-NEXT: debug_value_addr %1 : $*GenericStruct<T> // let self
|
||||||
// CHECK-NEXT: %3 = struct_element_addr %1 : $*GenericStruct<T>, #GenericStruct.a
|
// CHECK-NEXT: %3 = struct_element_addr %1 : $*GenericStruct<T>, #GenericStruct.a
|
||||||
// CHECK-NEXT: copy_addr %3 to [initialization] %0 : $*T
|
// CHECK-NEXT: copy_addr %3 to [initialization] %0 : $*T
|
||||||
// CHECK-NEXT: destroy_addr %1 : $*GenericStruct<T>
|
// CHECK-NEXT: %5 = tuple ()
|
||||||
// CHECK-NEXT: %6 = tuple ()
|
// CHECK-NEXT: return %5 : $()
|
||||||
// CHECK-NEXT: return %6 : $()
|
|
||||||
|
|
||||||
func getB() -> Int {
|
func getB() -> Int {
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}GenericStruct4getB
|
// CHECK-LABEL: sil hidden @{{.*}}GenericStruct4getB{{.*}} : $@cc(method) @thin <T> (@in_guaranteed GenericStruct<T>) -> Int
|
||||||
// CHECK-NEXT: bb0(%0 : $*GenericStruct<T>):
|
// CHECK-NEXT: bb0(%0 : $*GenericStruct<T>):
|
||||||
// CHECK-NEXT: debug_value_addr %0 : $*GenericStruct<T> // let self
|
// CHECK-NEXT: debug_value_addr %0 : $*GenericStruct<T> // let self
|
||||||
// CHECK-NEXT: %2 = struct_element_addr %0 : $*GenericStruct<T>, #GenericStruct.b
|
// CHECK-NEXT: %2 = struct_element_addr %0 : $*GenericStruct<T>, #GenericStruct.b
|
||||||
// CHECK-NEXT: %3 = load %2 : $*Int
|
// CHECK-NEXT: %3 = load %2 : $*Int
|
||||||
// CHECK-NEXT: destroy_addr %0 : $*GenericStruct<T>
|
// CHECK-NOT: destroy_addr %0 : $*GenericStruct<T>
|
||||||
// CHECK-NEXT: return %3 : $Int
|
// CHECK-NEXT: return %3 : $Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ class RefWithProp {
|
|||||||
var aleph_prop: Aleph { get {} set {} }
|
var aleph_prop: Aleph { get {} set {} }
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF8lifetime23logical_lvalue_lifetime
|
// CHECK-LABEL: sil hidden @_TF8lifetime23logical_lvalue_lifetimeFTCS_11RefWithPropSiVS_3Val_T_ : $@thin (@owned RefWithProp, Int, Val) -> () {
|
||||||
func logical_lvalue_lifetime(var r: RefWithProp, var i: Int, var v: Val) {
|
func logical_lvalue_lifetime(var r: RefWithProp, var i: Int, var v: Val) {
|
||||||
// CHECK: [[RADDR:%[0-9]+]] = alloc_box $RefWithProp
|
// CHECK: [[RADDR:%[0-9]+]] = alloc_box $RefWithProp
|
||||||
// CHECK: [[IADDR:%[0-9]+]] = alloc_box $Int
|
// CHECK: [[IADDR:%[0-9]+]] = alloc_box $Int
|
||||||
@@ -348,16 +348,16 @@ func logical_lvalue_lifetime(var r: RefWithProp, var i: Int, var v: Val) {
|
|||||||
// -- Reference types need to be retained as property method args.
|
// -- Reference types need to be retained as property method args.
|
||||||
r.int_prop = i
|
r.int_prop = i
|
||||||
// CHECK: [[R1:%[0-9]+]] = load [[RADDR]]
|
// CHECK: [[R1:%[0-9]+]] = load [[RADDR]]
|
||||||
// CHECK: retain [[R1]]
|
// CHECK: strong_retain [[R1]]
|
||||||
// CHECK: [[SETTER_METHOD:%[0-9]+]] = class_method {{.*}} : $RefWithProp, #RefWithProp.int_prop!setter.1 : RefWithProp -> (Int) -> ()
|
// CHECK: [[SETTER_METHOD:%[0-9]+]] = class_method {{.*}} : $RefWithProp, #RefWithProp.int_prop!setter.1 : RefWithProp -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed RefWithProp) -> ()
|
||||||
// CHECK: apply [[SETTER_METHOD]]({{.*}}, [[R1]])
|
// CHECK: apply [[SETTER_METHOD]]({{.*}}, [[R1]])
|
||||||
|
// CHECK: strong_release [[R1]]
|
||||||
|
|
||||||
r.aleph_prop.b = v
|
r.aleph_prop.b = v
|
||||||
// CHECK: [[R2:%[0-9]+]] = load [[RADDR]]
|
// CHECK: [[R2:%[0-9]+]] = load [[RADDR]]
|
||||||
// CHECK: retain [[R2]]
|
// CHECK: strong_retain [[R2]]
|
||||||
// CHECK: [[STORAGE:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
// CHECK: [[STORAGE:%.*]] = alloc_stack $Builtin.UnsafeValueBuffer
|
||||||
// CHECK: [[ALEPH_PROP_TEMP:%[0-9]+]] = alloc_stack $Aleph
|
// CHECK: [[ALEPH_PROP_TEMP:%[0-9]+]] = alloc_stack $Aleph
|
||||||
// CHECK: retain [[R2]]
|
|
||||||
// CHECK: [[T0:%.*]] = address_to_pointer [[ALEPH_PROP_TEMP]]#1
|
// CHECK: [[T0:%.*]] = address_to_pointer [[ALEPH_PROP_TEMP]]#1
|
||||||
// CHECK: [[MATERIALIZE_METHOD:%[0-9]+]] = class_method {{.*}} : $RefWithProp, #RefWithProp.aleph_prop!materializeForSet.1 :
|
// CHECK: [[MATERIALIZE_METHOD:%[0-9]+]] = class_method {{.*}} : $RefWithProp, #RefWithProp.aleph_prop!materializeForSet.1 :
|
||||||
// CHECK: [[MATERIALIZE:%.*]] = apply [[MATERIALIZE_METHOD]]([[T0]], [[STORAGE]]#1, [[R2]])
|
// CHECK: [[MATERIALIZE:%.*]] = apply [[MATERIALIZE_METHOD]]([[T0]], [[STORAGE]]#1, [[R2]])
|
||||||
@@ -460,13 +460,13 @@ class Foo<T> {
|
|||||||
// Deallocating destructor for Foo.
|
// Deallocating destructor for Foo.
|
||||||
// CHECK-LABEL: sil hidden @_TFC8lifetime3FooD : $@cc(method) @thin <T> (@owned Foo<T>) -> ()
|
// CHECK-LABEL: sil hidden @_TFC8lifetime3FooD : $@cc(method) @thin <T> (@owned Foo<T>) -> ()
|
||||||
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $Foo<T>):
|
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $Foo<T>):
|
||||||
// CHECK: [[DESTROYING_REF:%[0-9]+]] = function_ref @_TFC8lifetime3Food : $@cc(method) @thin <τ_0_0> (@owned Foo<τ_0_0>) -> @owned Builtin.NativeObject
|
// CHECK: [[DESTROYING_REF:%[0-9]+]] = function_ref @_TFC8lifetime3Food : $@cc(method) @thin <τ_0_0> (@guaranteed Foo<τ_0_0>) -> @owned Builtin.NativeObject
|
||||||
// CHECK-NEXT: [[RESULT_SELF:%[0-9]+]] = apply [[DESTROYING_REF]]<T>([[SELF]]) : $@cc(method) @thin <τ_0_0> (@owned Foo<τ_0_0>) -> @owned Builtin.NativeObject
|
// CHECK-NEXT: [[RESULT_SELF:%[0-9]+]] = apply [[DESTROYING_REF]]<T>([[SELF]]) : $@cc(method) @thin <τ_0_0> (@guaranteed Foo<τ_0_0>) -> @owned Builtin.NativeObject
|
||||||
// CHECK-NEXT: [[SELF:%[0-9]+]] = unchecked_ref_cast [[RESULT_SELF]] : $Builtin.NativeObject to $Foo<T>
|
// CHECK-NEXT: [[SELF:%[0-9]+]] = unchecked_ref_cast [[RESULT_SELF]] : $Builtin.NativeObject to $Foo<T>
|
||||||
// CHECK-NEXT: dealloc_ref [[SELF]] : $Foo<T>
|
// CHECK-NEXT: dealloc_ref [[SELF]] : $Foo<T>
|
||||||
// CHECK-NEXT: [[RESULT:%[0-9]+]] = tuple ()
|
// CHECK-NEXT: [[RESULT:%[0-9]+]] = tuple ()
|
||||||
// CHECK-NEXT: return [[RESULT]] : $()
|
// CHECK-NEXT: return [[RESULT]] : $()
|
||||||
// CHECK-LABEL: sil hidden @_TFC8lifetime3Food : $@cc(method) @thin <T> (@owned Foo<T>) -> @owned Builtin.NativeObject
|
// CHECK-LABEL: sil hidden @_TFC8lifetime3Food : $@cc(method) @thin <T> (@guaranteed Foo<T>) -> @owned Builtin.NativeObject
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
// CHECK: bb0([[THIS:%[0-9]+]] : $Foo<T>):
|
// CHECK: bb0([[THIS:%[0-9]+]] : $Foo<T>):
|
||||||
@@ -636,7 +636,7 @@ func downcast(var b: B) {
|
|||||||
// CHECK: [[D:%[0-9]+]] = unconditional_checked_cast [[B]] : {{.*}} to $D
|
// CHECK: [[D:%[0-9]+]] = unconditional_checked_cast [[B]] : {{.*}} to $D
|
||||||
// CHECK: apply {{.*}}([[D]])
|
// CHECK: apply {{.*}}([[D]])
|
||||||
// CHECK-NOT: release [[B]]
|
// CHECK-NOT: release [[B]]
|
||||||
// CHECK-NOT: release [[D]]
|
// CHECK: release [[D]]
|
||||||
// CHECK: release [[BADDR]]
|
// CHECK: release [[BADDR]]
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class Base {
|
|||||||
// The ordering here is unfortunate: we generate the property
|
// The ordering here is unfortunate: we generate the property
|
||||||
// getters and setters after we've processed the decl.
|
// getters and setters after we've processed the decl.
|
||||||
|
|
||||||
// CHECK: sil hidden [transparent] @_TFC17materializeForSet4Basem8computedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned Base) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout Base, @thick Base.Type) -> ()>) {
|
// CHECK: sil hidden [transparent] @_TFC17materializeForSet4Basem8computedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed Base) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout Base, @thick Base.Type) -> ()>) {
|
||||||
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $Base):
|
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $Base):
|
||||||
// CHECK: [[ADDR:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Int
|
// CHECK: [[ADDR:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Int
|
||||||
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet4Baseg8computedSi
|
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet4Baseg8computedSi
|
||||||
@@ -46,7 +46,7 @@ class Base {
|
|||||||
// CHECK: [[SETTER:%.*]] = function_ref @_TFC17materializeForSet4Bases8computedSi
|
// CHECK: [[SETTER:%.*]] = function_ref @_TFC17materializeForSet4Bases8computedSi
|
||||||
// CHECK: apply [[SETTER]]([[T2]], [[T0]])
|
// CHECK: apply [[SETTER]]([[T2]], [[T0]])
|
||||||
|
|
||||||
// CHECK: sil hidden [transparent] @_TFC17materializeForSet4Basem6storedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned Base) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout Base, @thick Base.Type) -> ()>) {
|
// CHECK: sil hidden [transparent] @_TFC17materializeForSet4Basem6storedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed Base) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout Base, @thick Base.Type) -> ()>) {
|
||||||
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $Base):
|
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $Base):
|
||||||
// CHECK: [[T0:%.*]] = ref_element_addr [[SELF]] : $Base, #Base.stored
|
// CHECK: [[T0:%.*]] = ref_element_addr [[SELF]] : $Base, #Base.stored
|
||||||
// CHECK: [[T1:%.*]] = address_to_pointer [[T0]] : $*Int to $Builtin.RawPointer
|
// CHECK: [[T1:%.*]] = address_to_pointer [[T0]] : $*Int to $Builtin.RawPointer
|
||||||
@@ -71,7 +71,7 @@ class HasDidSet : Base {
|
|||||||
// Checking this after silgen, but before mandatory inlining, lets us
|
// Checking this after silgen, but before mandatory inlining, lets us
|
||||||
// test the intent much better.
|
// test the intent much better.
|
||||||
|
|
||||||
// SILGEN: sil hidden [transparent] @_TFC17materializeForSet9HasDidSetm6storedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned HasDidSet) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasDidSet, @thick HasDidSet.Type) -> ()>) {
|
// SILGEN: sil hidden [transparent] @_TFC17materializeForSet9HasDidSetm6storedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasDidSet) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasDidSet, @thick HasDidSet.Type) -> ()>) {
|
||||||
// SILGEN: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasDidSet):
|
// SILGEN: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasDidSet):
|
||||||
// SILGEN: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Int
|
// SILGEN: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Int
|
||||||
// SILGEN: [[T0:%.*]] = function_ref @_TFC17materializeForSet9HasDidSetg6storedSi
|
// SILGEN: [[T0:%.*]] = function_ref @_TFC17materializeForSet9HasDidSetg6storedSi
|
||||||
@@ -87,7 +87,7 @@ class HasDidSet : Base {
|
|||||||
set(value) {}
|
set(value) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: sil hidden [transparent] @_TFC17materializeForSet9HasDidSetm8computedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned HasDidSet) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasDidSet, @thick HasDidSet.Type) -> ()>) {
|
// CHECK: sil hidden [transparent] @_TFC17materializeForSet9HasDidSetm8computedSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasDidSet) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasDidSet, @thick HasDidSet.Type) -> ()>) {
|
||||||
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasDidSet):
|
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasDidSet):
|
||||||
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Int
|
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Int
|
||||||
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet9HasDidSetg8computedSi
|
// CHECK: [[T0:%.*]] = function_ref @_TFC17materializeForSet9HasDidSetg8computedSi
|
||||||
@@ -102,7 +102,7 @@ class HasDidSet : Base {
|
|||||||
class HasWeak {
|
class HasWeak {
|
||||||
weak var weakvar: HasWeak? = nil
|
weak var weakvar: HasWeak? = nil
|
||||||
}
|
}
|
||||||
// CHECK: sil hidden [transparent] @_TFC17materializeForSet7HasWeakm7weakvarXwGSqS0__ : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned HasWeak) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasWeak, @thick HasWeak.Type) -> ()>) {
|
// CHECK: sil hidden [transparent] @_TFC17materializeForSet7HasWeakm7weakvarXwGSqS0__ : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasWeak) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasWeak, @thick HasWeak.Type) -> ()>) {
|
||||||
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasWeak):
|
// CHECK: bb0([[BUFFER:%.*]] : $Builtin.RawPointer, [[STORAGE:%.*]] : $*Builtin.UnsafeValueBuffer, [[SELF:%.*]] : $HasWeak):
|
||||||
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Optional<HasWeak>
|
// CHECK: [[T2:%.*]] = pointer_to_address [[BUFFER]] : $Builtin.RawPointer to $*Optional<HasWeak>
|
||||||
// CHECK: [[T0:%.*]] = ref_element_addr [[SELF]] : $HasWeak, #HasWeak.weakvar
|
// CHECK: [[T0:%.*]] = ref_element_addr [[SELF]] : $HasWeak, #HasWeak.weakvar
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ func lazyPropertiesAreNotStored(var container: LazyContainer) {
|
|||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF10multi_file29lazyRefPropertiesAreNotStored
|
// CHECK-LABEL: sil hidden @_TF10multi_file29lazyRefPropertiesAreNotStored
|
||||||
func lazyRefPropertiesAreNotStored(container: LazyContainerClass) {
|
func lazyRefPropertiesAreNotStored(container: LazyContainerClass) {
|
||||||
// CHECK: {{%[0-9]+}} = class_method %0 : $LazyContainerClass, #LazyContainerClass.lazyVar!getter.1 : LazyContainerClass -> () -> Int , $@cc(method) @thin (@owned LazyContainerClass) -> Int
|
// CHECK: {{%[0-9]+}} = class_method %0 : $LazyContainerClass, #LazyContainerClass.lazyVar!getter.1 : LazyContainerClass -> () -> Int , $@cc(method) @thin (@guaranteed LazyContainerClass) -> Int
|
||||||
println(container.lazyVar)
|
println(container.lazyVar)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,5 +43,5 @@ class HasComputedProperty: ProtocolWithProperty {
|
|||||||
set {}
|
set {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TFC10multi_file19HasComputedPropertym3fooSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @owned HasComputedProperty) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasComputedProperty, @thick HasComputedProperty.Type) -> ()>) {
|
// CHECK-LABEL: sil hidden [transparent] @_TFC10multi_file19HasComputedPropertym3fooSi : $@cc(method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @guaranteed HasComputedProperty) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasComputedProperty, @thick HasComputedProperty.Type) -> ()>) {
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC10multi_file19HasComputedPropertyS_20ProtocolWithPropertyS_FS1_m3fooSi : $@cc(witness_method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout HasComputedProperty) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasComputedProperty, @thick HasComputedProperty.Type) -> ()>) {
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC10multi_file19HasComputedPropertyS_20ProtocolWithPropertyS_FS1_m3fooSi : $@cc(witness_method) @thin (Builtin.RawPointer, @inout Builtin.UnsafeValueBuffer, @inout HasComputedProperty) -> (Builtin.RawPointer, Optional<@thin (Builtin.RawPointer, inout Builtin.UnsafeValueBuffer, inout HasComputedProperty, @thick HasComputedProperty.Type) -> ()>) {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class SwiftGizmo : Gizmo {
|
|||||||
// CHECK-NOT: sil hidden @_TToFC19objc_attr_NSManaged10SwiftGizmos1xCS_1X
|
// CHECK-NOT: sil hidden @_TToFC19objc_attr_NSManaged10SwiftGizmos1xCS_1X
|
||||||
|
|
||||||
// Make sure that we're calling through the @objc entry points.
|
// Make sure that we're calling through the @objc entry points.
|
||||||
// CHECK-LABEL: sil hidden @_TFC19objc_attr_NSManaged10SwiftGizmo7modifyX{{.*}} : $@cc(method) @thin (@owned SwiftGizmo) -> () {
|
// CHECK-LABEL: sil hidden @_TFC19objc_attr_NSManaged10SwiftGizmo7modifyX{{.*}} : $@cc(method) @thin (@guaranteed SwiftGizmo) -> () {
|
||||||
func modifyX() {
|
func modifyX() {
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = class_method [volatile] [[SELF:%.*]] : $SwiftGizmo, #SwiftGizmo.x!getter.1.foreign : SwiftGizmo -> () -> X , $@cc(objc_method) @thin (SwiftGizmo) -> @autoreleased X
|
// CHECK: [[GETTER:%[0-9]+]] = class_method [volatile] [[SELF:%.*]] : $SwiftGizmo, #SwiftGizmo.x!getter.1.foreign : SwiftGizmo -> () -> X , $@cc(objc_method) @thin (SwiftGizmo) -> @autoreleased X
|
||||||
// CHECK-NEXT: apply [[GETTER]]([[SELF]]) : $@cc(objc_method) @thin (SwiftGizmo) -> @autoreleased X
|
// CHECK-NEXT: apply [[GETTER]]([[SELF]]) : $@cc(objc_method) @thin (SwiftGizmo) -> @autoreleased X
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import Foundation
|
|||||||
// CHECK: [[COPY:%.*]] = copy_block %0
|
// CHECK: [[COPY:%.*]] = copy_block %0
|
||||||
// CHECK: [[THUNK:%.*]] = function_ref @_TTRXFdCb_dSi_dSi_XFo_dSi_dSi_
|
// CHECK: [[THUNK:%.*]] = function_ref @_TTRXFdCb_dSi_dSi_XFo_dSi_dSi_
|
||||||
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[COPY]])
|
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[COPY]])
|
||||||
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo3foo{{.*}} : $@cc(method) @thin (@owned @callee_owned (Int) -> Int, Int, @owned Foo) -> Int
|
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo3foo{{.*}} : $@cc(method) @thin (@owned @callee_owned (Int) -> Int, Int, @guaranteed Foo) -> Int
|
||||||
// CHECK: apply [[NATIVE]]([[BRIDGED]], %1, %2)
|
// CHECK: apply [[NATIVE]]([[BRIDGED]], %1, %2)
|
||||||
dynamic func foo(f: Int -> Int, x: Int) -> Int {
|
dynamic func foo(f: Int -> Int, x: Int) -> Int {
|
||||||
return f(x)
|
return f(x)
|
||||||
@@ -19,7 +19,7 @@ import Foundation
|
|||||||
// CHECK: [[COPY:%.*]] = copy_block %0
|
// CHECK: [[COPY:%.*]] = copy_block %0
|
||||||
// CHECK: [[THUNK:%.*]] = function_ref @_TTRXFdCb_dCSo8NSString_aS__XFo_oSS_oSS_
|
// CHECK: [[THUNK:%.*]] = function_ref @_TTRXFdCb_dCSo8NSString_aS__XFo_oSS_oSS_
|
||||||
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[COPY]])
|
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[COPY]])
|
||||||
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo3bar{{.*}} : $@cc(method) @thin (@owned @callee_owned (@owned String) -> @owned String, @owned String, @owned Foo) -> @owned String
|
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo3bar{{.*}} : $@cc(method) @thin (@owned @callee_owned (@owned String) -> @owned String, @owned String, @guaranteed Foo) -> @owned String
|
||||||
// CHECK: apply [[NATIVE]]([[BRIDGED]], {{%.*}}, %2)
|
// CHECK: apply [[NATIVE]]([[BRIDGED]], {{%.*}}, %2)
|
||||||
dynamic func bar(f: String -> String, x: String) -> String {
|
dynamic func bar(f: String -> String, x: String) -> String {
|
||||||
return f(x)
|
return f(x)
|
||||||
@@ -29,7 +29,7 @@ import Foundation
|
|||||||
// CHECK: [[COPY:%.*]] = copy_block %0
|
// CHECK: [[COPY:%.*]] = copy_block %0
|
||||||
// CHECK: [[THUNK:%.*]] = function_ref @_TTRXFdCb_dGSqCSo8NSString__aGSqS___XFo_oGSqSS__oGSqSS__
|
// CHECK: [[THUNK:%.*]] = function_ref @_TTRXFdCb_dGSqCSo8NSString__aGSqS___XFo_oGSqSS__oGSqSS__
|
||||||
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[COPY]])
|
// CHECK: [[BRIDGED:%.*]] = partial_apply [[THUNK]]([[COPY]])
|
||||||
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo3bas{{.*}} : $@cc(method) @thin (@owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>, @owned Optional<String>, @owned Foo) -> @owned Optional<String>
|
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo3bas{{.*}} : $@cc(method) @thin (@owned @callee_owned (@owned Optional<String>) -> @owned Optional<String>, @owned Optional<String>, @guaranteed Foo) -> @owned Optional<String>
|
||||||
// CHECK: apply [[NATIVE]]([[BRIDGED]], {{%.*}}, %2)
|
// CHECK: apply [[NATIVE]]([[BRIDGED]], {{%.*}}, %2)
|
||||||
dynamic func bas(f: String? -> String?, x: String?) -> String? {
|
dynamic func bas(f: String? -> String?, x: String?) -> String? {
|
||||||
return f(x)
|
return f(x)
|
||||||
@@ -55,7 +55,7 @@ import Foundation
|
|||||||
// CHECK: [[BRIDGED:%.*]] = partial_apply [[BLOCK_THUNK]]([[BLOCK]])
|
// CHECK: [[BRIDGED:%.*]] = partial_apply [[BLOCK_THUNK]]([[BLOCK]])
|
||||||
// CHECK: [[REABSTRACT_THUNK:%.*]] = function_ref @_TTRXFo_oSS_oSS_XFo_iSS_iSS_
|
// CHECK: [[REABSTRACT_THUNK:%.*]] = function_ref @_TTRXFo_oSS_oSS_XFo_iSS_iSS_
|
||||||
// CHECK: [[REABSTRACT:%.*]] = partial_apply [[REABSTRACT_THUNK]]([[BRIDGED]])
|
// CHECK: [[REABSTRACT:%.*]] = partial_apply [[REABSTRACT_THUNK]]([[BRIDGED]])
|
||||||
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo7optFunc{{.*}} : $@cc(method) @thin (@owned Optional<String -> String>, @owned String, @owned Foo) -> @owned Optional<String>
|
// CHECK: [[NATIVE:%.*]] = function_ref @_TFC20objc_blocks_bridging3Foo7optFunc{{.*}} : $@cc(method) @thin (@owned Optional<String -> String>, @owned String, @guaranteed Foo) -> @owned Optional<String>
|
||||||
// CHECK: apply [[NATIVE]]
|
// CHECK: apply [[NATIVE]]
|
||||||
dynamic func optFunc(f: (String -> String)?, x: String) -> String? {
|
dynamic func optFunc(f: (String -> String)?, x: String) -> String? {
|
||||||
return f?(x)
|
return f?(x)
|
||||||
|
|||||||
@@ -241,7 +241,8 @@ class Bas : NSObject {
|
|||||||
// CHECK: strong_retain [[THIS]] : $Bas
|
// CHECK: strong_retain [[THIS]] : $Bas
|
||||||
// CHECK: // function_ref objc_bridging.Bas.strRealProp.getter
|
// CHECK: // function_ref objc_bridging.Bas.strRealProp.getter
|
||||||
// CHECK: [[PROPIMPL:%.*]] = function_ref @_TFC13objc_bridging3Basg11strRealPropSS
|
// CHECK: [[PROPIMPL:%.*]] = function_ref @_TFC13objc_bridging3Basg11strRealPropSS
|
||||||
// CHECK: [[PROP_COPY:%.*]] = apply [[PROPIMPL]]([[THIS]]) : $@cc(method) @thin (@owned Bas) -> @owned String
|
// CHECK: [[PROP_COPY:%.*]] = apply [[PROPIMPL]]([[THIS]]) : $@cc(method) @thin (@guaranteed Bas) -> @owned String
|
||||||
|
// CHECK: strong_release [[THIS]]
|
||||||
// CHECK: [[STRING_TO_NSSTRING:%.*]] = function_ref @swift_StringToNSString
|
// CHECK: [[STRING_TO_NSSTRING:%.*]] = function_ref @swift_StringToNSString
|
||||||
// CHECK: [[NSSTR:%.*]] = apply [[STRING_TO_NSSTRING]]([[PROP_COPY]])
|
// CHECK: [[NSSTR:%.*]] = apply [[STRING_TO_NSSTRING]]([[PROP_COPY]])
|
||||||
// CHECK: autorelease_return [[NSSTR]]
|
// CHECK: autorelease_return [[NSSTR]]
|
||||||
@@ -352,18 +353,21 @@ class Bas : NSObject {
|
|||||||
// CHECK: [[CONV_FN:%[0-9]+]] = function_ref @_TF10Foundation22_convertNSArrayToArray{{.*}} : $@thin <τ_0_0> (@owned Optional<NSArray>) -> @owned Array<τ_0_0>
|
// CHECK: [[CONV_FN:%[0-9]+]] = function_ref @_TF10Foundation22_convertNSArrayToArray{{.*}} : $@thin <τ_0_0> (@owned Optional<NSArray>) -> @owned Array<τ_0_0>
|
||||||
// CHECK-NEXT: [[OPT_NSARRAY:%[0-9]+]] = enum $Optional<NSArray>, #Optional.Some!enumelt.1, [[NSARRAY]] : $NSArray
|
// CHECK-NEXT: [[OPT_NSARRAY:%[0-9]+]] = enum $Optional<NSArray>, #Optional.Some!enumelt.1, [[NSARRAY]] : $NSArray
|
||||||
// CHECK-NEXT: [[ARRAY:%[0-9]+]] = apply [[CONV_FN]]<AnyObject>([[OPT_NSARRAY]]) : $@thin <τ_0_0> (@owned Optional<NSArray>) -> @owned Array<τ_0_0>
|
// CHECK-NEXT: [[ARRAY:%[0-9]+]] = apply [[CONV_FN]]<AnyObject>([[OPT_NSARRAY]]) : $@thin <τ_0_0> (@owned Optional<NSArray>) -> @owned Array<τ_0_0>
|
||||||
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC13objc_bridging3Bas{{.*}} : $@cc(method) @thin (@owned Array<AnyObject>, @owned Bas) -> ()
|
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC13objc_bridging3Bas{{.*}} : $@cc(method) @thin (@owned Array<AnyObject>, @guaranteed Bas) -> ()
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = apply [[SWIFT_FN]]([[ARRAY]], [[SELF]]) : $@cc(method) @thin (@owned Array<AnyObject>, @owned Bas) -> ()
|
// CHECK: [[RESULT:%[0-9]+]] = apply [[SWIFT_FN]]([[ARRAY]], [[SELF]]) : $@cc(method) @thin (@owned Array<AnyObject>, @guaranteed Bas) -> ()
|
||||||
|
// CHECK: strong_release [[SELF]] : $Bas
|
||||||
// CHECK: return [[RESULT]] : $()
|
// CHECK: return [[RESULT]] : $()
|
||||||
func arrayArg(array: [AnyObject]) { }
|
func arrayArg(array: [AnyObject]) { }
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TToFC13objc_bridging3Bas11arrayResult{{.*}} : $@cc(objc_method) @thin (Bas) -> @autoreleased NSArray
|
// CHECK-LABEL: sil hidden @_TToFC13objc_bridging3Bas11arrayResult{{.*}} : $@cc(objc_method) @thin (Bas) -> @autoreleased NSArray
|
||||||
// CHECK: bb0([[SELF:%[0-9]+]] : $Bas):
|
// CHECK: bb0([[SELF:%[0-9]+]] : $Bas):
|
||||||
// CHECK: strong_retain [[SELF]] : $Bas
|
// CHECK: strong_retain [[SELF]] : $Bas
|
||||||
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC13objc_bridging3Bas11arrayResult{{.*}} : $@cc(method) @thin (@owned Bas) -> @owned Array<AnyObject>
|
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC13objc_bridging3Bas11arrayResult{{.*}} : $@cc(method) @thin (@guaranteed Bas) -> @owned Array<AnyObject>
|
||||||
// CHECK: [[ARRAY:%[0-9]+]] = apply [[SWIFT_FN]]([[SELF]]) : $@cc(method) @thin (@owned Bas) -> @owned Array<AnyObject>
|
// CHECK: [[ARRAY:%[0-9]+]] = apply [[SWIFT_FN]]([[SELF]]) : $@cc(method) @thin (@guaranteed Bas) -> @owned Array<AnyObject>
|
||||||
|
// CHECK: strong_release [[SELF]]
|
||||||
// CHECK: [[CONV_FN:%[0-9]+]] = function_ref @_TF10Foundation22_convertArrayToNSArray{{.*}} : $@thin <τ_0_0> (@owned Array<τ_0_0>) -> @owned NSArray
|
// CHECK: [[CONV_FN:%[0-9]+]] = function_ref @_TF10Foundation22_convertArrayToNSArray{{.*}} : $@thin <τ_0_0> (@owned Array<τ_0_0>) -> @owned NSArray
|
||||||
// CHECK: [[NSARRAY:%[0-9]+]] = apply [[CONV_FN]]<AnyObject>([[ARRAY]]) : $@thin <τ_0_0> (@owned Array<τ_0_0>) -> @owned NSArray
|
// CHECK: [[NSARRAY:%[0-9]+]] = apply [[CONV_FN]]<AnyObject>([[ARRAY]]) : $@thin <τ_0_0> (@owned Array<τ_0_0>) -> @owned NSArray
|
||||||
|
// CHECK: autorelease_return [[NSARRAY]]
|
||||||
func arrayResult() -> [AnyObject] { return [] }
|
func arrayResult() -> [AnyObject] { return [] }
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TToFC13objc_bridging3Basg9arrayPropGSaSS_ : $@cc(objc_method) @thin (Bas) -> @autoreleased NSArray
|
// CHECK-LABEL: sil hidden [transparent] @_TToFC13objc_bridging3Basg9arrayPropGSaSS_ : $@cc(objc_method) @thin (Bas) -> @autoreleased NSArray
|
||||||
|
|||||||
@@ -9,8 +9,11 @@ func curry_pod(x: CurryTest) -> Int -> Int {
|
|||||||
return x.pod
|
return x.pod
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @_TF13objc_currying9curry_podFCSo9CurryTestFSiSi : $@thin (@owned CurryTest) -> @owned @callee_owned (Int) -> Int
|
// CHECK-LABEL: sil hidden @_TF13objc_currying9curry_podFCSo9CurryTestFSiSi : $@thin (@owned CurryTest) -> @owned @callee_owned (Int) -> Int
|
||||||
// CHECK: [[THUNK:%.*]] = function_ref [[THUNK_FOO_1:@_TTOFCSo9CurryTest3podFS_FSiSi]]
|
// CHECK: bb0([[ARG1:%.*]] : $CurryTest):
|
||||||
|
// CHECK: strong_retain [[ARG1]]
|
||||||
|
// CHECK: [[THUNK:%.*]] = function_ref [[THUNK_FOO_1:@_TTOFCSo9CurryTest3podFS_FSiSi]] : $@thin (@owned CurryTest) -> @owned @callee_owned (Int) -> Int
|
||||||
// CHECK: [[FN:%.*]] = apply [[THUNK]](%0)
|
// CHECK: [[FN:%.*]] = apply [[THUNK]](%0)
|
||||||
|
// CHECK: strong_release [[ARG1]]
|
||||||
// CHECK: return [[FN]]
|
// CHECK: return [[FN]]
|
||||||
|
|
||||||
// CHECK: sil shared [[THUNK_FOO_1]] : $@thin (@owned CurryTest) -> @owned @callee_owned (Int) -> Int
|
// CHECK: sil shared [[THUNK_FOO_1]] : $@thin (@owned CurryTest) -> @owned @callee_owned (Int) -> Int
|
||||||
@@ -18,10 +21,12 @@ func curry_pod(x: CurryTest) -> Int -> Int {
|
|||||||
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]](%0)
|
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]](%0)
|
||||||
// CHECK: return [[FN]]
|
// CHECK: return [[FN]]
|
||||||
|
|
||||||
// CHECK: sil shared [[THUNK_FOO_2]] : $@cc(method) @thin (Int, @owned CurryTest) -> Int
|
// CHECK: sil shared [[THUNK_FOO_2]] : $@cc(method) @thin (Int, @guaranteed CurryTest) -> Int
|
||||||
|
// CHECK: bb0([[ARG1:%.*]] : $Int, [[ARG2:%.*]] : $CurryTest):
|
||||||
|
// CHECK: strong_retain [[ARG2]]
|
||||||
// CHECK: [[METHOD:%.*]] = class_method [volatile] %1 : $CurryTest, #CurryTest.pod!1.foreign
|
// CHECK: [[METHOD:%.*]] = class_method [volatile] %1 : $CurryTest, #CurryTest.pod!1.foreign
|
||||||
// CHECK: [[RESULT:%.*]] = apply [[METHOD]](%0, %1)
|
// CHECK: [[RESULT:%.*]] = apply [[METHOD]](%0, %1)
|
||||||
// CHECK: strong_release %1
|
// CHECK: strong_release [[ARG2]]
|
||||||
// CHECK: return [[RESULT]]
|
// CHECK: return [[RESULT]]
|
||||||
|
|
||||||
func curry_bridged(x: CurryTest) -> String! -> String! {
|
func curry_bridged(x: CurryTest) -> String! -> String! {
|
||||||
@@ -37,7 +42,7 @@ func curry_bridged(x: CurryTest) -> String! -> String! {
|
|||||||
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]](%0)
|
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]](%0)
|
||||||
// CHECK: return [[FN]]
|
// CHECK: return [[FN]]
|
||||||
|
|
||||||
// CHECK: sil shared [[THUNK_BAR_2]] : $@cc(method) @thin (@owned ImplicitlyUnwrappedOptional<String>, @owned CurryTest) -> @owned ImplicitlyUnwrappedOptional<String>
|
// CHECK: sil shared [[THUNK_BAR_2]] : $@cc(method) @thin (@owned ImplicitlyUnwrappedOptional<String>, @guaranteed CurryTest) -> @owned ImplicitlyUnwrappedOptional<String>
|
||||||
// CHECK: function_ref @swift_StringToNSString
|
// CHECK: function_ref @swift_StringToNSString
|
||||||
// CHECK: [[METHOD:%.*]] = class_method [volatile] %1 : $CurryTest, #CurryTest.bridged!1.foreign
|
// CHECK: [[METHOD:%.*]] = class_method [volatile] %1 : $CurryTest, #CurryTest.bridged!1.foreign
|
||||||
// CHECK: [[RES:%.*]] = apply [[METHOD]]({{%.*}}, %1) : $@cc(objc_method) @thin (ImplicitlyUnwrappedOptional<NSString>, CurryTest) -> @autoreleased ImplicitlyUnwrappedOptional<NSString>
|
// CHECK: [[RES:%.*]] = apply [[METHOD]]({{%.*}}, %1) : $@cc(objc_method) @thin (ImplicitlyUnwrappedOptional<NSString>, CurryTest) -> @autoreleased ImplicitlyUnwrappedOptional<NSString>
|
||||||
@@ -59,7 +64,9 @@ func curry_returnsInnerPointer(x: CurryTest) -> () -> UnsafeMutablePointer<Void>
|
|||||||
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]](%0)
|
// CHECK: [[FN:%.*]] = partial_apply [[THUNK]](%0)
|
||||||
// CHECK: return [[FN]]
|
// CHECK: return [[FN]]
|
||||||
|
|
||||||
// CHECK: sil shared @_TTOFCSo9CurryTest19returnsInnerPointerfS_FT_GVSs20UnsafeMutablePointerT__ : $@cc(method) @thin (@owned CurryTest) -> UnsafeMutablePointer<()>
|
// CHECK: sil shared @_TTOFCSo9CurryTest19returnsInnerPointerfS_FT_GVSs20UnsafeMutablePointerT__ : $@cc(method) @thin (@guaranteed CurryTest) -> UnsafeMutablePointer<()>
|
||||||
|
// CHECK: bb0([[ARG1:%.*]] :
|
||||||
|
// CHECK: strong_retain [[ARG1]]
|
||||||
// CHECK: [[METHOD:%.*]] = class_method [volatile] %0 : $CurryTest, #CurryTest.returnsInnerPointer!1.foreign
|
// CHECK: [[METHOD:%.*]] = class_method [volatile] %0 : $CurryTest, #CurryTest.returnsInnerPointer!1.foreign
|
||||||
// CHECK: [[RES:%.*]] = apply [[METHOD]](%0) : $@cc(objc_method) @thin (CurryTest) -> @unowned_inner_pointer UnsafeMutablePointer<()>
|
// CHECK: [[RES:%.*]] = apply [[METHOD]](%0) : $@cc(objc_method) @thin (CurryTest) -> @unowned_inner_pointer UnsafeMutablePointer<()>
|
||||||
// CHECK: autorelease_value %0
|
// CHECK: autorelease_value %0
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ import gizmo
|
|||||||
// CHECK-NEXT: [[OPT_NSDICT:%[0-9]+]] = enum $Optional<NSDictionary>, #Optional.Some!enumelt.1, [[NSDICT]] : $NSDictionary
|
// CHECK-NEXT: [[OPT_NSDICT:%[0-9]+]] = enum $Optional<NSDictionary>, #Optional.Some!enumelt.1, [[NSDICT]] : $NSDictionary
|
||||||
// CHECK-NEXT: [[DICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[OPT_NSDICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : NSObject, τ_0_0 : Hashable, τ_0_1 : AnyObject> (@owned Optional<NSDictionary>) -> @owned Dictionary<τ_0_0, τ_0_1>
|
// CHECK-NEXT: [[DICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[OPT_NSDICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : NSObject, τ_0_0 : Hashable, τ_0_1 : AnyObject> (@owned Optional<NSDictionary>) -> @owned Dictionary<τ_0_0, τ_0_1>
|
||||||
|
|
||||||
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foo23bridge_Dictionary_paramfS0_FGVSs10DictionaryS0_S0__T_ : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @owned Foo) -> ()
|
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foo23bridge_Dictionary_paramfS0_FGVSs10DictionaryS0_S0__T_ : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = apply [[SWIFT_FN]]([[DICT]], [[SELF]]) : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @owned Foo) -> ()
|
// CHECK: [[RESULT:%[0-9]+]] = apply [[SWIFT_FN]]([[DICT]], [[SELF]]) : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: return [[RESULT]] : $()
|
// CHECK: return [[RESULT]] : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,8 +23,8 @@ import gizmo
|
|||||||
// CHECK-LABEL: sil hidden @_TToFC24objc_dictionary_bridging3Foo24bridge_Dictionary_result{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSDictionary
|
// CHECK-LABEL: sil hidden @_TToFC24objc_dictionary_bridging3Foo24bridge_Dictionary_result{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSDictionary
|
||||||
func bridge_Dictionary_result() -> Dictionary<Foo, Foo> {
|
func bridge_Dictionary_result() -> Dictionary<Foo, Foo> {
|
||||||
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
||||||
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foo24bridge_Dictionary_result{{.*}} : $@cc(method) @thin (@owned Foo) -> @owned Dictionary<Foo, Foo>
|
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foo24bridge_Dictionary_result{{.*}} : $@cc(method) @thin (@guaranteed Foo) -> @owned Dictionary<Foo, Foo>
|
||||||
// CHECK-NEXT: [[DICT:%[0-9]+]] = apply [[SWIFT_FN]]([[SELF]]) : $@cc(method) @thin (@owned Foo) -> @owned Dictionary<Foo, Foo>
|
// CHECK-NEXT: [[DICT:%[0-9]+]] = apply [[SWIFT_FN]]([[SELF]]) : $@cc(method) @thin (@guaranteed Foo) -> @owned Dictionary<Foo, Foo>
|
||||||
|
|
||||||
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation32_convertDictionaryToNSDictionary{{.*}} : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation32_convertDictionaryToNSDictionary{{.*}} : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
||||||
// CHECK-NEXT: [[NSDICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[DICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
// CHECK-NEXT: [[NSDICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[DICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
||||||
@@ -36,8 +36,8 @@ import gizmo
|
|||||||
// Property getter
|
// Property getter
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TToFC24objc_dictionary_bridging3Foog8propertyGVSs10DictionaryS0_S0__ : $@cc(objc_method) @thin (Foo) -> @autoreleased NSDictionary
|
// CHECK-LABEL: sil hidden [transparent] @_TToFC24objc_dictionary_bridging3Foog8propertyGVSs10DictionaryS0_S0__ : $@cc(objc_method) @thin (Foo) -> @autoreleased NSDictionary
|
||||||
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foog8propertyGVSs10DictionaryS0_S0__ : $@cc(method) @thin (@owned Foo) -> @owned Dictionary<Foo, Foo>
|
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foog8propertyGVSs10DictionaryS0_S0__ : $@cc(method) @thin (@guaranteed Foo) -> @owned Dictionary<Foo, Foo>
|
||||||
// CHECK: [[DICT:%[0-9]+]] = apply [[GETTER]]([[SELF]]) : $@cc(method) @thin (@owned Foo) -> @owned Dictionary<Foo, Foo>
|
// CHECK: [[DICT:%[0-9]+]] = apply [[GETTER]]([[SELF]]) : $@cc(method) @thin (@guaranteed Foo) -> @owned Dictionary<Foo, Foo>
|
||||||
|
|
||||||
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation32_convertDictionaryToNSDictionary{{.*}} : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation32_convertDictionaryToNSDictionary{{.*}} : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
||||||
// CHECK: [[NSDICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[DICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
// CHECK: [[NSDICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[DICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : Hashable> (@owned Dictionary<τ_0_0, τ_0_1>) -> @owned NSDictionary
|
||||||
@@ -50,8 +50,8 @@ import gizmo
|
|||||||
// CHECK: [[OPT_NSDICT:%[0-9]+]] = enum $Optional<NSDictionary>, #Optional.Some!enumelt.1, [[NSDICT]] : $NSDictionary
|
// CHECK: [[OPT_NSDICT:%[0-9]+]] = enum $Optional<NSDictionary>, #Optional.Some!enumelt.1, [[NSDICT]] : $NSDictionary
|
||||||
// CHECK: [[DICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[OPT_NSDICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : NSObject, τ_0_0 : Hashable, τ_0_1 : AnyObject> (@owned Optional<NSDictionary>) -> @owned Dictionary<τ_0_0, τ_0_1>
|
// CHECK: [[DICT:%[0-9]+]] = apply [[CONVERTER]]<Foo, Foo>([[OPT_NSDICT]]) : $@thin <τ_0_0, τ_0_1 where τ_0_0 : NSObject, τ_0_0 : Hashable, τ_0_1 : AnyObject> (@owned Optional<NSDictionary>) -> @owned Dictionary<τ_0_0, τ_0_1>
|
||||||
|
|
||||||
// CHECK: [[SETTER:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foos8propertyGVSs10DictionaryS0_S0__ : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @owned Foo) -> ()
|
// CHECK: [[SETTER:%[0-9]+]] = function_ref @_TFC24objc_dictionary_bridging3Foos8propertyGVSs10DictionaryS0_S0__ : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = apply [[SETTER]]([[DICT]], [[SELF]]) : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @owned Foo) -> ()
|
// CHECK: [[RESULT:%[0-9]+]] = apply [[SETTER]]([[DICT]], [[SELF]]) : $@cc(method) @thin (@owned Dictionary<Foo, Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: return [[RESULT]] : $()
|
// CHECK: return [[RESULT]] : $()
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TToFC24objc_dictionary_bridging3Foog19nonVerbatimProperty{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSDictionary
|
// CHECK-LABEL: sil hidden [transparent] @_TToFC24objc_dictionary_bridging3Foog19nonVerbatimProperty{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSDictionary
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class A {
|
|||||||
// CHECK: [[M_AS_THICK:%[0-9]+]] = objc_to_thick_metatype [[M]] : $@objc_metatype ObjCClass.Type to $@thick ObjCClass.Type
|
// CHECK: [[M_AS_THICK:%[0-9]+]] = objc_to_thick_metatype [[M]] : $@objc_metatype ObjCClass.Type to $@thick ObjCClass.Type
|
||||||
|
|
||||||
// CHECK: [[NATIVE_FOO:%[0-9]+]] = function_ref @_TFC14objc_metatypes1A3foo
|
// CHECK: [[NATIVE_FOO:%[0-9]+]] = function_ref @_TFC14objc_metatypes1A3foo
|
||||||
// CHECK: [[NATIVE_RESULT:%[0-9]+]] = apply [[NATIVE_FOO]]([[M_AS_THICK]], [[SELF]]) : $@cc(method) @thin (@thick ObjCClass.Type, @owned A) -> @thick ObjCClass.Type
|
// CHECK: [[NATIVE_RESULT:%[0-9]+]] = apply [[NATIVE_FOO]]([[M_AS_THICK]], [[SELF]]) : $@cc(method) @thin (@thick ObjCClass.Type, @guaranteed A) -> @thick ObjCClass.Type
|
||||||
// CHECK: [[OBJC_RESULT:%[0-9]+]] = thick_to_objc_metatype [[NATIVE_RESULT]] : $@thick ObjCClass.Type to $@objc_metatype ObjCClass.Type
|
// CHECK: [[OBJC_RESULT:%[0-9]+]] = thick_to_objc_metatype [[NATIVE_RESULT]] : $@thick ObjCClass.Type to $@objc_metatype ObjCClass.Type
|
||||||
// CHECK: return [[OBJC_RESULT]] : $@objc_metatype ObjCClass.Type
|
// CHECK: return [[OBJC_RESULT]] : $@objc_metatype ObjCClass.Type
|
||||||
return m
|
return m
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class A {
|
|||||||
other.prop = x
|
other.prop = x
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TFC15objc_properties1Ad : $@cc(method) @thin (@owned A) -> @owned Builtin.NativeObject {
|
// CHECK-LABEL: sil hidden @_TFC15objc_properties1Ad : $@cc(method) @thin (@guaranteed A) -> @owned Builtin.NativeObject {
|
||||||
// CHECK-NOT: class_method {{.*}} #A.prop
|
// CHECK-NOT: class_method {{.*}} #A.prop
|
||||||
// CHECK: }
|
// CHECK: }
|
||||||
deinit {
|
deinit {
|
||||||
@@ -84,12 +84,12 @@ func testComputedPropSet(a: A, i: Int) {
|
|||||||
// 'super' property references.
|
// 'super' property references.
|
||||||
class B : A {
|
class B : A {
|
||||||
@objc override var computedProp: Int {
|
@objc override var computedProp: Int {
|
||||||
// CHECK-LABEL: sil hidden @_TFC15objc_properties1Bg12computedPropSi : $@cc(method) @thin (@owned B) -> Int
|
// CHECK-LABEL: sil hidden @_TFC15objc_properties1Bg12computedPropSi : $@cc(method) @thin (@guaranteed B) -> Int
|
||||||
get {
|
get {
|
||||||
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.computedProp!getter.1.foreign : A -> () -> Int , $@cc(objc_method) @thin (A) -> Int
|
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.computedProp!getter.1.foreign : A -> () -> Int , $@cc(objc_method) @thin (A) -> Int
|
||||||
return super.computedProp
|
return super.computedProp
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @_TFC15objc_properties1Bs12computedPropSi : $@cc(method) @thin (Int, @owned B) -> ()
|
// CHECK-LABEL: sil hidden @_TFC15objc_properties1Bs12computedPropSi : $@cc(method) @thin (Int, @guaranteed B) -> ()
|
||||||
set(value) {
|
set(value) {
|
||||||
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.computedProp!setter.1.foreign : A -> (Int) -> () , $@cc(objc_method) @thin (Int, A) -> ()
|
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.computedProp!setter.1.foreign : A -> (Int) -> () , $@cc(objc_method) @thin (Int, A) -> ()
|
||||||
super.computedProp = value
|
super.computedProp = value
|
||||||
@@ -101,7 +101,7 @@ class B : A {
|
|||||||
// Test the @NSCopying attribute.
|
// Test the @NSCopying attribute.
|
||||||
class TestNSCopying {
|
class TestNSCopying {
|
||||||
// CHECK: // objc_properties.TestNSCopying.property.setter : ObjectiveC.NSString
|
// CHECK: // objc_properties.TestNSCopying.property.setter : ObjectiveC.NSString
|
||||||
// CHECK-NEXT: sil hidden [transparent] @_TFC15objc_properties13TestNSCopyings8propertyCSo8NSString : $@cc(method) @thin (@owned NSString, @owned TestNSCopying) -> ()
|
// CHECK-NEXT: sil hidden [transparent] @_TFC15objc_properties13TestNSCopyings8propertyCSo8NSString : $@cc(method) @thin (@owned NSString, @guaranteed TestNSCopying) -> ()
|
||||||
// CHECK-NEXT: bb0(%0 : $NSString, %1 : $TestNSCopying):
|
// CHECK-NEXT: bb0(%0 : $NSString, %1 : $TestNSCopying):
|
||||||
// CHECK: class_method [volatile] %0 : $NSString, #NSString.copyWithZone!1.foreign
|
// CHECK: class_method [volatile] %0 : $NSString, #NSString.copyWithZone!1.foreign
|
||||||
@NSCopying var property : NSString
|
@NSCopying var property : NSString
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ import gizmo
|
|||||||
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertNSSetToSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertNSSetToSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
||||||
// CHECK: [[OPT_NSSET:%[0-9]+]] = enum $Optional<NSSet>, #Optional.Some!enumelt.1, [[NSSET]] : $NSSet
|
// CHECK: [[OPT_NSSET:%[0-9]+]] = enum $Optional<NSSet>, #Optional.Some!enumelt.1, [[NSSET]] : $NSSet
|
||||||
// CHECK: [[SET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[OPT_NSSET]]) : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
// CHECK: [[SET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[OPT_NSSET]]) : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
||||||
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foo16bridge_Set_param{{.*}} : $@cc(method) @thin (@owned Set<Foo>, @owned Foo) -> ()
|
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foo16bridge_Set_param{{.*}} : $@cc(method) @thin (@owned Set<Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = apply [[SWIFT_FN]]([[SET]], [[SELF]]) : $@cc(method) @thin (@owned Set<Foo>, @owned Foo) -> ()
|
// CHECK: [[RESULT:%[0-9]+]] = apply [[SWIFT_FN]]([[SET]], [[SELF]]) : $@cc(method) @thin (@owned Set<Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: return [[RESULT]] : $()
|
// CHECK: return [[RESULT]] : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,8 +25,8 @@ import gizmo
|
|||||||
func bridge_Set_result() -> Set<Foo> {
|
func bridge_Set_result() -> Set<Foo> {
|
||||||
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
||||||
// CHECK: strong_retain [[SELF]] : $Foo
|
// CHECK: strong_retain [[SELF]] : $Foo
|
||||||
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foo17bridge_Set_result{{.*}} : $@cc(method) @thin (@owned Foo) -> @owned Set<Foo>
|
// CHECK: [[SWIFT_FN:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foo17bridge_Set_result{{.*}} : $@cc(method) @thin (@guaranteed Foo) -> @owned Set<Foo>
|
||||||
// CHECK: [[SET:%[0-9]+]] = apply [[SWIFT_FN]]([[SELF]]) : $@cc(method) @thin (@owned Foo) -> @owned Set<Foo>
|
// CHECK: [[SET:%[0-9]+]] = apply [[SWIFT_FN]]([[SELF]]) : $@cc(method) @thin (@guaranteed Foo) -> @owned Set<Foo>
|
||||||
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertSetToNSSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertSetToNSSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
||||||
// CHECK: [[NSSET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[SET]]) : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
// CHECK: [[NSSET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[SET]]) : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
||||||
// CHECK: autorelease_return [[NSSET]] : $NSSet
|
// CHECK: autorelease_return [[NSSET]] : $NSSet
|
||||||
@@ -38,8 +38,8 @@ import gizmo
|
|||||||
// CHECK-LABEL: sil hidden [transparent] @_TToFC17objc_set_bridging3Foog8property{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSSet
|
// CHECK-LABEL: sil hidden [transparent] @_TToFC17objc_set_bridging3Foog8property{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSSet
|
||||||
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
// CHECK: bb0([[SELF:%[0-9]+]] : $Foo):
|
||||||
// CHECK: strong_retain [[SELF]] : $Foo
|
// CHECK: strong_retain [[SELF]] : $Foo
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foog8property{{.*}} : $@cc(method) @thin (@owned Foo) -> @owned Set<Foo>
|
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foog8property{{.*}} : $@cc(method) @thin (@guaranteed Foo) -> @owned Set<Foo>
|
||||||
// CHECK: [[SET:%[0-9]+]] = apply [[GETTER]]([[SELF]]) : $@cc(method) @thin (@owned Foo) -> @owned Set<Foo>
|
// CHECK: [[SET:%[0-9]+]] = apply [[GETTER]]([[SELF]]) : $@cc(method) @thin (@guaranteed Foo) -> @owned Set<Foo>
|
||||||
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertSetToNSSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertSetToNSSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
||||||
// CHECK: [[NSSET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[SET]]) : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
// CHECK: [[NSSET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[SET]]) : $@thin <τ_0_0 where τ_0_0 : Hashable> (@owned Set<τ_0_0>) -> @owned NSSet
|
||||||
// CHECK: autorelease_return [[NSSET]] : $NSSet
|
// CHECK: autorelease_return [[NSSET]] : $NSSet
|
||||||
@@ -52,8 +52,9 @@ import gizmo
|
|||||||
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertNSSetToSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
// CHECK: [[CONVERTER:%[0-9]+]] = function_ref @_TF10Foundation18_convertNSSetToSet{{.*}} : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
||||||
// CHECK: [[OPT_NSSET:%[0-9]+]] = enum $Optional<NSSet>, #Optional.Some!enumelt.1, [[NSSET]] : $NSSet
|
// CHECK: [[OPT_NSSET:%[0-9]+]] = enum $Optional<NSSet>, #Optional.Some!enumelt.1, [[NSSET]] : $NSSet
|
||||||
// CHECK: [[SET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[OPT_NSSET]]) : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
// CHECK: [[SET:%[0-9]+]] = apply [[CONVERTER]]<Foo>([[OPT_NSSET]]) : $@thin <τ_0_0 where τ_0_0 : NSObject, τ_0_0 : Hashable> (@owned Optional<NSSet>) -> @owned Set<τ_0_0>
|
||||||
// CHECK: [[SETTER:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foos8property{{.*}} : $@cc(method) @thin (@owned Set<Foo>, @owned Foo) -> ()
|
// CHECK: [[SETTER:%[0-9]+]] = function_ref @_TFC17objc_set_bridging3Foos8property{{.*}} : $@cc(method) @thin (@owned Set<Foo>, @guaranteed Foo) -> ()
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = apply [[SETTER]]([[SET]], [[SELF]]) : $@cc(method) @thin (@owned Set<Foo>, @owned Foo) -> ()
|
// CHECK: [[RESULT:%[0-9]+]] = apply [[SETTER]]([[SET]], [[SELF]]) : $@cc(method) @thin (@owned Set<Foo>, @guaranteed Foo) -> ()
|
||||||
|
// CHECK: strong_release [[SELF]] : $Foo
|
||||||
// CHECK: return [[RESULT]] : $()
|
// CHECK: return [[RESULT]] : $()
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TToFC17objc_set_bridging3Foog19nonVerbatimProperty{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSSet
|
// CHECK-LABEL: sil hidden [transparent] @_TToFC17objc_set_bridging3Foog19nonVerbatimProperty{{.*}} : $@cc(objc_method) @thin (Foo) -> @autoreleased NSSet
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ func testSubscriptSet(a: A, i: Int, v: ObjCClass) {
|
|||||||
// 'super' subscript usage
|
// 'super' subscript usage
|
||||||
class B : A {
|
class B : A {
|
||||||
@objc override subscript (i: Int) -> ObjCClass {
|
@objc override subscript (i: Int) -> ObjCClass {
|
||||||
// CHECK-LABEL: sil hidden @_TFC14objc_subscript1Bg9subscriptFSiCS_9ObjCClass : $@cc(method) @thin (Int, @owned B) -> @owned ObjCClass
|
// CHECK-LABEL: sil hidden @_TFC14objc_subscript1Bg9subscriptFSiCS_9ObjCClass : $@cc(method) @thin (Int, @guaranteed B) -> @owned ObjCClass
|
||||||
get {
|
get {
|
||||||
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.subscript!getter.1.foreign : A -> (Int) -> ObjCClass , $@cc(objc_method) @thin (Int, A) -> @autoreleased ObjCClass
|
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.subscript!getter.1.foreign : A -> (Int) -> ObjCClass , $@cc(objc_method) @thin (Int, A) -> @autoreleased ObjCClass
|
||||||
return super[i]
|
return super[i]
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @_TFC14objc_subscript1Bs9subscriptFSiCS_9ObjCClass : $@cc(method) @thin (@owned ObjCClass, Int, @owned B) -> ()
|
// CHECK-LABEL: sil hidden @_TFC14objc_subscript1Bs9subscriptFSiCS_9ObjCClass : $@cc(method) @thin (@owned ObjCClass, Int, @guaranteed B) -> ()
|
||||||
set(value) {
|
set(value) {
|
||||||
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.subscript!setter.1.foreign : A -> (ObjCClass, Int) -> () , $@cc(objc_method) @thin (ObjCClass, Int, A) -> ()
|
// CHECK: super_method [volatile] [[SELF:%[0-9]+]] : $B, #A.subscript!setter.1.foreign : A -> (ObjCClass, Int) -> () , $@cc(objc_method) @thin (ObjCClass, Int, A) -> ()
|
||||||
super[i] = value
|
super[i] = value
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class Hoozit : Gizmo {
|
|||||||
super.runce()
|
super.runce()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TFC10objc_super6Hoozit4frobfS0_FT_T_ : $@cc(method) @thin (@owned Hoozit) -> ()
|
// CHECK-LABEL: sil hidden @_TFC10objc_super6Hoozit4frobfS0_FT_T_ : $@cc(method) @thin (@guaranteed Hoozit) -> ()
|
||||||
override func frob() {
|
override func frob() {
|
||||||
// CHECK: super_method [volatile] {{%.*}} : $Hoozit, #Gizmo.frob!1.foreign
|
// CHECK: super_method [volatile] {{%.*}} : $Hoozit, #Gizmo.frob!1.foreign
|
||||||
super.frob()
|
super.frob()
|
||||||
|
|||||||
@@ -11,9 +11,10 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: retain [[Y]]
|
// CHECK-NEXT: retain [[Y]]
|
||||||
// CHECK-NEXT: retain [[THIS]]
|
// CHECK-NEXT: retain [[THIS]]
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozit7typicalfS0_FTSi1yCSo5Gizmo_S1_ : $@cc(method) @thin (Int, @owned Gizmo, @owned Hoozit) -> @owned Gizmo
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozit7typicalfS0_FTSi1yCSo5Gizmo_S1_ : $@cc(method) @thin (Int, @owned Gizmo, @guaranteed Hoozit) -> @owned Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[X]], [[Y]], [[THIS]]) {{.*}} line:[[@LINE-7]]:8:auto_gen
|
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[X]], [[Y]], [[THIS]]) {{.*}} line:[[@LINE-7]]:8:auto_gen
|
||||||
// CHECK-NEXT: autorelease_return [[RES]] : $Gizmo // {{.*}} line:[[@LINE-8]]:8:auto_gen
|
// CHECK-NEXT: strong_release [[THIS]] : $Hoozit // {{.*}}
|
||||||
|
// CHECK-NEXT: autorelease_return [[RES]] : $Gizmo // {{.*}} line:[[@LINE-9]]:8:auto_gen
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
// NS_CONSUMES_SELF by inheritance
|
// NS_CONSUMES_SELF by inheritance
|
||||||
@@ -21,8 +22,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-LABEL: sil hidden @_TToFC11objc_thunks6Hoozit4forkfS0_FT_T_ : $@cc(objc_method) @thin (@owned Hoozit) -> () {
|
// CHECK-LABEL: sil hidden @_TToFC11objc_thunks6Hoozit4forkfS0_FT_T_ : $@cc(objc_method) @thin (@owned Hoozit) -> () {
|
||||||
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozit4forkfS0_FT_T_ : $@cc(method) @thin (@owned Hoozit) -> ()
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozit4forkfS0_FT_T_ : $@cc(method) @thin (@guaranteed Hoozit) -> ()
|
||||||
// CHECK-NEXT: apply [[NATIVE]]([[THIS]])
|
// CHECK-NEXT: apply [[NATIVE]]([[THIS]])
|
||||||
|
// CHECK-NEXT: strong_release [[THIS]]
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
@@ -42,10 +44,10 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
||||||
// CHECK-NEXT: retain [[THIS]]
|
// CHECK-NEXT: retain [[THIS]]
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozit7copyFoofS0_FT_CSo5Gizmo : $@cc(method) @thin (@owned Hoozit) -> @owned Gizmo
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozit7copyFoofS0_FT_CSo5Gizmo : $@cc(method) @thin (@guaranteed Hoozit) -> @owned Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[THIS]])
|
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[THIS]])
|
||||||
|
// CHECK: release [[THIS]]
|
||||||
// CHECK-NOT: autorelease_return
|
// CHECK-NOT: autorelease_return
|
||||||
// CHECK-NOT: release
|
|
||||||
// CHECK-NEXT: return [[RES]]
|
// CHECK-NEXT: return [[RES]]
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
@@ -57,16 +59,16 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: // function_ref objc_thunks.Hoozit.typicalProperty.getter
|
// CHECK-NEXT: // function_ref objc_thunks.Hoozit.typicalProperty.getter
|
||||||
// CHECK-NEXT: [[GETIMPL:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg15typicalPropertyCSo5Gizmo
|
// CHECK-NEXT: [[GETIMPL:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg15typicalPropertyCSo5Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[GETIMPL]](%0)
|
// CHECK-NEXT: [[RES:%.*]] = apply [[GETIMPL]](%0)
|
||||||
|
// CHECK-NEXT: strong_release %0
|
||||||
// CHECK-NEXT: autorelease_return [[RES]] : $Gizmo
|
// CHECK-NEXT: autorelease_return [[RES]] : $Gizmo
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TFC11objc_thunks6Hoozitg15typicalPropertyCSo5Gizmo
|
// CHECK-LABEL: sil hidden [transparent] @_TFC11objc_thunks6Hoozitg15typicalPropertyCSo5Gizmo : $@cc(method) @thin (@guaranteed Hoozit) -> @owned Gizmo
|
||||||
// CHECK-NEXT: bb0(%0 : $Hoozit):
|
// CHECK-NEXT: bb0(%0 : $Hoozit):
|
||||||
// CHECK-NEXT: debug_value %0
|
// CHECK-NEXT: debug_value %0
|
||||||
// CHECK-NEXT: [[ADDR:%.*]] = ref_element_addr %0 : {{.*}}, #Hoozit.typicalProperty {{.*}}
|
// CHECK-NEXT: [[ADDR:%.*]] = ref_element_addr %0 : {{.*}}, #Hoozit.typicalProperty {{.*}}
|
||||||
// CHECK-NEXT: [[RES:%.*]] = load [[ADDR]] {{.*}}
|
// CHECK-NEXT: [[RES:%.*]] = load [[ADDR]] {{.*}}
|
||||||
// CHECK-NEXT: strong_retain [[RES]] : $Gizmo
|
// CHECK-NEXT: strong_retain [[RES]] : $Gizmo
|
||||||
// CHECK-NEXT: strong_release %0 : $Hoozit
|
|
||||||
// CHECK-NEXT: return [[RES]]
|
// CHECK-NEXT: return [[RES]]
|
||||||
|
|
||||||
// -- setter
|
// -- setter
|
||||||
@@ -93,6 +95,7 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: // function_ref objc_thunks.Hoozit.copyProperty.getter
|
// CHECK-NEXT: // function_ref objc_thunks.Hoozit.copyProperty.getter
|
||||||
// CHECK-NEXT: [[FR:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg12copyPropertyCSo5Gizmo
|
// CHECK-NEXT: [[FR:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg12copyPropertyCSo5Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[FR]](%0)
|
// CHECK-NEXT: [[RES:%.*]] = apply [[FR]](%0)
|
||||||
|
// CHECK-NEXT: strong_release %0
|
||||||
// CHECK-NEXT: return [[RES]]
|
// CHECK-NEXT: return [[RES]]
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
@@ -101,7 +104,6 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK: [[ADDR:%.*]] = ref_element_addr %0 : {{.*}}, #Hoozit.copyProperty
|
// CHECK: [[ADDR:%.*]] = ref_element_addr %0 : {{.*}}, #Hoozit.copyProperty
|
||||||
// CHECK-NEXT: [[RES:%.*]] = load [[ADDR]]
|
// CHECK-NEXT: [[RES:%.*]] = load [[ADDR]]
|
||||||
// CHECK-NEXT: retain [[RES]]
|
// CHECK-NEXT: retain [[RES]]
|
||||||
// CHECK-NEXT: release %0
|
|
||||||
// CHECK-NEXT: return [[RES]]
|
// CHECK-NEXT: return [[RES]]
|
||||||
|
|
||||||
// -- setter is normal
|
// -- setter is normal
|
||||||
@@ -112,6 +114,7 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: // function_ref objc_thunks.Hoozit.copyProperty.setter
|
// CHECK-NEXT: // function_ref objc_thunks.Hoozit.copyProperty.setter
|
||||||
// CHECK-NEXT: [[FR:%.*]] = function_ref @_TFC11objc_thunks6Hoozits12copyPropertyCSo5Gizmo
|
// CHECK-NEXT: [[FR:%.*]] = function_ref @_TFC11objc_thunks6Hoozits12copyPropertyCSo5Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[FR]](%0, %1)
|
// CHECK-NEXT: [[RES:%.*]] = apply [[FR]](%0, %1)
|
||||||
|
// CHECK-NEXT: strong_release [[THIS]]
|
||||||
// CHECK-NEXT: return [[RES]]
|
// CHECK-NEXT: return [[RES]]
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] @_TFC11objc_thunks6Hoozits12copyPropertyCSo5Gizmo
|
// CHECK-LABEL: sil hidden [transparent] @_TFC11objc_thunks6Hoozits12copyPropertyCSo5Gizmo
|
||||||
@@ -125,8 +128,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
||||||
// CHECK-NEXT: retain [[THIS]]
|
// CHECK-NEXT: retain [[THIS]]
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg10roPropertyCSo5Gizmo : $@cc(method) @thin (@owned Hoozit) -> @owned Gizmo
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg10roPropertyCSo5Gizmo : $@cc(method) @thin (@guaranteed Hoozit) -> @owned Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[THIS]])
|
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[THIS]])
|
||||||
|
// CHECK-NEXT: release [[THIS]] : $Hoozit
|
||||||
// CHECK-NEXT: autorelease_return [[RES]] : $Gizmo
|
// CHECK-NEXT: autorelease_return [[RES]] : $Gizmo
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
@@ -148,8 +152,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: retain [[VALUE]]
|
// CHECK-NEXT: retain [[VALUE]]
|
||||||
// CHECK-NEXT: retain [[THIS]]
|
// CHECK-NEXT: retain [[THIS]]
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozits10rwPropertyCSo5Gizmo : $@cc(method) @thin (@owned Gizmo, @owned Hoozit) -> ()
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozits10rwPropertyCSo5Gizmo : $@cc(method) @thin (@owned Gizmo, @guaranteed Hoozit) -> ()
|
||||||
// CHECK-NEXT: apply [[NATIVE]]([[VALUE]], [[THIS]])
|
// CHECK-NEXT: apply [[NATIVE]]([[VALUE]], [[THIS]])
|
||||||
|
// CHECK-NEXT: release [[THIS]]
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
@@ -164,9 +169,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
// CHECK-NEXT: bb0([[THIS:%.*]] : $Hoozit):
|
||||||
// CHECK-NEXT: retain [[THIS]]
|
// CHECK-NEXT: retain [[THIS]]
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg14copyRWPropertyCSo5Gizmo : $@cc(method) @thin (@owned Hoozit) -> @owned Gizmo
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozitg14copyRWPropertyCSo5Gizmo : $@cc(method) @thin (@guaranteed Hoozit) -> @owned Gizmo
|
||||||
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[THIS]])
|
// CHECK-NEXT: [[RES:%.*]] = apply [[NATIVE]]([[THIS]])
|
||||||
// CHECK-NOT: release
|
// CHECK-NEXT: release [[THIS]]
|
||||||
// CHECK-NOT: autorelease_return
|
// CHECK-NOT: autorelease_return
|
||||||
// CHECK-NEXT: return [[RES]]
|
// CHECK-NEXT: return [[RES]]
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
@@ -177,8 +182,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: retain [[VALUE]]
|
// CHECK-NEXT: retain [[VALUE]]
|
||||||
// CHECK-NEXT: retain [[THIS]]
|
// CHECK-NEXT: retain [[THIS]]
|
||||||
// CHECK-NEXT: // function_ref
|
// CHECK-NEXT: // function_ref
|
||||||
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozits14copyRWPropertyCSo5Gizmo : $@cc(method) @thin (@owned Gizmo, @owned Hoozit) -> ()
|
// CHECK-NEXT: [[NATIVE:%.*]] = function_ref @_TFC11objc_thunks6Hoozits14copyRWPropertyCSo5Gizmo : $@cc(method) @thin (@owned Gizmo, @guaranteed Hoozit) -> ()
|
||||||
// CHECK-NEXT: apply [[NATIVE]]([[VALUE]], [[THIS]])
|
// CHECK-NEXT: apply [[NATIVE]]([[VALUE]], [[THIS]])
|
||||||
|
// CHECK-NEXT: release [[THIS]]
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
@@ -220,8 +226,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-LABEL: sil hidden @_TToFC11objc_thunks6Hoozitg9subscriptFSiS0_ : $@cc(objc_method) @thin (Int, Hoozit) -> @autoreleased Hoozit
|
// CHECK-LABEL: sil hidden @_TToFC11objc_thunks6Hoozitg9subscriptFSiS0_ : $@cc(objc_method) @thin (Int, Hoozit) -> @autoreleased Hoozit
|
||||||
// CHECK-NEXT: bb0([[I:%[0-9]+]] : $Int, [[SELF:%[0-9]+]] : $Hoozit):
|
// CHECK-NEXT: bb0([[I:%[0-9]+]] : $Int, [[SELF:%[0-9]+]] : $Hoozit):
|
||||||
// CHECK-NEXT: strong_retain [[SELF]] : $Hoozit
|
// CHECK-NEXT: strong_retain [[SELF]] : $Hoozit
|
||||||
// CHECK: [[NATIVE:%[0-9]+]] = function_ref @_TFC11objc_thunks6Hoozitg9subscript{{.*}} : $@cc(method) @thin (Int, @owned Hoozit) -> @owned Hoozit
|
// CHECK: [[NATIVE:%[0-9]+]] = function_ref @_TFC11objc_thunks6Hoozitg9subscript{{.*}} : $@cc(method) @thin (Int, @guaranteed Hoozit) -> @owned Hoozit
|
||||||
// CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[NATIVE]]([[I]], [[SELF]]) : $@cc(method) @thin (Int, @owned Hoozit) -> @owned Hoozit
|
// CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[NATIVE]]([[I]], [[SELF]]) : $@cc(method) @thin (Int, @guaranteed Hoozit) -> @owned Hoozit
|
||||||
|
// CHECK-NEXT: strong_release [[SELF]]
|
||||||
// CHECK-NEXT: autorelease_return [[RESULT]] : $Hoozit
|
// CHECK-NEXT: autorelease_return [[RESULT]] : $Hoozit
|
||||||
get {
|
get {
|
||||||
return self
|
return self
|
||||||
@@ -232,8 +239,9 @@ class Hoozit : Gizmo {
|
|||||||
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $Hoozit, [[I:%[0-9]+]] : $Int, [[VALUE:%[0-9]+]] : $Hoozit):
|
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $Hoozit, [[I:%[0-9]+]] : $Int, [[VALUE:%[0-9]+]] : $Hoozit):
|
||||||
// CHECK-NEXT: strong_retain [[SELF]] : $Hoozit
|
// CHECK-NEXT: strong_retain [[SELF]] : $Hoozit
|
||||||
// CHECK_NEXT: strong_retain [[VALUE]] : $Hoozit
|
// CHECK_NEXT: strong_retain [[VALUE]] : $Hoozit
|
||||||
// CHECK: [[NATIVE:%[0-9]+]] = function_ref @_TFC11objc_thunks6Hoozits9subscript{{.*}} : $@cc(method) @thin (@owned Hoozit, Int, @owned Hoozit) -> ()
|
// CHECK: [[NATIVE:%[0-9]+]] = function_ref @_TFC11objc_thunks6Hoozits9subscript{{.*}} : $@cc(method) @thin (@owned Hoozit, Int, @guaranteed Hoozit) -> ()
|
||||||
// CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[NATIVE]]([[SELF]], [[I]], [[VALUE]]) : $@cc(method) @thin (@owned Hoozit, Int, @owned Hoozit) -> ()
|
// CHECK-NEXT: [[RESULT:%[0-9]+]] = apply [[NATIVE]]([[SELF]], [[I]], [[VALUE]]) : $@cc(method) @thin (@owned Hoozit, Int, @guaranteed Hoozit) -> ()
|
||||||
|
// CHECK-NEXT: strong_release [[VALUE]]
|
||||||
// CHECK-NEXT: return [[RESULT]] : $()
|
// CHECK-NEXT: return [[RESULT]] : $()
|
||||||
set {}
|
set {}
|
||||||
}
|
}
|
||||||
@@ -295,7 +303,7 @@ extension Hoozit {
|
|||||||
// CHECK-LABEL: sil hidden @_TToFC11objc_thunks6Hoozit4fooffS0_FT_T_ : $@cc(objc_method) @thin (Hoozit) -> () {
|
// CHECK-LABEL: sil hidden @_TToFC11objc_thunks6Hoozit4fooffS0_FT_T_ : $@cc(objc_method) @thin (Hoozit) -> () {
|
||||||
|
|
||||||
var extensionProperty: Int { return 0 }
|
var extensionProperty: Int { return 0 }
|
||||||
// CHECK-LABEL: sil hidden @_TFC11objc_thunks6Hoozitg17extensionPropertySi : $@cc(method) @thin (@owned Hoozit) -> Int
|
// CHECK-LABEL: sil hidden @_TFC11objc_thunks6Hoozitg17extensionPropertySi : $@cc(method) @thin (@guaranteed Hoozit) -> Int
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calling objc methods of subclass should go through native entry points
|
// Calling objc methods of subclass should go through native entry points
|
||||||
|
|||||||
@@ -22,9 +22,17 @@ class Phoûx : NSObject, Fooable {
|
|||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWCSo3Foo14objc_witnesses7FooableS0_FS1_3fooUS1___fQPS1_FT_GSQSS_
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWCSo3Foo14objc_witnesses7FooableS0_FS1_3fooUS1___fQPS1_FT_GSQSS_
|
||||||
// CHECK: function_ref @_TTOFCSo3Foo3foofS_FT_GSQSS_
|
// CHECK: function_ref @_TTOFCSo3Foo3foofS_FT_GSQSS_
|
||||||
|
|
||||||
|
// *NOTE* We have an extra copy here for the time being right
|
||||||
|
// now. This will change once we teach SILGen how to not emit the
|
||||||
|
// extra copy.
|
||||||
|
//
|
||||||
// witness for Phoûx.foo uses the Swift vtable
|
// witness for Phoûx.foo uses the Swift vtable
|
||||||
// CHECK-LABEL: _TTWC14objc_witnessesX8Phox_xraS_7FooableS_FS1_3fooUS1___fQPS1_FT_GSQSS_
|
// CHECK-LABEL: _TTWC14objc_witnessesX8Phox_xraS_7FooableS_FS1_3fooUS1___fQPS1_FT_GSQSS_
|
||||||
// CHECK: class_method %1 : $Phoûx, #Phoûx.foo!1
|
// CHECK: bb0([[IN_ADDR:%.*]] :
|
||||||
|
// CHECK: [[STACK_SLOT:%.*]] = alloc_stack $Phoûx
|
||||||
|
// CHECK: copy_addr [[IN_ADDR]] to [initialization] [[STACK_SLOT]]#1
|
||||||
|
// CHECK: [[VALUE:%.*]] = load [[STACK_SLOT]]#1
|
||||||
|
// CHECK: class_method [[VALUE]] : $Phoûx, #Phoûx.foo!1
|
||||||
|
|
||||||
protocol Bells {
|
protocol Bells {
|
||||||
init(bellsOn: Int)
|
init(bellsOn: Int)
|
||||||
|
|||||||
@@ -101,9 +101,8 @@ func physical_struct_lvalue(c: Int) {
|
|||||||
func physical_class_lvalue(r: Ref, a: Int) {
|
func physical_class_lvalue(r: Ref, a: Int) {
|
||||||
r.y = a
|
r.y = a
|
||||||
|
|
||||||
// CHECK: strong_retain %0 : $Ref
|
|
||||||
// CHECK: [[FN:%[0-9]+]] = class_method %0 : $Ref, #Ref.y!setter.1
|
// CHECK: [[FN:%[0-9]+]] = class_method %0 : $Ref, #Ref.y!setter.1
|
||||||
// CHECK: apply [[FN]](%1, %0) : $@cc(method) @thin (Int, @owned Ref) -> ()
|
// CHECK: apply [[FN]](%1, %0) : $@cc(method) @thin (Int, @guaranteed Ref) -> ()
|
||||||
// CHECK: strong_release %0 : $Ref
|
// CHECK: strong_release %0 : $Ref
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,16 +110,15 @@ func physical_struct_lvalue(c: Int) {
|
|||||||
// CHECK-LABEL: sil hidden @_TF10properties24physical_subclass_lvalue
|
// CHECK-LABEL: sil hidden @_TF10properties24physical_subclass_lvalue
|
||||||
func physical_subclass_lvalue(r: RefSubclass, a: Int) {
|
func physical_subclass_lvalue(r: RefSubclass, a: Int) {
|
||||||
r.y = a
|
r.y = a
|
||||||
// CHECK: strong_retain %0 : $RefSubclass
|
// strong_retain %0 : $RefSubclass
|
||||||
// CHECK: [[R_SUP:%[0-9]+]] = upcast %0 : $RefSubclass to $Ref
|
// CHECK: [[R_SUP:%[0-9]+]] = upcast %0 : $RefSubclass to $Ref
|
||||||
// CHECK: [[FN:%[0-9]+]] = class_method [[R_SUP]] : $Ref, #Ref.y!setter.1 : Ref
|
// CHECK: [[FN:%[0-9]+]] = class_method [[R_SUP]] : $Ref, #Ref.y!setter.1 : Ref -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed Ref) -> ()
|
||||||
// CHECK: apply [[FN]](%1, [[R_SUP]]) :
|
// CHECK: apply [[FN]](%1, [[R_SUP]]) :
|
||||||
|
// CHECK: strong_release [[R_SUP]]
|
||||||
r.w = a
|
r.w = a
|
||||||
|
|
||||||
// CHECK: strong_retain %0 : $RefSubclass
|
|
||||||
// CHECK: [[FN:%[0-9]+]] = class_method %0 : $RefSubclass, #RefSubclass.w!setter.1
|
// CHECK: [[FN:%[0-9]+]] = class_method %0 : $RefSubclass, #RefSubclass.w!setter.1
|
||||||
// CHECK: apply [[FN]](%1, %0) : $@cc(method) @thin (Int, @owned RefSubclass) -> ()
|
// CHECK: apply [[FN]](%1, %0) : $@cc(method) @thin (Int, @guaranteed RefSubclass) -> ()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -337,9 +335,8 @@ func physical_inout(var x: Int) {
|
|||||||
// CHECK-NEXT: bb0([[VVAL:%[0-9]+]] : $Val, [[I:%[0-9]+]] : $Int):
|
// CHECK-NEXT: bb0([[VVAL:%[0-9]+]] : $Val, [[I:%[0-9]+]] : $Int):
|
||||||
func val_subscript_get(v: Val, i: Int) -> Float {
|
func val_subscript_get(v: Val, i: Int) -> Float {
|
||||||
return v[i]
|
return v[i]
|
||||||
// CHECK: retain_value [[VVAL]]
|
|
||||||
// CHECK: [[SUBSCRIPT_GET_METHOD:%[0-9]+]] = function_ref @_TFV10properties3Valg9subscript
|
// CHECK: [[SUBSCRIPT_GET_METHOD:%[0-9]+]] = function_ref @_TFV10properties3Valg9subscript
|
||||||
// CHECK: [[RET:%[0-9]+]] = apply [[SUBSCRIPT_GET_METHOD]]([[I]], [[VVAL]])
|
// CHECK: [[RET:%[0-9]+]] = apply [[SUBSCRIPT_GET_METHOD]]([[I]], [[VVAL]]) : $@cc(method) @thin (Int, @guaranteed Val)
|
||||||
// CHECK: return [[RET]]
|
// CHECK: return [[RET]]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -707,7 +704,7 @@ class DerivedProperty : BaseProperty {
|
|||||||
// CHECK: [[BASEPTR:%[0-9]+]] = upcast %0 : $DerivedProperty to $BaseProperty
|
// CHECK: [[BASEPTR:%[0-9]+]] = upcast %0 : $DerivedProperty to $BaseProperty
|
||||||
// CHECK: // function_ref properties.BaseProperty.x.getter
|
// CHECK: // function_ref properties.BaseProperty.x.getter
|
||||||
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFC10properties12BasePropertyg1x
|
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFC10properties12BasePropertyg1x
|
||||||
// CHECK: apply [[FN]]([[BASEPTR]]) : $@cc(method) @thin (@owned BaseProperty) -> Int // user: %7
|
// CHECK: apply [[FN]]([[BASEPTR]]) : $@cc(method) @thin (@guaranteed BaseProperty) -> Int // user: %7
|
||||||
|
|
||||||
|
|
||||||
// <rdar://problem/16411449> ownership qualifiers don't work with non-mutating struct property
|
// <rdar://problem/16411449> ownership qualifiers don't work with non-mutating struct property
|
||||||
@@ -723,7 +720,6 @@ struct ReferenceStorageTypeRValues {
|
|||||||
// CHECK-NEXT: %2 = struct_extract %0 : $ReferenceStorageTypeRValues, #ReferenceStorageTypeRValues.p1
|
// CHECK-NEXT: %2 = struct_extract %0 : $ReferenceStorageTypeRValues, #ReferenceStorageTypeRValues.p1
|
||||||
// CHECK-NEXT: strong_retain_unowned %2 : $@sil_unowned Ref
|
// CHECK-NEXT: strong_retain_unowned %2 : $@sil_unowned Ref
|
||||||
// CHECK-NEXT: %4 = unowned_to_ref %2 : $@sil_unowned Ref to $Ref
|
// CHECK-NEXT: %4 = unowned_to_ref %2 : $@sil_unowned Ref to $Ref
|
||||||
// CHECK-NEXT: release_value %0 : $ReferenceStorageTypeRValues
|
|
||||||
// CHECK-NEXT: return %4 : $Ref
|
// CHECK-NEXT: return %4 : $Ref
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
@@ -875,7 +871,6 @@ class ClassWithLetProperty {
|
|||||||
// CHECK-NEXT: debug_value
|
// CHECK-NEXT: debug_value
|
||||||
// CHECK-NEXT: [[PTR:%[0-9]+]] = ref_element_addr %0 : $ClassWithLetProperty, #ClassWithLetProperty.p
|
// CHECK-NEXT: [[PTR:%[0-9]+]] = ref_element_addr %0 : $ClassWithLetProperty, #ClassWithLetProperty.p
|
||||||
// CHECK-NEXT: [[VAL:%[0-9]+]] = load [[PTR]] : $*Int
|
// CHECK-NEXT: [[VAL:%[0-9]+]] = load [[PTR]] : $*Int
|
||||||
// CHECK-NEXT: strong_release %0 : $ClassWithLetProperty
|
|
||||||
// CHECK-NEXT: return [[VAL]] : $Int
|
// CHECK-NEXT: return [[VAL]] : $Int
|
||||||
|
|
||||||
|
|
||||||
@@ -971,11 +966,11 @@ func addressOnlyNonmutatingProperty<T>(x: AddressOnlyNonmutatingSet<T>)
|
|||||||
// CHECK-LABEL: sil hidden @_TF10properties30addressOnlyNonmutatingPropertyU__FGVS_25AddressOnlyNonmutatingSetQ__Si : $@thin <T> (@in AddressOnlyNonmutatingSet<T>) -> Int {
|
// CHECK-LABEL: sil hidden @_TF10properties30addressOnlyNonmutatingPropertyU__FGVS_25AddressOnlyNonmutatingSetQ__Si : $@thin <T> (@in AddressOnlyNonmutatingSet<T>) -> Int {
|
||||||
// CHECK: [[SET:%.*]] = function_ref @_TFV10properties25AddressOnlyNonmutatingSets4propSi
|
// CHECK: [[SET:%.*]] = function_ref @_TFV10properties25AddressOnlyNonmutatingSets4propSi
|
||||||
// CHECK: apply [[SET]]<T>({{%.*}}, [[TMP:%.*]]#1)
|
// CHECK: apply [[SET]]<T>({{%.*}}, [[TMP:%.*]]#1)
|
||||||
// CHECK-NOT: destroy_addr [[TMP]]
|
// CHECK: destroy_addr [[TMP]]
|
||||||
// CHECK: dealloc_stack [[TMP]]
|
// CHECK: dealloc_stack [[TMP]]
|
||||||
// CHECK: [[GET:%.*]] = function_ref @_TFV10properties25AddressOnlyNonmutatingSetg4propSi
|
// CHECK: [[GET:%.*]] = function_ref @_TFV10properties25AddressOnlyNonmutatingSetg4propSi
|
||||||
// CHECK: apply [[GET]]<T>([[TMP:%.*]]#1)
|
// CHECK: apply [[GET]]<T>([[TMP:%.*]]#1)
|
||||||
// CHECK-NOT: destroy_addr [[TMP]]
|
// CHECK: destroy_addr [[TMP]]
|
||||||
// CHECK: dealloc_stack [[TMP]]
|
// CHECK: dealloc_stack [[TMP]]
|
||||||
|
|
||||||
protocol MakeAddressOnly {}
|
protocol MakeAddressOnly {}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ public protocol P1 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension P1 {
|
extension P1 {
|
||||||
// CHECK-LABEL: sil hidden @_TFP19protocol_extensions2P16extP1aUS0___fQPS0_FT_T_ : $@cc(method) @thin <Self where Self : P1> (@in Self) -> () {
|
// CHECK-LABEL: sil hidden @_TFP19protocol_extensions2P16extP1aUS0___fQPS0_FT_T_ : $@cc(method) @thin <Self where Self : P1> (@in_guaranteed Self) -> () {
|
||||||
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $*Self):
|
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $*Self):
|
||||||
final func extP1a() {
|
final func extP1a() {
|
||||||
// CHECK: [[WITNESS:%[0-9]+]] = witness_method $Self, #P1.reqP1a!1 : $@cc(witness_method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> ()
|
// CHECK: [[WITNESS:%[0-9]+]] = witness_method $Self, #P1.reqP1a!1 : $@cc(witness_method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> ()
|
||||||
@@ -15,13 +15,11 @@ extension P1 {
|
|||||||
// CHECK: return
|
// CHECK: return
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil @_TFP19protocol_extensions2P16extP1bUS0___fQPS0_FT_T_ : $@cc(method) @thin <Self where Self : P1> (@in Self) -> () {
|
// CHECK-LABEL: sil @_TFP19protocol_extensions2P16extP1bUS0___fQPS0_FT_T_ : $@cc(method) @thin <Self where Self : P1> (@in_guaranteed Self) -> () {
|
||||||
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $*Self):
|
// CHECK-NEXT: bb0([[SELF:%[0-9]+]] : $*Self):
|
||||||
public final func extP1b() {
|
public final func extP1b() {
|
||||||
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P16extP1aUS0___fQPS0_FT_T_ : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in τ_0_0) -> ()
|
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P16extP1aUS0___fQPS0_FT_T_ : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> ()
|
||||||
// CHECK-NEXT: [[SELF_COPY:%[0-9]+]] = alloc_stack $Self
|
// CHECK-NEXT: apply [[FN]]<Self>([[SELF]]) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> ()
|
||||||
// CHECK-NEXT: copy_addr [[SELF]] to [initialization] [[SELF_COPY]]#1 : $*Self
|
|
||||||
// CHECK-NEXT: apply [[FN]]<Self>([[SELF_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in τ_0_0) -> ()
|
|
||||||
extP1a()
|
extP1a()
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
}
|
}
|
||||||
@@ -44,7 +42,7 @@ func testD(d: D) {
|
|||||||
// CHECK: [[DCOPY:%[0-9]+]] = alloc_stack $D
|
// CHECK: [[DCOPY:%[0-9]+]] = alloc_stack $D
|
||||||
// CHECK: store [[D]] to [[DCOPY]]#1 : $*D
|
// CHECK: store [[D]] to [[DCOPY]]#1 : $*D
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = alloc_stack $D
|
// CHECK: [[RESULT:%[0-9]+]] = alloc_stack $D
|
||||||
// CHECK: apply [[FN]]<D>([[RESULT]]#1, [[DCOPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@out τ_0_0, @in τ_0_0) -> ()
|
// CHECK: apply [[FN]]<D>([[RESULT]]#1, [[DCOPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@out τ_0_0, @in_guaranteed τ_0_0) -> ()
|
||||||
var d2: D = d.returnsSelf()
|
var d2: D = d.returnsSelf()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,22 +80,19 @@ extension P1 {
|
|||||||
func testExistentials1(p1: P1, b: Bool, i: Int64) {
|
func testExistentials1(p1: P1, b: Bool, i: Int64) {
|
||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]])
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]])
|
||||||
// CHECK: [[F1:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P12f1US0___fQPS0_FT_T_
|
// CHECK: [[F1:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P12f1US0___fQPS0_FT_T_
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: apply [[F1]]<@opened([[UUID]]) P1>([[POPENED]]) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> ()
|
||||||
// CHECK: apply [[F1]]<@opened([[UUID]]) P1>([[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in τ_0_0) -> ()
|
|
||||||
// CHECK: dealloc_stack [[POPENED_COPY]]
|
|
||||||
p1.f1()
|
p1.f1()
|
||||||
|
|
||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: [[CURRIED1:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P18curried1US0___fQPS0_fSbFVSs5Int64T_
|
// CHECK: [[CURRIED1:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P18curried1US0___fQPS0_fSbFVSs5Int64T_
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: [[CURRIED1]]<@opened([[UUID]]) P1>([[I]], [[B]], [[POPENED]]) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Int64, Bool, @in_guaranteed τ_0_0) -> ()
|
||||||
// CHECK: [[CURRIED1]]<@opened([[UUID]]) P1>([[I]], [[B]], [[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Int64, Bool, @in τ_0_0) -> ()
|
|
||||||
// CHECK: dealloc_stack [[POPENED_COPY]]
|
|
||||||
p1.curried1(b)(i)
|
p1.curried1(b)(i)
|
||||||
|
|
||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g9subscriptFVSs5Int64Sb
|
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g9subscriptFVSs5Int64Sb
|
||||||
// CHECK: apply [[GETTER]]<@opened([[UUID]]) P1>([[I]], [[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Int64, @in τ_0_0) -> Bool
|
// CHECK: apply [[GETTER]]<@opened([[UUID]]) P1>([[I]], [[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Int64, @in_guaranteed τ_0_0) -> Bool
|
||||||
|
// CHECK: destroy_addr [[POPENED_COPY]]#1
|
||||||
// CHECK: store{{.*}} : $*Bool
|
// CHECK: store{{.*}} : $*Bool
|
||||||
// CHECK: dealloc_stack [[POPENED_COPY]]
|
// CHECK: dealloc_stack [[POPENED_COPY]]
|
||||||
var b2 = p1[i]
|
var b2 = p1[i]
|
||||||
@@ -105,7 +100,7 @@ func testExistentials1(p1: P1, b: Bool, i: Int64) {
|
|||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g4propSb
|
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g4propSb
|
||||||
// CHECK: apply [[GETTER]]<@opened([[UUID]]) P1>([[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in τ_0_0) -> Bool
|
// CHECK: apply [[GETTER]]<@opened([[UUID]]) P1>([[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> Bool
|
||||||
// CHECK: store{{.*}} : $*Bool
|
// CHECK: store{{.*}} : $*Bool
|
||||||
// CHECK: dealloc_stack [[POPENED_COPY]]
|
// CHECK: dealloc_stack [[POPENED_COPY]]
|
||||||
var b3 = p1.prop
|
var b3 = p1.prop
|
||||||
@@ -118,10 +113,8 @@ func testExistentials2(p1: P1) {
|
|||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: [[P1AINIT:%[0-9]+]] = init_existential_addr [[P1A]]#1 : $*P1, $@opened([[UUID2:".*"]]) P1
|
// CHECK: [[P1AINIT:%[0-9]+]] = init_existential_addr [[P1A]]#1 : $*P1, $@opened([[UUID2:".*"]]) P1
|
||||||
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P111returnsSelfUS0___fQPS0_FT_S1_
|
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P111returnsSelfUS0___fQPS0_FT_S1_
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: apply [[FN]]<@opened([[UUID]]) P1>([[P1AINIT]], [[POPENED]]) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@out τ_0_0, @in_guaranteed τ_0_0) -> ()
|
||||||
// CHECK: apply [[FN]]<@opened([[UUID]]) P1>([[P1AINIT]], [[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@out τ_0_0, @in τ_0_0) -> ()
|
|
||||||
var p1a: P1 = p1.returnsSelf()
|
var p1a: P1 = p1.returnsSelf()
|
||||||
// CHECK: dealloc_stack [[POPENED_COPY]]#0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF19protocol_extensions23testExistentialsGetters
|
// CHECK-LABEL: sil hidden @_TF19protocol_extensions23testExistentialsGetters
|
||||||
@@ -130,13 +123,13 @@ func testExistentialsGetters(p1: P1) {
|
|||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
||||||
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g5prop2Sb
|
// CHECK: [[FN:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g5prop2Sb
|
||||||
// CHECK: [[B:%[0-9]+]] = apply [[FN]]<@opened([[UUID]]) P1>([[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in τ_0_0) -> Bool
|
// CHECK: [[B:%[0-9]+]] = apply [[FN]]<@opened([[UUID]]) P1>([[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (@in_guaranteed τ_0_0) -> Bool
|
||||||
let b: Bool = p1.prop2
|
let b: Bool = p1.prop2
|
||||||
|
|
||||||
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[POPENED:%[0-9]+]] = open_existential_addr [[P]] : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
// CHECK: copy_addr [[POPENED]] to [initialization] [[POPENED_COPY:%.*]]#1
|
||||||
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g9subscriptFSbSb
|
// CHECK: [[GETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1g9subscriptFSbSb
|
||||||
// CHECK: apply [[GETTER]]<@opened([[UUID]]) P1>([[B]], [[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Bool, @in τ_0_0) -> Bool
|
// CHECK: apply [[GETTER]]<@opened([[UUID]]) P1>([[B]], [[POPENED_COPY]]#1) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Bool, @in_guaranteed τ_0_0) -> Bool
|
||||||
let b2: Bool = p1[b]
|
let b2: Bool = p1[b]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,8 +170,8 @@ func testLogicalExistentialSetters(var hasAP1: HasAP1, b: Bool) {
|
|||||||
// CHECK: [[P1_COPY:%[0-9]+]] = alloc_stack $P1
|
// CHECK: [[P1_COPY:%[0-9]+]] = alloc_stack $P1
|
||||||
// CHECK-NEXT: [[HASP1_COPY:%[0-9]+]] = alloc_stack $HasAP1
|
// CHECK-NEXT: [[HASP1_COPY:%[0-9]+]] = alloc_stack $HasAP1
|
||||||
// CHECK-NEXT: copy_addr [[HASP1_BOX]]#1 to [initialization] [[HASP1_COPY]]#1 : $*HasAP1
|
// CHECK-NEXT: copy_addr [[HASP1_BOX]]#1 to [initialization] [[HASP1_COPY]]#1 : $*HasAP1
|
||||||
// CHECK: [[SOMEP1_GETTER:%[0-9]+]] = function_ref @_TFV19protocol_extensions6HasAP1g6someP1PS_2P1_ : $@cc(method) @thin (@out P1, @in HasAP1) -> ()
|
// CHECK: [[SOMEP1_GETTER:%[0-9]+]] = function_ref @_TFV19protocol_extensions6HasAP1g6someP1PS_2P1_ : $@cc(method) @thin (@out P1, @in_guaranteed HasAP1) -> ()
|
||||||
// CHECK: [[RESULT:%[0-9]+]] = apply [[SOMEP1_GETTER]]([[P1_COPY]]#1, %6#1) : $@cc(method) @thin (@out P1, @in HasAP1) -> ()
|
// CHECK: [[RESULT:%[0-9]+]] = apply [[SOMEP1_GETTER]]([[P1_COPY]]#1, %6#1) : $@cc(method) @thin (@out P1, @in_guaranteed HasAP1) -> ()
|
||||||
// CHECK: [[P1_OPENED:%[0-9]+]] = open_existential_addr [[P1_COPY]]#1 : $*P1 to $*@opened([[UUID:".*"]]) P1
|
// CHECK: [[P1_OPENED:%[0-9]+]] = open_existential_addr [[P1_COPY]]#1 : $*P1 to $*@opened([[UUID:".*"]]) P1
|
||||||
// CHECK: [[PROP2_SETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1s5prop2Sb : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Bool, @inout τ_0_0) -> ()
|
// CHECK: [[PROP2_SETTER:%[0-9]+]] = function_ref @_TFP19protocol_extensions2P1s5prop2Sb : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Bool, @inout τ_0_0) -> ()
|
||||||
// CHECK: apply [[PROP2_SETTER]]<@opened([[UUID]]) P1>([[B]], [[P1_OPENED]]) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Bool, @inout τ_0_0) -> ()
|
// CHECK: apply [[PROP2_SETTER]]<@opened([[UUID]]) P1>([[B]], [[P1_OPENED]]) : $@cc(method) @thin <τ_0_0 where τ_0_0 : P1> (Bool, @inout τ_0_0) -> ()
|
||||||
@@ -200,12 +193,7 @@ func test_open_existential_semantics_opaque(guaranteed: P1,
|
|||||||
|
|
||||||
// CHECK: [[VALUE:%.*]] = open_existential_addr %0
|
// CHECK: [[VALUE:%.*]] = open_existential_addr %0
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: copy_addr [[VALUE]] to [initialization] [[COPY:%.*]]#1 :
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[COPY]]#1)
|
|
||||||
// CHECK-NOT: destroy_addr [[COPY]]#1
|
|
||||||
// CHECK: dealloc_stack [[COPY]]#0
|
|
||||||
// CHECK-NOT: destroy_addr [[VALUE]]
|
|
||||||
// CHECK-NOT: destroy_addr %0
|
|
||||||
|
|
||||||
// GUARANTEED: [[VALUE:%.*]] = open_existential_addr %0
|
// GUARANTEED: [[VALUE:%.*]] = open_existential_addr %0
|
||||||
// GUARANTEED: [[METHOD:%.*]] = function_ref
|
// GUARANTEED: [[METHOD:%.*]] = function_ref
|
||||||
@@ -268,7 +256,6 @@ func test_open_existential_semantics_class(guaranteed: CP1,
|
|||||||
// CHECK-NOT: strong_retain %0
|
// CHECK-NOT: strong_retain %0
|
||||||
// CHECK: [[VALUE:%.*]] = open_existential_ref %0
|
// CHECK: [[VALUE:%.*]] = open_existential_ref %0
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: strong_retain [[VALUE]]
|
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK-NOT: strong_release [[VALUE]]
|
// CHECK-NOT: strong_release [[VALUE]]
|
||||||
// CHECK-NOT: strong_release %0
|
// CHECK-NOT: strong_release %0
|
||||||
@@ -286,7 +273,7 @@ func test_open_existential_semantics_class(guaranteed: CP1,
|
|||||||
// CHECK: [[VALUE:%.*]] = open_existential_ref [[IMMEDIATE]]
|
// CHECK: [[VALUE:%.*]] = open_existential_ref [[IMMEDIATE]]
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK-NOT: strong_release [[VALUE]]
|
// CHECK: strong_release [[VALUE]]
|
||||||
// CHECK-NOT: strong_release [[IMMEDIATE]]
|
// CHECK-NOT: strong_release [[IMMEDIATE]]
|
||||||
|
|
||||||
// GUARANTEED: [[IMMEDIATE:%.*]] = load [[IMMEDIATE_BOX]]
|
// GUARANTEED: [[IMMEDIATE:%.*]] = load [[IMMEDIATE_BOX]]
|
||||||
@@ -303,7 +290,7 @@ func test_open_existential_semantics_class(guaranteed: CP1,
|
|||||||
// CHECK: [[VALUE:%.*]] = open_existential_ref [[PLUS_ONE]]
|
// CHECK: [[VALUE:%.*]] = open_existential_ref [[PLUS_ONE]]
|
||||||
// CHECK: [[METHOD:%.*]] = function_ref
|
// CHECK: [[METHOD:%.*]] = function_ref
|
||||||
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
|
||||||
// CHECK-NOT: strong_release [[VALUE]]
|
// CHECK: strong_release [[VALUE]]
|
||||||
// CHECK-NOT: strong_release [[PLUS_ONE]]
|
// CHECK-NOT: strong_release [[PLUS_ONE]]
|
||||||
|
|
||||||
// GUARANTEED: [[F:%.*]] = function_ref {{.*}}plusOneCP1
|
// GUARANTEED: [[F:%.*]] = function_ref {{.*}}plusOneCP1
|
||||||
|
|||||||
@@ -249,11 +249,14 @@ class ClassWithGetter : PropertyWithGetter {
|
|||||||
// Make sure we are generating a protocol witness that calls the class method on
|
// Make sure we are generating a protocol witness that calls the class method on
|
||||||
// ClassWithGetter.
|
// ClassWithGetter.
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC9protocols15ClassWithGetterS_18PropertyWithGetterS_FS1_g1aSi : $@cc(witness_method) @thin (@in_guaranteed ClassWithGetter) -> Int {
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC9protocols15ClassWithGetterS_18PropertyWithGetterS_FS1_g1aSi : $@cc(witness_method) @thin (@in_guaranteed ClassWithGetter) -> Int {
|
||||||
// CHECK: bb0
|
// CHECK: bb0([[C:%.*]] : $*ClassWithGetter):
|
||||||
// CHECK-NEXT: load
|
// CHECK-NEXT: [[CCOPY:%.*]] = alloc_stack $ClassWithGetter
|
||||||
// CHECK-NEXT: strong_retain
|
// CHECK-NEXT: copy_addr [[C]] to [initialization] [[CCOPY]]#1
|
||||||
// CHECK-NEXT: class_method
|
// CHECK-NEXT: [[CCOPY_LOADED:%.*]] = load [[CCOPY]]#1
|
||||||
// CHECK-NEXT: apply
|
// CHECK-NEXT: [[FUN:%.*]] = class_method [[CCOPY_LOADED]] : $ClassWithGetter, #ClassWithGetter.a!getter.1 : ClassWithGetter -> () -> Int , $@cc(method) @thin (@guaranteed ClassWithGetter) -> Int
|
||||||
|
// CHECK-NEXT: apply [[FUN]]([[CCOPY_LOADED]])
|
||||||
|
// CHECK-NEXT: strong_release [[CCOPY_LOADED]]
|
||||||
|
// CHECK-NEXT: dealloc_stack [[CCOPY]]#0
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
|
|
||||||
class ClassWithGetterSetter : PropertyWithGetterSetter, PropertyWithGetter {
|
class ClassWithGetterSetter : PropertyWithGetterSetter, PropertyWithGetter {
|
||||||
@@ -272,11 +275,14 @@ class ClassWithGetterSetter : PropertyWithGetterSetter, PropertyWithGetter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC9protocols21ClassWithGetterSetterS_24PropertyWithGetterSetterS_FS1_g1bSi : $@cc(witness_method) @thin (@in_guaranteed ClassWithGetterSetter) -> Int {
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC9protocols21ClassWithGetterSetterS_24PropertyWithGetterSetterS_FS1_g1bSi : $@cc(witness_method) @thin (@in_guaranteed ClassWithGetterSetter) -> Int {
|
||||||
// CHECK: bb0
|
// CHECK: bb0([[C:%.*]] : $*ClassWithGetterSetter):
|
||||||
// CHECK-NEXT: load
|
// CHECK-NEXT: [[CCOPY:%.*]] = alloc_stack $ClassWithGetterSetter
|
||||||
// CHECK-NEXT: strong_retain
|
// CHECK-NEXT: copy_addr [[C]] to [initialization] [[CCOPY]]#1
|
||||||
// CHECK-NEXT: class_method
|
// CHECK-NEXT: [[CCOPY_LOADED:%.*]] = load [[CCOPY]]#1
|
||||||
// CHECK-NEXT: apply
|
// CHECK-NEXT: [[FUN:%.*]] = class_method [[CCOPY_LOADED]] : $ClassWithGetterSetter, #ClassWithGetterSetter.b!getter.1 : ClassWithGetterSetter -> () -> Int , $@cc(method) @thin (@guaranteed ClassWithGetterSetter) -> Int
|
||||||
|
// CHECK-NEXT: apply [[FUN]]([[CCOPY_LOADED]])
|
||||||
|
// CHECK-NEXT: strong_release [[CCOPY_LOADED]]
|
||||||
|
// CHECK-NEXT: dealloc_stack [[CCOPY]]#0
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
|
|
||||||
// Stored variables fulfilling property requirements
|
// Stored variables fulfilling property requirements
|
||||||
@@ -289,13 +295,13 @@ class ClassWithStoredProperty : PropertyWithGetter {
|
|||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}ClassWithStoredProperty{{.*}}methodUsingProperty
|
// CHECK-LABEL: sil hidden @{{.*}}ClassWithStoredProperty{{.*}}methodUsingProperty
|
||||||
// CHECK-NEXT: bb0(%0 : $ClassWithStoredProperty):
|
// CHECK-NEXT: bb0([[ARG:%.*]] : $ClassWithStoredProperty):
|
||||||
// CHECK-NEXT: debug_value %0
|
// CHECK-NEXT: debug_value [[ARG]]
|
||||||
// CHECK-NEXT: strong_retain %0 : $ClassWithStoredProperty
|
// CHECK-NOT: strong_retain
|
||||||
// CHECK-NEXT: %3 = class_method %0 : $ClassWithStoredProperty, #ClassWithStoredProperty.a!getter.1
|
// CHECK-NEXT: [[FUN:%.*]] = class_method [[ARG]] : $ClassWithStoredProperty, #ClassWithStoredProperty.a!getter.1 : ClassWithStoredProperty -> () -> Int , $@cc(method) @thin (@guaranteed ClassWithStoredProperty) -> Int
|
||||||
// CHECK-NEXT: %4 = apply %3(%0)
|
// CHECK-NEXT: [[RESULT:%.*]] = apply [[FUN]]([[ARG]])
|
||||||
// CHECK-NEXT: strong_release %0 : $ClassWithStoredProperty
|
// CHECK-NOT: strong_release
|
||||||
// CHECK-NEXT: return %4 : $Int
|
// CHECK-NEXT: return [[RESULT]] : $Int
|
||||||
}
|
}
|
||||||
|
|
||||||
struct StructWithStoredProperty : PropertyWithGetter {
|
struct StructWithStoredProperty : PropertyWithGetter {
|
||||||
@@ -314,14 +320,57 @@ struct StructWithStoredProperty : PropertyWithGetter {
|
|||||||
|
|
||||||
// Make sure that we generate direct function calls for out struct protocl
|
// Make sure that we generate direct function calls for out struct protocl
|
||||||
// witness since structs don't do virtual calls for methods.
|
// witness since structs don't do virtual calls for methods.
|
||||||
|
//
|
||||||
|
// *NOTE* Even though at first glance the copy_addr looks like a leak
|
||||||
|
// here, StructWithStoredProperty is a trivial struct implying that no
|
||||||
|
// leak is occuring. See the test with StructWithStoredClassProperty
|
||||||
|
// that makes sure in such a case we don't leak. This is due to the
|
||||||
|
// thunking code being too dumb but it is harmless to program
|
||||||
|
// correctness.
|
||||||
|
//
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWV9protocols24StructWithStoredPropertyS_18PropertyWithGetterS_FS1_g1aSi : $@cc(witness_method) @thin (@in_guaranteed StructWithStoredProperty) -> Int {
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWV9protocols24StructWithStoredPropertyS_18PropertyWithGetterS_FS1_g1aSi : $@cc(witness_method) @thin (@in_guaranteed StructWithStoredProperty) -> Int {
|
||||||
// CHECK: bb0
|
// CHECK: bb0([[C:%.*]] : $*StructWithStoredProperty):
|
||||||
// CHECK-NEXT: load
|
// CHECK-NEXT: [[CCOPY:%.*]] = alloc_stack $StructWithStoredProperty
|
||||||
|
// CHECK-NEXT: copy_addr [[C]] to [initialization] [[CCOPY]]#1
|
||||||
|
// CHECK-NEXT: [[CCOPY_LOADED:%.*]] = load [[CCOPY]]#1
|
||||||
// CHECK-NEXT: function_ref
|
// CHECK-NEXT: function_ref
|
||||||
// CHECK-NEXT: function_ref @_TFV9protocols24StructWithStoredPropertyg1aSi : $@cc(method) @thin (StructWithStoredProperty) -> Int
|
// CHECK-NEXT: [[FUN:%.*]] = function_ref @_TFV9protocols24StructWithStoredPropertyg1aSi : $@cc(method) @thin (StructWithStoredProperty) -> Int
|
||||||
// CHECK-NEXT: apply %2(%1) : $@cc(method) @thin (StructWithStoredProperty) -> Int
|
// CHECK-NEXT: apply [[FUN]]([[CCOPY_LOADED]])
|
||||||
|
// CHECK-NEXT: dealloc_stack [[CCOPY]]#0
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
|
|
||||||
|
class C {}
|
||||||
|
|
||||||
|
// Make sure that if the getter has a class property, we pass it in
|
||||||
|
// in_guaranteed and don't leak.
|
||||||
|
struct StructWithStoredClassProperty : PropertyWithGetter {
|
||||||
|
var a : Int
|
||||||
|
var c: C = C()
|
||||||
|
|
||||||
|
// Make sure that accesses aren't going through the generated accessors.
|
||||||
|
func methodUsingProperty() -> Int {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
// CHECK-LABEL: sil hidden @{{.*}}StructWithStoredClassProperty{{.*}}methodUsingProperty
|
||||||
|
// CHECK-NEXT: bb0(%0 : $StructWithStoredClassProperty):
|
||||||
|
// CHECK-NEXT: debug_value %0
|
||||||
|
// CHECK-NEXT: %2 = struct_extract %0 : $StructWithStoredClassProperty, #StructWithStoredClassProperty.a
|
||||||
|
// CHECK-NEXT: return %2 : $Int
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWV9protocols29StructWithStoredClassPropertyS_18PropertyWithGetterS_FS1_g1aSi : $@cc(witness_method) @thin (@in_guaranteed StructWithStoredClassProperty) -> Int {
|
||||||
|
// CHECK: bb0([[C:%.*]] : $*StructWithStoredClassProperty):
|
||||||
|
// CHECK-NEXT: [[CCOPY:%.*]] = alloc_stack $StructWithStoredClassProperty
|
||||||
|
// CHECK-NEXT: copy_addr [[C]] to [initialization] [[CCOPY]]#1
|
||||||
|
// CHECK-NEXT: [[CCOPY_LOADED:%.*]] = load [[CCOPY]]#1
|
||||||
|
// CHECK-NEXT: function_ref
|
||||||
|
// CHECK-NEXT: [[FUN:%.*]] = function_ref @_TFV9protocols29StructWithStoredClassPropertyg1aSi : $@cc(method) @thin (@guaranteed StructWithStoredClassProperty) -> Int
|
||||||
|
// CHECK-NEXT: apply [[FUN]]([[CCOPY_LOADED]])
|
||||||
|
// CHECK-NEXT: release_value [[CCOPY_LOADED]]
|
||||||
|
// CHECK-NEXT: dealloc_stack [[CCOPY]]#0
|
||||||
|
// CHECK-NEXT: return
|
||||||
|
|
||||||
|
|
||||||
// CHECK-LABEL: sil_witness_table hidden ClassWithGetter: PropertyWithGetter module protocols {
|
// CHECK-LABEL: sil_witness_table hidden ClassWithGetter: PropertyWithGetter module protocols {
|
||||||
// CHECK-NEXT: method #PropertyWithGetter.a!getter.1: @_TTWC9protocols15ClassWithGetterS_18PropertyWithGetterS_FS1_g1aSi
|
// CHECK-NEXT: method #PropertyWithGetter.a!getter.1: @_TTWC9protocols15ClassWithGetterS_18PropertyWithGetterS_FS1_g1aSi
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
@@ -336,4 +385,10 @@ struct StructWithStoredProperty : PropertyWithGetter {
|
|||||||
// CHECK-NEXT: method #PropertyWithGetter.a!getter.1: @_TTWC9protocols21ClassWithGetterSetterS_18PropertyWithGetterS_FS1_g1aSi
|
// CHECK-NEXT: method #PropertyWithGetter.a!getter.1: @_TTWC9protocols21ClassWithGetterSetterS_18PropertyWithGetterS_FS1_g1aSi
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
|
// CHECK-LABEL: sil_witness_table hidden StructWithStoredProperty: PropertyWithGetter module protocols {
|
||||||
|
// CHECK-NEXT: method #PropertyWithGetter.a!getter.1: @_TTWV9protocols24StructWithStoredPropertyS_18PropertyWithGetterS_FS1_g1aSi
|
||||||
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
|
// CHECK-LABEL: sil_witness_table hidden StructWithStoredClassProperty: PropertyWithGetter module protocols {
|
||||||
|
// CHECK-NEXT: method #PropertyWithGetter.a!getter.1: @_TTWV9protocols29StructWithStoredClassPropertyS_18PropertyWithGetterS_FS1_g1aSi
|
||||||
|
// CHECK-NEXT: }
|
||||||
|
|||||||
@@ -4,15 +4,15 @@ class C {
|
|||||||
var member: Int = 0
|
var member: Int = 0
|
||||||
|
|
||||||
// Methods have method calling convention.
|
// Methods have method calling convention.
|
||||||
// CHECK-LABEL: sil hidden @{{.*}}C3foo{{.*}} : $@cc(method) @thin (Int, @owned C) -> ()
|
// CHECK-LABEL: sil hidden @_TFC5types1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, @guaranteed C) -> () {
|
||||||
func foo(#x: Int) {
|
func foo(#x: Int) {
|
||||||
// CHECK: bb0([[X:%[0-9]+]] : $Int, [[THIS:%[0-9]+]] : $C):
|
// CHECK: bb0([[X:%[0-9]+]] : $Int, [[THIS:%[0-9]+]] : $C):
|
||||||
member = x
|
member = x
|
||||||
|
|
||||||
// CHECK: strong_retain %1 : $C
|
// CHECK-NOT: strong_retain
|
||||||
// CHECK: [[FN:%[0-9]+]] = class_method %1 : $C, #C.member!setter.1
|
// CHECK: [[FN:%[0-9]+]] = class_method %1 : $C, #C.member!setter.1
|
||||||
// CHECK: apply [[FN]](%0, %1) : $@cc(method) @thin (Int, @owned C) -> ()
|
// CHECK: apply [[FN]](%0, %1) : $@cc(method) @thin (Int, @guaranteed C) -> ()
|
||||||
// CHECK: strong_release %1 : $C
|
// CHECK-NOT: strong_release
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,13 +92,14 @@ func test_unowned_let_capture(aC : C) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil shared @_TFF7unowned24test_unowned_let_captureFCS_1CT_U_FT_Si : $@thin (@owned @sil_unowned C) -> Int {
|
// CHECK-LABEL: sil shared @_TFF7unowned24test_unowned_let_captureFCS_1CT_U_FT_Si : $@thin (@owned @sil_unowned C) -> Int {
|
||||||
// CHECK-NEXT: bb0(%0 : $@sil_unowned C):
|
// CHECK-NEXT: bb0([[ARG:%.*]] : $@sil_unowned C):
|
||||||
// CHECK-NEXT: strong_retain_unowned %0 : $@sil_unowned C
|
// CHECK-NEXT: strong_retain_unowned [[ARG]] : $@sil_unowned C
|
||||||
// CHECK-NEXT: %2 = unowned_to_ref %0 : $@sil_unowned C to $C
|
// CHECK-NEXT: [[UNOWNED_ARG:%.*]] = unowned_to_ref [[ARG]] : $@sil_unowned C to $C
|
||||||
// CHECK-NEXT: %3 = class_method %2 : $C, #C.f!1 : C -> () -> Int , $@cc(method) @thin (@owned C) -> Int
|
// CHECK-NEXT: [[FUN:%.*]] = class_method [[UNOWNED_ARG]] : $C, #C.f!1 : C -> () -> Int , $@cc(method) @thin (@guaranteed C) -> Int
|
||||||
// CHECK-NEXT: %4 = apply %3(%2) : $@cc(method) @thin (@owned C) -> Int
|
// CHECK-NEXT: [[RESULT:%.*]] = apply [[FUN]]([[UNOWNED_ARG]]) : $@cc(method) @thin (@guaranteed C) -> Int
|
||||||
// CHECK-NEXT: unowned_release %0 : $@sil_unowned C
|
// CHECK-NEXT: strong_release [[UNOWNED_ARG]]
|
||||||
// CHECK-NEXT: return %4 : $Int
|
// CHECK-NEXT: unowned_release [[ARG]] : $@sil_unowned C
|
||||||
|
// CHECK-NEXT: return [[RESULT]] : $Int
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -270,9 +270,9 @@ func <~>(x: ConformingClassToClassProtocol,
|
|||||||
// TABLE-NEXT: method #ClassProtocol.staticMethod!1: @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_12staticMethodUS1__U_S_9AssocReqt__fMQPS1_FT1xS3__T_
|
// TABLE-NEXT: method #ClassProtocol.staticMethod!1: @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_12staticMethodUS1__U_S_9AssocReqt__fMQPS1_FT1xS3__T_
|
||||||
// TABLE-NEXT: method #ClassProtocol."<~>"!1: @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_oi3ltgUS1__U_S_9AssocReqt__fMQPS1
|
// TABLE-NEXT: method #ClassProtocol."<~>"!1: @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_oi3ltgUS1__U_S_9AssocReqt__fMQPS1
|
||||||
// TABLE-NEXT: }
|
// TABLE-NEXT: }
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_FS1_6methodUS1__U_S_9AssocReqt__fQPS1_FT1xVS_3Arg1yS3__T_ : $@cc(witness_method) @thin (Arg, @owned ConformingClassToClassProtocol, @owned ConformingClassToClassProtocol) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_FS1_6methodUS1__U_S_9AssocReqt__fQPS1_FT1xVS_3Arg1yS3__T_ : $@cc(witness_method) @thin (Arg, @owned ConformingClassToClassProtocol, @guaranteed ConformingClassToClassProtocol) -> ()
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_FS1_7genericUS1__U_S_9AssocReqt__fQPS1_US_13ArchetypeReqt__FT1xQ_1yS3__T_ : $@cc(witness_method) @thin <B where B : ArchetypeReqt> (@in B, @owned ConformingClassToClassProtocol, @owned ConformingClassToClassProtocol) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_FS1_7genericUS1__U_S_9AssocReqt__fQPS1_US_13ArchetypeReqt__FT1xQ_1yS3__T_ : $@cc(witness_method) @thin <B where B : ArchetypeReqt> (@in B, @owned ConformingClassToClassProtocol, @guaranteed ConformingClassToClassProtocol) -> ()
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_FS1_16assocTypesMethodUS1__U_S_9AssocReqt__fQPS1_FT1xQS3_9AssocType1yQS3_13AssocWithReqt_T_ : $@cc(witness_method) @thin (@in SomeAssoc, @in ConformingAssoc, @owned ConformingClassToClassProtocol) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_FS1_16assocTypesMethodUS1__U_S_9AssocReqt__fQPS1_FT1xQS3_9AssocType1yQS3_13AssocWithReqt_T_ : $@cc(witness_method) @thin (@in SomeAssoc, @in ConformingAssoc, @guaranteed ConformingClassToClassProtocol) -> ()
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_12staticMethodUS1__U_S_9AssocReqt__fMQPS1_FT1xS3__T_ : $@cc(witness_method) @thin (@owned ConformingClassToClassProtocol, @thick ConformingClassToClassProtocol.Type) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_12staticMethodUS1__U_S_9AssocReqt__fMQPS1_FT1xS3__T_ : $@cc(witness_method) @thin (@owned ConformingClassToClassProtocol, @thick ConformingClassToClassProtocol.Type) -> ()
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_oi3ltgUS1__U_S_9AssocReqt__fMQPS1{{.*}} : $@cc(witness_method) @thin (@owned ConformingClassToClassProtocol, @owned ConformingClassToClassProtocol, @thick ConformingClassToClassProtocol.Type) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables30ConformingClassToClassProtocolS_13ClassProtocolS_ZFS1_oi3ltgUS1__U_S_9AssocReqt__fMQPS1{{.*}} : $@cc(witness_method) @thin (@owned ConformingClassToClassProtocol, @owned ConformingClassToClassProtocol, @thick ConformingClassToClassProtocol.Type) -> ()
|
||||||
|
|
||||||
@@ -468,7 +468,7 @@ func <~>(x: ClassInheritedConformance, y: ClassInheritedConformance) {}
|
|||||||
// InheritedClassProtocol has a class bound, so its witnesses treat Self as
|
// InheritedClassProtocol has a class bound, so its witnesses treat Self as
|
||||||
// a reference value.
|
// a reference value.
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables25ClassInheritedConformanceS_11AnyProtocolS_FS1_6methodUS1__U_S_9AssocReqt__fQPS1_FT1xVS_3Arg1yS3__T_ : $@cc(witness_method) @thin (Arg, @in ClassInheritedConformance, @in_guaranteed ClassInheritedConformance) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables25ClassInheritedConformanceS_11AnyProtocolS_FS1_6methodUS1__U_S_9AssocReqt__fQPS1_FT1xVS_3Arg1yS3__T_ : $@cc(witness_method) @thin (Arg, @in ClassInheritedConformance, @in_guaranteed ClassInheritedConformance) -> ()
|
||||||
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables25ClassInheritedConformanceS_22InheritedClassProtocolS_FS1_15inheritedMethodUS1__U_S_9AssocReqt__fQPS1_FT_T_ : $@cc(witness_method) @thin (@owned ClassInheritedConformance) -> ()
|
// SYMBOL: sil hidden [transparent] [thunk] @_TTWC14witness_tables25ClassInheritedConformanceS_22InheritedClassProtocolS_FS1_15inheritedMethodUS1__U_S_9AssocReqt__fQPS1_FT_T_ : $@cc(witness_method) @thin (@guaranteed ClassInheritedConformance) -> ()
|
||||||
|
|
||||||
struct GenericAssocType<T> : AssocReqt {
|
struct GenericAssocType<T> : AssocReqt {
|
||||||
func requiredMethod() {}
|
func requiredMethod() {}
|
||||||
|
|||||||
@@ -167,9 +167,10 @@ final class ConformingClass : X {
|
|||||||
// CHECK-NEXT: strong_retain %3 : $ConformingClass
|
// CHECK-NEXT: strong_retain %3 : $ConformingClass
|
||||||
// CHECK-NEXT: %5 = load %1 : $*ConformingClass
|
// CHECK-NEXT: %5 = load %1 : $*ConformingClass
|
||||||
// CHECK: %6 = function_ref @_TFC9witnesses15ConformingClass9selfTypesfS0_FT1xS0__S0_
|
// CHECK: %6 = function_ref @_TFC9witnesses15ConformingClass9selfTypesfS0_FT1xS0__S0_
|
||||||
// CHECK-NEXT: %7 = apply %6(%5, %3) : $@cc(method) @thin (@owned ConformingClass, @owned ConformingClass) -> @owned ConformingClass
|
// CHECK-NEXT: %7 = apply %6(%5, %3) : $@cc(method) @thin (@owned ConformingClass, @guaranteed ConformingClass) -> @owned ConformingClass
|
||||||
// CHECK-NEXT: store %7 to %0 : $*ConformingClass
|
// CHECK-NEXT: store %7 to %0 : $*ConformingClass
|
||||||
// CHECK-NEXT: %9 = tuple ()
|
// CHECK-NEXT: %9 = tuple ()
|
||||||
|
// CHECK-NEXT: strong_release %3
|
||||||
// CHECK-NEXT: return %9 : $()
|
// CHECK-NEXT: return %9 : $()
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
func loadable(#x: Loadable) -> Loadable { return x }
|
func loadable(#x: Loadable) -> Loadable { return x }
|
||||||
@@ -180,11 +181,14 @@ final class ConformingClass : X {
|
|||||||
func <~>(x: ConformingClass, y: ConformingClass) -> ConformingClass { return x }
|
func <~>(x: ConformingClass, y: ConformingClass) -> ConformingClass { return x }
|
||||||
|
|
||||||
extension ConformingClass : ClassBounded { }
|
extension ConformingClass : ClassBounded { }
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC9witnesses15ConformingClassS_12ClassBoundedS_FS1_9selfTypesUS1___fQPS1_FT1xS2__S2_ : $@cc(witness_method) @thin (@owned ConformingClass, @owned ConformingClass) -> @owned ConformingClass {
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC9witnesses15ConformingClassS_12ClassBoundedS_FS1_9selfTypesUS1___fQPS1_FT1xS2__S2_ : $@cc(witness_method) @thin (@owned ConformingClass, @guaranteed ConformingClass) -> @owned ConformingClass {
|
||||||
// CHECK-NEXT: bb0(%0 : $ConformingClass, %1 : $ConformingClass):
|
// CHECK: bb0([[C0:%.*]] : $ConformingClass, [[C1:%.*]] : $ConformingClass):
|
||||||
// CHECK: %2 = function_ref @_TFC9witnesses15ConformingClass9selfTypesfS0_FT1xS0__S0_
|
// CHECK-NEXT: strong_retain [[C1]]
|
||||||
// CHECK-NEXT: %3 = apply %2(%0, %1) : $@cc(method) @thin (@owned ConformingClass, @owned ConformingClass) -> @owned ConformingClass
|
// CHECK-NEXT: function_ref
|
||||||
// CHECK-NEXT: return %3 : $ConformingClass
|
// CHECK-NEXT: [[FUN:%.*]] = function_ref @_TFC9witnesses15ConformingClass9selfTypesfS0_FT1xS0__S0_
|
||||||
|
// CHECK-NEXT: [[RESULT:%.*]] = apply [[FUN]]([[C0]], [[C1]]) : $@cc(method) @thin (@owned ConformingClass, @guaranteed ConformingClass) -> @owned ConformingClass
|
||||||
|
// CHECK-NEXT: strong_release [[C1]]
|
||||||
|
// CHECK-NEXT: return [[RESULT]] : $ConformingClass
|
||||||
// CHECK-NEXT: }
|
// CHECK-NEXT: }
|
||||||
|
|
||||||
struct ConformingAOStruct : X {
|
struct ConformingAOStruct : X {
|
||||||
|
|||||||
@@ -25,9 +25,12 @@ class Foo: Fooable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil hidden @_TF15witnesses_class3genUS_7Fooable__FQ_T_
|
// CHECK-LABEL: sil hidden @_TF15witnesses_class3genUS_7Fooable__FQ_T_
|
||||||
|
// CHECK: bb0([[SELF:%.*]] : $T)
|
||||||
// CHECK: [[METHOD:%.*]] = witness_method $T
|
// CHECK: [[METHOD:%.*]] = witness_method $T
|
||||||
// CHECK: strong_retain [[SELF:%.*]] : $
|
// CHECK-NOT: strong_retain [[SELF]]
|
||||||
// CHECK: apply [[METHOD]]<T>([[SELF]])
|
// CHECK: apply [[METHOD]]<T>([[SELF]])
|
||||||
|
// CHECK: strong_release [[SELF]]
|
||||||
|
// CHECK-NOT: strong_release [[SELF]]
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
func gen<T: Fooable>(foo: T) {
|
func gen<T: Fooable>(foo: T) {
|
||||||
foo.foo()
|
foo.foo()
|
||||||
@@ -37,8 +40,10 @@ func gen<T: Fooable>(foo: T) {
|
|||||||
// CHECK: bb0([[SELF:%[0-0]+]] : $Fooable):
|
// CHECK: bb0([[SELF:%[0-0]+]] : $Fooable):
|
||||||
// CHECK: [[SELF_PROJ:%.*]] = open_existential_ref [[SELF]]
|
// CHECK: [[SELF_PROJ:%.*]] = open_existential_ref [[SELF]]
|
||||||
// CHECK: [[METHOD:%.*]] = witness_method $[[OPENED:@opened(.*) Fooable]],
|
// CHECK: [[METHOD:%.*]] = witness_method $[[OPENED:@opened(.*) Fooable]],
|
||||||
// CHECK: strong_retain [[SELF_PROJ]] : $
|
// CHECK-NOT: strong_retain [[SELF_PROJ]] : $
|
||||||
// CHECK: apply [[METHOD]]<[[OPENED]]>([[SELF_PROJ]])
|
// CHECK: apply [[METHOD]]<[[OPENED]]>([[SELF_PROJ]])
|
||||||
|
// CHECK: strong_release [[SELF]]
|
||||||
|
// CHECK-NOT: strong_release [[SELF]]
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
func ex(foo: Fooable) {
|
func ex(foo: Fooable) {
|
||||||
foo.foo()
|
foo.foo()
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ class B : A, Barrable {}
|
|||||||
// CHECK-NOT: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_7FooableS_FS1_3fooUS1___fQPS1_FT_T_
|
// CHECK-NOT: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_7FooableS_FS1_3fooUS1___fQPS1_FT_T_
|
||||||
// CHECK-NOT: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_7FooableS_ZFS1_9class_fooUS1___fMQPS1_FT_T_
|
// CHECK-NOT: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_7FooableS_ZFS1_9class_fooUS1___fMQPS1_FT_T_
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_8BarrableS_FS1_3barUS1___fQPS1_FT_T_
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_8BarrableS_FS1_3barUS1___fQPS1_FT_T_
|
||||||
// CHECK: upcast {{%.*}} : $B to $A
|
// CHECK: upcast {{%.*}} : $*B to $*A
|
||||||
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_8BarrableS_ZFS1_9class_barUS1___fMQPS1_FT_T_
|
// CHECK-LABEL: sil hidden [transparent] [thunk] @_TTWC21witnesses_inheritance1BS_8BarrableS_ZFS1_9class_barUS1___fMQPS1_FT_T_
|
||||||
// CHECK: upcast {{%.*}} : $@thick B.Type to $@thick A.Type
|
// CHECK: upcast {{%.*}} : $@thick B.Type to $@thick A.Type
|
||||||
|
|
||||||
|
// Add tests to make sure that we handle address only case correctly.
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ public func test() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil shared @_TFFC38devirt_single_module_in_multiple_files9EvaluatorcFMS0_FT_S0_U_FT_Si
|
// CHECK-LABEL: sil shared @_TFFC38devirt_single_module_in_multiple_files9EvaluatorcFMS0_FT_S0_U_FT_Si
|
||||||
// CHECK: %{{.*}} = class_method %{{.*}} : $Problem1, #Problem1.run!1 : Problem1 -> () -> Int , $@cc(method) @thin (@owned Problem1) -> Int
|
// CHECK: %{{.*}} = class_method %{{.*}} : $Problem1, #Problem1.run!1 : Problem1 -> () -> Int , $@cc(method) @thin (@guaranteed Problem1) -> Int
|
||||||
// CHECK-NEXT: apply
|
// CHECK-NEXT: apply
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
|
|
||||||
// CHECK-LABEL: sil shared @_TFFC38devirt_single_module_in_multiple_files9EvaluatorcFMS0_FT_S0_U0_FT_Si
|
// CHECK-LABEL: sil shared @_TFFC38devirt_single_module_in_multiple_files9EvaluatorcFMS0_FT_S0_U0_FT_Si
|
||||||
// CHECK: %{{.*}} = class_method %{{.*}} : $Problem2, #Problem2.run!1 : Problem2 -> () -> Int , $@cc(method) @thin (@owned Problem2) -> Int
|
// CHECK: %{{.*}} = class_method %{{.*}} : $Problem2, #Problem2.run!1 : Problem2 -> () -> Int , $@cc(method) @thin (@guaranteed Problem2) -> Int
|
||||||
// CHECK-NEXT: apply
|
// CHECK-NEXT: apply
|
||||||
// CHECK: return
|
// CHECK: return
|
||||||
|
|||||||
@@ -52,7 +52,9 @@
|
|||||||
// CHECK-NEXT: class_method
|
// CHECK-NEXT: class_method
|
||||||
// CHECK-NEXT: strong_retain
|
// CHECK-NEXT: strong_retain
|
||||||
// CHECK-NEXT: apply
|
// CHECK-NEXT: apply
|
||||||
|
// CHECK-NEXT: strong_release
|
||||||
// CHECK-NEXT: class_method
|
// CHECK-NEXT: class_method
|
||||||
|
// CHECK-NEXT: strong_retain
|
||||||
// CHECK-NEXT: apply
|
// CHECK-NEXT: apply
|
||||||
// CHECK-NEXT: strong_release
|
// CHECK-NEXT: strong_release
|
||||||
// CHECK-NEXT: strong_release
|
// CHECK-NEXT: strong_release
|
||||||
@@ -60,6 +62,8 @@
|
|||||||
// CHECK-NEXT: strong_release
|
// CHECK-NEXT: strong_release
|
||||||
// CHECK-NEXT: strong_release
|
// CHECK-NEXT: strong_release
|
||||||
// CHECK-NEXT: strong_release
|
// CHECK-NEXT: strong_release
|
||||||
|
// CHECK-NEXT: strong_release
|
||||||
|
// CHECK-NEXT: strong_release
|
||||||
// CHECK-NEXT: tuple
|
// CHECK-NEXT: tuple
|
||||||
// CHECK-NEXT: return
|
// CHECK-NEXT: return
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ bb0(%c : $Builtin.Int32, %v : $Builtin.RawPointer):
|
|||||||
return %6 : $Builtin.Int32
|
return %6 : $Builtin.Int32
|
||||||
}
|
}
|
||||||
|
|
||||||
sil @REC_recursive : $@cc(method) @thin (Int, @owned REC) -> () {
|
sil @REC_recursive : $@cc(method) @thin (Int, @guaranteed REC) -> () {
|
||||||
bb0(%0 : $Int, %1 : $REC):
|
bb0(%0 : $Int, %1 : $REC):
|
||||||
debug_value %0 : $Int // let a // id: %2
|
debug_value %0 : $Int // let a // id: %2
|
||||||
debug_value %1 : $REC // let self // id: %3
|
debug_value %1 : $REC // let self // id: %3
|
||||||
@@ -48,7 +48,7 @@ bb0(%0 : $Int, %1 : $REC):
|
|||||||
|
|
||||||
bb1: // Preds: bb0
|
bb1: // Preds: bb0
|
||||||
strong_retain %1 : $REC // id: %13
|
strong_retain %1 : $REC // id: %13
|
||||||
%14 = class_method %1 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @owned REC) -> () // user: %21
|
%14 = class_method %1 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed REC) -> () // user: %21
|
||||||
// function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int
|
// function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int
|
||||||
%15 = function_ref @_TFSsoi1sFTSiSi_Si : $@thin (Int, Int) -> Int // user: %20
|
%15 = function_ref @_TFSsoi1sFTSiSi_Si : $@thin (Int, Int) -> Int // user: %20
|
||||||
// function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int
|
// function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int
|
||||||
@@ -57,9 +57,9 @@ bb1: // Preds: bb0
|
|||||||
%18 = integer_literal $Builtin.Int2048, 2 // user: %19
|
%18 = integer_literal $Builtin.Int2048, 2 // user: %19
|
||||||
%19 = apply %16(%18, %17) : $@thin (Builtin.Int2048, @thin Int.Type) -> Int // user: %20
|
%19 = apply %16(%18, %17) : $@thin (Builtin.Int2048, @thin Int.Type) -> Int // user: %20
|
||||||
%20 = apply %15(%0, %19) : $@thin (Int, Int) -> Int // user: %21
|
%20 = apply %15(%0, %19) : $@thin (Int, Int) -> Int // user: %21
|
||||||
%21 = apply %14(%20, %1) : $@cc(method) @thin (Int, @owned REC) -> ()
|
%21 = apply %14(%20, %1) : $@cc(method) @thin (Int, @guaranteed REC) -> ()
|
||||||
strong_retain %1 : $REC // id: %22
|
strong_retain %1 : $REC // id: %22
|
||||||
%23 = class_method %1 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @owned REC) -> () // user: %30
|
%23 = class_method %1 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed REC) -> () // user: %30
|
||||||
// function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int
|
// function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int
|
||||||
%24 = function_ref @_TFSsoi1sFTSiSi_Si : $@thin (Int, Int) -> Int // user: %29
|
%24 = function_ref @_TFSsoi1sFTSiSi_Si : $@thin (Int, Int) -> Int // user: %29
|
||||||
// function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int
|
// function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int
|
||||||
@@ -68,7 +68,7 @@ bb1: // Preds: bb0
|
|||||||
%27 = integer_literal $Builtin.Int2048, 1 // user: %28
|
%27 = integer_literal $Builtin.Int2048, 1 // user: %28
|
||||||
%28 = apply %25(%27, %26) : $@thin (Builtin.Int2048, @thin Int.Type) -> Int // user: %29
|
%28 = apply %25(%27, %26) : $@thin (Builtin.Int2048, @thin Int.Type) -> Int // user: %29
|
||||||
%29 = apply %24(%0, %28) : $@thin (Int, Int) -> Int // user: %30
|
%29 = apply %24(%0, %28) : $@thin (Int, Int) -> Int // user: %30
|
||||||
%30 = apply %23(%29, %1) : $@cc(method) @thin (Int, @owned REC) -> ()
|
%30 = apply %23(%29, %1) : $@cc(method) @thin (Int, @guaranteed REC) -> ()
|
||||||
br bb2 // id: %31
|
br bb2 // id: %31
|
||||||
|
|
||||||
bb2: // Preds: bb0 bb1
|
bb2: // Preds: bb0 bb1
|
||||||
@@ -138,8 +138,8 @@ bb0(%0 : $Int):
|
|||||||
%4 = apply %2(%3) : $@thin (@thick REC.Type) -> @owned REC // users: %5, %6, %7, %8, %9
|
%4 = apply %2(%3) : $@thin (@thick REC.Type) -> @owned REC // users: %5, %6, %7, %8, %9
|
||||||
debug_value %4 : $REC // let rec // id: %5
|
debug_value %4 : $REC // let rec // id: %5
|
||||||
strong_retain %4 : $REC // id: %6
|
strong_retain %4 : $REC // id: %6
|
||||||
%7 = class_method %4 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @owned REC) -> () // user: %8
|
%7 = class_method %4 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed REC) -> () // user: %8
|
||||||
%8 = apply %7(%0, %4) : $@cc(method) @thin (Int, @owned REC) -> ()
|
%8 = apply %7(%0, %4) : $@cc(method) @thin (Int, @guaranteed REC) -> ()
|
||||||
strong_release %4 : $REC // id: %9
|
strong_release %4 : $REC // id: %9
|
||||||
%10 = tuple () // user: %11
|
%10 = tuple () // user: %11
|
||||||
return %10 : $() // id: %11
|
return %10 : $() // id: %11
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ bb0(%c : $Builtin.Int32, %v : $Builtin.RawPointer):
|
|||||||
}
|
}
|
||||||
|
|
||||||
// single.REC.recursive (single.REC)(Swift.Int) -> ()
|
// single.REC.recursive (single.REC)(Swift.Int) -> ()
|
||||||
sil @_TFC6single3REC9recursivefS0_FSiT_ : $@cc(method) @thin (Int, @owned REC) -> () {
|
sil @_TFC6single3REC9recursivefS0_FSiT_ : $@cc(method) @thin (Int, @guaranteed REC) -> () {
|
||||||
bb0(%0 : $Int, %1 : $REC):
|
bb0(%0 : $Int, %1 : $REC):
|
||||||
debug_value %0 : $Int // let a // id: %2
|
debug_value %0 : $Int // let a // id: %2
|
||||||
debug_value %1 : $REC // let self // id: %3
|
debug_value %1 : $REC // let self // id: %3
|
||||||
@@ -50,7 +50,7 @@ bb0(%0 : $Int, %1 : $REC):
|
|||||||
|
|
||||||
bb1: // Preds: bb0
|
bb1: // Preds: bb0
|
||||||
strong_retain %1 : $REC // id: %13
|
strong_retain %1 : $REC // id: %13
|
||||||
%14 = class_method %1 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @owned REC) -> () // user: %21
|
%14 = class_method %1 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed REC) -> () // user: %21
|
||||||
// function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int
|
// function_ref Swift.- @infix (Swift.Int, Swift.Int) -> Swift.Int
|
||||||
%15 = function_ref @_TFSsoi1sFTSiSi_Si : $@thin (Int, Int) -> Int // user: %20
|
%15 = function_ref @_TFSsoi1sFTSiSi_Si : $@thin (Int, Int) -> Int // user: %20
|
||||||
// function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int
|
// function_ref Swift.Int._convertFromBuiltinIntegerLiteral (Swift.Int.Type)(Builtin.Int2048) -> Swift.Int
|
||||||
@@ -59,7 +59,7 @@ bb1: // Preds: bb0
|
|||||||
%18 = integer_literal $Builtin.Int2048, 2 // user: %19
|
%18 = integer_literal $Builtin.Int2048, 2 // user: %19
|
||||||
%19 = apply %16(%18, %17) : $@thin (Builtin.Int2048, @thin Int.Type) -> Int // user: %20
|
%19 = apply %16(%18, %17) : $@thin (Builtin.Int2048, @thin Int.Type) -> Int // user: %20
|
||||||
%20 = apply %15(%0, %19) : $@thin (Int, Int) -> Int // user: %21
|
%20 = apply %15(%0, %19) : $@thin (Int, Int) -> Int // user: %21
|
||||||
%21 = apply %14(%20, %1) : $@cc(method) @thin (Int, @owned REC) -> ()
|
%21 = apply %14(%20, %1) : $@cc(method) @thin (Int, @guaranteed REC) -> ()
|
||||||
br bb2 // id: %22
|
br bb2 // id: %22
|
||||||
|
|
||||||
bb2: // Preds: bb0 bb1
|
bb2: // Preds: bb0 bb1
|
||||||
@@ -129,8 +129,8 @@ bb0(%0 : $Int):
|
|||||||
%4 = apply %2(%3) : $@thin (@thick REC.Type) -> @owned REC // users: %5, %6, %7, %8, %9
|
%4 = apply %2(%3) : $@thin (@thick REC.Type) -> @owned REC // users: %5, %6, %7, %8, %9
|
||||||
debug_value %4 : $REC // let rec // id: %5
|
debug_value %4 : $REC // let rec // id: %5
|
||||||
strong_retain %4 : $REC // id: %6
|
strong_retain %4 : $REC // id: %6
|
||||||
%7 = class_method %4 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @owned REC) -> () // user: %8
|
%7 = class_method %4 : $REC, #REC.recursive!1 : REC -> (Int) -> () , $@cc(method) @thin (Int, @guaranteed REC) -> () // user: %8
|
||||||
%8 = apply %7(%0, %4) : $@cc(method) @thin (Int, @owned REC) -> ()
|
%8 = apply %7(%0, %4) : $@cc(method) @thin (Int, @guaranteed REC) -> ()
|
||||||
strong_release %4 : $REC // id: %9
|
strong_release %4 : $REC // id: %9
|
||||||
%10 = tuple () // user: %11
|
%10 = tuple () // user: %11
|
||||||
return %10 : $() // id: %11
|
return %10 : $() // id: %11
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ bb0:
|
|||||||
%O = unchecked_ref_cast %C : $C to $Builtin.UnknownObject
|
%O = unchecked_ref_cast %C : $C to $Builtin.UnknownObject
|
||||||
|
|
||||||
// CHECK: class_method {{.*}} : $C, #C.doIt!1
|
// CHECK: class_method {{.*}} : $C, #C.doIt!1
|
||||||
%2 = class_method %C : $C, #C.doIt!1 : C -> () -> (), $@cc(method) @thin (@owned C) -> ()
|
%2 = class_method %C : $C, #C.doIt!1 : C -> () -> (), $@cc(method) @thin (@guaranteed C) -> ()
|
||||||
|
|
||||||
// CHECK: alloc_ref $D
|
// CHECK: alloc_ref $D
|
||||||
%D = alloc_ref $D
|
%D = alloc_ref $D
|
||||||
@@ -415,8 +415,8 @@ class M {
|
|||||||
init()
|
init()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: @_TFC3ref1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, M) -> ()
|
// CHECK-LABEL: @_TFC3ref1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, @guaranteed M) -> ()
|
||||||
sil [fragile] @_TFC3ref1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, M) -> () {
|
sil [fragile] @_TFC3ref1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, @guaranteed M) -> () {
|
||||||
bb0(%0 : $Int, %1 : $M):
|
bb0(%0 : $Int, %1 : $M):
|
||||||
%2 = alloc_box $Int
|
%2 = alloc_box $Int
|
||||||
%3 = store %0 to %2#1 : $*Int
|
%3 = store %0 to %2#1 : $*Int
|
||||||
@@ -605,7 +605,7 @@ class Bas : NSObject {
|
|||||||
override init()
|
override init()
|
||||||
}
|
}
|
||||||
sil [fragile] @test_autorelease_return : $@cc(objc_method) @thin (Bas) -> NSString
|
sil [fragile] @test_autorelease_return : $@cc(objc_method) @thin (Bas) -> NSString
|
||||||
sil [fragile] @test_super_method : $@cc(method) @thin (Bas) -> Bas
|
sil [fragile] @test_super_method : $@cc(method) @thin (@guaranteed Bas) -> Bas
|
||||||
|
|
||||||
sil [fragile] @swift_StringToNSString : $@thin (@inout String) -> @owned NSString
|
sil [fragile] @swift_StringToNSString : $@thin (@inout String) -> @owned NSString
|
||||||
sil [fragile] @_TFSSCfMSSFT_SS : $@thin (@thin String.Type) -> String
|
sil [fragile] @_TFSSCfMSSFT_SS : $@thin (@thin String.Type) -> String
|
||||||
@@ -1095,9 +1095,9 @@ class Foo {
|
|||||||
init()
|
init()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil [fragile] @_TFC3tmp3Foog9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int, Int, @owned Foo) -> Int32
|
// CHECK-LABEL: sil [fragile] @_TFC3tmp3Foog9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int, Int, @guaranteed Foo) -> Int32
|
||||||
// CHECK_DECL-LABEL: sil [fragile] @_TFC3tmp3Foog9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int, Int, @owned Foo) -> Int32{{$}}
|
// CHECK_DECL-LABEL: sil [fragile] @_TFC3tmp3Foog9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int, Int, @guaranteed Foo) -> Int32{{$}}
|
||||||
sil [fragile] @_TFC3tmp3Foog9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int, Int, @owned Foo) -> Int32 {
|
sil [fragile] @_TFC3tmp3Foog9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int, Int, @guaranteed Foo) -> Int32 {
|
||||||
bb0(%0 : $Int, %1 : $Int, %2 : $Foo):
|
bb0(%0 : $Int, %1 : $Int, %2 : $Foo):
|
||||||
%3 = tuple ()
|
%3 = tuple ()
|
||||||
%4 = alloc_stack $Int // var x // users: %17, %6
|
%4 = alloc_stack $Int // var x // users: %17, %6
|
||||||
@@ -1116,9 +1116,9 @@ bb0(%0 : $Int, %1 : $Int, %2 : $Foo):
|
|||||||
return %13 : $Int32
|
return %13 : $Int32
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK-LABEL: sil [fragile] @_TFC3tmp3Foos9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int32, Int, Int, @owned Foo) -> ()
|
// CHECK-LABEL: sil [fragile] @_TFC3tmp3Foos9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int32, Int, Int, @guaranteed Foo) -> ()
|
||||||
// CHECK_DECL-LABEL: sil [fragile] @_TFC3tmp3Foos9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int32, Int, Int, @owned Foo) -> (){{$}}
|
// CHECK_DECL-LABEL: sil [fragile] @_TFC3tmp3Foos9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int32, Int, Int, @guaranteed Foo) -> (){{$}}
|
||||||
sil [fragile] @_TFC3tmp3Foos9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int32, Int, Int, @owned Foo) -> () {
|
sil [fragile] @_TFC3tmp3Foos9subscriptFT1xSi1ySi_Si : $@cc(method) @thin (Int32, Int, Int, @guaranteed Foo) -> () {
|
||||||
bb0(%0 : $Int32, %1 : $Int, %2 : $Int, %3 : $Foo):
|
bb0(%0 : $Int32, %1 : $Int, %2 : $Int, %3 : $Foo):
|
||||||
%4 = alloc_stack $Int32 // var value // users: %16, %5
|
%4 = alloc_stack $Int32 // var value // users: %16, %5
|
||||||
store %0 to %4#1 : $*Int32
|
store %0 to %4#1 : $*Int32
|
||||||
@@ -1158,7 +1158,7 @@ struct ConformingAssoc : AssocReqt {
|
|||||||
func requiredMethod()
|
func requiredMethod()
|
||||||
}
|
}
|
||||||
|
|
||||||
sil [fragile] @_TFV14witness_tables15ConformingAssoc14requiredMethodfS0_FT_T_ : $@cc(method) @thin (ConformingAssoc) -> () {
|
sil [fragile] @_TFV14witness_tables15ConformingAssoc14requiredMethodfS0_FT_T_ : $@cc(method) @thin (@guaranteed ConformingAssoc) -> () {
|
||||||
bb0(%0 : $ConformingAssoc):
|
bb0(%0 : $ConformingAssoc):
|
||||||
debug_value %0 : $ConformingAssoc
|
debug_value %0 : $ConformingAssoc
|
||||||
%2 = tuple ()
|
%2 = tuple ()
|
||||||
@@ -1168,8 +1168,8 @@ bb0(%0 : $ConformingAssoc):
|
|||||||
sil [fragile] @_TTWV14witness_tables15ConformingAssocS_9AssocReqtS_FS1_14requiredMethodU_fRQPS1_FT_T_ : $@cc(witness_method) @thin (@inout ConformingAssoc) -> () {
|
sil [fragile] @_TTWV14witness_tables15ConformingAssocS_9AssocReqtS_FS1_14requiredMethodU_fRQPS1_FT_T_ : $@cc(witness_method) @thin (@inout ConformingAssoc) -> () {
|
||||||
bb0(%0 : $*ConformingAssoc):
|
bb0(%0 : $*ConformingAssoc):
|
||||||
%1 = load %0 : $*ConformingAssoc
|
%1 = load %0 : $*ConformingAssoc
|
||||||
%2 = function_ref @_TFV14witness_tables15ConformingAssoc14requiredMethodfS0_FT_T_ : $@cc(method) @thin (ConformingAssoc) -> ()
|
%2 = function_ref @_TFV14witness_tables15ConformingAssoc14requiredMethodfS0_FT_T_ : $@cc(method) @thin (@guaranteed ConformingAssoc) -> ()
|
||||||
%3 = apply %2(%1) : $@cc(method) @thin (ConformingAssoc) -> ()
|
%3 = apply %2(%1) : $@cc(method) @thin (@guaranteed ConformingAssoc) -> ()
|
||||||
return %3 : $()
|
return %3 : $()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1239,7 +1239,7 @@ bb0:
|
|||||||
%43 = function_ref @_TF5tuple5floatFT1xSf_T_ : $@thin (Float32) -> ()
|
%43 = function_ref @_TF5tuple5floatFT1xSf_T_ : $@thin (Float32) -> ()
|
||||||
%45 = function_ref @_TF5tuple5tupleFT_TSiSf_ : $@thin () -> (Int, Float32)
|
%45 = function_ref @_TF5tuple5tupleFT_TSiSf_ : $@thin () -> (Int, Float32)
|
||||||
%47 = function_ref @_TF5tuple13tuple_elementFT1xTSiSf__T_ : $@thin (Int, Float32) -> ()
|
%47 = function_ref @_TF5tuple13tuple_elementFT1xTSiSf__T_ : $@thin (Int, Float32) -> ()
|
||||||
%49 = function_ref @_TFC3ref1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, M) -> ()
|
%49 = function_ref @_TFC3ref1C3foofS0_FT1xSi_T_ : $@cc(method) @thin (Int, @guaranteed M) -> ()
|
||||||
%51 = function_ref @_TF4null3isaFT1bCS_1B_Sb : $@thin (B) -> Builtin.Int1
|
%51 = function_ref @_TF4null3isaFT1bCS_1B_Sb : $@thin (B) -> Builtin.Int1
|
||||||
%53 = function_ref @_TFSd31_convertFromBuiltinFloatLiteralfMSdFT5valueBf64__Sd : $@thin (Builtin.FPIEEE64, @thin Float64.Type) -> Float64
|
%53 = function_ref @_TFSd31_convertFromBuiltinFloatLiteralfMSdFT5valueBf64__Sd : $@thin (Builtin.FPIEEE64, @thin Float64.Type) -> Float64
|
||||||
%55 = function_ref @_TFSS32_convertFromBuiltinStringLiteralfMSSFT5valueBp8byteSizeBi64_7isASCIIBi1__SS : $@thin (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> String
|
%55 = function_ref @_TFSS32_convertFromBuiltinStringLiteralfMSSFT5valueBp8byteSizeBi64_7isASCIIBi1__SS : $@thin (Builtin.RawPointer, Builtin.Word, Builtin.Int1, @thin String.Type) -> String
|
||||||
@@ -1254,7 +1254,7 @@ bb0:
|
|||||||
%75 = function_ref @test_cond_branch_basic_block_args : $@thin (Int, Builtin.Int1) -> Int
|
%75 = function_ref @test_cond_branch_basic_block_args : $@thin (Int, Builtin.Int1) -> Int
|
||||||
|
|
||||||
%77 = function_ref @test_autorelease_return : $@cc(objc_method) @thin (Bas) -> NSString
|
%77 = function_ref @test_autorelease_return : $@cc(objc_method) @thin (Bas) -> NSString
|
||||||
%79 = function_ref @test_super_method : $@cc(method) @thin (Bas) -> Bas
|
%79 = function_ref @test_super_method : $@cc(method) @thin (@guaranteed Bas) -> Bas
|
||||||
%81 = function_ref @test_builtin_func_ref : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
|
%81 = function_ref @test_builtin_func_ref : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
|
||||||
%83 = function_ref @test_dealloc_ref : $@thin () -> ()
|
%83 = function_ref @test_dealloc_ref : $@thin () -> ()
|
||||||
%85 = function_ref @test_dealloc_box : $@thin () -> ()
|
%85 = function_ref @test_dealloc_box : $@thin () -> ()
|
||||||
|
|||||||
@@ -10,4 +10,4 @@ import generic_extension_1
|
|||||||
|
|
||||||
["a", "b", "c"].wobble()
|
["a", "b", "c"].wobble()
|
||||||
|
|
||||||
// CHECK: sil @_TFE19generic_extension_1Sa6wobbleU__fGSaQ__FT_GSqQ__ : $@cc(method) @thin <τ_0_0> (@out Optional<τ_0_0>, @owned Array<τ_0_0>) -> ()
|
// CHECK: sil @_TFE19generic_extension_1Sa6wobbleU__fGSaQ__FT_GSqQ__ : $@cc(method) @thin <τ_0_0> (@out Optional<τ_0_0>, @guaranteed Array<τ_0_0>) -> ()
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
|
|
||||||
// EXTRACT-FOO-NOT: sil hidden @_TFV5basic1X4testfS0_FT_T_ : $@cc(method) @thin (X) -> () {
|
// EXTRACT-FOO-NOT: sil hidden @_TFV5basic1X4testfS0_FT_T_ : $@cc(method) @thin (X) -> () {
|
||||||
// EXTRACT-FOO-NOT: sil hidden @_TFC5basic7VehiclecfMS0_FT1nSi_S0_ : $@cc(method) @thin (Int, @owned Vehicle) -> @owned Vehicle {
|
// EXTRACT-FOO-NOT: sil hidden @_TFC5basic7VehiclecfMS0_FT1nSi_S0_ : $@cc(method) @thin (Int, @guaranteed Vehicle) -> @owned Vehicle {
|
||||||
// EXTRACT-FOO-NOT: sil hidden @_TFC5basic7Vehicle3nowfS0_FT_Si : $@cc(method) @thin (@owned Vehicle) -> Int {
|
// EXTRACT-FOO-NOT: sil hidden @_TFC5basic7Vehicle3nowfS0_FT_Si : $@cc(method) @thin (@guaranteed Vehicle) -> Int {
|
||||||
|
|
||||||
// EXTRACT-FOO-LABEL: sil hidden @_TF5basic3fooFT_Si : $@thin () -> Int {
|
// EXTRACT-FOO-LABEL: sil hidden @_TF5basic3fooFT_Si : $@thin () -> Int {
|
||||||
// EXTRACT-FOO: bb0:
|
// EXTRACT-FOO: bb0:
|
||||||
@@ -25,8 +25,8 @@
|
|||||||
|
|
||||||
|
|
||||||
// EXTRACT-TEST-NOT: sil hidden @_TF5basic3fooFT_Si : $@thin () -> Int {
|
// EXTRACT-TEST-NOT: sil hidden @_TF5basic3fooFT_Si : $@thin () -> Int {
|
||||||
// EXTRACT-TEST-NOT: sil hidden @_TFC5basic7VehiclecfMS0_FT1nSi_S0_ : $@cc(method) @thin (Int, @owned Vehicle) -> @owned Vehicle {
|
// EXTRACT-TEST-NOT: sil hidden @_TFC5basic7VehiclecfMS0_FT1nSi_S0_ : $@cc(method) @thin (Int, @guaranteed Vehicle) -> @owned Vehicle {
|
||||||
// EXTRACT-TEST-NOT: sil hidden @_TFC5basic7Vehicle3nowfS0_FT_Si : $@cc(method) @thin (@owned Vehicle) -> Int {
|
// EXTRACT-TEST-NOT: sil hidden @_TFC5basic7Vehicle3nowfS0_FT_Si : $@cc(method) @thin (@guaranteed Vehicle) -> Int {
|
||||||
|
|
||||||
// EXTRACT-TEST-LABEL: sil hidden @_TFV5basic1X4testfS0_FT_T_ : $@cc(method) @thin (X) -> () {
|
// EXTRACT-TEST-LABEL: sil hidden @_TFV5basic1X4testfS0_FT_T_ : $@cc(method) @thin (X) -> () {
|
||||||
// EXTRACT-TEST: bb0(%0 : $X):
|
// EXTRACT-TEST: bb0(%0 : $X):
|
||||||
@@ -53,16 +53,13 @@
|
|||||||
|
|
||||||
// EXTRACT-NOW-NOT: sil hidden @_TF5basic3fooFT_Si : $@thin () -> Int {
|
// EXTRACT-NOW-NOT: sil hidden @_TF5basic3fooFT_Si : $@thin () -> Int {
|
||||||
// EXTRACT-NOW-NOT: sil hidden @_TFV5basic1X4testfS0_FT_T_ : $@cc(method) @thin (X) -> () {
|
// EXTRACT-NOW-NOT: sil hidden @_TFV5basic1X4testfS0_FT_T_ : $@cc(method) @thin (X) -> () {
|
||||||
// EXTRACT-NOW-NOT: sil hidden @_TFC5basic7VehiclecfMS0_FT1nSi_S0_ : $@cc(method) @thin (Int, @owned Vehicle) -> @owned Vehicle {
|
// EXTRACT-NOW-NOT: sil hidden @_TFC5basic7VehiclecfMS0_FT1nSi_S0_ : $@cc(method) @thin (Int, @guaranteed Vehicle) -> @owned Vehicle {
|
||||||
|
|
||||||
// EXTRACT-NOW-LABEL: sil hidden @_TFC5basic7Vehicle3nowfS0_FT_Si : $@cc(method) @thin (@owned Vehicle) -> Int {
|
// EXTRACT-NOW-LABEL: sil hidden @_TFC5basic7Vehicle3nowfS0_FT_Si : $@cc(method) @thin (@guaranteed Vehicle) -> Int {
|
||||||
// EXTRACT-NOW: bb0
|
// EXTRACT-NOW: bb0
|
||||||
// EXTRACT-NOW-NEXT: debug_value
|
// EXTRACT-NOW-NEXT: debug_value
|
||||||
// EXTRACT-NOW-NEXT: strong_retain
|
|
||||||
// EXTRACT-NOW-NEXT: ref_element_addr
|
// EXTRACT-NOW-NEXT: ref_element_addr
|
||||||
// EXTRACT-NOW-NEXT: load
|
// EXTRACT-NOW-NEXT: load
|
||||||
// EXTRACT-NOW-NEXT: strong_release
|
|
||||||
// EXTRACT-NOW-NEXT: strong_release
|
|
||||||
// EXTRACT-NOW-NEXT: return
|
// EXTRACT-NOW-NEXT: return
|
||||||
|
|
||||||
struct X {
|
struct X {
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ for id in $(seq 0 $process_id_max); do
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=$process_count -ast-verifier-process-id=$id > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=$process_count -ast-verifier-process-id=$id > /dev/null
|
||||||
__EOF__
|
__EOF__
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=0 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=0 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=1 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=1 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=10 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=10 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=11 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=11 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=12 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=12 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=13 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=13 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=14 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=14 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=15 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=15 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=16 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=16 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=2 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=2 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=3 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=3 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=4 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=4 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=5 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=5 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=6 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=6 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=7 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=7 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=8 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=8 > /dev/null
|
||||||
|
|||||||
@@ -4,5 +4,5 @@
|
|||||||
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
// Make sure that we can parse the stdlib.sil deserialized from Swift.swiftmodule.
|
||||||
|
|
||||||
// RUN: rm -f %t.*
|
// RUN: rm -f %t.*
|
||||||
// RUN: %target-sil-opt -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
// RUN: %target-sil-opt -enable-guaranteed-self -sil-disable-ast-dump -verify %platform-module-dir/Swift.swiftmodule -module-name=Swift -o %t.sil
|
||||||
// RUN: %target-sil-opt %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=9 > /dev/null
|
// RUN: %target-sil-opt -enable-guaranteed-self %t.sil -ast-verifier-process-count=17 -ast-verifier-process-id=9 > /dev/null
|
||||||
|
|||||||
Reference in New Issue
Block a user