Skip to content

Commit 73edb17

Browse files
authored
Merge pull request #23802 from Catfish-Man/transparently-false
2 parents 5422f9c + 7db8cb1 commit 73edb17

File tree

3 files changed

+39
-21
lines changed

3 files changed

+39
-21
lines changed

stdlib/public/Darwin/ObjectiveC/ObjectiveC.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,30 @@ import _SwiftObjectiveCOverlayShims
2727
public struct ObjCBool : ExpressibleByBooleanLiteral {
2828
#if os(macOS) || (os(iOS) && (arch(i386) || arch(arm)))
2929
// On OS X and 32-bit iOS, Objective-C's BOOL type is a "signed char".
30-
var _value: Int8
30+
@usableFromInline var _value: Int8
3131

32+
@_transparent
3233
init(_ value: Int8) {
3334
self._value = value
3435
}
3536

37+
@_transparent
3638
public init(_ value: Bool) {
3739
self._value = value ? 1 : 0
3840
}
3941

4042
#else
4143
// Everywhere else it is C/C++'s "Bool"
42-
var _value: Bool
44+
@usableFromInline var _value: Bool
4345

46+
@_transparent
4447
public init(_ value: Bool) {
4548
self._value = value
4649
}
4750
#endif
4851

4952
/// The value of `self`, expressed as a `Bool`.
53+
@_transparent
5054
public var boolValue: Bool {
5155
#if os(macOS) || (os(iOS) && (arch(i386) || arch(arm)))
5256
return _value != 0
@@ -78,11 +82,13 @@ extension ObjCBool : CustomStringConvertible {
7882

7983
// Functions used to implicitly bridge ObjCBool types to Swift's Bool type.
8084

85+
@_transparent
8186
public // COMPILER_INTRINSIC
8287
func _convertBoolToObjCBool(_ x: Bool) -> ObjCBool {
8388
return ObjCBool(x)
8489
}
8590

91+
@_transparent
8692
public // COMPILER_INTRINSIC
8793
func _convertObjCBoolToBool(_ x: ObjCBool) -> Bool {
8894
return x.boolValue

stdlib/public/Platform/Platform.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ public var noErr: OSStatus { return 0 }
3030
/// The C type is a typedef for `unsigned char`.
3131
@_fixed_layout
3232
public struct DarwinBoolean : ExpressibleByBooleanLiteral {
33-
var _value: UInt8
33+
@usableFromInline var _value: UInt8
3434

35+
@_transparent
3536
public init(_ value: Bool) {
3637
self._value = value ? 1 : 0
3738
}
3839

3940
/// The value of `self`, expressed as a `Bool`.
41+
@_transparent
4042
public var boolValue: Bool {
4143
return _value != 0
4244
}
@@ -63,15 +65,19 @@ extension DarwinBoolean : CustomStringConvertible {
6365
}
6466

6567
extension DarwinBoolean : Equatable {
68+
@_transparent
6669
public static func ==(lhs: DarwinBoolean, rhs: DarwinBoolean) -> Bool {
6770
return lhs.boolValue == rhs.boolValue
6871
}
6972
}
7073

74+
@_transparent
7175
public // COMPILER_INTRINSIC
7276
func _convertBoolToDarwinBoolean(_ x: Bool) -> DarwinBoolean {
7377
return DarwinBoolean(x)
7478
}
79+
80+
@_transparent
7581
public // COMPILER_INTRINSIC
7682
func _convertDarwinBooleanToBool(_ x: DarwinBoolean) -> Bool {
7783
return x.boolValue

test/SILOptimizer/definite_init_failable_initializers_objc.swift

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -95,48 +95,54 @@ class Cat : FakeNSObject {
9595
// CHECK: store %2 to [[SELF_BOX]] : $*Cat
9696
// CHECK-NEXT: [[COND:%.+]] = struct_extract %0 : $Bool, #Bool._value
9797
// CHECK-NEXT: cond_br [[COND]], bb1, bb2
98-
98+
9999
// CHECK: bb1:
100-
// CHECK-NEXT: br bb5
101-
102-
// CHECK: bb2:
100+
// CHECK-NEXT: br bb8
101+
102+
// CHECK: bb3:
103+
// CHECK: br bb5
104+
105+
// CHECK: bb4:
106+
// CHECK: br bb5
107+
108+
// CHECK: bb5
103109
// CHECK: [[SELF_INIT:%.+]] = objc_method %2 : $Cat, #Cat.init!initializer.1.foreign : (Cat.Type) -> (Int, Bool) -> Cat?
104110
// CHECK: [[NEW_OPT_SELF:%.+]] = apply [[SELF_INIT]]({{%.+}}, {{%.+}}, %2) : $@convention(objc_method) (Int, ObjCBool, @owned Cat) -> @owned Optional<Cat>
105111
// CHECK: [[COND:%.+]] = select_enum [[NEW_OPT_SELF]] : $Optional<Cat>
106-
// CHECK-NEXT: cond_br [[COND]], bb4, bb3
112+
// CHECK-NEXT: cond_br [[COND]], bb7, bb6
107113

108-
// CHECK: bb3:
114+
// CHECK: bb6:
109115
// CHECK-NEXT: release_value [[NEW_OPT_SELF]]
110-
// CHECK-NEXT: br bb5
116+
// CHECK-NEXT: br bb8
111117

112-
// CHECK: bb4:
118+
// CHECK: bb7:
113119
// CHECK-NEXT: [[NEW_SELF:%.+]] = unchecked_enum_data [[NEW_OPT_SELF]] : $Optional<Cat>, #Optional.some!enumelt.1
114120
// CHECK-NEXT: store [[NEW_SELF]] to [[SELF_BOX]] : $*Cat
115121
// TODO: Once we re-enable arbitrary take promotion, this retain and the associated destroy_addr will go away.
116122
// CHECK-NEXT: strong_retain [[NEW_SELF]]
117123
// CHECK-NEXT: [[RESULT:%.+]] = enum $Optional<Cat>, #Optional.some!enumelt.1, [[NEW_SELF]] : $Cat
118124
// CHECK-NEXT: destroy_addr [[SELF_BOX]]
119125
// CHECK-NEXT: dealloc_stack [[SELF_BOX]] : $*Cat
120-
// CHECK-NEXT: br bb9([[RESULT]] : $Optional<Cat>)
126+
// CHECK-NEXT: br bb12([[RESULT]] : $Optional<Cat>)
121127

122-
// CHECK: bb5:
128+
// CHECK: bb8:
123129
// CHECK-NEXT: [[COND:%.+]] = load [[HAS_RUN_INIT_BOX]] : $*Builtin.Int1
124-
// CHECK-NEXT: cond_br [[COND]], bb6, bb7
130+
// CHECK-NEXT: cond_br [[COND]], bb9, bb10
125131

126-
// CHECK: bb6:
127-
// CHECK-NEXT: br bb8
132+
// CHECK: bb9:
133+
// CHECK-NEXT: br bb11
128134

129-
// CHECK: bb7:
135+
// CHECK: bb10:
130136
// CHECK-NEXT: [[MOST_DERIVED_TYPE:%.+]] = value_metatype $@thick Cat.Type, %2 : $Cat
131137
// CHECK-NEXT: dealloc_partial_ref %2 : $Cat, [[MOST_DERIVED_TYPE]] : $@thick Cat.Type
132-
// CHECK-NEXT: br bb8
138+
// CHECK-NEXT: br bb11
133139

134-
// CHECK: bb8:
140+
// CHECK: bb11:
135141
// CHECK-NEXT: dealloc_stack [[SELF_BOX]] : $*Cat
136142
// CHECK-NEXT: [[NIL_RESULT:%.+]] = enum $Optional<Cat>, #Optional.none!enumelt
137-
// CHECK-NEXT: br bb9([[NIL_RESULT]] : $Optional<Cat>)
143+
// CHECK-NEXT: br bb12([[NIL_RESULT]] : $Optional<Cat>)
138144

139-
// CHECK: bb9([[RESULT:%.+]] : $Optional<Cat>):
145+
// CHECK: bb12([[RESULT:%.+]] : $Optional<Cat>):
140146
// CHECK-NEXT: dealloc_stack [[HAS_RUN_INIT_BOX]] : $*Builtin.Int1
141147
// CHECK-NEXT: return [[RESULT]] : $Optional<Cat>
142148

0 commit comments

Comments
 (0)