<rdar://problem/6948053> False positive: object substitution during -init* methods warns about returning +0 when using -fobjc-gc-only

llvm-svn: 72971
This commit is contained in:
Ted Kremenek 2009-06-05 23:18:01 +00:00
parent afa8a1592f
commit a03705c82d
2 changed files with 34 additions and 5 deletions

View File

@ -636,7 +636,11 @@ class VISIBILITY_HIDDEN RetainSummaryManager {
/// ObjCAllocRetE - Default return effect for methods returning Objective-C
/// objects.
RetEffect ObjCAllocRetE;
/// ObjCInitRetE - Default return effect for init methods returning Objective-C
/// objects.
RetEffect ObjCInitRetE;
RetainSummary DefaultSummary;
RetainSummary* StopSummary;
@ -776,6 +780,8 @@ public:
GCEnabled(gcenabled), AF(BPAlloc), ScratchArgs(AF.GetEmptyMap()),
ObjCAllocRetE(gcenabled ? RetEffect::MakeGCNotOwned()
: RetEffect::MakeOwned(RetEffect::ObjC, true)),
ObjCInitRetE(gcenabled ? RetEffect::MakeGCNotOwned()
: RetEffect::MakeOwnedWhenTrackedReceiver()),
DefaultSummary(AF.GetEmptyMap() /* per-argument effects (none) */,
RetEffect::MakeNoRet() /* return effect */,
MayEscape, /* default argument effect */
@ -1156,8 +1162,7 @@ RetainSummaryManager::getInitMethodSummary(QualType RetTy) {
// 'init' methods conceptually return a newly allocated object and claim
// the receiver.
if (isTrackedObjCObjectType(RetTy) || isTrackedCFObjectType(RetTy))
return getPersistentSummary(RetEffect::MakeOwnedWhenTrackedReceiver(),
DecRefMsg);
return getPersistentSummary(ObjCInitRetE, DecRefMsg);
return getDefaultSummary();
}
@ -1374,8 +1379,7 @@ void RetainSummaryManager::InitializeMethodSummaries() {
// Create the "init" selector. It just acts as a pass-through for the
// receiver.
addNSObjectMethSummary(GetNullarySelector("init", Ctx),
getPersistentSummary(RetEffect::MakeOwnedWhenTrackedReceiver(),
DecRefMsg));
getPersistentSummary(ObjCInitRetE, DecRefMsg));
// The next methods are allocators.
RetainSummary *AllocSumm = getPersistentSummary(ObjCAllocRetE);

View File

@ -5,6 +5,8 @@
// Header stuff.
//===----------------------------------------------------------------------===//
typedef struct objc_class *Class;
typedef unsigned int __darwin_natural_t;
typedef struct {} div_t;
typedef unsigned long UInt32;
@ -56,6 +58,7 @@ typedef struct _NSZone NSZone;
@end @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder;
@end
@interface NSObject <NSObject> {}
- (Class)class;
+ (id)alloc;
+ (id)allocWithZone:(NSZone *)zone;
@end typedef float CGFloat;
@ -172,6 +175,28 @@ void f5b() {
}
@end
//===----------------------------------------------------------------------===//
// <rdar://problem/6948053> False positive: object substitution during -init*
// methods warns about returning +0 when using -fobjc-gc-only
//===----------------------------------------------------------------------===//
@interface MyClassRdar6948053 : NSObject
- (id) init;
+ (id) shared;
@end
@implementation MyClassRdar6948053
+(id) shared {
return (id) 0;
}
- (id) init
{
Class myClass = [self class];
[self release];
return [[myClass shared] retain]; // no-warning
}
@end
//===----------------------------------------------------------------------===//
// Tests of ownership attributes.
//===----------------------------------------------------------------------===//