Skip to content

Commit 28973f2

Browse files
committed
[libSyntax] Fix parsing of member declarations with trailing semicolon
1 parent c6a1109 commit 28973f2

File tree

5 files changed

+288
-255
lines changed

5 files changed

+288
-255
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,7 +2454,8 @@ Parser::parseDecl(ParseDeclOptions Flags,
24542454

24552455
ParserStatus Status;
24562456
bool PreviousHadSemi = true;
2457-
SyntaxParsingContext DeclListCtx(SyntaxContext, SyntaxKind::DeclList);
2457+
SyntaxParsingContext DeclListCtx(SyntaxContext,
2458+
SyntaxKind::MemberDeclList);
24582459
while (Tok.isNot(tok::pound_else, tok::pound_endif, tok::pound_elseif,
24592460
tok::eof)) {
24602461
if (Tok.is(tok::r_brace)) {
@@ -3103,7 +3104,6 @@ void Parser::diagnoseConsecutiveIDs(StringRef First, SourceLoc FirstLoc,
31033104
ParserStatus Parser::parseDeclItem(bool &PreviousHadSemi,
31043105
Parser::ParseDeclOptions Options,
31053106
llvm::function_ref<void(Decl*)> handler) {
3106-
SyntaxParsingContext DeclContext(SyntaxContext, SyntaxContextKind::Decl);
31073107
if (Tok.is(tok::semi)) {
31083108
// Consume ';' without preceding decl.
31093109
diagnose(Tok, diag::unexpected_separator, ";")
@@ -3128,9 +3128,15 @@ ParserStatus Parser::parseDeclItem(bool &PreviousHadSemi,
31283128
return LineDirectiveStatus;
31293129
}
31303130

3131-
auto Result = parseDecl(Options, handler);
3132-
if (Result.isParseError())
3133-
skipUntilDeclRBrace(tok::semi, tok::pound_endif);
3131+
ParserResult<Decl> Result;
3132+
SyntaxParsingContext DeclContext(SyntaxContext,
3133+
SyntaxKind::MemberDeclListItem);
3134+
{
3135+
SyntaxParsingContext DeclContext(SyntaxContext, SyntaxContextKind::Decl);
3136+
Result = parseDecl(Options, handler);
3137+
if (Result.isParseError())
3138+
skipUntilDeclRBrace(tok::semi, tok::pound_endif);
3139+
}
31343140
SourceLoc SemiLoc;
31353141
PreviousHadSemi = consumeIf(tok::semi, SemiLoc);
31363142
if (PreviousHadSemi && Result.isNonNull())
@@ -3149,7 +3155,7 @@ bool Parser::parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc,
31493155
ParserStatus Status;
31503156
bool PreviousHadSemi = true;
31513157
{
3152-
SyntaxParsingContext ListContext(SyntaxContext, SyntaxKind::DeclList);
3158+
SyntaxParsingContext ListContext(SyntaxContext, SyntaxKind::MemberDeclList);
31533159
while (Tok.isNot(tok::r_brace)) {
31543160
Status |= parseDeclItem(PreviousHadSemi, Options, handler);
31553161
if (Tok.isAny(tok::eof, tok::pound_endif, tok::pound_else,

test/Syntax/Inputs/serialize_multiple_decls.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"presence": "Present"
7272
},
7373
{
74-
"kind": "DeclList",
74+
"kind": "MemberDeclList",
7575
"layout": [],
7676
"presence": "Present"
7777
},
@@ -153,7 +153,7 @@
153153
"presence": "Present"
154154
},
155155
{
156-
"kind": "DeclList",
156+
"kind": "MemberDeclList",
157157
"layout": [],
158158
"presence": "Present"
159159
},

0 commit comments

Comments
 (0)