@@ -105,6 +105,37 @@ func driver() -> () {
105
105
106
106
driver ( )
107
107
108
+ public class Bear {
109
+ public init ? ( fail: Bool ) {
110
+ if fail { return nil }
111
+ }
112
+
113
+ // Check that devirtualizer can handle convenience initializers, which have covariant optional
114
+ // return types.
115
+ // CHECK-LABEL: sil @_TFC23devirt_covariant_return4Bearc
116
+ // CHECK: checked_cast_br [exact] %{{.*}} : $Bear to $PolarBear
117
+ // CHECK: upcast %{{.*}} : $Optional<PolarBear> to $Optional<Bear>
118
+ // CHECK: }
119
+ public convenience init ? ( delegateFailure: Bool , failAfter: Bool ) {
120
+ self . init ( fail: delegateFailure)
121
+ if failAfter { return nil }
122
+ }
123
+ }
124
+
125
+ final class PolarBear : Bear {
126
+
127
+ override init ? ( fail: Bool ) {
128
+ super. init ( fail: fail)
129
+ }
130
+
131
+ init ? ( chainFailure: Bool , failAfter: Bool ) {
132
+ super. init ( fail: chainFailure)
133
+ if failAfter { return nil }
134
+ }
135
+ }
136
+
137
+
138
+
108
139
109
140
class Payload {
110
141
let value : Int32
@@ -148,7 +179,7 @@ final class C2:C {
148
179
// Check that the Optional return value from doSomething
149
180
// gets properly unwrapped into a Payload object and then further
150
181
// devirtualized.
151
- // CHECK-LABEL: sil hidden @_TF23devirt_covariant_return7driver1FCS_2C1Vs5Int32 :
182
+ // CHECK-LABEL: sil hidden @_TTSf4dg___TF23devirt_covariant_return7driver1FCS_2C1Vs5Int32
152
183
// CHECK: integer_literal $Builtin.Int32, 2
153
184
// CHECK: struct $Int32 (%{{.*}} : $Builtin.Int32)
154
185
// CHECK-NOT: class_method
@@ -161,7 +192,7 @@ func driver1(c: C1) -> Int32 {
161
192
// Check that the Optional return value from doSomething
162
193
// gets properly unwrapped into a Payload object and then further
163
194
// devirtualized.
164
- // CHECK-LABEL: sil hidden @_TF23devirt_covariant_return7driver3FCS_1CVs5Int32 :
195
+ // CHECK-LABEL: sil hidden @_TTSf4g___TF23devirt_covariant_return7driver3FCS_1CVs5Int32
165
196
// CHECK: bb{{[0-9]+}}(%{{[0-9]+}} : $C2):
166
197
// CHECK-NOT: bb{{.*}}:
167
198
// check that for C2, we convert the non-optional result into an optional and then cast.
@@ -172,35 +203,6 @@ func driver3(c: C) -> Int32 {
172
203
return c. doSomething ( ) !. getValue ( )
173
204
}
174
205
175
- public class Bear {
176
- public init ? ( fail: Bool ) {
177
- if fail { return nil }
178
- }
179
-
180
- // Check that devirtualizer can handle convenience initializers, which have covariant optional
181
- // return types.
182
- // CHECK-LABEL: sil @_TFC23devirt_covariant_return4Bearc
183
- // CHECK: checked_cast_br [exact] %{{.*}} : $Bear to $PolarBear
184
- // CHECK: upcast %{{.*}} : $Optional<PolarBear> to $Optional<Bear>
185
- // CHECK: }
186
- public convenience init ? ( delegateFailure: Bool , failAfter: Bool ) {
187
- self . init ( fail: delegateFailure)
188
- if failAfter { return nil }
189
- }
190
- }
191
-
192
- final class PolarBear : Bear {
193
-
194
- override init ? ( fail: Bool ) {
195
- super. init ( fail: fail)
196
- }
197
-
198
- init ? ( chainFailure: Bool , failAfter: Bool ) {
199
- super. init ( fail: chainFailure)
200
- if failAfter { return nil }
201
- }
202
- }
203
-
204
206
public class D {
205
207
let v : Int32
206
208
init ( _ n: Int32 ) {
@@ -230,7 +232,7 @@ public class D2: D1 {
230
232
231
233
// Check that the boo call gets properly devirtualized and that
232
234
// that D2.foo() is inlined thanks to this.
233
- // CHECK-LABEL: sil hidden @_TF23devirt_covariant_return7driver2FCS_2D2Vs5Int32
235
+ // CHECK-LABEL: sil hidden @_TTSf4g___TF23devirt_covariant_return7driver2FCS_2D2Vs5Int32
234
236
// CHECK-NOT: class_method
235
237
// CHECK: checked_cast_br [exact] %{{.*}} : $D1 to $D2
236
238
// CHECK: bb2
@@ -274,7 +276,7 @@ class EEE : CCC {
274
276
275
277
// Check that c.foo() is devirtualized, because the optimizer can handle the casting the return type
276
278
// correctly, i.e. it can cast (BBB, BBB) into (AAA, AAA)
277
- // CHECK-LABEL: sil hidden @_TF23devirt_covariant_return37testDevirtOfMethodReturningTupleTypesFTCS_3CCC1bCS_2BB_TCS_2AAS2__
279
+ // CHECK-LABEL: sil hidden @_TTSf4g_n___TF23devirt_covariant_return37testDevirtOfMethodReturningTupleTypesFTCS_3CCC1bCS_2BB_TCS_2AAS2__
278
280
// CHECK: checked_cast_br [exact] %{{.*}} : $CCC to $CCC
279
281
// CHECK: checked_cast_br [exact] %{{.*}} : $CCC to $DDD
280
282
// CHECK: checked_cast_br [exact] %{{.*}} : $CCC to $EEE
@@ -311,17 +313,19 @@ class DDDD : CCCC {
311
313
}
312
314
}
313
315
314
- // Check that c.foo OSX 10.9 be devirtualized, because the optimizer can handle the casting the return type
315
- // correctly, i.e. it cannot cast (BBBB, BBBB) into (AAAA, AAAA)
316
- // CHECK-LABEL: sil hidden @_TF23devirt_covariant_return38testDevirtOfMethodReturningTupleTypes2FCS_4CCCCTCS_4AAAAS1__
317
- // CHECK: checked_cast_br [exact] %{{.*}} : $CCCC to $CCCC
318
- // CHECK: checked_cast_br [exact] %{{.*}} : $CCCC to $DDDD
319
- // CHECK: class_method
320
- // CHECK: }
321
- func testDevirtOfMethodReturningTupleTypes2( c: CCCC ) -> ( AAAA , AAAA ) {
322
- return c. foo
316
+ // Check devirtualization of methods with optional results, where
317
+ // optional results need to be casted.
318
+ // CHECK-LABEL: sil @{{.*}}testOverridingMethodWithOptionalResult
319
+ // CHECK: checked_cast_br [exact] %{{.*}} : $F to $F
320
+ // CHECK: checked_cast_br [exact] %{{.*}} : $F to $G
321
+ // CHECK: switch_enum
322
+ // CHECK: checked_cast_br [exact] %{{.*}} : $F to $H
323
+ // CHECK: switch_enum
324
+ public func testOverridingMethodWithOptionalResult( f: F ) -> ( F ? , Int ) ? {
325
+ return f. foo ( )
323
326
}
324
327
328
+
325
329
public class F {
326
330
@inline ( never)
327
331
public func foo( ) -> ( F ? , Int ) ? {
@@ -342,16 +346,3 @@ public class H: F {
342
346
return nil
343
347
}
344
348
}
345
-
346
- // Check devirtualization of methods with optional results, where
347
- // optional results need to be casted.
348
- // CHECK-LABEL: sil @{{.*}}testOverridingMethodWithOptionalResult
349
- // CHECK: checked_cast_br [exact] %{{.*}} : $F to $F
350
- // CHECK: checked_cast_br [exact] %{{.*}} : $F to $G
351
- // CHECK: switch_enum
352
- // CHECK: checked_cast_br [exact] %{{.*}} : $F to $H
353
- // CHECK: switch_enum
354
- public func testOverridingMethodWithOptionalResult( f: F ) -> ( F ? , Int ) ? {
355
- return f. foo ( )
356
- }
357
-
0 commit comments