1/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
2/* { dg-do run } */
3/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
4
5/* Test properties of different types.  */
6
7#include <stdlib.h>
8#include <objc/objc.h>
9#include <objc/runtime.h>
10
11enum colour { Red, Black };
12
13@interface MyRootClass
14{
15  Class isa;
16}
17+ (id) initialize;
18+ (id) alloc;
19- (id) init;
20+ (Class) class;
21@end
22
23@implementation MyRootClass
24+ (id) initialize { return self; }
25+ (id) alloc { return class_createInstance (self, 0); }
26- (id) init { return self; }
27+ (Class) class { return self; }
28@end
29
30
31@interface MyClass : MyRootClass
32{
33  /* A bunch of C types.  */
34  char         pchar;
35  short        pshort;
36  int          pint;
37  long         plong;
38  float        pfloat;
39  double       pdouble;
40  enum colour  penum;
41
42  /* A bunch of pointers to C types.  */
43  char        *pcharp;
44  short       *pshortp;
45  int         *pintp;
46  long        *plongp;
47  float       *pfloatp;
48  double      *pdoublep;
49  enum colour *penump;
50
51  /* A bunch of Objective-C types.  */
52  id           pid;
53  Class        pclass;
54  MyClass     *pMyClassp;
55}
56@property (assign) char pchar;
57@property (assign) short pshort;
58@property (assign) int pint;
59@property (assign) long plong;
60@property (assign) float pfloat;
61@property (assign) double pdouble;
62@property (assign) enum colour penum;
63
64@property (assign) char *pcharp;
65@property (assign) short *pshortp;
66@property (assign) int *pintp;
67@property (assign) long *plongp;
68@property (assign) float *pfloatp;
69@property (assign) double *pdoublep;
70@property (assign) enum colour *penump;
71
72@property (assign) id pid;
73@property (assign) Class pclass;
74@property (assign) MyClass *pMyClassp;
75@end
76
77@implementation MyClass
78@synthesize pchar;
79@synthesize pshort;
80@synthesize pint;
81@synthesize plong;
82@synthesize pfloat;
83@synthesize pdouble;
84@synthesize penum;
85
86@synthesize pcharp;
87@synthesize pshortp;
88@synthesize pintp;
89@synthesize plongp;
90@synthesize pfloatp;
91@synthesize pdoublep;
92@synthesize penump;
93
94@synthesize pid;
95@synthesize pclass;
96@synthesize pMyClassp;
97@end
98
99int main (void)
100{
101  MyClass *object = [[MyClass alloc] init];
102
103  object.pchar = 1;
104  if (object.pchar != 1)
105    abort ();
106
107  object.pshort = 2;
108  if (object.pshort != 2)
109    abort ();
110
111  object.pint = 3;
112  if (object.pint != 3)
113    abort ();
114
115  object.plong = 4;
116  if (object.plong != 4)
117    abort ();
118
119  object.pfloat = 0;
120  if (object.pfloat != 0)
121    abort ();
122
123  object.pdouble = 0;
124  if (object.pdouble != 0)
125    abort ();
126
127  object.penum = Black;
128  if (object.penum != Black)
129    abort ();
130
131  object.pcharp = (char *)0;
132  if (object.pcharp != 0)
133    abort ();
134
135  object.pshortp = (short *)0;
136  if (object.pshortp != 0)
137    abort ();
138
139  object.pintp = (int *)0;
140  if (object.pintp != 0)
141    abort ();
142
143  object.plongp = (long *)0;
144  if (object.plongp != 0)
145    abort ();
146
147  object.pfloatp = (float *)0;
148  if (object.pfloatp != 0)
149    abort ();
150
151  object.pdoublep = (double *)0;
152  if (object.pdoublep != 0)
153    abort ();
154
155  object.penump = (enum colour *)0;
156  if (object.penump != 0)
157    abort ();
158
159  object.pid = object;
160  if (object.pid != object)
161    abort ();
162
163  object.pclass = [MyClass class];
164  if (object.pclass != [MyClass class])
165    abort ();
166
167  object.pMyClassp = object;
168  if (object.pMyClassp != object)
169    abort ();
170
171  return 0;
172}
173