Module Name: src
Committed By: riastradh
Date: Sat Mar 29 15:48:26 UTC 2025
Modified Files:
src/sys/sys: cdefs.h
Log Message:
__predict_true/false: Make these work with C++ too.
Should fix build after recent assert.h change.
error: no match for `operator!=' (operand types are `...' and `int')
PR lib/59231: assert.h: missing branch prediction
To generate a diff of this commit:
cvs rdiff -u -r1.163 -r1.164 src/sys/sys/cdefs.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/sys/cdefs.h
diff -u src/sys/sys/cdefs.h:1.163 src/sys/sys/cdefs.h:1.164
--- src/sys/sys/cdefs.h:1.163 Sun May 12 10:34:56 2024
+++ src/sys/sys/cdefs.h Sat Mar 29 15:48:26 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: cdefs.h,v 1.163 2024/05/12 10:34:56 rillig Exp $ */
+/* $NetBSD: cdefs.h,v 1.164 2025/03/29 15:48:26 riastradh Exp $ */
/* * Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
@@ -546,10 +546,17 @@
* seldomly (e.g. at subsystem initialization time) as the
* basic block reordering that this affects can often generate
* larger code.
+ *
+ * We use an explicit ternary operator to map any value to exactly 0 or
+ * 1 so that (a) we can specify one value to expect, and (b) the given
+ * expression occurs only in the position of a conditional so that C++
+ * classes with conversion to bool work as if this were a conditional.
+ * In contrast, say, `(exp) != 0' would require the type of exp to
+ * support conversion to integer as well.
*/
#if __GNUC_PREREQ__(2, 96) || defined(__lint__)
-#define __predict_true(exp) __builtin_expect((exp) != 0, 1)
-#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
+#define __predict_true(exp) __builtin_expect((exp) ? 1 : 0, 1)
+#define __predict_false(exp) __builtin_expect((exp) ? 1 : 0, 0)
#else
#define __predict_true(exp) (exp)
#define __predict_false(exp) (exp)