https://github.com/16bit-ykiko updated https://github.com/llvm/llvm-project/pull/86143
>From 32d4fc35f3d52b54e308b76c00c292497afe9621 Mon Sep 17 00:00:00 2001 From: ykiko <ykikoykikoyk...@gmail.com> Date: Fri, 22 Mar 2024 00:00:30 +0800 Subject: [PATCH 1/2] add `clang_getCursorCallExprKind` to get the underlying type of CallExpr. --- clang/docs/ReleaseNotes.rst | 2 + clang/include/clang-c/Index.h | 46 +++++++++++++++++++++++ clang/tools/libclang/CIndex.cpp | 30 ++++++++++++++- clang/tools/libclang/libclang.map | 5 +++ clang/unittests/libclang/LibclangTest.cpp | 24 ++++++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3a74c070ff9ffe..b25296cafc8285 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -509,6 +509,8 @@ clang-format libclang -------- +- Added ``CXCallExprKind`` and ``clang_getCursorCallExprKind``. + Static Analyzer --------------- diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 60db3cf0966c02..1828b8ec3edaab 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -6663,6 +6663,52 @@ clang_getUnaryOperatorKindSpelling(enum CXUnaryOperatorKind kind); CINDEX_LINKAGE enum CXUnaryOperatorKind clang_getCursorUnaryOperatorKind(CXCursor cursor); +/** + * Describes the kind of CallExpr. + */ +enum CXCallExprKind { + /** Not a CallExpr. */ + CXCallExpr_Invalid = 0, + /** Simple C function call. */ + CXCallExpr_Default, + /** Call to overloaded operator using operator syntax. */ + CXCallExpr_CXXOperatorCallExpr, + /** + * Call to a member function written with member call syntax or + * normal function-call syntax within a member function. + */ + CXCallExpr_CXXMemberCallExpr, + /** Call to a CUDA kernel function. */ + CXCallExpr_CUDAKernelCallExpr, + /** Call to a C++ constructor. */ + CXCallExpr_CXXConstructExpr, + /** + * Call to an inherited base class constructor from an + * inheriting constructor. Implicitly forwards arguments. + */ + CXCallExpr_CXXInheritedCtorInitExpr, + /** + * C++ functional cast expression building a temporary object. + */ + CXCallExpr_CXXTemporaryObjectExpr, + /** + * Explicit type conversion using functional notation, unresolved + * due to type-dependency. + */ + CXCallExpr_CXXUnresolvedConstructExpr, + /** + * Call to a user-defined literal. + */ + CXCallExpr_UserDefinedLiteral, +}; + +/** + * Retrieve the detailed kind of a call expression. + * + * If this cursor is not a CallExpr then returns Invalid. + */ +CINDEX_LINKAGE enum CXCallExprKind clang_getCursorCallExprKind(CXCursor cursor); + /** * @} */ diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 418b152ba4a13f..51f78b22c43e0c 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2122,7 +2122,7 @@ class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void>, void VisitBlockExpr(const BlockExpr *B); void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); void VisitCompoundStmt(const CompoundStmt *S); - void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ + void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ } void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S); void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E); @@ -9727,3 +9727,31 @@ enum CXUnaryOperatorKind clang_getCursorUnaryOperatorKind(CXCursor cursor) { return CXUnaryOperator_Invalid; } + +enum CXCallExprKind clang_getCursorCallExprKind(CXCursor cursor) { + if (clang_isExpression(cursor.kind)) { + const Expr *expr = getCursorExpr(cursor); + + switch (expr->getStmtClass()) { + case Stmt::CallExprClass: + return CXCallExpr_Default; + case Stmt::CXXOperatorCallExprClass: + return CXCallExpr_CXXOperatorCallExpr; + case Stmt::CXXMemberCallExprClass: + return CXCallExpr_CXXMemberCallExpr; + case Stmt::CUDAKernelCallExprClass: + return CXCallExpr_CUDAKernelCallExpr; + case Stmt::CXXConstructExprClass: + return CXCallExpr_CXXConstructExpr; + case Stmt::CXXInheritedCtorInitExprClass: + return CXCallExpr_CXXInheritedCtorInitExpr; + case Stmt::CXXTemporaryObjectExprClass: + return CXCallExpr_CXXTemporaryObjectExpr; + case Stmt::CXXUnresolvedConstructExprClass: + return CXCallExpr_CXXUnresolvedConstructExpr; + case Stmt::UserDefinedLiteralClass: + return CXCallExpr_UserDefinedLiteral; + } + } + return CXCallExpr_Invalid; +} \ No newline at end of file diff --git a/clang/tools/libclang/libclang.map b/clang/tools/libclang/libclang.map index 5676198a286d9b..5499c38a8289f9 100644 --- a/clang/tools/libclang/libclang.map +++ b/clang/tools/libclang/libclang.map @@ -428,6 +428,11 @@ LLVM_17 { clang_getCursorUnaryOperatorKind; }; +LLVM_18 { + global: + clang_getCursorCallExprKind; +} + # Example of how to add a new symbol version entry. If you do add a new symbol # version, please update the example to depend on the version you added. # LLVM_X { diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp index 87075a46d75187..a632cd6e3d2293 100644 --- a/clang/unittests/libclang/LibclangTest.cpp +++ b/clang/unittests/libclang/LibclangTest.cpp @@ -1172,6 +1172,30 @@ TEST_F(LibclangParseTest, UnaryOperator) { }); } +TEST_F(LibclangParseTest, CallExpr){ + std::string Main = "main.cpp"; + const char testSource[] = R"cpp( +struct X{ + int operator+(int) const; +}; + +int x = X() + 1; +)cpp"; + WriteFile(Main, testSource); + ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, nullptr, + 0, TUFlags); + + Traverse([](CXCursor cursor, CXCursor parent) -> CXChildVisitResult { + if (cursor.kind == CXCursor_CallExpr) { + EXPECT_EQ(clang_getCursorCallExprKind(cursor), + CXCallExpr_CXXOperatorCallExpr); + return CXChildVisit_Break; + } + + return CXChildVisit_Recurse; + }); +} + TEST_F(LibclangParseTest, VisitStaticAssertDecl_noMessage) { const char testSource[] = R"cpp(static_assert(true))cpp"; std::string fileName = "main.cpp"; >From c380c1febad826e64a2beaff721fc1b960542b9c Mon Sep 17 00:00:00 2001 From: ykiko <ykikoykikoyk...@gmail.com> Date: Fri, 22 Mar 2024 00:13:04 +0800 Subject: [PATCH 2/2] delete a extra space. --- clang/tools/libclang/CIndex.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 20e58b656bdcb7..436ebcc580ad4d 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2126,7 +2126,7 @@ class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void>, void VisitBlockExpr(const BlockExpr *B); void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); void VisitCompoundStmt(const CompoundStmt *S); - void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ + void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ } void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S); void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits