xref: /aosp_15_r20/external/clang/test/SemaObjC/mrc-no-weak.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -fobjc-runtime=macosx-10.8 -fsyntax-only -verify %s
2*67e74705SXin Li
3*67e74705SXin Li__attribute__((objc_root_class))
4*67e74705SXin Li@interface Root @end
5*67e74705SXin Li
6*67e74705SXin Li// These should not get diagnosed immediately.
7*67e74705SXin Li@interface A : Root {
8*67e74705SXin Li  __weak id x;
9*67e74705SXin Li}
10*67e74705SXin Li@property __weak id y;
11*67e74705SXin Li@end
12*67e74705SXin Li
13*67e74705SXin Li// Diagnostic goes on the ivar if it's explicit.
14*67e74705SXin Li@interface B : Root {
15*67e74705SXin Li  __weak id x;  // expected-error {{cannot create __weak reference in file using manual reference counting}}
16*67e74705SXin Li}
17*67e74705SXin Li@property __weak id x;
18*67e74705SXin Li@end
19*67e74705SXin Li@implementation B
20*67e74705SXin Li@synthesize x;
21*67e74705SXin Li@end
22*67e74705SXin Li
23*67e74705SXin Li// Otherwise, it goes with the @synthesize.
24*67e74705SXin Li@interface C : Root
25*67e74705SXin Li@property __weak id x; // expected-note {{property declared here}}
26*67e74705SXin Li@end
27*67e74705SXin Li@implementation C
28*67e74705SXin Li@synthesize x; // expected-error {{cannot synthesize weak property in file using manual reference counting}}
29*67e74705SXin Li@end
30*67e74705SXin Li
31*67e74705SXin Li@interface D : Root
32*67e74705SXin Li@property __weak id x; // expected-note {{property declared here}}
33*67e74705SXin Li@end
34*67e74705SXin Li@implementation D // expected-error {{cannot synthesize weak property in file using manual reference counting}}
35*67e74705SXin Li@end
36*67e74705SXin Li
37*67e74705SXin Li@interface E : Root {
38*67e74705SXin Li@public
39*67e74705SXin Li  __weak id x; // expected-note 2 {{declaration uses __weak, but ARC is disabled}}
40*67e74705SXin Li}
41*67e74705SXin Li@end
42*67e74705SXin Li
43*67e74705SXin Livoid testE(E *e) {
44*67e74705SXin Li  id x = e->x; // expected-error {{'x' is unavailable}}
45*67e74705SXin Li  e->x = x; // expected-error {{'x' is unavailable}}
46*67e74705SXin Li}
47*67e74705SXin Li
48*67e74705SXin Li@interface F : Root
49*67e74705SXin Li@property (weak) id x;
50*67e74705SXin Li@end
51*67e74705SXin Li
52*67e74705SXin Livoid testF(F *f) {
53*67e74705SXin Li  id x = f.x;
54*67e74705SXin Li}
55