https://github.com/anutosh491 created https://github.com/llvm/llvm-project/pull/127569
I was interested in recovering error for some use cases. Before the change ``` clang-repl> void foo() { int x = 5; <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression fatal error: too many errors emitted, stopping now [-ferror-limit=] ``` After the change ``` clang-repl> void foo() { int x = 5; <<< inputs >>>:1:1: error: expected '}' input_line_3:1:12: note: to match this '{' 1 | void foo() { int x = 5; | ^ error: Parsing failed. ``` Some other use cases could be the following Before the change ``` clang-repl> void (*test)() = [](){ if } In file included from <<< inputs >>>:1: input_line_1:1:27: error: expected '(' after 'if' 1 | void (*test)() = [](){ if } | ^ <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression <<< inputs >>>:1:1: error: expected expression fatal error: too many errors emitted, stopping now [-ferror-limit=] ``` After the change ``` clang-repl> void (*test)() = [](){ if } In file included from <<< inputs >>>:1: input_line_1:1:27: error: expected '(' after 'if' 1 | void (*test)() = [](){ if } | ^ <<< inputs >>>:1:1: error: expected '}' input_line_1:1:22: note: to match this '{' 1 | void (*test)() = [](){ if } | ^ input_line_1:1:28: error: expected ';' after top level declarator 1 | void (*test)() = [](){ if } | ^ | ; error: Parsing failed. ``` >From 5bda5cb946e8056a43e487e66487632729d37aee Mon Sep 17 00:00:00 2001 From: anutosh491 <andersonbhat...@gmail.com> Date: Tue, 18 Feb 2025 11:23:30 +0530 Subject: [PATCH] Address error recovery fixing infinite loop while parsing --- clang/lib/Parse/ParseStmt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index cd4504630f871..a044c8acab927 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -1253,7 +1253,7 @@ StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) { bool LastIsError = false; while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && - Tok.isNot(tok::eof)) { + Tok.isNot(tok::eof) && Tok.isNot(tok::annot_repl_input_end)) { if (Tok.is(tok::annot_pragma_unused)) { HandlePragmaUnused(); continue; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits