Eric Christopher | 41f001f | 2011-08-16 21:41:33 +0000 | [diff] [blame] | 1 | // RUN: %clang -fexceptions %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 | |
Nick Lewycky | 1999c7c | 2011-08-19 20:43:24 +0000 | [diff] [blame] | 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 | |
| 26 | namespace std // purposefully not using versioning namespace |
| 27 | { |
| 28 | |
| 29 | template<class charT> struct char_traits; |
| 30 | template<class T> class allocator; |
| 31 | template <class _CharT, |
| 32 | class _Traits = char_traits<_CharT>, |
| 33 | class _Allocator = allocator<_CharT> > |
| 34 | class _LIBCPP_VISIBLE basic_string; |
| 35 | typedef basic_string<char, char_traits<char>, allocator<char> > string; |
| 36 | |
| 37 | class _LIBCPP_EXCEPTION_ABI exception |
| 38 | { |
| 39 | public: |
| 40 | _LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {} |
| 41 | virtual ~exception() _NOEXCEPT; |
| 42 | virtual const char* what() const _NOEXCEPT; |
| 43 | }; |
| 44 | |
| 45 | class _LIBCPP_EXCEPTION_ABI runtime_error |
| 46 | : public exception |
| 47 | { |
| 48 | private: |
| 49 | void* __imp_; |
| 50 | public: |
| 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 | } |
Eric Christopher | 41f001f | 2011-08-16 21:41:33 +0000 | [diff] [blame] | 63 | |
| 64 | void dummysymbol() { |
| 65 | throw(std::runtime_error("string")); |
| 66 | } |