@@ -63,6 +63,9 @@ DynamicCastFeasibility classifyDynamicCast(
6363 bool isSourceTypeExact = false ,
6464 bool isWholdModuleOpts = false );
6565
66+ SILValue emitSuccessfulScalarUnconditionalCast (SILBuilder &B, SILLocation loc,
67+ SILDynamicCastInst inst);
68+
6669SILValue emitSuccessfulScalarUnconditionalCast (
6770 SILBuilder &B, ModuleDecl *M, SILLocation loc, SILValue value,
6871 SILType loweredTargetType,
@@ -186,6 +189,7 @@ struct SILDynamicCastInst {
186189 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
187190 return CastConsumptionKind::TakeAlways;
188191 case SILDynamicCastKind::UnconditionalCheckedCastInst:
192+ return CastConsumptionKind::CopyOnSuccess;
189193 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
190194 llvm_unreachable (" unsupported" );
191195 }
@@ -210,8 +214,8 @@ struct SILDynamicCastInst {
210214 case SILDynamicCastKind::CheckedCastValueBranchInst:
211215 llvm_unreachable (" unsupported" );
212216 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
213- return nullptr ;
214217 case SILDynamicCastKind::UnconditionalCheckedCastInst:
218+ return nullptr ;
215219 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
216220 llvm_unreachable (" unsupported" );
217221 }
@@ -228,8 +232,8 @@ struct SILDynamicCastInst {
228232 case SILDynamicCastKind::CheckedCastValueBranchInst:
229233 llvm_unreachable (" unsupported" );
230234 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
231- return nullptr ;
232235 case SILDynamicCastKind::UnconditionalCheckedCastInst:
236+ return nullptr ;
233237 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
234238 llvm_unreachable (" unsupported" );
235239 }
@@ -248,6 +252,7 @@ struct SILDynamicCastInst {
248252 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
249253 return cast<UnconditionalCheckedCastAddrInst>(inst)->getSrc ();
250254 case SILDynamicCastKind::UnconditionalCheckedCastInst:
255+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ();
251256 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
252257 llvm_unreachable (" unsupported" );
253258 }
@@ -263,6 +268,10 @@ struct SILDynamicCastInst {
263268 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
264269 return cast<UnconditionalCheckedCastAddrInst>(inst)->getDest ();
265270 case SILDynamicCastKind::UnconditionalCheckedCastInst:
271+ // TODO: Why isn't this:
272+ //
273+ // return cast<UnconditionalCheckedCastInst>(inst);
274+ return SILValue ();
266275 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
267276 llvm_unreachable (" unimplemented" );
268277 }
@@ -277,6 +286,7 @@ struct SILDynamicCastInst {
277286 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
278287 return cast<UnconditionalCheckedCastAddrInst>(inst)->getSourceType ();
279288 case SILDynamicCastKind::UnconditionalCheckedCastInst:
289+ return cast<UnconditionalCheckedCastInst>(inst)->getSourceType ();
280290 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
281291 llvm_unreachable (" unsupported" );
282292 }
@@ -293,6 +303,7 @@ struct SILDynamicCastInst {
293303 return uccai->getSrc ()->getType ();
294304 }
295305 case SILDynamicCastKind::UnconditionalCheckedCastInst:
306+ return cast<UnconditionalCheckedCastInst>(inst)->getOperand ()->getType ();
296307 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
297308 llvm_unreachable (" unsupported" );
298309 }
@@ -307,6 +318,7 @@ struct SILDynamicCastInst {
307318 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
308319 return cast<UnconditionalCheckedCastAddrInst>(inst)->getTargetType ();
309320 case SILDynamicCastKind::UnconditionalCheckedCastInst:
321+ return cast<UnconditionalCheckedCastInst>(inst)->getTargetType ();
310322 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
311323 llvm_unreachable (" unimplemented" );
312324 }
@@ -322,7 +334,9 @@ struct SILDynamicCastInst {
322334 auto *uccai = dyn_cast<UnconditionalCheckedCastAddrInst>(inst);
323335 return uccai->getDest ()->getType ();
324336 }
325- case SILDynamicCastKind::UnconditionalCheckedCastInst:
337+ case SILDynamicCastKind::UnconditionalCheckedCastInst: {
338+ return cast<UnconditionalCheckedCastInst>(inst)->getType ();
339+ }
326340 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
327341 llvm_unreachable (" unsupported" );
328342 }
@@ -335,8 +349,8 @@ struct SILDynamicCastInst {
335349 case SILDynamicCastKind::CheckedCastValueBranchInst:
336350 llvm_unreachable (" unsupported" );
337351 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
338- return isa<MetatypeInst>(getSource ());
339352 case SILDynamicCastKind::UnconditionalCheckedCastInst:
353+ return isa<MetatypeInst>(getSource ());
340354 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
341355 llvm_unreachable (" unsupported" );
342356 }
@@ -368,8 +382,8 @@ struct SILDynamicCastInst {
368382 case SILDynamicCastKind::CheckedCastValueBranchInst:
369383 llvm_unreachable (" unsupported" );
370384 case SILDynamicCastKind::UnconditionalCheckedCastAddrInst:
371- return false ;
372385 case SILDynamicCastKind::UnconditionalCheckedCastInst:
386+ return false ;
373387 case SILDynamicCastKind::UnconditionalCheckedCastValueInst:
374388 llvm_unreachable (" unsupported" );
375389 }
0 commit comments