]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-134586: mark `_mi_assert_fail` as `noreturn`, `cold` and `throw` (#134624)
authorBénédikt Tran <10796600+picnixz@users.noreply.github.com>
Fri, 30 May 2025 12:44:03 +0000 (14:44 +0200)
committerGitHub <noreply@github.com>
Fri, 30 May 2025 12:44:03 +0000 (14:44 +0200)
We add the following attributes on `_mi_assert_fail` to help IDE introspection:

* `__attribute__((__noreturn__))`
* `__attribute__((cold))`
* `__THROW` (GCC only)

Include/internal/mimalloc/mimalloc/types.h

index 4f77bd7bc525db80167e2f9f5a5c81be8dde41bb..a04169f7fb84e8fec625bcb87365112e78f97e54 100644 (file)
@@ -50,6 +50,32 @@ terms of the MIT license. A copy of the license can be found in the file
 #define mi_decl_cache_align
 #endif
 
+#if (MI_DEBUG)
+#if defined(_MSC_VER)
+#define mi_decl_noreturn        __declspec(noreturn)
+#elif (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__clang__)
+#define mi_decl_noreturn        __attribute__((__noreturn__))
+#else
+#define mi_decl_noreturn
+#endif
+
+/*
+ * 'cold' attribute seems to have been fully supported since GCC 4.x.
+ * See https://github.com/gcc-mirror/gcc/commit/52bf96d2f299e9e6.
+ */
+#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
+#define mi_decl_cold            __attribute__((cold))
+#else
+#define mi_decl_cold
+#endif
+
+#if (defined(__GNUC__) && defined(__THROW))
+#define mi_decl_throw           __THROW
+#else
+#define mi_decl_throw
+#endif
+#endif
+
 // ------------------------------------------------------
 // Variants
 // ------------------------------------------------------
@@ -582,7 +608,8 @@ struct mi_heap_s {
 
 #if (MI_DEBUG)
 // use our own assertion to print without memory allocation
-void _mi_assert_fail(const char* assertion, const char* fname, unsigned int line, const char* func );
+mi_decl_noreturn mi_decl_cold mi_decl_throw
+void _mi_assert_fail(const char* assertion, const char* fname, unsigned int line, const char* func);
 #define mi_assert(expr)     ((expr) ? (void)0 : _mi_assert_fail(#expr,__FILE__,__LINE__,__func__))
 #else
 #define mi_assert(x)