1// RUN: %clang_cc1 %s -triple=armv7-apple-darwin -emit-llvm -o - | FileCheck %s 2// RUN: %clang_cc1 %s -triple=armv7-apple-darwin -emit-llvm -o - | FileCheck -check-prefix=CHECK-LATE %s 3 4// The 'a' variants ask for the v-table first. 5// The 'b' variants ask for the v-table second. 6// The 'c' variants ask for the v-table third. 7// We do a separate CHECK-LATE pass because the RTTI definition gets 8// changed after the fact, which causes reordering of the globals. 9 10// These are not separated into namespaces because the way that Sema 11// currently reports namespaces to IR-generation (i.e., en masse for 12// the entire namespace at once) subverts the ordering that we're 13// trying to test. 14 15namespace std { class type_info; } 16extern void use(const std::type_info &rtti); 17 18/*** Test0a ******************************************************************/ 19 20struct Test0a { 21 Test0a(); 22 virtual inline void foo(); 23 virtual void bar(); 24}; 25 26// V-table should be defined externally. 27Test0a::Test0a() { use(typeid(Test0a)); } 28// CHECK: @_ZTV6Test0a = external unnamed_addr constant 29// CHECK: @_ZTI6Test0a = external constant 30 31// This is not a key function. 32void Test0a::foo() {} 33 34/*** Test0b ******************************************************************/ 35 36struct Test0b { 37 Test0b(); 38 virtual inline void foo(); 39 virtual void bar(); 40}; 41 42// This is not a key function. 43void Test0b::foo() {} 44 45// V-table should be defined externally. 46Test0b::Test0b() { use(typeid(Test0b)); } 47// CHECK: @_ZTV6Test0b = external unnamed_addr constant 48// CHECK: @_ZTI6Test0b = external constant 49 50/*** Test1a ******************************************************************/ 51 52struct Test1a { 53 Test1a(); 54 virtual void foo(); 55 virtual void bar(); 56}; 57 58// V-table needs to be defined weakly. 59Test1a::Test1a() { use(typeid(Test1a)); } 60// CHECK: @_ZTV6Test1a = linkonce_odr unnamed_addr constant 61// CHECK-LATE: @_ZTS6Test1a = linkonce_odr constant 62// CHECK-LATE: @_ZTI6Test1a = linkonce_odr constant 63 64// This defines the key function. 65inline void Test1a::foo() {} 66 67/*** Test1b ******************************************************************/ 68 69struct Test1b { 70 Test1b(); 71 virtual void foo(); 72 virtual void bar(); 73}; 74 75// This defines the key function. 76inline void Test1b::foo() {} 77 78// V-table should be defined weakly.. 79Test1b::Test1b() { use(typeid(Test1b)); } 80// CHECK: @_ZTV6Test1b = linkonce_odr unnamed_addr constant 81// CHECK: @_ZTS6Test1b = linkonce_odr constant 82// CHECK: @_ZTI6Test1b = linkonce_odr constant 83 84/*** Test2a ******************************************************************/ 85 86struct Test2a { 87 Test2a(); 88 virtual void foo(); 89 virtual void bar(); 90}; 91 92// V-table should be defined with weak linkage. 93Test2a::Test2a() { use(typeid(Test2a)); } 94// CHECK: @_ZTV6Test2a = linkonce_odr unnamed_addr constant 95// CHECK-LATE: @_ZTS6Test2a = linkonce_odr constant 96// CHECK-LATE: @_ZTI6Test2a = linkonce_odr constant 97 98void Test2a::bar() {} 99inline void Test2a::foo() {} 100 101/*** Test2b ******************************************************************/ 102 103struct Test2b { 104 Test2b(); 105 virtual void foo(); 106 virtual void bar(); 107}; 108 109void Test2b::bar() {} 110 111// V-table should be defined with weak linkage. 112Test2b::Test2b() { use(typeid(Test2b)); } 113// CHECK: @_ZTV6Test2b = linkonce_odr unnamed_addr constant 114// CHECK-LATE: @_ZTS6Test2b = linkonce_odr constant 115// CHECK-LATE: @_ZTI6Test2b = linkonce_odr constant 116 117inline void Test2b::foo() {} 118 119/*** Test2c ******************************************************************/ 120 121struct Test2c { 122 Test2c(); 123 virtual void foo(); 124 virtual void bar(); 125}; 126 127void Test2c::bar() {} 128inline void Test2c::foo() {} 129 130// V-table should be defined with weak linkage. 131Test2c::Test2c() { use(typeid(Test2c)); } 132// CHECK: @_ZTV6Test2c = linkonce_odr unnamed_addr constant 133// CHECK: @_ZTS6Test2c = linkonce_odr constant 134// CHECK: @_ZTI6Test2c = linkonce_odr constant 135 136/*** Test3a ******************************************************************/ 137 138struct Test3a { 139 Test3a(); 140 virtual void foo(); 141 virtual void bar(); 142}; 143 144// V-table should be defined with weak linkage. 145Test3a::Test3a() { use(typeid(Test3a)); } 146// CHECK: @_ZTV6Test3a = linkonce_odr unnamed_addr constant 147// CHECK-LATE: @_ZTS6Test3a = linkonce_odr constant 148// CHECK-LATE: @_ZTI6Test3a = linkonce_odr constant 149 150// This defines the key function. 151inline void Test3a::bar() {} 152inline void Test3a::foo() {} 153 154/*** Test3b ******************************************************************/ 155 156struct Test3b { 157 Test3b(); 158 virtual void foo(); 159 virtual void bar(); 160}; 161 162inline void Test3b::bar() {} 163 164// V-table should be defined with weak linkage. 165Test3b::Test3b() { use(typeid(Test3b)); } 166// CHECK: @_ZTV6Test3b = linkonce_odr unnamed_addr constant 167// CHECK-LATE: @_ZTS6Test3b = linkonce_odr constant 168// CHECK-LATE: @_ZTI6Test3b = linkonce_odr constant 169 170// This defines the key function. 171inline void Test3b::foo() {} 172 173/*** Test3c ******************************************************************/ 174 175struct Test3c { 176 Test3c(); 177 virtual void foo(); 178 virtual void bar(); 179}; 180 181// This defines the key function. 182inline void Test3c::bar() {} 183inline void Test3c::foo() {} 184 185// V-table should be defined with weak linkage. 186Test3c::Test3c() { use(typeid(Test3c)); } 187// CHECK: @_ZTV6Test3c = linkonce_odr unnamed_addr constant 188// CHECK: @_ZTS6Test3c = linkonce_odr constant 189// CHECK: @_ZTI6Test3c = linkonce_odr constant 190