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
This commit is contained in:
parent
16fbf01912
commit
43703bc489
@ -352,9 +352,15 @@ void __qsort_r_compat(void *, size_t, size_t, void *,
|
|||||||
__sym_compat(qsort_r, __qsort_r_compat, FBSD_1.0);
|
__sym_compat(qsort_r, __qsort_r_compat, FBSD_1.0);
|
||||||
#endif
|
#endif
|
||||||
#if defined(__generic) && !defined(__cplusplus)
|
#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) \
|
#define qsort_r(base, nel, width, arg4, arg5) \
|
||||||
__generic(arg5, int (*)(void *, const void *, const void *), \
|
__generic(arg5, int (*)(void *, const void *, const void *), \
|
||||||
__qsort_r_compat, qsort_r)(base, nel, width, arg4, arg5)
|
__qsort_r_compat, qsort_r)(base, nel, width, arg4, arg5)
|
||||||
|
#endif
|
||||||
#elif defined(__cplusplus)
|
#elif defined(__cplusplus)
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
extern "C++" {
|
extern "C++" {
|
||||||
|
Loading…
Reference in New Issue
Block a user