forked from OSchip/llvm-project
Fixes errors with FS iterators caused by https://reviews.llvm.org/D44960
Summary: In https://reviews.llvm.org/D44960, file status check is executed every time a real file system directory iterator is constructed or incremented, and emits an error code. This change list fixes the errors in VirtualFileSystem caused by https://reviews.llvm.org/D44960. Patch by Yuke Liao (@liaoyuke). Reviewers: vsk, pcc, zturner, liaoyuke Reviewed By: vsk Subscribers: mgrang, cfe-commits Differential Revision: https://reviews.llvm.org/D45178 llvm-svn: 329223
This commit is contained in:
parent
e6cf0a3d9f
commit
e097567006
|
@ -286,24 +286,26 @@ class RealFSDirIter : public clang::vfs::detail::DirIterImpl {
|
|||
|
||||
public:
|
||||
RealFSDirIter(const Twine &Path, std::error_code &EC) : Iter(Path, EC) {
|
||||
if (!EC && Iter != llvm::sys::fs::directory_iterator()) {
|
||||
if (Iter != llvm::sys::fs::directory_iterator()) {
|
||||
llvm::sys::fs::file_status S;
|
||||
EC = llvm::sys::fs::status(Iter->path(), S, true);
|
||||
std::error_code ErrorCode = llvm::sys::fs::status(Iter->path(), S, true);
|
||||
CurrentEntry = Status::copyWithNewName(S, Iter->path());
|
||||
if (!EC)
|
||||
EC = ErrorCode;
|
||||
}
|
||||
}
|
||||
|
||||
std::error_code increment() override {
|
||||
std::error_code EC;
|
||||
Iter.increment(EC);
|
||||
if (EC) {
|
||||
return EC;
|
||||
} else if (Iter == llvm::sys::fs::directory_iterator()) {
|
||||
if (Iter == llvm::sys::fs::directory_iterator()) {
|
||||
CurrentEntry = Status();
|
||||
} else {
|
||||
llvm::sys::fs::file_status S;
|
||||
EC = llvm::sys::fs::status(Iter->path(), S, true);
|
||||
std::error_code ErrorCode = llvm::sys::fs::status(Iter->path(), S, true);
|
||||
CurrentEntry = Status::copyWithNewName(S, Iter->path());
|
||||
if (!EC)
|
||||
EC = ErrorCode;
|
||||
}
|
||||
return EC;
|
||||
}
|
||||
|
|
|
@ -442,16 +442,17 @@ TEST(VirtualFileSystemTest, BrokenSymlinkRealFSRecursiveIteration) {
|
|||
ScopedDir _dd(TestDirectory + "/d/d");
|
||||
ScopedDir _ddd(TestDirectory + "/d/d/d");
|
||||
ScopedLink _e("no_such_file", TestDirectory + "/e");
|
||||
std::vector<StringRef> Expected = {_b, _bb, _d, _dd, _ddd};
|
||||
|
||||
std::vector<std::string> Contents;
|
||||
std::vector<StringRef> ExpectedBrokenSymlinks = {_a, _ba, _bc, _c, _e};
|
||||
std::vector<StringRef> ExpectedNonBrokenSymlinks = {_b, _bb, _d, _dd, _ddd};
|
||||
std::vector<std::string> VisitedBrokenSymlinks;
|
||||
std::vector<std::string> VisitedNonBrokenSymlinks;
|
||||
std::error_code EC;
|
||||
for (vfs::recursive_directory_iterator I(*FS, Twine(TestDirectory), EC), E;
|
||||
I != E; I.increment(EC)) {
|
||||
// Skip broken symlinks.
|
||||
auto EC2 = std::make_error_code(std::errc::no_such_file_or_directory);
|
||||
if (EC == EC2) {
|
||||
EC.clear();
|
||||
VisitedBrokenSymlinks.push_back(I->getName());
|
||||
continue;
|
||||
}
|
||||
// For bot debugging.
|
||||
|
@ -467,13 +468,20 @@ TEST(VirtualFileSystemTest, BrokenSymlinkRealFSRecursiveIteration) {
|
|||
<< "EC message: " << EC2.message() << "\n";
|
||||
}
|
||||
ASSERT_FALSE(EC);
|
||||
Contents.push_back(I->getName());
|
||||
VisitedNonBrokenSymlinks.push_back(I->getName());
|
||||
}
|
||||
|
||||
// Check sorted contents.
|
||||
llvm::sort(Contents.begin(), Contents.end());
|
||||
EXPECT_EQ(Expected.size(), Contents.size());
|
||||
EXPECT_TRUE(std::equal(Contents.begin(), Contents.end(), Expected.begin()));
|
||||
// Check visited file names.
|
||||
std::sort(VisitedBrokenSymlinks.begin(), VisitedBrokenSymlinks.end());
|
||||
std::sort(VisitedNonBrokenSymlinks.begin(), VisitedNonBrokenSymlinks.end());
|
||||
EXPECT_EQ(ExpectedBrokenSymlinks.size(), VisitedBrokenSymlinks.size());
|
||||
EXPECT_TRUE(std::equal(VisitedBrokenSymlinks.begin(),
|
||||
VisitedBrokenSymlinks.end(),
|
||||
ExpectedBrokenSymlinks.begin()));
|
||||
EXPECT_EQ(ExpectedNonBrokenSymlinks.size(), VisitedNonBrokenSymlinks.size());
|
||||
EXPECT_TRUE(std::equal(VisitedNonBrokenSymlinks.begin(),
|
||||
VisitedNonBrokenSymlinks.end(),
|
||||
ExpectedNonBrokenSymlinks.begin()));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue