1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//                     The LLVM Compiler Infrastructure
4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// type_traits
11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// make_unsigned
13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <type_traits>
15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
16ec1f15d9af7c014002aa27b9bb5b8f9aa1714532Eric Fiselier#include "test_macros.h"
17ec1f15d9af7c014002aa27b9bb5b8f9aa1714532Eric Fiselier
18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantenum Enum {zero, one_};
19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
20ec1f15d9af7c014002aa27b9bb5b8f9aa1714532Eric Fiselier#if TEST_STD_VER >= 11
21ec1f15d9af7c014002aa27b9bb5b8f9aa1714532Eric Fiselierenum BigEnum : unsigned long long // MSVC's ABI doesn't follow the Standard
22ec1f15d9af7c014002aa27b9bb5b8f9aa1714532Eric Fiselier#else
23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantenum BigEnum
24ec1f15d9af7c014002aa27b9bb5b8f9aa1714532Eric Fiselier#endif
25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
26aa87532fee72a30669efb5a673343b390284502dRichard Smith    bigzero,
27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    big = 0xFFFFFFFFFFFFFFFFULL
28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant};
29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
308a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf#if !defined(_LIBCPP_HAS_NO_INT128) && !defined(_LIBCPP_HAS_NO_STRONG_ENUMS)
318a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorfenum HugeEnum : __int128_t
328a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf{
338a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf    hugezero
348a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf};
358a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf#endif
368a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf
37933afa9761c1c1f916161278a99284d50a594939Marshall Clowtemplate <class T, class U>
38933afa9761c1c1f916161278a99284d50a594939Marshall Clowvoid test_make_unsigned()
39933afa9761c1c1f916161278a99284d50a594939Marshall Clow{
40933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert((std::is_same<typename std::make_unsigned<T>::type, U>::value), "");
41e619862dbf0c4a46db6e3d816bcafcfef6e85977Stephan T. Lavavej#if TEST_STD_VER > 11
42933afa9761c1c1f916161278a99284d50a594939Marshall Clow    static_assert((std::is_same<std::make_unsigned_t<T>, U>::value), "");
43933afa9761c1c1f916161278a99284d50a594939Marshall Clow#endif
44933afa9761c1c1f916161278a99284d50a594939Marshall Clow}
45933afa9761c1c1f916161278a99284d50a594939Marshall Clow
46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main()
47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
48933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<signed char, unsigned char> ();
49933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<unsigned char, unsigned char> ();
50933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<char, unsigned char> ();
51933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<short, unsigned short> ();
52933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<unsigned short, unsigned short> ();
53933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<int, unsigned int> ();
54933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<unsigned int, unsigned int> ();
55933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<long, unsigned long> ();
56933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<unsigned long, unsigned long> ();
57933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<long long, unsigned long long> ();
58933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<unsigned long long, unsigned long long> ();
59ef7a7b730c0dbfc3bf31d6246780e0cd7e07774fHoward Hinnant    test_make_unsigned<wchar_t, std::conditional<sizeof(wchar_t) == 4, unsigned int, unsigned short>::type> ();
60ef7a7b730c0dbfc3bf31d6246780e0cd7e07774fHoward Hinnant    test_make_unsigned<const wchar_t, std::conditional<sizeof(wchar_t) == 4, const unsigned int, const unsigned short>::type> ();
6109d8c46f3099b7a2bbb42ed65fcde8b9d5a0ed39Jonathan Roelofs    test_make_unsigned<const Enum, std::conditional<sizeof(Enum) == sizeof(int), const unsigned int, const unsigned char>::type >();
62933afa9761c1c1f916161278a99284d50a594939Marshall Clow    test_make_unsigned<BigEnum,
63933afa9761c1c1f916161278a99284d50a594939Marshall Clow                   std::conditional<sizeof(long) == 4, unsigned long long, unsigned long>::type> ();
648a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf#ifndef _LIBCPP_HAS_NO_INT128
658a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf    test_make_unsigned<__int128_t, __uint128_t>();
668a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf    test_make_unsigned<__uint128_t, __uint128_t>();
678a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf# ifndef _LIBCPP_HAS_NO_STRONG_ENUMS
688a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf    test_make_unsigned<HugeEnum, __uint128_t>();
698a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf# endif
708a71d236336705a49257d43ac8d986ba3d5f5060Stephan Tolksdorf#endif
71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
72