Skip to content

Commit 5ae428d

Browse files
authored
Merge pull request #82831 from atrick/reassign-immortal
Fix LifetimeDependenceDiagnostics: allow inout assignment to Void.
2 parents e55eb6c + 14e0fe8 commit 5ae428d

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceDiagnostics.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ private func analyze(dependence: LifetimeDependence, _ context: FunctionPassCont
110110
}
111111
}
112112

113+
// Check for immortal dependence.
114+
switch dependence.scope {
115+
case .global:
116+
log("Immortal global dependence.")
117+
return true
118+
case let .unknown(value):
119+
if value.type.isVoid {
120+
log("Immortal void dependence.")
121+
return true
122+
}
123+
default:
124+
break
125+
}
126+
113127
// Compute this dependence scope.
114128
var range = dependence.computeRange(context)
115129
defer { range?.deinitialize() }
@@ -200,6 +214,9 @@ private struct DiagnoseDependence {
200214
return .continueWalk
201215
}
202216
// Check for immortal lifetime.
217+
//
218+
// FIXME: remove this immortal check. It should be redundant with the earlier check that bypasses dependence
219+
// diagnostics.
203220
switch dependence.scope {
204221
case .global:
205222
return .continueWalk

test/SILOptimizer/lifetime_dependence/verify_diagnostics.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,16 @@ func testSpanMayThrow(buffer: inout [Int]) {
305305
try! mutableSpanMayThrow(bufferSpan)
306306
}
307307

308+
// =============================================================================
309+
// inout
310+
// =============================================================================
311+
312+
@available(Span 0.1, *)
313+
func inoutToImmortal(_ s: inout RawSpan) {
314+
let tmp = RawSpan(_unsafeBytes: UnsafeRawBufferPointer(start: nil, count: 0))
315+
s = _overrideLifetime(tmp, borrowing: ())
316+
}
317+
308318
// =============================================================================
309319
// Dependence on non-Copyable values
310320
// =============================================================================

0 commit comments

Comments
 (0)