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