blob: 6528f3e62d1e98b7684f4172caa0fa3e539e85ae [file] [log] [blame]
Argyrios Kyrtzidise665d692011-06-18 00:53:41 +00001// RUN: %clang_cc1 -arcmt-check -verify -triple x86_64-apple-darwin10 -fobjc-nonfragile-abi %s
John McCall8f0e8d22011-06-15 23:25:17 +00002
3#if __has_feature(objc_arr)
4#define NS_AUTOMATED_REFCOUNT_UNAVAILABLE __attribute__((unavailable("not available in automatic reference counting mode")))
5#else
6#define NS_AUTOMATED_REFCOUNT_UNAVAILABLE
7#endif
8
9typedef struct _NSZone NSZone;
10typedef int BOOL;
11typedef unsigned NSUInteger;
12
13@protocol NSObject
14- (BOOL)isEqual:(id)object;
15- (id)retain NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
16- (NSUInteger)retainCount NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
17- (oneway void)release NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
18- (id)autorelease NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
19
20- (NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
21@end
22
23@protocol NSCopying
24- (id)copyWithZone:(NSZone *)zone;
25@end
26
27@protocol NSMutableCopying
28- (id)mutableCopyWithZone:(NSZone *)zone;
29@end
30
31@interface NSObject <NSObject> {}
32- (id)init;
33
34+ (id)new;
35+ (id)allocWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
36+ (id)alloc;
37- (void)dealloc;
38
39- (void)finalize;
40
41- (id)copy;
42- (id)mutableCopy;
43
44+ (id)copyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
45+ (id)mutableCopyWithZone:(NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
46@end
47
48extern void NSRecycleZone(NSZone *zone);
49
50NS_AUTOMATED_REFCOUNT_UNAVAILABLE
51@interface NSAutoreleasePool : NSObject { // expected-note 13 {{marked unavailable here}}
52@private
53 void *_token;
54 void *_reserved3;
55 void *_reserved2;
56 void *_reserved;
57}
58
59+ (void)addObject:(id)anObject;
60
61- (void)addObject:(id)anObject;
62
63- (void)drain;
64
65@end
66
67
68void NSLog(id, ...);
69
70int main (int argc, const char * argv[]) {
71 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
72 NSAutoreleasePool *chunkPool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}}
73
74 while (argc) {
75 [chunkPool release];
76 // the following pool was not released in this scope, don't touch it.
77 chunkPool = [[NSAutoreleasePool alloc] init]; // expected-error {{'NSAutoreleasePool' is unavailable}}
78 }
79
80 [chunkPool drain];
81 [pool drain];
82
83 return 0;
84}
85
86void f(void) {
87 NSAutoreleasePool * pool; // expected-error {{'NSAutoreleasePool' is unavailable}}
88
89 for (int i=0; i != 10; ++i) {
90 id x = pool; // We won't touch a NSAutoreleasePool if we can't safely
91 // remove all the references to it.
92 }
93
94 pool = [[NSAutoreleasePool alloc] init]; // expected-error {{'NSAutoreleasePool' is unavailable}}
95 NSLog(@"%s", "YES");
96 [pool release];
97}
98
99void f2(void) {
100 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
101 // expected-note {{scope begins here}}
102
103 // 'x' is declared inside the "pool scope" but used outside it, if we create
104 // a @autorelease scope it will be undefined outside it so don't touch the pool.
105 int x = 0; // expected-note {{declared here}}
106
107 [pool release]; // expected-note {{scope ends here}}
108
109 ++x; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
110}
111
112void f3(void) {
113 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
114 // expected-note {{scope begins here}}
115
116 struct S { int x; }; // expected-note {{declared here}}
117
118 [pool release]; // expected-note {{scope ends here}}
119
120 struct S *var; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
121 var->x = 0;
122}
123
124void f4(void) {
125 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
126 // expected-note {{scope begins here}}
127
128 enum { Bar }; // expected-note {{declared here}}
129
130 [pool release]; // expected-note {{scope ends here}}
131
132 int x = Bar; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
133}
134
135void f5(void) {
136 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // expected-error 2 {{'NSAutoreleasePool' is unavailable}} \
137 // expected-note {{scope begins here}}
138
139 typedef int Bar; // expected-note {{declared here}}
140
141 [pool release]; // expected-note {{scope ends here}}
142
143 Bar x; // expected-error {{a name is referenced outside the NSAutoreleasePool scope that it was declared in}}
144}