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