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