Skip to content

[libc++] Remove _LIBCPP_DISABLE_NODISCARD_EXTENSIONS and refactor the tests #87094

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 22, 2024

Conversation

philnik777
Copy link
Contributor

This also adds a few tests that were missing.

Copy link

github-actions bot commented Mar 29, 2024

✅ With the latest revision this PR passed the C/C++ code formatter.

@philnik777 philnik777 force-pushed the users/philnik777/remove_nodiscard_ext branch 2 times, most recently from 7d41f42 to f613f5b Compare April 1, 2024 07:03
@ldionne ldionne marked this pull request as ready for review April 4, 2024 16:24
@ldionne ldionne requested a review from a team as a code owner April 4, 2024 16:24
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Apr 4, 2024
@llvmbot
Copy link
Member

llvmbot commented Apr 4, 2024

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

Changes

This also adds a few tests that were missing.


Patch is 317.11 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/87094.diff

194 Files Affected:

  • (modified) libcxx/.clang-format (-1)
  • (modified) libcxx/docs/ReleaseNotes/19.rst (+2)
  • (modified) libcxx/docs/UsingLibcxx.rst (-25)
  • (modified) libcxx/include/__algorithm/adjacent_find.h (+3-3)
  • (modified) libcxx/include/__algorithm/all_of.h (+1-1)
  • (modified) libcxx/include/__algorithm/any_of.h (+1-1)
  • (modified) libcxx/include/__algorithm/binary_search.h (+2-2)
  • (modified) libcxx/include/__algorithm/clamp.h (+2-2)
  • (modified) libcxx/include/__algorithm/count.h (+1-1)
  • (modified) libcxx/include/__algorithm/count_if.h (+3-3)
  • (modified) libcxx/include/__algorithm/equal.h (+5-5)
  • (modified) libcxx/include/__algorithm/equal_range.h (+2-2)
  • (modified) libcxx/include/__algorithm/find.h (+1-1)
  • (modified) libcxx/include/__algorithm/find_end.h (+2-2)
  • (modified) libcxx/include/__algorithm/find_first_of.h (+2-2)
  • (modified) libcxx/include/__algorithm/find_if.h (+1-1)
  • (modified) libcxx/include/__algorithm/find_if_not.h (+1-1)
  • (modified) libcxx/include/__algorithm/fold.h (+4-6)
  • (modified) libcxx/include/__algorithm/includes.h (+2-2)
  • (modified) libcxx/include/__algorithm/is_heap.h (+2-2)
  • (modified) libcxx/include/__algorithm/is_heap_until.h (+2-2)
  • (modified) libcxx/include/__algorithm/is_partitioned.h (+1-1)
  • (modified) libcxx/include/__algorithm/is_permutation.h (+5-5)
  • (modified) libcxx/include/__algorithm/is_sorted.h (+2-2)
  • (modified) libcxx/include/__algorithm/is_sorted_until.h (+2-2)
  • (modified) libcxx/include/__algorithm/lexicographical_compare.h (+2-2)
  • (modified) libcxx/include/__algorithm/lexicographical_compare_three_way.h (+2-2)
  • (modified) libcxx/include/__algorithm/lower_bound.h (+2-2)
  • (modified) libcxx/include/__algorithm/max.h (+4-4)
  • (modified) libcxx/include/__algorithm/max_element.h (+2-2)
  • (modified) libcxx/include/__algorithm/min.h (+4-4)
  • (modified) libcxx/include/__algorithm/min_element.h (+2-2)
  • (modified) libcxx/include/__algorithm/minmax.h (+4-4)
  • (modified) libcxx/include/__algorithm/minmax_element.h (+3-4)
  • (modified) libcxx/include/__algorithm/mismatch.h (+4-4)
  • (modified) libcxx/include/__algorithm/none_of.h (+1-1)
  • (modified) libcxx/include/__algorithm/pstl_any_all_none_of.h (+3-3)
  • (modified) libcxx/include/__algorithm/pstl_is_partitioned.h (+1-1)
  • (modified) libcxx/include/__algorithm/ranges_adjacent_find.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_all_of.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_any_of.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_binary_search.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_clamp.h (+1-1)
  • (modified) libcxx/include/__algorithm/ranges_contains.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_contains_subrange.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_count.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_count_if.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_ends_with.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_equal.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_equal_range.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_find.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_find_end.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_find_first_of.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_find_if.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_find_if_not.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_includes.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_is_heap.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_is_heap_until.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_is_partitioned.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_is_permutation.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_is_sorted.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_is_sorted_until.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_lexicographical_compare.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_lower_bound.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_max.h (+3-3)
  • (modified) libcxx/include/__algorithm/ranges_max_element.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_min.h (+3-3)
  • (modified) libcxx/include/__algorithm/ranges_min_element.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_minmax.h (+3-3)
  • (modified) libcxx/include/__algorithm/ranges_minmax_element.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_mismatch.h (+2-3)
  • (modified) libcxx/include/__algorithm/ranges_none_of.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_remove.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_remove_if.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_search.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_search_n.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_starts_with.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_unique.h (+2-2)
  • (modified) libcxx/include/__algorithm/ranges_upper_bound.h (+2-2)
  • (modified) libcxx/include/__algorithm/remove.h (+1-1)
  • (modified) libcxx/include/__algorithm/remove_if.h (+1-1)
  • (modified) libcxx/include/__algorithm/search.h (+3-3)
  • (modified) libcxx/include/__algorithm/search_n.h (+2-2)
  • (modified) libcxx/include/__algorithm/unique.h (+3-3)
  • (modified) libcxx/include/__algorithm/upper_bound.h (+2-2)
  • (modified) libcxx/include/__bit/bit_cast.h (+2-2)
  • (modified) libcxx/include/__bit/bit_ceil.h (+2-2)
  • (modified) libcxx/include/__bit/bit_floor.h (+1-1)
  • (modified) libcxx/include/__bit/bit_width.h (+1-1)
  • (modified) libcxx/include/__bit/byteswap.h (+1-1)
  • (modified) libcxx/include/__bit/countl.h (+2-2)
  • (modified) libcxx/include/__bit/countr.h (+2-2)
  • (modified) libcxx/include/__bit/has_single_bit.h (+1-1)
  • (modified) libcxx/include/__bit/popcount.h (+1-1)
  • (modified) libcxx/include/__chrono/time_zone.h (+3-3)
  • (modified) libcxx/include/__chrono/time_zone_link.h (+5-5)
  • (modified) libcxx/include/__chrono/tzdb_list.h (+8-8)
  • (modified) libcxx/include/__config (-14)
  • (modified) libcxx/include/__filesystem/path.h (+1-1)
  • (modified) libcxx/include/__format/format_functions.h (+14-16)
  • (modified) libcxx/include/__functional/identity.h (+1-1)
  • (modified) libcxx/include/__iterator/empty.h (+4-4)
  • (modified) libcxx/include/__math/abs.h (+4-4)
  • (modified) libcxx/include/__math/copysign.h (+3-4)
  • (modified) libcxx/include/__math/min_max.h (+8-8)
  • (modified) libcxx/include/__math/roots.h (+4-4)
  • (modified) libcxx/include/__math/rounding_functions.h (+24-24)
  • (modified) libcxx/include/__math/traits.h (+23-23)
  • (modified) libcxx/include/__memory/allocator.h (+4-6)
  • (modified) libcxx/include/__memory/allocator_traits.h (+3-3)
  • (modified) libcxx/include/__memory/temporary_buffer.h (+1-1)
  • (modified) libcxx/include/__memory_resource/memory_resource.h (+2-3)
  • (modified) libcxx/include/__memory_resource/polymorphic_allocator.h (+1-1)
  • (modified) libcxx/include/__mutex/lock_guard.h (+3-3)
  • (modified) libcxx/include/__node_handle (+1-1)
  • (modified) libcxx/include/__ranges/as_rvalue_view.h (+2-2)
  • (modified) libcxx/include/__ranges/chunk_by_view.h (+2-2)
  • (modified) libcxx/include/__ranges/drop_view.h (+2-2)
  • (modified) libcxx/include/__ranges/repeat_view.h (+2-2)
  • (modified) libcxx/include/__ranges/split_view.h (+2-2)
  • (modified) libcxx/include/__ranges/take_view.h (+2-2)
  • (modified) libcxx/include/__ranges/to.h (+4-4)
  • (modified) libcxx/include/__utility/as_const.h (+1-1)
  • (modified) libcxx/include/__utility/forward.h (+2-2)
  • (modified) libcxx/include/__utility/move.h (+2-2)
  • (modified) libcxx/include/__utility/to_underlying.h (+1-1)
  • (modified) libcxx/include/array (+2-2)
  • (modified) libcxx/include/cstddef (+1-1)
  • (modified) libcxx/include/deque (+1-1)
  • (modified) libcxx/include/forward_list (+1-1)
  • (modified) libcxx/include/future (+4-6)
  • (modified) libcxx/include/limits (+63-63)
  • (modified) libcxx/include/list (+1-1)
  • (modified) libcxx/include/map (+2-2)
  • (modified) libcxx/include/math.h (+4-4)
  • (modified) libcxx/include/new (+12-12)
  • (modified) libcxx/include/queue (+2-2)
  • (modified) libcxx/include/regex (+1-1)
  • (modified) libcxx/include/scoped_allocator (+2-2)
  • (modified) libcxx/include/set (+2-2)
  • (modified) libcxx/include/stack (+1-1)
  • (modified) libcxx/include/stdlib.h (+5-7)
  • (modified) libcxx/include/string (+1-1)
  • (modified) libcxx/include/string_view (+1-1)
  • (modified) libcxx/include/unordered_map (+2-2)
  • (modified) libcxx/include/unordered_set (+2-2)
  • (modified) libcxx/include/vector (+2-2)
  • (modified) libcxx/src/tzdb.cpp (+2-2)
  • (renamed) libcxx/test/libcxx/diagnostics/algorithm.nodiscard.verify.cpp (+95-65)
  • (added) libcxx/test/libcxx/diagnostics/array.nodiscard.verify.cpp (+23)
  • (renamed) libcxx/test/libcxx/diagnostics/bit.nodiscard.verify.cpp (+2)
  • (removed) libcxx/test/libcxx/diagnostics/bit.nodiscard_extensions.compile.pass.cpp (-34)
  • (renamed) libcxx/test/libcxx/diagnostics/chrono.nodiscard.verify.cpp ()
  • (removed) libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp (-54)
  • (renamed) libcxx/test/libcxx/diagnostics/cmath.nodiscard.verify.cpp (+2)
  • (renamed) libcxx/test/libcxx/diagnostics/cstddef.nodiscard.verify.cpp (+9-8)
  • (added) libcxx/test/libcxx/diagnostics/cstdlib.nodiscard.verify.cpp (+22)
  • (added) libcxx/test/libcxx/diagnostics/deque.nodiscard.verify.cpp (+18)
  • (added) libcxx/test/libcxx/diagnostics/filesystem.nodiscard.verify.cpp (+18)
  • (renamed) libcxx/test/libcxx/diagnostics/format.nodiscard.verify.cpp ()
  • (removed) libcxx/test/libcxx/diagnostics/format.nodiscard_extensions.compile.pass.cpp (-50)
  • (added) libcxx/test/libcxx/diagnostics/forward_list.nodiscard.verify.cpp (+18)
  • (renamed) libcxx/test/libcxx/diagnostics/functional.nodiscard.verify.cpp (+9-8)
  • (added) libcxx/test/libcxx/diagnostics/future.nodiscard.verify.cpp (+20)
  • (added) libcxx/test/libcxx/diagnostics/iterator.nodiscard.verify.cpp (+26)
  • (renamed) libcxx/test/libcxx/diagnostics/limits.nodiscard.verify.cpp ()
  • (removed) libcxx/test/libcxx/diagnostics/limits.nodiscard_extensions.compile.pass.cpp (-71)
  • (added) libcxx/test/libcxx/diagnostics/list.nodiscard.verify.cpp (+18)
  • (added) libcxx/test/libcxx/diagnostics/map.nodiscard.verify.cpp (+23)
  • (added) libcxx/test/libcxx/diagnostics/memory.nodiscard.verify.cpp (+53)
  • (added) libcxx/test/libcxx/diagnostics/memory_resource.nodiscard.verify.cpp (+25)
  • (added) libcxx/test/libcxx/diagnostics/mutex.nodiscard.verify.cpp (+23)
  • (added) libcxx/test/libcxx/diagnostics/new.nodiscard.verify.cpp (+33)
  • (renamed) libcxx/test/libcxx/diagnostics/node_handle.nodiscard.verify.cpp (+6-10)
  • (removed) libcxx/test/libcxx/diagnostics/nodiscard_extensions.compile.pass.cpp (-188)
  • (renamed) libcxx/test/libcxx/diagnostics/pstl.nodiscard.verify.cpp (+6-3)
  • (removed) libcxx/test/libcxx/diagnostics/pstl.nodiscard_extensions.compile.pass.cpp (-28)
  • (added) libcxx/test/libcxx/diagnostics/queue.nodiscard.verify.cpp (+23)
  • (added) libcxx/test/libcxx/diagnostics/ranges.nodiscard.verify.cpp (+55)
  • (removed) libcxx/test/libcxx/diagnostics/ranges.nodiscard_extensions.compile.pass.cpp (-101)
  • (removed) libcxx/test/libcxx/diagnostics/ranges.nodiscard_extensions.verify.cpp (-111)
  • (added) libcxx/test/libcxx/diagnostics/regex.nodiscard.verify.cpp (+18)
  • (added) libcxx/test/libcxx/diagnostics/scoped_allocator.nodiscard.verify.cpp (+22)
  • (added) libcxx/test/libcxx/diagnostics/set.nodiscard.verify.cpp (+23)
  • (added) libcxx/test/libcxx/diagnostics/stack.nodiscard.verify.cpp (+18)
  • (added) libcxx/test/libcxx/diagnostics/string.nodiscard.verify.cpp (+18)
  • (added) libcxx/test/libcxx/diagnostics/string_view.nodiscard.verify.cpp (+18)
  • (added) libcxx/test/libcxx/diagnostics/unordered_map.nodiscard.verify.cpp (+25)
  • (added) libcxx/test/libcxx/diagnostics/unordered_set.nodiscard.verify.cpp (+25)
  • (added) libcxx/test/libcxx/diagnostics/utility.nodiscard.verify.cpp (+35)
  • (added) libcxx/test/libcxx/diagnostics/vector.nodiscard.verify.cpp (+23)
  • (removed) libcxx/test/libcxx/diagnostics/view_adaptors.nodiscard_extensions.verify.cpp (-22)
  • (removed) libcxx/test/libcxx/ranges/range.adaptors/range.chunk.by/adaptor.nodiscard.verify.cpp (-26)
  • (removed) libcxx/test/libcxx/ranges/range.utility/range.utility.conv/to.nodiscard.verify.cpp (-29)
diff --git a/libcxx/.clang-format b/libcxx/.clang-format
index 39ae1322ffa8a6..b2ca452931fec5 100644
--- a/libcxx/.clang-format
+++ b/libcxx/.clang-format
@@ -43,7 +43,6 @@ AttributeMacros: [
                   '_LIBCPP_NO_SANITIZE',
                   '_LIBCPP_NO_UNIQUE_ADDRESS',
                   '_LIBCPP_NOALIAS',
-                  '_LIBCPP_NODISCARD_EXT',
                   '_LIBCPP_NODISCARD',
                   '_LIBCPP_NORETURN',
                   '_LIBCPP_OVERRIDABLE_FUNC_VIS',
diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst
index dd39c1bbbc78a3..3bb3b73ada931e 100644
--- a/libcxx/docs/ReleaseNotes/19.rst
+++ b/libcxx/docs/ReleaseNotes/19.rst
@@ -57,6 +57,8 @@ Improvements and New Features
 Deprecations and Removals
 -------------------------
 
+- ``_LIBCPP_DISABLE_NODISCARD_EXT`` has been removed. ``[[nodiscard]]`` applications are now unconditional.
+
 - TODO: The ``LIBCXX_ENABLE_ASSERTIONS`` CMake variable that was used to enable the safe mode has been deprecated and setting
   it triggers an error; use the ``LIBCXX_HARDENING_MODE`` CMake variable with the value ``extensive`` instead. Similarly,
   the ``_LIBCPP_ENABLE_ASSERTIONS`` macro has been deprecated (setting it to ``1`` still enables the extensive mode in
diff --git a/libcxx/docs/UsingLibcxx.rst b/libcxx/docs/UsingLibcxx.rst
index ac12b0b9695079..5276a7b99d932b 100644
--- a/libcxx/docs/UsingLibcxx.rst
+++ b/libcxx/docs/UsingLibcxx.rst
@@ -196,10 +196,6 @@ safety annotations.
   replacement scenarios from working, e.g. replacing `operator new` and
   expecting a non-replaced `operator new[]` to call the replaced `operator new`.
 
-**_LIBCPP_DISABLE_NODISCARD_EXT**:
-  This macro disables library-extensions of ``[[nodiscard]]``.
-  See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for more information.
-
 **_LIBCPP_DISABLE_DEPRECATION_WARNINGS**:
   This macro disables warnings when using deprecated components. For example,
   using `std::auto_ptr` when compiling in C++11 mode will normally trigger a
@@ -282,27 +278,6 @@ provided, and any information regarding how to use them.
 
 .. _nodiscard extension:
 
-Extended applications of ``[[nodiscard]]``
-------------------------------------------
-
-The ``[[nodiscard]]`` attribute is intended to help users find bugs where
-function return values are ignored when they shouldn't be. After C++17 the
-C++ standard has started to declared such library functions as ``[[nodiscard]]``.
-However, this application is limited and applies only to dialects after C++17.
-Users who want help diagnosing misuses of STL functions may desire a more
-liberal application of ``[[nodiscard]]``.
-
-For this reason libc++ provides an extension that does just that! The
-extension is enabled by default and can be disabled by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``.
-The extended applications of ``[[nodiscard]]`` takes two forms:
-
-1. Backporting ``[[nodiscard]]`` to entities declared as such by the
-   standard in newer dialects, but not in the present one.
-
-2. Extended applications of ``[[nodiscard]]``, at the library's discretion,
-   applied to entities never declared as such by the standard. You can find
-   all such applications by grepping for ``_LIBCPP_NODISCARD_EXT``.
-
 Extended integral type support
 ------------------------------
 
diff --git a/libcxx/include/__algorithm/adjacent_find.h b/libcxx/include/__algorithm/adjacent_find.h
index 7819e2cf49b9fa..6f15456e3a4d07 100644
--- a/libcxx/include/__algorithm/adjacent_find.h
+++ b/libcxx/include/__algorithm/adjacent_find.h
@@ -26,7 +26,7 @@ _LIBCPP_PUSH_MACROS
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _Iter, class _Sent, class _BinaryPredicate>
-_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter
+_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter
 __adjacent_find(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) {
   if (__first == __last)
     return __first;
@@ -40,13 +40,13 @@ __adjacent_find(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) {
 }
 
 template <class _ForwardIterator, class _BinaryPredicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
 adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) {
   return std::__adjacent_find(std::move(__first), std::move(__last), __pred);
 }
 
 template <class _ForwardIterator>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
 adjacent_find(_ForwardIterator __first, _ForwardIterator __last) {
   return std::adjacent_find(std::move(__first), std::move(__last), __equal_to());
 }
diff --git a/libcxx/include/__algorithm/all_of.h b/libcxx/include/__algorithm/all_of.h
index 237f8495c645f2..ec84eea7592966 100644
--- a/libcxx/include/__algorithm/all_of.h
+++ b/libcxx/include/__algorithm/all_of.h
@@ -19,7 +19,7 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _InputIterator, class _Predicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
   for (; __first != __last; ++__first)
     if (!__pred(*__first))
diff --git a/libcxx/include/__algorithm/any_of.h b/libcxx/include/__algorithm/any_of.h
index 8ba7aae2b225e1..b5ff778c4171dc 100644
--- a/libcxx/include/__algorithm/any_of.h
+++ b/libcxx/include/__algorithm/any_of.h
@@ -19,7 +19,7 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _InputIterator, class _Predicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
   for (; __first != __last; ++__first)
     if (__pred(*__first))
diff --git a/libcxx/include/__algorithm/binary_search.h b/libcxx/include/__algorithm/binary_search.h
index 7a77d7b5447bda..6065fc37274dce 100644
--- a/libcxx/include/__algorithm/binary_search.h
+++ b/libcxx/include/__algorithm/binary_search.h
@@ -22,14 +22,14 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _ForwardIterator, class _Tp, class _Compare>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) {
   __first = std::lower_bound<_ForwardIterator, _Tp, __comp_ref_type<_Compare> >(__first, __last, __value, __comp);
   return __first != __last && !__comp(__value, *__first);
 }
 
 template <class _ForwardIterator, class _Tp>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
   return std::binary_search(__first, __last, __value, __less<>());
 }
diff --git a/libcxx/include/__algorithm/clamp.h b/libcxx/include/__algorithm/clamp.h
index 003bf70dd4f01d..1a5a3d0744be9c 100644
--- a/libcxx/include/__algorithm/clamp.h
+++ b/libcxx/include/__algorithm/clamp.h
@@ -21,7 +21,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 #if _LIBCPP_STD_VER >= 17
 template <class _Tp, class _Compare>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&
+[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&
 clamp(_LIBCPP_LIFETIMEBOUND const _Tp& __v,
       _LIBCPP_LIFETIMEBOUND const _Tp& __lo,
       _LIBCPP_LIFETIMEBOUND const _Tp& __hi,
@@ -31,7 +31,7 @@ clamp(_LIBCPP_LIFETIMEBOUND const _Tp& __v,
 }
 
 template <class _Tp>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&
+[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&
 clamp(_LIBCPP_LIFETIMEBOUND const _Tp& __v,
       _LIBCPP_LIFETIMEBOUND const _Tp& __lo,
       _LIBCPP_LIFETIMEBOUND const _Tp& __hi) {
diff --git a/libcxx/include/__algorithm/count.h b/libcxx/include/__algorithm/count.h
index 23a7d3c4dcfed6..1cfe7f631ac1b7 100644
--- a/libcxx/include/__algorithm/count.h
+++ b/libcxx/include/__algorithm/count.h
@@ -79,7 +79,7 @@ __count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __l
 }
 
 template <class _InputIterator, class _Tp>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __iter_diff_t<_InputIterator>
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __iter_diff_t<_InputIterator>
 count(_InputIterator __first, _InputIterator __last, const _Tp& __value) {
   __identity __proj;
   return std::__count<_ClassicAlgPolicy>(__first, __last, __value, __proj);
diff --git a/libcxx/include/__algorithm/count_if.h b/libcxx/include/__algorithm/count_if.h
index 04f52b894f8bd4..25782069d03275 100644
--- a/libcxx/include/__algorithm/count_if.h
+++ b/libcxx/include/__algorithm/count_if.h
@@ -20,9 +20,9 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _InputIterator, class _Predicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
-    typename iterator_traits<_InputIterator>::difference_type
-    count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
+typename iterator_traits<_InputIterator>::difference_type
+count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
   typename iterator_traits<_InputIterator>::difference_type __r(0);
   for (; __first != __last; ++__first)
     if (__pred(*__first))
diff --git a/libcxx/include/__algorithm/equal.h b/libcxx/include/__algorithm/equal.h
index c76a16b47f5da4..10403d382770f5 100644
--- a/libcxx/include/__algorithm/equal.h
+++ b/libcxx/include/__algorithm/equal.h
@@ -56,14 +56,14 @@ __equal_iter_impl(_Tp* __first1, _Tp* __last1, _Up* __first2, _BinaryPredicate&)
 }
 
 template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) {
   return std::__equal_iter_impl(
       std::__unwrap_iter(__first1), std::__unwrap_iter(__last1), std::__unwrap_iter(__first2), __pred);
 }
 
 template <class _InputIterator1, class _InputIterator2>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) {
   return std::equal(__first1, __last1, __first2, __equal_to());
 }
@@ -71,7 +71,7 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
 #if _LIBCPP_STD_VER >= 14
 
 template <class _Iter1, class _Sent1, class _Iter2, class _Sent2, class _Pred, class _Proj1, class _Proj2>
-_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __equal_impl(
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __equal_impl(
     _Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, _Pred& __comp, _Proj1& __proj1, _Proj2& __proj2) {
   while (__first1 != __last1 && __first2 != __last2) {
     if (!std::__invoke(__comp, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2)))
@@ -97,7 +97,7 @@ __equal_impl(_Tp* __first1, _Tp* __last1, _Up* __first2, _Up*, _Pred&, _Proj1&,
 }
 
 template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 equal(_InputIterator1 __first1,
       _InputIterator1 __last1,
       _InputIterator2 __first2,
@@ -120,7 +120,7 @@ equal(_InputIterator1 __first1,
 }
 
 template <class _InputIterator1, class _InputIterator2>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
 equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) {
   return std::equal(__first1, __last1, __first2, __last2, __equal_to());
 }
diff --git a/libcxx/include/__algorithm/equal_range.h b/libcxx/include/__algorithm/equal_range.h
index 2b086abf1794fd..09bbf8f006021a 100644
--- a/libcxx/include/__algorithm/equal_range.h
+++ b/libcxx/include/__algorithm/equal_range.h
@@ -60,7 +60,7 @@ __equal_range(_Iter __first, _Sent __last, const _Tp& __value, _Compare&& __comp
 }
 
 template <class _ForwardIterator, class _Tp, class _Compare>
-_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator>
+_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator>
 equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) {
   static_assert(__is_callable<_Compare, decltype(*__first), const _Tp&>::value, "The comparator has to be callable");
   static_assert(is_copy_constructible<_ForwardIterator>::value, "Iterator has to be copy constructible");
@@ -73,7 +73,7 @@ equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
 }
 
 template <class _ForwardIterator, class _Tp>
-_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator>
+_LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator>
 equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
   return std::equal_range(std::move(__first), std::move(__last), __value, __less<>());
 }
diff --git a/libcxx/include/__algorithm/find.h b/libcxx/include/__algorithm/find.h
index 7d7631b6e98a96..d6035687313222 100644
--- a/libcxx/include/__algorithm/find.h
+++ b/libcxx/include/__algorithm/find.h
@@ -169,7 +169,7 @@ struct __find_segment {
 
 // public API
 template <class _InputIterator, class _Tp>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
 find(_InputIterator __first, _InputIterator __last, const _Tp& __value) {
   __identity __proj;
   return std::__rewrap_iter(
diff --git a/libcxx/include/__algorithm/find_end.h b/libcxx/include/__algorithm/find_end.h
index 4c26891666b223..7e08e7953534eb 100644
--- a/libcxx/include/__algorithm/find_end.h
+++ b/libcxx/include/__algorithm/find_end.h
@@ -205,7 +205,7 @@ _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Fo
 }
 
 template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_end(
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_end(
     _ForwardIterator1 __first1,
     _ForwardIterator1 __last1,
     _ForwardIterator2 __first2,
@@ -215,7 +215,7 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
 }
 
 template <class _ForwardIterator1, class _ForwardIterator2>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1
 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) {
   return std::find_end(__first1, __last1, __first2, __last2, __equal_to());
 }
diff --git a/libcxx/include/__algorithm/find_first_of.h b/libcxx/include/__algorithm/find_first_of.h
index 14271cccc42b14..6b99f562f8804e 100644
--- a/libcxx/include/__algorithm/find_first_of.h
+++ b/libcxx/include/__algorithm/find_first_of.h
@@ -35,7 +35,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator1 __find_fir
 }
 
 template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_first_of(
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_first_of(
     _ForwardIterator1 __first1,
     _ForwardIterator1 __last1,
     _ForwardIterator2 __first2,
@@ -45,7 +45,7 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
 }
 
 template <class _ForwardIterator1, class _ForwardIterator2>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_first_of(
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_first_of(
     _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) {
   return std::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to());
 }
diff --git a/libcxx/include/__algorithm/find_if.h b/libcxx/include/__algorithm/find_if.h
index 09a39f646351c3..22092d352b06e7 100644
--- a/libcxx/include/__algorithm/find_if.h
+++ b/libcxx/include/__algorithm/find_if.h
@@ -19,7 +19,7 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _InputIterator, class _Predicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
 find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
   for (; __first != __last; ++__first)
     if (__pred(*__first))
diff --git a/libcxx/include/__algorithm/find_if_not.h b/libcxx/include/__algorithm/find_if_not.h
index bf29ebb7cdd93c..cc2001967f0c5a 100644
--- a/libcxx/include/__algorithm/find_if_not.h
+++ b/libcxx/include/__algorithm/find_if_not.h
@@ -19,7 +19,7 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _InputIterator, class _Predicate>
-_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
+_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
 find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
   for (; __first != __last; ++__first)
     if (!__pred(*__first))
diff --git a/libcxx/include/__algorithm/fold.h b/libcxx/include/__algorithm/fold.h
index 1a9d76b50d83c9..255658f5232499 100644
--- a/libcxx/include/__algorithm/fold.h
+++ b/libcxx/include/__algorithm/fold.h
@@ -78,8 +78,7 @@ concept __indirectly_binary_left_foldable =
 
 struct __fold_left_with_iter {
   template <input_iterator _Ip, sentinel_for<_Ip> _Sp, class _Tp, __indirectly_binary_left_foldable<_Tp, _Ip> _Fp>
-  _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI static constexpr auto
-  operator()(_Ip __first, _Sp __last, _Tp __init, _Fp __f) {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto operator()(_Ip __first, _Sp __last, _Tp __init, _Fp __f) {
     using _Up = decay_t<invoke_result_t<_Fp&, _Tp, iter_reference_t<_Ip>>>;
 
     if (__first == __last) {
@@ -95,7 +94,7 @@ struct __fold_left_with_iter {
   }
 
   template <input_range _Rp, class _Tp, __indirectly_binary_left_foldable<_Tp, iterator_t<_Rp>> _Fp>
-  _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI static constexpr auto operator()(_Rp&& __r, _Tp __init, _Fp __f) {
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto operator()(_Rp&& __r, _Tp __init, _Fp __f) {
     auto __result = operator()(ranges::begin(__r), ranges::end(__r), std::move(__init), std::ref(__f));
 
     using _Up = decay_t<invoke_result_t<_Fp&, _Tp, range_reference_t<_Rp>>>;
@@ -107,13 +106,12 @@ inline constexpr auto fold_left_with_iter = __fold_left_with_iter();
 
 struct __fold_left {
   template <input_iterator _Ip, sentinel_for<_Ip> _Sp, class _Tp, __indirectly_binary_le...
[truncated]

Copy link
Member

@ldionne ldionne left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This pretty much looks good to me, but I would really like to avoid having 3 spellings.

Copy link
Member

@mordante mordante left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for doing this! I've spot checked and didn't notice weird things.

I have some reservations removing the macros without a transition period.

# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD
# else
# define _LIBCPP_NODISCARD_AFTER_CXX17
# endif
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this might break patches in flight and downstream vendors without a transition I feel we should give this change more visibility before landing.

Alternatively; how do you feel about about making these macros deprecated for 1 release cycle?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CC @llvm/libcxx-vendors

If nobody complains I think we can just remove them.

I don't see anybody using _LIBCPP_NODISCARD_AFTER_CXX17 downstream, since it's been there for applications in the standard. _LIBCPP_NODISCARD_EXT might be used, but the fix is to replace _LIBCPP_NODISCARD_EXT with _LIBCPP_NODISCARD, which is a task of a few minutes.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the info. Then let's wait and see whether vendors object. If not I'm happy to keep this as is. I leave the final approval to @ldionne. Again I'm happy with the patch and this approach.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine. Adding nodiscard in C++17 mode to a few functions that already have it in C++20 mode is a fairly small change, and also something that we'll do (to an even greater extent) in the future, since those are now up to us.

@philnik777 philnik777 force-pushed the users/philnik777/remove_nodiscard_ext branch 2 times, most recently from e2d5b11 to e19afa6 Compare April 5, 2024 14:57
@philnik777 philnik777 force-pushed the users/philnik777/remove_nodiscard_ext branch 3 times, most recently from 28755f6 to 91a1872 Compare April 14, 2024 07:33
# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD
# else
# define _LIBCPP_NODISCARD_AFTER_CXX17
# endif
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine. Adding nodiscard in C++17 mode to a few functions that already have it in C++20 mode is a fairly small change, and also something that we'll do (to an even greater extent) in the future, since those are now up to us.

@philnik777 philnik777 force-pushed the users/philnik777/remove_nodiscard_ext branch 4 times, most recently from 942a406 to a085121 Compare April 18, 2024 07:55
@philnik777 philnik777 force-pushed the users/philnik777/remove_nodiscard_ext branch 2 times, most recently from 2733998 to 73cd60d Compare April 20, 2024 08:53
@philnik777 philnik777 force-pushed the users/philnik777/remove_nodiscard_ext branch from 73cd60d to 1ead6c7 Compare April 22, 2024 09:55
@philnik777 philnik777 merged commit 83bc7b5 into main Apr 22, 2024
@philnik777 philnik777 deleted the users/philnik777/remove_nodiscard_ext branch April 22, 2024 20:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants