summaryrefslogtreecommitdiff
path: root/dev-libs/gjs/files/gjs-1.64.5-gcc-11-support.patch
blob: 3808b6d7862b08e06229337add89235a9205cb48 (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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
From 757d42d87e8a3b52a0782bc9cbd33c788ecc34e4 Mon Sep 17 00:00:00 2001
From: Philip Chimento <philip.chimento@gmail.com>
Date: Mon, 15 Feb 2021 20:40:43 -0800
Subject: [PATCH 1/2] GjsPrivate: Remove volatile from g_once_init_enter flag

On platforms where g_once_init_enter() is defined to use C11 atomic
builtins, passing a pointer to a volatile value will generate a warning
in GCC 11 and later.

More info about the GCC change:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95378
https://gcc.gnu.org/pipermail/gcc-patches/2020-June/548283.html

More info about changes made in GLib:
https://gitlab.gnome.org/GNOME/glib/-/issues/600

See: #376
(cherry picked from commit 989ac9ac723dc1c8b6b8961292f236c558f5c0f0)
---
 libgjs-private/gjs-util.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libgjs-private/gjs-util.c b/libgjs-private/gjs-util.c
index 20a732d5..f7f3189a 100644
--- a/libgjs-private/gjs-util.c
+++ b/libgjs-private/gjs-util.c
@@ -57,8 +57,8 @@ gjs_format_int_alternative_output(int n)
 GType
 gjs_locale_category_get_type(void)
 {
-  static volatile size_t g_define_type_id__volatile = 0;
-  if (g_once_init_enter(&g_define_type_id__volatile)) {
+    static size_t gjs_locale_category_get_type = 0;
+    if (g_once_init_enter(&gjs_locale_category_get_type)) {
       static const GEnumValue v[] = {
           { GJS_LOCALE_CATEGORY_ALL, "GJS_LOCALE_CATEGORY_ALL", "all" },
           { GJS_LOCALE_CATEGORY_COLLATE, "GJS_LOCALE_CATEGORY_COLLATE", "collate" },
@@ -72,9 +72,9 @@ gjs_locale_category_get_type(void)
       GType g_define_type_id =
         g_enum_register_static(g_intern_static_string("GjsLocaleCategory"), v);
 
-      g_once_init_leave(&g_define_type_id__volatile, g_define_type_id);
+      g_once_init_leave(&gjs_locale_category_get_type, g_define_type_id);
   }
-  return g_define_type_id__volatile;
+  return gjs_locale_category_get_type;
 }
 
 /**
-- 
2.35.1

From dade6ee66e07a1865dc380060abe921eaeeae763 Mon Sep 17 00:00:00 2001
From: Philip Chimento <philip.chimento@gmail.com>
Date: Sun, 14 Feb 2021 12:20:09 -0800
Subject: [PATCH 2/2] maint: Avoid g_once_init_enter error in GCC 11

On platforms where g_once_init_enter() is defined to use C11 atomic
builtins, passing a pointer to a volatile value is an error in GCC 11 and
later, in C++.

More info about the GCC change:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95378
https://gcc.gnu.org/pipermail/gcc-patches/2020-June/548283.html

However, it's my understanding that in modern C++ there is no longer a
need to guard the initialization of these variables. Since C++11, static
local variables in a function are guaranteed to be initialized only once,
the first time control passes through that function. So we can just remove
the g_once_init_enter guard.

More info:
https://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables

Stack Overflow answers with quotations from the C++ standard:
https://stackoverflow.com/a/58804/172999
https://stackoverflow.com/a/8102145/172999

Closes: #376
(cherry picked from commit f02eaf3a9d3465915eb849428c2d9615e2184a4c)
---
 gjs/error-types.cpp | 32 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 19 deletions(-)

diff --git a/gjs/error-types.cpp b/gjs/error-types.cpp
index 86cb8789..5eba61b2 100644
--- a/gjs/error-types.cpp
+++ b/gjs/error-types.cpp
@@ -31,24 +31,18 @@ G_DEFINE_QUARK(gjs-js-error-quark, gjs_js_error)
 // clang-format on
 
 GType gjs_js_error_get_type(void) {
-    static volatile GType g_type_id;
-
-    if (g_once_init_enter(&g_type_id)) {
-        static GEnumValue errors[] = {
-            { GJS_JS_ERROR_ERROR, "Error", "error" },
-            { GJS_JS_ERROR_EVAL_ERROR, "EvalError", "eval-error" },
-            { GJS_JS_ERROR_INTERNAL_ERROR, "InternalError", "internal-error" },
-            { GJS_JS_ERROR_RANGE_ERROR, "RangeError", "range-error" },
-            { GJS_JS_ERROR_REFERENCE_ERROR, "ReferenceError", "reference-error" },
-            { GJS_JS_ERROR_STOP_ITERATION, "StopIteration", "stop-iteration" },
-            { GJS_JS_ERROR_SYNTAX_ERROR, "SyntaxError", "syntax-error" },
-            { GJS_JS_ERROR_TYPE_ERROR, "TypeError", "type-error" },
-            { GJS_JS_ERROR_URI_ERROR, "URIError", "uri-error" },
-            { 0, nullptr, nullptr }
-        };
-
-        g_type_id = g_enum_register_static("GjsJSError", errors);
-    }
-
+    static const GEnumValue errors[] = {
+        {GJS_JS_ERROR_ERROR, "Error", "error"},
+        {GJS_JS_ERROR_EVAL_ERROR, "EvalError", "eval-error"},
+        {GJS_JS_ERROR_INTERNAL_ERROR, "InternalError", "internal-error"},
+        {GJS_JS_ERROR_RANGE_ERROR, "RangeError", "range-error"},
+        {GJS_JS_ERROR_REFERENCE_ERROR, "ReferenceError", "reference-error"},
+        {GJS_JS_ERROR_STOP_ITERATION, "StopIteration", "stop-iteration"},
+        {GJS_JS_ERROR_SYNTAX_ERROR, "SyntaxError", "syntax-error"},
+        {GJS_JS_ERROR_TYPE_ERROR, "TypeError", "type-error"},
+        {GJS_JS_ERROR_URI_ERROR, "URIError", "uri-error"},
+        {0, nullptr, nullptr}};
+    // Initialization of static local variable guaranteed only once in C++11
+    static GType g_type_id = g_enum_register_static("GjsJSError", errors);
     return g_type_id;
 }
-- 
2.35.1