summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2012-07-30 23:48:36 +0000
committerAnna Zaks <ganna@apple.com>2012-07-30 23:48:36 +0000
commit5808eb802941f4cb06bb4667d600b88a9251b8ff (patch)
treebd76f72f960ac29ac9a59e4d92eb98f449a2c59f /clang/lib
parent160dcdf2d67a5cac3922d1f1e20f97aa61d842dc (diff)
downloadbcm5719-llvm-5808eb802941f4cb06bb4667d600b88a9251b8ff.tar.gz
bcm5719-llvm-5808eb802941f4cb06bb4667d600b88a9251b8ff.zip
[analyzer] Handle inlining of instance calls to super.
Use self-init.m for testing. (It used to have a bunch of failing tests with dynamic inlining turned on.) llvm-svn: 161012
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/StaticAnalyzer/Core/CallEvent.cpp26
1 files changed, 16 insertions, 10 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
index ad5a104aa05..bfc00ed2e0e 100644
--- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
@@ -592,21 +592,27 @@ ObjCMessageKind ObjCMethodCall::getMessageKind() const {
const Decl *ObjCMethodCall::getRuntimeDefinition() const {
const ObjCMessageExpr *E = getOriginExpr();
- Selector Sel = E->getSelector();
assert(E);
+ Selector Sel = E->getSelector();
if (E->isInstanceMessage()) {
- const MemRegion *Receiver = getReceiverSVal().getAsRegion();
- DynamicTypeInfo TI = getState()->getDynamicTypeInfo(Receiver);
- const ObjCObjectPointerType *T =
- dyn_cast<ObjCObjectPointerType>(TI.getType().getTypePtr());
- if (!T)
- return 0;
- if (ObjCInterfaceDecl *IDecl = T->getInterfaceDecl()) {
- // Find the method implementation.
- return IDecl->lookupPrivateMethod(Sel);
+
+ // Find the the receiver type.
+ const ObjCObjectPointerType *ReceiverT = 0;
+ QualType SupersType = E->getSuperType();
+ if (!SupersType.isNull()) {
+ ReceiverT = cast<ObjCObjectPointerType>(SupersType.getTypePtr());
+ } else {
+ const MemRegion *Receiver = getReceiverSVal().getAsRegion();
+ DynamicTypeInfo TI = getState()->getDynamicTypeInfo(Receiver);
+ ReceiverT = dyn_cast<ObjCObjectPointerType>(TI.getType().getTypePtr());
}
+ // Lookup the method implementation.
+ if (ReceiverT)
+ if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl())
+ return IDecl->lookupPrivateMethod(Sel);
+
} else {
// This is a class method.
// If we have type info for the receiver class, we are calling via
OpenPOWER on IntegriCloud