diff --git a/libcxx/docs/ReleaseNotes.rst b/libcxx/docs/ReleaseNotes.rst --- a/libcxx/docs/ReleaseNotes.rst +++ b/libcxx/docs/ReleaseNotes.rst @@ -148,6 +148,9 @@ will be removed in LLVM 17. You can disable the deprecation warnings by defining ``_LIBCPP_NO_EXPERIMENTAL_DEPRECATION_WARNING_SEARCHERS``. +- Extended applications of ``[[nodiscard]]`` are now enabled by default. They can be + disabled by defining ``_LIBCPP_DISBALE_NODISCARD``. + ABI Changes ----------- diff --git a/libcxx/docs/UsingLibcxx.rst b/libcxx/docs/UsingLibcxx.rst --- a/libcxx/docs/UsingLibcxx.rst +++ b/libcxx/docs/UsingLibcxx.rst @@ -254,12 +254,11 @@ replacement scenarios from working, e.g. replacing `operator new` and expecting a non-replaced `operator new[]` to call the replaced `operator new`. -**_LIBCPP_ENABLE_NODISCARD**: - Allow the library to add ``[[nodiscard]]`` attributes to entities not specified - as ``[[nodiscard]]`` by the current language dialect. This includes - backporting applications of ``[[nodiscard]]`` from newer dialects and - additional extended applications at the discretion of the library. All - additional applications of ``[[nodiscard]]`` are disabled by default. +**_LIBCPP_DISABLE_NODISCARD**: + Add ``[[nodiscard]]`` attributes only to entities specified as ``[[nodiscard]]`` + by the current language dialect. This disables backporting applications + of ``[[nodiscard]]`` from newer dialects and additional extended applications + at the discretion of the library. See :ref:`Extended Applications of [[nodiscard]] ` for more information. @@ -356,8 +355,8 @@ liberal application of ``[[nodiscard]]``. For this reason libc++ provides an extension that does just that! The -extension must be enabled by defining ``_LIBCPP_ENABLE_NODISCARD``. The extended -applications of ``[[nodiscard]]`` takes two forms: +extension is enabled by default and can be disabled by defining ``_LIBCPP_DISABLE_NODISCARD``. +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. diff --git a/libcxx/include/__config b/libcxx/include/__config --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -880,13 +880,13 @@ // _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not // specified as such as an extension. -# if defined(_LIBCPP_ENABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT) +# if !defined(_LIBCPP_DISABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT) # define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD # else # define _LIBCPP_NODISCARD_EXT # endif -# if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && (_LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD)) +# if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && (_LIBCPP_STD_VER > 17 || !defined(_LIBCPP_DISABLE_NODISCARD)) # define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD # else # define _LIBCPP_NODISCARD_AFTER_CXX17 diff --git a/libcxx/test/libcxx/algorithms/callable.verify.cpp b/libcxx/test/libcxx/algorithms/callable.verify.cpp --- a/libcxx/test/libcxx/algorithms/callable.verify.cpp +++ b/libcxx/test/libcxx/algorithms/callable.verify.cpp @@ -24,7 +24,7 @@ }; S a[] = {1, 2, 3, 4}; - std::lower_bound(a, a + 4, 0, &S::compare); // expected-error@*:* {{The comparator has to be callable}} - std::minmax({S{1}}, &S::compare); // expected-error@*:* {{The comparator has to be callable}} - std::minmax_element(a, a + 4, &S::compare); // expected-error@*:* {{The comparator has to be callable}} + (void) std::lower_bound(a, a + 4, 0, &S::compare); // expected-error@*:* {{The comparator has to be callable}} + (void) std::minmax({S{1}}, &S::compare); // expected-error@*:* {{The comparator has to be callable}} + (void) std::minmax_element(a, a + 4, &S::compare); // expected-error@*:* {{The comparator has to be callable}} } diff --git a/libcxx/test/libcxx/diagnostics/enable_nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/enable_nodiscard.verify.cpp --- a/libcxx/test/libcxx/diagnostics/enable_nodiscard.verify.cpp +++ b/libcxx/test/libcxx/diagnostics/enable_nodiscard.verify.cpp @@ -12,8 +12,6 @@ // UNSUPPORTED: c++03 -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_NODISCARD - #include <__config> _LIBCPP_NODISCARD_EXT int foo() { return 42; } diff --git a/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_after_cxx17.verify.cpp b/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_after_cxx17.verify.cpp --- a/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_after_cxx17.verify.cpp +++ b/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_after_cxx17.verify.cpp @@ -11,7 +11,6 @@ // Test that _LIBCPP_DISABLE_NODISCARD_EXT only disables _LIBCPP_NODISCARD_EXT // and not _LIBCPP_NODISCARD_AFTER_CXX17. -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_NODISCARD // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17 #include <__config> diff --git a/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_nodiscard_ext.verify.cpp b/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_nodiscard_ext.verify.cpp --- a/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_nodiscard_ext.verify.cpp +++ b/libcxx/test/libcxx/diagnostics/enable_nodiscard_disable_nodiscard_ext.verify.cpp @@ -8,7 +8,6 @@ // UNSUPPORTED: c++03 -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_NODISCARD // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_NODISCARD_EXT #include <__config> diff --git a/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp b/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp --- a/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp +++ b/libcxx/test/libcxx/diagnostics/nodiscard.pass.cpp @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -// Test that _LIBCPP_NODISCARD_EXT is not defined to [[nodiscard]] unless -// explicitly enabled by _LIBCPP_ENABLE_NODISCARD +// Test that _LIBCPP_NODISCARD_EXT is defined empty if _LIBCPP_DISABLE_NODISCARD_EXT is defined +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_NODISCARD #include <__config> diff --git a/libcxx/test/libcxx/diagnostics/nodiscard_extensions.pass.cpp b/libcxx/test/libcxx/diagnostics/nodiscard_extensions.pass.cpp --- a/libcxx/test/libcxx/diagnostics/nodiscard_extensions.pass.cpp +++ b/libcxx/test/libcxx/diagnostics/nodiscard_extensions.pass.cpp @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -// Test that entities declared [[nodiscard]] as at extension by libc++, are -// only actually declared such when _LIBCPP_ENABLE_NODISCARD is specified. +// Test that entities declared [[nodiscard]] as at extension by libc++ are +// not marked as such when _LIBCPP_DISABLE_NODISCARD is specified. // This test intentionally leaks memory, so it is unsupported under ASAN. // UNSUPPORTED: asan @@ -20,6 +20,7 @@ // trigger -Wunused-value warnings. // ADDITIONAL_COMPILE_FLAGS: -fno-builtin +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_NODISCARD // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS #include diff --git a/libcxx/test/libcxx/diagnostics/nodiscard_extensions.verify.cpp b/libcxx/test/libcxx/diagnostics/nodiscard_extensions.verify.cpp --- a/libcxx/test/libcxx/diagnostics/nodiscard_extensions.verify.cpp +++ b/libcxx/test/libcxx/diagnostics/nodiscard_extensions.verify.cpp @@ -15,7 +15,6 @@ // be tested here and in nodiscard_extensions.pass.cpp. They should also // be listed in `UsingLibcxx.rst` in the documentation for the extension. -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_NODISCARD // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS #include diff --git a/libcxx/test/libcxx/thread/thread.lock/thread.lock.guard/nodiscard.verify.cpp b/libcxx/test/libcxx/thread/thread.lock/thread.lock.guard/nodiscard.verify.cpp --- a/libcxx/test/libcxx/thread/thread.lock/thread.lock.guard/nodiscard.verify.cpp +++ b/libcxx/test/libcxx/thread/thread.lock/thread.lock.guard/nodiscard.verify.cpp @@ -21,8 +21,6 @@ // Test that we properly apply [[nodiscard]] to lock_guard's constructors, // which is a libc++ extension. -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_NODISCARD - #include int main(int, char**) { diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/requires_forward_iterator.fail.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/requires_forward_iterator.fail.cpp --- a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/requires_forward_iterator.fail.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/requires_forward_iterator.fail.cpp @@ -22,15 +22,15 @@ typedef cpp17_input_iterator Iter; { // expected-error@*:* {{"std::min_element requires a ForwardIterator"}} - std::min_element(Iter(b), Iter(e)); + (void) std::min_element(Iter(b), Iter(e)); } { // expected-error@*:* {{"std::max_element requires a ForwardIterator"}} - std::max_element(Iter(b), Iter(e)); + (void) std::max_element(Iter(b), Iter(e)); } { // expected-error@*:* {{"std::minmax_element requires a ForwardIterator"}} - std::minmax_element(Iter(b), Iter(e)); + (void) std::minmax_element(Iter(b), Iter(e)); }