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