[libc++][flat_map] Applied [[nodiscard]] (#169453)
`[[nodiscard]]` should be applied to functions where discarding the return value is most likely a correctness issue. - https://libcxx.llvm.org/CodingGuidelines.html#apply-nodiscard-where-relevant
This commit is contained in:
parent
cec837e3e0
commit
bbb8f7aaf8
4 changed files with 153 additions and 51 deletions
|
|
@ -409,41 +409,45 @@ public:
|
|||
}
|
||||
|
||||
// iterators
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator begin() noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator begin() noexcept {
|
||||
return iterator(__containers_.keys.begin(), __containers_.values.begin());
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator begin() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator begin() const noexcept {
|
||||
return const_iterator(__containers_.keys.begin(), __containers_.values.begin());
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator end() noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator end() noexcept {
|
||||
return iterator(__containers_.keys.end(), __containers_.values.end());
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator end() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator end() const noexcept {
|
||||
return const_iterator(__containers_.keys.end(), __containers_.values.end());
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 reverse_iterator rbegin() noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 reverse_iterator rbegin() noexcept {
|
||||
return reverse_iterator(end());
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator rbegin() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator rbegin() const noexcept {
|
||||
return const_reverse_iterator(end());
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 reverse_iterator rend() noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 reverse_iterator rend() noexcept {
|
||||
return reverse_iterator(begin());
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator rend() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator rend() const noexcept {
|
||||
return const_reverse_iterator(begin());
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator cbegin() const noexcept { return begin(); }
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator cend() const noexcept { return end(); }
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator crbegin() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator cbegin() const noexcept {
|
||||
return begin();
|
||||
}
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator cend() const noexcept {
|
||||
return end();
|
||||
}
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator crbegin() const noexcept {
|
||||
return const_reverse_iterator(end());
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator crend() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_reverse_iterator crend() const noexcept {
|
||||
return const_reverse_iterator(begin());
|
||||
}
|
||||
|
||||
|
|
@ -452,22 +456,22 @@ public:
|
|||
return __containers_.keys.empty();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type size() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type size() const noexcept {
|
||||
return __containers_.keys.size();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type max_size() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type max_size() const noexcept {
|
||||
return std::min<size_type>(__containers_.keys.max_size(), __containers_.values.max_size());
|
||||
}
|
||||
|
||||
// [flat.map.access], element access
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& operator[](const key_type& __x)
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& operator[](const key_type& __x)
|
||||
requires is_constructible_v<mapped_type>
|
||||
{
|
||||
return try_emplace(__x).first->second;
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& operator[](key_type&& __x)
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& operator[](key_type&& __x)
|
||||
requires is_constructible_v<mapped_type>
|
||||
{
|
||||
return try_emplace(std::move(__x)).first->second;
|
||||
|
|
@ -476,11 +480,11 @@ public:
|
|||
template <class _Kp>
|
||||
requires(__is_compare_transparent && is_constructible_v<key_type, _Kp> && is_constructible_v<mapped_type> &&
|
||||
!is_convertible_v<_Kp &&, const_iterator> && !is_convertible_v<_Kp &&, iterator>)
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& operator[](_Kp&& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& operator[](_Kp&& __x) {
|
||||
return try_emplace(std::forward<_Kp>(__x)).first->second;
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& at(const key_type& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& at(const key_type& __x) {
|
||||
auto __it = find(__x);
|
||||
if (__it == end()) {
|
||||
std::__throw_out_of_range("flat_map::at(const key_type&): Key does not exist");
|
||||
|
|
@ -488,7 +492,7 @@ public:
|
|||
return __it->second;
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const mapped_type& at(const key_type& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const mapped_type& at(const key_type& __x) const {
|
||||
auto __it = find(__x);
|
||||
if (__it == end()) {
|
||||
std::__throw_out_of_range("flat_map::at(const key_type&) const: Key does not exist");
|
||||
|
|
@ -498,7 +502,7 @@ public:
|
|||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& at(const _Kp& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 mapped_type& at(const _Kp& __x) {
|
||||
auto __it = find(__x);
|
||||
if (__it == end()) {
|
||||
std::__throw_out_of_range("flat_map::at(const K&): Key does not exist");
|
||||
|
|
@ -508,7 +512,7 @@ public:
|
|||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const mapped_type& at(const _Kp& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const mapped_type& at(const _Kp& __x) const {
|
||||
auto __it = find(__x);
|
||||
if (__it == end()) {
|
||||
std::__throw_out_of_range("flat_map::at(const K&) const: Key does not exist");
|
||||
|
|
@ -596,7 +600,7 @@ public:
|
|||
insert(sorted_unique, __il.begin(), __il.end());
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 containers extract() && {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 containers extract() && {
|
||||
auto __guard = std::__make_scope_guard([&]() noexcept { clear() /* noexcept */; });
|
||||
auto __ret = std::move(__containers_);
|
||||
return __ret;
|
||||
|
|
@ -753,116 +757,121 @@ public:
|
|||
}
|
||||
|
||||
// observers
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 key_compare key_comp() const { return __compare_; }
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 value_compare value_comp() const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 key_compare key_comp() const { return __compare_; }
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 value_compare value_comp() const {
|
||||
return value_compare(__compare_);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const key_container_type& keys() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const key_container_type& keys() const noexcept {
|
||||
return __containers_.keys;
|
||||
}
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const mapped_container_type& values() const noexcept {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const mapped_container_type&
|
||||
values() const noexcept {
|
||||
return __containers_.values;
|
||||
}
|
||||
|
||||
// map operations
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator find(const key_type& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator find(const key_type& __x) {
|
||||
return __find_impl(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator find(const key_type& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator find(const key_type& __x) const {
|
||||
return __find_impl(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator find(const _Kp& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator find(const _Kp& __x) {
|
||||
return __find_impl(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator find(const _Kp& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator find(const _Kp& __x) const {
|
||||
return __find_impl(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type count(const key_type& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type count(const key_type& __x) const {
|
||||
return contains(__x) ? 1 : 0;
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type count(const _Kp& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 size_type count(const _Kp& __x) const {
|
||||
return contains(__x) ? 1 : 0;
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool contains(const key_type& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool contains(const key_type& __x) const {
|
||||
return find(__x) != end();
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool contains(const _Kp& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool contains(const _Kp& __x) const {
|
||||
return find(__x) != end();
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator lower_bound(const key_type& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator lower_bound(const key_type& __x) {
|
||||
return __lower_bound<iterator>(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator lower_bound(const key_type& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator
|
||||
lower_bound(const key_type& __x) const {
|
||||
return __lower_bound<const_iterator>(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator lower_bound(const _Kp& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator lower_bound(const _Kp& __x) {
|
||||
return __lower_bound<iterator>(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator lower_bound(const _Kp& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator lower_bound(const _Kp& __x) const {
|
||||
return __lower_bound<const_iterator>(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator upper_bound(const key_type& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator upper_bound(const key_type& __x) {
|
||||
return __upper_bound<iterator>(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator upper_bound(const key_type& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator
|
||||
upper_bound(const key_type& __x) const {
|
||||
return __upper_bound<const_iterator>(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator upper_bound(const _Kp& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 iterator upper_bound(const _Kp& __x) {
|
||||
return __upper_bound<iterator>(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator upper_bound(const _Kp& __x) const {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const_iterator upper_bound(const _Kp& __x) const {
|
||||
return __upper_bound<const_iterator>(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<iterator, iterator> equal_range(const key_type& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<iterator, iterator>
|
||||
equal_range(const key_type& __x) {
|
||||
return __equal_range_impl(*this, __x);
|
||||
}
|
||||
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<const_iterator, const_iterator>
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<const_iterator, const_iterator>
|
||||
equal_range(const key_type& __x) const {
|
||||
return __equal_range_impl(*this, __x);
|
||||
}
|
||||
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<iterator, iterator> equal_range(const _Kp& __x) {
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<iterator, iterator>
|
||||
equal_range(const _Kp& __x) {
|
||||
return __equal_range_impl(*this, __x);
|
||||
}
|
||||
template <class _Kp>
|
||||
requires __is_compare_transparent
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<const_iterator, const_iterator>
|
||||
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 pair<const_iterator, const_iterator>
|
||||
equal_range(const _Kp& __x) const {
|
||||
return __equal_range_impl(*this, __x);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include <__utility/exception_guard.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <__utility/move.h>
|
||||
#include <__vector/container_traits.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
|
|
|
|||
|
|
@ -6,15 +6,107 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
|
||||
// REQUIRES: std-at-least-c++23
|
||||
|
||||
// <flat_map>
|
||||
|
||||
// [[nodiscard]] bool empty() const noexcept;
|
||||
|
||||
#include <flat_map>
|
||||
#include <utility>
|
||||
|
||||
void f() {
|
||||
std::flat_map<int, int> c;
|
||||
c.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
template <typename T>
|
||||
struct TransparentKey {
|
||||
T t;
|
||||
|
||||
constexpr explicit operator T() const { return t; }
|
||||
};
|
||||
|
||||
struct TransparentCompare {
|
||||
using is_transparent = void; // This makes the comparator transparent
|
||||
|
||||
template <typename T>
|
||||
constexpr bool operator()(const T& t, const TransparentKey<T>& transparent) const {
|
||||
return t < transparent.t;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
constexpr bool operator()(const TransparentKey<T>& transparent, const T& t) const {
|
||||
return transparent.t < t;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
constexpr bool operator()(const T& t1, const T& t2) const {
|
||||
return t1 < t2;
|
||||
}
|
||||
};
|
||||
|
||||
void test() {
|
||||
std::flat_map<int, int, TransparentCompare> fm;
|
||||
const std::flat_map<int, int, TransparentCompare> cfm{};
|
||||
|
||||
fm.begin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.begin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.end(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.end(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.rbegin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.rbegin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.rend(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.rend(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.cbegin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.cend(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.crbegin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.crend(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.empty(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.size(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.max_size(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
int key = 0;
|
||||
TransparentKey<int> tkey;
|
||||
|
||||
std::flat_map<int, int> nfm;
|
||||
nfm[key]; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm[std::move(key)]; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm[std::move(tkey)]; // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.at(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.at(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.at(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.at(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
std::move(fm).extract(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.key_comp(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.value_comp(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.keys(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.values(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.find(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.find(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.find(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.find(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.count(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.count(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.contains(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.contains(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.contains(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.contains(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.lower_bound(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.lower_bound(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.lower_bound(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.lower_bound(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.upper_bound(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.upper_bound(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.upper_bound(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.upper_bound(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
|
||||
fm.equal_range(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.equal_range(key); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
fm.equal_range(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
cfm.equal_range(tkey); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ constexpr bool test() {
|
|||
TransparentComparator c(transparent_used);
|
||||
std::flat_map<int, int, TransparentComparator> m(std::sorted_unique, {{1, 1}, {2, 2}, {3, 3}}, c);
|
||||
assert(!transparent_used);
|
||||
m[ConvertibleTransparent<int>{3}];
|
||||
(void)m[ConvertibleTransparent<int>{3}];
|
||||
assert(transparent_used);
|
||||
}
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue