@@ -63,6 +63,9 @@ DynamicCastFeasibility classifyDynamicCast(
63
63
bool isSourceTypeExact = false ,
64
64
bool isWholdModuleOpts = false );
65
65
66
+ SILValue emitSuccessfulScalarUnconditionalCast (SILBuilder &B, SILLocation loc,
67
+ SILDynamicCastInst inst);
68
+
66
69
SILValue emitSuccessfulScalarUnconditionalCast (
67
70
SILBuilder &B, ModuleDecl *M, SILLocation loc, SILValue value,
68
71
SILType loweredTargetType,
@@ -186,6 +189,7 @@ struct SILDynamicCastInst {
186
189
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
187
190
return CastConsumptionKind::TakeAlways;
188
191
case SILDynamicCastKind::UnconditionalCheckedCastInst:
192
+ return CastConsumptionKind::CopyOnSuccess;
189
193
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
190
194
llvm_unreachable (" unsupported" );
191
195
}
@@ -210,8 +214,8 @@ struct SILDynamicCastInst {
210
214
case SILDynamicCastKind::CheckedCastValueBranchInst:
211
215
llvm_unreachable (" unsupported" );
212
216
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
213
- return nullptr ;
214
217
case SILDynamicCastKind::UnconditionalCheckedCastInst:
218
+ return nullptr ;
215
219
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
216
220
llvm_unreachable (" unsupported" );
217
221
}
@@ -228,8 +232,8 @@ struct SILDynamicCastInst {
228
232
case SILDynamicCastKind::CheckedCastValueBranchInst:
229
233
llvm_unreachable (" unsupported" );
230
234
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
231
- return nullptr ;
232
235
case SILDynamicCastKind::UnconditionalCheckedCastInst:
236
+ return nullptr ;
233
237
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
234
238
llvm_unreachable (" unsupported" );
235
239
}
@@ -248,6 +252,7 @@ struct SILDynamicCastInst {
248
252
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
249
253
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
250
254
case SILDynamicCastKind::UnconditionalCheckedCastInst:
255
+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ();
251
256
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
252
257
llvm_unreachable (" unsupported" );
253
258
}
@@ -263,6 +268,10 @@ struct SILDynamicCastInst {
263
268
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
264
269
return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
265
270
case SILDynamicCastKind::UnconditionalCheckedCastInst:
271
+ // TODO: Why isn't this:
272
+ //
273
+ // return cast<UnconditionalCheckedCastInst>(inst);
274
+ return SILValue ();
266
275
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
267
276
llvm_unreachable (" unimplemented" );
268
277
}
@@ -277,6 +286,7 @@ struct SILDynamicCastInst {
277
286
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
278
287
return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
279
288
case SILDynamicCastKind::UnconditionalCheckedCastInst:
289
+ return cast<UnconditionalCheckedCastInst>(inst)->getSourceType ();
280
290
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
281
291
llvm_unreachable (" unsupported" );
282
292
}
@@ -293,6 +303,7 @@ struct SILDynamicCastInst {
293
303
return uccai->getSrc ()->getType ();
294
304
}
295
305
case SILDynamicCastKind::UnconditionalCheckedCastInst:
306
+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ()->getType ();
296
307
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
297
308
llvm_unreachable (" unsupported" );
298
309
}
@@ -307,6 +318,7 @@ struct SILDynamicCastInst {
307
318
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
308
319
return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
309
320
case SILDynamicCastKind::UnconditionalCheckedCastInst:
321
+ return cast<UnconditionalCheckedCastInst>(inst)->getTargetType ();
310
322
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
311
323
llvm_unreachable (" unimplemented" );
312
324
}
@@ -322,7 +334,9 @@ struct SILDynamicCastInst {
322
334
auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
323
335
return uccai->getDest ()->getType ();
324
336
}
325
- case SILDynamicCastKind::UnconditionalCheckedCastInst:
337
+ case SILDynamicCastKind::UnconditionalCheckedCastInst: {
338
+ return cast<UnconditionalCheckedCastInst>(inst)->getType ();
339
+ }
326
340
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
327
341
llvm_unreachable (" unsupported" );
328
342
}
@@ -335,8 +349,8 @@ struct SILDynamicCastInst {
335
349
case SILDynamicCastKind::CheckedCastValueBranchInst:
336
350
llvm_unreachable (" unsupported" );
337
351
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
338
- return isa<MetatypeInst>(getSource ());
339
352
case SILDynamicCastKind::UnconditionalCheckedCastInst:
353
+ return isa<MetatypeInst>(getSource ());
340
354
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
341
355
llvm_unreachable (" unsupported" );
342
356
}
@@ -368,8 +382,8 @@ struct SILDynamicCastInst {
368
382
case SILDynamicCastKind::CheckedCastValueBranchInst:
369
383
llvm_unreachable (" unsupported" );
370
384
case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
371
- return false ;
372
385
case SILDynamicCastKind::UnconditionalCheckedCastInst:
386
+ return false ;
373
387
case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
374
388
llvm_unreachable (" unsupported" );
375
389
}
0 commit comments