forked from OSchip/llvm-project
Objective-C diagnostics: isObjCNSObjectType should check through AttributedType.
For the following example: typedef __attribute__((NSObject)) CGColorRef ColorAttrRef; @property (strong, nullable) ColorAttrRef color; The property type should be ObjC NSObject type and the compiler should not emit error: property with 'retain (or strong)' attribute must be of object type rdar://problem/27747154 llvm-svn: 278742
This commit is contained in:
parent
55d87a88cc
commit
ef61168708
|
@ -3686,10 +3686,18 @@ bool Type::isObjCARCImplicitlyUnretainedType() const {
|
|||
}
|
||||
|
||||
bool Type::isObjCNSObjectType() const {
|
||||
if (const TypedefType *typedefType = dyn_cast<TypedefType>(this))
|
||||
return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>();
|
||||
return false;
|
||||
const Type *cur = this;
|
||||
while (true) {
|
||||
if (const TypedefType *typedefType = dyn_cast<TypedefType>(cur))
|
||||
return typedefType->getDecl()->hasAttr<ObjCNSObjectAttr>();
|
||||
|
||||
// Single-step desugar until we run out of sugar.
|
||||
QualType next = cur->getLocallyUnqualifiedSingleStepDesugaredType();
|
||||
if (next.getTypePtr() == cur) return false;
|
||||
cur = next.getTypePtr();
|
||||
}
|
||||
}
|
||||
|
||||
bool Type::isObjCIndependentClassType() const {
|
||||
if (const TypedefType *typedefType = dyn_cast<TypedefType>(this))
|
||||
return typedefType->getDecl()->hasAttr<ObjCIndependentClassAttr>();
|
||||
|
|
|
@ -21,6 +21,8 @@ typedef struct CGColor * __attribute__((NSObject)) CGColorRefNoNSObject; // no-w
|
|||
@property (nonatomic, retain) CGColorRefNoNSObject color;
|
||||
// rdar://problem/12197822
|
||||
@property (strong) __attribute__((NSObject)) CFTypeRef myObj; // no-warning
|
||||
//rdar://problem/27747154
|
||||
@property (strong, nullable) CGColorRefNoNSObject color2; // no-warning
|
||||
@end
|
||||
|
||||
void setProperty(id self, id value) {
|
||||
|
|
Loading…
Reference in New Issue