diff options
| author | John McCall <rjmccall@apple.com> | 2015-10-22 18:38:17 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2015-10-22 18:38:17 +0000 |
| commit | 460ce58fa6a165ebad98c848aaec2f09cefe7603 (patch) | |
| tree | 9520b5118e8d8cc7cbe1449609c40f3b9ec7b11b /clang/test/SemaObjC | |
| parent | 63d23d1b127e43cff2b287b371fdbf6e0a6d83f0 (diff) | |
| download | bcm5719-llvm-460ce58fa6a165ebad98c848aaec2f09cefe7603.tar.gz bcm5719-llvm-460ce58fa6a165ebad98c848aaec2f09cefe7603.zip | |
Define weak and __weak to mean ARC-style weak references, even in MRC.
Previously, __weak was silently accepted and ignored in MRC mode.
That makes this a potentially source-breaking change that we have to
roll out cautiously. Accordingly, for the time being, actual support
for __weak references in MRC is experimental, and the compiler will
reject attempts to actually form such references. The intent is to
eventually enable the feature by default in all non-GC modes.
(It is, of course, incompatible with ObjC GC's interpretation of
__weak.)
If you like, you can enable this feature with
-Xclang -fobjc-weak
but like any -Xclang option, this option may be removed at any point,
e.g. if/when it is eventually enabled by default.
This patch also enables the use of the ARC __unsafe_unretained qualifier
in MRC. Unlike __weak, this is being enabled immediately. Since
variables are essentially __unsafe_unretained by default in MRC,
the only practical uses are (1) communication and (2) changing the
default behavior of by-value block capture.
As an implementation matter, this means that the ObjC ownership
qualifiers may appear in any ObjC language mode, and so this patch
removes a number of checks for getLangOpts().ObjCAutoRefCount
that were guarding the processing of these qualifiers. I don't
expect this to be a significant drain on performance; it may even
be faster to just check for these qualifiers directly on a type
(since it's probably in a register anyway) than to do N dependent
loads to grab the LangOptions.
rdar://9674298
llvm-svn: 251041
Diffstat (limited to 'clang/test/SemaObjC')
| -rw-r--r-- | clang/test/SemaObjC/attr-objc-gc.m | 6 | ||||
| -rw-r--r-- | clang/test/SemaObjC/mrc-weak.m | 67 | ||||
| -rw-r--r-- | clang/test/SemaObjC/no-gc-weak-test.m | 9 | ||||
| -rw-r--r-- | clang/test/SemaObjC/nonarc-weak.m | 16 | ||||
| -rw-r--r-- | clang/test/SemaObjC/property-in-class-extension-1.m | 4 | ||||
| -rw-r--r-- | clang/test/SemaObjC/synthesized-ivar.m | 2 |
6 files changed, 77 insertions, 27 deletions
diff --git a/clang/test/SemaObjC/attr-objc-gc.m b/clang/test/SemaObjC/attr-objc-gc.m index 827945c668c..303dce0d875 100644 --- a/clang/test/SemaObjC/attr-objc-gc.m +++ b/clang/test/SemaObjC/attr-objc-gc.m @@ -9,13 +9,13 @@ static id __attribute((objc_gc(hello))) f; // expected-warning{{'objc_gc' attrib static int __attribute__((objc_gc(weak))) g; // expected-warning {{'objc_gc' only applies to pointer types; type here is 'int'}} -static __weak int h; // expected-warning {{'__weak' only applies to pointer types; type here is 'int'}} +static __weak int h; // expected-warning {{'__weak' only applies to Objective-C object or block pointer types; type here is 'int'}} // TODO: it would be great if this reported as __weak #define WEAK __weak -static WEAK int h; // expected-warning {{'objc_gc' only applies to pointer types; type here is 'int'}} +static WEAK int h; // expected-warning {{'objc_ownership' only applies to Objective-C object or block pointer types; type here is 'int'}} -/* expected-warning {{'__weak' only applies to pointer types; type here is 'int'}}*/ static __we\ +/* expected-warning {{'__weak' only applies to Objective-C object or block pointer types; type here is 'int'}}*/ static __we\ ak int i; // rdar://problem/9126213 diff --git a/clang/test/SemaObjC/mrc-weak.m b/clang/test/SemaObjC/mrc-weak.m new file mode 100644 index 00000000000..ec03cf7f002 --- /dev/null +++ b/clang/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; // expected-note {{property declared here}} +@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; // expected-error {{existing instance variable '_sc' for strong property 'sc' may not be __unsafe_unretained}} +} +@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; // expected-note {{property synthesized here}} +@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 '__unsafe_unretained id *' with an expression of type '__weak id *' changes retain/release properties of pointer}} +} + diff --git a/clang/test/SemaObjC/no-gc-weak-test.m b/clang/test/SemaObjC/no-gc-weak-test.m index 6539a9b7f14..287b4db8cef 100644 --- a/clang/test/SemaObjC/no-gc-weak-test.m +++ b/clang/test/SemaObjC/no-gc-weak-test.m @@ -1,11 +1,10 @@ // RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify -Wno-objc-root-class %s -// expected-no-diagnostics @interface Subtask { id _delegate; } -@property(nonatomic,readwrite,assign) id __weak delegate; +@property(nonatomic,readwrite,assign) id __weak delegate; // expected-error {{the current deployment target does not support automated __weak references}} @end @implementation Subtask @@ -15,15 +14,15 @@ @interface PVSelectionOverlayView2 { - id __weak _selectionRect; + id __weak _selectionRect; // expected-error {{the current deployment target does not support automated __weak references}} expected-error {{existing instance variable '_selectionRect' for property 'selectionRect' with assign attribute must be __unsafe_unretained}} } -@property(assign) id selectionRect; +@property(assign) id selectionRect; // expected-note {{property declared here}} @end @implementation PVSelectionOverlayView2 -@synthesize selectionRect = _selectionRect; +@synthesize selectionRect = _selectionRect; // expected-note {{property synthesized here}} @end diff --git a/clang/test/SemaObjC/nonarc-weak.m b/clang/test/SemaObjC/nonarc-weak.m deleted file mode 100644 index ab51875de1c..00000000000 --- a/clang/test/SemaObjC/nonarc-weak.m +++ /dev/null @@ -1,16 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-apple-macosx10.8.0 -fobjc-runtime=macosx-10.8.0 -fsyntax-only -Wunused-function %s > %t.nonarc 2>&1 -// RUN: %clang_cc1 -triple x86_64-apple-macosx10.8.0 -fobjc-runtime=macosx-10.8.0 -fsyntax-only -Wunused-function -fobjc-arc %s > %t.arc 2>&1 -// RUN: FileCheck -input-file=%t.nonarc %s -// RUN: FileCheck -input-file=%t.arc -check-prefix=ARC %s - -static void bar() {} // Intentionally unused. - -void foo(id self) { - __weak id weakSelf = self; -} - -// CHECK: 9:13: warning: __weak attribute cannot be specified on an automatic variable when ARC is not enabled -// CHECK: 6:13: warning: unused function 'bar' -// CHECK: 2 warnings generated -// ARC: 6:13: warning: unused function 'bar' -// ARC: 1 warning generated diff --git a/clang/test/SemaObjC/property-in-class-extension-1.m b/clang/test/SemaObjC/property-in-class-extension-1.m index ab461ef6c19..6e9d476c18a 100644 --- a/clang/test/SemaObjC/property-in-class-extension-1.m +++ b/clang/test/SemaObjC/property-in-class-extension-1.m @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -verify -Weverything %s -// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -verify -Weverything %s +// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fobjc-weak -verify -Weverything -Wno-objc-weak-compat %s +// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fobjc-weak -fsyntax-only -verify -Weverything -Wno-objc-weak-compat %s // rdar://12103400 @class NSString; diff --git a/clang/test/SemaObjC/synthesized-ivar.m b/clang/test/SemaObjC/synthesized-ivar.m index 884a3caf0f6..cc7b309da03 100644 --- a/clang/test/SemaObjC/synthesized-ivar.m +++ b/clang/test/SemaObjC/synthesized-ivar.m @@ -57,5 +57,5 @@ int f0(I *a) { return a->IP; } // expected-error {{instance variable 'IP' is pri @implementation A // rdar://9605088 -@synthesize testObjectWeakProperty; // expected-error {{@synthesize of 'weak' property is only allowed in ARC or GC mode}} +@synthesize testObjectWeakProperty; // expected-error {{the current deployment target does not support automated __weak references}} @end |

