llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Nathan Corbyn (cofibrant) <details> <summary>Changes</summary> We've had internal test failures since #<!-- -->166188 landed. The root cause is that `PPChainedCallbacks::EmbedFileNotFound()` incorrectly calls `PPCallbacks::FileNotFound()` not `PPCallbacks::EmbedFileNotFound()`. --- Full diff: https://github.com/llvm/llvm-project/pull/170293.diff 3 Files Affected: - (modified) clang/include/clang/Lex/PPCallbacks.h (+2-2) - (modified) clang/lib/Lex/PPDirectives.cpp (+6-5) - (modified) clang/unittests/Lex/PPCallbacksTest.cpp (+34) ``````````diff 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; } 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"; `````````` </details> https://github.com/llvm/llvm-project/pull/170293 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
