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