Skip to content

Commit 30a58fa

Browse files
authored
Merge pull request #78643 from atrick/fix-lifedep-feature
Fix LifetimeDependence feature guard for variable accessors.
2 parents caa215b + 0e33dfc commit 30a58fa

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

lib/AST/FeatureSet.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,15 @@ static bool usesFeatureLifetimeDependence(Decl *decl) {
254254
if (decl->getAttrs().hasAttribute<LifetimeAttr>()) {
255255
return true;
256256
}
257-
auto *afd = dyn_cast<AbstractFunctionDecl>(decl);
258-
if (!afd) {
259-
return false;
260-
}
261-
return afd->getInterfaceType()
257+
if (auto *afd = dyn_cast<AbstractFunctionDecl>(decl)) {
258+
return afd->getInterfaceType()
262259
->getAs<AnyFunctionType>()
263260
->hasLifetimeDependencies();
261+
}
262+
if (auto *varDecl = dyn_cast<VarDecl>(decl)) {
263+
return !varDecl->getTypeInContext()->isEscapable();
264+
}
265+
return false;
264266
}
265267

266268
UNINTERESTING_FEATURE(DynamicActorIsolation)

test/ModuleInterface/Inputs/lifetime_dependence.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,24 @@ public func deriveThisOrThat(_ this: consuming BufferView, _ that: consuming Buf
5454
return BufferView(that._ptr, that._count)
5555
}
5656

57+
@_unsafeNonescapableResult
58+
@_transparent
59+
@lifetime(borrow source)
60+
internal func _overrideLifetime<T: ~Copyable & ~Escapable, U: ~Copyable & ~Escapable>(
61+
_ dependent: consuming T, borrowing source: borrowing U) -> T {
62+
dependent
63+
}
64+
65+
public struct Container {
66+
var buffer: UnsafeRawBufferPointer
67+
var object: AnyObject
68+
}
69+
70+
extension Container {
71+
public var storage: BufferView {
72+
get {
73+
let view = BufferView(buffer, 1)
74+
return _overrideLifetime(view, borrowing: self)
75+
}
76+
}
77+
}

test/ModuleInterface/lifetime_dependence_test.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,9 @@ import lifetime_dependence
3535

3636
// CHECK: @lifetime(this, that)
3737
// CHECK-NEXT: @inlinable public func deriveThisOrThat(_ this: consuming lifetime_dependence.BufferView, _ that: consuming lifetime_dependence.BufferView) -> lifetime_dependence.BufferView {
38+
39+
// Check that an implicitly dependent variable accessor is guarded by LifetimeDependence.
40+
//
41+
// CHECK: extension lifetime_dependence.Container {
42+
// CHECK-NEXT: #if compiler(>=5.3) && $NonescapableTypes && $LifetimeDependence
43+
// CHECK-NEXT: public var storage: lifetime_dependence.BufferView {

0 commit comments

Comments
 (0)