Skip to content

Commit f538940

Browse files
committed
SILGen: Stub unavailable constructors and destructors.
Part of rdar://107388493
1 parent 375f4d2 commit f538940

File tree

4 files changed

+152
-0
lines changed

4 files changed

+152
-0
lines changed

lib/SILGen/SILGenConstructor.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,9 @@ static void emitImplicitValueConstructor(SILGenFunction &SGF,
306306
RegularLocation Loc(ctor);
307307
Loc.markAutoGenerated();
308308

309+
if (shouldLowerToUnavailableCodeStub(ctor))
310+
SGF.emitApplyOfUnavailableCodeReached();
311+
309312
AssertingManualScope functionLevelScope(SGF.Cleanups,
310313
CleanupLocation(Loc));
311314

@@ -532,6 +535,9 @@ void SILGenFunction::emitValueConstructor(ConstructorDecl *ctor) {
532535
bool isDelegating = ctor->getDelegatingOrChainedInitKind().initKind ==
533536
BodyInitKind::Delegating;
534537

538+
if (shouldLowerToUnavailableCodeStub(ctor))
539+
emitApplyOfUnavailableCodeReached();
540+
535541
// Get the 'self' decl and type.
536542
VarDecl *selfDecl = ctor->getImplicitSelfDecl();
537543
auto &lowering = getTypeLowering(selfDecl->getType());
@@ -820,6 +826,9 @@ void SILGenFunction::emitClassConstructorAllocator(ConstructorDecl *ctor) {
820826
SmallVector<SILValue, 8> args;
821827
bindParametersForForwarding(ctor->getParameters(), args);
822828

829+
if (shouldLowerToUnavailableCodeStub(ctor))
830+
emitApplyOfUnavailableCodeReached();
831+
823832
SILValue selfMetaValue = emitConstructorMetatypeArg(*this, ctor);
824833

825834
// Allocate the "self" value.
@@ -936,6 +945,9 @@ void SILGenFunction::emitClassConstructorInitializer(ConstructorDecl *ctor) {
936945

937946
assert(ctor->getTypecheckedBody() && "Class constructor without a body?");
938947

948+
if (shouldLowerToUnavailableCodeStub(ctor))
949+
emitApplyOfUnavailableCodeReached();
950+
939951
// True if this constructor delegates to a peer constructor with self.init().
940952
bool isDelegating = false;
941953
if (!ctor->hasStubImplementation()) {

lib/SILGen/SILGenDestructor.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ void SILGenFunction::emitDestroyingDestructor(DestructorDecl *dd) {
3535
if (dd->isImplicit())
3636
Loc.markAutoGenerated();
3737

38+
if (shouldLowerToUnavailableCodeStub(dd))
39+
emitApplyOfUnavailableCodeReached();
40+
3841
auto cd = cast<ClassDecl>(dd->getDeclContext()->getSelfNominalTypeDecl());
3942
auto &C = cd->getASTContext();
4043
SILValue selfValue = emitSelfDeclForDestructor(dd->getImplicitSelfDecl());
@@ -178,6 +181,9 @@ void SILGenFunction::emitDeallocatingClassDestructor(DestructorDecl *dd) {
178181
RegularLocation loc(dd);
179182
loc.markAutoGenerated();
180183

184+
if (shouldLowerToUnavailableCodeStub(dd))
185+
emitApplyOfUnavailableCodeReached();
186+
181187
// Emit the prolog.
182188
SILValue initialSelfValue =
183189
emitSelfDeclForDestructor(dd->getImplicitSelfDecl());
@@ -233,6 +239,9 @@ void SILGenFunction::emitDeallocatingMoveOnlyDestructor(DestructorDecl *dd) {
233239
if (dd->isImplicit())
234240
loc.markAutoGenerated();
235241

242+
if (shouldLowerToUnavailableCodeStub(dd))
243+
emitApplyOfUnavailableCodeReached();
244+
236245
// Emit the prolog.
237246
auto selfValue = emitSelfDeclForDestructor(dd->getImplicitSelfDecl());
238247

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// RUN: %target-swift-emit-silgen -module-name Test -parse-as-library %s -verify -unavailable-decl-optimization=stub | %FileCheck %s --check-prefixes=CHECK
2+
3+
public struct S {}
4+
func foo() {}
5+
6+
@available(*, unavailable)
7+
public class ExplicitInitClass {
8+
// ExplicitInitClass.s.getter
9+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassC1sAA1SVvg
10+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
11+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
12+
// CHECK: load
13+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassC1sAA1SVvg'
14+
//
15+
// ExplicitInitClass.s.setter
16+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassC1sAA1SVvs
17+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
18+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
19+
// CHECK: assign
20+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassC1sAA1SVvs'
21+
//
22+
// ExplicitInitClass.s.modify
23+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassC1sAA1SVvM
24+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
25+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
26+
// CHECK: yield
27+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassC1sAA1SVvM'
28+
public var s: S
29+
30+
// ExplicitInitClass.__allocating_init()
31+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassCACycfC
32+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
33+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
34+
// CHECK: alloc_ref $ExplicitInitClass
35+
// CHECK: function_ref @$s4Test17ExplicitInitClassCACycfc
36+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassCACycfC'
37+
//
38+
// ExplicitInitClass.init()
39+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassCACycfc
40+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
41+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
42+
// CHECK: function_ref @$s4Test1SVACycfC
43+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassCACycfc'
44+
public init() {
45+
s = S()
46+
}
47+
48+
// ExplicitInitClass.deinit
49+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassCfd
50+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
51+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
52+
// CHECK: {{%.*}} = function_ref @$s4Test3fooyyF
53+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassCfd'
54+
//
55+
// ExplicitInitClass.__deallocating_deinit
56+
// CHECK-LABEL: sil {{.*}} @$s4Test17ExplicitInitClassCfD
57+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
58+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
59+
// CHECK: {{%.*}} = function_ref @$s4Test17ExplicitInitClassCfd
60+
// CHECK: } // end sil function '$s4Test17ExplicitInitClassCfD'
61+
deinit {
62+
foo()
63+
}
64+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// RUN: %target-swift-emit-silgen -module-name Test -parse-as-library %s -verify -unavailable-decl-optimization=stub | %FileCheck %s --check-prefixes=CHECK
2+
3+
public struct S {}
4+
5+
@available(*, unavailable)
6+
public struct ImplicitInitStruct {
7+
// CHECK-LABEL: sil hidden {{.*}} @$s4Test18ImplicitInitStructVACycfC
8+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
9+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
10+
// CHECK: return
11+
// CHECK: } // end sil function '$s4Test18ImplicitInitStructVACycfC'
12+
}
13+
14+
@available(*, unavailable)
15+
public func testImplicitConstructor() {
16+
// Force s4Test18ImplicitInitStructVACycfC to be emitted.
17+
_ = ImplicitInitStruct()
18+
}
19+
20+
@available(*, unavailable)
21+
public struct ExplicitInitStruct {
22+
// ExplicitInitStruct.s.getter
23+
// CHECK-LABEL: sil {{.*}} @$s4Test18ExplicitInitStructV1sAA1SVvg
24+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
25+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
26+
// CHECK: struct_extract
27+
// CHECK: } // end sil function '$s4Test18ExplicitInitStructV1sAA1SVvg'
28+
//
29+
// ExplicitInitStruct.s.setter
30+
// CHECK-LABEL: sil {{.*}} @$s4Test18ExplicitInitStructV1sAA1SVvs
31+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
32+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
33+
// CHECK: assign
34+
// CHECK: } // end sil function '$s4Test18ExplicitInitStructV1sAA1SVvs'
35+
//
36+
// ExplicitInitStruct.s.modify
37+
// CHECK-LABEL: sil {{.*}} @$s4Test18ExplicitInitStructV1sAA1SVvM
38+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
39+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
40+
// CHECK: yield
41+
// CHECK: } // end sil function '$s4Test18ExplicitInitStructV1sAA1SVvM'
42+
public var s: S
43+
44+
// CHECK-LABEL: sil {{.*}} @$s4Test18ExplicitInitStructVACycfC
45+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
46+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
47+
// CHECK: function_ref @$s4Test1SVACycfC
48+
// CHECK: } // end sil function '$s4Test18ExplicitInitStructVACycfC'
49+
public init() {
50+
s = S()
51+
}
52+
}
53+
54+
func foo() {}
55+
56+
@available(*, unavailable)
57+
@_moveOnly
58+
struct MoveOnlyStruct {
59+
// CHECK-LABEL: sil {{.*}} @$s4Test14MoveOnlyStructVfD
60+
// CHECK: [[FNREF:%.*]] = function_ref @$ss31_diagnoseUnavailableCodeReacheds5NeverOyF
61+
// CHECK-NEXT: [[APPLY:%.*]] = apply [[FNREF]]()
62+
// CHECK: {{%.*}} = function_ref @$s4Test3fooyyF
63+
// CHECK: } // end sil function '$s4Test14MoveOnlyStructVfD'
64+
deinit {
65+
foo()
66+
}
67+
}

0 commit comments

Comments
 (0)