@@ -3037,7 +3037,9 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
30373037 Expr *fromExpr,
30383038 SourceRange diagToRange) {
30393039 // Determine whether we should suppress diagnostics.
3040- const bool suppressDiagnostics = contextKind == CheckedCastContextKind::None;
3040+ const bool suppressDiagnostics =
3041+ contextKind == CheckedCastContextKind::None ||
3042+ contextKind == CheckedCastContextKind::Coercion;
30413043 assert ((suppressDiagnostics || diagLoc.isValid ()) &&
30423044 " diagnostics require a valid source location" );
30433045
@@ -3133,6 +3135,7 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
31333135
31343136 switch (contextKind) {
31353137 case CheckedCastContextKind::None:
3138+ case CheckedCastContextKind::Coercion:
31363139 llvm_unreachable (" suppressing diagnostics" );
31373140
31383141 case CheckedCastContextKind::ForcedCast: {
@@ -3264,7 +3267,9 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
32643267 return castKind;
32653268
32663269 case CheckedCastKind::Unresolved:
3267- return failed ();
3270+ if (contextKind == CheckedCastContextKind::Coercion)
3271+ return failed ();
3272+ return castKind;
32683273 }
32693274 llvm_unreachable (" invalid cast type" );
32703275 };
@@ -3295,15 +3300,17 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
32953300 BridgingCoercion);
32963301 break ;
32973302
3303+ case CheckedCastKind::Unresolved:
3304+ if (contextKind == CheckedCastContextKind::Coercion)
3305+ return failed ();
3306+ LLVM_FALLTHROUGH;
3307+
32983308 case CheckedCastKind::ArrayDowncast:
32993309 case CheckedCastKind::DictionaryDowncast:
33003310 case CheckedCastKind::SetDowncast:
33013311 case CheckedCastKind::ValueCast:
33023312 hasCast = true ;
33033313 break ;
3304-
3305- case CheckedCastKind::Unresolved:
3306- return failed ();
33073314 }
33083315
33093316 switch (typeCheckCheckedCast (fromKeyValue->second , toKeyValue->second ,
@@ -3318,15 +3325,17 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
33183325 BridgingCoercion);
33193326 break ;
33203327
3328+ case CheckedCastKind::Unresolved:
3329+ if (contextKind == CheckedCastContextKind::Coercion)
3330+ return failed ();
3331+ LLVM_FALLTHROUGH;
3332+
33213333 case CheckedCastKind::ArrayDowncast:
33223334 case CheckedCastKind::DictionaryDowncast:
33233335 case CheckedCastKind::SetDowncast:
33243336 case CheckedCastKind::ValueCast:
33253337 hasCast = true ;
33263338 break ;
3327-
3328- case CheckedCastKind::Unresolved:
3329- return failed ();
33303339 }
33313340
33323341 if (hasCast) return CheckedCastKind::DictionaryDowncast;
@@ -3423,6 +3432,7 @@ CheckedCastKind TypeChecker::typeCheckCheckedCast(Type fromType,
34233432 case CheckedCastContextKind::EnumElementPattern:
34243433 case CheckedCastContextKind::IsExpr:
34253434 case CheckedCastContextKind::None:
3435+ case CheckedCastContextKind::Coercion:
34263436 break ;
34273437 }
34283438 }
0 commit comments