Index: clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp =================================================================== --- clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp +++ clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp @@ -30,12 +30,12 @@ return; // FIXME: Why is this happening? We might be losing contents here. - if (!ContentCache.getRawBuffer()) + llvm::Optional Data = ContentCache.getBufferDataIfLoaded(); + if (!Data) return; InMemoryFs.addFile(File->getName(), /*ModificationTime=*/0, - llvm::MemoryBuffer::getMemBufferCopy( - ContentCache.getRawBuffer()->getBuffer())); + llvm::MemoryBuffer::getMemBufferCopy(Data)); // Remove the file from the set of necessary files. FilesToRecord.erase(File); } Index: clang/include/clang/Basic/SourceManager.h =================================================================== --- clang/include/clang/Basic/SourceManager.h +++ clang/include/clang/Basic/SourceManager.h @@ -194,9 +194,23 @@ /// this content cache. This is used for performance analysis. llvm::MemoryBuffer::BufferKind getMemoryBufferKind() const; - /// Get the underlying buffer, returning NULL if the buffer is not - /// yet available. - const llvm::MemoryBuffer *getRawBuffer() const { return Buffer.get(); } + /// Return the buffer, only if it has been loaded. + /// specified FileID, returning None if it's not yet loaded. + /// + /// \param FID The file ID whose contents will be returned. + llvm::Optional getBufferIfLoaded() const { + if (Buffer) + return Buffer->getMemBufferRef(); + return None; + } + + /// Return a StringRef to the source buffer data, only if it has already + /// been loaded. + llvm::Optional getBufferDataIfLoaded() const { + if (Buffer) + return Buffer->getBuffer(); + return None; + } /// Set the buffer. void setBuffer(std::unique_ptr B) { @@ -207,10 +221,10 @@ /// Set the buffer to one that's not owned (or to nullptr). /// /// \pre Buffer cannot already be set. - void setUnownedBuffer(const llvm::MemoryBuffer *B) { + void setUnownedBuffer(llvm::Optional B) { assert(!Buffer && "Expected to be called right after construction"); if (B) - setBuffer(llvm::MemoryBuffer::getMemBuffer(B->getMemBufferRef())); + setBuffer(llvm::MemoryBuffer::getMemBuffer(*B)); } // If BufStr has an invalid BOM, returns the BOM name; otherwise, returns Index: clang/lib/Basic/SourceManager.cpp =================================================================== --- clang/lib/Basic/SourceManager.cpp +++ clang/lib/Basic/SourceManager.cpp @@ -153,7 +153,7 @@ // Check that the file's size is the same as in the file entry (which may // have come from a stat cache). - if (getRawBuffer()->getBufferSize() != (size_t)ContentsEntry->getSize()) { + if (Buffer->getBufferSize() != (size_t)ContentsEntry->getSize()) { if (Diag.isDiagnosticInFlight()) Diag.SetDelayedDiagnostic(diag::err_file_modified, ContentsEntry->getName()); @@ -361,7 +361,7 @@ Clone->BufferOverridden = Cache->BufferOverridden; Clone->IsFileVolatile = Cache->IsFileVolatile; Clone->IsTransient = Cache->IsTransient; - Clone->setUnownedBuffer(Cache->getRawBuffer()); + Clone->setUnownedBuffer(Cache->getBufferIfLoaded()); return Clone; }; @@ -474,7 +474,8 @@ SourceManager::getFakeContentCacheForRecovery() const { if (!FakeContentCacheForRecovery) { FakeContentCacheForRecovery = std::make_unique(); - FakeContentCacheForRecovery->setUnownedBuffer(getFakeBufferForRecovery()); + FakeContentCacheForRecovery->setUnownedBuffer( + getFakeBufferForRecovery()->getMemBufferRef()); } return FakeContentCacheForRecovery.get(); } @@ -749,10 +750,7 @@ if (!SLoc.isFile() || MyInvalid) return None; - if (const llvm::MemoryBuffer *Buf = - SLoc.getFile().getContentCache()->getRawBuffer()) - return Buf->getBuffer(); - return None; + return SLoc.getFile().getContentCache()->getBufferDataIfLoaded(); } llvm::Optional SourceManager::getBufferDataOrNone(FileID FID) const { Index: clang/lib/Serialization/ASTReader.cpp =================================================================== --- clang/lib/Serialization/ASTReader.cpp +++ clang/lib/Serialization/ASTReader.cpp @@ -1542,7 +1542,7 @@ = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter)); if (OverriddenBuffer && !ContentCache->BufferOverridden && ContentCache->ContentsEntry == ContentCache->OrigEntry && - !ContentCache->getRawBuffer()) { + !ContentCache->getBufferIfLoaded()) { auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); if (!Buffer) return true; Index: clang/lib/Serialization/ASTWriter.cpp =================================================================== --- clang/lib/Serialization/ASTWriter.cpp +++ clang/lib/Serialization/ASTWriter.cpp @@ -1468,7 +1468,7 @@ if (PP->getHeaderSearchInfo() .getHeaderSearchOpts() .ValidateASTInputFilesContent) { - auto *MemBuff = Cache->getRawBuffer(); + auto MemBuff = Cache->getBufferIfLoaded(); if (MemBuff) ContentHash = hash_value(MemBuff->getBuffer()); else