Fix <rdar://problem/6877235> Classes typedef-ed to CF objects should get the same treatment as CF objects

This was accomplished by having	'isTypeRef' recursively walk the typedef stack.

llvm-svn: 71538
This commit is contained in:
Ted Kremenek 2009-05-12 04:53:03 +00:00
parent 63f5f68024
commit 95d181936a
2 changed files with 32 additions and 3 deletions

View File

@ -225,9 +225,17 @@ static bool hasSuffix(const char* s, const char* suffix) {
static bool isRefType(QualType RetTy, const char* prefix,
ASTContext* Ctx = 0, const char* name = 0) {
if (TypedefType* TD = dyn_cast<TypedefType>(RetTy.getTypePtr())) {
const char* TDName = TD->getDecl()->getIdentifier()->getName();
return hasPrefix(TDName, prefix) && hasSuffix(TDName, "Ref");
// Recursively walk the typedef stack, allowing typedefs of reference types.
while (1) {
if (TypedefType* TD = dyn_cast<TypedefType>(RetTy.getTypePtr())) {
const char* TDName = TD->getDecl()->getIdentifier()->getName();
if (hasPrefix(TDName, prefix) && hasSuffix(TDName, "Ref"))
return true;
RetTy = TD->getDecl()->getUnderlyingType();
continue;
}
break;
}
if (!Ctx || !name)

View File

@ -528,6 +528,27 @@ void rdar_6866843() {
[pool drain];
}
//===----------------------------------------------------------------------===//
// <rdar://problem/6877235> Classes typedef-ed to CF objects should get the same treatment as CF objects
//===----------------------------------------------------------------------===//
typedef CFTypeRef OtherRef;
@interface RDar6877235 : NSObject {}
- (CFTypeRef)_copyCFTypeRef;
- (OtherRef)_copyOtherRef;
@end
@implementation RDar6877235
- (CFTypeRef)_copyCFTypeRef {
return [[NSString alloc] init]; // no-warning
}
- (OtherRef)_copyOtherRef {
return [[NSString alloc] init]; // no-warning
}
@end
//===----------------------------------------------------------------------===//
// Tests of ownership attributes.
//===----------------------------------------------------------------------===//