xref: /minix3/external/bsd/llvm/dist/clang/test/SemaObjC/arc-decls.m (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1// RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify -Wno-objc-root-class %s
2
3// rdar://8843524
4
5struct A {
6    id x; // expected-error {{ARC forbids Objective-C objects in struct}}
7};
8
9union u {
10    id u; // expected-error {{ARC forbids Objective-C objects in union}}
11};
12
13@interface I {
14   struct A a;
15   struct B {
16    id y[10][20]; // expected-error {{ARC forbids Objective-C objects in struct}}
17    id z;
18   } b;
19
20   union u c;
21};
22@end
23
24// rdar://10260525
25struct r10260525 {
26  id (^block) (); // expected-error {{ARC forbids blocks in struct}}
27};
28
29struct S {
30    id __attribute__((objc_ownership(none))) i;
31    void * vp;
32    int i1;
33};
34
35// rdar://9046528
36
37@class NSError;
38
39__autoreleasing id X; // expected-error {{global variables cannot have __autoreleasing ownership}}
40__autoreleasing NSError *E; // expected-error {{global variables cannot have __autoreleasing ownership}}
41
42
43extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}}
44
45void func()
46{
47    id X;
48    static id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}}
49    extern id __autoreleasing E; // expected-error {{global variables cannot have __autoreleasing ownership}}
50
51}
52
53// rdar://9157348
54// rdar://15757510
55
56@interface J
57@property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
58@property (strong) id copyBar;  // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
59@property (copy) id allocBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
60@property (copy, nonatomic) id new;
61@property (retain) id newDFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
62@property (strong) id copyDBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
63@property (copy) id allocDBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
64@end
65
66@implementation J
67@synthesize newFoo;
68@synthesize copyBar;
69@synthesize allocBaz;
70@synthesize new;
71- new {return 0; };
72
73@dynamic newDFoo;
74@dynamic copyDBar;
75@dynamic allocDBaz;
76@end
77
78
79// rdar://10187884
80@interface Super
81- (void)bar:(id)b; // expected-note {{parameter declared here}}
82- (void)bar1:(id) __attribute((ns_consumed)) b;
83- (void)ok:(id) __attribute((ns_consumed)) b;
84- (id)ns_non; // expected-note {{method declared here}}
85- (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}}
86- (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
87@end
88
89@interface Sub : Super
90- (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}}
91- (void)bar1:(id)b;
92- (void)ok:(id) __attribute((ns_consumed)) b;
93- (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}}
94- (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}}
95- (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
96// rdar://12173491
97@property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void);
98@end
99
100// Test that we give a good diagnostic here that mentions the missing
101// ownership qualifier.  We don't want this to get suppressed because
102// of an invalid conversion.
103void test7(void) {
104  id x;
105  id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}}
106
107  I *y;
108  J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}}
109}
110
111void func(void) __attribute__((objc_ownership(none)));  // expected-warning {{'objc_ownership' only applies to Objective-C object or block pointer types; type here is 'void (void)'}}
112struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ownership' attribute only applies to variables}}
113@interface I2
114    @property __attribute__((objc_ownership(frob))) id i; // expected-warning {{'objc_ownership' attribute argument not supported: 'frob'}}
115@end
116
117// rdar://15304886
118@interface NSObject @end
119
120@interface ControllerClass : NSObject @end
121
122@interface SomeClassOwnedByController
123@property (readonly) ControllerClass *controller; // expected-note {{property declared here}}
124
125// rdar://15465916
126@property (readonly, weak) ControllerClass *weak_controller;
127@end
128
129@interface SomeClassOwnedByController ()
130@property (readwrite, weak) ControllerClass *controller; // expected-warning {{primary property declaration is implicitly strong while redeclaration in class extension is weak}}
131
132@property (readwrite, weak) ControllerClass *weak_controller;
133@end
134