teak-llvm/clang/test/CodeGenCXX/mangle-subst-std.cpp
John McCall 5513fce96b It turns out that linkers (at least, the Darwin linker) don't necessarily
do the right thing with mixed-visibility symbols, so disable the visibility
optimization where that's possible, i.e. with template classes (since it's
possible that an arbitrary template might be subject to an explicit
instantiation elsewhere).  447.dealII actually does this.

I've put the code under an option that's currently not hooked up to anything.

llvm-svn: 110374
2010-08-05 20:39:18 +00:00

112 lines
3.1 KiB
C++

// 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 = weak_odr constant
// CHECK: @_ZTCSd0_Si = internal constant
// CHECK: @_ZTCSd16_So = internal constant
// CHECK: @_ZTTSd = weak_odr constant
// CHECK: @_ZTVSo = weak_odr constant
// CHECK: @_ZTTSo = weak_odr constant
// CHECK: @_ZTVSi = weak_odr constant
// CHECK: @_ZTTSi = weak_odr constant
namespace std {
struct A { A(); };
// CHECK: define void @_ZNSt1AC1Ev
// CHECK: define void @_ZNSt1AC2Ev
A::A() { }
};
namespace std {
template<typename> struct allocator { };
}
// CHECK: define void @_Z1fSaIcESaIiE
void f(std::allocator<char>, std::allocator<int>) { }
namespace std {
template<typename, typename, typename> struct basic_string { };
}
// CHECK: 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: 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: define void @_ZN1N3std1A1fEv
void A::f() { }
}
}