Skip to content

Commit e038f7e

Browse files
authored
Merge pull request #23329 from gottesmm/pr-2679b77f4cbae71992789447ad73841ac6504842
2 parents dbcad66 + d1b6060 commit e038f7e

File tree

1 file changed

+37
-33
lines changed

1 file changed

+37
-33
lines changed

lib/Sema/TypeCheckStmt.cpp

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -946,29 +946,30 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
946946
PreviousFallthrough = S;
947947
return S;
948948
}
949-
950-
Stmt *visitSwitchStmt(SwitchStmt *S) {
949+
950+
Stmt *visitSwitchStmt(SwitchStmt *switchStmt) {
951951
// Type-check the subject expression.
952-
Expr *subjectExpr = S->getSubjectExpr();
952+
Expr *subjectExpr = switchStmt->getSubjectExpr();
953953
auto resultTy = TC.typeCheckExpression(subjectExpr, DC);
954954
auto limitExhaustivityChecks = !resultTy;
955955
if (Expr *newSubjectExpr = TC.coerceToRValue(subjectExpr))
956956
subjectExpr = newSubjectExpr;
957-
S->setSubjectExpr(subjectExpr);
958-
Type subjectType = S->getSubjectExpr()->getType();
957+
switchStmt->setSubjectExpr(subjectExpr);
958+
Type subjectType = switchStmt->getSubjectExpr()->getType();
959959

960960
// Type-check the case blocks.
961961
AddSwitchNest switchNest(*this);
962-
AddLabeledStmt labelNest(*this, S);
962+
AddLabeledStmt labelNest(*this, switchStmt);
963963

964964
// Pre-emptively visit all Decls (#if/#warning/#error) that still exist in
965965
// the list of raw cases.
966-
for (auto node : S->getRawCases()) {
967-
if (!node.is<Decl*>()) continue;
968-
TC.typeCheckDecl(node.get<Decl*>());
966+
for (auto &node : switchStmt->getRawCases()) {
967+
if (!node.is<Decl *>())
968+
continue;
969+
TC.typeCheckDecl(node.get<Decl *>());
969970
}
970971

971-
auto cases = S->getCases();
972+
auto cases = switchStmt->getCases();
972973
CaseStmt *previousBlock = nullptr;
973974
for (auto i = cases.begin(), e = cases.end(); i != e; ++i) {
974975
auto *caseBlock = *i;
@@ -1000,36 +1001,39 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
10001001

10011002
// For each variable in the pattern, make sure its type is identical to what it
10021003
// was in the first label item's pattern.
1003-
auto firstPattern = caseBlock->getCaseLabelItems()[0].getPattern();
1004+
auto *firstPattern = caseBlock->getCaseLabelItems()[0].getPattern();
10041005
SmallVector<VarDecl *, 4> vars;
10051006
firstPattern->collectVariables(vars);
1006-
pattern->forEachVariable([&](VarDecl *VD) {
1007-
if (!VD->hasName())
1007+
pattern->forEachVariable([&](VarDecl *vd) {
1008+
if (!vd->hasName())
10081009
return;
10091010
for (auto *expected : vars) {
1010-
if (expected->hasName() && expected->getName() == VD->getName()) {
1011-
if (VD->hasType() && expected->hasType() && !expected->isInvalid() &&
1012-
!VD->getType()->isEqual(expected->getType())) {
1013-
TC.diagnose(VD->getLoc(), diag::type_mismatch_multiple_pattern_list,
1014-
VD->getType(), expected->getType());
1015-
VD->markInvalid();
1011+
if (expected->hasName() && expected->getName() == vd->getName()) {
1012+
if (vd->hasType() && expected->hasType() &&
1013+
!expected->isInvalid() &&
1014+
!vd->getType()->isEqual(expected->getType())) {
1015+
TC.diagnose(vd->getLoc(),
1016+
diag::type_mismatch_multiple_pattern_list,
1017+
vd->getType(), expected->getType());
1018+
vd->markInvalid();
10161019
expected->markInvalid();
10171020
}
1018-
if (expected->isLet() != VD->isLet()) {
1019-
auto diag = TC.diagnose(VD->getLoc(),
1020-
diag::mutability_mismatch_multiple_pattern_list,
1021-
VD->isLet(), expected->isLet());
1021+
if (expected->isLet() != vd->isLet()) {
1022+
auto diag = TC.diagnose(
1023+
vd->getLoc(),
1024+
diag::mutability_mismatch_multiple_pattern_list,
1025+
vd->isLet(), expected->isLet());
10221026

10231027
VarPattern *foundVP = nullptr;
1024-
VD->getParentPattern()->forEachNode([&](Pattern *P) {
1028+
vd->getParentPattern()->forEachNode([&](Pattern *P) {
10251029
if (auto *VP = dyn_cast<VarPattern>(P))
1026-
if (VP->getSingleVar() == VD)
1030+
if (VP->getSingleVar() == vd)
10271031
foundVP = VP;
10281032
});
10291033
if (foundVP)
10301034
diag.fixItReplace(foundVP->getLoc(),
10311035
expected->isLet() ? "let" : "var");
1032-
VD->markInvalid();
1036+
vd->markInvalid();
10331037
expected->markInvalid();
10341038
}
10351039
return;
@@ -1061,7 +1065,7 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
10611065
limitExhaustivityChecks = true;
10621066
}
10631067

1064-
const CaseLabelItem &labelItem = caseBlock->getCaseLabelItems().front();
1068+
const auto &labelItem = caseBlock->getCaseLabelItems().front();
10651069
if (labelItem.getGuardExpr() && !labelItem.isDefault()) {
10661070
TC.diagnose(labelItem.getStartLoc(),
10671071
diag::unknown_case_where_clause)
@@ -1081,14 +1085,14 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
10811085
// includes our first label item's pattern bindings and types.
10821086
if (PreviousFallthrough && previousBlock) {
10831087
auto firstPattern = caseBlock->getCaseLabelItems()[0].getPattern();
1084-
SmallVector<VarDecl *, 4> Vars;
1085-
firstPattern->collectVariables(Vars);
1088+
SmallVector<VarDecl *, 4> vars;
1089+
firstPattern->collectVariables(vars);
10861090

10871091
for (auto &labelItem : previousBlock->getCaseLabelItems()) {
10881092
const Pattern *pattern = labelItem.getPattern();
10891093
SmallVector<VarDecl *, 4> PreviousVars;
10901094
pattern->collectVariables(PreviousVars);
1091-
for (auto expected : Vars) {
1095+
for (auto expected : vars) {
10921096
bool matched = false;
10931097
if (!expected->hasName())
10941098
continue;
@@ -1120,11 +1124,11 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
11201124
previousBlock = caseBlock;
11211125
}
11221126

1123-
if (!S->isImplicit()) {
1124-
TC.checkSwitchExhaustiveness(S, DC, limitExhaustivityChecks);
1127+
if (!switchStmt->isImplicit()) {
1128+
TC.checkSwitchExhaustiveness(switchStmt, DC, limitExhaustivityChecks);
11251129
}
11261130

1127-
return S;
1131+
return switchStmt;
11281132
}
11291133

11301134
Stmt *visitCaseStmt(CaseStmt *S) {

0 commit comments

Comments
 (0)