Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaObjC / flexible-array.m
blobff3dc711e581efb7fc5e39d019ab7c33bd765f1a
1 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
3 // # Flexible array member.
4 // ## Instance variables only in interface.
5 @interface LastIvar {
6   char flexible[];
8 @end
10 @interface NotLastIvar {
11   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
12   int last; // expected-note {{next instance variable declaration is here}}
14 @end
16 // ## Instance variables in implementation.
17 @interface LastIvarInImpl
18 @end
19 @implementation LastIvarInImpl {
20   char flexible[]; // expected-warning {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
22 @end
24 @interface NotLastIvarInImpl
25 @end
26 @implementation NotLastIvarInImpl {
27   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
28   // expected-warning@-1 {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
29   int last; // expected-note {{next instance variable declaration is here}}
31 @end
33 @implementation NotLastIvarInImplWithoutInterface { // expected-warning {{cannot find interface declaration for 'NotLastIvarInImplWithoutInterface'}}
34   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
35   // expected-warning@-1 {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
36   int last; // expected-note {{next instance variable declaration is here}}
38 @end
40 @interface LastIvarInClass_OtherIvarInImpl {
41   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
43 @end
44 @implementation LastIvarInClass_OtherIvarInImpl {
45   int last; // expected-note {{next instance variable declaration is here}}
47 @end
49 // ## Non-instance variables in implementation.
50 @interface LastIvarInClass_UnrelatedVarInImpl {
51   char flexible[];
53 @end
54 @implementation LastIvarInClass_UnrelatedVarInImpl
55 int nonIvar;
56 @end
58 // ## Instance variables in class extension.
59 @interface LastIvarInExtension
60 @end
61 @interface LastIvarInExtension() {
62   char flexible[]; // expected-warning {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
64 @end
66 @interface NotLastIvarInExtension
67 @end
68 @interface NotLastIvarInExtension() {
69   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
70   // expected-warning@-1 {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
71   int last; // expected-note {{next instance variable declaration is here}}
73 @end
75 @interface LastIvarInClass_OtherIvarInExtension {
76   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
78 @end
79 @interface LastIvarInClass_OtherIvarInExtension() {
80   int last; // expected-note {{next instance variable declaration is here}}
82 @end
84 @interface LastIvarInExtension_OtherIvarInExtension
85 @end
86 @interface LastIvarInExtension_OtherIvarInExtension() {
87   int last; // expected-note {{next instance variable declaration is here}}
89 @end
90 @interface LastIvarInExtension_OtherIvarInExtension()
91 // Extension without ivars to test we see through such extensions.
92 @end
93 @interface LastIvarInExtension_OtherIvarInExtension() {
94   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
95   // expected-warning@-1 {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
97 @end
99 @interface LastIvarInExtension_OtherIvarInImpl
100 @end
101 @interface LastIvarInExtension_OtherIvarInImpl() {
102   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
103   // expected-warning@-1 {{field 'flexible' with variable sized type 'char[]' is not visible to subclasses and can conflict with their instance variables}}
105 @end
106 @implementation LastIvarInExtension_OtherIvarInImpl {
107   int last; // expected-note {{next instance variable declaration is here}}
109 @end
111 // ## Instance variables in named categories.
112 @interface IvarInNamedCategory
113 @end
114 @interface IvarInNamedCategory(Category) {
115   char flexible[]; // expected-error {{instance variables may not be placed in categories}}
117 @end
119 // ## Synthesized instance variable.
120 @interface LastIvarAndProperty {
121   char _flexible[];
123 @property char flexible[]; // expected-error {{property cannot have array or function type 'char[]'}}
124 @end
126 // ## Synthesize other instance variables.
127 @interface LastIvar_ExplicitlyNamedPropertyBackingIvarPreceding {
128   int _elementsCount;
129   char flexible[];
131 @property int count;
132 @end
133 @implementation LastIvar_ExplicitlyNamedPropertyBackingIvarPreceding
134 @synthesize count = _elementsCount;
135 @end
137 @interface LastIvar_ImplicitlyNamedPropertyBackingIvarPreceding {
138   int count;
139   char flexible[];
141 @property int count;
142 @end
143 @implementation LastIvar_ImplicitlyNamedPropertyBackingIvarPreceding
144 @synthesize count;
145 @end
147 @interface NotLastIvar_ExplicitlyNamedPropertyBackingIvarLast {
148   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
150 @property int count;
151 @end
152 @implementation NotLastIvar_ExplicitlyNamedPropertyBackingIvarLast
153 @synthesize count = _elementsCount; // expected-note {{next synthesized instance variable is here}}
154 @end
156 @interface NotLastIvar_ImplicitlyNamedPropertyBackingIvarLast {
157   char flexible[]; // expected-error {{flexible array member 'flexible' with type 'char[]' is not at the end of class}}
159 @property int count; // expected-note {{next synthesized instance variable is here}}
160 @end
161 @implementation NotLastIvar_ImplicitlyNamedPropertyBackingIvarLast
162 // Test auto-synthesize.
163 //@synthesize count;
164 @end
167 // # Variable sized types.
168 struct Packet {
169   unsigned int size;
170   char data[];
173 // ## Instance variables only in interface.
174 @interface LastStructIvar {
175   struct Packet flexible;
177 @end
179 @interface NotLastStructIvar {
180   struct Packet flexible; // expected-error {{field 'flexible' with variable sized type 'struct Packet' is not at the end of class}}
181   int last; // expected-note {{next instance variable declaration is here}}
183 @end
185 // ## Instance variables in implementation.
186 @interface LastStructIvarInImpl
187 @end
188 @implementation LastStructIvarInImpl {
189   struct Packet flexible; // expected-warning {{field 'flexible' with variable sized type 'struct Packet' is not visible to subclasses and can conflict with their instance variables}}
191 @end
193 @interface NotLastStructIvarInImpl
194 @end
195 @implementation NotLastStructIvarInImpl {
196   struct Packet flexible; // expected-error {{field 'flexible' with variable sized type 'struct Packet' is not at the end of class}}
197   // expected-warning@-1 {{field 'flexible' with variable sized type 'struct Packet' is not visible to subclasses and can conflict with their instance variables}}
198   int last; // expected-note {{next instance variable declaration is here}}
200 @end
202 @interface LastStructIvarInClass_OtherIvarInImpl {
203   struct Packet flexible; // expected-error {{field 'flexible' with variable sized type 'struct Packet' is not at the end of class}}
205 @end
206 @implementation LastStructIvarInClass_OtherIvarInImpl {
207   int last; // expected-note {{next instance variable declaration is here}}
209 @end
211 // ## Synthesized instance variable.
212 @interface LastSynthesizeStructIvar
213 @property int first;
214 @property struct Packet flexible; // expected-error {{synthesized property with variable size type 'struct Packet' requires an existing instance variable}}
215 @end
216 @implementation LastSynthesizeStructIvar
217 @end
219 @interface NotLastSynthesizeStructIvar
220 @property struct Packet flexible; // expected-error {{synthesized property with variable size type 'struct Packet' requires an existing instance variable}}
221 @property int last;
222 @end
223 @implementation NotLastSynthesizeStructIvar
224 @end
226 @interface LastStructIvarWithExistingIvarAndSynthesizedProperty {
227   struct Packet _flexible;
229 @property struct Packet flexible;
230 @end
231 @implementation LastStructIvarWithExistingIvarAndSynthesizedProperty
232 @end
235 // # Subclasses.
236 @interface FlexibleArrayMemberBase {
237   char flexible[]; // expected-note6 {{'flexible' declared here}}
239 @end
241 @interface NoIvarAdditions : FlexibleArrayMemberBase
242 @end
243 @implementation NoIvarAdditions
244 @end
246 @interface AddedIvarInInterface : FlexibleArrayMemberBase {
247   int last; // expected-warning {{field 'last' can overwrite instance variable 'flexible' with variable sized type 'char[]' in superclass 'FlexibleArrayMemberBase'}}
249 @end
251 @interface AddedIvarInImplementation : FlexibleArrayMemberBase
252 @end
253 @implementation AddedIvarInImplementation {
254   int last; // expected-warning {{field 'last' can overwrite instance variable 'flexible' with variable sized type 'char[]' in superclass 'FlexibleArrayMemberBase'}}
256 @end
258 @interface AddedIvarInExtension : FlexibleArrayMemberBase
259 @end
260 @interface AddedIvarInExtension() {
261   int last; // expected-warning {{field 'last' can overwrite instance variable 'flexible' with variable sized type 'char[]' in superclass 'FlexibleArrayMemberBase'}}
263 @end
265 @interface SynthesizedIvar : FlexibleArrayMemberBase
266 @property int count;
267 @end
268 @implementation SynthesizedIvar
269 @synthesize count; // expected-warning {{field 'count' can overwrite instance variable 'flexible' with variable sized type 'char[]' in superclass 'FlexibleArrayMemberBase'}}
270 @end
272 @interface WarnInSubclassOnlyOnce : FlexibleArrayMemberBase {
273   int last; // expected-warning {{field 'last' can overwrite instance variable 'flexible' with variable sized type 'char[]' in superclass 'FlexibleArrayMemberBase'}}
275 @end
276 @interface WarnInSubclassOnlyOnce() {
277   int laster;
279 @end
280 @implementation WarnInSubclassOnlyOnce {
281   int lastest;
283 @end
285 @interface AddedIvarInSubSubClass : NoIvarAdditions {
286   int last; // expected-warning {{field 'last' can overwrite instance variable 'flexible' with variable sized type 'char[]' in superclass 'FlexibleArrayMemberBase'}}
288 @end