aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ARCMigrate/Transforms.cpp2
-rw-r--r--test/ARCMT/assign-prop-with-arc-runtime.m7
-rw-r--r--test/ARCMT/assign-prop-with-arc-runtime.m.result7
3 files changed, 12 insertions, 4 deletions
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