@@ -24,6 +24,11 @@ struct C : P {
2424 func hello( ) { print ( " Hello from C " ) }
2525}
2626
27+ @available ( iOS 100 , * )
28+ struct D : P {
29+ func hello( ) { print ( " Hello from D " ) }
30+ }
31+
2732func test_multiple_single( ) -> some P {
2833 if #available( macOS 100 . 0 . 1 , * ) {
2934 return A ( )
@@ -61,6 +66,44 @@ func test_multiple_single() -> some P {
6166// CHECK-NEXT: ret ptr @"$s43opaque_result_with_conditional_availability1CVAA1PAAWP"
6267// CHECK-NEXT: }
6368
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+
64107func test_multiple_conds( ) -> some P {
65108 if #available( macOS 100 . 0 . 1 , * ) {
66109 return A ( )
@@ -208,3 +251,51 @@ func test_cross_module() -> some SomeProtocol {
208251// CHECK-NEXT: [[R0:%.*]] = call ptr @"$s49opaque_result_with_conditional_availability_types12PublicStructVAcA12SomeProtocolAAWl"()
209252// CHECK-NEXT: ret ptr [[R0]]
210253// 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