First part of P0482 - Establish that char8_t is an integral type, and that numeric_li...
authorMarshall Clow <mclow.lists@gmail.com>
Thu, 29 Nov 2018 19:49:48 +0000 (19:49 +0000)
committerMarshall Clow <mclow.lists@gmail.com>
Thu, 29 Nov 2018 19:49:48 +0000 (19:49 +0000)
llvm-svn: 347904

35 files changed:
libcxx/include/limits
libcxx/include/type_traits
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/const_data_members.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp
libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
libcxx/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp

index f530507..5b75f4a 100644 (file)
@@ -82,6 +82,7 @@ template<> class numeric_limits<cv char>;
 template<> class numeric_limits<cv signed char>;
 template<> class numeric_limits<cv unsigned char>;
 template<> class numeric_limits<cv wchar_t>;
+template<> class numeric_limits<cv char8_t>; // C++20
 template<> class numeric_limits<cv char16_t>;
 template<> class numeric_limits<cv char32_t>;
 
index aadb97b..8ab6ac5 100644 (file)
@@ -709,6 +709,9 @@ template <>          struct __libcpp_is_integral<char>               : public tr
 template <>          struct __libcpp_is_integral<signed char>        : public true_type {};
 template <>          struct __libcpp_is_integral<unsigned char>      : public true_type {};
 template <>          struct __libcpp_is_integral<wchar_t>            : public true_type {};
+#if _LIBCPP_STD_VER > 17
+template <>          struct __libcpp_is_integral<char8_t>            : public true_type {};
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
 template <>          struct __libcpp_is_integral<char16_t>           : public true_type {};
 template <>          struct __libcpp_is_integral<char32_t>           : public true_type {};
index 6a46c37..6c28f3d 100644 (file)
@@ -9,6 +9,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 /*
 <limits>:
     numeric_limits
@@ -99,6 +101,14 @@ int main()
     TEST_NUMERIC_LIMITS(volatile wchar_t)
     TEST_NUMERIC_LIMITS(const volatile wchar_t)
 
+#if TEST_STD_VER > 17
+    // char8_t
+    TEST_NUMERIC_LIMITS(char8_t)
+    TEST_NUMERIC_LIMITS(const char8_t)
+    TEST_NUMERIC_LIMITS(volatile char8_t)
+    TEST_NUMERIC_LIMITS(const volatile char8_t)
+#endif
+
     // char16_t
     TEST_NUMERIC_LIMITS(char16_t)
     TEST_NUMERIC_LIMITS(const char16_t)
index 8deb28d..70950b3 100644 (file)
@@ -15,6 +15,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -32,6 +34,9 @@ int main()
     test<signed char>(0);
     test<unsigned char>(0);
     test<wchar_t>(0);
+#if TEST_STD_VER > 17
+    test<char8_t>(0);
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(0);
     test<char32_t>(0);
index 2dfea08..c4397ca 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 7>();
     test<unsigned char, 8>();
     test<wchar_t, std::numeric_limits<wchar_t>::is_signed ? sizeof(wchar_t)*8-1 : sizeof(wchar_t)*8>();
+#if TEST_STD_VER > 17
+    test<char8_t, 8>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 16>();
     test<char32_t, 32>();
index 2c5302c..cdb5af4 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -35,6 +37,9 @@ int main()
     test<signed char, 2>();
     test<unsigned char, 2>();
     test<wchar_t, 5*sizeof(wchar_t)/2-1>();  // 4 -> 9 and 2 -> 4
+#if TEST_STD_VER > 17
+    test<char8_t, 2>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 4>();
     test<char32_t, 9>();
index 0cce484..153e485 100644 (file)
@@ -15,6 +15,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -32,6 +34,9 @@ int main()
     test<signed char>(0);
     test<unsigned char>(0);
     test<wchar_t>(0);
+#if TEST_STD_VER > 17
+    test<char8_t>(0);
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(0);
     test<char32_t>(0);
index e618020..aa9f1b6 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, std::float_denorm_style expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, std::denorm_absent>();
     test<unsigned char, std::denorm_absent>();
     test<wchar_t, std::denorm_absent>();
+#if TEST_STD_VER > 17
+    test<char8_t, std::denorm_absent>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, std::denorm_absent>();
     test<char32_t, std::denorm_absent>();
index 660ecf5..6430f97 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, false>();
     test<wchar_t, false>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index f8ca205..97d4db7 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, false>();
     test<wchar_t, false>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index 7592171..5573a2f 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, false>();
     test<wchar_t, false>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index d68cd5d..45640e1 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, false>();
     test<wchar_t, false>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index 033ecdc..593ee23 100644 (file)
@@ -15,6 +15,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -34,6 +36,9 @@ int main()
     test<signed char>(0);
     test<unsigned char>(0);
     test<wchar_t>(0);
+#if TEST_STD_VER > 17
+    test<char8_t>(0);
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(0);
     test<char32_t>(0);
index fa714d5..5afbf2f 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, true>();
     test<unsigned char, true>();
     test<wchar_t, true>();
+#if TEST_STD_VER > 17
+    test<char8_t, true>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, true>();
     test<char32_t, true>();
index b96a0e7..a6a59ab 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, true>();
     test<unsigned char, true>();
     test<wchar_t, true>();
+#if TEST_STD_VER > 17
+    test<char8_t, true>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, true>();
     test<char32_t, true>();
index 4408714..20dd0c6 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, false>();
     test<wchar_t, false>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index 79bc586..da2a7f8 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, true>();
     test<unsigned char, true>();
     test<wchar_t, true>();
+#if TEST_STD_VER > 17
+    test<char8_t, true>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, true>();
     test<char32_t, true>();
index 6a60996..d5505c6 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, true>();
 //    test<wchar_t, false>(); // don't know
+#if TEST_STD_VER > 17
+    test<char8_t, true>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, true>();
     test<char32_t, true>();
index 28570fd..93eecf1 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, true>();
     test<unsigned char, false>();
     test<wchar_t, wchar_t(-1) < wchar_t(0)>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index 21090aa..6e66625 100644 (file)
@@ -17,6 +17,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -38,6 +40,9 @@ int main()
     test<signed char>(SCHAR_MIN);
     test<unsigned char>(0);
     test<wchar_t>(WCHAR_MIN);
+#if TEST_STD_VER > 17
+    test<char8_t>(0);
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(0);
     test<char32_t>(0);
index 7517aaa..cf04ea1 100644 (file)
@@ -17,6 +17,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -38,6 +40,9 @@ int main()
     test<signed char>(SCHAR_MAX);
     test<unsigned char>(UCHAR_MAX);
     test<wchar_t>(WCHAR_MAX);
+#if TEST_STD_VER > 17
+    test<char8_t>(UCHAR_MAX); // ??
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(USHRT_MAX);
     test<char32_t>(UINT_MAX);
index de771eb..c3bbbd2 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 0>();
     test<unsigned char, 0>();
     test<wchar_t, 0>();
+#if TEST_STD_VER > 17
+    test<char8_t, 0>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 0>();
     test<char32_t, 0>();
index 6b61f7b..3e5d609 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 0>();
     test<unsigned char, 0>();
     test<wchar_t, 0>();
+#if TEST_STD_VER > 17
+    test<char8_t, 0>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 0>();
     test<char32_t, 0>();
index 927585e..ba45ba3 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 0>();
     test<unsigned char, 0>();
     test<wchar_t, 0>();
+#if TEST_STD_VER > 17
+    test<char8_t, 0>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 0>();
     test<char32_t, 0>();
index e72fbba..4ace466 100644 (file)
@@ -17,6 +17,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -38,6 +40,9 @@ int main()
     test<signed char>(SCHAR_MIN);
     test<unsigned char>(0);
     test<wchar_t>(WCHAR_MIN);
+#if TEST_STD_VER > 17
+    test<char8_t>(0);
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(0);
     test<char32_t>(0);
index 245e844..cb20bdb 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 0>();
     test<unsigned char, 0>();
     test<wchar_t, 0>();
+#if TEST_STD_VER > 17
+    test<char8_t, 0>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 0>();
     test<char32_t, 0>();
index b54d46f..765f04f 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 0>();
     test<unsigned char, 0>();
     test<wchar_t, 0>();
+#if TEST_STD_VER > 17
+    test<char8_t, 0>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 0>();
     test<char32_t, 0>();
index 97166f0..ff4de39 100644 (file)
@@ -16,6 +16,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test_imp(std::true_type)
@@ -51,6 +53,9 @@ int main()
     test<signed char>();
     test<unsigned char>();
     test<wchar_t>();
+#if TEST_STD_VER > 17
+    test<char8_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>();
     test<char32_t>();
index 98a2a53..a436c01 100644 (file)
@@ -14,6 +14,8 @@
 #include <limits>
 #include <cfloat>
 
+#include "test_macros.h"
+
 template <class T, int expected>
 void
 test()
@@ -31,6 +33,9 @@ int main()
     test<signed char, 2>();
     test<unsigned char, 2>();
     test<wchar_t, 2>();
+#if TEST_STD_VER > 17
+    test<char8_t, 2>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, 2>();
     test<char32_t, 2>();
index 5da5c95..1c37603 100644 (file)
@@ -15,6 +15,8 @@
 #include <cfloat>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test(T expected)
@@ -32,6 +34,9 @@ int main()
     test<signed char>(0);
     test<unsigned char>(0);
     test<wchar_t>(0);
+#if TEST_STD_VER > 17
+    test<char8_t>(0);
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>(0);
     test<char32_t>(0);
index 645f6f7..60f378a 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, std::float_round_style expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, std::round_toward_zero>();
     test<unsigned char, std::round_toward_zero>();
     test<wchar_t, std::round_toward_zero>();
+#if TEST_STD_VER > 17
+    test<char8_t, std::round_toward_zero>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, std::round_toward_zero>();
     test<char32_t, std::round_toward_zero>();
index d9df999..14d66d2 100644 (file)
@@ -16,6 +16,8 @@
 #include <type_traits>
 #include <cassert>
 
+#include "test_macros.h"
+
 template <class T>
 void
 test_imp(std::true_type)
@@ -51,6 +53,9 @@ int main()
     test<signed char>();
     test<unsigned char>();
     test<wchar_t>();
+#if TEST_STD_VER > 17
+    test<char8_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t>();
     test<char32_t>();
index 9e2a843..4acde93 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 template <class T, bool expected>
 void
 test()
@@ -30,6 +32,9 @@ int main()
     test<signed char, false>();
     test<unsigned char, false>();
     test<wchar_t, false>();
+#if TEST_STD_VER > 17
+    test<char8_t, false>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, false>();
     test<char32_t, false>();
index 23811fa..3c3ae5b 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <limits>
 
+#include "test_macros.h"
+
 #if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || \
     defined(__wasm__)
 static const bool integral_types_trap = true;
@@ -37,6 +39,9 @@ int main()
     test<signed char, integral_types_trap>();
     test<unsigned char, integral_types_trap>();
     test<wchar_t, integral_types_trap>();
+#if TEST_STD_VER > 17
+    test<char8_t, integral_types_trap>();
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     test<char16_t, integral_types_trap>();
     test<char32_t, integral_types_trap>();
index 0999762..ba7c99c 100644 (file)
@@ -85,6 +85,9 @@ int main()
     test_is_integral<signed char>();
     test_is_integral<unsigned char>();
     test_is_integral<wchar_t>();
+#if TEST_STD_VER > 14
+    test_is_integral<char8_t>();
+#endif
 
     test_is_not_integral<std::nullptr_t>();
     test_is_not_integral<void>();