Skip to content

Commit c0d1301

Browse files
Only doing pattern matching if token is not a keywork or if is a possible identifier
1 parent 1b149f0 commit c0d1301

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5767,11 +5767,13 @@ Parser::parseDeclEnumCase(ParseDeclOptions Flags,
57675767
SourceLoc TokLoc = Tok.getLoc();
57685768
StringRef TokText = Tok.getText();
57695769

5770-
// For recovery, see if the user typed something resembling a switch
5771-
// "case" label.
5772-
llvm::SaveAndRestore<decltype(InVarOrLetPattern)>
5773-
T(InVarOrLetPattern, Parser::IVOLP_InMatchingPattern);
5774-
parseMatchingPattern(/*isExprBasic*/false);
5770+
if (!NameIsKeyword || Tok.isIdentifierOrUnderscore()) {
5771+
// For recovery, see if the user typed something resembling a switch
5772+
// "case" label.
5773+
llvm::SaveAndRestore<decltype(InVarOrLetPattern)>
5774+
T(InVarOrLetPattern, Parser::IVOLP_InMatchingPattern);
5775+
parseMatchingPattern(/*isExprBasic*/false);
5776+
}
57755777

57765778
if (consumeIf(tok::colon)) {
57775779
diagnose(CaseLoc, diag::case_outside_of_switch, "case");

test/Parse/enum.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ enum Recovery2 {
115115
enum Recovery3 {
116116
case UE2(Void): // expected-error {{'case' label can only appear inside a 'switch' statement}}
117117
}
118-
enum Recovery4 {
119-
case Self Self // expected-error {{keyword 'Self' cannot be used as an identifier here}} expected-note {{if this name is unavoidable, use backticks to escape it}} {{8-12=`Self`}}
118+
enum Recovery4 { // expected-note {{in declaration of 'Recovery4'}}
119+
case Self Self // expected-error {{keyword 'Self' cannot be used as an identifier here}} expected-note {{if this name is unavoidable, use backticks to escape it}} {{8-12=`Self`}} expected-error {{consecutive declarations on a line must be separated by ';'}} {{12-12=;}} expected-error {{expected declaration}}
120120
}
121121
enum Recovery5 {
122122
case .UE3 // expected-error {{extraneous '.' in enum 'case' declaration}} {{8-9=}}
@@ -556,10 +556,10 @@ enum SE0155 {
556556
// SR-11261
557557
enum SR11261 {
558558
case identifier
559-
case operator // expected-error {{keyword 'operator' cannot be used as an identifier here}} expected-note {{if this name is unavoidable, use backticks to escape it}} {{8-16=`operator`}} expected-error {{expected pattern}}
559+
case operator // expected-error {{keyword 'operator' cannot be used as an identifier here}} expected-note {{if this name is unavoidable, use backticks to escape it}} {{8-16=`operator`}}
560560
case identifier2
561561
}
562562

563563
enum SR11261_1 {
564-
case a, b, c, func, d // expected-error {{keyword 'func' cannot be used as an identifier here}} expected-note {{if this name is unavoidable, use backticks to escape it}} {{17-21=`func`}} expected-error {{expected pattern}}
564+
case a, b, c, func, d // expected-error {{keyword 'func' cannot be used as an identifier here}} expected-note {{if this name is unavoidable, use backticks to escape it}} {{17-21=`func`}}
565565
}

0 commit comments

Comments
 (0)