xref: /llvm-project/clang/test/SemaObjC/sizeof-interface.m (revision 0f1c1be1968076d6f96f8a7bcc4a15cf195ecd97)
1// RUN: %clang_cc1 -verify -fsyntax-only -Wno-objc-root-class %s
2
3@class I0; // expected-note 2{{forward declaration of class here}}
4
5int g0 = sizeof(I0); // expected-error{{invalid application of 'sizeof' to an incomplete type 'I0'}}
6
7void *g3(I0 *P) {
8  P = P+5;        // expected-error {{arithmetic on a pointer to an incomplete type 'I0'}}
9
10  return &P[4];   // expected-error{{expected method to read array element not found on object of type 'I0 *'}}
11}
12
13
14
15@interface I0 {
16@public
17  char x[4];
18}
19
20@property int p0;
21@end
22
23// size == 4
24int g1[ sizeof(I0)     // expected-error {{application of 'sizeof' to interface 'I0' is not supported on this architecture and platform}}
25       == 4 ? 1 : -1];
26
27@implementation I0
28@synthesize p0 = _p0;
29@end
30
31// size == 4 (we do not include extended properties in the
32// sizeof).
33int g2[ sizeof(I0)   // expected-error {{application of 'sizeof' to interface 'I0' is not supported on this architecture and platform}}
34       == 4 ? 1 : -1];
35
36@interface I1
37@property int p0;
38@end
39
40@implementation I1
41@synthesize p0 = _p0;
42@end
43
44typedef struct { @defs(I1); } I1_defs; // expected-error {{use of @defs is not supported on this architecture and platform}}
45
46// FIXME: This is currently broken due to the way the record layout we
47// create is tied to whether we have seen synthesized properties. Ugh.
48// int g3[ sizeof(I1) == 0 ? 1 : -1];
49
50int bar(I0 *P) {
51  P = P+5;  // expected-error {{arithmetic on pointer to interface 'I0', which is not a constant size for this architecture and platform}}
52  P = 5+P;  // expected-error {{arithmetic on pointer to interface 'I0', which is not a constant size for this architecture and platform}}
53  P = P-5;  // expected-error {{arithmetic on pointer to interface 'I0', which is not a constant size for this architecture and platform}}
54
55  return P[4].x[2];  // expected-error {{expected method to read array element not found on object of type 'I0 *'}}
56}
57
58
59@interface I @end
60
61@interface XCAttributeRunDirectNode
62{
63    @public
64    unsigned long attributeRuns[1024 + sizeof(I)]; // expected-error {{application of 'sizeof' to interface 'I' is not supported on this architecture and platform}}
65    int i;
66}
67@end
68
69@implementation XCAttributeRunDirectNode
70
71- (unsigned long)gatherStats:(id )stats
72{
73        return attributeRuns[i];
74}
75@end
76
77
78@interface Foo @end
79
80int foo(void)
81{
82  Foo *f;
83
84  // Both of these crash clang nicely
85  ++f; 	// expected-error {{arithmetic on pointer to interface 'Foo', which is not a constant size for this architecture and platform}}
86  --f; 	// expected-error {{arithmetic on pointer to interface 'Foo', which is not a constant size for this architecture and platform}}
87}
88