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