diff options
author | Jannick Kremer <jannick.kremer@mailbox.org> | 2025-04-23 18:41:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-23 18:41:29 +0200 |
commit | d7215c0ee2e4bca1ce87b956335ef6a2cddaf16f (patch) | |
tree | b0c7e24eaabae3f97af827e57292f79bd799b641 | |
parent | ea5449ddd5d03da034eccb80e5ba1e44ee02e243 (diff) | |
download | llvm-d7215c0ee2e4bca1ce87b956335ef6a2cddaf16f.zip llvm-d7215c0ee2e4bca1ce87b956335ef6a2cddaf16f.tar.gz llvm-d7215c0ee2e4bca1ce87b956335ef6a2cddaf16f.tar.bz2 |
[libclang/C++] Fix clang_File_isEqual for in-memory files (#135773)
Add tests for `clang_File_isEqual` (on-disk and in-memory)
-rw-r--r-- | clang/docs/ReleaseNotes.rst | 2 | ||||
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 2 | ||||
-rw-r--r-- | clang/unittests/libclang/LibclangTest.cpp | 49 |
3 files changed, 52 insertions, 1 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index bec670e..cf90218 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -683,6 +683,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. - Added ``clang_getFullyQualifiedName``, which provides fully qualified type names as diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index c8db6c9..2910483 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) { diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp index 6de4d02..b2a87d2 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)); +} |