First part of P0482 - Establish that char8_t is an integral type, and that numeric_limits<char8_t> is valid and sane. (second try)
llvm-svn: 347930
diff --git a/libcxx/include/limits b/libcxx/include/limits
index f530507..5b75f4a9 100644
--- a/libcxx/include/limits
+++ b/libcxx/include/limits
@@ -82,6 +82,7 @@
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>;
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits
index aadb97b..09c0019 100644
--- a/libcxx/include/type_traits
+++ b/libcxx/include/type_traits
@@ -709,6 +709,9 @@
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 && defined(__cpp_char8_t)
+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 {};
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/const_data_members.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/const_data_members.pass.cpp
index 6a46c37..11772f6 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/const_data_members.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/const_data_members.pass.cpp
@@ -9,6 +9,8 @@
#include <limits>
+#include "test_macros.h"
+
/*
<limits>:
numeric_limits
@@ -99,6 +101,14 @@
TEST_NUMERIC_LIMITS(volatile wchar_t)
TEST_NUMERIC_LIMITS(const volatile wchar_t)
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ // 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)
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp
index 8deb28d..8a3ca00 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/denorm_min.pass.cpp
@@ -15,6 +15,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -32,6 +34,9 @@
test<signed char>(0);
test<unsigned char>(0);
test<wchar_t>(0);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(0);
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(0);
test<char32_t>(0);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp
index 2dfea08..7dec03d 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
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 && defined(__cpp_char8_t)
+ test<char8_t, 8>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 16>();
test<char32_t, 32>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp
index 2c5302c..017f863 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/digits10.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -35,6 +37,9 @@
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 && defined(__cpp_char8_t)
+ test<char8_t, 2>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 4>();
test<char32_t, 9>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp
index 0cce484..b27f5c5 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/epsilon.pass.cpp
@@ -15,6 +15,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -32,6 +34,9 @@
test<signed char>(0);
test<unsigned char>(0);
test<wchar_t>(0);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(0);
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(0);
test<char32_t>(0);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp
index e618020..5096ad2 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, std::float_denorm_style expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, std::denorm_absent>();
test<unsigned char, std::denorm_absent>();
test<wchar_t, std::denorm_absent>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ 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>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp
index 660ecf5..1b087f0 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_denorm_loss.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, false>();
test<wchar_t, false>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp
index f8ca205..1391f20 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_infinity.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, false>();
test<wchar_t, false>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp
index 7592171..cb5736f 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_quiet_NaN.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, false>();
test<wchar_t, false>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp
index d68cd5d..4f43a65 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/has_signaling_NaN.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, false>();
test<wchar_t, false>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp
index 033ecdc..241f9cc 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/infinity.pass.cpp
@@ -15,6 +15,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -34,6 +36,9 @@
test<signed char>(0);
test<unsigned char>(0);
test<wchar_t>(0);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(0);
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(0);
test<char32_t>(0);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp
index fa714d5..e00afa9 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_bounded.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, true>();
test<unsigned char, true>();
test<wchar_t, true>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, true>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, true>();
test<char32_t, true>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp
index b96a0e7..8431b73 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_exact.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, true>();
test<unsigned char, true>();
test<wchar_t, true>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, true>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, true>();
test<char32_t, true>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp
index 4408714..2e9ac22 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_iec559.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, false>();
test<wchar_t, false>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp
index 79bc586..6e321d1 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_integer.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, true>();
test<unsigned char, true>();
test<wchar_t, true>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, true>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, true>();
test<char32_t, true>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp
index 6a60996..f6412a9 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_modulo.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, true>();
// test<wchar_t, false>(); // don't know
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, true>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, true>();
test<char32_t, true>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp
index 28570fd..b7a8926 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/is_signed.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, true>();
test<unsigned char, false>();
test<wchar_t, wchar_t(-1) < wchar_t(0)>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
index 21090aa..f505f41 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
@@ -17,6 +17,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -38,6 +40,9 @@
test<signed char>(SCHAR_MIN);
test<unsigned char>(0);
test<wchar_t>(WCHAR_MIN);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(0);
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(0);
test<char32_t>(0);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
index 7517aaa..65d5150 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
@@ -17,6 +17,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -38,6 +40,9 @@
test<signed char>(SCHAR_MAX);
test<unsigned char>(UCHAR_MAX);
test<wchar_t>(WCHAR_MAX);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(UCHAR_MAX); // ??
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(USHRT_MAX);
test<char32_t>(UINT_MAX);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp
index de771eb..158e279 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_digits10.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
test<signed char, 0>();
test<unsigned char, 0>();
test<wchar_t, 0>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, 0>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 0>();
test<char32_t, 0>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp
index 6b61f7b..6493109 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
test<signed char, 0>();
test<unsigned char, 0>();
test<wchar_t, 0>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, 0>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 0>();
test<char32_t, 0>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp
index 927585e..c4c7a30 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/max_exponent10.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
test<signed char, 0>();
test<unsigned char, 0>();
test<wchar_t, 0>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, 0>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 0>();
test<char32_t, 0>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
index e72fbba..a1e61fc 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
@@ -17,6 +17,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -38,6 +40,9 @@
test<signed char>(SCHAR_MIN);
test<unsigned char>(0);
test<wchar_t>(WCHAR_MIN);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(0);
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(0);
test<char32_t>(0);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp
index 245e844..930d011 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
test<signed char, 0>();
test<unsigned char, 0>();
test<wchar_t, 0>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, 0>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 0>();
test<char32_t, 0>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp
index b54d46f..05891b1 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/min_exponent10.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
test<signed char, 0>();
test<unsigned char, 0>();
test<wchar_t, 0>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, 0>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 0>();
test<char32_t, 0>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp
index 97166f0..5d5597c 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/quiet_NaN.pass.cpp
@@ -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 @@
test<signed char>();
test<unsigned char>();
test<wchar_t>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>();
test<char32_t>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp
index 98a2a53..1514ae8 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/radix.pass.cpp
@@ -14,6 +14,8 @@
#include <limits>
#include <cfloat>
+#include "test_macros.h"
+
template <class T, int expected>
void
test()
@@ -31,6 +33,9 @@
test<signed char, 2>();
test<unsigned char, 2>();
test<wchar_t, 2>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, 2>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, 2>();
test<char32_t, 2>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp
index 5da5c95..3c2dc54 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_error.pass.cpp
@@ -15,6 +15,8 @@
#include <cfloat>
#include <cassert>
+#include "test_macros.h"
+
template <class T>
void
test(T expected)
@@ -32,6 +34,9 @@
test<signed char>(0);
test<unsigned char>(0);
test<wchar_t>(0);
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>(0);
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>(0);
test<char32_t>(0);
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp
index 645f6f7..f1fd200 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/round_style.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, std::float_round_style expected>
void
test()
@@ -30,6 +32,9 @@
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 && defined(__cpp_char8_t)
+ 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>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp
index d9df999..a0a6d7f 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/signaling_NaN.pass.cpp
@@ -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 @@
test<signed char>();
test<unsigned char>();
test<wchar_t>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t>();
test<char32_t>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp
index 9e2a843..901eea4 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/tinyness_before.pass.cpp
@@ -13,6 +13,8 @@
#include <limits>
+#include "test_macros.h"
+
template <class T, bool expected>
void
test()
@@ -30,6 +32,9 @@
test<signed char, false>();
test<unsigned char, false>();
test<wchar_t, false>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test<char8_t, false>();
+#endif
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
test<char16_t, false>();
test<char32_t, false>();
diff --git a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
index 23811fa..8e407c2 100644
--- a/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/limits/numeric.limits.members/traps.pass.cpp
@@ -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 @@
test<signed char, integral_types_trap>();
test<unsigned char, integral_types_trap>();
test<wchar_t, integral_types_trap>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ 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>();
diff --git a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp
index 0999762..fa81b11 100644
--- a/libcxx/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp
+++ b/libcxx/test/std/utilities/meta/meta.unary/meta.unary.cat/is_integral.pass.cpp
@@ -85,6 +85,9 @@
test_is_integral<signed char>();
test_is_integral<unsigned char>();
test_is_integral<wchar_t>();
+#if TEST_STD_VER > 17 && defined(__cpp_char8_t)
+ test_is_integral<char8_t>();
+#endif
test_is_not_integral<std::nullptr_t>();
test_is_not_integral<void>();