ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl();
if (!Class || Class->getName() == "NSObject")
return false; // id/NSObject is not safe for weak.
+ if (Class->isForwardDecl())
+ return false; // forward classes are not verifiable, therefore not safe.
if (Class->isArcWeakrefUnavailable())
return false;
if (isClassInWeakBlacklist(Class))
@end
@class _NSCachedAttributedString;
-
typedef _NSCachedAttributedString *BadClassForWeak;
+@class Forw;
+
@interface Foo : NSObject {
Foo *x, *w, *q1, *q2;
Foo *z1, *__unsafe_unretained z2;
BadClassForWeak bcw;
id not_safe1;
NSObject *not_safe2;
+ Forw *not_safe3;
}
@property (readonly,assign) Foo *x;
@property (assign) Foo *w;
@property (assign) BadClassForWeak bcw;
@property (assign) id not_safe1;
@property (assign) NSObject *not_safe2;
+@property (assign) Forw *not_safe3;
@end
@implementation Foo
-@synthesize x,w,q1,q2,z1,z2,oo,bcw,not_safe1,not_safe2;
+@synthesize x,w,q1,q2,z1,z2,oo,bcw,not_safe1,not_safe2,not_safe3;
@end
@end
@class _NSCachedAttributedString;
-
typedef _NSCachedAttributedString *BadClassForWeak;
+@class Forw;
+
@interface Foo : NSObject {
Foo *__weak x, *__weak w, *__weak q1, *__weak q2;
Foo *__unsafe_unretained z1, *__unsafe_unretained z2;
BadClassForWeak __unsafe_unretained bcw;
id __unsafe_unretained not_safe1;
NSObject *__unsafe_unretained not_safe2;
+ Forw *__unsafe_unretained not_safe3;
}
@property (readonly,weak) Foo *x;
@property (weak) Foo *w;
@property (assign) BadClassForWeak bcw;
@property (assign) id not_safe1;
@property (assign) NSObject *not_safe2;
+@property (assign) Forw *not_safe3;
@end
@implementation Foo
-@synthesize x,w,q1,q2,z1,z2,oo,bcw,not_safe1,not_safe2;
+@synthesize x,w,q1,q2,z1,z2,oo,bcw,not_safe1,not_safe2,not_safe3;
@end