aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2018-02-27 13:33:30 +0200
committerVille Voutilainen <ville@gcc.gnu.org>2018-02-27 13:33:30 +0200
commit23c3a0590839e94c94890bb11c2e2e96c1b27f1d (patch)
tree67088f0548a23a8f21daff7a8ecc049ea30f0bec /libstdc++-v3
parent2be4b342e00df3968d9b069349bd4cf540ea1f56 (diff)
downloadgcc-23c3a0590839e94c94890bb11c2e2e96c1b27f1d.zip
gcc-23c3a0590839e94c94890bb11c2e2e96c1b27f1d.tar.gz
gcc-23c3a0590839e94c94890bb11c2e2e96c1b27f1d.tar.bz2
Implement the missing bits of LWG 2769
* include/std/any (any_cast(const any&)): Add static_assert. (any_cast(any&)): Likewise. (any_cast(any&&)): Likewise, and remove the handling for copyable-but-not-movable type. * testsuite/20_util/any/misc/any_cast.cc: Adjust. * testsuite/20_util/any/misc/any_cast_neg.cc: Likewise, and add new tests. From-SVN: r258031
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog11
-rw-r--r--libstdc++-v3/include/std/any36
-rw-r--r--libstdc++-v3/testsuite/20_util/any/misc/any_cast.cc9
-rw-r--r--libstdc++-v3/testsuite/20_util/any/misc/any_cast_neg.cc23
4 files changed, 43 insertions, 36 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 4f83772..05deec4 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,14 @@
+2018-02-27 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ Implement the missing bits of LWG 2769
+ * include/std/any (any_cast(const any&)): Add static_assert.
+ (any_cast(any&)): Likewise.
+ (any_cast(any&&)): Likewise, and remove the handling
+ for copyable-but-not-movable type.
+ * testsuite/20_util/any/misc/any_cast.cc: Adjust.
+ * testsuite/20_util/any/misc/any_cast_neg.cc: Likewise, and
+ add new tests.
+
2018-02-23 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/84532
diff --git a/libstdc++-v3/include/std/any b/libstdc++-v3/include/std/any
index 466b7ca..a37eb38 100644
--- a/libstdc++-v3/include/std/any
+++ b/libstdc++-v3/include/std/any
@@ -438,8 +438,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return any(in_place_type<_Tp>, __il, std::forward<_Args>(__args)...);
}
- template <typename _Tp>
- using _AnyCast = remove_cv_t<remove_reference_t<_Tp>>;
/**
* @brief Access the contained object.
*
@@ -453,9 +451,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _ValueType>
inline _ValueType any_cast(const any& __any)
{
+ using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
+ static_assert(is_constructible_v<_ValueType, const _Up&>,
+ "Template argument must be constructible from a const value.");
+ auto __p = any_cast<_Up>(&__any);
if (__p)
return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
@@ -476,37 +477,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _ValueType>
inline _ValueType any_cast(any& __any)
{
+ using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
+ static_assert(is_constructible_v<_ValueType, _Up&>,
+ "Template argument must be constructible from an lvalue.");
+ auto __p = any_cast<_Up>(&__any);
if (__p)
return static_cast<_ValueType>(*__p);
__throw_bad_any_cast();
}
- template<typename _ValueType,
- typename enable_if<!is_move_constructible<_ValueType>::value
- || is_lvalue_reference<_ValueType>::value,
- bool>::type = true>
- inline _ValueType any_cast(any&& __any)
- {
- static_assert(any::__is_valid_cast<_ValueType>(),
- "Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
- if (__p)
- return static_cast<_ValueType>(*__p);
- __throw_bad_any_cast();
- }
-
- template<typename _ValueType,
- typename enable_if<is_move_constructible<_ValueType>::value
- && !is_lvalue_reference<_ValueType>::value,
- bool>::type = false>
+ template<typename _ValueType>
inline _ValueType any_cast(any&& __any)
{
+ using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
static_assert(any::__is_valid_cast<_ValueType>(),
"Template argument must be a reference or CopyConstructible type");
- auto __p = any_cast<_AnyCast<_ValueType>>(&__any);
+ static_assert(is_constructible_v<_ValueType, _Up>,
+ "Template argument must be constructible from an rvalue.");
+ auto __p = any_cast<_Up>(&__any);
if (__p)
return static_cast<_ValueType>(std::move(*__p));
__throw_bad_any_cast();
diff --git a/libstdc++-v3/testsuite/20_util/any/misc/any_cast.cc b/libstdc++-v3/testsuite/20_util/any/misc/any_cast.cc
index 45d8b63..37a24d7 100644
--- a/libstdc++-v3/testsuite/20_util/any/misc/any_cast.cc
+++ b/libstdc++-v3/testsuite/20_util/any/misc/any_cast.cc
@@ -95,15 +95,6 @@ void test03()
VERIFY(move_count == 1);
MoveEnabled&& m3 = any_cast<MoveEnabled&&>(any(m));
VERIFY(move_count == 1);
- struct MoveDeleted
- {
- MoveDeleted(MoveDeleted&&) = delete;
- MoveDeleted() = default;
- MoveDeleted(const MoveDeleted&) = default;
- };
- MoveDeleted md;
- MoveDeleted&& md2 = any_cast<MoveDeleted>(any(std::move(md)));
- MoveDeleted&& md3 = any_cast<MoveDeleted&&>(any(std::move(md)));
}
void test04()
diff --git a/libstdc++-v3/testsuite/20_util/any/misc/any_cast_neg.cc b/libstdc++-v3/testsuite/20_util/any/misc/any_cast_neg.cc
index 50a9a67..62d7aaa 100644
--- a/libstdc++-v3/testsuite/20_util/any/misc/any_cast_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/any/misc/any_cast_neg.cc
@@ -20,11 +20,26 @@
#include <any>
+using std::any;
+using std::any_cast;
+
void test01()
{
- using std::any;
- using std::any_cast;
-
const any y(1);
- any_cast<int&>(y); // { dg-error "invalid static_cast" "" { target { *-*-* } } 460 }
+ any_cast<int&>(y); // { dg-error "invalid static_cast" "" { target { *-*-* } } 461 }
+ // { dg-error "Template argument must be constructible from a const value" "" { target { *-*-* } } 457 }
+}
+
+void test02()
+{
+ any y(1);
+ any_cast<int&&>(y);
+ // { dg-error "Template argument must be constructible from an lvalue" "" { target { *-*-* } } 483 }
+}
+
+void test03()
+{
+ any y(1);
+ any_cast<int&>(std::move(y)); // { dg-error "invalid static_cast" "" { target { *-*-* } } 501 }
+ // { dg-error "Template argument must be constructible from an rvalue" "" { target { *-*-* } } 497 }
}