diff --git a/clang/lib/Analysis/CheckObjCDealloc.cpp b/clang/lib/Analysis/CheckObjCDealloc.cpp index 0c9100951ce1..7bb0015462bb 100644 --- a/clang/lib/Analysis/CheckObjCDealloc.cpp +++ b/clang/lib/Analysis/CheckObjCDealloc.cpp @@ -60,9 +60,11 @@ void clang::CheckObjCDealloc(ObjCImplementationDecl* D, for (ObjCInterfaceDecl::ivar_iterator I=ID->ivar_begin(), E=ID->ivar_end(); I!=E; ++I) { - QualType T = (*I)->getType(); + ObjCIvarDecl* ID = *I; + QualType T = ID->getType(); - if (T->isPointerType() || T->isObjCQualifiedIdType()) { + if ((T->isPointerType() || T->isObjCQualifiedIdType()) && + ID->getAttr() == 0) { // Skip IBOutlets. containsPointerIvar = true; break; } diff --git a/clang/test/Analysis/IBOutlet.m b/clang/test/Analysis/IBOutlet.m new file mode 100644 index 000000000000..4049e795547e --- /dev/null +++ b/clang/test/Analysis/IBOutlet.m @@ -0,0 +1,20 @@ +// RUN: clang -warn-objc-missing-dealloc '-DIBOutlet=__attribute__((iboutlet))' %s --verify + +#ifndef IBOutlet +#define IBOutlet +#endif + +@class NSWindow; + +@interface NSObject {} +- (void)dealloc; +@end + +@interface A : NSObject { +IBOutlet NSWindow *window; +} +@end + +@implementation A // no-warning +@end +