Author: Devajith Date: 2026-03-04T12:15:59+02:00 New Revision: 9cc0df99de853a3cdf778c0c33e4fb5050c46c5b
URL: https://github.com/llvm/llvm-project/commit/9cc0df99de853a3cdf778c0c33e4fb5050c46c5b DIFF: https://github.com/llvm/llvm-project/commit/9cc0df99de853a3cdf778c0c33e4fb5050c46c5b.diff LOG: [clang-repl] Create virtual files for `input_line_N` buffers (#182044) Instead of using memory buffers without file backing, this patch `input_line_N` buffers as virtual files. This patch enables us to use input line numbers when verifying tests `clang-repl`. Co-authored-by: Vassil Vassilev <[email protected]> Added: clang/test/Interpreter/verify-diagnostics.cpp Modified: clang/lib/Frontend/VerifyDiagnosticConsumer.cpp clang/lib/Interpreter/IncrementalParser.cpp Removed: ################################################################################ diff --git a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp index c8895da5a0f11..0eea56d1e7e2c 100644 --- a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp +++ b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp @@ -516,6 +516,15 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, bool MatchAnyLine = false; if (!PH.Next("@")) { ExpectedLoc = Pos; + + // If an implicit directive is found in an incremental input buffer, allow + // it to match any other incremental input buffer + if (PP->isIncrementalProcessingEnabled()) { + StringRef CurrentBufferName = + SM.getBufferOrFake(SM.getFileID(Pos)).getBufferIdentifier(); + if (CurrentBufferName.starts_with("input_line_")) + MatchAnyFileAndLine = true; + } } else { PH.Advance(); unsigned Line = 0; @@ -552,10 +561,17 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, MatchAnyLine = true; ExpectedLoc = SourceLocation(); } else { - // Lookup file via Preprocessor, like a #include. - OptionalFileEntryRef File = - PP->LookupFile(Pos, Filename, false, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr); + OptionalFileEntryRef File; + if (PP->isIncrementalProcessingEnabled() && + Filename.starts_with("input_line_")) { + // Check if it came from the prompt + File = SM.getFileManager().getOptionalFileRef(Filename); + } else { + // Lookup file via Preprocessor, like a #include. + File = + PP->LookupFile(Pos, Filename, false, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr); + } if (!File) { Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_missing_file) diff --git a/clang/lib/Interpreter/IncrementalParser.cpp b/clang/lib/Interpreter/IncrementalParser.cpp index 1329391fd0904..16a954f3c15e7 100644 --- a/clang/lib/Interpreter/IncrementalParser.cpp +++ b/clang/lib/Interpreter/IncrementalParser.cpp @@ -131,8 +131,17 @@ IncrementalParser::Parse(llvm::StringRef input) { SourceLocation NewLoc = SM.getLocForStartOfFile(SM.getMainFileID()); // Create FileID for the current buffer. - FileID FID = SM.createFileID(std::move(MB), SrcMgr::C_User, /*LoadedID=*/0, - /*LoadedOffset=*/0, NewLoc); + FileID FID; + // Create FileEntry and FileID for the current buffer. + FileEntryRef FE = SM.getFileManager().getVirtualFileRef( + SourceName.str(), InputSize, 0 /* mod time*/); + SM.overrideFileContents(FE, std::move(MB)); + + // Ensure HeaderFileInfo exists before lookup to prevent assertion + HeaderSearch &HS = PP.getHeaderSearchInfo(); + HS.getFileInfo(FE); + + FID = SM.createFileID(FE, NewLoc, SrcMgr::C_User); // NewLoc only used for diags. if (PP.EnterSourceFile(FID, /*DirLookup=*/nullptr, NewLoc)) diff --git a/clang/test/Interpreter/verify-diagnostics.cpp b/clang/test/Interpreter/verify-diagnostics.cpp new file mode 100644 index 0000000000000..7187a77379846 --- /dev/null +++ b/clang/test/Interpreter/verify-diagnostics.cpp @@ -0,0 +1,16 @@ +// REQUIRES: host-supports-jit +// RUN: cat %s | clang-repl -Xcc -Xclang -Xcc -verify + +auto x = unknown_val; +// expected-error@input_line_4:1 {{use of undeclared identifier 'unknown_val'}} + +int get_int() { return 42; } +char* ptr = get_int(); +// expected-error@input_line_8:1 {{cannot initialize a variable of type 'char *' with an rvalue of type 'int'}} + +// Verify without input_line_* +int y = ; +// expected-error {{expected expression}} + +const char* a = "test"; // expected-note {{previous definition is here}} +const char* a = ""; // expected-error {{redefinition of 'a'}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
