Skip to content

Commit 1fdb7fb

Browse files
authored
Merge pull request #70042 from kubamracek/unavailable-accessors
[embedded] Consider 'skipped' decls when SILGen-ing accessors, fix compiler crash on unavailable accessors
2 parents 26b91ef + 434a0b9 commit 1fdb7fb

File tree

7 files changed

+49
-6
lines changed

7 files changed

+49
-6
lines changed

lib/SILGen/SILGen.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1802,7 +1802,7 @@ void SILGenModule::visitVarDecl(VarDecl *vd) {
18021802
if (vd->hasStorage())
18031803
addGlobalVariable(vd);
18041804

1805-
vd->visitEmittedAccessors([&](AccessorDecl *accessor) {
1805+
visitEmittedAccessors(vd, [&](AccessorDecl *accessor) {
18061806
emitFunction(accessor);
18071807
});
18081808

@@ -1825,6 +1825,16 @@ void SILGenModule::visitMacroExpansionDecl(MacroExpansionDecl *d) {
18251825
// Expansion already visited as auxiliary decls.
18261826
}
18271827

1828+
void SILGenModule::visitEmittedAccessors(
1829+
AbstractStorageDecl *D, llvm::function_ref<void(AccessorDecl *)> callback) {
1830+
D->visitEmittedAccessors([&](AccessorDecl *accessor) {
1831+
if (shouldSkipDecl(accessor))
1832+
return;
1833+
1834+
callback(accessor);
1835+
});
1836+
}
1837+
18281838
bool
18291839
SILGenModule::canStorageUseStoredKeyPathComponent(AbstractStorageDecl *decl,
18301840
ResilienceExpansion expansion) {

lib/SILGen/SILGen.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,11 @@ class LLVM_LIBRARY_VISIBILITY SILGenModule : public ASTVisitor<SILGenModule> {
301301
void visitMacroDecl(MacroDecl *d);
302302
void visitMacroExpansionDecl(MacroExpansionDecl *d);
303303

304+
// Same as AbstractStorageDecl::visitEmittedAccessors, but skips over skipped
305+
// (unavailable) decls.
306+
void visitEmittedAccessors(AbstractStorageDecl *D,
307+
llvm::function_ref<void(AccessorDecl *)>);
308+
304309
void emitEntryPoint(SourceFile *SF);
305310
void emitEntryPoint(SourceFile *SF, SILFunction *TopLevel);
306311

lib/SILGen/SILGenDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1628,7 +1628,7 @@ void SILGenFunction::visitVarDecl(VarDecl *D) {
16281628
});
16291629

16301630
// Emit the variable's accessors.
1631-
D->visitEmittedAccessors([&](AccessorDecl *accessor) {
1631+
SGM.visitEmittedAccessors(D, [&](AccessorDecl *accessor) {
16321632
SGM.emitFunction(accessor);
16331633
});
16341634
}

lib/SILGen/SILGenTopLevel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ void SILGenTopLevel::visitAbstractFunctionDecl(AbstractFunctionDecl *AFD) {
257257
}
258258

259259
void SILGenTopLevel::visitAbstractStorageDecl(AbstractStorageDecl *ASD) {
260-
ASD->visitEmittedAccessors(
260+
SGF.SGM.visitEmittedAccessors(ASD,
261261
[this](AccessorDecl *Accessor) { visitAbstractFunctionDecl(Accessor); });
262262
}
263263

@@ -338,7 +338,7 @@ void SILGenTopLevel::TypeVisitor::visitAbstractFunctionDecl(
338338

339339
void SILGenTopLevel::TypeVisitor::visitAbstractStorageDecl(
340340
AbstractStorageDecl *ASD) {
341-
ASD->visitEmittedAccessors(
341+
SGF.SGM.visitEmittedAccessors(ASD,
342342
[this](AccessorDecl *Accessor) { visitAbstractFunctionDecl(Accessor); });
343343
}
344344

lib/SILGen/SILGenType.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,7 @@ class SILGenType : public TypeMemberVisitor<SILGenType> {
12421242
}
12431243

12441244
void visitAccessors(AbstractStorageDecl *asd) {
1245-
asd->visitEmittedAccessors([&](AccessorDecl *accessor) {
1245+
SGM.visitEmittedAccessors(asd, [&](AccessorDecl *accessor) {
12461246
visitFuncDecl(accessor);
12471247
});
12481248
}
@@ -1422,7 +1422,7 @@ class SILGenExtension : public TypeMemberVisitor<SILGenExtension> {
14221422
}
14231423

14241424
void visitAccessors(AbstractStorageDecl *asd) {
1425-
asd->visitEmittedAccessors([&](AccessorDecl *accessor) {
1425+
SGM.visitEmittedAccessors(asd, [&](AccessorDecl *accessor) {
14261426
visitFuncDecl(accessor);
14271427
});
14281428
}

test/IRGen/unavailable_decl_optimization_complete_struct.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ public struct AvailableStruct<T> {
2121
_modify { fatalError() }
2222
}
2323

24+
// CHECK-NO-STRIP: s4Test15AvailableStructV45availablePropertyWithSomeUnavailableAccessorsxvg
25+
// CHECK-NO-STRIP: s4Test15AvailableStructV45availablePropertyWithSomeUnavailableAccessorsxvs
26+
// CHECK-STRIP-NOT: s4Test15AvailableStructV45availablePropertyWithSomeUnavailableAccessorsxvs
27+
public var availablePropertyWithSomeUnavailableAccessors: T {
28+
get { fatalError() }
29+
@available(*, unavailable)
30+
set { fatalError() }
31+
}
32+
2433
// CHECK-NO-STRIP: s4Test15AvailableStructVyACyxGxcfC
2534
// CHECK-STRIP-NOT: s4Test15AvailableStructVyACyxGxcfC
2635
@available(*, unavailable)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %target-swift-frontend -emit-ir %s -enable-experimental-feature Embedded | %FileCheck %s
2+
3+
// REQUIRES: swift_in_compiler
4+
// REQUIRES: VENDOR=apple
5+
// REQUIRES: OS=macosx
6+
7+
struct Foo {
8+
public subscript(x: Int) -> Int {
9+
get {
10+
return 0
11+
}
12+
13+
@available(*, unavailable)
14+
set { }
15+
}
16+
}
17+
18+
// CHECK: $s4main3FooVyS2icig
19+
// CHECK-NOT: $s4main3FooVyS2icis

0 commit comments

Comments
 (0)