From 43703bc489ec504b947b869045c492ed38c1a69c Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Thu, 19 Jan 2023 14:48:52 -0800 Subject: [PATCH] stdlib.h: Fix qsort_r compatibility with GCC 12. GCC 12 (unlike GCC 9) does not match a function argument passed to the old qsort_r() API (as is used in the qsort_r_compat test) to a function pointer type via __generic. It treats the function type as a distinct type from a function pointer. As a workaround, add a second definition of qsort_r for GCC 12 which uses the bare function type. Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D37410 --- include/stdlib.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/stdlib.h b/include/stdlib.h index 754e8f5f5fd4..30d24aea1c10 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -352,9 +352,15 @@ void __qsort_r_compat(void *, size_t, size_t, void *, __sym_compat(qsort_r, __qsort_r_compat, FBSD_1.0); #endif #if defined(__generic) && !defined(__cplusplus) +#if __GNUC__ == 12 +#define qsort_r(base, nel, width, arg4, arg5) \ + __generic(arg5, int (void *, const void *, const void *), \ + __qsort_r_compat, qsort_r)(base, nel, width, arg4, arg5) +#else #define qsort_r(base, nel, width, arg4, arg5) \ __generic(arg5, int (*)(void *, const void *, const void *), \ __qsort_r_compat, qsort_r)(base, nel, width, arg4, arg5) +#endif #elif defined(__cplusplus) __END_DECLS extern "C++" {