From a7005c25264e77c781ed345e6d14594e9e8fcde6 Mon Sep 17 00:00:00 2001 From: Jai Date: Sun, 2 Nov 2025 09:53:00 +0530 Subject: [PATCH 1/2] fix(InlineArray): avoid crash when creating span for empty arrays --- stdlib/public/core/InlineArray.swift | 8 +++++++ test/stdlib/Span/InlineSpanProperties.swift | 25 +++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/stdlib/public/core/InlineArray.swift b/stdlib/public/core/InlineArray.swift index af4b93e337590..4224eed6a1356 100644 --- a/stdlib/public/core/InlineArray.swift +++ b/stdlib/public/core/InlineArray.swift @@ -587,6 +587,10 @@ extension InlineArray where Element: ~Copyable { @lifetime(borrow self) @_transparent borrowing get { + guard count > 0 else { + let span = Span() + return unsafe _overrideLifetime(span, borrowing: self) + } let span = unsafe Span(_unsafeStart: _protectedAddress, count: count) return unsafe _overrideLifetime(span, borrowing: self) } @@ -598,6 +602,10 @@ extension InlineArray where Element: ~Copyable { @lifetime(&self) @_transparent mutating get { + guard count > 0 else { + let span = MutableSpan() + return unsafe _overrideLifetime(span, mutating: &self) + } let span = unsafe MutableSpan( _unsafeStart: _protectedMutableAddress, count: count diff --git a/test/stdlib/Span/InlineSpanProperties.swift b/test/stdlib/Span/InlineSpanProperties.swift index 252d2990e9fac..01a252ba94d92 100644 --- a/test/stdlib/Span/InlineSpanProperties.swift +++ b/test/stdlib/Span/InlineSpanProperties.swift @@ -119,6 +119,20 @@ suite.test("InlineArray.span property (String)") } } +suite.test("InlineArray.span property (empty, aligned)") +.skip(.custom( + { if #available(SwiftStdlib 6.2, *) { false } else { true } }, + reason: "Requires Swift 6.2's standard library" +)) +.code { + guard #available(SwiftStdlib 6.2, *) else { return } + + let empty: InlineArray<0, Padded> = [] + let span = empty.span + expectTrue(span.isEmpty) + expectEqual(span.count, 0) +} + suite.test("InlineArray.mutableSpan property") .require(.stdlib_6_2).code { @@ -146,3 +160,14 @@ suite.test("InlineArray.mutableSpan property (String)") let s = span[3] expectTrue(s._isIdentical(to: v[3])) } + +suite.test("InlineArray.mutableSpan property (empty, aligned)") +.require(.stdlib_6_2).code +{ + guard #available(SwiftStdlib 6.2, *) else { return } + + var empty: InlineArray<0, Padded> = [] + var span = empty.mutableSpan + expectTrue(span.isEmpty) + expectEqual(span.count, 0) +} From 1b2ac42c789a71e2d0a06011b27524d87feff05f Mon Sep 17 00:00:00 2001 From: Guillaume Lessard Date: Mon, 3 Nov 2025 15:15:31 -0800 Subject: [PATCH 2/2] [test] change to a simpler syntax --- test/stdlib/Span/InlineSpanProperties.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/stdlib/Span/InlineSpanProperties.swift b/test/stdlib/Span/InlineSpanProperties.swift index 01a252ba94d92..e45eb0eff59c9 100644 --- a/test/stdlib/Span/InlineSpanProperties.swift +++ b/test/stdlib/Span/InlineSpanProperties.swift @@ -120,11 +120,7 @@ suite.test("InlineArray.span property (String)") } suite.test("InlineArray.span property (empty, aligned)") -.skip(.custom( - { if #available(SwiftStdlib 6.2, *) { false } else { true } }, - reason: "Requires Swift 6.2's standard library" -)) -.code { +.require(.stdlib_6_2).code { guard #available(SwiftStdlib 6.2, *) else { return } let empty: InlineArray<0, Padded> = []