diff options
author | Philip Chimento <philip.chimento@gmail.com> | 2022-11-05 18:01:36 -0700 |
---|---|---|
committer | Philip Chimento <philip.chimento@gmail.com> | 2022-11-06 21:10:51 -0800 |
commit | f93880c356108cfdbc8f9ebe318d18f256d7128d (patch) | |
tree | 3df4f3596d8437ac78faf8dbc18a7defd1c5aff8 | |
parent | 6aca7b50785fa1638f144b17060870d721e3f65a (diff) | |
download | gjs-f93880c356108cfdbc8f9ebe318d18f256d7128d.tar.gz |
tests: Avoid using char type in uniform_int_distribution<T> template
This is undefined behaviour. GCC and pre-15.x Clang accept it, so we
didn't notice it before.
Closes: #514
-rw-r--r-- | test/gjs-tests.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/test/gjs-tests.cpp b/test/gjs-tests.cpp index 49011bba..e48734aa 100644 --- a/test/gjs-tests.cpp +++ b/test/gjs-tests.cpp @@ -56,11 +56,29 @@ static unsigned cpp_random_seed = 0; using Gjs::Test::assert_equal; template <typename T> +struct is_char_helper : public std::false_type {}; +template <> +struct is_char_helper<char> : public std::true_type {}; +template <> +struct is_char_helper<wchar_t> : public std::true_type {}; +template <> +struct is_char_helper<char16_t> : public std::true_type {}; +template <> +struct is_char_helper<char32_t> : public std::true_type {}; +template <typename T> +struct is_char : public is_char_helper<std::remove_cv_t<T>>::type {}; +template <typename T> +inline constexpr bool is_char_v = is_char<T>::value; + +template <typename T> T get_random_number() { std::mt19937_64 gen(cpp_random_seed); if constexpr (std::is_same_v<T, bool>) { return g_random_boolean(); + } else if constexpr (is_char_v<T>) { + return std::char_traits<T>::to_char_type( + get_random_number<typename std::char_traits<T>::int_type>()); } else if constexpr (std::is_integral_v<T>) { T lowest_value = std::numeric_limits<T>::lowest(); |