summaryrefslogtreecommitdiffstats
path: root/clang/tools/libclang/CXCursor.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2014-11-10 23:21:35 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2014-11-10 23:21:35 +0000
commit6cc5f73e38e3166c60b8591f13e14aa8e5bd423f (patch)
tree4629f02d511b38223afacc3723d5391c58eac1c2 /clang/tools/libclang/CXCursor.cpp
parent5c35f7cfd1f5e8f1089b11bd33c5bbd4f4a9e061 (diff)
downloadbcm5719-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.cpp12
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))
OpenPOWER on IntegriCloud