diff --git a/libcxx/include/any b/libcxx/include/any index b3e5b8748df4c..5c779e397c9ea 100644 --- a/libcxx/include/any +++ b/libcxx/include/any @@ -262,10 +262,10 @@ public: _LIBCPP_HIDE_FROM_ABI void swap(any& __rhs) _NOEXCEPT; // 6.3.4 any observers - _LIBCPP_HIDE_FROM_ABI bool has_value() const _NOEXCEPT { return __h_ != nullptr; } + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool has_value() const _NOEXCEPT { return __h_ != nullptr; } # if _LIBCPP_HAS_RTTI - _LIBCPP_HIDE_FROM_ABI const type_info& type() const _NOEXCEPT { + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const type_info& type() const _NOEXCEPT { if (__h_) { return *static_cast(this->__call(_Action::_TypeInfo)); } else { @@ -492,17 +492,17 @@ inline _LIBCPP_HIDE_FROM_ABI void any::swap(any& __rhs) _NOEXCEPT { inline _LIBCPP_HIDE_FROM_ABI void swap(any& __lhs, any& __rhs) _NOEXCEPT { __lhs.swap(__rhs); } template -inline _LIBCPP_HIDE_FROM_ABI any make_any(_Args&&... __args) { +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI any make_any(_Args&&... __args) { return any(in_place_type<_Tp>, std::forward<_Args>(__args)...); } template -inline _LIBCPP_HIDE_FROM_ABI any make_any(initializer_list<_Up> __il, _Args&&... __args) { +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI any make_any(initializer_list<_Up> __il, _Args&&... __args) { return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...); } template -inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any const& __v) { +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any const& __v) { using _RawValueType = __remove_cvref_t<_ValueType>; static_assert(is_constructible<_ValueType, _RawValueType const&>::value, "ValueType is required to be a const lvalue reference " @@ -514,7 +514,7 @@ inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any const& __v) { } template -inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any& __v) { +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any& __v) { using _RawValueType = __remove_cvref_t<_ValueType>; static_assert(is_constructible<_ValueType, _RawValueType&>::value, "ValueType is required to be an lvalue reference " @@ -526,7 +526,7 @@ inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any& __v) { } template -inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any&& __v) { +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any&& __v) { using _RawValueType = __remove_cvref_t<_ValueType>; static_assert(is_constructible<_ValueType, _RawValueType>::value, "ValueType is required to be an rvalue reference " @@ -538,7 +538,7 @@ inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any&& __v) { } template -inline _LIBCPP_HIDE_FROM_ABI add_pointer_t> any_cast(any const* __any) _NOEXCEPT { +[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI add_pointer_t> any_cast(any const* __any) _NOEXCEPT { static_assert(!is_void_v<_ValueType>, "_ValueType may not be void."); static_assert(!is_reference<_ValueType>::value, "_ValueType may not be a reference."); return std::any_cast<_ValueType>(const_cast(__any)); @@ -555,7 +555,7 @@ inline _LIBCPP_HIDE_FROM_ABI _RetType __pointer_or_func_cast(void*, /*IsFunction } template -_LIBCPP_HIDE_FROM_ABI add_pointer_t<_ValueType> any_cast(any* __any) _NOEXCEPT { +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI add_pointer_t<_ValueType> any_cast(any* __any) _NOEXCEPT { using __any_imp::_Action; static_assert(!is_void_v<_ValueType>, "_ValueType may not be void."); static_assert(!is_reference<_ValueType>::value, "_ValueType may not be a reference."); diff --git a/libcxx/test/libcxx/utilities/any/nodiscard.verify.cpp b/libcxx/test/libcxx/utilities/any/nodiscard.verify.cpp new file mode 100644 index 0000000000000..13a67bd3c3044 --- /dev/null +++ b/libcxx/test/libcxx/utilities/any/nodiscard.verify.cpp @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// REQUIRES: std-at-least-c++17 + +// Check that functions are marked [[nodiscard]] + +#include +#include +#include + +#include "test_macros.h" + +void test() { + std::any a{94}; + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + a.has_value(); +#if !defined(TEST_HAS_NO_RTTI) + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + a.type(); +#endif + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::make_any(82); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::make_any>({94, 82, 50}); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::any_cast(std::as_const(a)); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::any_cast(a); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::any_cast(std::move(a)); + + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::any_cast(&a); + // expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}} + std::any_cast(&std::as_const(a)); +} diff --git a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/any_cast_request_invalid_value_category.verify.cpp b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/any_cast_request_invalid_value_category.verify.cpp index c9800c5a01431..55e9923eab850 100644 --- a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/any_cast_request_invalid_value_category.verify.cpp +++ b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/any_cast_request_invalid_value_category.verify.cpp @@ -23,31 +23,31 @@ void test_const_lvalue_cast_request_non_const_lvalue() { const std::any a; // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} // expected-error@any:* {{drops 'const' qualifier}} - std::any_cast(a); // expected-note {{requested here}} + (void)std::any_cast(a); // expected-note {{requested here}} const std::any a2(42); // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} // expected-error@any:* {{drops 'const' qualifier}} - std::any_cast(a2); // expected-note {{requested here}} + (void)std::any_cast(a2); // expected-note {{requested here}} } void test_lvalue_any_cast_request_rvalue() { std::any a; // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an lvalue reference or a CopyConstructible type}} - std::any_cast(a); // expected-note {{requested here}} + (void)std::any_cast(a); // expected-note {{requested here}} std::any a2(42); // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an lvalue reference or a CopyConstructible type}} - std::any_cast(a2); // expected-note {{requested here}} + (void)std::any_cast(a2); // expected-note {{requested here}} } void test_rvalue_any_cast_request_lvalue() { std::any a; // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an rvalue reference or a CopyConstructible type}} // expected-error@any:* {{non-const lvalue reference to type 'TestType' cannot bind to a temporary}} - std::any_cast(std::move(a)); // expected-note {{requested here}} + (void)std::any_cast(std::move(a)); // expected-note {{requested here}} // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an rvalue reference or a CopyConstructible type}} // expected-error@any:* {{non-const lvalue reference to type 'int' cannot bind to a temporary}} - std::any_cast(42); + (void)std::any_cast(42); } diff --git a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/const_correctness.verify.cpp b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/const_correctness.verify.cpp index a60bb1bbc8709..4ed1692b30a36 100644 --- a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/const_correctness.verify.cpp +++ b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/const_correctness.verify.cpp @@ -31,14 +31,14 @@ void test() { std::any a; // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); // expected-note {{requested here}} + (void)std::any_cast(static_cast(a)); // expected-note {{requested here}} // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); // expected-note {{requested here}} + (void)std::any_cast(static_cast(a)); // expected-note {{requested here}} // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); // expected-note {{requested here}} + (void)std::any_cast(static_cast(a)); // expected-note {{requested here}} // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); // expected-note {{requested here}} + (void)std::any_cast(static_cast(a)); // expected-note {{requested here}} } diff --git a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/not_copy_constructible.verify.cpp b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/not_copy_constructible.verify.cpp index 8b25d5ee520b7..ad91455e7add3 100644 --- a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/not_copy_constructible.verify.cpp +++ b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/not_copy_constructible.verify.cpp @@ -45,13 +45,13 @@ struct no_move { void test() { std::any a; // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an lvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); // expected-note {{requested here}} + (void)std::any_cast(static_cast(a)); // expected-note {{requested here}} // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be a const lvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); // expected-note {{requested here}} + (void)std::any_cast(static_cast(a)); // expected-note {{requested here}} - std::any_cast(static_cast(a)); // OK + (void)std::any_cast(static_cast(a)); // OK // expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an rvalue reference or a CopyConstructible type}} - std::any_cast(static_cast(a)); + (void)std::any_cast(static_cast(a)); } diff --git a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/reference_types.verify.cpp b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/reference_types.verify.cpp index a055dcbf7f39c..d634f73291e0e 100644 --- a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/reference_types.verify.cpp +++ b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/reference_types.verify.cpp @@ -22,28 +22,28 @@ void test() { std::any a = 1; // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a); // expected-note {{requested here}} + (void)std::any_cast(&a); // expected-note {{requested here}} // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a); // expected-note {{requested here}} + (void)std::any_cast(&a); // expected-note {{requested here}} // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a); // expected-note {{requested here}} + (void)std::any_cast(&a); // expected-note {{requested here}} // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a); // expected-note {{requested here}} + (void)std::any_cast(&a); // expected-note {{requested here}} const std::any& a2 = a; // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a2); // expected-note {{requested here}} + (void)std::any_cast(&a2); // expected-note {{requested here}} // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a2); // expected-note {{requested here}} + (void)std::any_cast(&a2); // expected-note {{requested here}} // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a2); // expected-note {{requested here}} + (void)std::any_cast(&a2); // expected-note {{requested here}} // expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}} - std::any_cast(&a2); // expected-note {{requested here}} + (void)std::any_cast(&a2); // expected-note {{requested here}} } diff --git a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/void.verify.cpp b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/void.verify.cpp index 9530d63e07b0a..d1ec42eaf10c2 100644 --- a/libcxx/test/std/utilities/any/any.nonmembers/any.cast/void.verify.cpp +++ b/libcxx/test/std/utilities/any/any.nonmembers/any.cast/void.verify.cpp @@ -23,12 +23,12 @@ void test() { const std::any ca = 1; // expected-error-re@any:* {{static assertion failed{{.*}}_ValueType may not be void.}} - std::any_cast(&ca); // expected-note {{requested here}} + (void)std::any_cast(&ca); // expected-note {{requested here}} } { std::any a = 1; // expected-error-re@any:* {{static assertion failed{{.*}}_ValueType may not be void.}} - std::any_cast(&a); // expected-note {{requested here}} + (void)std::any_cast(&a); // expected-note {{requested here}} } }