1*67e74705SXin Li// RUN: %clang_cc1 -emit-llvm -o %t %s 2*67e74705SXin Li 3*67e74705SXin Liint printf(const char *, ...); 4*67e74705SXin Li 5*67e74705SXin Li@interface Root 6*67e74705SXin Li-(id) alloc; 7*67e74705SXin Li-(id) init; 8*67e74705SXin Li@end 9*67e74705SXin Li 10*67e74705SXin Litypedef struct { 11*67e74705SXin Li float x, y, z[2]; 12*67e74705SXin Li} S; 13*67e74705SXin Li 14*67e74705SXin Li@interface A : Root { 15*67e74705SXin Li int myX; 16*67e74705SXin Li // __complex myY; 17*67e74705SXin Li S myZ; 18*67e74705SXin Li} 19*67e74705SXin Li 20*67e74705SXin Li@property int x; 21*67e74705SXin Li//@property __complex int y; 22*67e74705SXin Li@property S z; 23*67e74705SXin Li@end 24*67e74705SXin Li 25*67e74705SXin Li@implementation A 26*67e74705SXin Li-(int) x { 27*67e74705SXin Li printf("-[A x] = %d\n", myX); 28*67e74705SXin Li return myX; 29*67e74705SXin Li} 30*67e74705SXin Li-(void) setX: (int) arg { 31*67e74705SXin Li myX = arg; 32*67e74705SXin Li printf("-[A setX: %d]\n", myX); 33*67e74705SXin Li} 34*67e74705SXin Li 35*67e74705SXin Li// FIXME: Add back 36*67e74705SXin Li#if 0 37*67e74705SXin Li-(__complex int) y { 38*67e74705SXin Li printf("-[A y] = (%d, %d)\n", __real myY, __imag myY); 39*67e74705SXin Li return myY; 40*67e74705SXin Li} 41*67e74705SXin Li-(void) setY: (__complex int) arg { 42*67e74705SXin Li myY = arg; 43*67e74705SXin Li printf("-[A setY: (%d, %d)]\n", __real myY, __imag myY); 44*67e74705SXin Li} 45*67e74705SXin Li#endif 46*67e74705SXin Li 47*67e74705SXin Li-(S) z { 48*67e74705SXin Li printf("-[A z] = { %f, %f, { %f, %f } }\n", 49*67e74705SXin Li myZ.x, myZ.y, myZ.z[0], myZ.z[1]); 50*67e74705SXin Li return myZ; 51*67e74705SXin Li} 52*67e74705SXin Li-(void) setZ: (S) arg { 53*67e74705SXin Li myZ = arg; 54*67e74705SXin Li printf("-[A setZ: { %f, %f, { %f, %f } } ]\n", 55*67e74705SXin Li myZ.x, myZ.y, myZ.z[0], myZ.z[1]); 56*67e74705SXin Li} 57*67e74705SXin Li 58*67e74705SXin Li@end 59*67e74705SXin Li 60*67e74705SXin Liint main() { 61*67e74705SXin Li#define SWAP(T,a,b) { T a_tmp = a; a = b; b = a_tmp; } 62*67e74705SXin Li A *a = [[A alloc] init]; 63*67e74705SXin Li A *b = [[A alloc] init]; 64*67e74705SXin Li int a0 = 23; 65*67e74705SXin Li // __complex a1 = 25 + 10i; 66*67e74705SXin Li S a2 = { 246, 458, {275, 12} }; 67*67e74705SXin Li int b0 = 42673; 68*67e74705SXin Li // __complex b1 = 15 + 13i; 69*67e74705SXin Li S b2 = { 26, 2, {367, 13} }; 70*67e74705SXin Li 71*67e74705SXin Li a.x = a0; 72*67e74705SXin Li // a.y = a1; 73*67e74705SXin Li a.z = a2; 74*67e74705SXin Li 75*67e74705SXin Li a.x += a0; 76*67e74705SXin Li // a.y += a1; 77*67e74705SXin Li // Yay, no compound assign of structures. A GCC extension in the 78*67e74705SXin Li // works, perhaps? 79*67e74705SXin Li 80*67e74705SXin Li b.x = b0; 81*67e74705SXin Li // b.y = b1; 82*67e74705SXin Li b.z = b2; 83*67e74705SXin Li 84*67e74705SXin Li int x0 = (b.x = b0); 85*67e74705SXin Li printf("(b.x = b0): %d\n", x0); 86*67e74705SXin Li 87*67e74705SXin Li // int x1 = __real (b.y = b1); 88*67e74705SXin Li // printf("__real (b.y = b1) = %d\n", x1); 89*67e74705SXin Li 90*67e74705SXin Li float x2 = (b.z = b2).x; 91*67e74705SXin Li printf("(b.z = b2).x: %f\n", x2); 92*67e74705SXin Li 93*67e74705SXin Li SWAP(int, a.x, b.x); 94*67e74705SXin Li // SWAP(__complex int, a.y, b.y); 95*67e74705SXin Li SWAP(S, a.z, b.z); 96*67e74705SXin Li 97*67e74705SXin Li return 0; 98*67e74705SXin Li} 99