Author: Luca Di Sera Date: 2022-09-02T09:54:10-04:00 New Revision: e7d9917a60dca60da05d0114de9858ed7acb015c
URL: https://github.com/llvm/llvm-project/commit/e7d9917a60dca60da05d0114de9858ed7acb015c DIFF: https://github.com/llvm/llvm-project/commit/e7d9917a60dca60da05d0114de9858ed7acb015c.diff LOG: Expose QualType::getNonReferenceType in libclang The method is now wrapped by clang_getNonReferenceType. A declaration for clang_getNonReferenceType was added to clang-c/Index.h to expose it to user of the library. An implementation for clang_getNonReferenceType was introduced in CXType.cpp, wrapping the equivalent method of the underlying QualType of a CXType. An export symbol for the new function was added to libclang.map under the LLVM_16 version entry. A test was added to LibclangTest.cpp that tests the removal of ref-qualifiers for some CXTypes. The release-notes for the clang project was updated to include a notification of the new addition under the "libclang" section. Differential Revision: https://reviews.llvm.org/D133195 Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang-c/Index.h clang/tools/libclang/CXType.cpp clang/tools/libclang/libclang.map clang/unittests/libclang/LibclangTest.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 2a92f65cc04fc..41371fe0e04f2 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -289,6 +289,8 @@ libclang - Introduced the new function `clang_getUnqualifiedType`, which mimics the behavior of `QualType::getUnqualifiedType` for `CXType`. +- Introduced the new function `clang_getNonReferenceType`, which mimics + the behavior of `QualType::getNonReferenceType` for `CXType`. Static Analyzer --------------- diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 41efc57823d3c..c0dbad869114b 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -3797,6 +3797,17 @@ CINDEX_LINKAGE CXType clang_getPointeeType(CXType T); */ CINDEX_LINKAGE CXType clang_getUnqualifiedType(CXType CT); +/** + * For reference types (e.g., "const int&"), returns the type that the + * reference refers to (e.g "const int"). + * + * Otherwise, returns the type itself. + * + * A type that has kind \c CXType_LValueReference or + * \c CXType_RValueReference is a reference type. + */ +CINDEX_LINKAGE CXType clang_getNonReferenceType(CXType CT); + /** * Return the cursor for the declaration of the given type. */ diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp index e50a471b94098..a62163c64d097 100644 --- a/clang/tools/libclang/CXType.cpp +++ b/clang/tools/libclang/CXType.cpp @@ -488,6 +488,10 @@ CXType clang_getUnqualifiedType(CXType CT) { return MakeCXType(GetQualType(CT).getUnqualifiedType(), GetTU(CT)); } +CXType clang_getNonReferenceType(CXType CT) { + return MakeCXType(GetQualType(CT).getNonReferenceType(), GetTU(CT)); +} + CXCursor clang_getTypeDeclaration(CXType CT) { if (CT.kind == CXType_Invalid) return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound); diff --git a/clang/tools/libclang/libclang.map b/clang/tools/libclang/libclang.map index 9ed81722fa341..911292a81c27b 100644 --- a/clang/tools/libclang/libclang.map +++ b/clang/tools/libclang/libclang.map @@ -408,6 +408,7 @@ LLVM_13 { LLVM_16 { global: clang_getUnqualifiedType; + clang_getNonReferenceType; }; # Example of how to add a new symbol version entry. If you do add a new symbol diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp index e6084859ade71..d020fa9af61c5 100644 --- a/clang/unittests/libclang/LibclangTest.cpp +++ b/clang/unittests/libclang/LibclangTest.cpp @@ -891,6 +891,46 @@ TEST_F(LibclangParseTest, clang_getUnqualifiedTypeRemovesQualifiers) { }); } +TEST_F(LibclangParseTest, clang_getNonReferenceTypeRemovesRefQualifiers) { + std::string Header = "header.h"; + WriteFile(Header, "void foo1(int&);\n" + "void foo2(int&&);\n"); + + auto is_ref_qualified = [](CXType type) -> bool { + return (type.kind == CXType_LValueReference) || + (type.kind == CXType_RValueReference); + }; + + auto from_CXString = [](CXString cx_string) -> std::string { + std::string string{clang_getCString(cx_string)}; + + clang_disposeString(cx_string); + + return string; + }; + + const char *Args[] = {"-xc++"}; + ClangTU = clang_parseTranslationUnit(Index, Header.c_str(), Args, 1, nullptr, + 0, TUFlags); + + Traverse([&is_ref_qualified, &from_CXString](CXCursor cursor, CXCursor) { + if (clang_getCursorKind(cursor) == CXCursor_FunctionDecl) { + CXType arg_type = clang_getArgType(clang_getCursorType(cursor), 0); + EXPECT_TRUE(is_ref_qualified(arg_type)) + << "Input data '" << from_CXString(clang_getCursorSpelling(cursor)) + << "' first argument does not have a ref-qualified type."; + + CXType non_reference_arg_type = clang_getNonReferenceType(arg_type); + EXPECT_FALSE(is_ref_qualified(non_reference_arg_type)) + << "The type '" << from_CXString(clang_getTypeSpelling(arg_type)) + << "' ref-qualifier was not removed after a call to " + "clang_getNonReferenceType."; + } + + return CXChildVisit_Continue; + }); +} + class LibclangRewriteTest : public LibclangParseTest { public: CXRewriter Rew = nullptr; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits