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 17bb9ca6d0SLouis Dionne // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 18bb9ca6d0SLouis Dionne 19bb9ca6d0SLouis Dionne #include <functional> 20bb9ca6d0SLouis Dionne #include <type_traits> 21bb9ca6d0SLouis Dionne 22*7fc6a556SMarshall Clow #include "test_macros.h" 23*7fc6a556SMarshall Clow 24bb9ca6d0SLouis Dionne 25bb9ca6d0SLouis Dionne template <typename T, typename Expected> 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> 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 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