// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s

// Check mangling of Vtables, VTTs, and construction vtables that
// involve standard substitutions.


// CHECK: @_ZTVSd = linkonce_odr unnamed_addr constant 
// CHECK: @_ZTTSd = linkonce_odr unnamed_addr constant
// CHECK: @_ZTCSd0_Si = linkonce_odr unnamed_addr constant 
// CHECK: @_ZTCSd16_So = linkonce_odr unnamed_addr constant
// CHECK: @_ZTVSi = linkonce_odr unnamed_addr constant
// CHECK: @_ZTTSi = linkonce_odr unnamed_addr constant
// CHECK: @_ZTVSo = linkonce_odr unnamed_addr constant
// CHECK: @_ZTTSo = linkonce_odr unnamed_addr constant

namespace std {
  struct A { A(); };
  
  // CHECK-LABEL: define{{.*}} void @_ZNSt1AC2Ev(%"struct.std::A"* {{[^,]*}} %this) unnamed_addr
  // CHECK-LABEL: define{{.*}} void @_ZNSt1AC1Ev(%"struct.std::A"* {{[^,]*}} %this) unnamed_addr
  A::A() { }
};

namespace std {
  template<typename> struct allocator { };
}

// CHECK-LABEL: define{{.*}} void @_Z1fSaIcESaIiE
void f(std::allocator<char>, std::allocator<int>) { }

namespace std {
  template<typename, typename, typename> struct basic_string { };
}

// CHECK-LABEL: define{{.*}} void @_Z1fSbIcciE
void f(std::basic_string<char, char, int>) { }

namespace std {
  template<typename> struct char_traits { };
  
  typedef std::basic_string<char, std::char_traits<char>, std::allocator<char> > string;
}

// CHECK: _Z1fSs
void f(std::string) { }

namespace std {
  template<typename, typename> struct basic_ios { 
    basic_ios(int);
    virtual ~basic_ios();
  };
  template<typename charT, typename traits = char_traits<charT> > 
  struct basic_istream : virtual public basic_ios<charT, traits> { 
    basic_istream(int x) : basic_ios<charT, traits>(x), stored(x) { }

    int stored;
  };
  template<typename charT, typename traits = char_traits<charT> > 
  struct basic_ostream : virtual public basic_ios<charT, traits> { 
    basic_ostream(int x) : basic_ios<charT, traits>(x), stored(x) { }

    float stored;
  };

  template<typename charT, typename traits = char_traits<charT> > 
    struct basic_iostream : public basic_istream<charT, traits>, 
                            public basic_ostream<charT, traits> { 
    basic_iostream(int x) : basic_istream<charT, traits>(x),
                            basic_ostream<charT, traits>(x),
                            basic_ios<charT, traits>(x) { }
  };
}

// CHECK: _Z1fSi
void f(std::basic_istream<char, std::char_traits<char> >) { }

// CHECK: _Z1fSo
void f(std::basic_ostream<char, std::char_traits<char> >) { }

// CHECK: _Z1fSd
void f(std::basic_iostream<char, std::char_traits<char> >) { }

extern "C++" {
namespace std
{
  typedef void (*terminate_handler) ();
  
  // CHECK: _ZSt13set_terminatePFvvE
  terminate_handler set_terminate(terminate_handler) { return 0; }
}
}

// Make sure we don't treat the following like std::string
// CHECK-LABEL: define{{.*}} void @_Z1f12basic_stringIcSt11char_traitsIcESaIcEE
template<typename, typename, typename> struct basic_string { };
typedef basic_string<char, std::char_traits<char>, std::allocator<char> > not_string;
void f(not_string) { }

// Manglings for instantiations caused by this function are at the
// top of the test.
void create_streams() {
  std::basic_iostream<char> bio(17);
}

// Make sure we don't mangle 'std' as 'St' here.
namespace N {
  namespace std {
    struct A { void f(); };
    
    // CHECK-LABEL: define{{.*}} void @_ZN1N3std1A1fEv
    void A::f() { }
  }
}
