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 6f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTVSd = linkonce_odr unnamed_addr constant 7bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK: @_ZTTSd = linkonce_odr unnamed_addr constant 8bda0d6bda0f1a08a9fdf3ee4cf550b6b10d454ecJohn McCall// CHECK: @_ZTCSd0_Si = linkonce_odr unnamed_addr constant 9bda0d6bda0f1a08a9fdf3ee4cf550b6b10d454ecJohn McCall// CHECK: @_ZTCSd16_So = linkonce_odr unnamed_addr constant 10adf5dc340db3ea99de5fe3f6c42cfee1807d445eAnders Carlsson// CHECK: @_ZTVSo = linkonce_odr unnamed_addr constant 11bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK: @_ZTTSo = linkonce_odr unnamed_addr constant 121cbce125b91cad81c8be3f8bbae8df917211176cAnders Carlsson// CHECK: @_ZTVSi = linkonce_odr unnamed_addr constant 13bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK: @_ZTTSi = linkonce_odr unnamed_addr constant 14e3d6cf2149beb1c215ea6e87023c27b4f37712adAnders Carlsson 15e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlssonnamespace std { 16e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson struct A { A(); }; 17e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson 1893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZNSt1AC2Ev(%"struct.std::A"* %this) unnamed_addr 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: define void @_ZNSt1AC1Ev(%"struct.std::A"* %this) unnamed_addr 20e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson A::A() { } 21e7c8cb6b2728aa98258288d221b09bc66cc05543Anders Carlsson}; 228c0315563f05a9face7209221325019e272075fbAnders Carlsson 238c0315563f05a9face7209221325019e272075fbAnders Carlssonnamespace std { 248f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename> struct allocator { }; 258c0315563f05a9face7209221325019e272075fbAnders Carlsson} 268c0315563f05a9face7209221325019e272075fbAnders Carlsson 2793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fSaIcESaIiE 28fcd0029a4ccd1380e0148b846de3bd85d2fa8ab4Anders Carlssonvoid f(std::allocator<char>, std::allocator<int>) { } 29189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson 30189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlssonnamespace std { 318f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename, typename, typename> struct basic_string { }; 32189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson} 33189d59cfc762d0f683b9253ddec2cf519ec85b65Anders Carlsson 3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1fSbIcciE 35fcd0029a4ccd1380e0148b846de3bd85d2fa8ab4Anders Carlssonvoid f(std::basic_string<char, char, int>) { } 36f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 37f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlssonnamespace std { 388f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson template<typename> struct char_traits { }; 39f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 40f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson typedef std::basic_string<char, std::char_traits<char>, std::allocator<char> > string; 41f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson} 42f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson 43f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlsson// CHECK: _Z1fSs 44f514b544b24926834adbfe8265a72ed8b9b09d81Anders Carlssonvoid f(std::string) { } 458f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson 468f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlssonnamespace std { 471b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename, typename> struct basic_ios { 481b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ios(int); 491b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor virtual ~basic_ios(); 501b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 511b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 521b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_istream : virtual public basic_ios<charT, traits> { 531b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_istream(int x) : basic_ios<charT, traits>(x), stored(x) { } 541b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 551b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor int stored; 561b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 571b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 581b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_ostream : virtual public basic_ios<charT, traits> { 591b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ostream(int x) : basic_ios<charT, traits>(x), stored(x) { } 601b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 611b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor float stored; 621b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 631b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 641b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor template<typename charT, typename traits = char_traits<charT> > 651b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor struct basic_iostream : public basic_istream<charT, traits>, 661b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor public basic_ostream<charT, traits> { 671b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_iostream(int x) : basic_istream<charT, traits>(x), 681b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ostream<charT, traits>(x), 691b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor basic_ios<charT, traits>(x) { } 701b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor }; 718f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson} 728f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson 7391f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson// CHECK: _Z1fSi 7491f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlssonvoid f(std::basic_istream<char, std::char_traits<char> >) { } 7591f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson 768f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlsson// CHECK: _Z1fSo 778f8fd8ea7e5c5d04f95a3cf4af95aa93225bc2b4Anders Carlssonvoid f(std::basic_ostream<char, std::char_traits<char> >) { } 7847846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson 7991f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson// CHECK: _Z1fSd 8091f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlssonvoid f(std::basic_iostream<char, std::char_traits<char> >) { } 8191f8860de5f4280607e74c9d653751cd3f891ca7Anders Carlsson 8247846d2b4c19972e57563bb05a777748939bfb47Anders Carlssonextern "C++" { 8347846d2b4c19972e57563bb05a777748939bfb47Anders Carlssonnamespace std 8447846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson{ 8547846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson typedef void (*terminate_handler) (); 8647846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson 8747846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson // CHECK: _ZSt13set_terminatePFvvE 8847846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson terminate_handler set_terminate(terminate_handler) { return 0; } 8947846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson} 9047846d2b4c19972e57563bb05a777748939bfb47Anders Carlsson} 91b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman 92b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedman// Make sure we don't treat the following like std::string 9393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z1f12basic_stringIcSt11char_traitsIcESaIcEE 94b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmantemplate<typename, typename, typename> struct basic_string { }; 95b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmantypedef basic_string<char, std::char_traits<char>, std::allocator<char> > not_string; 96b1162f178feb312b452e1b2095e0ed3413ba47feEli Friedmanvoid f(not_string) { } 971b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor 981b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// Manglings for instantiations caused by this function are at the 991b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor// top of the test. 1001b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregorvoid create_streams() { 1011b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor std::basic_iostream<char> bio(17); 1021b12a3bb4d4c0db74fc97be724beefec7366b460Douglas Gregor} 103c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson 104c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson// Make sure we don't mangle 'std' as 'St' here. 105c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlssonnamespace N { 106c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson namespace std { 107c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson struct A { void f(); }; 108c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson 10993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN1N3std1A1fEv 110c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson void A::f() { } 111c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson } 112c820f90ff1a2c6e3e8b859355541c32f31d3cb8eAnders Carlsson} 113