Skip to content

Commit ae21b8b

Browse files
committed
Sema: Resilient classes cannot have @inlinable deinits
1 parent 1116525 commit ae21b8b

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4099,6 +4099,9 @@ ERROR(inlinable_decl_not_public,
40994099
"but %0 is %select{private|fileprivate|internal|%error|%error}1",
41004100
(DeclBaseName, AccessLevel))
41014101

4102+
ERROR(inlinable_resilient_deinit,
4103+
none, "deinitializer can only be '@inlinable' if the class is '@_fixed_layout'", ())
4104+
41024105
//------------------------------------------------------------------------------
41034106
// MARK: @_specialize diagnostics
41044107
//------------------------------------------------------------------------------

lib/Sema/TypeCheckAttr.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,6 +1992,16 @@ void AttributeChecker::visitInlinableAttr(InlinableAttr *attr) {
19921992
access);
19931993
return;
19941994
}
1995+
1996+
// @inlinable cannot be applied to deinitializers in resilient classes.
1997+
if (auto *DD = dyn_cast<DestructorDecl>(D)) {
1998+
if (auto *CD = dyn_cast<ClassDecl>(DD->getDeclContext())) {
1999+
if (CD->isResilient()) {
2000+
diagnoseAndRemoveAttr(attr, diag::inlinable_resilient_deinit);
2001+
return;
2002+
}
2003+
}
2004+
}
19952005
}
19962006

19972007
void AttributeChecker::visitOptimizeAttr(OptimizeAttr *attr) {

test/ParseableInterface/ObjC.swiftinterface

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ public class SomeClassInlinable {
2929
@inlinable get { return 0 }
3030
@inlinable set {}
3131
}
32-
@objc @inlinable deinit {
33-
print("bye")
34-
}
32+
@objc deinit
3533
}
34+
3635
public class SomeNSObject : NSObject {
3736
@objc init?(_: Any)
3837
@objc func foo()
@@ -53,7 +52,5 @@ public class SomeNSObjectInlinable : NSObject {
5352
@inlinable get { return 0 }
5453
@inlinable set {}
5554
}
56-
@objc @inlinable deinit {
57-
print("bye")
58-
}
55+
@objc deinit
5956
}

test/attr/attr_inlinable_deinit.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %target-typecheck-verify-swift -enable-resilience
2+
3+
public class ResilientClass {
4+
@inlinable deinit {} // expected-error {{deinitializer can only be '@inlinable' if the class is '@_fixed_layout'}}
5+
}
6+
7+
@_fixed_layout public class FixedLayoutClass {
8+
@inlinable deinit {}
9+
}

0 commit comments

Comments
 (0)