Home | History | Annotate | Download | only in ARCMT
      1 // RUN: %clang_cc1 -arcmt-check -verify -triple x86_64-apple-darwin10 %s
      2 
      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 
      9 typedef struct _NSZone NSZone;
     10 typedef int BOOL;
     11 typedef 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 
     48 extern void NSRecycleZone(NSZone *zone);
     49 
     50 NS_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 
     68 void NSLog(id, ...);
     69 
     70 int 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 
     86 void 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 
     99 void 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 
    112 void 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 
    124 void 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 
    135 void 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 }
    145