From: Argyrios Kyrtzidis Date: Tue, 12 Jul 2011 22:16:25 +0000 (+0000) Subject: [arcmt] Also avoid 'weak' for forward references to objc classes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5363e8df5d274cb32c0c47fd2df45aa02cf68dfe;p=clang [arcmt] Also avoid 'weak' for forward references to objc classes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135003 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ARCMigrate/Transforms.cpp b/lib/ARCMigrate/Transforms.cpp index c2f85f65b7..c0a7b95fe8 100644 --- a/lib/ARCMigrate/Transforms.cpp +++ b/lib/ARCMigrate/Transforms.cpp @@ -75,6 +75,8 @@ bool trans::canApplyWeak(ASTContext &Ctx, QualType type) { 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)) diff --git a/test/ARCMT/assign-prop-with-arc-runtime.m b/test/ARCMT/assign-prop-with-arc-runtime.m index e9416fe029..0516e6d694 100644 --- a/test/ARCMT/assign-prop-with-arc-runtime.m +++ b/test/ARCMT/assign-prop-with-arc-runtime.m @@ -9,9 +9,10 @@ __attribute__((objc_arc_weak_reference_unavailable)) @end @class _NSCachedAttributedString; - typedef _NSCachedAttributedString *BadClassForWeak; +@class Forw; + @interface Foo : NSObject { Foo *x, *w, *q1, *q2; Foo *z1, *__unsafe_unretained z2; @@ -19,6 +20,7 @@ typedef _NSCachedAttributedString *BadClassForWeak; BadClassForWeak bcw; id not_safe1; NSObject *not_safe2; + Forw *not_safe3; } @property (readonly,assign) Foo *x; @property (assign) Foo *w; @@ -28,8 +30,9 @@ typedef _NSCachedAttributedString *BadClassForWeak; @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 diff --git a/test/ARCMT/assign-prop-with-arc-runtime.m.result b/test/ARCMT/assign-prop-with-arc-runtime.m.result index 349bfa28c4..c44969907f 100644 --- a/test/ARCMT/assign-prop-with-arc-runtime.m.result +++ b/test/ARCMT/assign-prop-with-arc-runtime.m.result @@ -9,9 +9,10 @@ __attribute__((objc_arc_weak_reference_unavailable)) @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; @@ -19,6 +20,7 @@ typedef _NSCachedAttributedString *BadClassForWeak; 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; @@ -28,8 +30,9 @@ typedef _NSCachedAttributedString *BadClassForWeak; @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