mangle-subst-std.cpp revision c820f90ff1a2c6e3e8b859355541c32f31d3cb8e
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s 2e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson 31b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// Check mangling of Vtables, VTTs, and construction vtables that 41b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// involve standard substitutions. 51b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 61b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTVSd = weak_odr constant 71b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTCSd0_Si = internal constant 81b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTCSd16_So = internal constant 91b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTTSd = weak_odr constant 101b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTVSo = weak_odr constant 111b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTTSo = weak_odr constant 121b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTVSi = weak_odr constant 131b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// CHECK: @_ZTTSi = weak_odr constant 14e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlssonnamespace std { 15e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson struct A { A(); }; 16e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson 178e51a1f5da6ef4a1a168d14116c6eed3a578a263John McCall // CHECK: define void @_ZNSt1AC1Ev 18e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson // CHECK: define void @_ZNSt1AC2Ev 19e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson A::A() { } 20e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson}; 218c0315563f05a9face7209221325019e272075fbAnders Carlsson 228c0315563f05a9face7209221325019e272075fbAnders Carlssonnamespace std { 238f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename> struct allocator { }; 248c0315563f05a9face7209221325019e272075fbAnders Carlsson} 258c0315563f05a9face7209221325019e272075fbAnders Carlsson 268c0315563f05a9face7209221325019e272075fbAnders Carlsson// CHECK: define void @_Z1fSaIcESaIiE 27fcd0029a4ccd1380e0148b846de3bd85d2fa8ab4Anders Carlssonvoid f(std::allocator<char>, std::allocator<int>) { } 28189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson 29189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlssonnamespace std { 308f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename, typename, typename> struct basic_string { }; 31189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson} 32189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson 33f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson// CHECK: define void @_Z1fSbIcciE 34fcd0029a4ccd1380e0148b846de3bd85d2fa8ab4Anders Carlssonvoid f(std::basic_string<char, char, int>) { } 35f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 36f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlssonnamespace std { 378f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename> struct char_traits { }; 38f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 39f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson typedef std::basic_string<char, std::char_traits<char>, std::allocator<char> > string; 40f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson} 41f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 42f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson// CHECK: _Z1fSs 43f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlssonvoid f(std::string) { } 448f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson 458f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlssonnamespace std { 461b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename, typename> struct basic_ios { 471b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ios(int); 481b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor virtual ~basic_ios(); 491b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 501b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 511b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_istream : virtual public basic_ios<charT, traits> { 521b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_istream(int x) : basic_ios<charT, traits>(x), stored(x) { } 531b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 541b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor int stored; 551b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 561b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 571b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_ostream : virtual public basic_ios<charT, traits> { 581b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ostream(int x) : basic_ios<charT, traits>(x), stored(x) { } 591b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 601b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor float stored; 611b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 621b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 631b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 641b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_iostream : public basic_istream<charT, traits>, 651b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor public basic_ostream<charT, traits> { 661b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_iostream(int x) : basic_istream<charT, traits>(x), 671b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ostream<charT, traits>(x), 681b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ios<charT, traits>(x) { } 691b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 708f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson} 718f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson 7291f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson// CHECK: _Z1fSi 7391f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlssonvoid f(std::basic_istream<char, std::char_traits<char> >) { } 7491f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson 758f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson// CHECK: _Z1fSo 768f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlssonvoid f(std::basic_ostream<char, std::char_traits<char> >) { } 7747846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson 7891f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson// CHECK: _Z1fSd 7991f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlssonvoid f(std::basic_iostream<char, std::char_traits<char> >) { } 8091f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson 8147846d2b4c19972e57563bb05a777748939bfb47Anders Carlssonextern "C++" { 8247846d2b4c19972e57563bb05a777748939bfb47Anders Carlssonnamespace std 8347846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson{ 8447846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson typedef void (*terminate_handler) (); 8547846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson 8647846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson // CHECK: _ZSt13set_terminatePFvvE 8747846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson terminate_handler set_terminate(terminate_handler) { return 0; } 8847846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson} 8947846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson} 90b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman 91b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman// Make sure we don't treat the following like std::string 92b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman// CHECK: define void @_Z1f12basic_stringIcSt11char_traitsIcESaIcEE 93b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmantemplate<typename, typename, typename> struct basic_string { }; 94b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmantypedef basic_string<char, std::char_traits<char>, std::allocator<char> > not_string; 95b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmanvoid f(not_string) { } 961b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 971b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// Manglings for instantiations caused by this function are at the 981b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// top of the test. 991b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregorvoid create_streams() { 1001b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor std::basic_iostream<char> bio(17); 1011b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor} 102c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson 103c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson// Make sure we don't mangle 'std' as 'St' here. 104c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlssonnamespace N { 105c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson namespace std { 106c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson struct A { void f(); }; 107c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson 108c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson // CHECK: define void @_ZN1N3std1A1fEv 109c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson void A::f() { } 110c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson } 111c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson} 112