Date: Sat, 16 Jan 2016 17:20:41 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r294164 - in vendor/libc++/dist: include test/libcxx/iterators test/libcxx/strings test/std/strings/basic.string/string.modifiers/string_append test/std/strings/basic.string/string.modi... Message-ID: <201601161720.u0GHKfMS039745@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dim Date: Sat Jan 16 17:20:41 2016 New Revision: 294164 URL: https://svnweb.freebsd.org/changeset/base/294164 Log: Vendor import of libc++ release_38 branch r257836: https://llvm.org/svn/llvm-project/libcxx/branches/release_38@257836 Added: vendor/libc++/dist/test/libcxx/iterators/ vendor/libc++/dist/test/libcxx/iterators/trivial_iterators.pass.cpp (contents, props changed) vendor/libc++/dist/test/libcxx/strings/ vendor/libc++/dist/test/libcxx/strings/iterators.exceptions.pass.cpp (contents, props changed) vendor/libc++/dist/test/libcxx/strings/iterators.noexcept.pass.cpp (contents, props changed) Modified: vendor/libc++/dist/include/algorithm vendor/libc++/dist/include/iterator vendor/libc++/dist/include/string vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/push_back.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/size_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/initializer_list.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/rv_string.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/size_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string_size_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_initializer_list.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_size_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/size_pointer.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/size_pointer_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/size_size_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/size_string.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/size_string_size_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_initializer_list.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_pointer.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_pointer_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_size_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_string.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/size_size_pointer.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/size_size_pointer_size.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/size_size_size_char.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/size_size_string.pass.cpp vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_replace/size_size_string_size_size.pass.cpp vendor/libc++/dist/test/support/test_iterators.h Modified: vendor/libc++/dist/include/algorithm ============================================================================== --- vendor/libc++/dist/include/algorithm Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/include/algorithm Sat Jan 16 17:20:41 2016 (r294164) @@ -1687,25 +1687,6 @@ search_n(_ForwardIterator __first, _Forw } // copy - -template <class _Iter> -struct __libcpp_is_trivial_iterator -{ - static const bool value = is_pointer<_Iter>::value; -}; - -template <class _Iter> -struct __libcpp_is_trivial_iterator<move_iterator<_Iter> > -{ - static const bool value = is_pointer<_Iter>::value; -}; - -template <class _Iter> -struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > -{ - static const bool value = is_pointer<_Iter>::value; -}; - template <class _Iter> inline _LIBCPP_INLINE_VISIBILITY _Iter Modified: vendor/libc++/dist/include/iterator ============================================================================== --- vendor/libc++/dist/include/iterator Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/include/iterator Sat Jan 16 17:20:41 2016 (r294164) @@ -437,6 +437,12 @@ struct __is_bidirectional_iterator : pub template <class _Tp> struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {}; +template <class _Tp> +struct __is_exactly_input_iterator + : public integral_constant<bool, + __has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value && + !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {}; + template<class _Category, class _Tp, class _Distance = ptrdiff_t, class _Pointer = _Tp*, class _Reference = _Tp&> struct _LIBCPP_TYPE_VIS_ONLY iterator @@ -1404,6 +1410,23 @@ operator+(typename __wrap_iter<_Iter>::d return __x; } +template <class _Iter> +struct __libcpp_is_trivial_iterator + : public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<move_iterator<_Iter> > + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> > + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + + template <class _Tp, size_t _Np> inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Tp* Modified: vendor/libc++/dist/include/string ============================================================================== --- vendor/libc++/dist/include/string Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/include/string Sat Jan 16 17:20:41 2016 (r294164) @@ -1201,6 +1201,30 @@ _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TY #pragma warning( pop ) #endif // _LIBCPP_MSVC +#ifdef _LIBCPP_NO_EXCEPTIONS +template <class _Iter> +struct __libcpp_string_gets_noexcept_iterator_impl : public true_type {}; +#elif defined(_LIBCPP_HAS_NO_NOEXCEPT) +template <class _Iter> +struct __libcpp_string_gets_noexcept_iterator_impl : public false_type {}; +#else +template <class _Iter, bool = __is_forward_iterator<_Iter>::value> +struct __libcpp_string_gets_noexcept_iterator_impl : public _LIBCPP_BOOL_CONSTANT(( + noexcept(++(declval<_Iter&>())) && + is_nothrow_assignable<_Iter&, _Iter>::value && + noexcept(declval<_Iter>() == declval<_Iter>()) && + noexcept(*declval<_Iter>()) +)) {}; + +template <class _Iter> +struct __libcpp_string_gets_noexcept_iterator_impl<_Iter, false> : public false_type {}; +#endif + + +template <class _Iter> +struct __libcpp_string_gets_noexcept_iterator + : public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value || __libcpp_string_gets_noexcept_iterator_impl<_Iter>::value) {}; + #ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT template <class _CharT, size_t = sizeof(_CharT)> @@ -1495,15 +1519,16 @@ public: template<class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator<_InputIterator>::value + || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, basic_string& >::type append(_InputIterator __first, _InputIterator __last); template<class _ForwardIterator> typename enable_if < - __is_forward_iterator<_ForwardIterator>::value, + __is_forward_iterator<_ForwardIterator>::value + && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, basic_string& >::type append(_ForwardIterator __first, _ForwardIterator __last); @@ -1535,15 +1560,16 @@ public: template<class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator<_InputIterator>::value + || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, basic_string& >::type assign(_InputIterator __first, _InputIterator __last); template<class _ForwardIterator> typename enable_if < - __is_forward_iterator<_ForwardIterator>::value, + __is_forward_iterator<_ForwardIterator>::value + && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, basic_string& >::type assign(_ForwardIterator __first, _ForwardIterator __last); @@ -1564,15 +1590,16 @@ public: template<class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator<_InputIterator>::value + || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, iterator >::type insert(const_iterator __pos, _InputIterator __first, _InputIterator __last); template<class _ForwardIterator> typename enable_if < - __is_forward_iterator<_ForwardIterator>::value, + __is_forward_iterator<_ForwardIterator>::value + && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, iterator >::type insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last); @@ -1817,8 +1844,7 @@ private: template <class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator<_InputIterator>::value, void >::type __init(_InputIterator __first, _InputIterator __last); @@ -2195,8 +2221,7 @@ template <class _CharT, class _Traits, c template <class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator<_InputIterator>::value, void >::type basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last) @@ -2494,15 +2519,14 @@ template <class _CharT, class _Traits, c template<class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator <_InputIterator>::value + || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, basic_string<_CharT, _Traits, _Allocator>& >::type basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last) { - clear(); - for (; __first != __last; ++__first) - push_back(*__first); + basic_string __temp(__first, __last, __alloc()); + assign(__temp.data(), __temp.size()); return *this; } @@ -2510,7 +2534,8 @@ template <class _CharT, class _Traits, c template<class _ForwardIterator> typename enable_if < - __is_forward_iterator<_ForwardIterator>::value, + __is_forward_iterator<_ForwardIterator>::value + && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, basic_string<_CharT, _Traits, _Allocator>& >::type basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) @@ -2643,14 +2668,14 @@ template <class _CharT, class _Traits, c template<class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, + __is_exactly_input_iterator<_InputIterator>::value + || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, basic_string<_CharT, _Traits, _Allocator>& >::type basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last) { - for (; __first != __last; ++__first) - push_back(*__first); + basic_string __temp (__first, __last, __alloc()); + append(__temp.data(), __temp.size()); return *this; } @@ -2658,7 +2683,8 @@ template <class _CharT, class _Traits, c template<class _ForwardIterator> typename enable_if < - __is_forward_iterator<_ForwardIterator>::value, + __is_forward_iterator<_ForwardIterator>::value + && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, basic_string<_CharT, _Traits, _Allocator>& >::type basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last) @@ -2774,9 +2800,9 @@ template <class _CharT, class _Traits, c template<class _InputIterator> typename enable_if < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, - typename basic_string<_CharT, _Traits, _Allocator>::iterator + __is_exactly_input_iterator<_InputIterator>::value + || !__libcpp_string_gets_noexcept_iterator<_InputIterator>::value, + typename basic_string<_CharT, _Traits, _Allocator>::iterator >::type basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last) { @@ -2785,24 +2811,16 @@ basic_string<_CharT, _Traits, _Allocator "string::insert(iterator, range) called with an iterator not" " referring to this string"); #endif - size_type __old_sz = size(); - difference_type __ip = __pos - begin(); - for (; __first != __last; ++__first) - push_back(*__first); - pointer __p = __get_pointer(); - _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size()); -#if _LIBCPP_DEBUG_LEVEL >= 2 - return iterator(this, __p + __ip); -#else - return iterator(__p + __ip); -#endif + basic_string __temp(__first, __last, __alloc()); + return insert(__pos, __temp.data(), __temp.data() + __temp.size()); } template <class _CharT, class _Traits, class _Allocator> template<class _ForwardIterator> typename enable_if < - __is_forward_iterator<_ForwardIterator>::value, + __is_forward_iterator<_ForwardIterator>::value + && __libcpp_string_gets_noexcept_iterator<_ForwardIterator>::value, typename basic_string<_CharT, _Traits, _Allocator>::iterator >::type basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last) @@ -3005,22 +3023,8 @@ typename enable_if basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2) { - for (; true; ++__i1, ++__j1) - { - if (__i1 == __i2) - { - if (__j1 != __j2) - insert(__i1, __j1, __j2); - break; - } - if (__j1 == __j2) - { - erase(__i1, __i2); - break; - } - traits_type::assign(const_cast<value_type&>(*__i1), *__j1); - } - return *this; + basic_string __temp(__j1, __j2, __alloc()); + return this->replace(__i1, __i2, __temp); } template <class _CharT, class _Traits, class _Allocator> Added: vendor/libc++/dist/test/libcxx/iterators/trivial_iterators.pass.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/libc++/dist/test/libcxx/iterators/trivial_iterators.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -0,0 +1,187 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// + +// <iterator> + +// __libcpp_is_trivial_iterator<Tp> + +// __libcpp_is_trivial_iterator determines if an iterator is a "trivial" one, +// that can be used w/o worrying about its operations throwing exceptions. +// Pointers are trivial iterators. Libc++ has three "iterator wrappers": +// reverse_iterator, move_iterator, and __wrap_iter. If the underlying iterator +// is trivial, then those are as well. +// + +#include <iterator> +#include <cassert> +#include <string> +#include <vector> +#include <initializer_list> + +#include "test_iterators.h" + +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS +#define DELETE_FUNCTION = delete +#else +#define DELETE_FUNCTION +#endif + +class T; // incomplete + +class my_input_iterator_tag : public std::input_iterator_tag {}; + +template <class It> +class my_input_iterator +{ + It it_; + + template <class U> friend class input_iterator; +public: + typedef my_input_iterator_tag iterator_category; + typedef typename std::iterator_traits<It>::value_type value_type; + typedef typename std::iterator_traits<It>::difference_type difference_type; + typedef It pointer; + typedef typename std::iterator_traits<It>::reference reference; + + It base() const {return it_;} + + my_input_iterator() : it_() {} + explicit my_input_iterator(It it) : it_(it) {} + template <class U> + my_input_iterator(const input_iterator<U>& u) :it_(u.it_) {} + + reference operator*() const {return *it_;} + pointer operator->() const {return it_;} + + my_input_iterator& operator++() {++it_; return *this;} + my_input_iterator operator++(int) + {my_input_iterator tmp(*this); ++(*this); return tmp;} + + friend bool operator==(const my_input_iterator& x, const my_input_iterator& y) + {return x.it_ == y.it_;} + friend bool operator!=(const my_input_iterator& x, const my_input_iterator& y) + {return !(x == y);} + + template <class T> + void operator,(T const &) DELETE_FUNCTION; +}; + +template <class T, class U> +inline +bool +operator==(const my_input_iterator<T>& x, const my_input_iterator<U>& y) +{ + return x.base() == y.base(); +} + +template <class T, class U> +inline +bool +operator!=(const my_input_iterator<T>& x, const my_input_iterator<U>& y) +{ + return !(x == y); +} + + +int main() +{ +// basic tests + static_assert(( std::__libcpp_is_trivial_iterator<char *>::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<const char *>::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<int *>::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<T *>::value), ""); + + static_assert(( std::__libcpp_is_trivial_iterator<std::move_iterator<char *> > ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::move_iterator<const char *> >::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::move_iterator<int *> > ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::move_iterator<T *> > ::value), ""); + + static_assert(( std::__libcpp_is_trivial_iterator<std::reverse_iterator<char *> > ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::reverse_iterator<const char *> >::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::reverse_iterator<int *> > ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::reverse_iterator<T *> > ::value), ""); + + static_assert(( std::__libcpp_is_trivial_iterator<std::__wrap_iter<char *> > ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::__wrap_iter<const char *> >::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::__wrap_iter<int *> > ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::__wrap_iter<T *> > ::value), ""); + + static_assert(( std::__libcpp_is_trivial_iterator<std::reverse_iterator<std::__wrap_iter<char *> > > ::value), ""); + +// iterators in the libc++ test suite + static_assert((!std::__libcpp_is_trivial_iterator<output_iterator <char *> >::value), ""); + static_assert((!std::__libcpp_is_trivial_iterator<input_iterator <char *> >::value), ""); + static_assert((!std::__libcpp_is_trivial_iterator<forward_iterator <char *> >::value), ""); + static_assert((!std::__libcpp_is_trivial_iterator<bidirectional_iterator<char *> >::value), ""); + static_assert((!std::__libcpp_is_trivial_iterator<random_access_iterator<char *> >::value), ""); + static_assert((!std::__libcpp_is_trivial_iterator<ThrowingIterator <char *> >::value), ""); + static_assert((!std::__libcpp_is_trivial_iterator<NonThrowingIterator <char *> >::value), ""); + + +// Iterator classification + static_assert(( std::__is_input_iterator <char *>::value), "" ); + static_assert(( std::__is_forward_iterator <char *>::value), "" ); + static_assert(( std::__is_bidirectional_iterator<char *>::value), "" ); + static_assert(( std::__is_random_access_iterator<char *>::value), "" ); + static_assert((!std::__is_exactly_input_iterator<char *>::value), "" ); + + static_assert(( std::__is_input_iterator <input_iterator<char *> >::value), "" ); + static_assert((!std::__is_forward_iterator <input_iterator<char *> >::value), "" ); + static_assert((!std::__is_bidirectional_iterator<input_iterator<char *> >::value), "" ); + static_assert((!std::__is_random_access_iterator<input_iterator<char *> >::value), "" ); + static_assert(( std::__is_exactly_input_iterator<input_iterator<char *> >::value), "" ); + + static_assert(( std::__is_input_iterator <forward_iterator<char *> >::value), "" ); + static_assert(( std::__is_forward_iterator <forward_iterator<char *> >::value), "" ); + static_assert((!std::__is_bidirectional_iterator<forward_iterator<char *> >::value), "" ); + static_assert((!std::__is_random_access_iterator<forward_iterator<char *> >::value), "" ); + static_assert((!std::__is_exactly_input_iterator<forward_iterator<char *> >::value), "" ); + + static_assert(( std::__is_input_iterator <bidirectional_iterator<char *> >::value), "" ); + static_assert(( std::__is_forward_iterator <bidirectional_iterator<char *> >::value), "" ); + static_assert(( std::__is_bidirectional_iterator<bidirectional_iterator<char *> >::value), "" ); + static_assert((!std::__is_random_access_iterator<bidirectional_iterator<char *> >::value), "" ); + static_assert((!std::__is_exactly_input_iterator<bidirectional_iterator<char *> >::value), "" ); + + static_assert(( std::__is_input_iterator <random_access_iterator<char *> >::value), "" ); + static_assert(( std::__is_forward_iterator <random_access_iterator<char *> >::value), "" ); + static_assert(( std::__is_bidirectional_iterator<random_access_iterator<char *> >::value), "" ); + static_assert(( std::__is_random_access_iterator<random_access_iterator<char *> >::value), "" ); + static_assert((!std::__is_exactly_input_iterator<random_access_iterator<char *> >::value), "" ); + + static_assert(( std::__is_input_iterator <my_input_iterator<char *> >::value), "" ); + static_assert((!std::__is_forward_iterator <my_input_iterator<char *> >::value), "" ); + static_assert((!std::__is_bidirectional_iterator<my_input_iterator<char *> >::value), "" ); + static_assert((!std::__is_random_access_iterator<my_input_iterator<char *> >::value), "" ); + static_assert(( std::__is_exactly_input_iterator<my_input_iterator<char *> >::value), "" ); + +// +// iterators from libc++'s containers +// + +// string + static_assert(( std::__libcpp_is_trivial_iterator<std::vector<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::vector<char>::const_iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::vector<char>::reverse_iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::vector<char>::const_reverse_iterator>::value), ""); + +// vector + static_assert(( std::__libcpp_is_trivial_iterator<std::basic_string<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::basic_string<char>::const_iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::basic_string<char>::reverse_iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::basic_string<char>::const_reverse_iterator>::value), ""); + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +// Initializer list (which has no reverse iterators) + static_assert(( std::__libcpp_is_trivial_iterator<std::initializer_list<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_is_trivial_iterator<std::initializer_list<char>::const_iterator> ::value), ""); +#endif + +} Added: vendor/libc++/dist/test/libcxx/strings/iterators.exceptions.pass.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/libc++/dist/test/libcxx/strings/iterators.exceptions.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// + +// <iterator> + +// __libcpp_is_trivial_iterator<Tp> + +// __libcpp_string_gets_noexcept_iterator determines if an iterator can be used +// w/o worrying about whether or not certain operations can throw. +// This gives us a "fast path for string operations" +// + +#include <iterator> +#include <cassert> +#include <string> +#include <vector> +#include <initializer_list> + +#include "test_iterators.h" + +int main() +{ +// basic tests + static_assert(( std::__libcpp_string_gets_noexcept_iterator<char *>::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<const char *>::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::move_iterator<char *> > ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::move_iterator<const char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::reverse_iterator<char *> > ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::reverse_iterator<const char *> >::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::__wrap_iter<char *> > ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::__wrap_iter<const char *> >::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::reverse_iterator<std::__wrap_iter<char *> > > ::value), ""); + +// iterators in the libc++ test suite + static_assert((!std::__libcpp_string_gets_noexcept_iterator<output_iterator <char *> >::value), ""); + static_assert((!std::__libcpp_string_gets_noexcept_iterator<input_iterator <char *> >::value), ""); + static_assert((!std::__libcpp_string_gets_noexcept_iterator<forward_iterator <char *> >::value), ""); + static_assert((!std::__libcpp_string_gets_noexcept_iterator<bidirectional_iterator<char *> >::value), ""); + static_assert((!std::__libcpp_string_gets_noexcept_iterator<random_access_iterator<char *> >::value), ""); + static_assert((!std::__libcpp_string_gets_noexcept_iterator<ThrowingIterator <char *> >::value), ""); + +#if __has_feature(cxx_noexcept) + static_assert(( std::__libcpp_string_gets_noexcept_iterator<NonThrowingIterator <char *> >::value), ""); +#else + static_assert((!std::__libcpp_string_gets_noexcept_iterator<NonThrowingIterator <char *> >::value), ""); +#endif + +// +// iterators from libc++'s containers +// + +// string + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::const_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::reverse_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::const_reverse_iterator>::value), ""); + +// vector + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::const_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::reverse_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::const_reverse_iterator>::value), ""); + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +// Initializer list (which has no reverse iterators) + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::initializer_list<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::initializer_list<char>::const_iterator> ::value), ""); +#endif +} Added: vendor/libc++/dist/test/libcxx/strings/iterators.noexcept.pass.cpp ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/libc++/dist/test/libcxx/strings/iterators.noexcept.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// + +// <iterator> + +// __libcpp_is_trivial_iterator<Tp> + +// __libcpp_string_gets_noexcept_iterator determines if an iterator can be used +// w/o worrying about whether or not certain operations can throw. +// This gives us a "fast path for string operations". +// +// When exceptions are disabled, all iterators should get this "fast path" +// + +#define _LIBCPP_NO_EXCEPTIONS + +#include <iterator> +#include <cassert> +#include <string> +#include <vector> +#include <initializer_list> + +#include "test_iterators.h" + +int main() +{ +// basic tests + static_assert(( std::__libcpp_string_gets_noexcept_iterator<char *>::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<const char *>::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::move_iterator<char *> > ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::move_iterator<const char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::reverse_iterator<char *> > ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::reverse_iterator<const char *> >::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::__wrap_iter<char *> > ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::__wrap_iter<const char *> >::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::reverse_iterator<std::__wrap_iter<char *> > > ::value), ""); + +// iterators in the libc++ test suite + static_assert(( std::__libcpp_string_gets_noexcept_iterator<output_iterator <char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<input_iterator <char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<forward_iterator <char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<bidirectional_iterator<char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<random_access_iterator<char *> >::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<ThrowingIterator <char *> >::value), ""); + + static_assert(( std::__libcpp_string_gets_noexcept_iterator<NonThrowingIterator <char *> >::value), ""); + +// +// iterators from libc++'s containers +// + +// string + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::const_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::reverse_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::vector<char>::const_reverse_iterator>::value), ""); + +// vector + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::const_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::reverse_iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::basic_string<char>::const_reverse_iterator>::value), ""); + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +// Initializer list (which has no reverse iterators) + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::initializer_list<char>::iterator> ::value), ""); + static_assert(( std::__libcpp_string_gets_noexcept_iterator<std::initializer_list<char>::const_iterator> ::value), ""); +#endif +} Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/initializer_list.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -24,7 +24,7 @@ int main() s.append({'a', 'b', 'c'}); assert(s == "123abc"); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; S s("123"); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -15,7 +15,7 @@ #include <string> #include <cassert> -#include "../../input_iterator.h" +#include "test_iterators.h" #include "min_allocator.h" template <class S, class It> @@ -27,6 +27,20 @@ test(S s, It first, It last, S expected) assert(s == expected); } +template <class S, class It> +void +test_exceptions(S s, It first, It last) +{ + S aCopy = s; + try { + s.append(first, last); + assert(false); + } + catch (...) {} + assert(s.__invariants()); + assert(s == aCopy); +} + int main() { { @@ -87,7 +101,7 @@ int main() test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; @@ -147,4 +161,17 @@ int main() S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); } #endif + { // test iterator operations that throw + typedef std::string S; + typedef ThrowingIterator<char> TIter; + typedef input_iterator<TIter> IIter; + const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); + test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); + test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + + test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter()); + test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter()); + test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter()); + } } Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -43,7 +43,7 @@ int main() test(S("12345678901234567890"), "12345678901234567890", S("1234567890123456789012345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), "", S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer_size.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer_size.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/pointer_size.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -48,7 +48,7 @@ int main() test(S("12345678901234567890"), "12345678901234567890", 20, S("1234567890123456789012345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), "", 0, S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/push_back.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/push_back.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/push_back.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -33,7 +33,7 @@ int main() test(S("12345"), 'a', S("12345a")); test(S("12345678901234567890"), 'a', S("12345678901234567890a")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), 'a', S(1, 'a')); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/size_char.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/size_char.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/size_char.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -43,7 +43,7 @@ int main() test(S("12345678901234567890"), 1, 'a', S("12345678901234567890a")); test(S("12345678901234567890"), 10, 'a', S("12345678901234567890aaaaaaaaaa")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), 0, 'a', S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -51,7 +51,7 @@ int main() test(S("12345678901234567890"), S("12345678901234567890"), S("1234567890123456789012345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), S(), S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_append/string_size_size.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -80,7 +80,7 @@ int main() test(S("12345678901234567890"), S("12345678901234567890"), 5, 10, S("123456789012345678906789012345")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), S(), 0, 0, S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/initializer_list.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/initializer_list.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/initializer_list.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -24,7 +24,7 @@ int main() s.assign({'a', 'b', 'c'}); assert(s == "abc"); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; S s("123"); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -15,7 +15,7 @@ #include <string> #include <cassert> -#include "../../input_iterator.h" +#include "test_iterators.h" #include "min_allocator.h" template <class S, class It> @@ -27,6 +27,20 @@ test(S s, It first, It last, S expected) assert(s == expected); } +template <class S, class It> +void +test_exceptions(S s, It first, It last) +{ + S aCopy = s; + try { + s.assign(first, last); + assert(false); + } + catch (...) {} + assert(s.__invariants()); + assert(s == aCopy); +} + int main() { { @@ -147,4 +161,17 @@ int main() S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); } #endif + { // test iterator operations that throw + typedef std::string S; + typedef ThrowingIterator<char> TIter; + typedef input_iterator<TIter> IIter; + const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); + test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); + test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + + test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter()); + test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter()); + test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter()); + } } Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -43,7 +43,7 @@ int main() test(S("12345678901234567890"), "12345678901234567890", S("12345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), "", S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer_size.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer_size.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/pointer_size.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -48,7 +48,7 @@ int main() test(S("12345678901234567890"), "12345678901234567890", 20, S("12345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), "", 0, S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/rv_string.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/rv_string.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/rv_string.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -52,7 +52,7 @@ int main() test(S("12345678901234567890"), S("12345678901234567890"), S("12345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), S(), S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/size_char.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/size_char.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/size_char.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -43,7 +43,7 @@ int main() test(S("12345678901234567890"), 1, 'a', S(1, 'a')); test(S("12345678901234567890"), 10, 'a', S(10, 'a')); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), 0, 'a', S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -51,7 +51,7 @@ int main() test(S("12345678901234567890"), S("12345678901234567890"), S("12345678901234567890")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), S(), S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string_size_size.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string_size_size.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_assign/string_size_size.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -80,7 +80,7 @@ int main() test(S("12345678901234567890"), S("12345678901234567890"), 5, 10, S("6789012345")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; test(S(), S(), 0, 0, S()); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_char.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_char.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_char.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -56,7 +56,7 @@ int main() test(s, s.begin()+5, 'B', S("a567AB1432dcb")); test(s, s.begin()+6, 'C', S("a567ABC1432dcb")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; S s; Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_initializer_list.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_initializer_list.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_initializer_list.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -29,7 +29,7 @@ int main() assert(i - s.begin() == 3); assert(s == "123abc456"); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; S s("123456"); Modified: vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp ============================================================================== --- vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp Sat Jan 16 17:19:26 2016 (r294163) +++ vendor/libc++/dist/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp Sat Jan 16 17:20:41 2016 (r294164) @@ -19,7 +19,7 @@ #include <string> #include <cassert> -#include "../../input_iterator.h" +#include "test_iterators.h" #include "min_allocator.h" template <class S, class It> @@ -33,6 +33,21 @@ test(S s, typename S::difference_type po assert(s == expected); } +template <class S, class It> +void +test_exceptions(S s, typename S::difference_type pos, It first, It last) +{ + typename S::const_iterator p = s.cbegin() + pos; + S aCopy = s; + try { + s.insert(p, first, last); + assert(false); + } + catch (...) {} + assert(s.__invariants()); + assert(s == aCopy); +} + int main() { { @@ -80,7 +95,7 @@ int main() test(S("12345678901234567890"), 20, input_iterator<const char*>(s), input_iterator<const char*>(s+52), S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); } -#if __cplusplus >= 201103L +#if TEST_STD_VER >= 11 { typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; @@ -127,6 +142,19 @@ int main() S("12345678901234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); } #endif + { // test iterator operations that throw + typedef std::string S; + typedef ThrowingIterator<char> TIter; + typedef input_iterator<TIter> IIter; + const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + test_exceptions(S(), 0, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); + test_exceptions(S(), 0, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); + test_exceptions(S(), 0, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); + *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201601161720.u0GHKfMS039745>