@@ -2249,23 +2249,31 @@ ParserResult<Stmt> Parser::parseStmtSwitch(LabeledStmtInfo LabelInfo) {
22492249 SubjectExpr = makeParserErrorResult (new (Context) ErrorExpr (SubjectLoc));
22502250 } else {
22512251 SubjectExpr = parseExprBasic (diag::expected_switch_expr);
2252- if (SubjectExpr.hasCodeCompletion ()) {
2253- return makeParserCodeCompletionResult<Stmt>();
2254- }
22552252 if (SubjectExpr.isNull ()) {
22562253 SubjectExpr = makeParserErrorResult (new (Context) ErrorExpr (SubjectLoc));
22572254 }
22582255 Status |= SubjectExpr;
22592256 }
22602257
2261- if (!Tok.is (tok::l_brace)) {
2262- diagnose (Tok, diag::expected_lbrace_after_switch);
2263- return nullptr ;
2264- }
2265- SourceLoc lBraceLoc = consumeToken (tok::l_brace);
2258+ SourceLoc lBraceLoc;
22662259 SourceLoc rBraceLoc;
2267-
22682260 SmallVector<ASTNode, 8 > cases;
2261+
2262+ if (Status.isErrorOrHasCompletion ()) {
2263+ return makeParserResult (
2264+ Status, SwitchStmt::create (LabelInfo, SwitchLoc, SubjectExpr.get (),
2265+ lBraceLoc, cases, rBraceLoc,
2266+ /* EndLoc=*/ PreviousLoc, Context));
2267+ }
2268+
2269+ if (!consumeIf (tok::l_brace, lBraceLoc)) {
2270+ diagnose (Tok, diag::expected_lbrace_after_switch);
2271+ return makeParserResult (
2272+ Status, SwitchStmt::create (LabelInfo, SwitchLoc, SubjectExpr.get (),
2273+ lBraceLoc, cases, rBraceLoc,
2274+ /* EndLoc=*/ PreviousLoc, Context));
2275+ }
2276+
22692277 Status |= parseStmtCases (cases, /* IsActive=*/ true );
22702278
22712279 // We cannot have additional cases after a default clause. Complain on
@@ -2288,7 +2296,8 @@ ParserResult<Stmt> Parser::parseStmtSwitch(LabeledStmtInfo LabelInfo) {
22882296
22892297 return makeParserResult (
22902298 Status, SwitchStmt::create (LabelInfo, SwitchLoc, SubjectExpr.get (),
2291- lBraceLoc, cases, rBraceLoc, Context));
2299+ lBraceLoc, cases, rBraceLoc,
2300+ /* EndLoc=*/ rBraceLoc, Context));
22922301}
22932302
22942303ParserStatus
0 commit comments