[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