[clang] [Clang] Fix `PPChainedCallbacks::EmbedFileNotFound()` (PR #170293)
Nathan Corbyn via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 2 09:23:39 PST 2025
https://github.com/cofibrant updated https://github.com/llvm/llvm-project/pull/170293
>From 4a2ab1b1fd2d637b01f7e2ac22f5381aa01bc87c Mon Sep 17 00:00:00 2001
From: Nathan Corbyn <n_corbyn at apple.com>
Date: Tue, 2 Dec 2025 14:09:42 +0000
Subject: [PATCH 1/2] [Clang] Fix `PPChainedCallbacks::EmbedFileNotFound()`
---
clang/include/clang/Lex/PPCallbacks.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Lex/PPCallbacks.h b/clang/include/clang/Lex/PPCallbacks.h
index 313b730afbab8..e6120c5648798 100644
--- a/clang/include/clang/Lex/PPCallbacks.h
+++ b/clang/include/clang/Lex/PPCallbacks.h
@@ -499,10 +499,10 @@ class PPChainedCallbacks : public PPCallbacks {
}
bool EmbedFileNotFound(StringRef FileName) override {
- bool Skip = First->FileNotFound(FileName);
+ bool Skip = First->EmbedFileNotFound(FileName);
// Make sure to invoke the second callback, no matter if the first already
// returned true to skip the file.
- Skip |= Second->FileNotFound(FileName);
+ Skip |= Second->EmbedFileNotFound(FileName);
return Skip;
}
>From 61166af34dfa6f9244ec0e2b4094b4e5f895400a Mon Sep 17 00:00:00 2001
From: Nathan Corbyn <n_corbyn at apple.com>
Date: Tue, 2 Dec 2025 17:23:24 +0000
Subject: [PATCH 2/2] Add test case
---
clang/lib/Lex/PPDirectives.cpp | 11 ++++----
clang/unittests/Lex/PPCallbacksTest.cpp | 34 +++++++++++++++++++++++++
2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 891c8ab7f3155..1c3d9480651da 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -1397,11 +1397,12 @@ void Preprocessor::HandleDirective(Token &Result) {
return HandleIdentSCCSDirective(Result);
case tok::pp_sccs:
return HandleIdentSCCSDirective(Result);
- case tok::pp_embed:
- return HandleEmbedDirective(SavedHash.getLocation(), Result,
- getCurrentFileLexer()
- ? *getCurrentFileLexer()->getFileEntry()
- : static_cast<FileEntry *>(nullptr));
+ case tok::pp_embed: {
+ if (auto *CurrentFileLexer = getCurrentFileLexer())
+ if (auto FERef = CurrentFileLexer->getFileEntry())
+ return HandleEmbedDirective(SavedHash.getLocation(), Result, *FERef);
+ return HandleEmbedDirective(SavedHash.getLocation(), Result, nullptr);
+ }
case tok::pp_assert:
//isExtension = true; // FIXME: implement #assert
break;
diff --git a/clang/unittests/Lex/PPCallbacksTest.cpp b/clang/unittests/Lex/PPCallbacksTest.cpp
index 990689c6b1e45..f32fe5f6342be 100644
--- a/clang/unittests/Lex/PPCallbacksTest.cpp
+++ b/clang/unittests/Lex/PPCallbacksTest.cpp
@@ -463,6 +463,40 @@ TEST_F(PPCallbacksTest, FileNotFoundSkipped) {
ASSERT_EQ(0u, DiagConsumer->getNumErrors());
}
+TEST_F(PPCallbacksTest, EmbedFileNotFoundChained) {
+ const char *SourceText = "#embed \"notfound.h\"\n";
+
+ std::unique_ptr<llvm::MemoryBuffer> SourceBuf =
+ llvm::MemoryBuffer::getMemBuffer(SourceText);
+ SourceMgr.setMainFileID(SourceMgr.createFileID(std::move(SourceBuf)));
+
+ HeaderSearchOptions HSOpts;
+ TrivialModuleLoader ModLoader;
+ PreprocessorOptions PPOpts;
+ HeaderSearch HeaderInfo(HSOpts, SourceMgr, Diags, LangOpts, Target.get());
+
+ DiagnosticConsumer *DiagConsumer = new DiagnosticConsumer;
+ DiagnosticsEngine EmbedFileNotFoundDiags(DiagID, DiagOpts, DiagConsumer);
+ Preprocessor PP(PPOpts, EmbedFileNotFoundDiags, LangOpts, SourceMgr,
+ HeaderInfo, ModLoader, /*IILookup=*/nullptr,
+ /*OwnsHeaderSearch=*/false);
+ PP.Initialize(*Target);
+
+ class EmbedFileNotFoundCallbacks : public PPCallbacks {
+ public:
+ bool EmbedFileNotFound(StringRef FileName) override { return true; }
+ };
+
+ PP.addPPCallbacks(std::make_unique<EmbedFileNotFoundCallbacks>());
+ PP.addPPCallbacks(std::make_unique<EmbedFileNotFoundCallbacks>());
+
+ // Lex source text.
+ PP.EnterMainSourceFile();
+ PP.LexTokensUntilEOF();
+
+ ASSERT_EQ(0u, DiagConsumer->getNumErrors());
+}
+
TEST_F(PPCallbacksTest, OpenCLExtensionPragmaEnabled) {
const char* Source =
"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n";
More information about the cfe-commits
mailing list