diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp --- a/llvm/lib/Support/VirtualFileSystem.cpp +++ b/llvm/lib/Support/VirtualFileSystem.cpp @@ -2066,7 +2066,8 @@ "Overlay dir must be contained in RPath"); RPath = RPath.slice(OverlayDirLen, RPath.size()); } - writeEntry(path::filename(Entry.VPath), RPath); + if (!Entry.IsDirectory) + writeEntry(path::filename(Entry.VPath), RPath); } while (!DirStack.empty()) { diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp --- a/llvm/unittests/Support/VirtualFileSystemTest.cpp +++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp @@ -2238,3 +2238,39 @@ EXPECT_TRUE(FS->exists(_g.Path)); EXPECT_TRUE(FS->exists(_h.Path)); } + +TEST_F(VFSFromYAMLTest, YAMLVFSWriterTestHandleDirs) { + ScopedDir TestDirectory("virtual-file-system-test", /*Unique*/ true); + ScopedDir _a(TestDirectory + "/a"); + ScopedDir _b(TestDirectory + "/b"); + ScopedDir _c(TestDirectory + "/c"); + + vfs::YAMLVFSWriter VFSWriter; + VFSWriter.addDirectoryMapping(_a.Path, "//root/a"); + VFSWriter.addDirectoryMapping(_b.Path, "//root/b"); + VFSWriter.addDirectoryMapping(_c.Path, "//root/c"); + + std::string Buffer; + raw_string_ostream OS(Buffer); + VFSWriter.write(OS); + OS.flush(); + + // We didn't add a single file - only directories. + EXPECT_TRUE(Buffer.find("'type': 'file'") == std::string::npos); + + IntrusiveRefCntPtr Lower(new ErrorDummyFileSystem()); + Lower->addDirectory("//root/a"); + Lower->addDirectory("//root/b"); + Lower->addDirectory("//root/c"); + // canaries + Lower->addRegularFile("//root/a/a"); + Lower->addRegularFile("//root/b/b"); + Lower->addRegularFile("//root/c/c"); + + IntrusiveRefCntPtr FS = getFromYAMLRawString(Buffer, Lower); + ASSERT_TRUE(FS.get() != nullptr); + + EXPECT_FALSE(FS->exists(_a.Path + "/a")); + EXPECT_FALSE(FS->exists(_b.Path + "/b")); + EXPECT_FALSE(FS->exists(_c.Path + "/c")); +}