Skip to content

Commit 3203f9c

Browse files
benlangmuirbnbarham
authored andcommitted
[clang] Fix redirection behaviour for cached FileEntryRef
In 6a79e2f 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
1 parent 1804e2d commit 3203f9c

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

clang/lib/Basic/FileManager.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,7 @@ FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) {
213213
if (!SeenFileInsertResult.first->second)
214214
return llvm::errorCodeToError(
215215
SeenFileInsertResult.first->second.getError());
216-
// Construct and return and FileEntryRef, unless it's a redirect to another
217-
// filename.
218-
FileEntryRef::MapValue Value = *SeenFileInsertResult.first->second;
219-
if (LLVM_LIKELY(Value.V.is<FileEntry *>()))
220-
return FileEntryRef(*SeenFileInsertResult.first);
221-
return FileEntryRef(*reinterpret_cast<const FileEntryRef::MapEntry *>(
222-
Value.V.get<const void *>()));
216+
return FileEntryRef(*SeenFileInsertResult.first);
223217
}
224218

225219
// We've not seen this before. Fill it in.

clang/unittests/Basic/FileManagerTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,20 +344,23 @@ TEST_F(FileManagerTest, getFileRefEquality) {
344344
auto F1Again = manager.getFileRef("dir/f1.cpp");
345345
auto F1Also = manager.getFileRef("dir/f1-also.cpp");
346346
auto F1Redirect = manager.getFileRef("dir/f1-redirect.cpp");
347+
auto F1RedirectAgain = manager.getFileRef("dir/f1-redirect.cpp");
347348
auto F2 = manager.getFileRef("dir/f2.cpp");
348349

349350
// Check Expected<FileEntryRef> for error.
350351
ASSERT_FALSE(!F1);
351352
ASSERT_FALSE(!F1Also);
352353
ASSERT_FALSE(!F1Again);
353354
ASSERT_FALSE(!F1Redirect);
355+
ASSERT_FALSE(!F1RedirectAgain);
354356
ASSERT_FALSE(!F2);
355357

356358
// Check names.
357359
EXPECT_EQ("dir/f1.cpp", F1->getName());
358360
EXPECT_EQ("dir/f1.cpp", F1Again->getName());
359361
EXPECT_EQ("dir/f1-also.cpp", F1Also->getName());
360362
EXPECT_EQ("dir/f1.cpp", F1Redirect->getName());
363+
EXPECT_EQ("dir/f1.cpp", F1RedirectAgain->getName());
361364
EXPECT_EQ("dir/f2.cpp", F2->getName());
362365

363366
EXPECT_EQ("dir/f1.cpp", F1->getNameAsRequested());
@@ -367,6 +370,7 @@ TEST_F(FileManagerTest, getFileRefEquality) {
367370
EXPECT_EQ(&F1->getFileEntry(), *F1);
368371
EXPECT_EQ(*F1, &F1->getFileEntry());
369372
EXPECT_EQ(&F1->getFileEntry(), &F1Redirect->getFileEntry());
373+
EXPECT_EQ(&F1->getFileEntry(), &F1RedirectAgain->getFileEntry());
370374
EXPECT_NE(&F2->getFileEntry(), *F1);
371375
EXPECT_NE(*F1, &F2->getFileEntry());
372376

@@ -375,6 +379,7 @@ TEST_F(FileManagerTest, getFileRefEquality) {
375379
EXPECT_EQ(*F1, *F1Again);
376380
EXPECT_EQ(*F1, *F1Redirect);
377381
EXPECT_EQ(*F1Also, *F1Redirect);
382+
EXPECT_EQ(*F1, *F1RedirectAgain);
378383
EXPECT_NE(*F2, *F1);
379384
EXPECT_NE(*F2, *F1Also);
380385
EXPECT_NE(*F2, *F1Again);
@@ -385,6 +390,7 @@ TEST_F(FileManagerTest, getFileRefEquality) {
385390
EXPECT_FALSE(F1->isSameRef(*F1Redirect));
386391
EXPECT_FALSE(F1->isSameRef(*F1Also));
387392
EXPECT_FALSE(F1->isSameRef(*F2));
393+
EXPECT_TRUE(F1Redirect->isSameRef(*F1RedirectAgain));
388394
}
389395

390396
// getFile() Should return the same entry as getVirtualFile if the file actually

0 commit comments

Comments
 (0)