vtable-linkage.cpp revision 470fb73d4e09e1dfe62cb545d7fe0e567ac6e8d6
1// RUN: clang-cc %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2 3namespace { 4 struct A { 5 virtual void f() { } 6 }; 7} 8 9void f() { A b; } 10 11struct B { 12 B(); 13 virtual void f(); 14}; 15 16B::B() { } 17 18struct C { 19 C(); 20 virtual void f() { } 21}; 22 23C::C() { } 24 25struct D { 26 virtual void f(); 27}; 28 29void D::f() { } 30 31static struct : D { } e; 32 33// B has a key function that is not defined in this translation unit so its vtable 34// has external linkage. 35// CHECK: @_ZTV1B = external constant 36 37// C has no key function, so its vtable should have weak_odr linkage. 38// CHECK: @_ZTS1C = weak_odr constant 39// CHECK: @_ZTI1C = weak_odr constant 40// CHECK: @_ZTV1C = weak_odr constant 41 42// D has a key function that is defined in this translation unit so its vtable is 43// defined in the translation unit. 44// CHECK: @_ZTS1D = constant 45// CHECK: @_ZTI1D = constant 46// CHECK: @_ZTV1D = constant 47 48// The anonymous struct for e has no linkage, so the vtable should have 49// internal linkage. 50// CHECK: @"_ZTS3$_0" = internal constant 51// CHECK: @"_ZTI3$_0" = internal constant 52// CHECK: @"_ZTV3$_0" = internal constant 53 54// The A vtable should have internal linkage since it is inside an anonymous 55// namespace. 56// CHECK: @_ZTSN12_GLOBAL__N_11AE = internal constant 57// CHECK: @_ZTIN12_GLOBAL__N_11AE = internal constant 58// CHECK: @_ZTVN12_GLOBAL__N_11AE = internal constant 59