|  | // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s | 
|  | // CHECK: -[A .cxx_construct] | 
|  | // CHECK: -[A .cxx_destruct] | 
|  | // CHECK: -[B .cxx_construct] | 
|  | // CHECK-NOT: -[B .cxx_destruct] | 
|  | // CHECK-NOT: -[C .cxx_construct] | 
|  | // CHECK: -[C .cxx_destruct] | 
|  |  | 
|  | @interface NSObject | 
|  | - alloc; | 
|  | - init; | 
|  | - (void) release; | 
|  | @end | 
|  |  | 
|  | extern "C" int printf(const char *, ...); | 
|  |  | 
|  | int count = 17; | 
|  | struct X { | 
|  | X() : value(count++) { printf( "X::X()\n"); } | 
|  | ~X() { printf( "X::~X()\n"); } | 
|  | int value; | 
|  | }; | 
|  |  | 
|  | struct Y { | 
|  | Y() : value(count++) { printf( "Y::Y()\n"); } | 
|  | ~Y() { printf( "Y::~Y()\n"); } | 
|  | int value; | 
|  | }; | 
|  |  | 
|  | @interface Super : NSObject { | 
|  | Y yvar; | 
|  | Y yvar1; | 
|  | Y ya[3]; | 
|  | } | 
|  | - (void)finalize; | 
|  | @end | 
|  |  | 
|  | @interface A : Super { | 
|  | X xvar; | 
|  | X xvar1; | 
|  | X xvar2; | 
|  | X xa[2][2]; | 
|  | } | 
|  |  | 
|  | - (void)print; | 
|  | - (void)finalize; | 
|  | @end | 
|  |  | 
|  | @implementation Super | 
|  | - (void)print { | 
|  | printf( "yvar.value = %d\n", yvar.value); | 
|  | printf( "yvar1.value = %d\n", yvar1.value); | 
|  | printf( "ya[0..2] = %d %d %d\n", ya[0].value, ya[1].value, ya[2].value); | 
|  | } | 
|  | - (void)finalize {} | 
|  | @end | 
|  |  | 
|  | @implementation A | 
|  | - (void)print { | 
|  | printf( "xvar.value = %d\n", xvar.value); | 
|  | printf( "xvar1.value = %d\n", xvar1.value); | 
|  | printf( "xvar2.value = %d\n", xvar2.value); | 
|  | printf( "xa[0..1][0..1] = %d %d %d %d\n", | 
|  | xa[0][0].value, xa[0][1].value, xa[1][0].value, xa[1][1].value); | 
|  | [super print]; | 
|  | } | 
|  | - (void)finalize { [super finalize]; } | 
|  | @end | 
|  |  | 
|  | int main() { | 
|  | A *a = [[A alloc] init]; | 
|  | [a print]; | 
|  | [a release]; | 
|  | } | 
|  |  | 
|  | // rdar: // 7468090 | 
|  | class S { | 
|  | public: | 
|  | S& operator = (const S&); | 
|  | }; | 
|  |  | 
|  | @interface I { | 
|  | S position; | 
|  | } | 
|  | @property(assign, nonatomic) S position; | 
|  | @end | 
|  |  | 
|  | @implementation I | 
|  | @synthesize position; | 
|  | @end | 
|  |  | 
|  | // This class should have a .cxx_construct but no .cxx_destruct. | 
|  | namespace test3 { struct S { S(); }; } | 
|  | @implementation B { | 
|  | test3::S s; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // This class should have a .cxx_destruct but no .cxx_construct. | 
|  | namespace test4 { struct S { ~S(); }; } | 
|  | @implementation C { | 
|  | test4::S s; | 
|  | } | 
|  | @end |