diff options
Diffstat (limited to 'test/SemaObjC/mrc-weak.m')
-rw-r--r-- | test/SemaObjC/mrc-weak.m | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/SemaObjC/mrc-weak.m b/test/SemaObjC/mrc-weak.m new file mode 100644 index 000000000000..e961e0ab75ed --- /dev/null +++ b/test/SemaObjC/mrc-weak.m @@ -0,0 +1,67 @@ +// RUN: %clang_cc1 -fobjc-runtime-has-weak -fobjc-weak -fsyntax-only -verify %s + +__attribute__((objc_root_class)) +@interface A +@property (weak) id wa; // expected-note {{property declared here}} +@property (weak) id wb; +@property (weak) id wc; // expected-note {{property declared here}} +@property (weak) id wd; +@property (unsafe_unretained) id ua; +@property (unsafe_unretained) id ub; // expected-note {{property declared here}} +@property (unsafe_unretained) id uc; +@property (unsafe_unretained) id ud; +@property (strong) id sa; +@property (strong) id sb; // expected-note {{property declared here}} +@property (strong) id sc; +@property (strong) id sd; +@end + +@implementation A { + id _wa; // expected-error {{existing instance variable '_wa' for __weak property 'wa' must be __weak}} + __weak id _wb; + __unsafe_unretained id _wc; // expected-error {{existing instance variable '_wc' for __weak property 'wc' must be __weak}} + id _ua; + __weak id _ub; // expected-error {{existing instance variable '_ub' for property 'ub' with unsafe_unretained attribute must be __unsafe_unretained}} + __unsafe_unretained id _uc; + id _sa; + __weak id _sb; // expected-error {{existing instance variable '_sb' for strong property 'sb' may not be __weak}} + __unsafe_unretained id _sc; +} +@synthesize wa = _wa; // expected-note {{property synthesized here}} +@synthesize wb = _wb; +@synthesize wc = _wc; // expected-note {{property synthesized here}} +@synthesize wd = _wd; +@synthesize ua = _ua; +@synthesize ub = _ub; // expected-note {{property synthesized here}} +@synthesize uc = _uc; +@synthesize ud = _ud; +@synthesize sa = _sa; +@synthesize sb = _sb; // expected-note {{property synthesized here}} +@synthesize sc = _sc; +@synthesize sd = _sd; +@end + +void test_goto() { + goto after; // expected-error {{cannot jump from this goto statement to its label}} + __weak id x; // expected-note {{jump bypasses initialization of __weak variable}}} +after: + return; +} + +void test_weak_cast(id *value) { + __weak id *a = (__weak id*) value; + id *b = (__weak id*) value; // expected-error {{initializing 'id *' with an expression of type '__weak id *' changes retain/release properties of pointer}} + __weak id *c = (id*) value; // expected-error {{initializing '__weak id *' with an expression of type 'id *' changes retain/release properties of pointer}} +} + +void test_unsafe_unretained_cast(id *value) { + __unsafe_unretained id *a = (__unsafe_unretained id*) value; + id *b = (__unsafe_unretained id*) value; + __unsafe_unretained id *c = (id*) value; +} + +void test_cast_qualifier_inference(__weak id *value) { + __weak id *a = (id*) value; + __unsafe_unretained id *b = (id*) value; // expected-error {{initializing 'id *' with an expression of type '__weak id *' changes retain/release properties of pointer}} +} + |