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