diff options
Diffstat (limited to 'contrib/llvm-project/libcxx/include')
41 files changed, 260 insertions, 158 deletions
| diff --git a/contrib/llvm-project/libcxx/include/__algorithm/pop_heap.h b/contrib/llvm-project/libcxx/include/__algorithm/pop_heap.h index a93a9875f705..798a1d09934b 100644 --- a/contrib/llvm-project/libcxx/include/__algorithm/pop_heap.h +++ b/contrib/llvm-project/libcxx/include/__algorithm/pop_heap.h @@ -36,7 +36,8 @@ __pop_heap(_RandomAccessIterator __first,             _RandomAccessIterator __last,             _Compare& __comp,             typename iterator_traits<_RandomAccessIterator>::difference_type __len) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__len > 0, "The heap given to pop_heap must be non-empty"); +  // Calling `pop_heap` on an empty range is undefined behavior, but in practice it will be a no-op. +  _LIBCPP_ASSERT_PEDANTIC(__len > 0, "The heap given to pop_heap must be non-empty");    __comp_ref_type<_Compare> __comp_ref = __comp; diff --git a/contrib/llvm-project/libcxx/include/__algorithm/sift_down.h b/contrib/llvm-project/libcxx/include/__algorithm/sift_down.h index 7f152e4dbd7f..42803e30631f 100644 --- a/contrib/llvm-project/libcxx/include/__algorithm/sift_down.h +++ b/contrib/llvm-project/libcxx/include/__algorithm/sift_down.h @@ -85,7 +85,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _RandomAccessIterator __floy      _Compare&& __comp,      typename iterator_traits<_RandomAccessIterator>::difference_type __len) {    using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type; -  _LIBCPP_ASSERT_UNCATEGORIZED(__len >= 2, "shouldn't be called unless __len >= 2"); +  _LIBCPP_ASSERT_INTERNAL(__len >= 2, "shouldn't be called unless __len >= 2");    _RandomAccessIterator __hole    = __first;    _RandomAccessIterator __child_i = __first; diff --git a/contrib/llvm-project/libcxx/include/__algorithm/sort.h b/contrib/llvm-project/libcxx/include/__algorithm/sort.h index 1b878c33c7a1..ac47489af0aa 100644 --- a/contrib/llvm-project/libcxx/include/__algorithm/sort.h +++ b/contrib/llvm-project/libcxx/include/__algorithm/sort.h @@ -533,7 +533,7 @@ __bitset_partition(_RandomAccessIterator __first, _RandomAccessIterator __last,    using _Ops = _IterOps<_AlgPolicy>;    typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type;    typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type; -  _LIBCPP_ASSERT_UNCATEGORIZED(__last - __first >= difference_type(3), ""); +  _LIBCPP_ASSERT_INTERNAL(__last - __first >= difference_type(3), "");    const _RandomAccessIterator __begin = __first; // used for bounds checking, those are not moved around    const _RandomAccessIterator __end   = __last;    (void)__end; // @@ -625,7 +625,7 @@ __partition_with_equals_on_right(_RandomAccessIterator __first, _RandomAccessIte    using _Ops = _IterOps<_AlgPolicy>;    typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;    typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type; -  _LIBCPP_ASSERT_UNCATEGORIZED(__last - __first >= difference_type(3), ""); +  _LIBCPP_ASSERT_INTERNAL(__last - __first >= difference_type(3), "");    const _RandomAccessIterator __begin = __first; // used for bounds checking, those are not moved around    const _RandomAccessIterator __end   = __last;    (void)__end; // diff --git a/contrib/llvm-project/libcxx/include/__charconv/to_chars_base_10.h b/contrib/llvm-project/libcxx/include/__charconv/to_chars_base_10.h index 33c512e20f04..0dee351521f9 100644 --- a/contrib/llvm-project/libcxx/include/__charconv/to_chars_base_10.h +++ b/contrib/llvm-project/libcxx/include/__charconv/to_chars_base_10.h @@ -132,14 +132,14 @@ __base_10_u64(char* __buffer, uint64_t __value) noexcept {  /// range that can be used. However the range is sufficient for  /// \ref __base_10_u128.  _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline __uint128_t __pow_10(int __exp) noexcept { -  _LIBCPP_ASSERT_UNCATEGORIZED(__exp >= __pow10_128_offset, "Index out of bounds"); +  _LIBCPP_ASSERT_INTERNAL(__exp >= __pow10_128_offset, "Index out of bounds");    return __pow10_128[__exp - __pow10_128_offset];  }  _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char*  __base_10_u128(char* __buffer, __uint128_t __value) noexcept { -  _LIBCPP_ASSERT_UNCATEGORIZED( -      __value > numeric_limits<uint64_t>::max(), "The optimizations for this algorithm fail when this isn't true."); +  _LIBCPP_ASSERT_INTERNAL( +      __value > numeric_limits<uint64_t>::max(), "The optimizations for this algorithm fails when this isn't true.");    // Unlike the 64 to 32 bit case the 128 bit case the "upper half" can't be    // stored in the "lower half". Instead we first need to handle the top most diff --git a/contrib/llvm-project/libcxx/include/__charconv/to_chars_integral.h b/contrib/llvm-project/libcxx/include/__charconv/to_chars_integral.h index f50cc55a4c6d..40fbe334d8d5 100644 --- a/contrib/llvm-project/libcxx/include/__charconv/to_chars_integral.h +++ b/contrib/llvm-project/libcxx/include/__charconv/to_chars_integral.h @@ -246,7 +246,7 @@ __to_chars_integral(char* __first, char* __last, _Tp __value) {  template <typename _Tp>  _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI int __to_chars_integral_width(_Tp __value, unsigned __base) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__value >= 0, "The function requires a non-negative value."); +  _LIBCPP_ASSERT_INTERNAL(__value >= 0, "The function requires a non-negative value.");    unsigned __base_2 = __base * __base;    unsigned __base_3 = __base_2 * __base; diff --git a/contrib/llvm-project/libcxx/include/__charconv/traits.h b/contrib/llvm-project/libcxx/include/__charconv/traits.h index d3884b560dfd..b4907c3f7757 100644 --- a/contrib/llvm-project/libcxx/include/__charconv/traits.h +++ b/contrib/llvm-project/libcxx/include/__charconv/traits.h @@ -101,11 +101,11 @@ struct _LIBCPP_HIDDEN __traits_base<_Tp, __enable_if_t<sizeof(_Tp) == sizeof(__u    /// zero is set to one. This means the first element of the lookup table is    /// zero.    static _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI int __width(_Tp __v) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_INTERNAL(          __v > numeric_limits<uint64_t>::max(), "The optimizations for this algorithm fail when this isn't true.");      // There's always a bit set in the upper 64-bits.      auto __t = (128 - std::__libcpp_clz(static_cast<uint64_t>(__v >> 64))) * 1233 >> 12; -    _LIBCPP_ASSERT_UNCATEGORIZED(__t >= __itoa::__pow10_128_offset, "Index out of bounds"); +    _LIBCPP_ASSERT_INTERNAL(__t >= __itoa::__pow10_128_offset, "Index out of bounds");      // __t is adjusted since the lookup table misses the lower entries.      return __t - (__v < __itoa::__pow10_128[__t - __itoa::__pow10_128_offset]) + 1;    } diff --git a/contrib/llvm-project/libcxx/include/__chrono/parser_std_format_spec.h b/contrib/llvm-project/libcxx/include/__chrono/parser_std_format_spec.h index 296be8794ec5..785bbae198e4 100644 --- a/contrib/llvm-project/libcxx/include/__chrono/parser_std_format_spec.h +++ b/contrib/llvm-project/libcxx/include/__chrono/parser_std_format_spec.h @@ -160,10 +160,9 @@ public:  private:    _LIBCPP_HIDE_FROM_ABI constexpr _ConstIterator    __parse_chrono_specs(_ConstIterator __begin, _ConstIterator __end, __flags __flags) { -    _LIBCPP_ASSERT_UNCATEGORIZED( -        __begin != __end, -        "When called with an empty input the function will cause " -        "undefined behavior by evaluating data not in the input"); +    _LIBCPP_ASSERT_INTERNAL(__begin != __end, +                            "When called with an empty input the function will cause " +                            "undefined behavior by evaluating data not in the input");      if (*__begin != _CharT('%') && *__begin != _CharT('}'))        std::__throw_format_error("The format specifier expects a '%' or a '}'"); diff --git a/contrib/llvm-project/libcxx/include/__config b/contrib/llvm-project/libcxx/include/__config index 959082502a49..71624a773d86 100644 --- a/contrib/llvm-project/libcxx/include/__config +++ b/contrib/llvm-project/libcxx/include/__config @@ -285,6 +285,9 @@  // - `_LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR` -- checks any operations that exchange nodes between containers to make sure  //   the containers have compatible allocators.  // +// - `_LIBCPP_ASSERT_PEDANTIC` -- checks prerequisites which are imposed by the Standard, but violating which happens to +//   be benign in our implementation. +//  // - `_LIBCPP_ASSERT_INTERNAL` -- checks that internal invariants of the library hold. These assertions don't depend on  //   user input.  // @@ -327,6 +330,7 @@ _LIBCPP_HARDENING_MODE_DEBUG  // vulnerability.  #    define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)   _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)     _LIBCPP_ASSUME(expression) +#    define _LIBCPP_ASSERT_PEDANTIC(expression, message)                 _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_INTERNAL(expression, message)                 _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)            _LIBCPP_ASSUME(expression) @@ -341,6 +345,7 @@ _LIBCPP_HARDENING_MODE_DEBUG  #    define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)   _LIBCPP_ASSERT(expression, message)  #    define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)     _LIBCPP_ASSERT(expression, message)  #    define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)            _LIBCPP_ASSERT(expression, message) +#    define _LIBCPP_ASSERT_PEDANTIC(expression, message)                 _LIBCPP_ASSERT(expression, message)  // Disabled checks.  #    define _LIBCPP_ASSERT_INTERNAL(expression, message)                 _LIBCPP_ASSUME(expression) @@ -354,6 +359,7 @@ _LIBCPP_HARDENING_MODE_DEBUG  #    define _LIBCPP_ASSERT_NON_NULL(expression, message)                  _LIBCPP_ASSERT(expression, message)  #    define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)    _LIBCPP_ASSERT(expression, message)  #    define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)      _LIBCPP_ASSERT(expression, message) +#    define _LIBCPP_ASSERT_PEDANTIC(expression, message)                  _LIBCPP_ASSERT(expression, message)  #    define _LIBCPP_ASSERT_INTERNAL(expression, message)                  _LIBCPP_ASSERT(expression, message)  #    define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)             _LIBCPP_ASSERT(expression, message) @@ -367,6 +373,7 @@ _LIBCPP_HARDENING_MODE_DEBUG  #    define _LIBCPP_ASSERT_NON_NULL(expression, message)                  _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)    _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)      _LIBCPP_ASSUME(expression) +#    define _LIBCPP_ASSERT_PEDANTIC(expression, message)                  _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_INTERNAL(expression, message)                  _LIBCPP_ASSUME(expression)  #    define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)             _LIBCPP_ASSUME(expression) diff --git a/contrib/llvm-project/libcxx/include/__filesystem/directory_iterator.h b/contrib/llvm-project/libcxx/include/__filesystem/directory_iterator.h index 29bd8da6caa4..5287a4d8b055 100644 --- a/contrib/llvm-project/libcxx/include/__filesystem/directory_iterator.h +++ b/contrib/llvm-project/libcxx/include/__filesystem/directory_iterator.h @@ -73,7 +73,8 @@ public:    _LIBCPP_HIDE_FROM_ABI ~directory_iterator() = default;    _LIBCPP_HIDE_FROM_ABI const directory_entry& operator*() const { -    _LIBCPP_ASSERT_UNCATEGORIZED(__imp_, "The end iterator cannot be dereferenced"); +    // Note: this check duplicates a check in `__dereference()`. +    _LIBCPP_ASSERT_NON_NULL(__imp_, "The end iterator cannot be dereferenced");      return __dereference();    } diff --git a/contrib/llvm-project/libcxx/include/__filesystem/path_iterator.h b/contrib/llvm-project/libcxx/include/__filesystem/path_iterator.h index 1a9aaf0e7d99..d2d65cd122ca 100644 --- a/contrib/llvm-project/libcxx/include/__filesystem/path_iterator.h +++ b/contrib/llvm-project/libcxx/include/__filesystem/path_iterator.h @@ -61,7 +61,7 @@ public:    _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return &__stashed_elem_; }    _LIBCPP_HIDE_FROM_ABI iterator& operator++() { -    _LIBCPP_ASSERT_UNCATEGORIZED(__state_ != _Singular, "attempting to increment a singular iterator"); +    _LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to increment a singular iterator");      _LIBCPP_ASSERT_UNCATEGORIZED(__state_ != _AtEnd, "attempting to increment the end iterator");      return __increment();    } @@ -73,7 +73,7 @@ public:    }    _LIBCPP_HIDE_FROM_ABI iterator& operator--() { -    _LIBCPP_ASSERT_UNCATEGORIZED(__state_ != _Singular, "attempting to decrement a singular iterator"); +    _LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to decrement a singular iterator");      _LIBCPP_ASSERT_UNCATEGORIZED(          __entry_.data() != __path_ptr_->native().data(), "attempting to decrement the begin iterator");      return __decrement(); diff --git a/contrib/llvm-project/libcxx/include/__format/buffer.h b/contrib/llvm-project/libcxx/include/__format/buffer.h index 7ee583d81394..8598f0a1c039 100644 --- a/contrib/llvm-project/libcxx/include/__format/buffer.h +++ b/contrib/llvm-project/libcxx/include/__format/buffer.h @@ -115,7 +115,7 @@ public:      // The output doesn't fit in the internal buffer.      // Copy the data in "__capacity_" sized chunks. -    _LIBCPP_ASSERT_UNCATEGORIZED(__size_ == 0, "the buffer should be flushed by __flush_on_overflow"); +    _LIBCPP_ASSERT_INTERNAL(__size_ == 0, "the buffer should be flushed by __flush_on_overflow");      const _InCharT* __first = __str.data();      do {        size_t __chunk = std::min(__n, __capacity_); @@ -134,7 +134,7 @@ public:              class _UnaryOperation,              __fmt_char_type _InCharT = typename iterator_traits<_Iterator>::value_type>    _LIBCPP_HIDE_FROM_ABI void __transform(_Iterator __first, _Iterator __last, _UnaryOperation __operation) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__first <= __last, "not a valid range"); +    _LIBCPP_ASSERT_INTERNAL(__first <= __last, "not a valid range");      size_t __n = static_cast<size_t>(__last - __first);      __flush_on_overflow(__n); @@ -146,7 +146,7 @@ public:      // The output doesn't fit in the internal buffer.      // Transform the data in "__capacity_" sized chunks. -    _LIBCPP_ASSERT_UNCATEGORIZED(__size_ == 0, "the buffer should be flushed by __flush_on_overflow"); +    _LIBCPP_ASSERT_INTERNAL(__size_ == 0, "the buffer should be flushed by __flush_on_overflow");      do {        size_t __chunk = std::min(__n, __capacity_);        std::transform(__first, __first + __chunk, std::addressof(__ptr_[__size_]), __operation); @@ -168,7 +168,7 @@ public:      // The output doesn't fit in the internal buffer.      // Fill the buffer in "__capacity_" sized chunks. -    _LIBCPP_ASSERT_UNCATEGORIZED(__size_ == 0, "the buffer should be flushed by __flush_on_overflow"); +    _LIBCPP_ASSERT_INTERNAL(__size_ == 0, "the buffer should be flushed by __flush_on_overflow");      do {        size_t __chunk = std::min(__n, __capacity_);        std::fill_n(std::addressof(__ptr_[__size_]), __chunk, __value); @@ -596,7 +596,7 @@ public:              class _UnaryOperation,              __fmt_char_type _InCharT = typename iterator_traits<_Iterator>::value_type>    _LIBCPP_HIDE_FROM_ABI void __transform(_Iterator __first, _Iterator __last, _UnaryOperation __operation) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__first <= __last, "not a valid range"); +    _LIBCPP_ASSERT_INTERNAL(__first <= __last, "not a valid range");      size_t __n = static_cast<size_t>(__last - __first);      if (__size_ + __n >= __capacity_) @@ -623,7 +623,7 @@ private:    _LIBCPP_HIDE_FROM_ABI void __grow_buffer() { __grow_buffer(__capacity_ * 1.6); }    _LIBCPP_HIDE_FROM_ABI void __grow_buffer(size_t __capacity) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__capacity > __capacity_, "the buffer must grow"); +    _LIBCPP_ASSERT_INTERNAL(__capacity > __capacity_, "the buffer must grow");      auto __result = std::__allocate_at_least(__alloc_, __capacity);      auto __guard  = std::__make_exception_guard([&] {        allocator_traits<_Alloc>::deallocate(__alloc_, __result.ptr, __result.count); diff --git a/contrib/llvm-project/libcxx/include/__format/format_arg.h b/contrib/llvm-project/libcxx/include/__format/format_arg.h index 280c91082417..10fca15d5a7a 100644 --- a/contrib/llvm-project/libcxx/include/__format/format_arg.h +++ b/contrib/llvm-project/libcxx/include/__format/format_arg.h @@ -83,7 +83,7 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool __use_packed_format_arg_store(size_t __size  }  _LIBCPP_HIDE_FROM_ABI constexpr __arg_t __get_packed_type(uint64_t __types, size_t __id) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__id <= __packed_types_max, ""); +  _LIBCPP_ASSERT_INTERNAL(__id <= __packed_types_max, "");    if (__id > 0)      __types >>= __id * __packed_arg_t_bits; diff --git a/contrib/llvm-project/libcxx/include/__format/format_arg_store.h b/contrib/llvm-project/libcxx/include/__format/format_arg_store.h index c481992d2d71..066cd369eb89 100644 --- a/contrib/llvm-project/libcxx/include/__format/format_arg_store.h +++ b/contrib/llvm-project/libcxx/include/__format/format_arg_store.h @@ -228,15 +228,15 @@ _LIBCPP_HIDE_FROM_ABI void __store_basic_format_arg(basic_format_arg<_Context>*    ([&] { *__data++ = __format::__create_format_arg<_Context>(__args); }(), ...);  } -template <class _Context, size_t N> +template <class _Context, size_t _Np>  struct __packed_format_arg_store { -  __basic_format_arg_value<_Context> __values_[N]; +  __basic_format_arg_value<_Context> __values_[_Np];    uint64_t __types_ = 0;  }; -template <class _Context, size_t N> +template <class _Context, size_t _Np>  struct __unpacked_format_arg_store { -  basic_format_arg<_Context> __args_[N]; +  basic_format_arg<_Context> __args_[_Np];  };  } // namespace __format diff --git a/contrib/llvm-project/libcxx/include/__format/formatter_bool.h b/contrib/llvm-project/libcxx/include/__format/formatter_bool.h index 3c8ae95f55fa..1c479501b675 100644 --- a/contrib/llvm-project/libcxx/include/__format/formatter_bool.h +++ b/contrib/llvm-project/libcxx/include/__format/formatter_bool.h @@ -62,7 +62,7 @@ public:            static_cast<unsigned>(__value), __ctx, __parser_.__get_parsed_std_specifications(__ctx));      default: -      _LIBCPP_ASSERT_UNCATEGORIZED(false, "The parse function should have validated the type"); +      _LIBCPP_ASSERT_INTERNAL(false, "The parse function should have validated the type");        __libcpp_unreachable();      }    } diff --git a/contrib/llvm-project/libcxx/include/__format/formatter_floating_point.h b/contrib/llvm-project/libcxx/include/__format/formatter_floating_point.h index 33cc2a4ed661..6802a8b7bd4c 100644 --- a/contrib/llvm-project/libcxx/include/__format/formatter_floating_point.h +++ b/contrib/llvm-project/libcxx/include/__format/formatter_floating_point.h @@ -57,21 +57,21 @@ namespace __formatter {  template <floating_point _Tp>  _LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value) {    to_chars_result __r = std::to_chars(__first, __last, __value); -  _LIBCPP_ASSERT_UNCATEGORIZED(__r.ec == errc(0), "Internal buffer too small"); +  _LIBCPP_ASSERT_INTERNAL(__r.ec == errc(0), "Internal buffer too small");    return __r.ptr;  }  template <floating_point _Tp>  _LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value, chars_format __fmt) {    to_chars_result __r = std::to_chars(__first, __last, __value, __fmt); -  _LIBCPP_ASSERT_UNCATEGORIZED(__r.ec == errc(0), "Internal buffer too small"); +  _LIBCPP_ASSERT_INTERNAL(__r.ec == errc(0), "Internal buffer too small");    return __r.ptr;  }  template <floating_point _Tp>  _LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value, chars_format __fmt, int __precision) {    to_chars_result __r = std::to_chars(__first, __last, __value, __fmt, __precision); -  _LIBCPP_ASSERT_UNCATEGORIZED(__r.ec == errc(0), "Internal buffer too small"); +  _LIBCPP_ASSERT_INTERNAL(__r.ec == errc(0), "Internal buffer too small");    return __r.ptr;  } @@ -252,10 +252,10 @@ __format_buffer_default(const __float_buffer<_Fp>& __buffer, _Tp __value, char*      __result.__radix_point = __result.__last;    // clang-format off -  _LIBCPP_ASSERT_UNCATEGORIZED((__result.__integral != __result.__last) && -                               (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && -                               (__result.__exponent == __result.__last || *__result.__exponent == 'e'), -                               "Post-condition failure."); +  _LIBCPP_ASSERT_INTERNAL((__result.__integral != __result.__last) && +                          (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && +                          (__result.__exponent == __result.__last || *__result.__exponent == 'e'), +                          "Post-condition failure.");    // clang-format on    return __result; @@ -304,10 +304,10 @@ _LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_hexadecimal_lower_case(    }    // clang-format off -  _LIBCPP_ASSERT_UNCATEGORIZED((__result.__integral != __result.__last) && -                               (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && -                               (__result.__exponent != __result.__last && *__result.__exponent == 'p'), -                               "Post-condition failure."); +  _LIBCPP_ASSERT_INTERNAL((__result.__integral != __result.__last) && +                          (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && +                          (__result.__exponent != __result.__last && *__result.__exponent == 'p'), +                          "Post-condition failure.");    // clang-format on    return __result; @@ -332,7 +332,7 @@ _LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_scientific_lower_case(        __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::scientific, __precision);    char* __first = __integral + 1; -  _LIBCPP_ASSERT_UNCATEGORIZED(__first != __result.__last, "No exponent present"); +  _LIBCPP_ASSERT_INTERNAL(__first != __result.__last, "No exponent present");    if (*__first == '.') {      __result.__radix_point = __first;      __result.__exponent    = __formatter::__find_exponent(__first + 1, __result.__last); @@ -342,10 +342,10 @@ _LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_scientific_lower_case(    }    // clang-format off -  _LIBCPP_ASSERT_UNCATEGORIZED((__result.__integral != __result.__last) && -                               (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && -                               (__result.__exponent != __result.__last && *__result.__exponent == 'e'), -                               "Post-condition failure."); +  _LIBCPP_ASSERT_INTERNAL((__result.__integral != __result.__last) && +                          (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && +                          (__result.__exponent != __result.__last && *__result.__exponent == 'e'), +                          "Post-condition failure.");    // clang-format on    return __result;  } @@ -374,10 +374,10 @@ __format_buffer_fixed(const __float_buffer<_Fp>& __buffer, _Tp __value, int __pr    __result.__exponent    = __result.__last;    // clang-format off -  _LIBCPP_ASSERT_UNCATEGORIZED((__result.__integral != __result.__last) && -                               (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && -                               (__result.__exponent == __result.__last), -                               "Post-condition failure."); +  _LIBCPP_ASSERT_INTERNAL((__result.__integral != __result.__last) && +                          (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && +                          (__result.__exponent == __result.__last), +                          "Post-condition failure.");    // clang-format on    return __result;  } @@ -410,10 +410,10 @@ __format_buffer_general_lower_case(__float_buffer<_Fp>& __buffer, _Tp __value, i    }    // clang-format off -  _LIBCPP_ASSERT_UNCATEGORIZED((__result.__integral != __result.__last) && -                               (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && -                               (__result.__exponent == __result.__last || *__result.__exponent == 'e'), -                               "Post-condition failure."); +  _LIBCPP_ASSERT_INTERNAL((__result.__integral != __result.__last) && +                          (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && +                          (__result.__exponent == __result.__last || *__result.__exponent == 'e'), +                          "Post-condition failure.");    // clang-format on    return __result; @@ -485,7 +485,7 @@ _LIBCPP_HIDE_FROM_ABI __float_result __format_buffer(      return __formatter::__format_buffer_general_upper_case(__buffer, __value, __buffer.__precision(), __first);    default: -    _LIBCPP_ASSERT_UNCATEGORIZED(false, "The parser should have validated the type"); +    _LIBCPP_ASSERT_INTERNAL(false, "The parser should have validated the type");      __libcpp_unreachable();    }  } @@ -620,9 +620,8 @@ _LIBCPP_HIDE_FROM_ABI auto __write_using_trailing_zeros(      size_t __size,      const _CharT* __exponent,      size_t __num_trailing_zeros) -> decltype(__out_it) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__first <= __last, "Not a valid range"); -  _LIBCPP_ASSERT_UNCATEGORIZED( -      __num_trailing_zeros > 0, "The overload not writing trailing zeros should have been used"); +  _LIBCPP_ASSERT_INTERNAL(__first <= __last, "Not a valid range"); +  _LIBCPP_ASSERT_INTERNAL(__num_trailing_zeros > 0, "The overload not writing trailing zeros should have been used");    __padding_size_result __padding =        __formatter::__padding_size(__size + __num_trailing_zeros, __specs.__width_, __specs.__alignment_); diff --git a/contrib/llvm-project/libcxx/include/__format/formatter_integral.h b/contrib/llvm-project/libcxx/include/__format/formatter_integral.h index ca66e26ede10..e0217a240027 100644 --- a/contrib/llvm-project/libcxx/include/__format/formatter_integral.h +++ b/contrib/llvm-project/libcxx/include/__format/formatter_integral.h @@ -90,10 +90,8 @@ _LIBCPP_HIDE_FROM_ABI inline _Iterator __insert_sign(_Iterator __buf, bool __neg   * regardless whether the @c std::numpunct's type is @c char or @c wchar_t.   */  _LIBCPP_HIDE_FROM_ABI inline string __determine_grouping(ptrdiff_t __size, const string& __grouping) { -  _LIBCPP_ASSERT_UNCATEGORIZED( -      !__grouping.empty() && __size > __grouping[0], -      "The slow grouping formatting is used while there will be no " -      "separators written"); +  _LIBCPP_ASSERT_INTERNAL(!__grouping.empty() && __size > __grouping[0], +                          "The slow grouping formatting is used while there will be no separators written");    string __r;    auto __end = __grouping.end() - 1;    auto __ptr = __grouping.begin(); @@ -161,7 +159,7 @@ _LIBCPP_HIDE_FROM_ABI _Iterator __to_buffer(_Iterator __first, _Iterator __last,    // TODO FMT Evaluate code overhead due to not calling the internal function    // directly. (Should be zero overhead.)    to_chars_result __r = std::to_chars(std::to_address(__first), std::to_address(__last), __value, __base); -  _LIBCPP_ASSERT_UNCATEGORIZED(__r.ec == errc(0), "Internal buffer too small"); +  _LIBCPP_ASSERT_INTERNAL(__r.ec == errc(0), "Internal buffer too small");    auto __diff = __r.ptr - std::to_address(__first);    return __first + __diff;  } @@ -248,10 +246,8 @@ _LIBCPP_HIDE_FROM_ABI _OutIt __write_using_decimal_separators(    auto __r = __grouping.rbegin();    auto __e = __grouping.rend() - 1; -  _LIBCPP_ASSERT_UNCATEGORIZED( -      __r != __e, -      "The slow grouping formatting is used while " -      "there will be no separators written."); +  _LIBCPP_ASSERT_INTERNAL( +      __r != __e, "The slow grouping formatting is used while there will be no separators written.");    // The output is divided in small groups of numbers to write:    // - A group before the first separator.    // - A separator and a group, repeated for the number of separators. @@ -380,7 +376,7 @@ __format_integer(_Tp __value,      return __formatter::__format_integer(__value, __ctx, __specs, __negative, __array.begin(), __array.end(), "0X", 16);    }    default: -    _LIBCPP_ASSERT_UNCATEGORIZED(false, "The parse function should have validated the type"); +    _LIBCPP_ASSERT_INTERNAL(false, "The parse function should have validated the type");      __libcpp_unreachable();    }  } diff --git a/contrib/llvm-project/libcxx/include/__format/formatter_output.h b/contrib/llvm-project/libcxx/include/__format/formatter_output.h index 31e06425703a..eebe880d69ef 100644 --- a/contrib/llvm-project/libcxx/include/__format/formatter_output.h +++ b/contrib/llvm-project/libcxx/include/__format/formatter_output.h @@ -66,8 +66,8 @@ struct _LIBCPP_EXPORTED_FROM_ABI __padding_size_result {  _LIBCPP_HIDE_FROM_ABI constexpr __padding_size_result  __padding_size(size_t __size, size_t __width, __format_spec::__alignment __align) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__width > __size, "don't call this function when no padding is required"); -  _LIBCPP_ASSERT_UNCATEGORIZED( +  _LIBCPP_ASSERT_INTERNAL(__width > __size, "don't call this function when no padding is required"); +  _LIBCPP_ASSERT_INTERNAL(        __align != __format_spec::__alignment::__zero_padding, "the caller should have handled the zero-padding");    size_t __fill = __width - __size; @@ -296,7 +296,7 @@ _LIBCPP_HIDE_FROM_ABI auto __write_string_no_precision(      basic_string_view<_CharT> __str,      output_iterator<const _CharT&> auto __out_it,      __format_spec::__parsed_specifications<_CharT> __specs) -> decltype(__out_it) { -  _LIBCPP_ASSERT_UNCATEGORIZED(!__specs.__has_precision(), "use __write_string"); +  _LIBCPP_ASSERT_INTERNAL(!__specs.__has_precision(), "use __write_string");    // No padding -> copy the string    if (!__specs.__has_width()) diff --git a/contrib/llvm-project/libcxx/include/__format/formatter_string.h b/contrib/llvm-project/libcxx/include/__format/formatter_string.h index 4ba5617a49c8..d1ccfb9b5f7d 100644 --- a/contrib/llvm-project/libcxx/include/__format/formatter_string.h +++ b/contrib/llvm-project/libcxx/include/__format/formatter_string.h @@ -64,10 +64,7 @@ struct _LIBCPP_TEMPLATE_VIS formatter<const _CharT*, _CharT> : public __formatte    template <class _FormatContext>    _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(const _CharT* __str, _FormatContext& __ctx) const { -    _LIBCPP_ASSERT_UNCATEGORIZED( -        __str, -        "The basic_format_arg constructor should have " -        "prevented an invalid pointer."); +    _LIBCPP_ASSERT_INTERNAL(__str, "The basic_format_arg constructor should have prevented an invalid pointer.");      __format_spec::__parsed_specifications<_CharT> __specs = _Base::__parser_.__get_parsed_std_specifications(__ctx);  #  if _LIBCPP_STD_VER >= 23 diff --git a/contrib/llvm-project/libcxx/include/__format/parser_std_format_spec.h b/contrib/llvm-project/libcxx/include/__format/parser_std_format_spec.h index e38729db965c..cf8af87b2128 100644 --- a/contrib/llvm-project/libcxx/include/__format/parser_std_format_spec.h +++ b/contrib/llvm-project/libcxx/include/__format/parser_std_format_spec.h @@ -733,10 +733,9 @@ private:      __format::__parse_number_result __r = __format::__parse_number(__begin, __end);      __width_                            = __r.__value; -    _LIBCPP_ASSERT_UNCATEGORIZED( -        __width_ != 0, -        "A zero value isn't allowed and should be impossible, " -        "due to validations in this function"); +    _LIBCPP_ASSERT_INTERNAL(__width_ != 0, +                            "A zero value isn't allowed and should be impossible, " +                            "due to validations in this function");      __begin = __r.__last;      return true;    } diff --git a/contrib/llvm-project/libcxx/include/__format/range_formatter.h b/contrib/llvm-project/libcxx/include/__format/range_formatter.h index d13278009fcf..691563074349 100644 --- a/contrib/llvm-project/libcxx/include/__format/range_formatter.h +++ b/contrib/llvm-project/libcxx/include/__format/range_formatter.h @@ -246,9 +246,8 @@ private:    __parse_empty_range_underlying_spec(_ParseContext& __ctx, typename _ParseContext::iterator __begin) {      __ctx.advance_to(__begin);      [[maybe_unused]] typename _ParseContext::iterator __result = __underlying_.parse(__ctx); -    _LIBCPP_ASSERT_UNCATEGORIZED( -        __result == __begin, -        "the underlying's parse function should not advance the input beyond the end of the input"); +    _LIBCPP_ASSERT_INTERNAL(__result == __begin, +                            "the underlying's parse function should not advance the input beyond the end of the input");      return __begin;    } diff --git a/contrib/llvm-project/libcxx/include/__format/unicode.h b/contrib/llvm-project/libcxx/include/__format/unicode.h index 8e1e7bb192a0..40067ca3448b 100644 --- a/contrib/llvm-project/libcxx/include/__format/unicode.h +++ b/contrib/llvm-project/libcxx/include/__format/unicode.h @@ -153,7 +153,7 @@ public:    // - The parser always needs to consume these code units    // - The code is optimized for well-formed UTF-8    [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __consume_result __consume() noexcept { -    _LIBCPP_ASSERT_UNCATEGORIZED(__first_ != __last_, "can't move beyond the end of input"); +    _LIBCPP_ASSERT_INTERNAL(__first_ != __last_, "can't move beyond the end of input");      // Based on the number of leading 1 bits the number of code units in the      // code point can be determined. See @@ -259,7 +259,7 @@ public:    _LIBCPP_HIDE_FROM_ABI constexpr bool __at_end() const noexcept { return __first_ == __last_; }    [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __consume_result __consume() noexcept { -    _LIBCPP_ASSERT_UNCATEGORIZED(__first_ != __last_, "can't move beyond the end of input"); +    _LIBCPP_ASSERT_INTERNAL(__first_ != __last_, "can't move beyond the end of input");      char32_t __value = static_cast<char32_t>(*__first_++);      if constexpr (sizeof(wchar_t) == 2) { @@ -305,8 +305,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr bool __at_extended_grapheme_cluster_break(    // *** Break at the start and end of text, unless the text is empty. *** -  _LIBCPP_ASSERT_UNCATEGORIZED(__prev != __property::__sot, "should be handled in the constructor"); // GB1 -  _LIBCPP_ASSERT_UNCATEGORIZED(__prev != __property::__eot, "should be handled by our caller");      // GB2 +  _LIBCPP_ASSERT_INTERNAL(__prev != __property::__sot, "should be handled in the constructor"); // GB1 +  _LIBCPP_ASSERT_INTERNAL(__prev != __property::__eot, "should be handled by our caller");      // GB2    // *** Do not break between a CR and LF. Otherwise, break before and after controls. ***    if (__prev == __property::__CR && __next == __property::__LF) // GB3 @@ -401,8 +401,8 @@ public:    };    _LIBCPP_HIDE_FROM_ABI constexpr __cluster __consume() { -    _LIBCPP_ASSERT_UNCATEGORIZED(__next_prop_ != __extended_grapheme_custer_property_boundary::__property::__eot, -                                 "can't move beyond the end of input"); +    _LIBCPP_ASSERT_INTERNAL(__next_prop_ != __extended_grapheme_custer_property_boundary::__property::__eot, +                            "can't move beyond the end of input");      char32_t __code_point = __next_code_point_;      if (!__code_point_view_.__at_end()) @@ -459,7 +459,7 @@ public:    _LIBCPP_HIDE_FROM_ABI constexpr _Iterator __position() const noexcept { return __first_; }    [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __consume_result __consume() noexcept { -    _LIBCPP_ASSERT_UNCATEGORIZED(__first_ != __last_, "can't move beyond the end of input"); +    _LIBCPP_ASSERT_INTERNAL(__first_ != __last_, "can't move beyond the end of input");      return {static_cast<char32_t>(*__first_++)};    } diff --git a/contrib/llvm-project/libcxx/include/__format/write_escaped.h b/contrib/llvm-project/libcxx/include/__format/write_escaped.h index 15141eebc029..ec1283a173e9 100644 --- a/contrib/llvm-project/libcxx/include/__format/write_escaped.h +++ b/contrib/llvm-project/libcxx/include/__format/write_escaped.h @@ -71,7 +71,7 @@ __write_escaped_code_unit(basic_string<_CharT>& __str, char32_t __value, const _    char __buffer[8];    to_chars_result __r = std::to_chars(std::begin(__buffer), std::end(__buffer), __value, 16); -  _LIBCPP_ASSERT_UNCATEGORIZED(__r.ec == errc(0), "Internal buffer too small"); +  _LIBCPP_ASSERT_INTERNAL(__r.ec == errc(0), "Internal buffer too small");    std::ranges::copy(std::begin(__buffer), __r.ptr, __out_it);    __str += _CharT('}'); diff --git a/contrib/llvm-project/libcxx/include/__hash_table b/contrib/llvm-project/libcxx/include/__hash_table index 3cee48ef8538..4ca49fe42606 100644 --- a/contrib/llvm-project/libcxx/include/__hash_table +++ b/contrib/llvm-project/libcxx/include/__hash_table @@ -915,7 +915,10 @@ public:      return __bc != 0 ? (float)size() / __bc : 0.f;    }    _LIBCPP_HIDE_FROM_ABI void max_load_factor(float __mlf) _NOEXCEPT { -    _LIBCPP_ASSERT_UNCATEGORIZED(__mlf > 0, "unordered container::max_load_factor(lf) called with lf <= 0"); +    // While passing a non-positive load factor is undefined behavior, in practice the result will be benign (the +    // call will be equivalent to `max_load_factor(load_factor())`, which is also the case for passing a valid value +    // less than the current `load_factor`). +    _LIBCPP_ASSERT_PEDANTIC(__mlf > 0, "unordered container::max_load_factor(lf) called with lf <= 0");      max_load_factor() = std::max(__mlf, load_factor());    } diff --git a/contrib/llvm-project/libcxx/include/__iterator/advance.h b/contrib/llvm-project/libcxx/include/__iterator/advance.h index 64c8d249f78f..73473f899eac 100644 --- a/contrib/llvm-project/libcxx/include/__iterator/advance.h +++ b/contrib/llvm-project/libcxx/include/__iterator/advance.h @@ -65,8 +65,9 @@ template < class _InputIter,  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 void advance(_InputIter& __i, _Distance __orig_n) {    typedef typename iterator_traits<_InputIter>::difference_type _Difference;    _Difference __n = static_cast<_Difference>(std::__convert_to_integral(__orig_n)); -  _LIBCPP_ASSERT_UNCATEGORIZED(__n >= 0 || __has_bidirectional_iterator_category<_InputIter>::value, -                               "Attempt to advance(it, n) with negative n on a non-bidirectional iterator"); +  // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation. +  _LIBCPP_ASSERT_PEDANTIC(__n >= 0 || __has_bidirectional_iterator_category<_InputIter>::value, +                          "Attempt to advance(it, n) with negative n on a non-bidirectional iterator");    std::__advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category());  } @@ -99,7 +100,8 @@ public:    // Preconditions: If `I` does not model `bidirectional_iterator`, `n` is not negative.    template <input_or_output_iterator _Ip>    _LIBCPP_HIDE_FROM_ABI constexpr void operator()(_Ip& __i, iter_difference_t<_Ip> __n) const { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation. +    _LIBCPP_ASSERT_PEDANTIC(          __n >= 0 || bidirectional_iterator<_Ip>, "If `n < 0`, then `bidirectional_iterator<I>` must be true.");      // If `I` models `random_access_iterator`, equivalent to `i += n`. @@ -149,8 +151,9 @@ public:    template <input_or_output_iterator _Ip, sentinel_for<_Ip> _Sp>    _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip>    operator()(_Ip& __i, iter_difference_t<_Ip> __n, _Sp __bound_sentinel) const { -    _LIBCPP_ASSERT_UNCATEGORIZED((__n >= 0) || (bidirectional_iterator<_Ip> && same_as<_Ip, _Sp>), -                                 "If `n < 0`, then `bidirectional_iterator<I> && same_as<I, S>` must be true."); +    // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation. +    _LIBCPP_ASSERT_PEDANTIC((__n >= 0) || (bidirectional_iterator<_Ip> && same_as<_Ip, _Sp>), +                            "If `n < 0`, then `bidirectional_iterator<I> && same_as<I, S>` must be true.");      // If `S` and `I` model `sized_sentinel_for<S, I>`:      if constexpr (sized_sentinel_for<_Sp, _Ip>) {        // If |n| >= |bound_sentinel - i|, equivalent to `ranges::advance(i, bound_sentinel)`. diff --git a/contrib/llvm-project/libcxx/include/__iterator/next.h b/contrib/llvm-project/libcxx/include/__iterator/next.h index da60aacfd08d..21d3688ad9eb 100644 --- a/contrib/llvm-project/libcxx/include/__iterator/next.h +++ b/contrib/llvm-project/libcxx/include/__iterator/next.h @@ -27,8 +27,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD  template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> = 0>  inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _InputIter  next(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__n >= 0 || __has_bidirectional_iterator_category<_InputIter>::value, -                               "Attempt to next(it, n) with negative n on a non-bidirectional iterator"); +  // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation. +  // Note that this check duplicates the similar check in `std::advance`. +  _LIBCPP_ASSERT_PEDANTIC(__n >= 0 || __has_bidirectional_iterator_category<_InputIter>::value, +                          "Attempt to next(it, n) with negative n on a non-bidirectional iterator");    std::advance(__x, __n);    return __x; diff --git a/contrib/llvm-project/libcxx/include/__iterator/prev.h b/contrib/llvm-project/libcxx/include/__iterator/prev.h index 1651942acea9..2f0e6a088edb 100644 --- a/contrib/llvm-project/libcxx/include/__iterator/prev.h +++ b/contrib/llvm-project/libcxx/include/__iterator/prev.h @@ -27,8 +27,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD  template <class _InputIter, __enable_if_t<__has_input_iterator_category<_InputIter>::value, int> = 0>  inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _InputIter  prev(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__n <= 0 || __has_bidirectional_iterator_category<_InputIter>::value, -                               "Attempt to prev(it, n) with a positive n on a non-bidirectional iterator"); +  // Calling `advance` with a negative value on a non-bidirectional iterator is a no-op in the current implementation. +  // Note that this check duplicates the similar check in `std::advance`. +  _LIBCPP_ASSERT_PEDANTIC(__n <= 0 || __has_bidirectional_iterator_category<_InputIter>::value, +                          "Attempt to prev(it, n) with a positive n on a non-bidirectional iterator");    std::advance(__x, -__n);    return __x;  } diff --git a/contrib/llvm-project/libcxx/include/__random/negative_binomial_distribution.h b/contrib/llvm-project/libcxx/include/__random/negative_binomial_distribution.h index 580c74d46440..eed4f511e871 100644 --- a/contrib/llvm-project/libcxx/include/__random/negative_binomial_distribution.h +++ b/contrib/llvm-project/libcxx/include/__random/negative_binomial_distribution.h @@ -113,10 +113,9 @@ _IntType negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, con        else          ++__f;      } -    _LIBCPP_ASSERT_UNCATEGORIZED( -        __f >= 0, -        "std::negative_binomial_distribution should never produce negative values. " -        "This is almost certainly a signed integer overflow issue on __f."); +    _LIBCPP_ASSERT_INTERNAL(__f >= 0, +                            "std::negative_binomial_distribution should never produce negative values. " +                            "This is almost certainly a signed integer overflow issue on __f.");      return __f;    }    return poisson_distribution<result_type>(gamma_distribution<double>(__k, (1 - __p) / __p)(__urng))(__urng); diff --git a/contrib/llvm-project/libcxx/include/__ranges/chunk_by_view.h b/contrib/llvm-project/libcxx/include/__ranges/chunk_by_view.h index 3ecc018cac9d..c5b3240a7d0b 100644 --- a/contrib/llvm-project/libcxx/include/__ranges/chunk_by_view.h +++ b/contrib/llvm-project/libcxx/include/__ranges/chunk_by_view.h @@ -66,7 +66,8 @@ class _LIBCPP_ABI_2023_OVERLAPPING_SUBOBJECT_FIX_TAG chunk_by_view    class __iterator;    _LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_View> __find_next(iterator_t<_View> __current) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    // Note: this duplicates a check in `optional` but provides a better error message. +    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(          __pred_.__has_value(), "Trying to call __find_next() on a chunk_by_view that does not have a valid predicate.");      auto __reversed_pred = [this]<class _Tp, class _Up>(_Tp&& __x, _Up&& __y) -> bool {        return !std::invoke(*__pred_, std::forward<_Tp>(__x), std::forward<_Up>(__y)); @@ -78,9 +79,10 @@ class _LIBCPP_ABI_2023_OVERLAPPING_SUBOBJECT_FIX_TAG chunk_by_view    _LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_View> __find_prev(iterator_t<_View> __current)      requires bidirectional_range<_View>    { -    _LIBCPP_ASSERT_UNCATEGORIZED( -        __current != ranges::begin(__base_), "Trying to call __find_prev() on a begin iterator."); -    _LIBCPP_ASSERT_UNCATEGORIZED( +    // Attempting to decrement a begin iterator is a no-op (`__find_prev` would return the same argument given to it). +    _LIBCPP_ASSERT_PEDANTIC(__current != ranges::begin(__base_), "Trying to call __find_prev() on a begin iterator."); +    // Note: this duplicates a check in `optional` but provides a better error message. +    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(          __pred_.__has_value(), "Trying to call __find_prev() on a chunk_by_view that does not have a valid predicate.");      auto __first = ranges::begin(__base_); @@ -110,7 +112,8 @@ public:    _LIBCPP_HIDE_FROM_ABI constexpr const _Pred& pred() const { return *__pred_; }    _LIBCPP_HIDE_FROM_ABI constexpr __iterator begin() { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    // Note: this duplicates a check in `optional` but provides a better error message. +    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(          __pred_.__has_value(), "Trying to call begin() on a chunk_by_view that does not have a valid predicate.");      auto __first = ranges::begin(__base_); @@ -154,12 +157,15 @@ public:    _LIBCPP_HIDE_FROM_ABI __iterator() = default;    _LIBCPP_HIDE_FROM_ABI constexpr value_type operator*() const { -    _LIBCPP_ASSERT_UNCATEGORIZED(__current_ != __next_, "Trying to dereference past-the-end chunk_by_view iterator."); +    // If the iterator is at end, this would return an empty range which can be checked by the calling code and doesn't +    // necessarily lead to a bad access. +    _LIBCPP_ASSERT_PEDANTIC(__current_ != __next_, "Trying to dereference past-the-end chunk_by_view iterator.");      return {__current_, __next_};    }    _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() { -    _LIBCPP_ASSERT_UNCATEGORIZED(__current_ != __next_, "Trying to increment past end chunk_by_view iterator."); +    // Attempting to increment an end iterator is a no-op (`__find_next` would return the same argument given to it). +    _LIBCPP_ASSERT_PEDANTIC(__current_ != __next_, "Trying to increment past end chunk_by_view iterator.");      __current_ = __next_;      __next_    = __parent_->__find_next(__current_);      return *this; diff --git a/contrib/llvm-project/libcxx/include/__ranges/drop_while_view.h b/contrib/llvm-project/libcxx/include/__ranges/drop_while_view.h index eb3783eb42f1..b367f735c141 100644 --- a/contrib/llvm-project/libcxx/include/__ranges/drop_while_view.h +++ b/contrib/llvm-project/libcxx/include/__ranges/drop_while_view.h @@ -66,7 +66,8 @@ public:    _LIBCPP_HIDE_FROM_ABI constexpr const _Pred& pred() const { return *__pred_; }    _LIBCPP_HIDE_FROM_ABI constexpr auto begin() { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    // Note: this duplicates a check in `optional` but provides a better error message. +    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(          __pred_.__has_value(),          "drop_while_view needs to have a non-empty predicate before calling begin() -- did a previous "          "assignment to this drop_while_view fail?"); diff --git a/contrib/llvm-project/libcxx/include/__ranges/filter_view.h b/contrib/llvm-project/libcxx/include/__ranges/filter_view.h index 868ad128e894..ecb78eee3810 100644 --- a/contrib/llvm-project/libcxx/include/__ranges/filter_view.h +++ b/contrib/llvm-project/libcxx/include/__ranges/filter_view.h @@ -83,7 +83,8 @@ public:    _LIBCPP_HIDE_FROM_ABI constexpr _Pred const& pred() const { return *__pred_; }    _LIBCPP_HIDE_FROM_ABI constexpr __iterator begin() { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    // Note: this duplicates a check in `optional` but provides a better error message. +    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(          __pred_.__has_value(), "Trying to call begin() on a filter_view that does not have a valid predicate.");      if constexpr (_UseCache) {        if (!__cached_begin_.__has_value()) { diff --git a/contrib/llvm-project/libcxx/include/__thread/thread.h b/contrib/llvm-project/libcxx/include/__thread/thread.h index f3300752ac9e..463bbd677255 100644 --- a/contrib/llvm-project/libcxx/include/__thread/thread.h +++ b/contrib/llvm-project/libcxx/include/__thread/thread.h @@ -104,7 +104,7 @@ __thread_specific_ptr<_Tp>::~__thread_specific_ptr() {  template <class _Tp>  void __thread_specific_ptr<_Tp>::set_pointer(pointer __p) { -  _LIBCPP_ASSERT_UNCATEGORIZED(get() == nullptr, "Attempting to overwrite thread local data"); +  _LIBCPP_ASSERT_INTERNAL(get() == nullptr, "Attempting to overwrite thread local data");    std::__libcpp_tls_set(__key_, __p);  } diff --git a/contrib/llvm-project/libcxx/include/__utility/exception_guard.h b/contrib/llvm-project/libcxx/include/__utility/exception_guard.h index 389fca6c7101..8d90dfd5f190 100644 --- a/contrib/llvm-project/libcxx/include/__utility/exception_guard.h +++ b/contrib/llvm-project/libcxx/include/__utility/exception_guard.h @@ -115,7 +115,7 @@ struct __exception_guard_noexceptions {    }    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_NODEBUG ~__exception_guard_noexceptions() { -    _LIBCPP_ASSERT_UNCATEGORIZED(__completed_, "__exception_guard not completed with exceptions disabled"); +    _LIBCPP_ASSERT_INTERNAL(__completed_, "__exception_guard not completed with exceptions disabled");    }  private: diff --git a/contrib/llvm-project/libcxx/include/__utility/unreachable.h b/contrib/llvm-project/libcxx/include/__utility/unreachable.h index 49334decc8f6..d833f74c2e4f 100644 --- a/contrib/llvm-project/libcxx/include/__utility/unreachable.h +++ b/contrib/llvm-project/libcxx/include/__utility/unreachable.h @@ -19,7 +19,7 @@  _LIBCPP_BEGIN_NAMESPACE_STD  _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI inline void __libcpp_unreachable() { -  _LIBCPP_ASSERT_UNCATEGORIZED(false, "std::unreachable() was reached"); +  _LIBCPP_ASSERT_INTERNAL(false, "std::unreachable() was reached");    __builtin_unreachable();  } diff --git a/contrib/llvm-project/libcxx/include/fstream b/contrib/llvm-project/libcxx/include/fstream index 7a4e15b55d56..203cc6dfb4b1 100644 --- a/contrib/llvm-project/libcxx/include/fstream +++ b/contrib/llvm-project/libcxx/include/fstream @@ -73,6 +73,7 @@ public:      typedef typename traits_type::int_type int_type;      typedef typename traits_type::pos_type pos_type;      typedef typename traits_type::off_type off_type; +    using native_handle_type = typename basic_filebuf<charT, traits>::native_handle_type; // Since C++26      basic_ifstream();      explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in); @@ -85,6 +86,7 @@ public:      void swap(basic_ifstream& rhs);      basic_filebuf<char_type, traits_type>* rdbuf() const; +    native_handle_type native_handle() const noexcept; // Since C++26      bool is_open() const;      void open(const char* s, ios_base::openmode mode = ios_base::in);      void open(const string& s, ios_base::openmode mode = ios_base::in); @@ -110,6 +112,7 @@ public:      typedef typename traits_type::int_type int_type;      typedef typename traits_type::pos_type pos_type;      typedef typename traits_type::off_type off_type; +    using native_handle_type = typename basic_filebuf<charT, traits>::native_handle_type; // Since C++26      basic_ofstream();      explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); @@ -122,6 +125,8 @@ public:      void swap(basic_ofstream& rhs);      basic_filebuf<char_type, traits_type>* rdbuf() const; +    native_handle_type native_handle() const noexcept; // Since C++26 +      bool is_open() const;      void open(const char* s, ios_base::openmode mode = ios_base::out);      void open(const string& s, ios_base::openmode mode = ios_base::out); @@ -148,6 +153,7 @@ public:      typedef typename traits_type::int_type int_type;      typedef typename traits_type::pos_type pos_type;      typedef typename traits_type::off_type off_type; +    using native_handle_type = typename basic_filebuf<charT, traits>::native_handle_type; // Since C++26      basic_fstream();      explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); @@ -160,6 +166,7 @@ public:      void swap(basic_fstream& rhs);      basic_filebuf<char_type, traits_type>* rdbuf() const; +    native_handle_type native_handle() const noexcept; // Since C++26      bool is_open() const;      void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);      void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); @@ -210,6 +217,10 @@ _LIBCPP_PUSH_MACROS  _LIBCPP_BEGIN_NAMESPACE_STD +#  if _LIBCPP_STD_VER >= 26 && defined(_LIBCPP_WIN32API) +_LIBCPP_EXPORTED_FROM_ABI void* __filebuf_windows_native_handle(FILE* __file) noexcept; +#  endif +  template <class _CharT, class _Traits>  class _LIBCPP_TEMPLATE_VIS basic_filebuf : public basic_streambuf<_CharT, _Traits> {  public: @@ -219,6 +230,15 @@ public:    typedef typename traits_type::pos_type pos_type;    typedef typename traits_type::off_type off_type;    typedef typename traits_type::state_type state_type; +#  if _LIBCPP_STD_VER >= 26 +#    if defined(_LIBCPP_WIN32API) +  using native_handle_type = void*; // HANDLE +#    elif __has_include(<unistd.h>) +  using native_handle_type = int; // POSIX file descriptor +#    else +#      error "Provide a native file handle!" +#    endif +#  endif    // 27.9.1.2 Constructors/destructor:    basic_filebuf(); @@ -245,6 +265,18 @@ public:  #  endif    _LIBCPP_HIDE_FROM_ABI basic_filebuf* __open(int __fd, ios_base::openmode __mode);    basic_filebuf* close(); +#  if _LIBCPP_STD_VER >= 26 +  _LIBCPP_HIDE_FROM_ABI native_handle_type native_handle() const noexcept { +    _LIBCPP_ASSERT_UNCATEGORIZED(this->is_open(), "File must be opened"); +#    if defined(_LIBCPP_WIN32API) +    return std::__filebuf_windows_native_handle(__file_); +#    elif __has_include(<unistd.h>) +    return fileno(__file_); +#    else +#      error "Provide a way to determine the file native handle!" +#    endif +  } +#  endif //  _LIBCPP_STD_VER >= 26    _LIBCPP_HIDE_FROM_ABI inline static const char* __make_mdstring(ios_base::openmode __mode) _NOEXCEPT; @@ -1024,6 +1056,9 @@ public:    typedef typename traits_type::int_type int_type;    typedef typename traits_type::pos_type pos_type;    typedef typename traits_type::off_type off_type; +#  if _LIBCPP_STD_VER >= 26 +  using native_handle_type = typename basic_filebuf<_CharT, _Traits>::native_handle_type; +#  endif    _LIBCPP_HIDE_FROM_ABI basic_ifstream();    _LIBCPP_HIDE_FROM_ABI explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in); @@ -1041,6 +1076,9 @@ public:    _LIBCPP_HIDE_FROM_ABI void swap(basic_ifstream& __rhs);    _LIBCPP_HIDE_FROM_ABI basic_filebuf<char_type, traits_type>* rdbuf() const; +#  if _LIBCPP_STD_VER >= 26 +  _LIBCPP_HIDE_FROM_ABI native_handle_type native_handle() const noexcept { return rdbuf()->native_handle(); } +#  endif    _LIBCPP_HIDE_FROM_ABI bool is_open() const;    void open(const char* __s, ios_base::openmode __mode = ios_base::in);  #  ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR @@ -1171,6 +1209,9 @@ public:    typedef typename traits_type::int_type int_type;    typedef typename traits_type::pos_type pos_type;    typedef typename traits_type::off_type off_type; +#  if _LIBCPP_STD_VER >= 26 +  using native_handle_type = typename basic_filebuf<_CharT, _Traits>::native_handle_type; +#  endif    _LIBCPP_HIDE_FROM_ABI basic_ofstream();    _LIBCPP_HIDE_FROM_ABI explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out); @@ -1190,6 +1231,9 @@ public:    _LIBCPP_HIDE_FROM_ABI void swap(basic_ofstream& __rhs);    _LIBCPP_HIDE_FROM_ABI basic_filebuf<char_type, traits_type>* rdbuf() const; +#  if _LIBCPP_STD_VER >= 26 +  _LIBCPP_HIDE_FROM_ABI native_handle_type native_handle() const noexcept { return rdbuf()->native_handle(); } +#  endif    _LIBCPP_HIDE_FROM_ABI bool is_open() const;    void open(const char* __s, ios_base::openmode __mode = ios_base::out);  #  ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR @@ -1321,6 +1365,9 @@ public:    typedef typename traits_type::int_type int_type;    typedef typename traits_type::pos_type pos_type;    typedef typename traits_type::off_type off_type; +#  if _LIBCPP_STD_VER >= 26 +  using native_handle_type = typename basic_filebuf<_CharT, _Traits>::native_handle_type; +#  endif    _LIBCPP_HIDE_FROM_ABI basic_fstream();    _LIBCPP_HIDE_FROM_ABI explicit basic_fstream(const char* __s, @@ -1345,6 +1392,9 @@ public:    _LIBCPP_HIDE_FROM_ABI void swap(basic_fstream& __rhs);    _LIBCPP_HIDE_FROM_ABI basic_filebuf<char_type, traits_type>* rdbuf() const; +#  if _LIBCPP_STD_VER >= 26 +  _LIBCPP_HIDE_FROM_ABI native_handle_type native_handle() const noexcept { return rdbuf()->native_handle(); } +#  endif    _LIBCPP_HIDE_FROM_ABI bool is_open() const;    _LIBCPP_HIDE_FROM_ABI void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);  #  ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR diff --git a/contrib/llvm-project/libcxx/include/print b/contrib/llvm-project/libcxx/include/print index 0f8e73f8eb5c..5e00fc87f47e 100644 --- a/contrib/llvm-project/libcxx/include/print +++ b/contrib/llvm-project/libcxx/include/print @@ -122,6 +122,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr void __encode(_OutIt&, char32_t) = delete;  template <class _OutIt>    requires __utf16_code_unit<iter_value_t<_OutIt>>  _LIBCPP_HIDE_FROM_ABI constexpr void __encode(_OutIt& __out_it, char32_t __value) { +  // [print.fun]/7 : "if `out` contains invalid code units, the behavior is undefined and implementations are encouraged +  // to diagnose it".    _LIBCPP_ASSERT_UNCATEGORIZED(__is_scalar_value(__value), "an invalid unicode scalar value results in invalid UTF-16");    if (__value < 0x10000) { @@ -137,6 +139,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr void __encode(_OutIt& __out_it, char32_t __value  template <class _OutIt>    requires __utf32_code_unit<iter_value_t<_OutIt>>  _LIBCPP_HIDE_FROM_ABI constexpr void __encode(_OutIt& __out_it, char32_t __value) { +  // [print.fun]/7 : "if `out` contains invalid code units, the behavior is undefined and implementations are encouraged +  // to diagnose it".    _LIBCPP_ASSERT_UNCATEGORIZED(__is_scalar_value(__value), "an invalid unicode scalar value results in invalid UTF-32");    *__out_it++ = __value;  } @@ -214,7 +218,7 @@ _LIBCPP_HIDE_FROM_ABI inline bool __is_terminal(FILE* __stream) {  template <class = void> // TODO PRINT template or availability markup fires too eagerly (http://llvm.org/PR61563).  _LIBCPP_HIDE_FROM_ABI inline void  __vprint_nonunicode(FILE* __stream, string_view __fmt, format_args __args, bool __write_nl) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__stream, "__stream is a valid pointer to an output C stream"); +  _LIBCPP_ASSERT_NON_NULL(__stream, "__stream must be a valid pointer to an output C stream");    string __str = std::vformat(__fmt, __args);    if (__write_nl)      __str.push_back('\n'); @@ -290,7 +294,7 @@ __vprint_unicode([[maybe_unused]] FILE* __stream,                   [[maybe_unused]] string_view __fmt,                   [[maybe_unused]] format_args __args,                   [[maybe_unused]] bool __write_nl) { -  _LIBCPP_ASSERT_UNCATEGORIZED(__stream, "__stream is a valid pointer to an output C stream"); +  _LIBCPP_ASSERT_NON_NULL(__stream, "__stream must be a valid pointer to an output C stream");    // [print.fun]    //   7 - Effects: If stream refers to a terminal capable of displaying diff --git a/contrib/llvm-project/libcxx/include/regex b/contrib/llvm-project/libcxx/include/regex index 061194cb2eba..b575a267583b 100644 --- a/contrib/llvm-project/libcxx/include/regex +++ b/contrib/llvm-project/libcxx/include/regex @@ -4587,28 +4587,36 @@ public:    // element access:    _LIBCPP_HIDE_FROM_ABI difference_type length(size_type __sub = 0) const { -    _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::length() called when not ready"); +    // If the match results are not ready, this will return `0`. +    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::length() called when not ready");      return (*this)[__sub].length();    }    _LIBCPP_HIDE_FROM_ABI difference_type position(size_type __sub = 0) const { -    _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::position() called when not ready"); +    // If the match results are not ready, this will return the result of subtracting two default-constructed iterators +    // (which is typically a well-defined operation). +    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::position() called when not ready");      return std::distance(__position_start_, (*this)[__sub].first);    }    _LIBCPP_HIDE_FROM_ABI string_type str(size_type __sub = 0) const { -    _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::str() called when not ready"); +    // If the match results are not ready, this will return an empty string. +    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::str() called when not ready");      return (*this)[__sub].str();    }    _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __n) const { -    _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::operator[]() called when not ready"); +    // If the match results are not ready, this call will be equivalent to calling this function with `__n >= size()`, +    // returning an empty subrange. +    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::operator[]() called when not ready");      return __n < __matches_.size() ? __matches_[__n] : __unmatched_;    }    _LIBCPP_HIDE_FROM_ABI const_reference prefix() const { -    _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::prefix() called when not ready"); +    // If the match results are not ready, this will return a default-constructed empty `__suffix_`. +    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::prefix() called when not ready");      return __prefix_;    }    _LIBCPP_HIDE_FROM_ABI const_reference suffix() const { -    _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::suffix() called when not ready"); +    // If the match results are not ready, this will return a default-constructed empty `__suffix_`. +    _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::suffix() called when not ready");      return __suffix_;    } @@ -4722,7 +4730,8 @@ _OutputIter match_results<_BidirectionalIterator, _Allocator>::format(      const char_type* __fmt_first,      const char_type* __fmt_last,      regex_constants::match_flag_type __flags) const { -  _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::format() called when not ready"); +  // Note: this duplicates a check in `vector::operator[]` but provides a better error message. +  _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(ready(), "match_results::format() called when not ready");    if (__flags & regex_constants::format_sed) {      for (; __fmt_first != __fmt_last; ++__fmt_first) {        if (*__fmt_first == '&') diff --git a/contrib/llvm-project/libcxx/include/set b/contrib/llvm-project/libcxx/include/set index 08677a94054f..55ba8f8208be 100644 --- a/contrib/llvm-project/libcxx/include/set +++ b/contrib/llvm-project/libcxx/include/set @@ -769,13 +769,13 @@ public:  #if _LIBCPP_STD_VER >= 17    _LIBCPP_HIDE_FROM_ABI insert_return_type insert(node_type&& __nh) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__nh.empty() || __nh.get_allocator() == get_allocator(), -                                 "node_type with incompatible allocator passed to set::insert()"); +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(__nh.empty() || __nh.get_allocator() == get_allocator(), +                                        "node_type with incompatible allocator passed to set::insert()");      return __tree_.template __node_handle_insert_unique< node_type, insert_return_type>(std::move(__nh));    }    _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __hint, node_type&& __nh) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__nh.empty() || __nh.get_allocator() == get_allocator(), -                                 "node_type with incompatible allocator passed to set::insert()"); +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(__nh.empty() || __nh.get_allocator() == get_allocator(), +                                        "node_type with incompatible allocator passed to set::insert()");      return __tree_.template __node_handle_insert_unique<node_type>(__hint, std::move(__nh));    }    _LIBCPP_HIDE_FROM_ABI node_type extract(key_type const& __key) { @@ -786,25 +786,25 @@ public:    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(set<key_type, _Compare2, allocator_type>& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_unique(__source.__tree_);    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(set<key_type, _Compare2, allocator_type>&& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_unique(__source.__tree_);    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(multiset<key_type, _Compare2, allocator_type>& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_unique(__source.__tree_);    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(multiset<key_type, _Compare2, allocator_type>&& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_unique(__source.__tree_);    } @@ -1227,13 +1227,13 @@ public:  #if _LIBCPP_STD_VER >= 17    _LIBCPP_HIDE_FROM_ABI iterator insert(node_type&& __nh) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__nh.empty() || __nh.get_allocator() == get_allocator(), -                                 "node_type with incompatible allocator passed to multiset::insert()"); +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(__nh.empty() || __nh.get_allocator() == get_allocator(), +                                        "node_type with incompatible allocator passed to multiset::insert()");      return __tree_.template __node_handle_insert_multi<node_type>(std::move(__nh));    }    _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __hint, node_type&& __nh) { -    _LIBCPP_ASSERT_UNCATEGORIZED(__nh.empty() || __nh.get_allocator() == get_allocator(), -                                 "node_type with incompatible allocator passed to multiset::insert()"); +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(__nh.empty() || __nh.get_allocator() == get_allocator(), +                                        "node_type with incompatible allocator passed to multiset::insert()");      return __tree_.template __node_handle_insert_multi<node_type>(__hint, std::move(__nh));    }    _LIBCPP_HIDE_FROM_ABI node_type extract(key_type const& __key) { @@ -1244,25 +1244,25 @@ public:    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(multiset<key_type, _Compare2, allocator_type>& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_multi(__source.__tree_);    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(multiset<key_type, _Compare2, allocator_type>&& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_multi(__source.__tree_);    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(set<key_type, _Compare2, allocator_type>& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_multi(__source.__tree_);    }    template <class _Compare2>    _LIBCPP_HIDE_FROM_ABI void merge(set<key_type, _Compare2, allocator_type>&& __source) { -    _LIBCPP_ASSERT_UNCATEGORIZED( +    _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(          __source.get_allocator() == get_allocator(), "merging container with incompatible allocator");      __tree_.__node_handle_merge_multi(__source.__tree_);    } diff --git a/contrib/llvm-project/libcxx/include/span b/contrib/llvm-project/libcxx/include/span index 7dd53110ac29..007a32597f96 100644 --- a/contrib/llvm-project/libcxx/include/span +++ b/contrib/llvm-project/libcxx/include/span @@ -92,6 +92,7 @@ public:      // [span.elem], span element access      constexpr reference operator[](size_type idx) const; +    constexpr reference at(size_type idx) const; // since C++26      constexpr reference front() const;      constexpr reference back() const;      constexpr pointer data() const noexcept; @@ -146,6 +147,7 @@ template<class R>  #include <__utility/forward.h>  #include <array>   // for array  #include <cstddef> // for byte +#include <stdexcept>  #include <version>  // standard-mandated includes @@ -321,6 +323,14 @@ public:      return __data_[__idx];    } +#  if _LIBCPP_STD_VER >= 26 +  _LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __index) const { +    if (__index >= size()) +      std::__throw_out_of_range("span"); +    return __data_[__index]; +  } +#  endif +    _LIBCPP_HIDE_FROM_ABI constexpr reference front() const noexcept {      _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span<T, N>::front() on empty span");      return __data_[0]; @@ -469,6 +479,14 @@ public:      return __data_[__idx];    } +#  if _LIBCPP_STD_VER >= 26 +  _LIBCPP_HIDE_FROM_ABI constexpr reference at(size_type __index) const { +    if (__index >= size()) +      std::__throw_out_of_range("span"); +    return __data_[__index]; +  } +#  endif +    _LIBCPP_HIDE_FROM_ABI constexpr reference front() const noexcept {      _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "span<T>::front() on empty span");      return __data_[0]; diff --git a/contrib/llvm-project/libcxx/include/sstream b/contrib/llvm-project/libcxx/include/sstream index bd5cea9a5e94..9f75b7e0ac9e 100644 --- a/contrib/llvm-project/libcxx/include/sstream +++ b/contrib/llvm-project/libcxx/include/sstream @@ -398,9 +398,9 @@ public:      typename string_type::size_type __pos           = __view.empty() ? 0 : __view.data() - __str_.data();      // In C++23, this is just string_type(std::move(__str_), __pos, __view.size(), __str_.get_allocator());      // But we need something that works in C++20 also. -    string_type __result(__str_.get_allocator()); -    __result.__move_assign(std::move(__str_), __pos, __view.size()); -    __str_.clear(); +    string_type __result(std::move(__str_), __str_.get_allocator()); +    __result.resize(__pos + __view.size()); +    __result.erase(0, __pos);      __init_buf_ptrs();      return __result;    } diff --git a/contrib/llvm-project/libcxx/include/tuple b/contrib/llvm-project/libcxx/include/tuple index 8c954fc72c37..aa22c320b1ec 100644 --- a/contrib/llvm-project/libcxx/include/tuple +++ b/contrib/llvm-project/libcxx/include/tuple @@ -1416,25 +1416,27 @@ inline constexpr size_t tuple_size_v = tuple_size<_Tp>::value;  #    define _LIBCPP_NOEXCEPT_RETURN(...)                                                                               \        noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } +// The _LIBCPP_NOEXCEPT_RETURN macro breaks formatting. +// clang-format off  template <class _Fn, class _Tuple, size_t... _Id>  inline _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto)  __apply_tuple_impl(_Fn&& __f, _Tuple&& __t, __tuple_indices<_Id...>)      _LIBCPP_NOEXCEPT_RETURN(std::__invoke(std::forward<_Fn>(__f), std::get<_Id>(std::forward<_Tuple>(__t))...)) -        template <class _Fn, class _Tuple> -        inline _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) apply(_Fn&& __f, _Tuple&& __t) _LIBCPP_NOEXCEPT_RETURN( -            std::__apply_tuple_impl(std::forward<_Fn>(__f), -                                    std::forward<_Tuple>(__t), -                                    typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{})) +template <class _Fn, class _Tuple> +inline _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) apply(_Fn&& __f, _Tuple&& __t) +    _LIBCPP_NOEXCEPT_RETURN(std::__apply_tuple_impl( +        std::forward<_Fn>(__f), +        std::forward<_Tuple>(__t), +        typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{})) -            template <class _Tp, class _Tuple, size_t... _Idx> -            inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp -    __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) -        _LIBCPP_NOEXCEPT_RETURN(_Tp(std::get<_Idx>(std::forward<_Tuple>(__t))...)) +template <class _Tp, class _Tuple, size_t... _Idx> +inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) +    _LIBCPP_NOEXCEPT_RETURN(_Tp(std::get<_Idx>(std::forward<_Tuple>(__t))...)) -            template <class _Tp, class _Tuple> -            inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp -    make_from_tuple(_Tuple&& __t) _LIBCPP_NOEXCEPT_RETURN(std::__make_from_tuple_impl<_Tp>( +template <class _Tp, class _Tuple> +inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp make_from_tuple(_Tuple&& __t) +    _LIBCPP_NOEXCEPT_RETURN(std::__make_from_tuple_impl<_Tp>(          std::forward<_Tuple>(__t), typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}))  #    undef _LIBCPP_NOEXCEPT_RETURN @@ -1443,9 +1445,11 @@ __apply_tuple_impl(_Fn&& __f, _Tuple&& __t, __tuple_indices<_Id...>)  #endif // !defined(_LIBCPP_CXX03_LANG) -        _LIBCPP_END_NAMESPACE_STD +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS -    _LIBCPP_POP_MACROS +// clang-format on  #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20  #  include <exception> diff --git a/contrib/llvm-project/libcxx/include/version b/contrib/llvm-project/libcxx/include/version index 768710ef5c84..c96647894dce 100644 --- a/contrib/llvm-project/libcxx/include/version +++ b/contrib/llvm-project/libcxx/include/version @@ -201,6 +201,7 @@ __cpp_lib_smart_ptr_for_overwrite                       202002L <memory>  __cpp_lib_smart_ptr_owner_equality                      202306L <memory>  __cpp_lib_source_location                               201907L <source_location>  __cpp_lib_span                                          202002L <span> +__cpp_lib_span_at                                       202311L <span>  __cpp_lib_span_initializer_list                         202311L <span>  __cpp_lib_spanstream                                    202106L <spanstream>  __cpp_lib_ssize                                         201902L <iterator> @@ -495,7 +496,7 @@ __cpp_lib_within_lifetime                               202306L <type_traits>  // # define __cpp_lib_freestanding_optional                202311L  // # define __cpp_lib_freestanding_string_view             202311L  // # define __cpp_lib_freestanding_variant                 202311L -// # define __cpp_lib_fstream_native_handle                202306L +# define __cpp_lib_fstream_native_handle                202306L  // # define __cpp_lib_function_ref                         202306L  // # define __cpp_lib_hazard_pointer                       202306L  // # define __cpp_lib_linalg                               202311L @@ -505,6 +506,7 @@ __cpp_lib_within_lifetime                               202306L <type_traits>  // # define __cpp_lib_rcu                                  202306L  // # define __cpp_lib_saturation_arithmetic                202311L  // # define __cpp_lib_smart_ptr_owner_equality             202306L +# define __cpp_lib_span_at                              202311L  // # define __cpp_lib_span_initializer_list                202311L  // # define __cpp_lib_sstream_from_string_view             202306L  // # define __cpp_lib_submdspan                            202306L | 
