diff options
Diffstat (limited to 'clang/tools/libclang/CXCursor.cpp')
-rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp index c069781739c..7834181d478 100644 --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -1417,8 +1417,16 @@ int clang_Cursor_isDynamicCall(CXCursor C) { if (!E) return 0; - if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) - return MsgE->getReceiverKind() == ObjCMessageExpr::Instance; + if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) { + if (MsgE->getReceiverKind() != ObjCMessageExpr::Instance) + return false; + if (auto *RecE = dyn_cast<ObjCMessageExpr>( + MsgE->getInstanceReceiver()->IgnoreParenCasts())) { + if (RecE->getMethodFamily() == OMF_alloc) + return false; + } + return true; + } const MemberExpr *ME = nullptr; if (isa<MemberExpr>(E)) |