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
|
https://github.com/netwide-assembler/nasm/commit/44e89ba9b650b5e1533bca43682e167f51a3511f
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Date: Sun, 12 Oct 2025 12:48:32 -0700
Subject: [PATCH] compiler.h: drop the stupid C++-style cast-to-bool hack
The C++-style cast-to-bool hack was broken in concept that it doesn't help the
fundamental problem -- implicit conversions are broken for the
backwards compatibility enum definition -- as well as in
implementation, as it misspelled __STDC_VERSION__ as __STDC_VERSION.
The #ifdef bool test *should* have prevented this problem, but
apparently several compilers do define "bool" in <stdbool.h> even when
it is a keyword, in violation of the C23 spec.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
--- a/include/compiler.h
+++ b/include/compiler.h
@@ -181,19 +181,10 @@ size_t strlcpy(char *, const char *, size_t);
char * pure_func strrchrnul(const char *, int);
#endif
-#if !defined(__cplusplus) || (__STDC_VERSION >= 202311L)
/* C++ and C23 have bool, false, and true as proper keywords */
+#if !defined(__cplusplus) || (__STDC_VERSION__ >= 202311L)
# ifdef HAVE_STDBOOL_H
-/* If <stdbool.h> exists, include it explicitly to prevent it from
- begin included later, causing the "bool" macro to be defined. */
# include <stdbool.h>
-# ifdef bool
-/* Force bool to be a typedef instead of a macro. What a "clever" hack
- this is... */
- typedef bool /* The macro definition of bool */
-# undef bool
- bool; /* No longer the macro definition */
-# endif
# elif defined(HAVE___BOOL)
typedef _Bool bool;
# define false 0
@@ -201,14 +192,10 @@ char * pure_func strrchrnul(const char *, int);
# else
/* This is a bit dangerous, because casting to this ersatz bool
will not produce the same result as the standard (bool) cast.
- Instead, use the bool() constructor-style macro defined below. */
+ Instead, use the explicit construct !!x instead of relying on
+ implicit conversions or casts. */
typedef enum bool { false, true } bool;
# endif
-/* This amounts to a C++-style conversion cast to bool. This works
- because C ignores an argument-taking macro when used without an
- argument and because bool was redefined as a typedef if it previously
- was defined as a macro (see above.) */
-# define bool(x) ((bool)!!(x))
#endif
/* Create a NULL pointer of the same type as the address of
@@ -321,11 +308,11 @@ static inline void *mempset(void *dst, int c, size_t n)
* less likely to be taken.
*/
#ifdef HAVE___BUILTIN_EXPECT
-# define likely(x) __builtin_expect(bool(x), true)
-# define unlikely(x) __builtin_expect(bool(x), false)
+# define likely(x) __builtin_expect(!!(x), true)
+# define unlikely(x) __builtin_expect(!!(x), false)
#else
-# define likely(x) bool(x)
-# define unlikely(x) bool(x)
+# define likely(x) (!!(x))
+# define unlikely(x) (!!(x))
#endif
#ifdef HAVE___BUILTIN_PREFETCH
https://github.com/netwide-assembler/nasm/commit/746e7c9efa37cec9a44d84a1e96b8c38f385cc1f
From: "H. Peter Anvin (Intel)" <hpa@zytor.com>
Date: Sun, 12 Oct 2025 13:05:55 -0700
Subject: [PATCH] compiler.h: the test for "neither C++ nor C23" still wrong
The test needs to test for neither nor; as it was it tested "(not C++)
or C23" which was not at all what was intended...
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
--- a/include/compiler.h
+++ b/include/compiler.h
@@ -182,7 +182,7 @@ char * pure_func strrchrnul(const char *, int);
#endif
/* C++ and C23 have bool, false, and true as proper keywords */
-#if !defined(__cplusplus) || (__STDC_VERSION__ >= 202311L)
+#if !defined(__cplusplus) && (__STDC_VERSION__ < 202311L)
# ifdef HAVE_STDBOOL_H
# include <stdbool.h>
# elif defined(HAVE___BOOL)
|