From d5b131a4362598db0a52bdd52fc07a9edda4f464 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 23 Jan 2025 10:08:52 -0800 Subject: [PATCH 1/6] Add Comparable conformance to WordPair --- stdlib/public/Synchronization/Atomics/WordPair.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/stdlib/public/Synchronization/Atomics/WordPair.swift b/stdlib/public/Synchronization/Atomics/WordPair.swift index 1aecee05146f0..216852b0dfba4 100644 --- a/stdlib/public/Synchronization/Atomics/WordPair.swift +++ b/stdlib/public/Synchronization/Atomics/WordPair.swift @@ -183,6 +183,18 @@ extension WordPair: Hashable { } } +@available(SwiftStdlib 6.2, *) +extension WordPair: Comparable { + // Note: This function can have a lower availability than the conformance + // itself because it's always emit into client. + @available(SwiftStdlib 6.0, *) + @_alwaysEmitIntoClient + @_transparent + public func <(lhs: WordPair, rhs: WordPair) -> Bool { + lhs.first < rhs.first || lhs.second < rhs.second + } +} + @available(SwiftStdlib 6.0, *) @_unavailableInEmbedded extension WordPair: CustomStringConvertible { From d680396a09f925b788c19b8b8c5396a5935e7644 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 23 Jan 2025 10:14:19 -0800 Subject: [PATCH 2/6] Test comparable conformance --- test/stdlib/Synchronization/Atomics/WordPair.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/stdlib/Synchronization/Atomics/WordPair.swift b/test/stdlib/Synchronization/Atomics/WordPair.swift index d7bdb77df9f67..30da1b9d8b1bf 100644 --- a/test/stdlib/Synchronization/Atomics/WordPair.swift +++ b/test/stdlib/Synchronization/Atomics/WordPair.swift @@ -45,6 +45,16 @@ suite.test("basics") { let value1 = WordPair(first: .max, second: 0) expectEqual(value1.first, .max) expectEqual(value1.second, 0) + + let c0 = WordPair(first: 0, second: 0) + let c1 = WordPair(first: 1, second: 0) + let c2 = WordPair(first: 2, second: 0) + let c3 = WordPair(first: 0, second: 1) + expectFalse(c0 < c0) + expectTrue(c0 < c1) + expectTrue(c0 < c2) + expectTrue(c0 < c3) + expectFalse(c1 < c0) } } // if #available(SwiftStdlib 6.0, *) From 22d5acd20744b995a6c3e9df44262c46ad7a0f43 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 23 Jan 2025 11:55:21 -0800 Subject: [PATCH 3/6] Fix logic around comparison --- stdlib/public/Synchronization/Atomics/WordPair.swift | 6 +++++- test/stdlib/Synchronization/Atomics/WordPair.swift | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/stdlib/public/Synchronization/Atomics/WordPair.swift b/stdlib/public/Synchronization/Atomics/WordPair.swift index 216852b0dfba4..5e3ee53439bbe 100644 --- a/stdlib/public/Synchronization/Atomics/WordPair.swift +++ b/stdlib/public/Synchronization/Atomics/WordPair.swift @@ -191,7 +191,11 @@ extension WordPair: Comparable { @_alwaysEmitIntoClient @_transparent public func <(lhs: WordPair, rhs: WordPair) -> Bool { - lhs.first < rhs.first || lhs.second < rhs.second + if lhs.first != rhs.first { + return lhs.first < rhs.first + } else { + return lhs.second < rhs.second + } } } diff --git a/test/stdlib/Synchronization/Atomics/WordPair.swift b/test/stdlib/Synchronization/Atomics/WordPair.swift index 30da1b9d8b1bf..ac4155be00166 100644 --- a/test/stdlib/Synchronization/Atomics/WordPair.swift +++ b/test/stdlib/Synchronization/Atomics/WordPair.swift @@ -50,11 +50,15 @@ suite.test("basics") { let c1 = WordPair(first: 1, second: 0) let c2 = WordPair(first: 2, second: 0) let c3 = WordPair(first: 0, second: 1) + let c4 = WordPair(first: 1, second: 2) + let c5 = WordPair(first: 2, second: 1) expectFalse(c0 < c0) expectTrue(c0 < c1) expectTrue(c0 < c2) expectTrue(c0 < c3) expectFalse(c1 < c0) + expectTrue(c4 < c5) + expectFalse(c5 < c4) } } // if #available(SwiftStdlib 6.0, *) From 8500d0cba184414b202dd46f0813b3cee49c779d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 23 Jan 2025 13:09:47 -0800 Subject: [PATCH 4/6] Less than is a static function.. --- stdlib/public/Synchronization/Atomics/WordPair.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/public/Synchronization/Atomics/WordPair.swift b/stdlib/public/Synchronization/Atomics/WordPair.swift index 5e3ee53439bbe..292878698348d 100644 --- a/stdlib/public/Synchronization/Atomics/WordPair.swift +++ b/stdlib/public/Synchronization/Atomics/WordPair.swift @@ -190,7 +190,7 @@ extension WordPair: Comparable { @available(SwiftStdlib 6.0, *) @_alwaysEmitIntoClient @_transparent - public func <(lhs: WordPair, rhs: WordPair) -> Bool { + public static func <(lhs: WordPair, rhs: WordPair) -> Bool { if lhs.first != rhs.first { return lhs.first < rhs.first } else { From 9af4a76b52dd36a64248231cd79bd16ebfa1f002 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 23 Jan 2025 15:55:19 -0800 Subject: [PATCH 5/6] Use tuple comparison --- stdlib/public/Synchronization/Atomics/WordPair.swift | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/stdlib/public/Synchronization/Atomics/WordPair.swift b/stdlib/public/Synchronization/Atomics/WordPair.swift index 292878698348d..6da09a9811e08 100644 --- a/stdlib/public/Synchronization/Atomics/WordPair.swift +++ b/stdlib/public/Synchronization/Atomics/WordPair.swift @@ -187,15 +187,11 @@ extension WordPair: Hashable { extension WordPair: Comparable { // Note: This function can have a lower availability than the conformance // itself because it's always emit into client. - @available(SwiftStdlib 6.0, *) + @available(SwiftStdlib 6.2, *) @_alwaysEmitIntoClient @_transparent public static func <(lhs: WordPair, rhs: WordPair) -> Bool { - if lhs.first != rhs.first { - return lhs.first < rhs.first - } else { - return lhs.second < rhs.second - } + (lhs.first, lhs.second) < (rhs.first, rhs.second) } } From d2309d264d8ad1f3b86b77dee8dfe10eb3079a95 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 28 Jan 2025 12:50:51 -0800 Subject: [PATCH 6/6] Fix tests --- stdlib/public/Synchronization/Atomics/WordPair.swift | 2 -- test/abi/macOS/arm64/synchronization.swift | 3 +++ test/abi/macOS/x86_64/synchronization.swift | 3 +++ test/stdlib/Synchronization/Atomics/WordPair.swift | 8 ++++++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/stdlib/public/Synchronization/Atomics/WordPair.swift b/stdlib/public/Synchronization/Atomics/WordPair.swift index 6da09a9811e08..1f740115342a6 100644 --- a/stdlib/public/Synchronization/Atomics/WordPair.swift +++ b/stdlib/public/Synchronization/Atomics/WordPair.swift @@ -185,8 +185,6 @@ extension WordPair: Hashable { @available(SwiftStdlib 6.2, *) extension WordPair: Comparable { - // Note: This function can have a lower availability than the conformance - // itself because it's always emit into client. @available(SwiftStdlib 6.2, *) @_alwaysEmitIntoClient @_transparent diff --git a/test/abi/macOS/arm64/synchronization.swift b/test/abi/macOS/arm64/synchronization.swift index dac5028a8e6d1..90d088483b850 100644 --- a/test/abi/macOS/arm64/synchronization.swift +++ b/test/abi/macOS/arm64/synchronization.swift @@ -698,3 +698,6 @@ Added: _$s15Synchronization20AtomicUpdateOrderingV22sequentiallyConsistentACvpZM Added: _$s15Synchronization20AtomicUpdateOrderingV7relaxedACvpZMV Added: _$s15Synchronization20AtomicUpdateOrderingV9acquiringACvpZMV Added: _$s15Synchronization20AtomicUpdateOrderingV9releasingACvpZMV + +// WordPair to Comparable conformance +Added: _$s15Synchronization8WordPairVSLAAMc diff --git a/test/abi/macOS/x86_64/synchronization.swift b/test/abi/macOS/x86_64/synchronization.swift index a0444b8ee8d10..e5e4fdd58b764 100644 --- a/test/abi/macOS/x86_64/synchronization.swift +++ b/test/abi/macOS/x86_64/synchronization.swift @@ -692,3 +692,6 @@ Added: _$s15Synchronization20AtomicUpdateOrderingV22sequentiallyConsistentACvpZM Added: _$s15Synchronization20AtomicUpdateOrderingV7relaxedACvpZMV Added: _$s15Synchronization20AtomicUpdateOrderingV9acquiringACvpZMV Added: _$s15Synchronization20AtomicUpdateOrderingV9releasingACvpZMV + +// WordPair to Comparable conformance +Added: _$s15Synchronization8WordPairVSLAAMc diff --git a/test/stdlib/Synchronization/Atomics/WordPair.swift b/test/stdlib/Synchronization/Atomics/WordPair.swift index ac4155be00166..6f1319f8b58df 100644 --- a/test/stdlib/Synchronization/Atomics/WordPair.swift +++ b/test/stdlib/Synchronization/Atomics/WordPair.swift @@ -45,7 +45,12 @@ suite.test("basics") { let value1 = WordPair(first: .max, second: 0) expectEqual(value1.first, .max) expectEqual(value1.second, 0) +} + +} // if #available(SwiftStdlib 6.0, *) +if #available(SwiftStdlib 6.2, *) { +suite.test("comparable") { let c0 = WordPair(first: 0, second: 0) let c1 = WordPair(first: 1, second: 0) let c2 = WordPair(first: 2, second: 0) @@ -60,7 +65,6 @@ suite.test("basics") { expectTrue(c4 < c5) expectFalse(c5 < c4) } - -} // if #available(SwiftStdlib 6.0, *) +} // if #available(SwiftStdlib 6.2, *) runAllTests()