diff options
author | Ben Langmuir <blangmuir@apple.com> | 2022-08-05 10:56:56 -0700 |
---|---|---|
committer | Ben Langmuir <blangmuir@apple.com> | 2022-08-05 12:23:38 -0700 |
commit | d038bb196c51dcf80cbe771f4229b4e227c6c5b6 (patch) | |
tree | c218ad86c2d240401c3848f2ccbfd2372a77f2e1 | |
parent | 3e0e5568a6a8c744d26f79a1e55360fe2655867c (diff) |
[clang] Fix redirection behaviour for cached FileEntryRef
In 6a79e2ff1989b we changed Filemanager::getEntryRef() to return the
redirecting FileEntryRef instead of looking through the redirection.
This commit fixes the case when looking up a cached file path to also
return the redirecting FileEntryRef. This mainly affects the behaviour
of calling getNameAsRequested() on the resulting entry ref.
Differential Revision: https://reviews.llvm.org/D131273
-rw-r--r-- | clang/lib/Basic/FileManager.cpp | 8 | ||||
-rw-r--r-- | clang/unittests/Basic/FileManagerTest.cpp | 6 |
2 files changed, 7 insertions, 7 deletions
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index cb719762ec7c..4ef25358ec82 100644 --- a/clang/lib/Basic/FileManager.cpp +++ b/clang/lib/Basic/FileManager.cpp @@ -212,13 +212,7 @@ FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) { if (!SeenFileInsertResult.first->second) return llvm::errorCodeToError( SeenFileInsertResult.first->second.getError()); - // Construct and return and FileEntryRef, unless it's a redirect to another - // filename. - FileEntryRef::MapValue Value = *SeenFileInsertResult.first->second; - if (LLVM_LIKELY(Value.V.is<FileEntry *>())) - return FileEntryRef(*SeenFileInsertResult.first); - return FileEntryRef(*reinterpret_cast<const FileEntryRef::MapEntry *>( - Value.V.get<const void *>())); + return FileEntryRef(*SeenFileInsertResult.first); } // We've not seen this before. Fill it in. diff --git a/clang/unittests/Basic/FileManagerTest.cpp b/clang/unittests/Basic/FileManagerTest.cpp index 419c497e95d6..6fe4a3d65d17 100644 --- a/clang/unittests/Basic/FileManagerTest.cpp +++ b/clang/unittests/Basic/FileManagerTest.cpp @@ -340,6 +340,7 @@ TEST_F(FileManagerTest, getFileRefEquality) { auto F1Again = manager.getFileRef("dir/f1.cpp"); auto F1Also = manager.getFileRef("dir/f1-also.cpp"); auto F1Redirect = manager.getFileRef("dir/f1-redirect.cpp"); + auto F1RedirectAgain = manager.getFileRef("dir/f1-redirect.cpp"); auto F2 = manager.getFileRef("dir/f2.cpp"); // Check Expected<FileEntryRef> for error. @@ -347,6 +348,7 @@ TEST_F(FileManagerTest, getFileRefEquality) { ASSERT_FALSE(!F1Also); ASSERT_FALSE(!F1Again); ASSERT_FALSE(!F1Redirect); + ASSERT_FALSE(!F1RedirectAgain); ASSERT_FALSE(!F2); // Check names. @@ -354,6 +356,7 @@ TEST_F(FileManagerTest, getFileRefEquality) { EXPECT_EQ("dir/f1.cpp", F1Again->getName()); EXPECT_EQ("dir/f1-also.cpp", F1Also->getName()); EXPECT_EQ("dir/f1.cpp", F1Redirect->getName()); + EXPECT_EQ("dir/f1.cpp", F1RedirectAgain->getName()); EXPECT_EQ("dir/f2.cpp", F2->getName()); EXPECT_EQ("dir/f1.cpp", F1->getNameAsRequested()); @@ -363,6 +366,7 @@ TEST_F(FileManagerTest, getFileRefEquality) { EXPECT_EQ(&F1->getFileEntry(), *F1); EXPECT_EQ(*F1, &F1->getFileEntry()); EXPECT_EQ(&F1->getFileEntry(), &F1Redirect->getFileEntry()); + EXPECT_EQ(&F1->getFileEntry(), &F1RedirectAgain->getFileEntry()); EXPECT_NE(&F2->getFileEntry(), *F1); EXPECT_NE(*F1, &F2->getFileEntry()); @@ -371,6 +375,7 @@ TEST_F(FileManagerTest, getFileRefEquality) { EXPECT_EQ(*F1, *F1Again); EXPECT_EQ(*F1, *F1Redirect); EXPECT_EQ(*F1Also, *F1Redirect); + EXPECT_EQ(*F1, *F1RedirectAgain); EXPECT_NE(*F2, *F1); EXPECT_NE(*F2, *F1Also); EXPECT_NE(*F2, *F1Again); @@ -381,6 +386,7 @@ TEST_F(FileManagerTest, getFileRefEquality) { EXPECT_FALSE(F1->isSameRef(*F1Redirect)); EXPECT_FALSE(F1->isSameRef(*F1Also)); EXPECT_FALSE(F1->isSameRef(*F2)); + EXPECT_TRUE(F1Redirect->isSameRef(*F1RedirectAgain)); } // getFile() Should return the same entry as getVirtualFile if the file actually |