aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/obj-c++.dg/property/at-property-22.mm
blob: 03b3d0bb48e2ba06c8610d45c742c36b0c33611f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010.  */
/* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */

/* Test properties of different types.  */

#include <stdlib.h>
#include <objc/objc.h>
#include <objc/runtime.h>

enum colour { Red, Black };

@interface MyRootClass
{
  Class isa;
}
+ (id) initialize;
+ (id) alloc;
- (id) init;
+ (Class) class;
@end

@implementation MyRootClass
+ (id) initialize { return self; }
+ (id) alloc { return class_createInstance (self, 0); }
- (id) init { return self; }
+ (Class) class { return self; }
@end


@interface MyClass : MyRootClass
{
  /* A bunch of C types.  */
  char         pchar;
  short        pshort;
  int          pint;
  long         plong;
  float        pfloat;
  double       pdouble;
  enum colour  penum;

  /* A bunch of pointers to C types.  */
  char        *pcharp;
  short       *pshortp;
  int         *pintp;
  long        *plongp;
  float       *pfloatp;
  double      *pdoublep;
  enum colour *penump;

  /* A bunch of Objective-C types.  */
  id           pid;
  Class        pclass;
  MyClass     *pMyClassp;
}
@property (assign) char pchar;
@property (assign) short pshort;
@property (assign) int pint;
@property (assign) long plong;
@property (assign) float pfloat;
@property (assign) double pdouble;
@property (assign) enum colour penum;

@property (assign) char *pcharp;
@property (assign) short *pshortp;
@property (assign) int *pintp;
@property (assign) long *plongp;
@property (assign) float *pfloatp;
@property (assign) double *pdoublep;
@property (assign) enum colour *penump;

@property (assign) id pid;
@property (assign) Class pclass;
@property (assign) MyClass *pMyClassp;
@end

@implementation MyClass
@synthesize pchar;
@synthesize pshort;
@synthesize pint;
@synthesize plong;
@synthesize pfloat;
@synthesize pdouble;
@synthesize penum;

@synthesize pcharp;
@synthesize pshortp;
@synthesize pintp;
@synthesize plongp;
@synthesize pfloatp;
@synthesize pdoublep;
@synthesize penump;

@synthesize pid;
@synthesize pclass;
@synthesize pMyClassp;
@end

int main (void)
{
  MyClass *object = [[MyClass alloc] init];

  object.pchar = 1;
  if (object.pchar != 1)
    abort ();

  object.pshort = 2;
  if (object.pshort != 2)
    abort ();

  object.pint = 3;
  if (object.pint != 3)
    abort ();

  object.plong = 4;
  if (object.plong != 4)
    abort ();

  object.pfloat = 0;
  if (object.pfloat != 0)
    abort ();

  object.pdouble = 0;
  if (object.pdouble != 0)
    abort ();

  object.penum = Black;
  if (object.penum != Black)
    abort ();

  object.pcharp = (char *)0;
  if (object.pcharp != 0)
    abort ();
  
  object.pshortp = (short *)0;
  if (object.pshortp != 0)
    abort ();

  object.pintp = (int *)0;
  if (object.pintp != 0)
    abort ();
    
  object.plongp = (long *)0;
  if (object.plongp != 0)
    abort ();
    
  object.pfloatp = (float *)0;
  if (object.pfloatp != 0)
    abort ();
    
  object.pdoublep = (double *)0;
  if (object.pdoublep != 0)
    abort ();
    
  object.penump = (enum colour *)0;
  if (object.penump != 0)
    abort ();

  object.pid = object;
  if (object.pid != object)
    abort ();

  object.pclass = [MyClass class];
  if (object.pclass != [MyClass class])
    abort ();

  object.pMyClassp = object;
  if (object.pMyClassp != object)
    abort ();

  return 0;
}