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