summaryrefslogtreecommitdiff
blob: 43439e6f2c2aa305cae19b16ecd4d5c504873273 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
https://bugs.gentoo.org/905430
https://github.com/linuxmint/cjs/issues/115
https://gitlab.gnome.org/GNOME/gjs/-/issues/514
https://gitlab.gnome.org/GNOME/gjs/-/commit/9b11ed0ba70718a8b1983126563cea58658a808f

From f93880c356108cfdbc8f9ebe318d18f256d7128d Mon Sep 17 00:00:00 2001
From: Philip Chimento <philip.chimento@gmail.com>
Date: Sat, 5 Nov 2022 18:01:36 -0700
Subject: [PATCH] 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
--- a/test/gjs-tests.cpp
+++ b/test/gjs-tests.cpp
@@ -55,12 +55,30 @@ 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();
 
-- 
GitLab