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.kre...@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.kre...@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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits