skip-vtable-pointer-initialization.cpp revision ffb945ffb5d29b80fd93649c3572b6d87abce3fc
1// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2 3namespace Test1 { 4 5// Check that we don't initialize the vtable pointer in A::~A(), since the destructor body is trivial. 6struct A { 7 virtual void f(); 8 ~A(); 9}; 10 11// CHECK: define void @_ZN5Test11AD2Ev 12// CHECK-NOT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test11AE, i64 0, i64 2), i8*** 13A::~A() 14{ 15} 16 17} 18 19namespace Test2 { 20 21// Check that we do initialize the vtable pointer in A::~A() since the destructor body isn't trivial. 22struct A { 23 virtual void f(); 24 ~A(); 25}; 26 27// CHECK: define void @_ZN5Test21AD2Ev 28// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test21AE, i64 0, i64 2), i8*** 29A::~A() { 30 f(); 31} 32 33} 34 35namespace Test3 { 36 37// Check that we don't initialize the vtable pointer in A::~A(), since the destructor body is trivial 38// and Field's destructor body is also trivial. 39struct Field { 40 ~Field() { } 41}; 42 43struct A { 44 virtual void f(); 45 ~A(); 46 47 Field field; 48}; 49 50// CHECK: define void @_ZN5Test31AD2Ev 51// CHECK-NOT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test31AE, i64 0, i64 2), i8*** 52A::~A() { 53 54} 55 56} 57 58namespace Test4 { 59 60// Check that we do initialize the vtable pointer in A::~A(), since Field's destructor body 61// isn't trivial. 62 63void f(); 64 65struct Field { 66 ~Field() { f(); } 67}; 68 69struct A { 70 virtual void f(); 71 ~A(); 72 73 Field field; 74}; 75 76// CHECK: define void @_ZN5Test41AD2Ev 77// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test41AE, i64 0, i64 2), i8*** 78A::~A() 79{ 80} 81 82} 83 84namespace Test5 { 85 86// Check that we do initialize the vtable pointer in A::~A(), since Field's destructor isn't 87// available in this translation unit. 88 89struct Field { 90 ~Field(); 91}; 92 93struct A { 94 virtual void f(); 95 ~A(); 96 97 Field field; 98}; 99 100// CHECK: define void @_ZN5Test51AD2Ev 101// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test51AE, i64 0, i64 2), i8*** 102A::~A() 103{ 104} 105 106}