1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -triple %itanium_abi_triple %s -S -emit-llvm -o - | FileCheck %s 2// PR4262 3 4// CHECK-NOT: _ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag 5 6// The "basic_string" extern template instantiation declaration is supposed to 7// suppress the implicit instantiation of non-inline member functions. Make sure 8// that we suppress the implicit instantiation of non-inline member functions 9// defined out-of-line. That we aren't instantiating the basic_string 10// constructor when we shouldn't be. Such an instantiation forces the implicit 11// instantiation of _S_construct<const char*>. Since _S_construct is a member 12// template, it's instantiation is *not* suppressed (despite being in 13// basic_string<char>), so we would emit it as a weak definition. 14 15#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default"))) 16#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__)) 17#define _LIBCPP_VISIBLE __attribute__ ((__visibility__("default"))) 18#if (__has_feature(cxx_noexcept)) 19# define _NOEXCEPT noexcept 20# define _NOEXCEPT_(x) noexcept(x) 21#else 22# define _NOEXCEPT throw() 23# define _NOEXCEPT_(x) 24#endif 25 26namespace std // purposefully not using versioning namespace 27{ 28 29template<class charT> struct char_traits; 30template<class T> class allocator; 31template <class _CharT, 32 class _Traits = char_traits<_CharT>, 33 class _Allocator = allocator<_CharT> > 34 class _LIBCPP_VISIBLE basic_string; 35typedef basic_string<char, char_traits<char>, allocator<char> > string; 36 37class _LIBCPP_EXCEPTION_ABI exception 38{ 39public: 40 _LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {} 41 virtual ~exception() _NOEXCEPT; 42 virtual const char* what() const _NOEXCEPT; 43}; 44 45class _LIBCPP_EXCEPTION_ABI runtime_error 46 : public exception 47{ 48private: 49 void* __imp_; 50public: 51 explicit runtime_error(const string&); 52 explicit runtime_error(const char*); 53 54 runtime_error(const runtime_error&) _NOEXCEPT; 55 runtime_error& operator=(const runtime_error&) _NOEXCEPT; 56 57 virtual ~runtime_error() _NOEXCEPT; 58 59 virtual const char* what() const _NOEXCEPT; 60}; 61 62} 63 64void dummysymbol() { 65 throw(std::runtime_error("string")); 66} 67