[clang] Handle __declspec() attributes in using
[llvm-project.git] / clang / test / SemaObjC / arc-decls.m
blobe7366077d8febf8c9c3b6f996c3f1fd35be96a40
1 // RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify -Wno-objc-root-class -Wno-strict-prototypes %s
3 // rdar://8843524
5 struct A {
6   id x[4];
7   id y;
8 };
10 union u {
11   id u;
14 // Volatile fields are fine.
15 struct C {
16   volatile int x[4];
17   volatile int y;
20 union u_trivial_c {
21   volatile int b;
22   struct C c;
25 @interface I {
26    struct A a; 
27    struct B {
28     id y[10][20];
29     id z;
30    } b;
32    union u c; 
34 @end
36 // rdar://10260525
37 struct r10260525 {
38   id (^block1) ();
39   id (^block2) (void);
42 struct S { 
43     id __attribute__((objc_ownership(none))) i;
44     void * vp;
45     int i1;
48 // rdar://9046528
50 @class NSError;
52 __autoreleasing id X; // expected-error {{global variables cannot have __autoreleasing ownership}}
53 __autoreleasing NSError *E; // expected-error {{global variables cannot have __autoreleasing ownership}}
56 extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}}
58 void func(void)
60     id X;
61     static id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}}
62     extern id __autoreleasing E; // expected-error {{global variables cannot have __autoreleasing ownership}}
66 // rdar://9157348
67 // rdar://15757510
69 @interface J
70 @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-newFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
71 @property (strong) id copyBar;  // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-copyBar' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
72 @property (copy) id allocBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-allocBaz' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
73 @property (copy, nonatomic) id new;
74 @property (retain) id newDFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-newDFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
75 @property (strong) id copyDBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-copyDBar' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
76 @property (copy) id allocDBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-allocDBaz' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
77 @end
79 @implementation J
80 @synthesize newFoo;
81 @synthesize copyBar;
82 @synthesize allocBaz;
83 @synthesize new;
84 - new {return 0; };
86 @dynamic newDFoo;
87 @dynamic copyDBar; 
88 @dynamic allocDBaz;
89 @end
92 @interface MethodFamilyDiags
93 @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
94 - (id)newFoo; // expected-note {{explicitly declare getter '-newFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
96 #define OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
97 - (id)newBar; // expected-note {{explicitly declare getter '-newBar' with 'OBJC_METHOD_FAMILY_NONE' to return an 'unowned' object}}
98 @property (retain) id newBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
100 @property (retain) id newBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note {{explicitly declare getter '-newBaz' with 'OBJC_METHOD_FAMILY_NONE' to return an 'unowned' object}}
101 #undef OBJC_METHOD_FAMILY_NONE
103 @property (retain, readonly) id newGarply; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note {{explicitly declare getter '-newGarply' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}}
104 @end
106 @interface MethodFamilyDiags (Redeclarations)
107 - (id)newGarply; // no note here
108 @end
110 @implementation MethodFamilyDiags
111 @synthesize newGarply;
112 @end
115 // rdar://10187884
116 @interface Super
117 - (void)bar:(id)b; // expected-note {{parameter declared here}}
118 - (void)bar1:(id) __attribute((ns_consumed)) b;
119 - (void)ok:(id) __attribute((ns_consumed)) b;
120 - (id)ns_non; // expected-note {{method declared here}}
121 - (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}}
122 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
123 @end
125 @interface Sub : Super
126 - (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}}
127 - (void)bar1:(id)b;
128 - (void)ok:(id) __attribute((ns_consumed)) b;
129 - (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}}
130 - (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}}
131 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
132 // rdar://12173491
133 @property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void);
134 @end
136 // Test that we give a good diagnostic here that mentions the missing
137 // ownership qualifier.  We don't want this to get suppressed because
138 // of an invalid conversion.
139 void test7(void) {
140   id x;
141   id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}}
143   I *y;
144   J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}}
147 void 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)'}}
148 struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ownership' attribute only applies to variables}}
149 @interface I2
150     @property __attribute__((objc_ownership(frob))) id i; // expected-warning {{'objc_ownership' attribute argument not supported: 'frob'}}
151 @end
153 // rdar://15304886
154 @interface NSObject @end
156 @interface ControllerClass : NSObject @end
158 @interface SomeClassOwnedByController
159 @property (readonly) ControllerClass *controller; // expected-note {{property declared here}}
161 // rdar://15465916
162 @property (readonly, weak) ControllerClass *weak_controller;
163 @end
165 @interface SomeClassOwnedByController ()
166 @property (readwrite, weak) ControllerClass *controller; // expected-warning {{primary property declaration is implicitly strong while redeclaration in class extension is weak}}
168 @property (readwrite, weak) ControllerClass *weak_controller;
169 @end
171 @interface I3
172 @end
174 @interface D3 : I3
175 @end
177 @interface D3 (Cat1)
178 - (id)method;
179 @end
181 @interface I3 (Cat2)
182 // FIXME: clang should diagnose mismatch between methods in D3(Cat1) and
183 //        I3(Cat2).
184 - (id)method __attribute__((ns_returns_retained));
185 @end
187 @implementation D3
188 - (id)method {
189   return (id)0;
191 @end