blob: 314e532a4768865ca9e7b19f67e6e9a52c712d96 [file] [log] [blame]
Fariborz Jahanianba96ffc2011-12-12 23:17:04 +00001// RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify %s
John McCallf85e1932011-06-15 23:02:42 +00002
3// rdar://8843524
4
5struct A {
6 id x; // expected-error {{ARC forbids Objective-C objects in structs or unions}}
7};
8
9union u {
10 id u; // expected-error {{ARC forbids Objective-C objects in structs or unions}}
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 structs or unions}}
17 id z;
18 } b;
19
20 union u c;
21};
22@end
23
Fariborz Jahanianba96ffc2011-12-12 23:17:04 +000024// rdar://10260525
25struct r10260525 {
26 id (^block) (); // expected-error {{ARC forbids blocks in structs or unions}}
27};
28
John McCallf85e1932011-06-15 23:02:42 +000029struct S {
Argyrios Kyrtzidisb8b03132011-06-24 00:08:59 +000030 id __attribute__((objc_ownership(none))) i;
John McCallf85e1932011-06-15 23:02:42 +000031 void * vp;
32 int i1;
33};
34
35// rdar://9046528
36
37@class NSError;
38
Argyrios Kyrtzidisb8b03132011-06-24 00:08:59 +000039__autoreleasing id X; // expected-error {{global variables cannot have __autoreleasing ownership}}
40__autoreleasing NSError *E; // expected-error {{global variables cannot have __autoreleasing ownership}}
John McCallf85e1932011-06-15 23:02:42 +000041
42
Argyrios Kyrtzidisb8b03132011-06-24 00:08:59 +000043extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}}
John McCallf85e1932011-06-15 23:02:42 +000044
45void func()
46{
47 id X;
Argyrios Kyrtzidisb8b03132011-06-24 00:08:59 +000048 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}}
John McCallf85e1932011-06-15 23:02:42 +000050
51}
52
53// rdar://9157348
54
55@interface J
56@property (retain) id newFoo; // expected-note {{property declared here}}
57@property (strong) id copyBar; // expected-note {{property declared here}}
58@property (copy) id allocBaz; // expected-note {{property declared here}}
59@property (copy, nonatomic) id new;
60@end
61
62@implementation J
63@synthesize newFoo; // expected-error {{property's synthesized getter follows Cocoa naming convention for returning}}
64@synthesize copyBar; // expected-error {{property's synthesized getter follows Cocoa naming convention for returning}}
65@synthesize allocBaz; // expected-error {{property's synthesized getter follows Cocoa naming convention for returning}}
66@synthesize new;
67- new {return 0; };
68@end
69
Fariborz Jahanian3240fe32011-09-27 22:35:36 +000070
71// rdar://10187884
72@interface Super
73- (void)bar:(id)b; // expected-note {{parameter declared here}}
74- (void)bar1:(id) __attribute((ns_consumed)) b;
75- (void)ok:(id) __attribute((ns_consumed)) b;
76- (id)ns_non; // expected-note {{method declared here}}
77- (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}}
78- (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
79@end
80
81@interface Sub : Super
82- (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}}
83- (void)bar1:(id)b;
84- (void)ok:(id) __attribute((ns_consumed)) b;
85- (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}}
86- (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}}
87- (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
88@end
John McCalle8c904f2012-01-26 20:04:03 +000089
90// Test that we give a good diagnostic here that mentions the missing
91// ownership qualifier. We don't want this to get suppressed because
92// of an invalid conversion.
93void test7(void) {
94 id x;
95 id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}}
96
97 I *y;
98 J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}}
99}