From d437fa5c8c1185af695b87cdd5ea83aa4a6e7382 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Thu, 25 Aug 2016 15:09:01 +0000 Subject: [PATCH] Add an _LIBCPP_NORETURN inline function named __throw_XXX for each exception type we define. They either construct and throw the exception, or abort() (if exceptions are disabled). Use these functions everywhere instead of assert()ing when exceptions are disabled. WARNING: This is a behavior change - but only with exceptions disabled. Reviewed as: https://reviews.llvm.org/D23855. llvm-svn: 279744 --- libcxx/include/__functional_03 | 16 ++--- libcxx/include/__locale | 7 +-- libcxx/include/any | 1 - libcxx/include/array | 16 +---- libcxx/include/bitset | 66 ++++++--------------- libcxx/include/complex | 3 - libcxx/include/deque | 12 ++-- libcxx/include/experimental/any | 5 +- libcxx/include/experimental/dynarray | 31 ++-------- libcxx/include/experimental/optional | 22 +++---- libcxx/include/experimental/string_view | 4 +- libcxx/include/fstream | 20 +++---- libcxx/include/functional | 14 ++++- libcxx/include/future | 4 +- libcxx/include/locale | 12 ++-- libcxx/include/memory | 19 +++--- libcxx/include/new | 16 ++++- libcxx/include/regex | 5 +- libcxx/include/stdexcept | 87 +++++++++++++++++++++++++++ libcxx/include/string | 20 ++----- libcxx/include/typeinfo | 12 ++++ libcxx/include/vector | 16 ++--- libcxx/src/debug.cpp | 35 ++++------- libcxx/src/experimental/memory_resource.cpp | 6 +- libcxx/src/locale.cpp | 92 +++++++++++------------------ libcxx/src/new.cpp | 2 + libcxx/src/string.cpp | 2 +- libcxx/src/system_error.cpp | 1 + libcxx/src/thread.cpp | 10 ++-- libcxx/src/typeinfo.cpp | 4 ++ 30 files changed, 272 insertions(+), 288 deletions(-) diff --git a/libcxx/include/__functional_03 b/libcxx/include/__functional_03 index 4edbb09..f8b5d95 100644 --- a/libcxx/include/__functional_03 +++ b/libcxx/include/__functional_03 @@ -679,10 +679,8 @@ template _Rp function<_Rp()>::operator()() const { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__f_ == 0) - throw bad_function_call(); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_bad_function_call(); return (*__f_)(); } @@ -955,10 +953,8 @@ template _Rp function<_Rp(_A0)>::operator()(_A0 __a0) const { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__f_ == 0) - throw bad_function_call(); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_bad_function_call(); return (*__f_)(__a0); } @@ -1231,10 +1227,8 @@ template _Rp function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__f_ == 0) - throw bad_function_call(); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_bad_function_call(); return (*__f_)(__a0, __a1); } @@ -1507,10 +1501,8 @@ template _Rp function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__f_ == 0) - throw bad_function_call(); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_bad_function_call(); return (*__f_)(__a0, __a1, __a2); } diff --git a/libcxx/include/__locale b/libcxx/include/__locale index 7bc701d..e718f11 100644 --- a/libcxx/include/__locale +++ b/libcxx/include/__locale @@ -165,10 +165,9 @@ template locale locale::combine(const locale& __other) const { -#ifndef _LIBCPP_NO_EXCEPTIONS if (!_VSTD::has_facet<_Facet>(__other)) - throw runtime_error("locale::combine: locale missing facet"); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_runtime_error("locale::combine: locale missing facet"); + return locale(*this, &const_cast<_Facet&>(_VSTD::use_facet<_Facet>(__other))); } @@ -1184,8 +1183,6 @@ _LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname) _LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname) -_LIBCPP_FUNC_VIS void __throw_runtime_error(const char*); - template struct __narrow_to_utf8 { diff --git a/libcxx/include/any b/libcxx/include/any index d6ae0634..03d694e 100644 --- a/libcxx/include/any +++ b/libcxx/include/any @@ -85,7 +85,6 @@ namespace std { #include #include #include -#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header diff --git a/libcxx/include/array b/libcxx/include/array index 719286d..d3f8463 100644 --- a/libcxx/include/array +++ b/libcxx/include/array @@ -108,9 +108,6 @@ template const T&& get(const array&&) noexce #include #include #include -#if defined(_LIBCPP_NO_EXCEPTIONS) - #include -#endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header @@ -209,11 +206,8 @@ typename array<_Tp, _Size>::reference array<_Tp, _Size>::at(size_type __n) { if (__n >= _Size) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("array::at"); -#else - assert(!"array::at out_of_range"); -#endif + __throw_out_of_range("array::at"); + return __elems_[__n]; } @@ -223,11 +217,7 @@ typename array<_Tp, _Size>::const_reference array<_Tp, _Size>::at(size_type __n) const { if (__n >= _Size) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("array::at"); -#else - assert(!"array::at out_of_range"); -#endif + __throw_out_of_range("array::at"); return __elems_[__n]; } diff --git a/libcxx/include/bitset b/libcxx/include/bitset index 3f9b964..2ad9545 100644 --- a/libcxx/include/bitset +++ b/libcxx/include/bitset @@ -125,9 +125,6 @@ template struct hash>; #include #include #include <__functional_base> -#if defined(_LIBCPP_NO_EXCEPTIONS) - #include -#endif #include <__undef_min_max> @@ -326,11 +323,8 @@ __bitset<_N_words, _Size>::to_ulong(false_type) const const_iterator __e = __make_iter(_Size); const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); if (__i != __e) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw overflow_error("bitset to_ulong overflow error"); -#else - assert(!"bitset to_ulong overflow error"); -#endif + __throw_overflow_error("bitset to_ulong overflow error"); + return __first_[0]; } @@ -349,11 +343,8 @@ __bitset<_N_words, _Size>::to_ullong(false_type) const const_iterator __e = __make_iter(_Size); const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); if (__i != __e) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw overflow_error("bitset to_ullong overflow error"); -#else - assert(!"bitset to_ullong overflow error"); -#endif + __throw_overflow_error("bitset to_ullong overflow error"); + return to_ullong(true_type()); } @@ -763,11 +754,8 @@ bitset<_Size>::bitset(const _CharT* __str, size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str)); for (size_t __i = 0; __i < __rlen; ++__i) if (__str[__i] != __zero && __str[__i] != __one) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw invalid_argument("bitset string ctor has invalid argument"); -#else - assert(!"bitset string ctor has invalid argument"); -#endif + __throw_invalid_argument("bitset string ctor has invalid argument"); + size_t _Mp = _VSTD::min(__rlen, _Size); size_t __i = 0; for (; __i < _Mp; ++__i) @@ -789,19 +777,13 @@ bitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str, _CharT __zero, _CharT __one) { if (__pos > __str.size()) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("bitset string pos out of range"); -#else - assert(!"bitset string pos out of range"); -#endif + __throw_out_of_range("bitset string pos out of range"); + size_t __rlen = _VSTD::min(__n, __str.size() - __pos); for (size_t __i = __pos; __i < __pos + __rlen; ++__i) if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one)) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw invalid_argument("bitset string ctor has invalid argument"); -#else - assert(!"bitset string ctor has invalid argument"); -#endif + __throw_invalid_argument("bitset string ctor has invalid argument"); + size_t _Mp = _VSTD::min(__rlen, _Size); size_t __i = 0; for (; __i < _Mp; ++__i) @@ -876,11 +858,8 @@ bitset<_Size>& bitset<_Size>::set(size_t __pos, bool __val) { if (__pos >= _Size) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("bitset set argument out of range"); -#else - assert(!"bitset set argument out of range"); -#endif + __throw_out_of_range("bitset set argument out of range"); + (*this)[__pos] = __val; return *this; } @@ -899,11 +878,8 @@ bitset<_Size>& bitset<_Size>::reset(size_t __pos) { if (__pos >= _Size) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("bitset reset argument out of range"); -#else - assert(!"bitset reset argument out of range"); -#endif + __throw_out_of_range("bitset reset argument out of range"); + (*this)[__pos] = false; return *this; } @@ -932,11 +908,8 @@ bitset<_Size>& bitset<_Size>::flip(size_t __pos) { if (__pos >= _Size) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("bitset flip argument out of range"); -#else - assert(!"bitset flip argument out of range"); -#endif + __throw_out_of_range("bitset flip argument out of range"); + reference r = base::__make_ref(__pos); r = ~r; return *this; @@ -1027,11 +1000,8 @@ bool bitset<_Size>::test(size_t __pos) const { if (__pos >= _Size) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("bitset test argument out of range"); -#else - assert(!"bitset test argument out of range"); -#endif + __throw_out_of_range("bitset test argument out of range"); + return (*this)[__pos]; } diff --git a/libcxx/include/complex b/libcxx/include/complex index d20a30c..c8261e2 100644 --- a/libcxx/include/complex +++ b/libcxx/include/complex @@ -245,9 +245,6 @@ template #include #include #include -#if defined(_LIBCPP_NO_EXCEPTIONS) - #include -#endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header diff --git a/libcxx/include/deque b/libcxx/include/deque index 4c68813..9c72d24 100644 --- a/libcxx/include/deque +++ b/libcxx/include/deque @@ -895,26 +895,22 @@ template class __deque_base_common { protected: - void __throw_length_error() const; - void __throw_out_of_range() const; + _LIBCPP_NORETURN void __throw_length_error() const; + _LIBCPP_NORETURN void __throw_out_of_range() const; }; template void __deque_base_common<__b>::__throw_length_error() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw length_error("deque"); -#endif + _VSTD::__throw_length_error("deque"); } template void __deque_base_common<__b>::__throw_out_of_range() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("deque"); -#endif + _VSTD::__throw_out_of_range("deque"); } template diff --git a/libcxx/include/experimental/any b/libcxx/include/experimental/any index 4c73249..140d212 100644 --- a/libcxx/include/experimental/any +++ b/libcxx/include/experimental/any @@ -82,7 +82,6 @@ inline namespace fundamentals_v1 { #include #include #include -#include #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header @@ -98,13 +97,13 @@ public: #if _LIBCPP_STD_VER > 11 // C++ > 11 -_LIBCPP_NORETURN _LIBCPP_INLINE_VISIBILITY +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE inline void __throw_bad_any_cast() { #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_any_cast(); #else - assert(!"bad_any_cast"); + _VSTD::abort(); #endif } diff --git a/libcxx/include/experimental/dynarray b/libcxx/include/experimental/dynarray index 4a06908..8ef4571 100644 --- a/libcxx/include/experimental/dynarray +++ b/libcxx/include/experimental/dynarray @@ -106,10 +106,6 @@ public: #include <__undef___deallocate> -#if defined(_LIBCPP_NO_EXCEPTIONS) - #include -#endif - #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header #endif @@ -142,13 +138,8 @@ private: static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count ) { if ( numeric_limits::max() / sizeof (value_type) <= count ) - { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_array_length(); -#else - assert(!"dynarray::allocation"); -#endif - } + __throw_bad_array_length(); + return static_cast (_VSTD::__allocate (sizeof(value_type) * count)); } @@ -283,13 +274,8 @@ typename dynarray<_Tp>::reference dynarray<_Tp>::at(size_type __n) { if (__n >= __size_) - { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("dynarray::at"); -#else - assert(!"dynarray::at out_of_range"); -#endif - } + __throw_out_of_range("dynarray::at"); + return data()[__n]; } @@ -299,13 +285,8 @@ typename dynarray<_Tp>::const_reference dynarray<_Tp>::at(size_type __n) const { if (__n >= __size_) - { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("dynarray::at"); -#else - assert(!"dynarray::at out_of_range"); -#endif - } + __throw_out_of_range("dynarray::at"); + return data()[__n]; } diff --git a/libcxx/include/experimental/optional b/libcxx/include/experimental/optional index 3912438..11bf867 100644 --- a/libcxx/include/experimental/optional +++ b/libcxx/include/experimental/optional @@ -513,15 +513,21 @@ public: _LIBCPP_INLINE_VISIBILITY constexpr explicit operator bool() const noexcept {return this->__engaged_;} + _LIBCPP_NORETURN _LIBCPP_INLINE_VISIBILITY + constexpr void __throw_bad_optional_access() const + { +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_optional_access(); +#else + _VSTD::abort(); +#endif + } + _LIBCPP_INLINE_VISIBILITY constexpr value_type const& value() const { if (!this->__engaged_) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_optional_access(); -#else - assert(!"bad optional access"); -#endif + __throw_bad_optional_access(); return this->__val_; } @@ -529,11 +535,7 @@ public: value_type& value() { if (!this->__engaged_) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_optional_access(); -#else - assert(!"bad optional access"); -#endif + __throw_bad_optional_access(); return this->__val_; } diff --git a/libcxx/include/experimental/string_view b/libcxx/include/experimental/string_view index 0a7239b..f8b5128 100644 --- a/libcxx/include/experimental/string_view +++ b/libcxx/include/experimental/string_view @@ -362,11 +362,11 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS basic_string_view substr(size_type __pos = 0, size_type __n = npos) const { // if (__pos > size()) -// throw out_of_range("string_view::substr"); +// __throw_out_of_range("string_view::substr"); // size_type __rlen = _VSTD::min( __n, size() - __pos ); // return basic_string_view(data() + __pos, __rlen); return __pos > size() - ? (__libcpp_throw((out_of_range("string_view::substr"))), basic_string_view()) + ? (__throw_out_of_range("string_view::substr"), basic_string_view()) : basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos)); } diff --git a/libcxx/include/fstream b/libcxx/include/fstream index 3cb3b13..ce13b31 100644 --- a/libcxx/include/fstream +++ b/libcxx/include/fstream @@ -618,10 +618,9 @@ basic_filebuf<_CharT, _Traits>::underflow() size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_); if (__nr != 0) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (!__cv_) - throw bad_cast(); -#endif + __throw_bad_cast(); + __extbufend_ = __extbufnext_ + __nr; char_type* __inext; __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_, @@ -700,10 +699,9 @@ basic_filebuf<_CharT, _Traits>::overflow(int_type __c) codecvt_base::result __r; do { -#ifndef _LIBCPP_NO_EXCEPTIONS if (!__cv_) - throw bad_cast(); -#endif + __throw_bad_cast(); + const char_type* __e; __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, __extbuf_, __extbuf_ + __ebs_, __extbe); @@ -793,10 +791,9 @@ typename basic_filebuf<_CharT, _Traits>::pos_type basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (!__cv_) - throw bad_cast(); -#endif + __throw_bad_cast(); + int __width = __cv_->encoding(); if (__file_ == 0 || (__width <= 0 && __off != 0) || sync()) return pos_type(off_type(-1)); @@ -852,10 +849,9 @@ basic_filebuf<_CharT, _Traits>::sync() { if (__file_ == 0) return 0; -#ifndef _LIBCPP_NO_EXCEPTIONS if (!__cv_) - throw bad_cast(); -#endif + __throw_bad_cast(); + if (__cm_ & ios_base::out) { if (this->pptr() != this->pbase()) diff --git a/libcxx/include/functional b/libcxx/include/functional index db137d1..d0b65b2 100644 --- a/libcxx/include/functional +++ b/libcxx/include/functional @@ -1382,6 +1382,16 @@ class _LIBCPP_EXCEPTION_ABI bad_function_call { }; +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_bad_function_call() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_function_call(); +#else + _VSTD::abort(); +#endif +} + template class _LIBCPP_TYPE_VIS_ONLY function; // undefined namespace __function @@ -1882,10 +1892,8 @@ template _Rp function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__f_ == 0) - throw bad_function_call(); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_bad_function_call(); return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...); } diff --git a/libcxx/include/future b/libcxx/include/future index 936060e..25e958c 100644 --- a/libcxx/include/future +++ b/libcxx/include/future @@ -512,13 +512,13 @@ public: virtual ~future_error() _NOEXCEPT; }; -inline _LIBCPP_ALWAYS_INLINE +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE void __throw_future_error(future_errc _Ev) { #ifndef _LIBCPP_NO_EXCEPTIONS throw future_error(make_error_code(_Ev)); #else - assert(!"future_error"); + _VSTD::abort(); #endif } diff --git a/libcxx/include/locale b/libcxx/include/locale index 3d804e8..339b52a 100644 --- a/libcxx/include/locale +++ b/libcxx/include/locale @@ -3701,10 +3701,10 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: if (__r == codecvt_base::ok) return __ws; } -#ifndef _LIBCPP_NO_EXCEPTIONS + if (__wide_err_string_.empty()) - throw range_error("wstring_convert: from_bytes error"); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_range_error("wstring_convert: from_bytes error"); + return __wide_err_string_; } @@ -3790,10 +3790,10 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: return __bs; } } -#ifndef _LIBCPP_NO_EXCEPTIONS + if (__byte_err_string_.empty()) - throw range_error("wstring_convert: to_bytes error"); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_range_error("wstring_convert: to_bytes error"); + return __byte_err_string_; } diff --git a/libcxx/include/memory b/libcxx/include/memory index 5cdb60f..7047bc7 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -637,9 +637,6 @@ void* align(size_t alignment, size_t size, void*& ptr, size_t& space); #include #include #include -#if defined(_LIBCPP_NO_EXCEPTIONS) - #include -#endif #if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER) # include @@ -3787,6 +3784,16 @@ public: virtual const char* what() const _NOEXCEPT; }; +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_bad_weak_ptr() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_weak_ptr(); +#else + _VSTD::abort(); +#endif +} + template class _LIBCPP_TYPE_VIS_ONLY weak_ptr; class _LIBCPP_TYPE_VIS __shared_count @@ -5443,11 +5450,7 @@ shared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) { if (__cntrl_ == 0) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_weak_ptr(); -#else - assert(!"bad_weak_ptr"); -#endif + __throw_bad_weak_ptr(); } template diff --git a/libcxx/include/new b/libcxx/include/new index d2b2ae6..9520867 100644 --- a/libcxx/include/new +++ b/libcxx/include/new @@ -97,6 +97,8 @@ public: virtual const char* what() const _NOEXCEPT; }; +_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec + #if defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11) class _LIBCPP_EXCEPTION_ABI bad_array_length @@ -112,8 +114,6 @@ public: #endif // defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11) -_LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec - struct _LIBCPP_TYPE_VIS nothrow_t {}; extern _LIBCPP_FUNC_VIS const nothrow_t nothrow; typedef void (*new_handler)(); @@ -177,6 +177,18 @@ inline _LIBCPP_INLINE_VISIBILITY void __deallocate(void *__ptr) { #endif } +#ifdef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_bad_array_length() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_array_length(); +#else + _VSTD::abort(); +#endif +} +#endif + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_NEW diff --git a/libcxx/include/regex b/libcxx/include/regex index 42f3dbb..f8fb6af 100644 --- a/libcxx/include/regex +++ b/libcxx/include/regex @@ -764,7 +764,6 @@ typedef regex_token_iterator wsregex_token_iterator; #include #include #include -#include #include <__undef_min_max> @@ -959,13 +958,13 @@ public: }; template -_LIBCPP_ALWAYS_INLINE +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE void __throw_regex_error() { #ifndef _LIBCPP_NO_EXCEPTIONS throw regex_error(_Ev); #else - assert(!"regex_error"); + _VSTD::abort(); #endif } diff --git a/libcxx/include/stdexcept b/libcxx/include/stdexcept index 4218b13..684578f 100644 --- a/libcxx/include/stdexcept +++ b/libcxx/include/stdexcept @@ -171,4 +171,91 @@ public: } // std +_LIBCPP_BEGIN_NAMESPACE_STD + +// in the dylib +_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*); + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_logic_error(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw logic_error(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_domain_error(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw domain_error(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_invalid_argument(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw invalid_argument(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_length_error(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw length_error(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_out_of_range(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_range_error(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw range_error(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_overflow_error(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw overflow_error(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_underflow_error(const char*__msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw underflow_error(__msg); +#else + _VSTD::abort(); +#endif +} + +_LIBCPP_END_NAMESPACE_STD + #endif // _LIBCPP_STDEXCEPT diff --git a/libcxx/include/string b/libcxx/include/string index 8d947c6..53ddf5e 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -477,10 +477,6 @@ basic_string operator "" s( const char32_t *str, size_t len ); // C++1 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS #include #endif -#if defined(_LIBCPP_NO_EXCEPTIONS) -#include -#endif - #include <__undef_min_max> @@ -556,30 +552,22 @@ template class _LIBCPP_TYPE_VIS_ONLY __basic_string_common { protected: - void __throw_length_error() const; - void __throw_out_of_range() const; + _LIBCPP_NORETURN void __throw_length_error() const; + _LIBCPP_NORETURN void __throw_out_of_range() const; }; template void __basic_string_common<__b>::__throw_length_error() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw length_error("basic_string"); -#else - assert(!"basic_string length_error"); -#endif + _VSTD::__throw_length_error("basic_string"); } template void __basic_string_common<__b>::__throw_out_of_range() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("basic_string"); -#else - assert(!"basic_string out_of_range"); -#endif + _VSTD::__throw_out_of_range("basic_string"); } #ifdef _LIBCPP_MSVC diff --git a/libcxx/include/typeinfo b/libcxx/include/typeinfo index 14ef77b..fe9123e 100644 --- a/libcxx/include/typeinfo +++ b/libcxx/include/typeinfo @@ -165,4 +165,16 @@ public: } // std +_LIBCPP_BEGIN_NAMESPACE_STD +_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE +void __throw_bad_cast() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_cast(); +#else + _VSTD::abort(); +#endif +} +_LIBCPP_END_NAMESPACE_STD + #endif // __LIBCPP_TYPEINFO diff --git a/libcxx/include/vector b/libcxx/include/vector index 16d48ae..cbe86a4 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -290,30 +290,22 @@ class __vector_base_common { protected: _LIBCPP_ALWAYS_INLINE __vector_base_common() {} - void __throw_length_error() const; - void __throw_out_of_range() const; + _LIBCPP_NORETURN void __throw_length_error() const; + _LIBCPP_NORETURN void __throw_out_of_range() const; }; template void __vector_base_common<__b>::__throw_length_error() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw length_error("vector"); -#else - assert(!"vector length_error"); -#endif + _VSTD::__throw_length_error("vector"); } template void __vector_base_common<__b>::__throw_out_of_range() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("vector"); -#else - assert(!"vector out_of_range"); -#endif + _VSTD::__throw_out_of_range("vector"); } #ifdef _LIBCPP_MSVC diff --git a/libcxx/src/debug.cpp b/libcxx/src/debug.cpp index b1a16e6..d46935c 100644 --- a/libcxx/src/debug.cpp +++ b/libcxx/src/debug.cpp @@ -152,11 +152,8 @@ __libcpp_db::__insert_c(void* __c) size_t nc = __next_prime(2*static_cast(__cend_ - __cbeg_) + 1); __c_node** cbeg = static_cast<__c_node**>(calloc(nc, sizeof(void*))); if (cbeg == nullptr) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_alloc(); -#else - abort(); -#endif + __throw_bad_alloc(); + for (__c_node** p = __cbeg_; p != __cend_; ++p) { __c_node* q = *p; @@ -178,11 +175,8 @@ __libcpp_db::__insert_c(void* __c) __c_node* r = __cbeg_[hc] = static_cast<__c_node*>(malloc(sizeof(__c_node))); if (__cbeg_[hc] == nullptr) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_alloc(); -#else - abort(); -#endif + __throw_bad_alloc(); + r->__c_ = __c; r->__next_ = p; ++__csz_; @@ -475,11 +469,8 @@ __c_node::__add(__i_node* i) __i_node** beg = static_cast<__i_node**>(malloc(nc * sizeof(__i_node*))); if (beg == nullptr) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_alloc(); -#else - abort(); -#endif + __throw_bad_alloc(); + if (nc > 1) memcpy(beg, beg_, nc/2*sizeof(__i_node*)); free(beg_); @@ -501,11 +492,8 @@ __libcpp_db::__insert_iterator(void* __i) size_t nc = __next_prime(2*static_cast(__iend_ - __ibeg_) + 1); __i_node** ibeg = static_cast<__i_node**>(calloc(nc, sizeof(void*))); if (ibeg == nullptr) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_alloc(); -#else - abort(); -#endif + __throw_bad_alloc(); + for (__i_node** p = __ibeg_; p != __iend_; ++p) { __i_node* q = *p; @@ -527,11 +515,8 @@ __libcpp_db::__insert_iterator(void* __i) __i_node* r = __ibeg_[hi] = static_cast<__i_node*>(malloc(sizeof(__i_node))); if (r == nullptr) -#ifndef _LIBCPP_NO_EXCEPTIONS - throw bad_alloc(); -#else - abort(); -#endif + __throw_bad_alloc(); + ::new(r) __i_node(__i, p, nullptr); ++__isz_; return r; diff --git a/libcxx/src/experimental/memory_resource.cpp b/libcxx/src/experimental/memory_resource.cpp index c01eb08..c5de1aa 100644 --- a/libcxx/src/experimental/memory_resource.cpp +++ b/libcxx/src/experimental/memory_resource.cpp @@ -50,11 +50,7 @@ public: protected: virtual void* do_allocate(size_t, size_t) { -#ifndef _LIBCPP_NO_EXCEPTIONS - throw std::bad_alloc(); -#else - abort(); -#endif + __throw_bad_alloc(); } virtual void do_deallocate(void *, size_t, size_t) {} virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp index da2fd11..a4e0a53 100644 --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -107,6 +107,16 @@ countof(const T * const begin, const T * const end) return static_cast(end - begin); } +_LIBCPP_NORETURN static void __throw_runtime_error(const string &msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw runtime_error(msg); +#else + (void)msg; + _VSTD::abort(); +#endif +} + } #if defined(_AIX) @@ -646,22 +656,18 @@ collate_byname::collate_byname(const char* n, size_t refs) : collate(refs), __l(newlocale(LC_ALL_MASK, n, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("collate_byname::collate_byname" + __throw_runtime_error("collate_byname::collate_byname" " failed to construct for " + string(n)); -#endif // _LIBCPP_NO_EXCEPTIONS } collate_byname::collate_byname(const string& name, size_t refs) : collate(refs), __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("collate_byname::collate_byname" + __throw_runtime_error("collate_byname::collate_byname" " failed to construct for " + name); -#endif // _LIBCPP_NO_EXCEPTIONS } collate_byname::~collate_byname() @@ -698,22 +704,18 @@ collate_byname::collate_byname(const char* n, size_t refs) : collate(refs), __l(newlocale(LC_ALL_MASK, n, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("collate_byname::collate_byname(size_t refs)" + __throw_runtime_error("collate_byname::collate_byname(size_t refs)" " failed to construct for " + string(n)); -#endif // _LIBCPP_NO_EXCEPTIONS } collate_byname::collate_byname(const string& name, size_t refs) : collate(refs), __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("collate_byname::collate_byname(size_t refs)" + __throw_runtime_error("collate_byname::collate_byname(size_t refs)" " failed to construct for " + name); -#endif // _LIBCPP_NO_EXCEPTIONS } collate_byname::~collate_byname() @@ -1172,22 +1174,18 @@ ctype_byname::ctype_byname(const char* name, size_t refs) : ctype(0, false, refs), __l(newlocale(LC_ALL_MASK, name, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("ctype_byname::ctype_byname" + __throw_runtime_error("ctype_byname::ctype_byname" " failed to construct for " + string(name)); -#endif // _LIBCPP_NO_EXCEPTIONS } ctype_byname::ctype_byname(const string& name, size_t refs) : ctype(0, false, refs), __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("ctype_byname::ctype_byname" + __throw_runtime_error("ctype_byname::ctype_byname" " failed to construct for " + name); -#endif // _LIBCPP_NO_EXCEPTIONS } ctype_byname::~ctype_byname() @@ -1229,22 +1227,18 @@ ctype_byname::ctype_byname(const char* name, size_t refs) : ctype(refs), __l(newlocale(LC_ALL_MASK, name, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("ctype_byname::ctype_byname" + __throw_runtime_error("ctype_byname::ctype_byname" " failed to construct for " + string(name)); -#endif // _LIBCPP_NO_EXCEPTIONS } ctype_byname::ctype_byname(const string& name, size_t refs) : ctype(refs), __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("ctype_byname::ctype_byname" + __throw_runtime_error("ctype_byname::ctype_byname" " failed to construct for " + name); -#endif // _LIBCPP_NO_EXCEPTIONS } ctype_byname::~ctype_byname() @@ -1504,11 +1498,9 @@ codecvt::codecvt(const char* nm, size_t refs) : locale::facet(refs), __l(newlocale(LC_ALL_MASK, nm, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__l == 0) - throw runtime_error("codecvt_byname::codecvt_byname" + __throw_runtime_error("codecvt_byname::codecvt_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS } codecvt::~codecvt() @@ -4257,11 +4249,10 @@ numpunct_byname::__init(const char* nm) if (strcmp(nm, "C") != 0) { __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); -#ifndef _LIBCPP_NO_EXCEPTIONS if (loc == nullptr) - throw runtime_error("numpunct_byname::numpunct_byname" + __throw_runtime_error("numpunct_byname::numpunct_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS + lconv* lc = __libcpp_localeconv_l(loc.get()); if (*lc->decimal_point) __decimal_point_ = *lc->decimal_point; @@ -4296,11 +4287,10 @@ numpunct_byname::__init(const char* nm) if (strcmp(nm, "C") != 0) { __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); -#ifndef _LIBCPP_NO_EXCEPTIONS if (loc == nullptr) - throw runtime_error("numpunct_byname::numpunct_byname" + __throw_runtime_error("numpunct_byname::numpunct_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS + lconv* lc = __libcpp_localeconv_l(loc.get()); if (*lc->decimal_point) __decimal_point_ = *lc->decimal_point; @@ -4703,21 +4693,17 @@ __time_get_c_storage::__r() const __time_get::__time_get(const char* nm) : __loc_(newlocale(LC_ALL_MASK, nm, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__loc_ == 0) - throw runtime_error("time_get_byname" + __throw_runtime_error("time_get_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS } __time_get::__time_get(const string& nm) : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__loc_ == 0) - throw runtime_error("time_get_byname" + __throw_runtime_error("time_get_byname" " failed to construct for " + nm); -#endif // _LIBCPP_NO_EXCEPTIONS } __time_get::~__time_get() @@ -5363,21 +5349,17 @@ __time_get_storage::__do_date_order() const __time_put::__time_put(const char* nm) : __loc_(newlocale(LC_ALL_MASK, nm, 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__loc_ == 0) - throw runtime_error("time_put_byname" + __throw_runtime_error("time_put_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS } __time_put::__time_put(const string& nm) : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0)) { -#ifndef _LIBCPP_NO_EXCEPTIONS if (__loc_ == 0) - throw runtime_error("time_put_byname" + __throw_runtime_error("time_put_byname" " failed to construct for " + nm); -#endif // _LIBCPP_NO_EXCEPTIONS } __time_put::~__time_put() @@ -5792,11 +5774,10 @@ moneypunct_byname::init(const char* nm) { typedef moneypunct base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); -#ifndef _LIBCPP_NO_EXCEPTIONS if (loc == nullptr) - throw runtime_error("moneypunct_byname" + __throw_runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS + lconv* lc = __libcpp_localeconv_l(loc.get()); if (*lc->mon_decimal_point) __decimal_point_ = *lc->mon_decimal_point; @@ -5836,11 +5817,10 @@ moneypunct_byname::init(const char* nm) { typedef moneypunct base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); -#ifndef _LIBCPP_NO_EXCEPTIONS if (loc == nullptr) - throw runtime_error("moneypunct_byname" + __throw_runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS + lconv* lc = __libcpp_localeconv_l(loc.get()); if (*lc->mon_decimal_point) __decimal_point_ = *lc->mon_decimal_point; @@ -5897,11 +5877,9 @@ moneypunct_byname::init(const char* nm) { typedef moneypunct base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); -#ifndef _LIBCPP_NO_EXCEPTIONS if (loc == nullptr) - throw runtime_error("moneypunct_byname" + __throw_runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS lconv* lc = __libcpp_localeconv_l(loc.get()); if (*lc->mon_decimal_point) __decimal_point_ = static_cast(*lc->mon_decimal_point); @@ -5964,11 +5942,10 @@ moneypunct_byname::init(const char* nm) { typedef moneypunct base; __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); -#ifndef _LIBCPP_NO_EXCEPTIONS if (loc == nullptr) - throw runtime_error("moneypunct_byname" + __throw_runtime_error("moneypunct_byname" " failed to construct for " + string(nm)); -#endif // _LIBCPP_NO_EXCEPTIONS + lconv* lc = __libcpp_localeconv_l(loc.get()); if (*lc->mon_decimal_point) __decimal_point_ = static_cast(*lc->mon_decimal_point); @@ -6050,6 +6027,7 @@ void __throw_runtime_error(const char* msg) throw runtime_error(msg); #else (void)msg; + _VSTD::abort(); #endif } diff --git a/libcxx/src/new.cpp b/libcxx/src/new.cpp index f4f73d8..d5db461 100644 --- a/libcxx/src/new.cpp +++ b/libcxx/src/new.cpp @@ -241,6 +241,8 @@ __throw_bad_alloc() { #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); +#else + _VSTD::abort(); #endif } diff --git a/libcxx/src/string.cpp b/libcxx/src/string.cpp index d3f29df..76d5cac 100644 --- a/libcxx/src/string.cpp +++ b/libcxx/src/string.cpp @@ -40,7 +40,7 @@ void throw_helper( const string& msg ) throw T( msg ); #else fprintf(stderr, "%s\n", msg.c_str()); - abort(); + _VSTD::abort(); #endif } diff --git a/libcxx/src/system_error.cpp b/libcxx/src/system_error.cpp index 87f35ae..926f6f1 100644 --- a/libcxx/src/system_error.cpp +++ b/libcxx/src/system_error.cpp @@ -258,6 +258,7 @@ __throw_system_error(int ev, const char* what_arg) #else (void)ev; (void)what_arg; + _VSTD::abort(); #endif } diff --git a/libcxx/src/thread.cpp b/libcxx/src/thread.cpp index 467402b..4775e10 100644 --- a/libcxx/src/thread.cpp +++ b/libcxx/src/thread.cpp @@ -53,10 +53,9 @@ thread::join() if (ec == 0) __t_ = 0; } -#ifndef _LIBCPP_NO_EXCEPTIONS + if (ec) - throw system_error(error_code(ec, system_category()), "thread::join failed"); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_system_error(ec, "thread::join failed"); } void @@ -69,10 +68,9 @@ thread::detach() if (ec == 0) __t_ = 0; } -#ifndef _LIBCPP_NO_EXCEPTIONS + if (ec) - throw system_error(error_code(ec, system_category()), "thread::detach failed"); -#endif // _LIBCPP_NO_EXCEPTIONS + __throw_system_error(ec, "thread::detach failed"); } unsigned diff --git a/libcxx/src/typeinfo.cpp b/libcxx/src/typeinfo.cpp index 5c0a609..3033c98 100644 --- a/libcxx/src/typeinfo.cpp +++ b/libcxx/src/typeinfo.cpp @@ -54,12 +54,16 @@ std::bad_typeid::what() const _NOEXCEPT { #ifndef _LIBCPP_NO_EXCEPTIONS throw std::bad_typeid(); +#else + _VSTD::abort(); #endif } void __cxxabiv1::__cxa_bad_cast() { #ifndef _LIBCPP_NO_EXCEPTIONS throw std::bad_cast(); +#else + _VSTD::abort(); #endif } #endif -- 2.7.4