xref: /aosp_15_r20/external/clang/test/SemaObjC/warn-retain-block-property.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: not %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -Wno-objc-root-class %s 2>&1 | FileCheck --check-prefix=CHECK-ARC %s
2*67e74705SXin Li// rdar://9829425
3*67e74705SXin Li
4*67e74705SXin Li// RUN: not %clang_cc1 -fsyntax-only -fblocks -Wno-objc-root-class %s 2>&1 | FileCheck %s
5*67e74705SXin Li// rdar://11761511
6*67e74705SXin Li
7*67e74705SXin Liextern void doSomething();
8*67e74705SXin Li
9*67e74705SXin Li@interface Test
10*67e74705SXin Li{
11*67e74705SXin Li@public
12*67e74705SXin Li  void (^aBlock)(void);
13*67e74705SXin Li}
14*67e74705SXin Li@property (retain) void (^aBlock)(void);
15*67e74705SXin Li@property (weak, retain) void (^aBlockW)(void);
16*67e74705SXin Li@property (strong, retain) void (^aBlockS)(void); // OK
17*67e74705SXin Li@property (readonly, retain) void (^aBlockR)(void); // OK
18*67e74705SXin Li@property (copy, retain) void (^aBlockC)(void);
19*67e74705SXin Li@property (assign, retain) void (^aBlockA)(void);
20*67e74705SXin Li@end
21*67e74705SXin Li
22*67e74705SXin Li@implementation Test
23*67e74705SXin Li@synthesize aBlock;
24*67e74705SXin Li@dynamic aBlockW, aBlockS, aBlockR, aBlockC, aBlockA;
25*67e74705SXin Li@end
26*67e74705SXin Li
27*67e74705SXin Liint main() {
28*67e74705SXin Li  Test *t;
29*67e74705SXin Li  t.aBlock = ^{ doSomething(); };
30*67e74705SXin Li  t.aBlockW = ^{ doSomething(); };
31*67e74705SXin Li  t.aBlockS = ^{ doSomething(); };
32*67e74705SXin Li}
33*67e74705SXin Li
34*67e74705SXin Li// CHECK-ARC: 14:1: warning: retain'ed block property does not copy the block - use copy attribute instead
35*67e74705SXin Li// CHECK-ARC: @property (retain) void (^aBlock)(void);
36*67e74705SXin Li// CHECK-ARC: ^
37*67e74705SXin Li// CHECK-ARC: 15:1: error: property attributes 'retain' and 'weak' are mutually exclusive
38*67e74705SXin Li// CHECK-ARC: @property (weak, retain) void (^aBlockW)(void);
39*67e74705SXin Li// CHECK-ARC: ^
40*67e74705SXin Li// CHECK-ARC: 18:1: error: property attributes 'copy' and 'retain' are mutually exclusive
41*67e74705SXin Li// CHECK-ARC: @property (copy, retain) void (^aBlockC)(void);
42*67e74705SXin Li// CHECK-ARC: ^
43*67e74705SXin Li// CHECK-ARC: 19:1: error: property attributes 'assign' and 'retain' are mutually exclusive
44*67e74705SXin Li// CHECK-ARC: @property (assign, retain) void (^aBlockA)(void);
45*67e74705SXin Li// CHECK-ARC: ^
46*67e74705SXin Li// CHECK-ARC: 30:13: warning: assigning block literal to a weak property; object will be released after assignment
47*67e74705SXin Li// CHECK-ARC:   t.aBlockW = ^{ doSomething(); };
48*67e74705SXin Li// CHECK-ARC:             ^ ~~~~~~~~~~~~~~~~~~~
49*67e74705SXin Li// CHECK-ARC: 2 warnings and 3 errors generated.
50*67e74705SXin Li
51*67e74705SXin Li// CHECK: 14:1: warning: retain'ed block property does not copy the block - use copy attribute instead
52*67e74705SXin Li// CHECK: @property (retain) void (^aBlock)(void);
53*67e74705SXin Li// CHECK: ^
54*67e74705SXin Li// CHECK: 15:1: error: property attributes 'retain' and 'weak' are mutually exclusive
55*67e74705SXin Li// CHECK: @property (weak, retain) void (^aBlockW)(void);
56*67e74705SXin Li// CHECK: ^
57*67e74705SXin Li// CHECK: 18:1: error: property attributes 'copy' and 'retain' are mutually exclusive
58*67e74705SXin Li// CHECK: @property (copy, retain) void (^aBlockC)(void);
59*67e74705SXin Li// CHECK: ^
60*67e74705SXin Li// CHECK: 19:1: error: property attributes 'assign' and 'retain' are mutually exclusive
61*67e74705SXin Li// CHECK: @property (assign, retain) void (^aBlockA)(void);
62*67e74705SXin Li// CHECK: ^
63*67e74705SXin Li// CHECK: 1 warning and 3 errors generated.
64