Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions libcxx/include/any
Original file line number Diff line number Diff line change
Expand Up @@ -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<type_info const*>(this->__call(_Action::_TypeInfo));
} else {
Expand Down Expand Up @@ -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 <class _Tp, class... _Args>
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 <class _Tp, class _Up, class... _Args>
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 <class _ValueType>
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 "
Expand All @@ -514,7 +514,7 @@ inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any const& __v) {
}

template <class _ValueType>
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 "
Expand All @@ -526,7 +526,7 @@ inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any& __v) {
}

template <class _ValueType>
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 "
Expand All @@ -538,7 +538,7 @@ inline _LIBCPP_HIDE_FROM_ABI _ValueType any_cast(any&& __v) {
}

template <class _ValueType>
inline _LIBCPP_HIDE_FROM_ABI add_pointer_t<add_const_t<_ValueType>> any_cast(any const* __any) _NOEXCEPT {
[[nodiscard]] inline _LIBCPP_HIDE_FROM_ABI add_pointer_t<add_const_t<_ValueType>> 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*>(__any));
Expand All @@ -555,7 +555,7 @@ inline _LIBCPP_HIDE_FROM_ABI _RetType __pointer_or_func_cast(void*, /*IsFunction
}

template <class _ValueType>
_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.");
Expand Down
45 changes: 45 additions & 0 deletions libcxx/test/libcxx/utilities/any/nodiscard.verify.cpp
Original file line number Diff line number Diff line change
@@ -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 <any>
#include <utility>
#include <vector>

#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<int>(82);
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::make_any<std::vector<int>>({94, 82, 50});

// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::any_cast<const int&>(std::as_const(a));
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::any_cast<int&>(a);
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::any_cast<int&&>(std::move(a));

// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::any_cast<int*>(&a);
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
std::any_cast<const int*>(&std::as_const(a));
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<TestType&>(a); // expected-note {{requested here}}
(void)std::any_cast<TestType&>(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<int&>(a2); // expected-note {{requested here}}
(void)std::any_cast<int&>(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<TestType&&>(a); // expected-note {{requested here}}
(void)std::any_cast<TestType&&>(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<int&&>(a2); // expected-note {{requested here}}
(void)std::any_cast<int&&>(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<TestType&>(std::move(a)); // expected-note {{requested here}}
(void)std::any_cast<TestType&>(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<int&>(42);
(void)std::any_cast<int&>(42);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<TestType&>(static_cast<std::any const&>(a)); // expected-note {{requested here}}
(void)std::any_cast<TestType&>(static_cast<std::any const&>(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<TestType&&>(static_cast<std::any const&>(a)); // expected-note {{requested here}}
(void)std::any_cast<TestType&&>(static_cast<std::any const&>(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<TestType2&>(static_cast<std::any const&&>(a)); // expected-note {{requested here}}
(void)std::any_cast<TestType2&>(static_cast<std::any const&&>(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<TestType2&&>(static_cast<std::any const&&>(a)); // expected-note {{requested here}}
(void)std::any_cast<TestType2&&>(static_cast<std::any const&&>(a)); // expected-note {{requested here}}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<no_copy>(static_cast<std::any&>(a)); // expected-note {{requested here}}
(void)std::any_cast<no_copy>(static_cast<std::any&>(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<no_copy>(static_cast<std::any const&>(a)); // expected-note {{requested here}}
(void)std::any_cast<no_copy>(static_cast<std::any const&>(a)); // expected-note {{requested here}}

std::any_cast<no_copy>(static_cast<std::any&&>(a)); // OK
(void)std::any_cast<no_copy>(static_cast<std::any&&>(a)); // OK

// expected-error-re@any:* {{static assertion failed{{.*}}ValueType is required to be an rvalue reference or a CopyConstructible type}}
std::any_cast<no_move>(static_cast<std::any&&>(a));
(void)std::any_cast<no_move>(static_cast<std::any&&>(a));
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<int&>(&a); // expected-note {{requested here}}
(void)std::any_cast<int&>(&a); // expected-note {{requested here}}

// expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}}
std::any_cast<int&&>(&a); // expected-note {{requested here}}
(void)std::any_cast<int&&>(&a); // expected-note {{requested here}}

// expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}}
std::any_cast<int const&>(&a); // expected-note {{requested here}}
(void)std::any_cast<int const&>(&a); // expected-note {{requested here}}

// expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}}
std::any_cast<int const&&>(&a); // expected-note {{requested here}}
(void)std::any_cast<int const&&>(&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<int&>(&a2); // expected-note {{requested here}}
(void)std::any_cast<int&>(&a2); // expected-note {{requested here}}

// expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}}
std::any_cast<int&&>(&a2); // expected-note {{requested here}}
(void)std::any_cast<int&&>(&a2); // expected-note {{requested here}}

// expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}}
std::any_cast<int const&>(&a2); // expected-note {{requested here}}
(void)std::any_cast<int const&>(&a2); // expected-note {{requested here}}

// expected-error-re@any:* 1 {{static assertion failed{{.*}}_ValueType may not be a reference.}}
std::any_cast<int const&&>(&a2); // expected-note {{requested here}}
(void)std::any_cast<int const&&>(&a2); // expected-note {{requested here}}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<void>(&ca); // expected-note {{requested here}}
(void)std::any_cast<void>(&ca); // expected-note {{requested here}}
}
{
std::any a = 1;

// expected-error-re@any:* {{static assertion failed{{.*}}_ValueType may not be void.}}
std::any_cast<void>(&a); // expected-note {{requested here}}
(void)std::any_cast<void>(&a); // expected-note {{requested here}}
}
}
Loading