rtti-linkage.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck -check-prefix=CHECK-WITH-HIDDEN %s 3ecb2df2408639e554def61080ce3afdb41e2f705Daniel Dunbar 48d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson#include <typeinfo> 54e7135613a558020f003972b2a5ae5f8d5306508Anders Carlsson 66d576051b9ca56fe962077fb194ed2917539989aArgyrios Kyrtzidis// CHECK-WITH-HIDDEN: _ZTSFN12_GLOBAL__N_11DEvE = internal constant 7907c828b080332854826a87451e838930f4be788Anders Carlsson// CHECK-WITH-HIDDEN: @_ZTSPK2T4 = linkonce_odr hidden constant 8f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK-WITH-HIDDEN: @_ZTS2T4 = linkonce_odr hidden constant 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTI2T4 = linkonce_odr hidden constant 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTIPK2T4 = linkonce_odr hidden constant 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTSZ2t5vE1A = internal constant 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTIZ2t5vE1A = internal constant 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTSPZ2t7vE1A = linkonce_odr hidden constant 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTSZ2t7vE1A = linkonce_odr hidden constant 15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTIZ2t7vE1A = linkonce_odr hidden constant 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTIPZ2t7vE1A = linkonce_odr hidden constant 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTSZ2t6vE1A = linkonce_odr hidden constant 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK-WITH-HIDDEN: @_ZTIZ2t6vE1A = linkonce_odr hidden constant 196fb745bdf1ff1e32caf07e42093a7920726892c1Douglas Gregor 20fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSP1C = internal constant 21fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTS1C = internal constant 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTI1C = internal constant 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIP1C = internal constant 24fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSPP1C = internal constant 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIPP1C = internal constant 26fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSM1Ci = internal constant 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIM1Ci = internal constant 28fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSPM1Ci = internal constant 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIPM1Ci = internal constant 30fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSM1CS_ = internal constant 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIM1CS_ = internal constant 32fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSM1CPS_ = internal constant 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIM1CPS_ = internal constant 34fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSM1A1C = internal constant 35f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: _ZTS1A = linkonce_odr constant 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTI1A = linkonce_odr constant 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIM1A1C = internal constant 38fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSM1AP1C = internal constant 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIM1AP1C = internal constant 40fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSN12_GLOBAL__N_11DE = internal constant 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIN12_GLOBAL__N_11DE = internal constant 42fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTSPN12_GLOBAL__N_11DE = internal constant 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIPN12_GLOBAL__N_11DE = internal constant 4409b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson// CHECK: _ZTSFN12_GLOBAL__N_11DEvE = internal constant 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIFN12_GLOBAL__N_11DEvE = internal constant 4609b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson// CHECK: _ZTSFvN12_GLOBAL__N_11DEE = internal constant 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIFvN12_GLOBAL__N_11DEE = internal constant 48f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: _ZTSPFvvE = linkonce_odr constant 49f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: _ZTSFvvE = linkonce_odr constant 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIFvvE = linkonce_odr constant 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIPFvvE = linkonce_odr constant 529c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson// CHECK: _ZTSN12_GLOBAL__N_11EE = internal constant 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIN12_GLOBAL__N_11EE = internal constant 54f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: _ZTSA10_i = linkonce_odr constant 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIA10_i = linkonce_odr constant 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTI1TILj0EE = linkonce_odr constant 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTI1TILj1EE = weak_odr constant 58fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTI1TILj2EE = external constant 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTSZ2t5vE1A = internal constant 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIZ2t5vE1A = internal constant 61fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTS1B = constant 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTI1B = constant 63f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: _ZTS1F = linkonce_odr constant 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTSPZ2t7vE1A = linkonce_odr constant 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTSZ2t7vE1A = linkonce_odr constant 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIZ2t7vE1A = linkonce_odr constant 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIPZ2t7vE1A = linkonce_odr constant 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTSZ2t6vE1A = linkonce_odr constant 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: _ZTIZ2t6vE1A = linkonce_odr constant 70fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi 71fd4524b4452d5dcda9c7cb9b1b665fd0f4b6267eNAKAMURA Takumi// CHECK: _ZTIN12_GLOBAL__N_11DE to 729c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson 73f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// A has no key function, so its RTTI data should be linkonce_odr. 744e7135613a558020f003972b2a5ae5f8d5306508Anders Carlssonstruct A { }; 754e7135613a558020f003972b2a5ae5f8d5306508Anders Carlsson 764e7135613a558020f003972b2a5ae5f8d5306508Anders Carlsson// B has a key function defined in the translation unit, so the RTTI data should 774e7135613a558020f003972b2a5ae5f8d5306508Anders Carlsson// be emitted in this translation unit and have external linkage. 784e7135613a558020f003972b2a5ae5f8d5306508Anders Carlssonstruct B : A { 794e7135613a558020f003972b2a5ae5f8d5306508Anders Carlsson virtual void f(); 804e7135613a558020f003972b2a5ae5f8d5306508Anders Carlsson}; 814e7135613a558020f003972b2a5ae5f8d5306508Anders Carlssonvoid B::f() { } 828d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson 838d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson// C is an incomplete class type, so any direct or indirect pointer types should have 84f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson// internal linkage, as should the type info for C itself. 858d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlssonstruct C; 868d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson 87610b0d94d71810773378be4f39922a56b1202a83Anders Carlssonvoid t1() { 888d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson (void)typeid(C*); 898d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson (void)typeid(C**); 9017fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson (void)typeid(int C::*); 9117fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson (void)typeid(int C::**); 9217fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson (void)typeid(C C::*); 9317fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson (void)typeid(C *C::*); 9417fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson (void)typeid(C A::*); 9517fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson (void)typeid(C* A::*); 968d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson} 978d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson 98610b0d94d71810773378be4f39922a56b1202a83Anders Carlssonnamespace { 99610b0d94d71810773378be4f39922a56b1202a83Anders Carlsson // D is inside an anonymous namespace, so all type information related to D should have 100610b0d94d71810773378be4f39922a56b1202a83Anders Carlsson // internal linkage. 101610b0d94d71810773378be4f39922a56b1202a83Anders Carlsson struct D { }; 1029c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson 1039c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson // E is also inside an anonymous namespace. 1049c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson enum E { }; 1059c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson 106610b0d94d71810773378be4f39922a56b1202a83Anders Carlsson}; 107610b0d94d71810773378be4f39922a56b1202a83Anders Carlsson 108e8f90389c43efbbe820574f674a98ac701bf48a2Anders Carlsson// F has a key function defined in the translation unit, but it is inline so the RTTI 109f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// data should be emitted with linkonce_odr linkage. 110e8f90389c43efbbe820574f674a98ac701bf48a2Anders Carlssonstruct F { 111e8f90389c43efbbe820574f674a98ac701bf48a2Anders Carlsson virtual void f(); 112e8f90389c43efbbe820574f674a98ac701bf48a2Anders Carlsson}; 113e8f90389c43efbbe820574f674a98ac701bf48a2Anders Carlsson 114e8f90389c43efbbe820574f674a98ac701bf48a2Anders Carlssoninline void F::f() { } 115f57f207a0fcf5fb7883597b57dd03faf952318ddDouglas Gregorconst D getD(); 116f57f207a0fcf5fb7883597b57dd03faf952318ddDouglas Gregor 117f57f207a0fcf5fb7883597b57dd03faf952318ddDouglas Gregorconst std::type_info &t2() { 118f57f207a0fcf5fb7883597b57dd03faf952318ddDouglas Gregor (void)typeid(const D); 11909b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson (void)typeid(D *); 12009b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson (void)typeid(D (*)()); 12109b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson (void)typeid(void (*)(D)); 122031b37140d0864c741618960b5220245a2a086aeDouglas Gregor (void)typeid(void (*)(D&)); 12309b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson // The exception specification is not part of the RTTI descriptor, so it should not have 12409b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson // internal linkage. 12509b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson (void)typeid(void (*)() throw (D)); 12609b6e6e8854cc4a824060101a9633082e55d7a33Anders Carlsson 1279c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson (void)typeid(E); 1289c7b6bb952672b9d184a4426138579d55c370afcAnders Carlsson 129f57f207a0fcf5fb7883597b57dd03faf952318ddDouglas Gregor return typeid(getD()); 130610b0d94d71810773378be4f39922a56b1202a83Anders Carlsson} 131d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor 132d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregornamespace Arrays { 133d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor struct A { 134d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor static const int a[10]; 135d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor }; 136d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor const std::type_info &f() { 137d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor return typeid(A::a); 138d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor } 139d1c1d7bd14dce533e8755164ff59988f2ea5da94Douglas Gregor} 140cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall 141cbfe50224b19119e759802bd0c1463269dffd09eJohn McCalltemplate <unsigned N> class T { 142cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall virtual void anchor() {} 143cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall}; 144cbfe50224b19119e759802bd0c1463269dffd09eJohn McCalltemplate class T<1>; 145cbfe50224b19119e759802bd0c1463269dffd09eJohn McCalltemplate <> class T<2> { virtual void anchor(); }; 146cbfe50224b19119e759802bd0c1463269dffd09eJohn McCallvoid t3() { 147cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall (void) typeid(T<0>); 148cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall (void) typeid(T<1>); 149cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall (void) typeid(T<2>); 150cbfe50224b19119e759802bd0c1463269dffd09eJohn McCall} 1519c39acfda88268bcc7fb5521b55ce41942dcb3b0John McCall 1529c39acfda88268bcc7fb5521b55ce41942dcb3b0John McCall// rdar://problem/8778973 1539c39acfda88268bcc7fb5521b55ce41942dcb3b0John McCallstruct T4 {}; 1549c39acfda88268bcc7fb5521b55ce41942dcb3b0John McCallvoid t4(const T4 *ptr) { 1559c39acfda88268bcc7fb5521b55ce41942dcb3b0John McCall const void *value = &typeid(ptr); 1569c39acfda88268bcc7fb5521b55ce41942dcb3b0John McCall} 157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// rdar://16265084 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid t5() { 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const void *value = &typeid(A); 162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesinline void t6() { 165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const void *value = &typeid(A); 167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid t6_helper() { 169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines t6(); 170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesinline void t7() { 173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const void *value = &typeid(A*); 175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid t7_helper() { 177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines t7(); 178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 179