[clang] [libclang/C++] Fix clang_File_isEqual for in-memory files (PR #135773)
Jannick Kremer via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 15 03:44:31 PDT 2025
https://github.com/DeinAlptraum updated https://github.com/llvm/llvm-project/pull/135773
>From 62dcfb1cb9bd0918bd471fddc1ffd849c2d604ac Mon Sep 17 00:00:00 2001
From: Jannick Kremer <jannick.kremer at mailbox.org>
Date: Tue, 15 Apr 2025 19:17:43 +0900
Subject: [PATCH 1/2] [libclang/C++] Fix clang_File_isEqual for in-memory files
Add tests for clang_File_isEqual (on-disk and in-memory)
---
clang/unittests/libclang/LibclangTest.cpp | 49 +++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp
index 6de4d02bf74f4..b2a87d240e56e 100644
--- a/clang/unittests/libclang/LibclangTest.cpp
+++ b/clang/unittests/libclang/LibclangTest.cpp
@@ -1410,3 +1410,52 @@ TEST_F(LibclangRewriteTest, RewriteRemove) {
ASSERT_EQ(clang_CXRewriter_overwriteChangedFiles(Rew), 0);
EXPECT_EQ(getFileContent(Filename), "int () { return 0; }");
}
+
+TEST_F(LibclangParseTest, FileEqual) {
+ std::string AInc = "a.inc", BInc = "b.inc", Main = "main.cpp";
+ WriteFile(Main, "int a[] = {\n"
+ " #include \"a.inc\"\n"
+ "};\n"
+ "int b[] = {\n"
+ " #include \"b.inc\"\n"
+ "};");
+ WriteFile(AInc, "1,2,3");
+ WriteFile(BInc, "1,2,3");
+
+ ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, nullptr,
+ 0, TUFlags);
+
+ CXFile AFile = clang_getFile(ClangTU, AInc.c_str()),
+ AFile2 = clang_getFile(ClangTU, AInc.c_str()),
+ BFile = clang_getFile(ClangTU, BInc.c_str()),
+ MainFile = clang_getFile(ClangTU, Main.c_str());
+
+ ASSERT_FALSE(clang_File_isEqual(MainFile, AFile));
+ ASSERT_FALSE(clang_File_isEqual(AFile, BFile));
+ ASSERT_TRUE(clang_File_isEqual(AFile, AFile2));
+}
+
+TEST_F(LibclangParseTest, FileEqualInMemory) {
+ std::string AInc = "a.inc", BInc = "b.inc", Main = "main.cpp";
+ MapUnsavedFile(Main, "int a[] = {\n"
+ " #include \"a.inc\"\n"
+ "};\n"
+ "int b[] = {\n"
+ " #include \"b.inc\"\n"
+ "};");
+ MapUnsavedFile(AInc, "1,2,3");
+ MapUnsavedFile(BInc, "1,2,3");
+
+ ClangTU = clang_parseTranslationUnit(Index, UnsavedFiles[0].Filename, nullptr,
+ 0, &UnsavedFiles.front(),
+ UnsavedFiles.size(), TUFlags);
+
+ CXFile AFile = clang_getFile(ClangTU, UnsavedFiles[1].Filename),
+ AFile2 = clang_getFile(ClangTU, UnsavedFiles[1].Filename),
+ BFile = clang_getFile(ClangTU, UnsavedFiles[2].Filename),
+ MainFile = clang_getFile(ClangTU, UnsavedFiles[0].Filename);
+
+ ASSERT_FALSE(clang_File_isEqual(MainFile, AFile));
+ ASSERT_FALSE(clang_File_isEqual(AFile, BFile));
+ ASSERT_TRUE(clang_File_isEqual(AFile, AFile2));
+}
>From a98d0ff8a25f394abdea96fb79168e09185fb2d8 Mon Sep 17 00:00:00 2001
From: Jannick Kremer <jannick.kremer at mailbox.org>
Date: Tue, 15 Apr 2025 19:44:10 +0900
Subject: [PATCH 2/2] Add actual fix and release note
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/tools/libclang/CIndex.cpp | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 5b702b56038f7..08cb4a1144d72 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -557,6 +557,8 @@ clang-format
libclang
--------
+- Fixed a bug in ``clang_File_isEqual`` that sometimes led to different
+ in-memory files to be considered as equal.
- Added ``clang_visitCXXMethods``, which allows visiting the methods
of a class.
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index c8db6c92bb4d4..2910483152b17 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -5170,7 +5170,7 @@ int clang_File_isEqual(CXFile file1, CXFile file2) {
FileEntryRef FEnt1 = *cxfile::getFileEntryRef(file1);
FileEntryRef FEnt2 = *cxfile::getFileEntryRef(file2);
- return FEnt1.getUniqueID() == FEnt2.getUniqueID();
+ return FEnt1 == FEnt2;
}
CXString clang_File_tryGetRealPathName(CXFile SFile) {
More information about the cfe-commits
mailing list