Home | History | Annotate | Download | only in SemaObjC
      1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
      2 
      3 @interface I0 
      4 @property(readonly) int x;
      5 @property(readonly) int y;
      6 @property(readonly) int z;
      7 -(void) setY: (int) y0;
      8 @end
      9 
     10 @interface I0 (Cat0)
     11 -(void) setX: (int) a0;
     12 @end
     13 
     14 @implementation I0
     15 @dynamic x;
     16 @dynamic y;
     17 @dynamic z;
     18 -(void) setY: (int) y0{}
     19 
     20 -(void) im0 {
     21   self.x = 0;
     22   self.y = 2;
     23   self.z = 2; // expected-error {{assignment to readonly property}}
     24 }
     25 @end
     26 
     27 // Test when property is 'readonly' but it has a setter in
     28 // its implementation only.
     29 @interface I1  {
     30 }
     31 @property(readonly) int identifier;
     32 @end
     33 
     34 
     35 @implementation I1
     36 @dynamic identifier;
     37 - (void)setIdentifier:(int)ident {}
     38 
     39 - (id)initWithIdentifier:(int)Arg {
     40     self.identifier = 0;
     41 }
     42 
     43 @end
     44 
     45 
     46 // Also in a category implementation
     47 @interface I1(CAT)  
     48 @property(readonly) int rprop;
     49 @end
     50 
     51 
     52 @implementation I1(CAT)
     53 @dynamic rprop;
     54 - (void)setRprop:(int)ident {}
     55 
     56 - (id)initWithIdentifier:(int)Arg {
     57     self.rprop = 0;
     58 }
     59 
     60 @end
     61 
     62 static int g_val;
     63 
     64 @interface Root 
     65 + alloc;
     66 - init;
     67 @end
     68 
     69 @interface Subclass : Root
     70 {
     71     int setterOnly;
     72 }
     73 - (void) setSetterOnly:(int)value;
     74 @end
     75 
     76 @implementation Subclass
     77 - (void) setSetterOnly:(int)value {
     78     setterOnly = value;
     79     g_val = setterOnly;
     80 }
     81 @end
     82 
     83 @interface C {}
     84 // - (int)Foo;
     85 - (void)setFoo:(int)value;
     86 @end
     87 
     88 void g(int);
     89 
     90 void f(C *c) {
     91     c.Foo = 17; // OK 
     92     g(c.Foo); // expected-error {{no getter method for read from property}}
     93 }
     94 
     95 
     96 void abort(void);
     97 int main (void) {
     98     Subclass *x = [[Subclass alloc] init];
     99 
    100     x.setterOnly = 4;   // OK
    101     if (g_val != 4)
    102       abort ();
    103     return 0;
    104 }
    105 
    106 // rdar://11363363
    107 @interface rdar11363363
    108 {
    109   id R;
    110 }
    111 @property (copy) id p;
    112 @property (copy) id r;
    113 @property (copy) id Q;
    114 @property (copy) id t; // expected-note 2 {{property declared here}}
    115 @property (copy) id T; // expected-note 2 {{property declared here}}
    116 @property (copy) id Pxyz; // expected-note 2 {{property declared here}}
    117 @property (copy) id pxyz; // expected-note 2 {{property declared here}}
    118 @end
    119 
    120 @implementation rdar11363363
    121 @synthesize p;
    122 @synthesize r;
    123 @synthesize Q;
    124 @synthesize t, T;
    125 @synthesize Pxyz, pxyz;
    126 - (id) Meth {
    127   self.P = 0; // expected-warning {{property 'P' not found on object of type 'rdar11363363 *'; did you mean to access property p?}}
    128   self.q = 0; // expected-warning {{property 'q' not found on object of type 'rdar11363363 *'; did you mean to access property Q?}}
    129 // rdar://11528439
    130   self.t = 0; // expected-error {{synthesized properties 't' and 'T' both claim setter 'setT:'}}
    131   self.T = 0; // expected-error {{synthesized properties 'T' and 't' both claim setter 'setT:'}}
    132   self.Pxyz = 0; // expected-error {{synthesized properties 'Pxyz' and 'pxyz' both claim setter 'setPxyz:'}}
    133   self.pxyz = 0; // expected-error {{synthesized properties 'pxyz' and 'Pxyz' both claim setter 'setPxyz:'}}
    134   self.r = 0;
    135   return self.R; // expected-error {{no getter method for read from property}} \
    136                  // expected-warning {{property 'R' not found on object of type 'rdar11363363 *'; did you mean to access property r?}}
    137 }
    138 @end
    139 
    140 // rdar://11499742
    141 @class BridgeFormatter;
    142 
    143 @interface FMXBridgeFormatter 
    144 
    145 @property(assign, readwrite, getter=formatter, setter=setFormatter:) BridgeFormatter* cppFormatter;
    146 
    147 @end
    148 
    149 @implementation FMXBridgeFormatter
    150 @synthesize cppFormatter;
    151 
    152 - (void) dealloc
    153 {
    154  self.formatter = 0;
    155 }
    156 @end
    157 
    158