Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify -Wno-objc-root-class %s
      2 
      3 // rdar://8843524
      4 
      5 struct A {
      6     id x; // expected-error {{ARC forbids Objective-C objects in struct}}
      7 };
      8 
      9 union u {
     10     id u; // expected-error {{ARC forbids Objective-C objects in union}}
     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 struct}}
     17     id z;
     18    } b;
     19 
     20    union u c; 
     21 };
     22 @end
     23 
     24 // rdar://10260525
     25 struct r10260525 {
     26   id (^block) (); // expected-error {{ARC forbids blocks in struct}}
     27 };
     28 
     29 struct S { 
     30     id __attribute__((objc_ownership(none))) i;
     31     void * vp;
     32     int i1;
     33 };
     34 
     35 // rdar://9046528
     36 
     37 @class NSError;
     38 
     39 __autoreleasing id X; // expected-error {{global variables cannot have __autoreleasing ownership}}
     40 __autoreleasing NSError *E; // expected-error {{global variables cannot have __autoreleasing ownership}}
     41 
     42 
     43 extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}}
     44 
     45 void func()
     46 {
     47     id X;
     48     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}}
     50 
     51 }
     52 
     53 // rdar://9157348
     54 // rdar://15757510
     55 
     56 @interface J
     57 @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
     58 @property (strong) id copyBar;  // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
     59 @property (copy) id allocBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
     60 @property (copy, nonatomic) id new;
     61 @property (retain) id newDFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
     62 @property (strong) id copyDBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
     63 @property (copy) id allocDBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}}
     64 @end
     65 
     66 @implementation J
     67 @synthesize newFoo;
     68 @synthesize copyBar;
     69 @synthesize allocBaz;
     70 @synthesize new;
     71 - new {return 0; };
     72 
     73 @dynamic newDFoo;
     74 @dynamic copyDBar; 
     75 @dynamic allocDBaz;
     76 @end
     77 
     78 
     79 // rdar://10187884
     80 @interface Super
     81 - (void)bar:(id)b; // expected-note {{parameter declared here}}
     82 - (void)bar1:(id) __attribute((ns_consumed)) b;
     83 - (void)ok:(id) __attribute((ns_consumed)) b;
     84 - (id)ns_non; // expected-note {{method declared here}}
     85 - (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}}
     86 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
     87 @end
     88 
     89 @interface Sub : Super
     90 - (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}}
     91 - (void)bar1:(id)b;
     92 - (void)ok:(id) __attribute((ns_consumed)) b;
     93 - (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}}
     94 - (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}}
     95 - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained));
     96 // rdar://12173491
     97 @property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void);
     98 @end
     99 
    100 // Test that we give a good diagnostic here that mentions the missing
    101 // ownership qualifier.  We don't want this to get suppressed because
    102 // of an invalid conversion.
    103 void test7(void) {
    104   id x;
    105   id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}}
    106 
    107   I *y;
    108   J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}}
    109 }
    110 
    111 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)'}}
    112 struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ownership' attribute only applies to variables}}
    113 @interface I2
    114     @property __attribute__((objc_ownership(frob))) id i; // expected-warning {{'objc_ownership' attribute argument not supported: 'frob'}}
    115 @end
    116 
    117 // rdar://15304886
    118 @interface NSObject @end
    119 
    120 @interface ControllerClass : NSObject @end
    121 
    122 @interface SomeClassOwnedByController
    123 @property (readonly) ControllerClass *controller; // expected-note {{property declared here}}
    124 
    125 // rdar://15465916
    126 @property (readonly, weak) ControllerClass *weak_controller;
    127 @end
    128 
    129 @interface SomeClassOwnedByController ()
    130 @property (readwrite, weak) ControllerClass *controller; // expected-warning {{primary property declaration is implicitly strong while redeclaration in class extension is weak}}
    131 
    132 @property (readwrite, weak) ControllerClass *weak_controller;
    133 @end
    134