Skip to content

Commit efc46bd

Browse files
[TypeChecker] Not warning element cast to unrelated for known collection types (Set,Array and Dictionary)
1 parent e23a36a commit efc46bd

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

lib/Sema/CSFix.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ CoerceToCheckedCast *CoerceToCheckedCast::attempt(ConstraintSystem &cs,
151151
return nullptr;
152152

153153
const auto castKind = TypeChecker::typeCheckCheckedCast(
154-
fromType, toType, CheckedCastContextKind::None, cs.DC,
154+
fromType, toType, CheckedCastContextKind::Coercion, cs.DC,
155155
SourceLoc(), coerceExpr->getSubExpr(), SourceRange());
156156

157157
// Invalid cast.

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

lib/Sema/TypeChecker.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@ enum class CheckedCastContextKind {
341341
IsPattern,
342342
/// An enum-element pattern.
343343
EnumElementPattern,
344+
/// Coerce to checked cast. Used when we verify if it is possible to
345+
/// suggest to convert a coercion to a checked cast.
346+
Coercion,
344347
};
345348

346349
namespace TypeChecker {

0 commit comments

Comments
 (0)