forked from OSchip/llvm-project
retain/release checker: Don't call isTrackedObject() with the canonical type.
This was preventing the checker from tracking return objects referenced by 'id'. llvm-svn: 69922
This commit is contained in:
parent
196ac3c69a
commit
0a1f9c423f
|
@ -703,7 +703,7 @@ public:
|
|||
|
||||
RetainSummary* getSummary(FunctionDecl* FD);
|
||||
RetainSummary* getMethodSummary(ObjCMessageExpr* ME, ObjCInterfaceDecl* ID);
|
||||
RetainSummary* getClassMethodSummary(ObjCMessageExpr *ME, Selector S);
|
||||
RetainSummary* getClassMethodSummary(ObjCMessageExpr *ME);
|
||||
|
||||
bool isGCEnabled() const { return GCEnabled; }
|
||||
};
|
||||
|
@ -1071,7 +1071,7 @@ RetainSummaryManager::getMethodSummary(ObjCMessageExpr* ME,
|
|||
return getInitMethodSummary(ME);
|
||||
|
||||
// Look for methods that return an owned object.
|
||||
if (!isTrackedObjectType(Ctx.getCanonicalType(ME->getType())))
|
||||
if (!isTrackedObjectType(ME->getType()))
|
||||
return 0;
|
||||
|
||||
// EXPERIMENTAL: Assume the Cocoa conventions for all objects returned
|
||||
|
@ -1089,13 +1089,13 @@ RetainSummaryManager::getMethodSummary(ObjCMessageExpr* ME,
|
|||
}
|
||||
|
||||
RetainSummary*
|
||||
RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr* ME,
|
||||
Selector S) {
|
||||
RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr* ME) {
|
||||
|
||||
// FIXME: Eventually we should properly do class method summaries, but
|
||||
// it requires us being able to walk the type hierarchy. Unfortunately,
|
||||
// we cannot do this with just an IdentifierInfo* for the class name.
|
||||
IdentifierInfo* ClsName = ME->getClassName();
|
||||
Selector S = ME->getSelector();
|
||||
|
||||
// Look up a summary in our cache of Selectors -> Summaries.
|
||||
ObjCMethodSummariesTy::iterator I = ObjCClassMethodSummaries.find(ClsName, S);
|
||||
|
@ -1104,15 +1104,13 @@ RetainSummaryManager::getClassMethodSummary(ObjCMessageExpr* ME,
|
|||
return I->second;
|
||||
|
||||
// Look for methods that return an owned object.
|
||||
if (!isTrackedObjectType(Ctx.getCanonicalType(ME->getType())))
|
||||
if (!isTrackedObjectType(ME->getType()))
|
||||
return 0;
|
||||
|
||||
// EXPERIMENTAL: Assume the Cocoa conventions for all objects returned
|
||||
// by class methods.
|
||||
// Look for methods that return an owned object.
|
||||
if (!isTrackedObjectType(Ctx.getCanonicalType(ME->getType())))
|
||||
return 0;
|
||||
|
||||
|
||||
const char* s = S.getIdentifierInfoForSlot(0)->getName();
|
||||
RetEffect E = followsFundamentalRule(s)
|
||||
? (isGCEnabled() ? RetEffect::MakeNotOwned(RetEffect::ObjC)
|
||||
|
@ -2014,7 +2012,7 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<GRState>& Dst,
|
|||
}
|
||||
}
|
||||
else
|
||||
Summ = Summaries.getClassMethodSummary(ME, ME->getSelector());
|
||||
Summ = Summaries.getClassMethodSummary(ME);
|
||||
|
||||
EvalSummary(Dst, Eng, Builder, ME, ME->getReceiver(), Summ,
|
||||
ME->arg_begin(), ME->arg_end(), Pred);
|
||||
|
|
|
@ -248,6 +248,6 @@ void test_objc_atomicCompareAndSwap() {
|
|||
void test_stringWithFormat() {
|
||||
NSString *string = [[NSString stringWithFormat:@"%ld", (long) 100] retain];
|
||||
[string release];
|
||||
[string release];
|
||||
[string release]; // expected-warning{{Incorrect decrement of the reference count}}
|
||||
}
|
||||
|
||||
|
|
|
@ -335,7 +335,7 @@ static void rdar_6659160(char *inkind, char *inname)
|
|||
return;
|
||||
|
||||
[kind release];
|
||||
[name release];
|
||||
[name release]; // expected-warning{{Incorrect decrement of the reference count}}
|
||||
}
|
||||
|
||||
// PR 3677 - 'allocWithZone' should be treated as following the Cocoa naming
|
||||
|
|
Loading…
Reference in New Issue