vtable-available-externally.cpp revision bbfd5babab059af14eed20b63b2aabedaa6a6ac7
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
56d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
66d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson#include <typeinfo>
76d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
86d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// Test1::A's key function (f) is not defined in this translation unit, but in
96d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// order to devirtualize calls, we emit the class related data with
106d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// available_externally linkage.
116d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
126d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST1: @_ZTVN5Test11AE = available_externally
136d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST1: @_ZTSN5Test11AE = available_externally
146d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST1: @_ZTIN5Test11AE = available_externally
156d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonnamespace Test1 {
166d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
176d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonstruct A {
186d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  A();
196d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  virtual void f();
206d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  virtual ~A() { }
216d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson};
226d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
236d7f8473cd6e967b3676948894ce72472102f9cbAnders CarlssonA::A() { }
246d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
256d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonvoid f(A* a) {
266d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  a->f();
276d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson};
286d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
296d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK: define void @_ZN5Test11gEv
306d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK: call void @_ZN5Test11A1fEv
316d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonvoid g() {
326d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  A a;
336d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  f(&a);
346d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson}
356d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
366d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson}
376d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
386d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// Test2::A's key function (f) is defined in this translation unit, but when
396d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// we're doing codegen for the typeid(A) call, we don't know that yet.
406d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// This tests mainly that the typeinfo and typename constants have their linkage
416d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// updated correctly.
426d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
436d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST2: @_ZTSN5Test21AE = constant
446d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST2: @_ZTIN5Test21AE = unnamed_addr constant
456d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson// CHECK-TEST2: @_ZTVN5Test21AE = unnamed_addr constant
466d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlssonnamespace Test2 {
476d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  struct A {
486d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson    virtual void f();
496d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  };
506d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
516d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  const std::type_info &g() {
526d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson    return typeid(A);
536d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  };
546d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson
556d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson  void A::f() { }
566d7f8473cd6e967b3676948894ce72472102f9cbAnders Carlsson}
571faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
581faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// Test that we don't assert on this test.
591faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonnamespace Test3 {
601faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
611faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct A {
621faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void f();
631faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual ~A() { }
641faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
651faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
661faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct B : A {
671faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  B();
681faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void f();
691faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
701faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
711faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders CarlssonB::B() { }
721faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
731faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonvoid g(A* a) {
741faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  a->f();
751faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
761faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
771faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
781faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
791faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// PR9114, test that we don't try to instantiate RefPtr<Node>.
801faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonnamespace Test4 {
811faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
821faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssontemplate <class T> struct RefPtr {
831faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  T* p;
841faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  ~RefPtr() {
851faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson    p->deref();
861faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  }
871faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
881faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
891faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct A {
901faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual ~A();
911faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
921faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
931faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct Node;
941faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
951faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct B : A {
961faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void deref();
971faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  RefPtr<Node> m;
981faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
991faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1001faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonvoid f() {
1011faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  RefPtr<B> b;
1021faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
1031faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1041faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
1051faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1061faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// PR9130, test that we emit a definition of A::f.
1071faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson// CHECK-TEST5: define linkonce_odr void @_ZN5Test51A1fEv
1081faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonnamespace Test5 {
1091faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1101faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct A {
1111faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual void f() { }
1121faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
1131faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1141faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlssonstruct B : A {
1151faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson  virtual ~B();
1161faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson};
1171faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1181faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders CarlssonB::~B() { }
1191faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson
1201faa89f9c619e4b2411fab4af7e22ee7a2bd9009Anders Carlsson}
121bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
122bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson// Check that we don't assert on this test.
123bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonnamespace Test6 {
124bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
125bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct A {
126bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  virtual ~A();
127bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  int a;
128bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
129bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
130bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct B {
131bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  virtual ~B();
132bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  int b;
133bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
134bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
135bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct C : A, B {
136bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  C();
137bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
138bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
139bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlssonstruct D : C {
140bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  virtual void f();
141bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson  D();
142bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson};
143bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
144bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders CarlssonD::D() { }
145bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson
146bbfd5babab059af14eed20b63b2aabedaa6a6ac7Anders Carlsson}
147