@@ -24,6 +24,11 @@ struct C : P {
24
24
func hello( ) { print ( " Hello from C " ) }
25
25
}
26
26
27
+ @available ( iOS 100 , * )
28
+ struct D : P {
29
+ func hello( ) { print ( " Hello from D " ) }
30
+ }
31
+
27
32
func test_multiple_single( ) -> some P {
28
33
if #available( macOS 100 . 0 . 1 , * ) {
29
34
return A ( )
@@ -61,6 +66,44 @@ func test_multiple_single() -> some P {
61
66
// CHECK-NEXT: ret ptr @"$s43opaque_result_with_conditional_availability1CVAA1PAAWP"
62
67
// CHECK-NEXT: }
63
68
69
+ func test_multiple_single_multiplatform( ) -> some P {
70
+ if #available( macOS 100 . 0 . 1 , * ) , #available( iOS 100 , * ) {
71
+ return A ( )
72
+ }
73
+
74
+ return C ( )
75
+ }
76
+
77
+ // CHECK: define private ptr @"get_underlying_type_ref 43opaque_result_with_conditional_availabilityAA34test_multiple_single_multiplatformQryFQOQr"(ptr %0)
78
+ // CHECK-NEXT: entry:
79
+ // CHECK-NEXT: br label %conditional-0
80
+ // CHECK: conditional-0: ; preds = %entry
81
+ // CHECK-NEXT: br label %cond-0-0
82
+ // CHECK: cond-0-0: ; preds = %conditional-0
83
+ // CHECK-NEXT: [[COND_1:%.*]] = call i32 @__isPlatformVersionAtLeast(i32 1, i32 100, i32 0, i32 1)
84
+ // CHECK-NEXT: [[IS_AT_LEAST:%.*]] = icmp ne i32 [[COND_1]], 0
85
+ // CHECK-NEXT: br i1 [[IS_AT_LEAST]], label %result-0, label %universal
86
+ // CHECK: result-0: ; preds = %cond-0-0
87
+ // CHECK-NEXT: ret ptr {{.*}} @"$s43opaque_result_with_conditional_availability1AVMf"
88
+ // CHECK: universal: ; preds = %cond-0-0
89
+ // CHECK-NEXT: ret ptr {{.*}} @"$s43opaque_result_with_conditional_availability1CVMf"
90
+ // CHECK-NEXT: }
91
+
92
+ // CHECK: define private ptr @"get_underlying_witness 43opaque_result_with_conditional_availabilityAA34test_multiple_single_multiplatformQryFQOxAA1PHC"(ptr %0)
93
+ // CHECK-NEXT: entry:
94
+ // CHECK-NEXT: br label %conditional-0
95
+ // CHECK: conditional-0: ; preds = %entry
96
+ // CHECK-NEXT: br label %cond-0-0
97
+ // CHECK: cond-0-0: ; preds = %conditional-0
98
+ // CHECK-NEXT: [[COND_1:%.*]] = call i32 @__isPlatformVersionAtLeast(i32 1, i32 100, i32 0, i32 1)
99
+ // CHECK-NEXT: [[IS_AT_LEAST:%.*]] = icmp ne i32 [[COND_1]], 0
100
+ // CHECK-NEXT: br i1 [[IS_AT_LEAST]], label %result-0, label %universal
101
+ // CHECK: result-0: ; preds = %cond-0-0
102
+ // CHECK-NEXT: ret ptr @"$s43opaque_result_with_conditional_availability1AVAA1PAAWP"
103
+ // CHECK: universal: ; preds = %cond-0-0
104
+ // CHECK-NEXT: ret ptr @"$s43opaque_result_with_conditional_availability1CVAA1PAAWP"
105
+ // CHECK-NEXT: }
106
+
64
107
func test_multiple_conds( ) -> some P {
65
108
if #available( macOS 100 . 0 . 1 , * ) {
66
109
return A ( )
@@ -208,3 +251,51 @@ func test_cross_module() -> some SomeProtocol {
208
251
// CHECK-NEXT: [[R0:%.*]] = call ptr @"$s49opaque_result_with_conditional_availability_types12PublicStructVAcA12SomeProtocolAAWl"()
209
252
// CHECK-NEXT: ret ptr [[R0]]
210
253
// CHECK: }
254
+
255
+ func test_other_platform_available( ) -> some P {
256
+ if #available( iOS 100 , * ) {
257
+ return D ( ) // Always executed on macOS
258
+ }
259
+
260
+ return C ( ) // Never executed on macOS
261
+ }
262
+
263
+ // CHECK: define private ptr @"get_underlying_type_ref 43opaque_result_with_conditional_availabilityAA29test_other_platform_availableQryFQOQr"(ptr %0)
264
+ // CHECK-NEXT: entry:
265
+ // CHECK-NEXT: br label %universal
266
+
267
+ // CHECK: universal:
268
+ // CHECK-NEXT: ret ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s43opaque_result_with_conditional_availability1DVMf", i32 0, i32 2)
269
+ // CHECK-NEXT: }
270
+
271
+ // CHECK: define private ptr @"get_underlying_witness 43opaque_result_with_conditional_availabilityAA29test_other_platform_availableQryFQOxAA1PHC"(ptr %0)
272
+ // CHECK-NEXT: entry:
273
+ // CHECK-NEXT: br label %universal
274
+
275
+ // CHECK: universal:
276
+ // CHECK-NEXT: ret ptr @"$s43opaque_result_with_conditional_availability1DVAA1PAAWP"
277
+ // CHECK-NEXT: }
278
+
279
+ func test_other_platform_unavailable( ) -> some P {
280
+ if #unavailable( iOS 100 ) {
281
+ return C ( ) // Never executed on macOS
282
+ }
283
+
284
+ return D ( ) // Always executed on macOS
285
+ }
286
+
287
+ // CHECK: define private ptr @"get_underlying_type_ref 43opaque_result_with_conditional_availabilityAA31test_other_platform_unavailableQryFQOQr"(ptr %0)
288
+ // CHECK-NEXT: entry:
289
+ // CHECK-NEXT: br label %universal
290
+
291
+ // CHECK: universal:
292
+ // CHECK-NEXT: ret ptr getelementptr inbounds (<{ ptr, ptr, i64, ptr }>, ptr @"$s43opaque_result_with_conditional_availability1DVMf", i32 0, i32 2)
293
+ // CHECK-NEXT: }
294
+
295
+ // CHECK: define private ptr @"get_underlying_witness 43opaque_result_with_conditional_availabilityAA31test_other_platform_unavailableQryFQOxAA1PHC"(ptr %0)
296
+ // CHECK-NEXT: entry:
297
+ // CHECK-NEXT: br label %universal
298
+
299
+ // CHECK: universal:
300
+ // CHECK-NEXT: ret ptr @"$s43opaque_result_with_conditional_availability1DVAA1PAAWP"
301
+ // CHECK-NEXT: }
0 commit comments