xref: /llvm-project/libcxx/test/std/utilities/function.objects/refwrap/unwrap_reference.pass.cpp (revision 31cbe0f240f660f15602c96b787c58a26f17e179)
1bb9ca6d0SLouis Dionne //===----------------------------------------------------------------------===//
2bb9ca6d0SLouis Dionne //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bb9ca6d0SLouis Dionne //
7bb9ca6d0SLouis Dionne //===----------------------------------------------------------------------===//
8bb9ca6d0SLouis Dionne 
9bb9ca6d0SLouis Dionne // <functional>
10bb9ca6d0SLouis Dionne //
11bb9ca6d0SLouis Dionne // template <class T>
12bb9ca6d0SLouis Dionne // struct unwrap_reference;
13bb9ca6d0SLouis Dionne //
14bb9ca6d0SLouis Dionne // template <class T>
15bb9ca6d0SLouis Dionne // using unwrap_reference_t = typename unwrap_reference<T>::type;
16bb9ca6d0SLouis Dionne 
17*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
18bb9ca6d0SLouis Dionne 
19bb9ca6d0SLouis Dionne #include <functional>
20bb9ca6d0SLouis Dionne #include <type_traits>
21bb9ca6d0SLouis Dionne 
227fc6a556SMarshall Clow #include "test_macros.h"
237fc6a556SMarshall Clow 
24bb9ca6d0SLouis Dionne 
25bb9ca6d0SLouis Dionne template <typename T, typename Expected>
check_equal()26bb9ca6d0SLouis Dionne void check_equal() {
27bb9ca6d0SLouis Dionne   static_assert(std::is_same_v<typename std::unwrap_reference<T>::type, Expected>);
28bb9ca6d0SLouis Dionne   static_assert(std::is_same_v<typename std::unwrap_reference<T>::type, std::unwrap_reference_t<T>>);
29bb9ca6d0SLouis Dionne }
30bb9ca6d0SLouis Dionne 
31bb9ca6d0SLouis Dionne template <typename T>
check()32bb9ca6d0SLouis Dionne void check() {
33bb9ca6d0SLouis Dionne   check_equal<T, T>();
34bb9ca6d0SLouis Dionne   check_equal<T&, T&>();
35bb9ca6d0SLouis Dionne   check_equal<T const, T const>();
36bb9ca6d0SLouis Dionne   check_equal<T const&, T const&>();
37bb9ca6d0SLouis Dionne 
38bb9ca6d0SLouis Dionne   check_equal<std::reference_wrapper<T>, T&>();
39bb9ca6d0SLouis Dionne   check_equal<std::reference_wrapper<T const>, T const&>();
40bb9ca6d0SLouis Dionne }
41bb9ca6d0SLouis Dionne 
42bb9ca6d0SLouis Dionne struct T { };
43bb9ca6d0SLouis Dionne 
main(int,char **)442df59c50SJF Bastien int main(int, char**) {
45bb9ca6d0SLouis Dionne   check<T>();
46bb9ca6d0SLouis Dionne   check<int>();
47bb9ca6d0SLouis Dionne   check<float>();
48bb9ca6d0SLouis Dionne 
49bb9ca6d0SLouis Dionne   check<T*>();
50bb9ca6d0SLouis Dionne   check<int*>();
51bb9ca6d0SLouis Dionne   check<float*>();
522df59c50SJF Bastien 
532df59c50SJF Bastien   return 0;
54bb9ca6d0SLouis Dionne }
55