[clang] [clang-repl] Address error recovery fixing infinite loop while parsing (PR #127569)

Anutosh Bhat via cfe-commits cfe-commits at lists.llvm.org
Wed Feb 11 00:11:17 PST 2026


================
@@ -2823,7 +2823,13 @@ void PragmaSupportHandler<StartTok, EndTok, UnexpectedDiag>::HandlePragma(
   Tok.setKind(StartTok);
   Tok.setLocation(Introducer.Loc);
 
-  while (Tok.isNot(tok::eod) && Tok.isNot(tok::eof)) {
+  auto IsAtInputEnd = [&PP](const Token &T) {
+    if (PP.getLangOpts().IncrementalExtensions)
+      return T.is(tok::annot_repl_input_end);
+    return T.is(tok::eof);
+  };
----------------
anutosh491 wrote:

Because this code runs in a PragmaHandler (preprocessor-level), not inside the Parser class, so it has no Parser instance to call the Parser::isAtInputEnd() on and must instead use a local/PP-based end-of-input check otherwise you get a compile error

```
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp: In member function ‘void {anonymous}::PragmaSupportHandler<StartTok, EndTok, UnexpectedDiag>::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&)’:
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp:2741:34: error: there are no arguments to ‘isAtInputEnd’ that depend on a template parameter, so a declaration of ‘isAtInputEnd’ must be available [-fpermissive]
 2741 |   while (Tok.isNot(tok::eod) && !isAtInputEnd(Tok)) {
      |                                  ^~~~~~~~~~~~
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp:2741:34: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
[ 37%] Building CXX object tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseTentative.cpp.o
[ 37%] Building CXX object tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/Parser.cpp.o
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp: In instantiation of ‘void {anonymous}::PragmaSupportHandler<StartTok, EndTok, UnexpectedDiag>::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&) [with clang::tok::TokenKind StartTok = clang::tok::annot_pragma_openacc; clang::tok::TokenKind EndTok = clang::tok::annot_pragma_openacc_end; unsigned int UnexpectedDiag = 1533]’:
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp:212:8:   required from here
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp:2741:46: error: ‘isAtInputEnd’ was not declared in this scope
 2741 |   while (Tok.isNot(tok::eod) && !isAtInputEnd(Tok)) {
      |                                  ~~~~~~~~~~~~^~~~~
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp: In instantiation of ‘void {anonymous}::PragmaSupportHandler<StartTok, EndTok, UnexpectedDiag>::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer, clang::Token&) [with clang::tok::TokenKind StartTok = clang::tok::annot_pragma_openmp; clang::tok::TokenKind EndTok = clang::tok::annot_pragma_openmp_end; unsigned int UnexpectedDiag = 1826]’:
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp:212:8:   required from here
/build/anutosh491/llvm-project/clang/lib/Parse/ParsePragma.cpp:2741:46: error: ‘isAtInputEnd’ was not declared in this scope
gmake[3]: *** [tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/build.make:230: tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParsePragma.cpp.o] Error 1
```

Other checks in the file are fine though

https://github.com/llvm/llvm-project/pull/127569


More information about the cfe-commits mailing list