diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2014-11-10 23:21:35 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2014-11-10 23:21:35 +0000 |
commit | 6cc5f73e38e3166c60b8591f13e14aa8e5bd423f (patch) | |
tree | 4629f02d511b38223afacc3723d5391c58eac1c2 /clang/tools/libclang/CXCursor.cpp | |
parent | 5c35f7cfd1f5e8f1089b11bd33c5bbd4f4a9e061 (diff) | |
download | bcm5719-llvm-6cc5f73e38e3166c60b8591f13e14aa8e5bd423f.tar.gz bcm5719-llvm-6cc5f73e38e3166c60b8591f13e14aa8e5bd423f.zip |
[libclang] When initializing an ObjC object via the "[[ClassName alloc] init*]" pattern,
report the 'init*' invocation as non-dynamic via clang_Cursor_isDynamicCall.
Of course it is dynamic at runtime, but for purposes of indexing we can treat as an invocation to ClassName's init*.
Addresses rdar://18916871.
llvm-svn: 221641
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)) |