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

Reply via email to