Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fsyntax-only -fobjc-arc -verify %s
      2 // rdar://9340606
      3 
      4 @interface Foo {
      5 @public
      6     id __unsafe_unretained x;
      7     id __weak y;
      8     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
      9 }
     10 @property(strong) id x;
     11 @property(strong) id y;
     12 @property(strong) id z;
     13 @end
     14 
     15 @interface Bar {
     16 @public
     17     id __unsafe_unretained x;
     18     id __weak y;
     19     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
     20 }
     21 @property(retain) id x;
     22 @property(retain) id y;
     23 @property(retain) id z;
     24 @end
     25 
     26 @interface Bas {
     27 @public
     28     id __unsafe_unretained x;
     29     id __weak y;
     30     id __autoreleasing z; // expected-error {{instance variables cannot have __autoreleasing ownership}}
     31 }
     32 @property(copy) id x;
     33 @property(copy) id y;
     34 @property(copy) id z;
     35 @end
     36 
     37 // Errors should start about here :-)
     38 
     39 @interface Bat 
     40 @property(strong) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
     41 @property(strong) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}}
     42 @property(strong) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
     43 @end
     44 
     45 @interface Bau
     46 @property(retain) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
     47 @property(retain) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}}
     48 @property(retain) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
     49 @end
     50 
     51 @interface Bav 
     52 @property(copy) __unsafe_unretained id x; // expected-error {{strong property 'x' may not also be declared __unsafe_unretained}}
     53 @property(copy) __weak id y; // expected-error {{strong property 'y' may not also be declared __weak}}
     54 @property(copy) __autoreleasing id z; // expected-error {{strong property 'z' may not also be declared __autoreleasing}}
     55 @end
     56 
     57 @interface Bingo 
     58 @property(assign) __unsafe_unretained id x;
     59 @property(assign) __weak id y; // expected-error {{unsafe_unretained property 'y' may not also be declared __weak}}
     60 @property(assign) __autoreleasing id z; // expected-error {{unsafe_unretained property 'z' may not also be declared __autoreleasing}}
     61 @end
     62 
     63 @interface Batman 
     64 @property(unsafe_unretained) __unsafe_unretained id x;
     65 @property(unsafe_unretained) __weak id y; // expected-error {{unsafe_unretained property 'y' may not also be declared __weak}}
     66 @property(unsafe_unretained) __autoreleasing id z; // expected-error {{unsafe_unretained property 'z' may not also be declared __autoreleasing}}
     67 @end
     68 
     69 // rdar://9396329
     70 @interface Super
     71 @property (readonly, retain) id foo;
     72 @property (readonly, weak) id fee;
     73 @property (readonly, strong) id frr;
     74 @end
     75 
     76 @interface Bugg : Super
     77 @property (readwrite) id foo;
     78 @property (readwrite) id fee;
     79 @property (readwrite) id frr;
     80 @end
     81 
     82 // rdar://20152386
     83 // rdar://20383235
     84 
     85 @interface NSObject @end
     86 
     87 #pragma clang assume_nonnull begin
     88 @interface I: NSObject
     89 @property(nonatomic, weak) id delegate; // Do not warn, nullable is inferred. 
     90 @property(nonatomic, weak, readonly) id ROdelegate; // Do not warn, nullable is inferred.
     91 @property(nonatomic, weak, nonnull) id NonNulldelete; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
     92 @property(nonatomic, weak, nullable) id Nullabledelete; // do not warn
     93 
     94 // strong cases.
     95 @property(nonatomic, strong) id stdelegate; // Do not warn
     96 @property(nonatomic, readonly) id stROdelegate; // Do not warn
     97 @property(nonatomic, strong, nonnull) id stNonNulldelete; // Do not warn
     98 @property(nonatomic, nullable) id stNullabledelete; // do not warn
     99 @end
    100 #pragma clang assume_nonnull end
    101 
    102 @interface J: NSObject
    103 @property(nonatomic, weak) id ddd;   // Do not warn, nullable is inferred.
    104 @property(nonatomic, weak, nonnull) id delegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
    105 @property(nonatomic, weak, nonnull, readonly) id ROdelegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
    106 @end
    107 
    108 // rdar://problem/23931441
    109 @protocol P
    110 @property(readonly, retain) id prop;
    111 @end
    112 
    113 __attribute__((objc_root_class))
    114 @interface I2<P>
    115 @end
    116 
    117 @interface I2()
    118 @property (readwrite) id prop;
    119 @end
    120 
    121 @implementation I2
    122 @synthesize prop;
    123 @end
    124