From d046082c501d3501a24c143dff2cfa42939549b9 Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 17 Jan 2025 14:52:28 -0800 Subject: Add diagnostic for function body followed by a `;`;. (#6122) --- source/slang/slang-parser.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'source/slang/slang-parser.cpp') diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 98cfd121c..81619b700 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -1802,9 +1802,17 @@ public: /// Parse an optional body statement for a declaration that can have a body. static Stmt* parseOptBody(Parser* parser) { - if (AdvanceIf(parser, TokenType::Semicolon)) + Token semiColonToken; + if (AdvanceIf(parser, TokenType::Semicolon, &semiColonToken)) { // empty body + // if we see a `{` after a `;`, it is very likely an user error to + // have the `;`, so we will provide a better diagnostic for it. + if (peekTokenType(parser) == TokenType::LBrace) + { + parser->sink->diagnose(semiColonToken.loc, Diagnostics::unexpectedBodyAfterSemicolon); + return parser->parseBlockStatement(); + } return nullptr; } else @@ -4841,6 +4849,13 @@ static DeclBase* ParseDeclWithModifiers( // We shouldn't be seeing an LBrace or an LParent when expecting a decl. // However recovery logic may lead us here. In this case we just // skip the whole `{}` block and return an empty decl. + if (!parser->isRecovering) + { + parser->sink->diagnose( + loc, + Diagnostics::unexpectedToken, + parser->tokenReader.peekToken()); + } SkipBalancedToken(&parser->tokenReader); decl = parser->astBuilder->create(); decl->loc = loc; -- cgit v1.2.3