[libcxx] r318328 - More of P0600 - '[[nodiscard]] in the Library' mark empty() as nodiscard in string, string_view, and the free function std::empty(). Removed tabs from <string_view>, which is why the diff is so big.

Marshall Clow via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 15 12:02:27 PST 2017


Author: marshall
Date: Wed Nov 15 12:02:27 2017
New Revision: 318328

URL: http://llvm.org/viewvc/llvm-project?rev=318328&view=rev
Log:
More of P0600 - '[[nodiscard]] in the Library' mark empty() as nodiscard in string, string_view, and the free function std::empty(). Removed tabs from <string_view>, which is why the diff is so big.

Added:
    libcxx/trunk/test/std/iterators/iterator.container/empty.array.fail.cpp
    libcxx/trunk/test/std/iterators/iterator.container/empty.container.fail.cpp
    libcxx/trunk/test/std/iterators/iterator.container/empty.initializer_list.fail.cpp
    libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.fail.cpp
    libcxx/trunk/test/std/strings/string.view/string.view.capacity/empty.fail.cpp
Modified:
    libcxx/trunk/include/iterator
    libcxx/trunk/include/string
    libcxx/trunk/include/string_view
    libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.pass.cpp
    libcxx/trunk/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp

Modified: libcxx/trunk/include/iterator
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/iterator?rev=318328&r1=318327&r2=318328&view=diff
==============================================================================
--- libcxx/trunk/include/iterator (original)
+++ libcxx/trunk/include/iterator Wed Nov 15 12:02:27 2017
@@ -1791,30 +1791,39 @@ end(const _Cp& __c)
 
 #if _LIBCPP_STD_VER > 14
 template <class _Cont>
+inline _LIBCPP_INLINE_VISIBILITY
 constexpr auto size(const _Cont& __c) -> decltype(__c.size()) { return __c.size(); }
 
 template <class _Tp, size_t _Sz>
+inline _LIBCPP_INLINE_VISIBILITY
 constexpr size_t size(const _Tp (&)[_Sz]) noexcept { return _Sz; }
 
 template <class _Cont>
+_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
 constexpr auto empty(const _Cont& __c) -> decltype(__c.empty()) { return __c.empty(); }
 
 template <class _Tp, size_t _Sz>
+_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
 constexpr bool empty(const _Tp (&)[_Sz]) noexcept { return false; }
 
 template <class _Ep>
+_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
 constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; }
 
 template <class _Cont> constexpr
+inline _LIBCPP_INLINE_VISIBILITY
 auto data(_Cont& __c) -> decltype(__c.data()) { return __c.data(); }
 
 template <class _Cont> constexpr
+inline _LIBCPP_INLINE_VISIBILITY
 auto data(const _Cont& __c) -> decltype(__c.data()) { return __c.data(); }
 
 template <class _Tp, size_t _Sz>
+inline _LIBCPP_INLINE_VISIBILITY
 constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { return __array; }
 
 template <class _Ep>
+inline _LIBCPP_INLINE_VISIBILITY
 constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); }
 #endif
 

Modified: libcxx/trunk/include/string
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/string?rev=318328&r1=318327&r2=318328&view=diff
==============================================================================
--- libcxx/trunk/include/string (original)
+++ libcxx/trunk/include/string Wed Nov 15 12:02:27 2017
@@ -608,7 +608,7 @@ struct __libcpp_string_gets_noexcept_ite
 
 template <class _CharT, class _Traits, class _Tp>
 struct __can_be_converted_to_string_view : public _LIBCPP_BOOL_CONSTANT(
-	( is_convertible<const _Tp&, basic_string_view<_CharT, _Traits> >::value &&
+    ( is_convertible<const _Tp&, basic_string_view<_CharT, _Traits> >::value &&
      !is_convertible<const _Tp&, const _CharT*>::value)) {};
 
 #ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
@@ -901,7 +901,8 @@ public:
     void shrink_to_fit() _NOEXCEPT {reserve();}
     _LIBCPP_INLINE_VISIBILITY
     void clear() _NOEXCEPT;
-    _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;}
+    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
+    bool empty() const _NOEXCEPT {return size() == 0;}
 
     _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const _NOEXCEPT;
     _LIBCPP_INLINE_VISIBILITY reference       operator[](size_type __pos)       _NOEXCEPT;
@@ -1756,10 +1757,10 @@ template <class _CharT, class _Traits, c
 template <class _Tp>
 basic_string<_CharT, _Traits, _Allocator>::basic_string(
              const _Tp& __t, size_type __pos, size_type __n, const allocator_type& __a,
-			 typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type *)
+             typename enable_if<__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value, void>::type *)
     : __r_(__second_tag(), __a)
 {
-	__self_view __sv = __self_view(__t).substr(__pos, __n);
+    __self_view __sv = __self_view(__t).substr(__pos, __n);
     __init(__sv.data(), __sv.size());
 #if _LIBCPP_DEBUG_LEVEL >= 2
     __get_db()->__insert_c(this);
@@ -2145,7 +2146,7 @@ template <class _Tp>
 typename enable_if
 <
     __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
-	basic_string<_CharT, _Traits, _Allocator>&
+    basic_string<_CharT, _Traits, _Allocator>&
 >::type
 basic_string<_CharT, _Traits, _Allocator>::assign(const _Tp & __t, size_type __pos, size_type __n)
 {
@@ -2493,7 +2494,7 @@ template <class _Tp>
 typename enable_if
 <
     __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
-	basic_string<_CharT, _Traits, _Allocator>&
+    basic_string<_CharT, _Traits, _Allocator>&
 >::type
 basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const _Tp& __t,
                                                   size_type __pos2, size_type __n)
@@ -2682,8 +2683,8 @@ template <class _CharT, class _Traits, c
 template <class _Tp>
 typename enable_if
 <
-	__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
-	basic_string<_CharT, _Traits, _Allocator>&
+    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
+    basic_string<_CharT, _Traits, _Allocator>&
 >::type
 basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const _Tp& __t,
                                                    size_type __pos2, size_type __n2)
@@ -3462,8 +3463,8 @@ template <class _CharT, class _Traits, c
 template <class _Tp>
 typename enable_if
 <
-	__can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
-	int
+    __can_be_converted_to_string_view<_CharT, _Traits, _Tp>::value,
+    int
 >::type
 basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1,
                                                    size_type __n1,

Modified: libcxx/trunk/include/string_view
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/string_view?rev=318328&r1=318327&r2=318328&view=diff
==============================================================================
--- libcxx/trunk/include/string_view (original)
+++ libcxx/trunk/include/string_view Wed Nov 15 12:02:27 2017
@@ -186,388 +186,388 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 template<class _CharT, class _Traits = char_traits<_CharT> >
 class _LIBCPP_TEMPLATE_VIS basic_string_view {
 public:
-	// types
-	typedef _Traits                                    traits_type;
-	typedef _CharT                                     value_type;
-	typedef const _CharT*                              pointer;
-	typedef const _CharT*                              const_pointer;
-	typedef const _CharT&                              reference;
-	typedef const _CharT&                              const_reference;
-	typedef const_pointer                              const_iterator; // See [string.view.iterators]
-	typedef const_iterator                             iterator;
-	typedef _VSTD::reverse_iterator<const_iterator>    const_reverse_iterator;
-	typedef const_reverse_iterator                     reverse_iterator;
-	typedef size_t                                     size_type;
-	typedef ptrdiff_t                                  difference_type;
-	static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1);
+    // types
+    typedef _Traits                                    traits_type;
+    typedef _CharT                                     value_type;
+    typedef const _CharT*                              pointer;
+    typedef const _CharT*                              const_pointer;
+    typedef const _CharT&                              reference;
+    typedef const _CharT&                              const_reference;
+    typedef const_pointer                              const_iterator; // See [string.view.iterators]
+    typedef const_iterator                             iterator;
+    typedef _VSTD::reverse_iterator<const_iterator>    const_reverse_iterator;
+    typedef const_reverse_iterator                     reverse_iterator;
+    typedef size_t                                     size_type;
+    typedef ptrdiff_t                                  difference_type;
+    static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1);
 
     static_assert(is_pod<value_type>::value, "Character type of basic_string_view must be a POD");
     static_assert((is_same<_CharT, typename traits_type::char_type>::value),
                   "traits_type::char_type must be the same type as CharT");
 
-	// [string.view.cons], construct/copy
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	basic_string_view() _NOEXCEPT : __data (nullptr), __size(0) {}
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	basic_string_view(const basic_string_view&) _NOEXCEPT = default;
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default;
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT
-		: __data(__s), __size(__len)
-	{
+    // [string.view.cons], construct/copy
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    basic_string_view() _NOEXCEPT : __data (nullptr), __size(0) {}
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    basic_string_view(const basic_string_view&) _NOEXCEPT = default;
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default;
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT
+        : __data(__s), __size(__len)
+    {
 // #if _LIBCPP_STD_VER > 11
 //         _LIBCPP_ASSERT(__len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): received nullptr");
 // #endif
-	}
+    }
 
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	basic_string_view(const _CharT* __s)
-		: __data(__s), __size(_Traits::length(__s)) {}
-
-	// [string.view.iterators], iterators
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_iterator begin()  const _NOEXCEPT { return cbegin(); }
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_iterator end()    const _NOEXCEPT { return cend(); }
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_iterator cbegin() const _NOEXCEPT { return __data; }
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_iterator cend()   const _NOEXCEPT { return __data + __size; }
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
-	const_reverse_iterator rbegin()   const _NOEXCEPT { return const_reverse_iterator(cend()); }
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
-	const_reverse_iterator rend()     const _NOEXCEPT { return const_reverse_iterator(cbegin()); }
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
-	const_reverse_iterator crbegin()  const _NOEXCEPT { return const_reverse_iterator(cend()); }
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
-	const_reverse_iterator crend()    const _NOEXCEPT { return const_reverse_iterator(cbegin()); }
-
-	// [string.view.capacity], capacity
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	size_type size()     const _NOEXCEPT { return __size; }
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	size_type length()   const _NOEXCEPT { return __size; }
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max(); }
-
-	_LIBCPP_CONSTEXPR bool _LIBCPP_INLINE_VISIBILITY
-	empty()         const _NOEXCEPT { return __size == 0; }
-
-	// [string.view.access], element access
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_reference operator[](size_type __pos) const _NOEXCEPT { return __data[__pos]; }
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_reference at(size_type __pos) const
-	{
-		return __pos >= size()
-			? (__throw_out_of_range("string_view::at"), __data[0])
-			: __data[__pos];
-	}
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_reference front() const
-	{
-		return _LIBCPP_ASSERT(!empty(), "string_view::front(): string is empty"), __data[0];
-	}
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_reference back() const
-	{
-		return _LIBCPP_ASSERT(!empty(), "string_view::back(): string is empty"), __data[__size-1];
-	}
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	const_pointer data() const _NOEXCEPT { return __data; }
-
-	// [string.view.modifiers], modifiers:
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	void remove_prefix(size_type __n) _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__n <= size(), "remove_prefix() can't remove more than size()");
-		__data += __n;
-		__size -= __n;
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	void remove_suffix(size_type __n) _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__n <= size(), "remove_suffix() can't remove more than size()");
-		__size -= __n;
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	void swap(basic_string_view& __other) _NOEXCEPT
-	{
-		const value_type *__p = __data;
-		__data = __other.__data;
-		__other.__data = __p;
-
-		size_type __sz = __size;
-		__size = __other.__size;
-		__other.__size = __sz;
-	}
-
-	_LIBCPP_INLINE_VISIBILITY
-	size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
-	{
-		if (__pos > size())
-			__throw_out_of_range("string_view::copy");
-		size_type __rlen = _VSTD::min(__n, size() - __pos);
-		_Traits::copy(__s, data() + __pos, __rlen);
-		return __rlen;
-	}
-
-	_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
-	basic_string_view substr(size_type __pos = 0, size_type __n = npos) const
-	{
-		return __pos > size()
-			? (__throw_out_of_range("string_view::substr"), basic_string_view())
-			: basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos));
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 int compare(basic_string_view __sv) const _NOEXCEPT
-	{
-		size_type __rlen = _VSTD::min( size(), __sv.size());
-		int __retval = _Traits::compare(data(), __sv.data(), __rlen);
-		if ( __retval == 0 ) // first __rlen chars matched
-			__retval = size() == __sv.size() ? 0 : ( size() < __sv.size() ? -1 : 1 );
-		return __retval;
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	int compare(size_type __pos1, size_type __n1, basic_string_view __sv) const
-	{
-		return substr(__pos1, __n1).compare(__sv);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	int compare(                       size_type __pos1, size_type __n1, 
-				basic_string_view __sv, size_type __pos2, size_type __n2) const
-	{
-		return substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	int compare(const _CharT* __s) const _NOEXCEPT
-	{
-		return compare(basic_string_view(__s));
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	int compare(size_type __pos1, size_type __n1, const _CharT* __s) const
-	{
-		return substr(__pos1, __n1).compare(basic_string_view(__s));
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const
-	{
-		return substr(__pos1, __n1).compare(basic_string_view(__s, __n2));
-	}
-
-	// find
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
-		return __str_find<value_type, size_type, traits_type, npos>
-			(data(), size(), __s.data(), __pos, __s.size());
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT
-	{
-		return __str_find<value_type, size_type, traits_type, npos>
-			(data(), size(), __c, __pos);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find(const _CharT* __s, size_type __pos, size_type __n) const
-	{
-		_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): received nullptr");
-		return __str_find<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, __n);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find(const _CharT* __s, size_type __pos = 0) const
-	{
-		_LIBCPP_ASSERT(__s != nullptr, "string_view::find(): received nullptr");
-		return __str_find<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, traits_type::length(__s));
-	}
-
-	// rfind
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
-		return __str_rfind<value_type, size_type, traits_type, npos>
-			(data(), size(), __s.data(), __pos, __s.size());
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT
-	{
-		return __str_rfind<value_type, size_type, traits_type, npos>
-			(data(), size(), __c, __pos);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const
-	{
-		_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr");
-		return __str_rfind<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, __n);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type rfind(const _CharT* __s, size_type __pos=npos) const
-	{
-		_LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): received nullptr");
-		return __str_rfind<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, traits_type::length(__s));
-	}
-
-	// find_first_of
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr");
-		return __str_find_first_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s.data(), __pos, __s.size());
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT
-	{ return find(__c, __pos); }
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
-	{
-		_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr");
-		return __str_find_first_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, __n);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_of(const _CharT* __s, size_type __pos=0) const
-	{
-		_LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): received nullptr");
-		return __str_find_first_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, traits_type::length(__s));
-	}
-
-	// find_last_of
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr");
-		return __str_find_last_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s.data(), __pos, __s.size());
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT
-	{ return rfind(__c, __pos); }
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
-	{
-		_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr");
-		return __str_find_last_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, __n);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_of(const _CharT* __s, size_type __pos=npos) const
-	{
-		_LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): received nullptr");
-		return __str_find_last_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, traits_type::length(__s));
-	}
-
-	// find_first_not_of
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr");
-		return __str_find_first_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s.data(), __pos, __s.size());
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_not_of(_CharT __c, size_type __pos=0) const _NOEXCEPT
-	{
-		return __str_find_first_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __c, __pos);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
-	{
-		_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr");
-		return __str_find_first_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, __n);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const
-	{
-		_LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): received nullptr");
-		return __str_find_first_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, traits_type::length(__s));
-	}
-
-	// find_last_not_of
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
-	{
-		_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr");
-		return __str_find_last_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s.data(), __pos, __s.size());
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_not_of(_CharT __c, size_type __pos=npos) const _NOEXCEPT
-	{
-		return __str_find_last_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __c, __pos);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
-	{
-		_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr");
-		return __str_find_last_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, __n);
-	}
-
-	_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
-	size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const
-	{
-		_LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): received nullptr");
-		return __str_find_last_not_of<value_type, size_type, traits_type, npos>
-			(data(), size(), __s, __pos, traits_type::length(__s));
-	}
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    basic_string_view(const _CharT* __s)
+        : __data(__s), __size(_Traits::length(__s)) {}
+
+    // [string.view.iterators], iterators
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_iterator begin()  const _NOEXCEPT { return cbegin(); }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_iterator end()    const _NOEXCEPT { return cend(); }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_iterator cbegin() const _NOEXCEPT { return __data; }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_iterator cend()   const _NOEXCEPT { return __data + __size; }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
+    const_reverse_iterator rbegin()   const _NOEXCEPT { return const_reverse_iterator(cend()); }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
+    const_reverse_iterator rend()     const _NOEXCEPT { return const_reverse_iterator(cbegin()); }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
+    const_reverse_iterator crbegin()  const _NOEXCEPT { return const_reverse_iterator(cend()); }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY
+    const_reverse_iterator crend()    const _NOEXCEPT { return const_reverse_iterator(cbegin()); }
+
+    // [string.view.capacity], capacity
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    size_type size()     const _NOEXCEPT { return __size; }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    size_type length()   const _NOEXCEPT { return __size; }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max(); }
+
+    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
+    bool empty()         const _NOEXCEPT { return __size == 0; }
+
+    // [string.view.access], element access
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_reference operator[](size_type __pos) const _NOEXCEPT { return __data[__pos]; }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_reference at(size_type __pos) const
+    {
+        return __pos >= size()
+            ? (__throw_out_of_range("string_view::at"), __data[0])
+            : __data[__pos];
+    }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_reference front() const
+    {
+        return _LIBCPP_ASSERT(!empty(), "string_view::front(): string is empty"), __data[0];
+    }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_reference back() const
+    {
+        return _LIBCPP_ASSERT(!empty(), "string_view::back(): string is empty"), __data[__size-1];
+    }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    const_pointer data() const _NOEXCEPT { return __data; }
+
+    // [string.view.modifiers], modifiers:
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    void remove_prefix(size_type __n) _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__n <= size(), "remove_prefix() can't remove more than size()");
+        __data += __n;
+        __size -= __n;
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    void remove_suffix(size_type __n) _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__n <= size(), "remove_suffix() can't remove more than size()");
+        __size -= __n;
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    void swap(basic_string_view& __other) _NOEXCEPT
+    {
+        const value_type *__p = __data;
+        __data = __other.__data;
+        __other.__data = __p;
+
+        size_type __sz = __size;
+        __size = __other.__size;
+        __other.__size = __sz;
+    }
+
+    _LIBCPP_INLINE_VISIBILITY
+    size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
+    {
+        if (__pos > size())
+            __throw_out_of_range("string_view::copy");
+        size_type __rlen = _VSTD::min(__n, size() - __pos);
+        _Traits::copy(__s, data() + __pos, __rlen);
+        return __rlen;
+    }
+
+    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
+    basic_string_view substr(size_type __pos = 0, size_type __n = npos) const
+    {
+        return __pos > size()
+            ? (__throw_out_of_range("string_view::substr"), basic_string_view())
+            : basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos));
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 int compare(basic_string_view __sv) const _NOEXCEPT
+    {
+        size_type __rlen = _VSTD::min( size(), __sv.size());
+        int __retval = _Traits::compare(data(), __sv.data(), __rlen);
+        if ( __retval == 0 ) // first __rlen chars matched
+            __retval = size() == __sv.size() ? 0 : ( size() < __sv.size() ? -1 : 1 );
+        return __retval;
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    int compare(size_type __pos1, size_type __n1, basic_string_view __sv) const
+    {
+        return substr(__pos1, __n1).compare(__sv);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    int compare(                       size_type __pos1, size_type __n1, 
+                basic_string_view __sv, size_type __pos2, size_type __n2) const
+    {
+        return substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2));
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    int compare(const _CharT* __s) const _NOEXCEPT
+    {
+        return compare(basic_string_view(__s));
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    int compare(size_type __pos1, size_type __n1, const _CharT* __s) const
+    {
+        return substr(__pos1, __n1).compare(basic_string_view(__s));
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const
+    {
+        return substr(__pos1, __n1).compare(basic_string_view(__s, __n2));
+    }
+
+    // find
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
+        return __str_find<value_type, size_type, traits_type, npos>
+            (data(), size(), __s.data(), __pos, __s.size());
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT
+    {
+        return __str_find<value_type, size_type, traits_type, npos>
+            (data(), size(), __c, __pos);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find(const _CharT* __s, size_type __pos, size_type __n) const
+    {
+        _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): received nullptr");
+        return __str_find<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, __n);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find(const _CharT* __s, size_type __pos = 0) const
+    {
+        _LIBCPP_ASSERT(__s != nullptr, "string_view::find(): received nullptr");
+        return __str_find<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, traits_type::length(__s));
+    }
+
+    // rfind
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
+        return __str_rfind<value_type, size_type, traits_type, npos>
+            (data(), size(), __s.data(), __pos, __s.size());
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT
+    {
+        return __str_rfind<value_type, size_type, traits_type, npos>
+            (data(), size(), __c, __pos);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const
+    {
+        _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr");
+        return __str_rfind<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, __n);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type rfind(const _CharT* __s, size_type __pos=npos) const
+    {
+        _LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): received nullptr");
+        return __str_rfind<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, traits_type::length(__s));
+    }
+
+    // find_first_of
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr");
+        return __str_find_first_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s.data(), __pos, __s.size());
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT
+    { return find(__c, __pos); }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
+    {
+        _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr");
+        return __str_find_first_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, __n);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_of(const _CharT* __s, size_type __pos=0) const
+    {
+        _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): received nullptr");
+        return __str_find_first_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, traits_type::length(__s));
+    }
+
+    // find_last_of
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr");
+        return __str_find_last_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s.data(), __pos, __s.size());
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT
+    { return rfind(__c, __pos); }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
+    {
+        _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr");
+        return __str_find_last_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, __n);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_of(const _CharT* __s, size_type __pos=npos) const
+    {
+        _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): received nullptr");
+        return __str_find_last_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, traits_type::length(__s));
+    }
+
+    // find_first_not_of
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr");
+        return __str_find_first_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s.data(), __pos, __s.size());
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_not_of(_CharT __c, size_type __pos=0) const _NOEXCEPT
+    {
+        return __str_find_first_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __c, __pos);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+    {
+        _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr");
+        return __str_find_first_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, __n);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const
+    {
+        _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): received nullptr");
+        return __str_find_first_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, traits_type::length(__s));
+    }
+
+    // find_last_not_of
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
+    {
+        _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr");
+        return __str_find_last_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s.data(), __pos, __s.size());
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_not_of(_CharT __c, size_type __pos=npos) const _NOEXCEPT
+    {
+        return __str_find_last_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __c, __pos);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+    {
+        _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr");
+        return __str_find_last_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, __n);
+    }
+
+    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
+    size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const
+    {
+        _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): received nullptr");
+        return __str_find_last_not_of<value_type, size_type, traits_type, npos>
+            (data(), size(), __s, __pos, traits_type::length(__s));
+    }
 
 private:
-	const   value_type* __data;
-	size_type           __size;
+    const   value_type* __data;
+    size_type           __size;
 };
 
 
@@ -576,28 +576,28 @@ private:
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator==(basic_string_view<_CharT, _Traits> __lhs,
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	if ( __lhs.size() != __rhs.size()) return false;
-	return __lhs.compare(__rhs) == 0;
+    if ( __lhs.size() != __rhs.size()) return false;
+    return __lhs.compare(__rhs) == 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator==(basic_string_view<_CharT, _Traits> __lhs,
-				typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
+                typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
 {
-	if ( __lhs.size() != __rhs.size()) return false;
-	return __lhs.compare(__rhs) == 0;
+    if ( __lhs.size() != __rhs.size()) return false;
+    return __lhs.compare(__rhs) == 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator==(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	if ( __lhs.size() != __rhs.size()) return false;
-	return __lhs.compare(__rhs) == 0;
+    if ( __lhs.size() != __rhs.size()) return false;
+    return __lhs.compare(__rhs) == 0;
 }
 
 
@@ -606,29 +606,29 @@ template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	if ( __lhs.size() != __rhs.size())
-		return true;
-	return __lhs.compare(__rhs) != 0;
+    if ( __lhs.size() != __rhs.size())
+        return true;
+    return __lhs.compare(__rhs) != 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator!=(basic_string_view<_CharT, _Traits> __lhs,
-				typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
+                typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
 {
-	if ( __lhs.size() != __rhs.size())
-		return true;
-	return __lhs.compare(__rhs) != 0;
+    if ( __lhs.size() != __rhs.size())
+        return true;
+    return __lhs.compare(__rhs) != 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator!=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	if ( __lhs.size() != __rhs.size())
-		return true;
-	return __lhs.compare(__rhs) != 0;
+    if ( __lhs.size() != __rhs.size())
+        return true;
+    return __lhs.compare(__rhs) != 0;
 }
 
 
@@ -637,23 +637,23 @@ template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) < 0;
+    return __lhs.compare(__rhs) < 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator<(basic_string_view<_CharT, _Traits> __lhs,
-				typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
+                typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) < 0;
+    return __lhs.compare(__rhs) < 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator<(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) < 0;
+    return __lhs.compare(__rhs) < 0;
 }
 
 
@@ -662,23 +662,23 @@ template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator> (basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) > 0;
+    return __lhs.compare(__rhs) > 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator>(basic_string_view<_CharT, _Traits> __lhs,
-				typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
+                typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) > 0;
+    return __lhs.compare(__rhs) > 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator>(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) > 0;
+    return __lhs.compare(__rhs) > 0;
 }
 
 
@@ -687,23 +687,23 @@ template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) <= 0;
+    return __lhs.compare(__rhs) <= 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator<=(basic_string_view<_CharT, _Traits> __lhs,
-				typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
+                typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) <= 0;
+    return __lhs.compare(__rhs) <= 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator<=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) <= 0;
+    return __lhs.compare(__rhs) <= 0;
 }
 
 
@@ -712,24 +712,24 @@ template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) >= 0;
+    return __lhs.compare(__rhs) >= 0;
 }
 
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator>=(basic_string_view<_CharT, _Traits> __lhs,
-				typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
+                typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) >= 0;
+    return __lhs.compare(__rhs) >= 0;
 }
 
 template<class _CharT, class _Traits>
 _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
 bool operator>=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 
-				basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
+                basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT
 {
-	return __lhs.compare(__rhs) >= 0;
+    return __lhs.compare(__rhs) >= 0;
 }
 
 typedef basic_string_view<char>     string_view;

Added: libcxx/trunk/test/std/iterators/iterator.container/empty.array.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/iterators/iterator.container/empty.array.fail.cpp?rev=318328&view=auto
==============================================================================
--- libcxx/trunk/test/std/iterators/iterator.container/empty.array.fail.cpp (added)
+++ libcxx/trunk/test/std/iterators/iterator.container/empty.array.fail.cpp Wed Nov 15 12:02:27 2017
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     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>
+
+// <iterator>
+// template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept;
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8
+
+#include <vector>
+#include <iterator>
+
+#include "test_macros.h"
+
+int main ()
+{
+    int c[5];
+    std::empty(c);  // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}}
+}

Added: libcxx/trunk/test/std/iterators/iterator.container/empty.container.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/iterators/iterator.container/empty.container.fail.cpp?rev=318328&view=auto
==============================================================================
--- libcxx/trunk/test/std/iterators/iterator.container/empty.container.fail.cpp (added)
+++ libcxx/trunk/test/std/iterators/iterator.container/empty.container.fail.cpp Wed Nov 15 12:02:27 2017
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     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>
+
+// <iterator>
+// template <class C> constexpr auto empty(const C& c) -> decltype(c.empty());
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8
+
+#include <vector>
+#include <iterator>
+
+#include "test_macros.h"
+
+int main ()
+{
+    std::vector<int> c;
+    std::empty(c);  // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}}
+}

Added: libcxx/trunk/test/std/iterators/iterator.container/empty.initializer_list.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/iterators/iterator.container/empty.initializer_list.fail.cpp?rev=318328&view=auto
==============================================================================
--- libcxx/trunk/test/std/iterators/iterator.container/empty.initializer_list.fail.cpp (added)
+++ libcxx/trunk/test/std/iterators/iterator.container/empty.initializer_list.fail.cpp Wed Nov 15 12:02:27 2017
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     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>
+
+// <iterator>
+// template <class E> constexpr bool empty(initializer_list<E> il) noexcept;
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8
+
+#include <initializer_list>
+#include <iterator>
+
+#include "test_macros.h"
+
+int main ()
+{
+    std::initializer_list<int> c = { 4 };
+    std::empty(c);  // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}}
+}

Added: libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.fail.cpp?rev=318328&view=auto
==============================================================================
--- libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.fail.cpp (added)
+++ libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.fail.cpp Wed Nov 15 12:02:27 2017
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     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.
+//
+//===----------------------------------------------------------------------===//
+
+// <string>
+
+// class deque
+
+// bool empty() const noexcept;
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8
+
+#include <string>
+
+#include "test_macros.h"
+
+int main ()
+{
+    std::string c;
+    c.empty();  // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}}
+}

Modified: libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.pass.cpp?rev=318328&r1=318327&r2=318328&view=diff
==============================================================================
--- libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.pass.cpp (original)
+++ libcxx/trunk/test/std/strings/basic.string/string.capacity/empty.pass.cpp Wed Nov 15 12:02:27 2017
@@ -9,17 +9,19 @@
 
 // <string>
 
-// bool empty() const;
+// bool empty() const noexcept;
 
 #include <string>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 
 template <class S>
 void
 test(const S& s)
 {
+    ASSERT_NOEXCEPT(s.empty());
     assert(s.empty() == (s.size() == 0));
 }
 

Modified: libcxx/trunk/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp?rev=318328&r1=318327&r2=318328&view=diff
==============================================================================
--- libcxx/trunk/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp (original)
+++ libcxx/trunk/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp Wed Nov 15 12:02:27 2017
@@ -35,6 +35,10 @@ void test1 () {
 
     {
     SV sv1;
+    ASSERT_NOEXCEPT(sv1.size());
+    ASSERT_NOEXCEPT(sv1.empty());
+    ASSERT_NOEXCEPT(sv1.max_size());
+    ASSERT_NOEXCEPT(sv1.length());
     assert ( sv1.size() == 0 );
     assert ( sv1.empty());
     assert ( sv1.size() == sv1.length());

Added: libcxx/trunk/test/std/strings/string.view/string.view.capacity/empty.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/strings/string.view/string.view.capacity/empty.fail.cpp?rev=318328&view=auto
==============================================================================
--- libcxx/trunk/test/std/strings/string.view/string.view.capacity/empty.fail.cpp (added)
+++ libcxx/trunk/test/std/strings/string.view/string.view.capacity/empty.fail.cpp Wed Nov 15 12:02:27 2017
@@ -0,0 +1,28 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+//                     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.
+//
+//===----------------------------------------------------------------------===//
+
+// <string_view>
+
+// class string_view
+
+// bool empty() const noexcept;
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8
+
+#include <string_view>
+
+#include "test_macros.h"
+
+int main ()
+{
+    std::string_view c;
+    c.empty();  // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}}
+}




More information about the cfe-commits mailing list