Index: include/llvm/Support/VirtualFileSystem.h =================================================================== --- include/llvm/Support/VirtualFileSystem.h +++ include/llvm/Support/VirtualFileSystem.h @@ -67,6 +67,7 @@ static Status copyWithNewName(const Status &In, StringRef NewName); static Status copyWithNewName(const llvm::sys::fs::file_status &In, StringRef NewName); + static Status copyWithNewSize(const Status &In, uint64_t Size); /// Returns the name that should be used for this file or directory. StringRef getName() const { return Name; } Index: lib/Support/VirtualFileSystem.cpp =================================================================== --- lib/Support/VirtualFileSystem.cpp +++ lib/Support/VirtualFileSystem.cpp @@ -85,6 +85,12 @@ In.permissions()); } +Status Status::copyWithNewSize(const Status &In, uint64_t Size) { + return Status(In.getName(), In.getUniqueID(), In.getLastModificationTime(), + In.getUser(), In.getGroup(), Size, In.getType(), + In.getPermissions()); +} + bool Status::equivalent(const Status &Other) const { assert(isStatusKnown() && Other.isStatusKnown()); return getUniqueID() == Other.getUniqueID(); Index: unittests/Support/VirtualFileSystemTest.cpp =================================================================== --- unittests/Support/VirtualFileSystemTest.cpp +++ unittests/Support/VirtualFileSystemTest.cpp @@ -1775,3 +1775,14 @@ checkContents(FS->dir_begin("//root/foo", EC), {"//root/foo/a", "//root/foo/b"}); } + +TEST_F(InMemoryFileSystemTest, CopyStatusWithSize) { + FS.addFile("/a", 0, MemoryBuffer::getMemBuffer("a")); + auto Stat = FS.status("/a"); + ASSERT_TRUE(Stat); + auto CopyStat = vfs::Status::copyWithNewSize(*Stat, 2); + ASSERT_EQ(CopyStat.getSize(), 2u); + ASSERT_NE(CopyStat.getSize(), Stat->getSize()); + ASSERT_EQ(CopyStat.getName(), Stat->getName()); + ASSERT_EQ(CopyStat.getUniqueID(), Stat->getUniqueID()); +}