vtable-available-externally.cpp revision 93ab6bf534fb6c26563c00f28a8fc5581bb71dfd
16d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o %t
26d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST1 %s < %t
36d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST2 %s < %t
41faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST5 %s < %t
5976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson// RUN: FileCheck --check-prefix=CHECK-TEST7 %s < %t
66d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
76d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson#include <typeinfo>
86d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
9d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall// Test1::A's key function (f) is not defined in this translation
10d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall// unit, but in order to devirtualize calls, we emit the v-table with
116d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// available_externally linkage.
12d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall//
13d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall// There's no real reason to do this to the RTTI, though.
146d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
156d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST1: @_ZTVN5Test11AE = available_externally
16d5617eeafc93209a26b9f88276c88cf997c3a0a7John McCall// CHECK-TEST1: @_ZTIN5Test11AE = external constant i8*
176d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonnamespace Test1 {
186d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
196d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonstruct A {
206d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  A();
216d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  virtual void f();
226d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  virtual ~A() { }
236d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson};
246d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
256d7f8473cd6e967b3676948894ce72472102f9cbAnders CarlssonA::A() { }
266d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
276d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonvoid f(A* a) {
286d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  a->f();
296d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson};
306d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
3193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN5Test11gEv
326d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK: call void @_ZN5Test11A1fEv
336d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonvoid g() {
346d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  A a;
356d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  f(&a);
366d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson}
376d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
386d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson}
396d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
406d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// Test2::A's key function (f) is defined in this translation unit, but when
416d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// we're doing codegen for the typeid(A) call, we don't know that yet.
426d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// This tests mainly that the typeinfo and typename constants have their linkage
436d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// updated correctly.
446d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
456d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST2: @_ZTSN5Test21AE = constant
466d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST2: @_ZTIN5Test21AE = unnamed_addr constant
476d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST2: @_ZTVN5Test21AE = unnamed_addr constant
486d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonnamespace Test2 {
496d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  struct A {
506d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson    virtual void f();
516d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  };
526d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
536d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  const std::type_info &g() {
546d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson    return typeid(A);
556d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  };
566d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
576d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  void A::f() { }
586d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson}
591faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
601faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// Test that we don't assert on this test.
611faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonnamespace Test3 {
621faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
631faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct A {
641faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void f();
651faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual ~A() { }
661faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
671faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
681faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct B : A {
691faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  B();
701faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void f();
711faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
721faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
731faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders CarlssonB::B() { }
741faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
751faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonvoid g(A* a) {
761faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  a->f();
771faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
781faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
791faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
801faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
811faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// PR9114, test that we don't try to instantiate RefPtr<Node>.
821faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonnamespace Test4 {
831faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
841faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssontemplate <class T> struct RefPtr {
851faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  T* p;
861faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  ~RefPtr() {
871faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson    p->deref();
881faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  }
891faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
901faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
911faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct A {
921faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual ~A();
931faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
941faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
951faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct Node;
961faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
971faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct B : A {
981faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void deref();
991faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  RefPtr<Node> m;
1001faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
1011faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1021faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonvoid f() {
1031faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  RefPtr<B> b;
1041faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
1051faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1061faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
1071faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1081faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// PR9130, test that we emit a definition of A::f.
10993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-TEST5-LABEL: define linkonce_odr void @_ZN5Test51A1fEv
1101faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonnamespace Test5 {
1111faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1121faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct A {
1131faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void f() { }
1141faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
1151faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1161faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct B : A {
1171faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual ~B();
1181faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
1191faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1201faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders CarlssonB::~B() { }
1211faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1221faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
123bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
124bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson// Check that we don't assert on this test.
125bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonnamespace Test6 {
126bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
127bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct A {
128bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  virtual ~A();
129bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  int a;
130bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
131bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
132bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct B {
133bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  virtual ~B();
134bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  int b;
135bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
136bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
137bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct C : A, B {
138bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  C();
139bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
140bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
141bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct D : C {
142bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  virtual void f();
143bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  D();
144bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
145bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
146bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders CarlssonD::D() { }
147bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
148bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson}
149976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson
150976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlssonnamespace Test7 {
151976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson
152976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlssonstruct c1 {};
153976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlssonstruct c10 : c1{
154976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson  virtual void foo ();
155976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson};
156976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlssonstruct c11 : c10, c1{
157976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson  virtual void f6 ();
158976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson};
159976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlssonstruct c28 : virtual c11{
160976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson  void f6 ();
161976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson};
162976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson
16393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-TEST7-LABEL: define void @_ZN5Test79check_c28Ev
164976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson// CHECK-TEST7: call void @_ZN5Test73c282f6Ev
165976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson// CHECK-TEST7: ret void
166976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlssonvoid check_c28 () {
167976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson  c28 obj;
168976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson  c11 *ptr = &obj;
169976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson  ptr->f6 ();
170976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson}
171976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson
172976d91177a83101434c1985ea3b14f682f0f38c4Anders Carlsson}
173