mangle-subst-std.cpp revision 0e2c34f92f00628d48968dfea096d36381f494cb
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 60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 7f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTVSd = linkonce_odr unnamed_addr constant 8bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK: @_ZTTSd = linkonce_odr unnamed_addr constant 9bda0d6bda0f1a08a9fdf3ee4cf550b6b10d454ecJohn McCall// CHECK: @_ZTCSd0_Si = linkonce_odr unnamed_addr constant 10bda0d6bda0f1a08a9fdf3ee4cf550b6b10d454ecJohn McCall// CHECK: @_ZTCSd16_So = linkonce_odr unnamed_addr constant 111cbce125b91cad81c8be3f8bbae8df917211176cAnders Carlsson// CHECK: @_ZTVSi = linkonce_odr unnamed_addr constant 12bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK: @_ZTTSi = linkonce_odr unnamed_addr constant 130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZTVSo = linkonce_odr unnamed_addr constant 140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZTTSo = linkonce_odr unnamed_addr constant 15e3d6cf2149beb1c215ea6e87023c27b4f37712adAnders Carlsson 16e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlssonnamespace std { 17e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson struct A { A(); }; 18e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson 1993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZNSt1AC2Ev(%"struct.std::A"* %this) unnamed_addr 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: define void @_ZNSt1AC1Ev(%"struct.std::A"* %this) unnamed_addr 21e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson A::A() { } 22e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson}; 238c0315563f05a9face7209221325019e272075fbAnders Carlsson 248c0315563f05a9face7209221325019e272075fbAnders Carlssonnamespace std { 258f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename> struct allocator { }; 268c0315563f05a9face7209221325019e272075fbAnders Carlsson} 278c0315563f05a9face7209221325019e272075fbAnders Carlsson 2893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fSaIcESaIiE 29fcd0029a4ccd1380e0148b846de3bd85d2fa8ab4Anders Carlssonvoid f(std::allocator<char>, std::allocator<int>) { } 30189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson 31189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlssonnamespace std { 328f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename, typename, typename> struct basic_string { }; 33189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson} 34189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson 3593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fSbIcciE 36fcd0029a4ccd1380e0148b846de3bd85d2fa8ab4Anders Carlssonvoid f(std::basic_string<char, char, int>) { } 37f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 38f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlssonnamespace std { 398f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename> struct char_traits { }; 40f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 41f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson typedef std::basic_string<char, std::char_traits<char>, std::allocator<char> > string; 42f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson} 43f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 44f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson// CHECK: _Z1fSs 45f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlssonvoid f(std::string) { } 468f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson 478f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlssonnamespace std { 481b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename, typename> struct basic_ios { 491b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ios(int); 501b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor virtual ~basic_ios(); 511b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 521b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 531b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_istream : virtual public basic_ios<charT, traits> { 541b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_istream(int x) : basic_ios<charT, traits>(x), stored(x) { } 551b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 561b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor int stored; 571b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 581b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 591b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_ostream : virtual public basic_ios<charT, traits> { 601b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ostream(int x) : basic_ios<charT, traits>(x), stored(x) { } 611b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 621b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor float stored; 631b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 641b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 651b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 661b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_iostream : public basic_istream<charT, traits>, 671b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor public basic_ostream<charT, traits> { 681b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_iostream(int x) : basic_istream<charT, traits>(x), 691b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ostream<charT, traits>(x), 701b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ios<charT, traits>(x) { } 711b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 728f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson} 738f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson 7491f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson// CHECK: _Z1fSi 7591f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlssonvoid f(std::basic_istream<char, std::char_traits<char> >) { } 7691f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson 778f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson// CHECK: _Z1fSo 788f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlssonvoid f(std::basic_ostream<char, std::char_traits<char> >) { } 7947846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson 8091f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson// CHECK: _Z1fSd 8191f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlssonvoid f(std::basic_iostream<char, std::char_traits<char> >) { } 8291f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson 8347846d2b4c19972e57563bb05a777748939bfb47Anders Carlssonextern "C++" { 8447846d2b4c19972e57563bb05a777748939bfb47Anders Carlssonnamespace std 8547846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson{ 8647846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson typedef void (*terminate_handler) (); 8747846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson 8847846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson // CHECK: _ZSt13set_terminatePFvvE 8947846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson terminate_handler set_terminate(terminate_handler) { return 0; } 9047846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson} 9147846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson} 92b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman 93b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman// Make sure we don't treat the following like std::string 9493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f12basic_stringIcSt11char_traitsIcESaIcEE 95b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmantemplate<typename, typename, typename> struct basic_string { }; 96b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmantypedef basic_string<char, std::char_traits<char>, std::allocator<char> > not_string; 97b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmanvoid f(not_string) { } 981b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 991b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// Manglings for instantiations caused by this function are at the 1001b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// top of the test. 1011b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregorvoid create_streams() { 1021b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor std::basic_iostream<char> bio(17); 1031b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor} 104c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson 105c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson// Make sure we don't mangle 'std' as 'St' here. 106c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlssonnamespace N { 107c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson namespace std { 108c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson struct A { void f(); }; 109c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson 11093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN1N3std1A1fEv 111c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson void A::f() { } 112c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson } 113c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson} 114