Awesome! Sent from my iPad
On Jul 6, 2011, at 9:00 AM, Douglas Gregor <[email protected]> wrote: > Author: dgregor > Date: Wed Jul 6 11:00:34 2011 > New Revision: 134493 > > URL: http://llvm.org/viewvc/llvm-project?rev=134493&view=rev > Log: > Teach the static analyzer's interpretation of Cocoa conventions to > obey the objc_method_family attribute when provided. Fixes > <rdar://problem/9726279>. > > Modified: > cfe/trunk/include/clang/Analysis/DomainSpecific/CocoaConventions.h > cfe/trunk/lib/Analysis/CocoaConventions.cpp > cfe/trunk/lib/StaticAnalyzer/Core/CFRefCount.cpp > cfe/trunk/test/Analysis/retain-release.m > > Modified: cfe/trunk/include/clang/Analysis/DomainSpecific/CocoaConventions.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/DomainSpecific/CocoaConventions.h?rev=134493&r1=134492&r2=134493&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Analysis/DomainSpecific/CocoaConventions.h > (original) > +++ cfe/trunk/include/clang/Analysis/DomainSpecific/CocoaConventions.h Wed > Jul 6 11:00:34 2011 > @@ -17,15 +17,19 @@ > #include "clang/AST/Type.h" > > namespace clang { > + > +class ObjCMethodDecl; > + > namespace ento { > namespace cocoa { > > enum NamingConvention { NoConvention, CreateRule, InitRule }; > > - NamingConvention deriveNamingConvention(Selector S); > + NamingConvention deriveNamingConvention(Selector S, const ObjCMethodDecl > *MD); > > - static inline bool followsFundamentalRule(Selector S) { > - return deriveNamingConvention(S) == CreateRule; > + static inline bool followsFundamentalRule(Selector S, > + const ObjCMethodDecl *MD) { > + return deriveNamingConvention(S, MD) == CreateRule; > } > > bool isRefType(QualType RetTy, llvm::StringRef Prefix, > > Modified: cfe/trunk/lib/Analysis/CocoaConventions.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CocoaConventions.cpp?rev=134493&r1=134492&r2=134493&view=diff > ============================================================================== > --- cfe/trunk/lib/Analysis/CocoaConventions.cpp (original) > +++ cfe/trunk/lib/Analysis/CocoaConventions.cpp Wed Jul 6 11:00:34 2011 > @@ -36,8 +36,10 @@ > // not release it." > // > > -cocoa::NamingConvention cocoa::deriveNamingConvention(Selector S) { > - switch (S.getMethodFamily()) { > +cocoa::NamingConvention cocoa::deriveNamingConvention(Selector S, > + const ObjCMethodDecl > *MD) { > + switch (MD && MD->hasAttr<ObjCMethodFamilyAttr>()? MD->getMethodFamily() > + : S.getMethodFamily()) { > case OMF_None: > case OMF_autorelease: > case OMF_dealloc: > > Modified: cfe/trunk/lib/StaticAnalyzer/Core/CFRefCount.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CFRefCount.cpp?rev=134493&r1=134492&r2=134493&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Core/CFRefCount.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Core/CFRefCount.cpp Wed Jul 6 11:00:34 2011 > @@ -1349,7 +1349,7 @@ > if (cocoa::isCocoaObjectRef(RetTy)) { > // EXPERIMENTAL: assume the Cocoa conventions for all objects returned > // by instance methods. > - RetEffect E = cocoa::followsFundamentalRule(S) > + RetEffect E = cocoa::followsFundamentalRule(S, MD) > ? ObjCAllocRetE : RetEffect::MakeNotOwned(RetEffect::ObjC); > > return getPersistentSummary(E, ReceiverEff, MayEscape); > @@ -1357,7 +1357,7 @@ > > // Look for methods that return an owned core foundation object. > if (cocoa::isCFObjectRef(RetTy)) { > - RetEffect E = cocoa::followsFundamentalRule(S) > + RetEffect E = cocoa::followsFundamentalRule(S, MD) > ? RetEffect::MakeOwned(RetEffect::CF, true) > : RetEffect::MakeNotOwned(RetEffect::CF); > > @@ -1428,7 +1428,7 @@ > assert(ScratchArgs.isEmpty()); > > // "initXXX": pass-through for receiver. > - if (cocoa::deriveNamingConvention(S) == cocoa::InitRule) > + if (cocoa::deriveNamingConvention(S, MD) == cocoa::InitRule) > Summ = getInitMethodSummary(RetTy); > else > Summ = getCommonMethodSummary(MD, S, RetTy); > > Modified: cfe/trunk/test/Analysis/retain-release.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/retain-release.m?rev=134493&r1=134492&r2=134493&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/retain-release.m (original) > +++ cfe/trunk/test/Analysis/retain-release.m Wed Jul 6 11:00:34 2011 > @@ -1462,3 +1462,28 @@ > void rdar_9234108() { > rdar_9234108_helper(0, CFStringCreate()); > } > + > +// <rdar://problem/9726279> - Make sure that objc_method_family works > +// to override naming conventions. > +struct TwoDoubles { > + double one; > + double two; > +}; > +typedef struct TwoDoubles TwoDoubles; > + > +@interface NSValue (Mine) > +- (id)_prefix_initWithTwoDoubles:(TwoDoubles)twoDoubles > __attribute__((objc_method_family(init))); > +@end > + > +@implementation NSValue (Mine) > +- (id)_prefix_initWithTwoDoubles:(TwoDoubles)twoDoubles > +{ > + return [self init]; > +} > +@end > + > +void rdar9726279() { > + TwoDoubles twoDoubles = { 0.0, 0.0 }; > + NSValue *value = [[NSValue alloc] _prefix_initWithTwoDoubles:twoDoubles]; > + [value release]; > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
