xref: /aosp_15_r20/external/clang/test/CodeGenObjCXX/ivar-objects.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li// CHECK: -[A .cxx_construct]
3*67e74705SXin Li// CHECK: -[A .cxx_destruct]
4*67e74705SXin Li// CHECK: -[B .cxx_construct]
5*67e74705SXin Li// CHECK-NOT: -[B .cxx_destruct]
6*67e74705SXin Li// CHECK-NOT: -[C .cxx_construct]
7*67e74705SXin Li// CHECK: -[C .cxx_destruct]
8*67e74705SXin Li
9*67e74705SXin Li@interface NSObject
10*67e74705SXin Li- alloc;
11*67e74705SXin Li- init;
12*67e74705SXin Li- (void) release;
13*67e74705SXin Li@end
14*67e74705SXin Li
15*67e74705SXin Liextern "C" int printf(const char *, ...);
16*67e74705SXin Li
17*67e74705SXin Liint count = 17;
18*67e74705SXin Listruct X {
19*67e74705SXin Li  X() : value(count++) { printf( "X::X()\n"); }
20*67e74705SXin Li  ~X() { printf( "X::~X()\n"); }
21*67e74705SXin Li  int value;
22*67e74705SXin Li};
23*67e74705SXin Li
24*67e74705SXin Listruct Y {
25*67e74705SXin Li  Y() : value(count++) { printf( "Y::Y()\n"); }
26*67e74705SXin Li  ~Y() { printf( "Y::~Y()\n"); }
27*67e74705SXin Li  int value;
28*67e74705SXin Li};
29*67e74705SXin Li
30*67e74705SXin Li@interface Super : NSObject {
31*67e74705SXin Li  Y yvar;
32*67e74705SXin Li  Y yvar1;
33*67e74705SXin Li  Y ya[3];
34*67e74705SXin Li}
35*67e74705SXin Li- (void)finalize;
36*67e74705SXin Li@end
37*67e74705SXin Li
38*67e74705SXin Li@interface A : Super {
39*67e74705SXin Li  X xvar;
40*67e74705SXin Li  X xvar1;
41*67e74705SXin Li  X xvar2;
42*67e74705SXin Li  X xa[2][2];
43*67e74705SXin Li}
44*67e74705SXin Li
45*67e74705SXin Li- (void)print;
46*67e74705SXin Li- (void)finalize;
47*67e74705SXin Li@end
48*67e74705SXin Li
49*67e74705SXin Li@implementation Super
50*67e74705SXin Li- (void)print {
51*67e74705SXin Li  printf( "yvar.value = %d\n", yvar.value);
52*67e74705SXin Li  printf( "yvar1.value = %d\n", yvar1.value);
53*67e74705SXin Li  printf( "ya[0..2] = %d %d %d\n", ya[0].value, ya[1].value, ya[2].value);
54*67e74705SXin Li}
55*67e74705SXin Li- (void)finalize {}
56*67e74705SXin Li@end
57*67e74705SXin Li
58*67e74705SXin Li@implementation A
59*67e74705SXin Li- (void)print {
60*67e74705SXin Li  printf( "xvar.value = %d\n", xvar.value);
61*67e74705SXin Li  printf( "xvar1.value = %d\n", xvar1.value);
62*67e74705SXin Li  printf( "xvar2.value = %d\n", xvar2.value);
63*67e74705SXin Li  printf( "xa[0..1][0..1] = %d %d %d %d\n",
64*67e74705SXin Li                   xa[0][0].value, xa[0][1].value, xa[1][0].value, xa[1][1].value);
65*67e74705SXin Li  [super print];
66*67e74705SXin Li}
67*67e74705SXin Li- (void)finalize { [super finalize]; }
68*67e74705SXin Li@end
69*67e74705SXin Li
70*67e74705SXin Liint main() {
71*67e74705SXin Li  A *a = [[A alloc] init];
72*67e74705SXin Li  [a print];
73*67e74705SXin Li  [a release];
74*67e74705SXin Li}
75*67e74705SXin Li
76*67e74705SXin Li// rdar: // 7468090
77*67e74705SXin Liclass S {
78*67e74705SXin Lipublic:
79*67e74705SXin Li	S& operator = (const S&);
80*67e74705SXin Li};
81*67e74705SXin Li
82*67e74705SXin Li@interface I {
83*67e74705SXin Li  S position;
84*67e74705SXin Li}
85*67e74705SXin Li@property(assign, nonatomic) S position;
86*67e74705SXin Li@end
87*67e74705SXin Li
88*67e74705SXin Li@implementation I
89*67e74705SXin Li	@synthesize position;
90*67e74705SXin Li@end
91*67e74705SXin Li
92*67e74705SXin Li// This class should have a .cxx_construct but no .cxx_destruct.
93*67e74705SXin Linamespace test3 { struct S { S(); }; }
94*67e74705SXin Li@implementation B {
95*67e74705SXin Li  test3::S s;
96*67e74705SXin Li}
97*67e74705SXin Li@end
98*67e74705SXin Li
99*67e74705SXin Li// This class should have a .cxx_destruct but no .cxx_construct.
100*67e74705SXin Linamespace test4 { struct S { ~S(); }; }
101*67e74705SXin Li@implementation C {
102*67e74705SXin Li  test4::S s;
103*67e74705SXin Li}
104*67e74705SXin Li@end
105