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