// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s

// See Test9 for test description.
// CHECK: @_ZTTN5Test91BE = linkonce_odr unnamed_addr constant
namespace Test1 {

// Check that we don't initialize the vtable pointer in A::~A(), since the destructor body is trivial.
struct A {
  virtual void f();
  ~A();
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test11AD2Ev
// CHECK-NOT: store ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTVN5Test11AE, i64 0, i64 2), ptr
A::~A() 
{
}

}

namespace Test2 {

// Check that we do initialize the vtable pointer in A::~A() since the destructor body isn't trivial.
struct A {
  virtual void f();
  ~A();
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test21AD2Ev
// CHECK: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test21AE, i32 0, i32 0, i32 2), ptr
A::~A() {
  f();
}

}

namespace Test3 {

// Check that we don't initialize the vtable pointer in A::~A(), since the destructor body is trivial
// and Field's destructor body is also trivial.
struct Field {
  ~Field() { }
};

struct A {
  virtual void f();
  ~A();

  Field field;
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test31AD2Ev
// CHECK-NOT: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test31AE, i32 0, i32 0, i32 2), ptr
A::~A() {
  
}

}

namespace Test4 {

// Check that we do initialize the vtable pointer in A::~A(), since Field's destructor body
// isn't trivial.

void f();

struct Field {
  ~Field() { f(); }
};

struct A {
  virtual void f();
  ~A();

  Field field;
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test41AD2Ev
// CHECK: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test41AE, i32 0, i32 0, i32 2), ptr
A::~A()
{
}

}

namespace Test5 {

// Check that we do initialize the vtable pointer in A::~A(), since Field's destructor isn't
// available in this translation unit.

struct Field {
  ~Field();
};

struct A {
  virtual void f();
  ~A();

  Field field;
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test51AD2Ev
// CHECK: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test51AE, i32 0, i32 0, i32 2), ptr
A::~A()
{
}

}

namespace Test6 {

// Check that we do initialize the vtable pointer in A::~A(), since Field has a member
// variable with a non-trivial destructor body.

struct NonTrivialDestructorBody {
  ~NonTrivialDestructorBody();
};

struct Field {
  NonTrivialDestructorBody nonTrivialDestructorBody;
};

struct A {
  virtual void f();
  ~A();

  Field field;
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test61AD2Ev
// CHECK: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test61AE, i32 0, i32 0, i32 2), ptr
A::~A()
{
}

}

namespace Test7 {

// Check that we do initialize the vtable pointer in A::~A(), since Field has a base
// class with a non-trivial destructor body.

struct NonTrivialDestructorBody {
  ~NonTrivialDestructorBody();
};

struct Field : NonTrivialDestructorBody { };

struct A {
  virtual void f();
  ~A();

  Field field;
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test71AD2Ev
// CHECK: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test71AE, i32 0, i32 0, i32 2), ptr
A::~A()
{
}

}

namespace Test8 {

// Check that we do initialize the vtable pointer in A::~A(), since Field has a virtual base
// class with a non-trivial destructor body.

struct NonTrivialDestructorBody {
  ~NonTrivialDestructorBody();
};

struct Field : virtual NonTrivialDestructorBody { };

struct A {
  virtual void f();
  ~A();

  Field field;
};

// CHECK-LABEL: define{{.*}} void @_ZN5Test81AD2Ev
// CHECK: store ptr getelementptr inbounds inrange(-16, 8) ({ [3 x ptr] }, ptr @_ZTVN5Test81AE, i32 0, i32 0, i32 2), ptr
A::~A()
{
}

}

namespace Test9 {

// Check that we emit a VTT for B, even though we don't initialize the vtable pointer in the destructor.
struct A { virtual ~A () { } };
struct B : virtual A {};
struct C : virtual B { 
  virtual ~C();
};
C::~C() {}

}

namespace Test10 {

// Check that we don't initialize the vtable pointer in A::~A(), since the class has an anonymous union which
// never has its destructor invoked.
struct A {
    virtual void f();
    ~A();

    union
    {
        int i;
        unsigned u;
    };
};

// CHECK-LABEL: define{{.*}} void @_ZN6Test101AD2Ev
// CHECK-NOT: store ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTVN6Test101AE, i32 0, inrange i32 0, i32 2), ptr
A::~A() {
}

}

namespace Test11 {

// Check that we don't initialize the vtable pointer in A::~A(), even if the base class has a non trivial destructor.
struct Field {
    ~Field();
};

struct A : public Field {
    virtual void f();
    ~A();
};

// CHECK-LABEL: define{{.*}} void @_ZN6Test111AD2Ev
// CHECK-NOT: store ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTVN6Test111AE, i32 0, inrange i32 0, i32 2), ptr
A::~A() {
}

}

namespace Test12 {

// Check that we don't initialize the vtable pointer in A::~A(), since the class has an anonymous struct with trivial fields.
struct A {
    virtual void f();
    ~A();

    struct
    {
        int i;
        unsigned u;
    };
};

// CHECK-LABEL: define{{.*}} void @_ZN6Test121AD2Ev
// CHECK-NOT: store ptr getelementptr inbounds ({ [3 x ptr] }, ptr @_ZTVN6Test121AE, i32 0, inrange i32 0, i32 2), ptr
A::~A() {
}

}
