diff --git a/clang/include/clang/Basic/FileEntry.h b/clang/include/clang/Basic/FileEntry.h index 50110b8572ef4..1fcca4c6dfc3d 100644 --- a/clang/include/clang/Basic/FileEntry.h +++ b/clang/include/clang/Basic/FileEntry.h @@ -249,6 +249,23 @@ template <> struct PointerLikeTypeTraits { const clang::FileEntryRef::MapEntry *>::NumLowBitsAvailable; }; +template <> struct PointerLikeTypeTraits { + static inline void *getAsVoidPointer(clang::OptionalFileEntryRef File) { + if (!File) + return nullptr; + return PointerLikeTypeTraits::getAsVoidPointer(*File); + } + + static inline clang::OptionalFileEntryRef getFromVoidPointer(void *Ptr) { + if (!Ptr) + return std::nullopt; + return PointerLikeTypeTraits::getFromVoidPointer(Ptr); + } + + static constexpr int NumLowBitsAvailable = + PointerLikeTypeTraits::NumLowBitsAvailable; +}; + /// Specialisation of DenseMapInfo for FileEntryRef. template <> struct DenseMapInfo { static inline clang::FileEntryRef getEmptyKey() { diff --git a/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h b/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h index a97cd138d1596..e0f3570e5b2bc 100644 --- a/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h +++ b/clang/include/clang/Frontend/VerifyDiagnosticConsumer.h @@ -278,13 +278,13 @@ class VerifyDiagnosticConsumer: public DiagnosticConsumer, // These facilities are used for validation in debug builds. class UnparsedFileStatus { - llvm::PointerIntPair Data; + llvm::PointerIntPair Data; public: - UnparsedFileStatus(const FileEntry *File, bool FoundDirectives) + UnparsedFileStatus(OptionalFileEntryRef File, bool FoundDirectives) : Data(File, FoundDirectives) {} - const FileEntry *getFile() const { return Data.getPointer(); } + OptionalFileEntryRef getFile() const { return Data.getPointer(); } bool foundDirectives() const { return Data.getInt(); } }; diff --git a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp index d70f2a90a629c..ab8174f4f4db9 100644 --- a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp +++ b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp @@ -1030,12 +1030,12 @@ void VerifyDiagnosticConsumer::UpdateParsedFileStatus(SourceManager &SM, if (FID.isInvalid()) return; - const FileEntry *FE = SM.getFileEntryForID(FID); + OptionalFileEntryRef FE = SM.getFileEntryRefForID(FID); if (PS == IsParsed) { // Move the FileID from the unparsed set to the parsed set. UnparsedFiles.erase(FID); - ParsedFiles.insert(std::make_pair(FID, FE)); + ParsedFiles.insert(std::make_pair(FID, FE ? &FE->getFileEntry() : nullptr)); } else if (!ParsedFiles.count(FID) && !UnparsedFiles.count(FID)) { // Add the FileID to the unparsed set if we haven't seen it before. @@ -1076,17 +1076,17 @@ void VerifyDiagnosticConsumer::CheckDiagnostics() { // Iterate through list of unparsed files. for (const auto &I : UnparsedFiles) { const UnparsedFileStatus &Status = I.second; - const FileEntry *FE = Status.getFile(); + OptionalFileEntryRef FE = Status.getFile(); // Skip files that have been parsed via an alias. - if (FE && ParsedFileCache.count(FE)) + if (FE && ParsedFileCache.count(*FE)) continue; // Report a fatal error if this file contained directives. if (Status.foundDirectives()) { - llvm::report_fatal_error(Twine("-verify directives found after rather" - " than during normal parsing of ", - StringRef(FE ? FE->getName() : "(unknown)"))); + llvm::report_fatal_error("-verify directives found after rather" + " than during normal parsing of " + + (FE ? FE->getName() : "(unknown)")); } }