diff options
author | Louis Dionne <ldionne@apple.com> | 2018-12-03 14:03:27 +0000 |
---|---|---|
committer | Louis Dionne <ldionne@apple.com> | 2018-12-03 14:03:27 +0000 |
commit | bb9ca6d0bfc2d2111025d8e342279163458a8639 (patch) | |
tree | de9d6f83bc4205763d4f8e00c0c5f8a3d7638f12 /libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp | |
parent | a17f855698d91c28a6e8d05b19f3638e256d911e (diff) | |
download | bcm5719-llvm-bb9ca6d0bfc2d2111025d8e342279163458a8639.tar.gz bcm5719-llvm-bb9ca6d0bfc2d2111025d8e342279163458a8639.zip |
[libcxx] Implement P0318: unwrap_ref_decay and unwrap_reference
Summary:
This was voted into C++20 in San Diego. Note that there was a revision
D0318R2 which did include unwrap_reference_t, but we mistakingly voted
P0318R1 into the C++20 Working Draft (which does not include
unwrap_reference_t). This patch implements D0318R2, which is what
we'll end up with in the Working Draft once this mistake has been
fixed.
Reviewers: EricWF, mclow.lists
Subscribers: christof, dexonsmith, libcxx-commits
Differential Revision: https://reviews.llvm.org/D54485
llvm-svn: 348138
Diffstat (limited to 'libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp')
-rw-r--r-- | libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp b/libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp new file mode 100644 index 00000000000..441ddf4bd56 --- /dev/null +++ b/libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <functional> +// +// template <class T> +// struct unwrap_reference; +// +// template <class T> +// using unwrap_reference_t = typename unwrap_reference<T>::type; + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +#include <functional> +#include <type_traits> + + +template <typename T, typename Expected> +void check_equal() { + static_assert(std::is_same_v<typename std::unwrap_reference<T>::type, Expected>); + static_assert(std::is_same_v<typename std::unwrap_reference<T>::type, std::unwrap_reference_t<T>>); +} + +template <typename T> +void check() { + check_equal<T, T>(); + check_equal<T&, T&>(); + check_equal<T const, T const>(); + check_equal<T const&, T const&>(); + + check_equal<std::reference_wrapper<T>, T&>(); + check_equal<std::reference_wrapper<T const>, T const&>(); +} + +struct T { }; + +int main() { + check<T>(); + check<int>(); + check<float>(); + + check<T*>(); + check<int*>(); + check<float*>(); +} |