diff --git a/SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceDiagnostics.swift b/SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceDiagnostics.swift index fb534ba536fa9..69694a06100c2 100644 --- a/SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceDiagnostics.swift +++ b/SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceDiagnostics.swift @@ -110,6 +110,20 @@ private func analyze(dependence: LifetimeDependence, _ context: FunctionPassCont } } + // Check for immortal dependence. + switch dependence.scope { + case .global: + log("Immortal global dependence.") + return true + case let .unknown(value): + if value.type.isVoid { + log("Immortal void dependence.") + return true + } + default: + break + } + // Compute this dependence scope. var range = dependence.computeRange(context) defer { range?.deinitialize() } @@ -200,6 +214,9 @@ private struct DiagnoseDependence { return .continueWalk } // Check for immortal lifetime. + // + // FIXME: remove this immortal check. It should be redundant with the earlier check that bypasses dependence + // diagnostics. switch dependence.scope { case .global: return .continueWalk diff --git a/test/SILOptimizer/lifetime_dependence/verify_diagnostics.swift b/test/SILOptimizer/lifetime_dependence/verify_diagnostics.swift index 917aecb9e1330..00bfef446bff0 100644 --- a/test/SILOptimizer/lifetime_dependence/verify_diagnostics.swift +++ b/test/SILOptimizer/lifetime_dependence/verify_diagnostics.swift @@ -305,6 +305,16 @@ func testSpanMayThrow(buffer: inout [Int]) { try! mutableSpanMayThrow(bufferSpan) } +// ============================================================================= +// inout +// ============================================================================= + +@available(Span 0.1, *) +func inoutToImmortal(_ s: inout RawSpan) { + let tmp = RawSpan(_unsafeBytes: UnsafeRawBufferPointer(start: nil, count: 0)) + s = _overrideLifetime(tmp, borrowing: ()) +} + // ============================================================================= // Dependence on non-Copyable values // =============================================================================