Skip to content

Commit 103961a

Browse files
Make Float16 unavailable on macOS and macCatalyst, mirroring Xcode's Swift. (#32868)
LLVM doesn't have a stable ABI for Float16 on x86 yet; we're working with Intel to get that fixed, but we don't want to make the type available on macOS until a stable ABI is actually available, because we'd break binaries compiled before any calling convention changes if we do.
1 parent 28799e6 commit 103961a

11 files changed

+57
-19
lines changed

stdlib/public/Differentiation/FloatingPointDifferentiation.swift.gyb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ bits = self_type.bits
2121

2222
def Availability(bits):
2323
if bits == 16:
24-
return '@available(macOS 10.16, iOS 14.0, tvOS 14.0, watchOS 7.0, *)'
24+
return '@available(iOS 14.0, tvOS 14.0, watchOS 7.0, *)'
2525
return ''
2626
}%
2727

2828
% if bits == 80:
2929
#if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64))
3030
% end
31+
% if bits == 16:
32+
#if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
33+
% end
3134

3235
//===----------------------------------------------------------------------===//
3336
// Protocol conformances
@@ -253,7 +256,7 @@ extension ${Self} {
253256
}
254257
}
255258

256-
% if bits == 80:
259+
% if bits == 80 or bits == 16:
257260
#endif
258261
% end
259262
% end

stdlib/public/core/CTypes.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ public typealias CLong = Int
5757
public typealias CLongLong = Int64
5858

5959
/// The C '_Float16' type.
60-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
60+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
61+
@available(macOS, unavailable)
62+
@available(macCatalyst, unavailable)
6163
public typealias CFloat16 = Float16
6264

6365
/// The C 'float' type.

stdlib/public/core/Codable.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4730,7 +4730,9 @@ extension RawRepresentable where RawValue == Float, Self: Decodable {
47304730
}
47314731
}
47324732

4733-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
4733+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
4734+
@available(macOS, unavailable)
4735+
@available(macCatalyst, unavailable)
47344736
extension Float16: Codable {
47354737
/// Creates a new instance by decoding from the given decoder.
47364738
///

stdlib/public/core/FloatingPointParsing.swift.gyb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ internal func _isspace_clocale(_ u: UTF16.CodeUnit) -> Bool {
4646

4747
//===--- Parsing ----------------------------------------------------------===//
4848
%if bits == 16:
49-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
49+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
50+
@available(macOS, unavailable)
51+
@available(macCatalyst, unavailable)
5052
%end
5153
extension ${Self}: LosslessStringConvertible {
5254
/// Creates a new instance from the given string.

stdlib/public/core/FloatingPointTypes.swift.gyb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ RawSignificand = 'UInt' + str(SignificandSize)
4040

4141
def Availability(bits):
4242
if bits == 16:
43-
return '@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)'
43+
return '@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)\n@available(macOS, unavailable)\n@available(macCatalyst, unavailable)'
4444
return ''
4545

4646
if Self == 'Float16':

stdlib/public/core/IntegerTypes.swift.gyb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,9 @@ public struct ${Self}
11521152
/// `source` must be representable in this type after rounding toward
11531153
/// zero.
11541154
% if FloatType == 'Float16':
1155-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
1155+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
1156+
@available(macOS, unavailable)
1157+
@available(macCatalyst, unavailable)
11561158
% end
11571159
@_transparent
11581160
public init(_ source: ${FloatType}) {
@@ -1182,7 +1184,9 @@ public struct ${Self}
11821184
///
11831185
/// - Parameter source: A floating-point value to convert to an integer.
11841186
% if FloatType == 'Float16':
1185-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
1187+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
1188+
@available(macOS, unavailable)
1189+
@available(macCatalyst, unavailable)
11861190
% end
11871191
@_transparent
11881192
public init?(exactly source: ${FloatType}) {

stdlib/public/core/Runtime.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,9 @@ internal func _float16ToStringImpl(
303303
_ debug: Bool
304304
) -> Int
305305

306-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
306+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
307+
@available(macOS, unavailable)
308+
@available(macCatalyst, unavailable)
307309
internal func _float16ToString(
308310
_ value: Float16,
309311
debug: Bool

stdlib/public/core/SIMDVectorTypes.swift.gyb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,9 @@ extension ${Self}: SIMDScalar {
254254

255255
%for (Self, bits) in [('Float16',16), ('Float',32), ('Double',64)]:
256256
%if bits == 16:
257-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
257+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
258+
@available(macOS, unavailable)
259+
@available(macCatalyst, unavailable)
258260
%end
259261
extension ${Self} : SIMDScalar {
260262

test/ClangImporter/cfuncs_parse.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,16 @@ func test_powl() {
7272
}
7373
#endif
7474

75-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
75+
#if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
76+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
7677
func test_f16() {
7778
var x = Float16.zero
7879
f16ptrfunc(&x)
7980
#if arch(arm) || arch(arm64)
8081
f16func(x)
8182
#endif
8283
}
84+
#endif
8385

8486
func test_puts(_ s: String) {
8587
_ = s.withCString { puts($0) + 32 };

test/stdlib/Inputs/FloatingPointConversion.swift.gyb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ var FloatingPointConversionFailures = TestSuite("FloatingPointToFloatingPointCon
1616
% SelfSignificandBits = self_type.bits
1717
% Self = self_type.stdlib_name
1818

19+
% if Self == 'Float16':
20+
#if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
21+
% end
1922
% if Self == 'Float80':
2023
#if !os(Windows) && (arch(i386) || arch(x86_64))
2124
% end
@@ -24,14 +27,17 @@ var FloatingPointConversionFailures = TestSuite("FloatingPointToFloatingPointCon
2427
% OtherSignificandBits = other_type.bits
2528
% OtherFloat = other_type.stdlib_name
2629

30+
% if OtherFloat == 'Float16':
31+
#if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
32+
% end
2733
% if OtherFloat == 'Float80':
2834
#if !os(Windows) && (arch(i386) || arch(x86_64))
2935
% end
3036

3137
% if OtherSignificandBits <= SelfSignificandBits:
3238

3339
% if OtherFloat == 'Float16':
34-
if #available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
40+
if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
3541
% end
3642
FloatingPointConversionTruncations.test("${OtherFloat}To${Self}Conversion")
3743

@@ -56,7 +62,7 @@ FloatingPointConversionTruncations.test("${OtherFloat}To${Self}Conversion")
5662
% else:
5763

5864
% if Self == 'Float16':
59-
if #available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
65+
if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
6066
% end
6167
FloatingPointConversionTruncations.test("${OtherFloat}To${Self}Conversion")
6268
.forEach(in: [
@@ -77,7 +83,7 @@ FloatingPointConversionTruncations.test("${OtherFloat}To${Self}Conversion")
7783
% end
7884

7985
% if 'Float16' in [Self, OtherFloat]:
80-
if #available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
86+
if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
8187
% end
8288
FloatingPointConversionTruncations.test("${OtherFloat}To${Self}Conversion/special") {
8389
expectEqual( 1.0 as ${Self}, ${Self}(exactly: 1.0 as ${OtherFloat}))
@@ -119,6 +125,9 @@ FloatingPointConversionFailures.test("${OtherFloat}To${Self}Conversion/AlwaysSuc
119125
}
120126
% end
121127

128+
% if OtherFloat == 'Float16':
129+
#endif
130+
% end
122131
% if OtherFloat == 'Float80':
123132
#endif
124133
% end
@@ -138,7 +147,8 @@ _UnimplementedError()
138147

139148
extension ${OtherInt} {
140149
% if Self == 'Float16':
141-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
150+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
151+
@available(macOS, unavailable)
142152
% end
143153
static var _test${Self}Conversion: [(${OtherInt}, ${OtherInt}, ${OtherInt}?)] {
144154
if bitWidth > ${Self}.significandBitCount + 1 {
@@ -165,7 +175,7 @@ extension ${OtherInt} {
165175
}
166176

167177
% if Self == 'Float16':
168-
if #available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
178+
if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
169179
% end
170180
FixedPointConversionTruncations.test("${OtherInt}to${Self}")
171181
.forEach(in: ${OtherInt}._test${Self}Conversion) {
@@ -187,6 +197,9 @@ FixedPointConversionTruncations.test("${OtherInt}to${Self}")
187197

188198
% end # for in int_types
189199

200+
% if Self == 'Float16':
201+
#endif
202+
% end
190203
% if Self == 'Float80':
191204
#endif
192205
% end

test/stdlib/PrintFloat.swift.gyb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,9 @@ let PrintTests = TestSuite("FloatingPointPrinting")
345345

346346
% for FloatType in ['Float16', 'Float', 'Double', 'Float80']:
347347
% if FloatType == 'Float16':
348-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
348+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
349+
@available(macOS, unavailable)
350+
@available(macCatalyst, unavailable)
349351
% end
350352
% if FloatType == 'Float80':
351353
#if !os(Windows) && (arch(i386) || arch(x86_64))
@@ -383,7 +385,9 @@ fileprivate func expectDescription(_ expected: String, _ object: ${FloatType},
383385
// that is closest (as an infinitely-precise real number) to the original
384386
// binary float (interpreted as an infinitely-precise real number).
385387
% if FloatType == 'Float16':
386-
@available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *)
388+
@available(iOS 14.0, watchOS 7.0, tvOS 14.0, *)
389+
@available(macOS, unavailable)
390+
@available(macCatalyst, unavailable)
387391
% end
388392
fileprivate func expectAccurateDescription(_ object: ${FloatType},
389393
_ message: @autoclosure () -> String = "",
@@ -584,7 +588,8 @@ PrintTests.test("Printable_CDouble") {
584588
expectDescription("-1.0", CDouble(-1.0))
585589
}
586590

587-
if #available(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
591+
#if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
592+
if #available(iOS 14.0, watchOS 7.0, tvOS 14.0, *) {
588593
PrintTests.test("Printable_Float16") {
589594
func asFloat16(_ f: Float16) -> Float16 { return f }
590595

@@ -727,6 +732,7 @@ PrintTests.test("Printable_Float16") {
727732
expectDescription("0.0", asFloat16(0.0000000125))
728733
}
729734
}
735+
#endif
730736

731737
PrintTests.test("Printable_Float") {
732738
func asFloat32(_ f: Float32) -> Float32 { return f }

0 commit comments

Comments
 (0)