Skip to content

Commit 6d0a6d2

Browse files
committed
Fix a lifetime dependence diagnostic
`LifetimeDescriptor::getName()` can crash if the descriptor had a `self`. Replace with `LifetimeDescriptor::getString()`
1 parent de6870e commit 6d0a6d2

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8329,7 +8329,7 @@ ERROR(lifetime_dependence_cannot_use_parsed_borrow_inout, none,
83298329
ERROR(lifetime_dependence_duplicate_target, none,
83308330
"invalid duplicate target lifetime dependencies on function", ())
83318331
ERROR(lifetime_parameter_requires_inout, none,
8332-
"lifetime-dependent parameter must be 'inout'", (Identifier))
8332+
"lifetime-dependent parameter '%0' must be 'inout'", (StringRef))
83338333

83348334
//------------------------------------------------------------------------------
83358335
// MARK: Lifetime Dependence Requirements

lib/AST/LifetimeDependence.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ class LifetimeDependenceChecker {
880880
if (!targetDeclAndIndex->first->isInOut()) {
881881
diagnose(targetDeclAndIndex->first,
882882
diag::lifetime_parameter_requires_inout,
883-
targetDescriptor->getName());
883+
targetDescriptor->getString());
884884
}
885885
targetIndex = targetDeclAndIndex->second;
886886
} else {

test/Sema/lifetime_attr.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ do {
9191

9292
// rdar://146401190 ([nonescapable] implement non-inout parameter dependencies)
9393
@_lifetime(span: borrow holder)
94-
func testParameterDep(holder: AnyObject, span: Span<Int>) {} // expected-error{{lifetime-dependent parameter must be 'inout'}}
94+
func testParameterDep(holder: AnyObject, span: Span<Int>) {} // expected-error{{lifetime-dependent parameter 'span' must be 'inout'}}
9595

9696
@_lifetime(&ne)
9797
func inoutLifetimeDependence(_ ne: inout NE) -> NE {
@@ -113,3 +113,16 @@ func dependOnEscapable(_ k: consuming Klass) -> NE {
113113
NE()
114114
}
115115

116+
struct Wrapper : ~Escapable {
117+
var _ne: NE
118+
119+
var ne: NE {
120+
@_lifetime(copy self)
121+
get {
122+
_ne
123+
}
124+
@_lifetime(self: &self)
125+
nonmutating _modify {// expected-error{{lifetime-dependent parameter 'self' must be 'inout'}}
126+
}
127+
}
128+
}

0 commit comments

Comments
 (0)