diff options
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 14 | ||||
-rw-r--r-- | test/Analysis/retain-release-gc-only.m | 25 |
2 files changed, 34 insertions, 5 deletions
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 56ab0eb4f6..532d16da0f 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -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); diff --git a/test/Analysis/retain-release-gc-only.m b/test/Analysis/retain-release-gc-only.m index 26765c3ac6..ec33a57d33 100644 --- a/test/Analysis/retain-release-gc-only.m +++ b/test/Analysis/retain-release-gc-only.m @@ -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; @@ -173,6 +176,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. //===----------------------------------------------------------------------===// |