[PowerPC] Collect some CallLowering arguments into a struct. [NFC]
[llvm-project.git] / clang / test / SemaObjC / property-user-setter.m
blob7674c2b3a2cdfed007bdb80b5beb94e272b9cf9f
1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
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
10 @interface I0 (Cat0)
11 -(void) setX: (int) a0;
12 @end
14 @implementation I0
15 @dynamic x;
16 @dynamic y;
17 @dynamic z;
18 -(void) setY: (int) y0{}
20 -(void) im0 {
21   self.x = 0;
22   self.y = 2;
23   self.z = 2; // expected-error {{assignment to readonly property}}
25 @end
27 // Test when property is 'readonly' but it has a setter in
28 // its implementation only.
29 @interface I1  {
31 @property(readonly) int identifier;
32 @end
35 @implementation I1
36 @dynamic identifier;
37 - (void)setIdentifier:(int)ident {}
39 - (id)initWithIdentifier:(int)Arg {
40     self.identifier = 0;
43 @end
46 // Also in a category implementation
47 @interface I1(CAT)  
48 @property(readonly) int rprop;
49 @end
52 @implementation I1(CAT)
53 @dynamic rprop;
54 - (void)setRprop:(int)ident {}
56 - (id)initWithIdentifier:(int)Arg {
57     self.rprop = 0;
60 @end
62 static int g_val;
64 @interface Root 
65 + alloc;
66 - init;
67 @end
69 @interface Subclass : Root
71     int setterOnly;
73 - (void) setSetterOnly:(int)value;
74 @end
76 @implementation Subclass
77 - (void) setSetterOnly:(int)value {
78     setterOnly = value;
79     g_val = setterOnly;
81 @end
83 @interface C {}
84 // - (int)Foo;
85 - (void)setFoo:(int)value;
86 @end
88 void g(int);
90 void f(C *c) {
91     c.Foo = 17; // OK 
92     g(c.Foo); // expected-error {{no getter method for read from property}}
96 void abort(void);
97 int main (void) {
98     Subclass *x = [[Subclass alloc] init];
100     x.setterOnly = 4;   // OK
101     if (g_val != 4)
102       abort ();
103     return 0;
106 // rdar://11363363
107 @interface rdar11363363
109   id R;
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
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?}}
138 @end
140 // rdar://11499742
141 @class BridgeFormatter;
143 @interface FMXBridgeFormatter 
145 @property(assign, readwrite, getter=formatter, setter=setFormatter:) BridgeFormatter* cppFormatter;
147 @end
149 @implementation FMXBridgeFormatter
150 @synthesize cppFormatter;
152 - (void) dealloc
154  self.formatter = 0;
156 @end