diff --git a/libcxx/include/__iterator/access.h b/libcxx/include/__iterator/access.h index d42855f925487..c01d3fa2baa8d 100644 --- a/libcxx/include/__iterator/access.h +++ b/libcxx/include/__iterator/access.h @@ -20,47 +20,49 @@ _LIBCPP_BEGIN_NAMESPACE_STD template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* begin(_Tp (&__array)[_Np]) _NOEXCEPT { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* begin(_Tp (&__array)[_Np]) _NOEXCEPT { return __array; } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* end(_Tp (&__array)[_Np]) _NOEXCEPT { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Tp* end(_Tp (&__array)[_Np]) _NOEXCEPT { return __array + _Np; } #if !defined(_LIBCPP_CXX03_LANG) template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto begin(_Cp& __c) -> decltype(__c.begin()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto begin(_Cp& __c) -> decltype(__c.begin()) { return __c.begin(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto begin(const _Cp& __c) -> decltype(__c.begin()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto begin(const _Cp& __c) + -> decltype(__c.begin()) { return __c.begin(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto end(_Cp& __c) -> decltype(__c.end()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto end(_Cp& __c) -> decltype(__c.end()) { return __c.end(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto end(const _Cp& __c) -> decltype(__c.end()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto end(const _Cp& __c) -> decltype(__c.end()) { return __c.end(); } # if _LIBCPP_STD_VER >= 14 template -_LIBCPP_HIDE_FROM_ABI constexpr auto -cbegin(const _Cp& __c) noexcept(noexcept(std::begin(__c))) -> decltype(std::begin(__c)) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI constexpr auto cbegin(const _Cp& __c) noexcept(noexcept(std::begin(__c))) + -> decltype(std::begin(__c)) { return std::begin(__c); } template -_LIBCPP_HIDE_FROM_ABI constexpr auto cend(const _Cp& __c) noexcept(noexcept(std::end(__c))) -> decltype(std::end(__c)) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI constexpr auto cend(const _Cp& __c) noexcept(noexcept(std::end(__c))) + -> decltype(std::end(__c)) { return std::end(__c); } @@ -69,22 +71,22 @@ _LIBCPP_HIDE_FROM_ABI constexpr auto cend(const _Cp& __c) noexcept(noexcept(std: #else // defined(_LIBCPP_CXX03_LANG) template -_LIBCPP_HIDE_FROM_ABI typename _Cp::iterator begin(_Cp& __c) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI typename _Cp::iterator begin(_Cp& __c) { return __c.begin(); } template -_LIBCPP_HIDE_FROM_ABI typename _Cp::const_iterator begin(const _Cp& __c) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI typename _Cp::const_iterator begin(const _Cp& __c) { return __c.begin(); } template -_LIBCPP_HIDE_FROM_ABI typename _Cp::iterator end(_Cp& __c) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI typename _Cp::iterator end(_Cp& __c) { return __c.end(); } template -_LIBCPP_HIDE_FROM_ABI typename _Cp::const_iterator end(const _Cp& __c) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI typename _Cp::const_iterator end(const _Cp& __c) { return __c.end(); } diff --git a/libcxx/include/__iterator/back_insert_iterator.h b/libcxx/include/__iterator/back_insert_iterator.h index d051c08751d39..456653ab36f33 100644 --- a/libcxx/include/__iterator/back_insert_iterator.h +++ b/libcxx/include/__iterator/back_insert_iterator.h @@ -58,7 +58,9 @@ class back_insert_iterator return *this; } #endif // _LIBCPP_CXX03_LANG - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator*() { return *this; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator*() { + return *this; + } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator++() { return *this; } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator operator++(int) { return *this; } diff --git a/libcxx/include/__iterator/bounded_iter.h b/libcxx/include/__iterator/bounded_iter.h index d2a09061126bd..2698f9ebd1fec 100644 --- a/libcxx/include/__iterator/bounded_iter.h +++ b/libcxx/include/__iterator/bounded_iter.h @@ -265,7 +265,8 @@ struct __bounded_iter { }; template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bounded_iter<_It> __make_bounded_iter(_It __it, _It __begin, _It __end) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bounded_iter<_It> +__make_bounded_iter(_It __it, _It __begin, _It __end) { return __bounded_iter<_It>(std::move(__it), std::move(__begin), std::move(__end)); } @@ -280,7 +281,7 @@ struct pointer_traits<__bounded_iter<_Iterator> > { using element_type = typename pointer_traits<_Iterator>::element_type; using difference_type = typename pointer_traits<_Iterator>::difference_type; - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __it) _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __it) _NOEXCEPT { return std::__to_address(__it.__current_); } }; diff --git a/libcxx/include/__iterator/common_iterator.h b/libcxx/include/__iterator/common_iterator.h index a59063d245d9c..152ebdf55c788 100644 --- a/libcxx/include/__iterator/common_iterator.h +++ b/libcxx/include/__iterator/common_iterator.h @@ -111,7 +111,7 @@ class common_iterator { return *this; } - _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( std::holds_alternative<_Iter>(__hold_), "Attempted to dereference a non-dereferenceable common_iterator"); return *std::__unchecked_get<_Iter>(__hold_); @@ -237,7 +237,7 @@ class common_iterator { return std::__unchecked_get<_Sent>(__x.__hold_) - std::__unchecked_get<_I2>(__y.__hold_); } - _LIBCPP_HIDE_FROM_ABI friend constexpr decltype(auto) + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr decltype(auto) iter_move(const common_iterator& __i) noexcept(noexcept(ranges::iter_move(std::declval()))) requires input_iterator<_Iter> { diff --git a/libcxx/include/__iterator/counted_iterator.h b/libcxx/include/__iterator/counted_iterator.h index 65e178bc0cf21..211670d7ad91f 100644 --- a/libcxx/include/__iterator/counted_iterator.h +++ b/libcxx/include/__iterator/counted_iterator.h @@ -98,18 +98,18 @@ class counted_iterator return *this; } - _LIBCPP_HIDE_FROM_ABI constexpr const _Iter& base() const& noexcept { return __current_; } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr const _Iter& base() const& noexcept { return __current_; } - _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() && { return std::move(__current_); } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() && { return std::move(__current_); } - _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> count() const noexcept { return __count_; } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> count() const noexcept { return __count_; } - _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__count_ > 0, "Iterator is equal to or past end."); return *__current_; } - _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() const + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() const requires __dereferenceable { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__count_ > 0, "Iterator is equal to or past end."); @@ -169,13 +169,13 @@ class counted_iterator return __tmp; } - _LIBCPP_HIDE_FROM_ABI constexpr counted_iterator operator+(iter_difference_t<_Iter> __n) const + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr counted_iterator operator+(iter_difference_t<_Iter> __n) const requires random_access_iterator<_Iter> { return counted_iterator(__current_ + __n, __count_ - __n); } - _LIBCPP_HIDE_FROM_ABI friend constexpr counted_iterator + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr counted_iterator operator+(iter_difference_t<_Iter> __n, const counted_iterator& __x) requires random_access_iterator<_Iter> { @@ -191,24 +191,24 @@ class counted_iterator return *this; } - _LIBCPP_HIDE_FROM_ABI constexpr counted_iterator operator-(iter_difference_t<_Iter> __n) const + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr counted_iterator operator-(iter_difference_t<_Iter> __n) const requires random_access_iterator<_Iter> { return counted_iterator(__current_ - __n, __count_ + __n); } template _I2> - _LIBCPP_HIDE_FROM_ABI friend constexpr iter_difference_t<_I2> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr iter_difference_t<_I2> operator-(const counted_iterator& __lhs, const counted_iterator<_I2>& __rhs) { return __rhs.__count_ - __lhs.__count_; } - _LIBCPP_HIDE_FROM_ABI friend constexpr iter_difference_t<_Iter> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr iter_difference_t<_Iter> operator-(const counted_iterator& __lhs, default_sentinel_t) { return -__lhs.__count_; } - _LIBCPP_HIDE_FROM_ABI friend constexpr iter_difference_t<_Iter> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr iter_difference_t<_Iter> operator-(default_sentinel_t, const counted_iterator& __rhs) { return __rhs.__count_; } @@ -226,7 +226,7 @@ class counted_iterator return *this; } - _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator[](iter_difference_t<_Iter> __n) const + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator[](iter_difference_t<_Iter> __n) const requires random_access_iterator<_Iter> { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < __count_, "Subscript argument must be less than size."); @@ -249,7 +249,7 @@ class counted_iterator return __rhs.__count_ <=> __lhs.__count_; } - _LIBCPP_HIDE_FROM_ABI friend constexpr decltype(auto) + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr decltype(auto) iter_move(const counted_iterator& __i) noexcept(noexcept(ranges::iter_move(__i.__current_))) requires input_iterator<_Iter> { diff --git a/libcxx/include/__iterator/data.h b/libcxx/include/__iterator/data.h index 5f2624c2b819e..d1f32a795b70e 100644 --- a/libcxx/include/__iterator/data.h +++ b/libcxx/include/__iterator/data.h @@ -22,22 +22,24 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 17 template -constexpr _LIBCPP_HIDE_FROM_ABI auto data(_Cont& __c) noexcept(noexcept(__c.data())) -> decltype(__c.data()) { +[[nodiscard]] constexpr _LIBCPP_HIDE_FROM_ABI auto data(_Cont& __c) noexcept(noexcept(__c.data())) + -> decltype(__c.data()) { return __c.data(); } template -constexpr _LIBCPP_HIDE_FROM_ABI auto data(const _Cont& __c) noexcept(noexcept(__c.data())) -> decltype(__c.data()) { +[[nodiscard]] constexpr _LIBCPP_HIDE_FROM_ABI auto data(const _Cont& __c) noexcept(noexcept(__c.data())) + -> decltype(__c.data()) { return __c.data(); } template -_LIBCPP_HIDE_FROM_ABI constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { return __array; } template -_LIBCPP_HIDE_FROM_ABI constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); } diff --git a/libcxx/include/__iterator/distance.h b/libcxx/include/__iterator/distance.h index 1a9fbf27f776b..c7c4ff22d6e9f 100644 --- a/libcxx/include/__iterator/distance.h +++ b/libcxx/include/__iterator/distance.h @@ -67,7 +67,8 @@ __distance(_InputIter __first, _Sent __last) { } template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +typename iterator_traits<_InputIter>::difference_type distance(_InputIter __first, _InputIter __last) { return std::__distance(__first, __last); } @@ -80,12 +81,12 @@ namespace ranges { struct __distance { template _Sp> requires(!sized_sentinel_for<_Sp, _Ip>) - _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const { return std::__distance(std::move(__first), std::move(__last)); } template > _Sp> - _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip&& __first, _Sp __last) const { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip&& __first, _Sp __last) const { if constexpr (sized_sentinel_for<_Sp, __remove_cvref_t<_Ip>>) { return __last - __first; } else { @@ -94,7 +95,7 @@ struct __distance { } template - _LIBCPP_HIDE_FROM_ABI constexpr range_difference_t<_Rp> operator()(_Rp&& __r) const { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr range_difference_t<_Rp> operator()(_Rp&& __r) const { if constexpr (sized_range<_Rp>) { return static_cast>(ranges::size(__r)); } else { diff --git a/libcxx/include/__iterator/front_insert_iterator.h b/libcxx/include/__iterator/front_insert_iterator.h index 2ab5383a1d91a..477f1c711256b 100644 --- a/libcxx/include/__iterator/front_insert_iterator.h +++ b/libcxx/include/__iterator/front_insert_iterator.h @@ -58,14 +58,16 @@ class front_insert_iterator return *this; } #endif // _LIBCPP_CXX03_LANG - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator*() { return *this; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator*() { + return *this; + } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator++() { return *this; } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator operator++(int) { return *this; } }; _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(front_insert_iterator); template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator<_Container> +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator<_Container> front_inserter(_Container& __x) { return front_insert_iterator<_Container>(__x); } diff --git a/libcxx/include/__iterator/insert_iterator.h b/libcxx/include/__iterator/insert_iterator.h index 6a5818b478771..f70fe570722a0 100644 --- a/libcxx/include/__iterator/insert_iterator.h +++ b/libcxx/include/__iterator/insert_iterator.h @@ -71,13 +71,13 @@ class insert_iterator return *this; } #endif // _LIBCPP_CXX03_LANG - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator*() { return *this; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator*() { return *this; } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator++() { return *this; } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator++(int) { return *this; } }; template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator<_Container> +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator<_Container> inserter(_Container& __x, __insert_iterator_iter_t<_Container> __i) { return insert_iterator<_Container>(__x, __i); } diff --git a/libcxx/include/__iterator/istream_iterator.h b/libcxx/include/__iterator/istream_iterator.h index f4b13f09c7e2d..0b759eebfb00b 100644 --- a/libcxx/include/__iterator/istream_iterator.h +++ b/libcxx/include/__iterator/istream_iterator.h @@ -60,7 +60,7 @@ class istream_iterator // LWG3600 Changed the wording of the copy constructor. In libc++ this constructor // can still be trivial after this change. - _LIBCPP_HIDE_FROM_ABI const _Tp& operator*() const { return __value_; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI const _Tp& operator*() const { return __value_; } _LIBCPP_HIDE_FROM_ABI const _Tp* operator->() const { return std::addressof((operator*())); } _LIBCPP_HIDE_FROM_ABI istream_iterator& operator++() { if (!(*__in_stream_ >> __value_)) diff --git a/libcxx/include/__iterator/istreambuf_iterator.h b/libcxx/include/__iterator/istreambuf_iterator.h index 4fc87a84f0192..c554a05f6717c 100644 --- a/libcxx/include/__iterator/istreambuf_iterator.h +++ b/libcxx/include/__iterator/istreambuf_iterator.h @@ -73,14 +73,16 @@ class istreambuf_iterator _LIBCPP_HIDE_FROM_ABI istreambuf_iterator(streambuf_type* __s) _NOEXCEPT : __sbuf_(__s) {} _LIBCPP_HIDE_FROM_ABI istreambuf_iterator(const __proxy& __p) _NOEXCEPT : __sbuf_(__p.__sbuf_) {} - _LIBCPP_HIDE_FROM_ABI char_type operator*() const { return static_cast(__sbuf_->sgetc()); } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI char_type operator*() const { + return static_cast(__sbuf_->sgetc()); + } _LIBCPP_HIDE_FROM_ABI istreambuf_iterator& operator++() { __sbuf_->sbumpc(); return *this; } _LIBCPP_HIDE_FROM_ABI __proxy operator++(int) { return __proxy(__sbuf_->sbumpc(), __sbuf_); } - _LIBCPP_HIDE_FROM_ABI bool equal(const istreambuf_iterator& __b) const { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool equal(const istreambuf_iterator& __b) const { return __test_for_eof() == __b.__test_for_eof(); } diff --git a/libcxx/include/__iterator/iterator_with_data.h b/libcxx/include/__iterator/iterator_with_data.h index afdc0a4e12e21..c2fab647ef5ef 100644 --- a/libcxx/include/__iterator/iterator_with_data.h +++ b/libcxx/include/__iterator/iterator_with_data.h @@ -80,9 +80,9 @@ class __iterator_with_data { return __tmp; } - constexpr _LIBCPP_HIDE_FROM_ABI iter_reference_t<_Iterator> operator*() const { return *__iter_; } + [[nodiscard]] constexpr _LIBCPP_HIDE_FROM_ABI iter_reference_t<_Iterator> operator*() const { return *__iter_; } - _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iterator> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iterator> iter_move(const __iterator_with_data& __iter) noexcept(noexcept(ranges::iter_move(__iter.__iter_))) { return ranges::iter_move(__iter.__iter_); } diff --git a/libcxx/include/__iterator/move_iterator.h b/libcxx/include/__iterator/move_iterator.h index 2b64680a3474a..e5769e8cfbd2b 100644 --- a/libcxx/include/__iterator/move_iterator.h +++ b/libcxx/include/__iterator/move_iterator.h @@ -136,11 +136,11 @@ class move_iterator return *this; } - _LIBCPP_HIDE_FROM_ABI constexpr const _Iter& base() const& noexcept { return __current_; } - _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() && { return std::move(__current_); } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr const _Iter& base() const& noexcept { return __current_; } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() && { return std::move(__current_); } - _LIBCPP_HIDE_FROM_ABI constexpr reference operator*() const { return ranges::iter_move(__current_); } - _LIBCPP_HIDE_FROM_ABI constexpr reference operator[](difference_type __n) const { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference operator*() const { return ranges::iter_move(__current_); } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr reference operator[](difference_type __n) const { return ranges::iter_move(__current_ + __n); } @@ -169,12 +169,13 @@ class move_iterator return *this; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _Iter base() const { return __current_; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _Iter base() const { return __current_; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator*() const { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator*() const { return static_cast(*__current_); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator[](difference_type __n) const { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference + operator[](difference_type __n) const { return static_cast(__current_[__n]); } @@ -194,7 +195,8 @@ class move_iterator --__current_; return __tmp; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator operator+(difference_type __n) const { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator + operator+(difference_type __n) const { return move_iterator(__current_ + __n); } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator& operator+=(difference_type __n) { @@ -218,13 +220,13 @@ class move_iterator } template _Sent> - friend _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> + [[__nodiscard__]] friend _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> operator-(const move_sentinel<_Sent>& __x, const move_iterator& __y) { return __x.base() - __y.base(); } template _Sent> - friend _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> + [[__nodiscard__]] friend _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Iter> operator-(const move_iterator& __x, const move_sentinel<_Sent>& __y) { return __x.base() - __y.base(); } @@ -299,13 +301,14 @@ operator<=>(const move_iterator<_Iter1>& __x, #ifndef _LIBCPP_CXX03_LANG template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto -operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) -> decltype(__x.base() - __y.base()) { +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX17 auto operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) + -> decltype(__x.base() - __y.base()) { return __x.base() - __y.base(); } #else template -inline _LIBCPP_HIDE_FROM_ABI typename move_iterator<_Iter1>::difference_type +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI typename move_iterator<_Iter1>::difference_type operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() - __y.base(); } @@ -313,7 +316,7 @@ operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { #if _LIBCPP_STD_VER >= 20 template -inline _LIBCPP_HIDE_FROM_ABI constexpr move_iterator<_Iter> +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI constexpr move_iterator<_Iter> operator+(iter_difference_t<_Iter> __n, const move_iterator<_Iter>& __x) requires requires { { __x.base() + __n } -> same_as<_Iter>; @@ -323,7 +326,7 @@ operator+(iter_difference_t<_Iter> __n, const move_iterator<_Iter>& __x) } #else template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator<_Iter> +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator<_Iter> operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x) { return move_iterator<_Iter>(__x.base() + __n); } @@ -336,7 +339,8 @@ inline constexpr bool disable_sized_sentinel_for, move_ite #endif // _LIBCPP_STD_VER >= 20 template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator<_Iter> make_move_iterator(_Iter __i) { +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator<_Iter> make_move_iterator(_Iter __i) { return move_iterator<_Iter>(std::move(__i)); } diff --git a/libcxx/include/__iterator/move_sentinel.h b/libcxx/include/__iterator/move_sentinel.h index c77ca5f1a9142..b3d14ee3fdf6d 100644 --- a/libcxx/include/__iterator/move_sentinel.h +++ b/libcxx/include/__iterator/move_sentinel.h @@ -44,7 +44,7 @@ class move_sentinel { return *this; } - _LIBCPP_HIDE_FROM_ABI constexpr _Sent base() const { return __last_; } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Sent base() const { return __last_; } private: _Sent __last_ = _Sent(); diff --git a/libcxx/include/__iterator/ostream_iterator.h b/libcxx/include/__iterator/ostream_iterator.h index 64e79f010f64a..ba47fce95e845 100644 --- a/libcxx/include/__iterator/ostream_iterator.h +++ b/libcxx/include/__iterator/ostream_iterator.h @@ -59,7 +59,7 @@ class ostream_iterator return *this; } - _LIBCPP_HIDE_FROM_ABI ostream_iterator& operator*() { return *this; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI ostream_iterator& operator*() { return *this; } _LIBCPP_HIDE_FROM_ABI ostream_iterator& operator++() { return *this; } _LIBCPP_HIDE_FROM_ABI ostream_iterator& operator++(int) { return *this; } }; diff --git a/libcxx/include/__iterator/ostreambuf_iterator.h b/libcxx/include/__iterator/ostreambuf_iterator.h index 4a3b2fa024490..e2602bfc53ce6 100644 --- a/libcxx/include/__iterator/ostreambuf_iterator.h +++ b/libcxx/include/__iterator/ostreambuf_iterator.h @@ -54,10 +54,10 @@ class ostreambuf_iterator __sbuf_ = nullptr; return *this; } - _LIBCPP_HIDE_FROM_ABI ostreambuf_iterator& operator*() { return *this; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI ostreambuf_iterator& operator*() { return *this; } _LIBCPP_HIDE_FROM_ABI ostreambuf_iterator& operator++() { return *this; } _LIBCPP_HIDE_FROM_ABI ostreambuf_iterator& operator++(int) { return *this; } - _LIBCPP_HIDE_FROM_ABI bool failed() const _NOEXCEPT { return __sbuf_ == nullptr; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI bool failed() const _NOEXCEPT { return __sbuf_ == nullptr; } #if _LIBCPP_HAS_LOCALIZATION template diff --git a/libcxx/include/__iterator/reverse_access.h b/libcxx/include/__iterator/reverse_access.h index f6e60c3fb75b3..cd4e42a328270 100644 --- a/libcxx/include/__iterator/reverse_access.h +++ b/libcxx/include/__iterator/reverse_access.h @@ -23,52 +23,59 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 14 template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np]) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np]) { return reverse_iterator<_Tp*>(__array + _Np); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np]) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np]) { return reverse_iterator<_Tp*>(__array); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rbegin(initializer_list<_Ep> __il) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator +rbegin(initializer_list<_Ep> __il) { return reverse_iterator(__il.end()); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rend(initializer_list<_Ep> __il) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator +rend(initializer_list<_Ep> __il) { return reverse_iterator(__il.begin()); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rbegin(_Cp& __c) -> decltype(__c.rbegin()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rbegin(_Cp& __c) -> decltype(__c.rbegin()) { return __c.rbegin(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rbegin(const _Cp& __c) -> decltype(__c.rbegin()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rbegin(const _Cp& __c) + -> decltype(__c.rbegin()) { return __c.rbegin(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rend(_Cp& __c) -> decltype(__c.rend()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rend(_Cp& __c) -> decltype(__c.rend()) { return __c.rend(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rend(const _Cp& __c) -> decltype(__c.rend()) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto rend(const _Cp& __c) + -> decltype(__c.rend()) { return __c.rend(); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto crbegin(const _Cp& __c) -> decltype(std::rbegin(__c)) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto crbegin(const _Cp& __c) + -> decltype(std::rbegin(__c)) { return std::rbegin(__c); } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto crend(const _Cp& __c) -> decltype(std::rend(__c)) { +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto crend(const _Cp& __c) + -> decltype(std::rend(__c)) { return std::rend(__c); } diff --git a/libcxx/include/__iterator/reverse_iterator.h b/libcxx/include/__iterator/reverse_iterator.h index 834695dd16703..9076b6c69216b 100644 --- a/libcxx/include/__iterator/reverse_iterator.h +++ b/libcxx/include/__iterator/reverse_iterator.h @@ -121,7 +121,7 @@ class reverse_iterator return *this; } #endif - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _Iter base() const { return current; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _Iter base() const { return current; } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator*() const { _Iter __tmp = current; return *--__tmp; @@ -161,7 +161,8 @@ class reverse_iterator ++current; return __tmp; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator operator+(difference_type __n) const { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator + operator+(difference_type __n) const { return reverse_iterator(current - __n); } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator& operator+=(difference_type __n) { @@ -175,11 +176,13 @@ class reverse_iterator current += __n; return *this; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator[](difference_type __n) const { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference + operator[](difference_type __n) const { return *(*this + __n); } #if _LIBCPP_STD_VER >= 20 + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iter> iter_move(const reverse_iterator& __i) noexcept( is_nothrow_copy_constructible_v<_Iter> && noexcept(ranges::iter_move(--std::declval<_Iter&>()))) { auto __tmp = __i.base(); @@ -280,21 +283,21 @@ operator<=>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& #ifndef _LIBCPP_CXX03_LANG template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 auto -operator-(const reverse_iterator<_Iter1>& __x, - const reverse_iterator<_Iter2>& __y) -> decltype(__y.base() - __x.base()) { +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX17 auto operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) + -> decltype(__y.base() - __x.base()) { return __y.base() - __x.base(); } #else template -inline _LIBCPP_HIDE_FROM_ABI typename reverse_iterator<_Iter1>::difference_type +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI typename reverse_iterator<_Iter1>::difference_type operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __y.base() - __x.base(); } #endif template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Iter> +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Iter> operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x) { return reverse_iterator<_Iter>(__x.base() - __n); } @@ -307,7 +310,8 @@ inline constexpr bool disable_sized_sentinel_for, rever #if _LIBCPP_STD_VER >= 14 template -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) { +[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) { return reverse_iterator<_Iter>(__i); } #endif diff --git a/libcxx/include/__iterator/size.h b/libcxx/include/__iterator/size.h index 84e2e3b21f1d5..e9a0f7627c0fb 100644 --- a/libcxx/include/__iterator/size.h +++ b/libcxx/include/__iterator/size.h @@ -25,20 +25,21 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 17 template +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto size(const _Cont& __c) noexcept(noexcept(__c.size())) -> decltype(__c.size()) { return __c.size(); } template -_LIBCPP_HIDE_FROM_ABI constexpr size_t size(const _Tp (&)[_Sz]) noexcept { +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr size_t size(const _Tp (&)[_Sz]) noexcept { return _Sz; } # if _LIBCPP_STD_VER >= 20 template -_LIBCPP_HIDE_FROM_ABI constexpr auto -ssize(const _Cont& __c) noexcept(noexcept(static_cast>>( - __c.size()))) -> common_type_t> { +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto ssize(const _Cont& __c) noexcept( + noexcept(static_cast>>(__c.size()))) + -> common_type_t> { return static_cast>>(__c.size()); } @@ -47,7 +48,7 @@ ssize(const _Cont& __c) noexcept(noexcept(static_cast -_LIBCPP_HIDE_FROM_ABI constexpr ptrdiff_t ssize(const _Tp (&)[_Sz]) noexcept { +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr ptrdiff_t ssize(const _Tp (&)[_Sz]) noexcept { return _Sz; } _LIBCPP_DIAGNOSTIC_POP diff --git a/libcxx/include/__iterator/static_bounded_iter.h b/libcxx/include/__iterator/static_bounded_iter.h index d8fc7d185e7bc..daf90a9e849e0 100644 --- a/libcxx/include/__iterator/static_bounded_iter.h +++ b/libcxx/include/__iterator/static_bounded_iter.h @@ -128,7 +128,7 @@ struct __static_bounded_iter { public: // Dereference and indexing operations. - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator*() const _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator*() const _NOEXCEPT { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( __current() != __end(), "__static_bounded_iter::operator*: Attempt to dereference an iterator at the end"); return *__current(); @@ -140,7 +140,8 @@ struct __static_bounded_iter { return std::__to_address(__current()); } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator[](difference_type __n) const _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference + operator[](difference_type __n) const _NOEXCEPT { _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( __n >= __begin() - __current(), "__static_bounded_iter::operator[]: Attempt to index an iterator past the start"); @@ -186,13 +187,13 @@ struct __static_bounded_iter { __current() += __n; return *this; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __static_bounded_iter + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __static_bounded_iter operator+(__static_bounded_iter const& __self, difference_type __n) _NOEXCEPT { __static_bounded_iter __tmp(__self); __tmp += __n; return __tmp; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __static_bounded_iter + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __static_bounded_iter operator+(difference_type __n, __static_bounded_iter const& __self) _NOEXCEPT { __static_bounded_iter __tmp(__self); __tmp += __n; @@ -208,13 +209,13 @@ struct __static_bounded_iter { __current() -= __n; return *this; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __static_bounded_iter + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __static_bounded_iter operator-(__static_bounded_iter const& __self, difference_type __n) _NOEXCEPT { __static_bounded_iter __tmp(__self); __tmp -= __n; return __tmp; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend difference_type + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend difference_type operator-(__static_bounded_iter const& __x, __static_bounded_iter const& __y) _NOEXCEPT { return __x.__current() - __y.__current(); } @@ -290,7 +291,7 @@ struct __static_bounded_iter { }; template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __static_bounded_iter<_It, _Size> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __static_bounded_iter<_It, _Size> __make_static_bounded_iter(_It __it, _It __begin) { return __static_bounded_iter<_It, _Size>(std::move(__it), std::move(__begin)); } @@ -306,7 +307,7 @@ struct pointer_traits<__static_bounded_iter<_Iterator, _Size> > { using element_type = typename pointer_traits<_Iterator>::element_type; using difference_type = typename pointer_traits<_Iterator>::difference_type; - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __it) _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __it) _NOEXCEPT { return std::__to_address(__it.__current()); } }; diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h index 98745f600a6ec..76b762481cdd1 100644 --- a/libcxx/include/__iterator/wrap_iter.h +++ b/libcxx/include/__iterator/wrap_iter.h @@ -80,7 +80,8 @@ class __wrap_iter { --(*this); return __tmp; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter operator+(difference_type __n) const _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter + operator+(difference_type __n) const _NOEXCEPT { __wrap_iter __w(*this); __w += __n; return __w; @@ -89,7 +90,8 @@ class __wrap_iter { __i_ += __n; return *this; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter operator-(difference_type __n) const _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter + operator-(difference_type __n) const _NOEXCEPT { return *this + (-__n); } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter& operator-=(difference_type __n) _NOEXCEPT { @@ -100,7 +102,9 @@ class __wrap_iter { return __i_[__n]; } - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 iterator_type base() const _NOEXCEPT { return __i_; } + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 iterator_type base() const _NOEXCEPT { + return __i_; + } private: _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit __wrap_iter(iterator_type __x) _NOEXCEPT : __i_(__x) {} @@ -212,11 +216,10 @@ operator<=>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) noex #endif // _LIBCPP_STD_VER >= 20 template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 #ifndef _LIBCPP_CXX03_LANG - auto - operator-(const __wrap_iter<_Iter1>& __x, - const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.base() - __y.base()) +auto operator-(const __wrap_iter<_Iter1>& __x, + const __wrap_iter<_Iter2>& __y) _NOEXCEPT->decltype(__x.base() - __y.base()) #else typename __wrap_iter<_Iter1>::difference_type operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT @@ -226,7 +229,7 @@ operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXC } template -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter<_Iter1> +[[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __wrap_iter<_Iter1> operator+(typename __wrap_iter<_Iter1>::difference_type __n, __wrap_iter<_Iter1> __x) _NOEXCEPT { __x += __n; return __x; @@ -243,7 +246,7 @@ struct pointer_traits<__wrap_iter<_It> > { typedef typename pointer_traits<_It>::element_type element_type; typedef typename pointer_traits<_It>::difference_type difference_type; - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __w) _NOEXCEPT { + [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __w) _NOEXCEPT { return std::__to_address(__w.base()); } }; diff --git a/libcxx/test/libcxx/diagnostics/iterator.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/iterator.nodiscard.verify.cpp index c7cd2f5ce5767..aedffa6a6327f 100644 --- a/libcxx/test/libcxx/diagnostics/iterator.nodiscard.verify.cpp +++ b/libcxx/test/libcxx/diagnostics/iterator.nodiscard.verify.cpp @@ -6,33 +6,351 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14 - // check that functions are marked [[nodiscard]] -// clang-format off - +#include #include +#include #include #include "test_macros.h" +#include "test_iterators.h" void test() { - std::vector container; - int c_array[] = {1, 2, 3}; - std::initializer_list initializer_list; - - std::empty(container); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::empty(c_array); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::empty(initializer_list); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::prev(c_array); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::next(c_array); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} -#if TEST_STD_VER >= 20 - std::ranges::prev(c_array); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::ranges::prev(container.end(), 2); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::ranges::next(container.end(), 2, container.begin()); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::ranges::next(c_array); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::ranges::next(container.begin(), 2); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} - std::ranges::next(container.end(), 1, container.end()); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}} + int cArr[] = {94, 82, 49}; + std::vector cont; + const std::vector cCont; +#if TEST_STD_VER >= 11 + std::initializer_list il; +#endif +#if !defined(TEST_HAS_NO_LOCALIZATION) + std::stringstream ss; +#endif + + { // Access + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::begin(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::end(cArr); + +#if TEST_STD_VER >= 11 + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::begin(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::begin(cCont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::end(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::end(cCont); +#endif +#if TEST_STD_VER >= 14 + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::cbegin(cCont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::cend(cCont); +#endif + } + + { + std::back_insert_iterator > it(cont); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + } + + { // __bounded_iter + std::__bounded_iter it; + std::pointer_traits > pt; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + pt.to_address(it); + } + +#if TEST_STD_VER >= 20 + { + std::common_iterator> it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + } +#endif + +#if TEST_STD_VER >= 20 + { + std::counted_iterator it{random_access_iterator{cArr}, 3}; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it.base(); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::move(it).base(); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it.count(); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *std::as_const(it); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it + 2; + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + 2 + it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it - 2; + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it - it; + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it - std::default_sentinel; + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::default_sentinel - it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it[2]; + } +#endif + +#if TEST_STD_VER >= 17 + { + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::data(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::data(cCont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::data(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::data(il); + } +#endif + + { + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::distance(cont.begin(), cont.end()); +#if TEST_STD_VER >= 20 + cpp17_input_iterator it{cArr}; + sentinel_wrapper> st; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::distance(it, st); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::distance(cont.begin(), cont.end()); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::distance(std::move(cont)); +#endif + } + +#if TEST_STD_VER >= 17 + { // Empty + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::empty(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::empty(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::empty(il); + } +#endif + + { + std::front_insert_iterator > it(cont); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::front_inserter(cont); + } + + { + std::insert_iterator > it(cont, cont.begin()); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::inserter(cont, cont.begin()); + } + + { + std::istream_iterator it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + } + +#if !defined(TEST_HAS_NO_LOCALIZATION) + { + std::istreambuf_iterator it(ss); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + } +#endif + +#if TEST_STD_VER >= 20 + { // TODO + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::iter_move(cont.begin()); + } #endif + +#if TEST_STD_VER >= 20 + { + std::__iterator_with_data, int> it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + } +#endif + +#if TEST_STD_VER >= 11 + { // TODO + std::move_iterator it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it.base(); + + int* i = nullptr; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::make_move_iterator(i); + } +#endif + +#if TEST_STD_VER >= 20 + { + std::move_sentinel st; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + st.base(); + } +#endif + + { + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::next(cArr); + +#if TEST_STD_VER >= 20 + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::next(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::next(cont.begin(), 2); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::next(cont.begin(), cont.end()); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::next(cont.begin(), 2, cont.end()); +#endif + } + +#if !defined(TEST_HAS_NO_LOCALIZATION) + { + std::ostream_iterator it(ss); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + } +#endif + +#if !defined(TEST_HAS_NO_LOCALIZATION) + { + std::ostreambuf_iterator it(ss); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it.failed(); + } +#endif + + { + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::prev(cArr, 2); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::prev(cArr); + +#if TEST_STD_VER >= 20 + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::prev(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::prev(cont.end(), 2); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::ranges::prev(cont.end(), 2, cont.begin()); +#endif + } + +#if TEST_STD_VER >= 14 + { + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rbegin(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rend(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rbegin(il); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rend(il); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rbegin(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rbegin(cCont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rend(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::rend(cCont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::crbegin(cCont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::crend(cCont); + } +#endif + + { // TODO + std::reverse_iterator > it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it.base(); + +#if TEST_STD_VER >= 14 + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::make_reverse_iterator(cont.end()); +#endif + } + +#if TEST_STD_VER >= 17 + { + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::size(cArr); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::size(cont); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::size(cCont); + } +#endif + + { // TODO + std::__static_bounded_iter::iterator, 94 > it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + *it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::__make_static_bounded_iter<82>(cont.begin(), cont.begin()); + + std::pointer_traits::iterator, 94> > pt; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + pt.to_address(it); + } + + { // TODO + std::__wrap_iter::iterator > it; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + it.base(); + + std::pointer_traits::iterator> > pt; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + pt.to_address(it); + } }