spa: fixes for dereferencing pointer to incomplete type in __typeof__

before gcc 10 its not supporting pointer dereferencing in __typeof__.
    so made changes according to that. Fixes #3375

    clang also defines __GNUC__ and resolves '4' along with __clang__ which
    resolves '1'. On any version of clang, __GNUC__ and resolves '4'.
    anyway clang has this feature since version 3.
This commit is contained in:
Sourav Das 2023-07-30 10:23:25 +05:30
parent 3a8894d2a4
commit c6c3259a08

View file

@ -40,13 +40,20 @@ __extension__ ({ \
_old_value; \ _old_value; \
}) })
#if __GNUC__ > 10 || defined(__clang__)
#define spa_steal_ptr(ptr) ((__typeof__(*(ptr)) *) spa_exchange((ptr), NULL)) #define spa_steal_ptr(ptr) ((__typeof__(*(ptr)) *) spa_exchange((ptr), NULL))
#else
#define spa_steal_ptr(ptr) ((__typeof__(ptr)) spa_exchange((ptr), NULL))
#endif
#define spa_steal_fd(fd) spa_exchange((fd), -1) #define spa_steal_fd(fd) spa_exchange((fd), -1)
/* ========================================================================== */ /* ========================================================================== */
#include <stdlib.h> #include <stdlib.h>
#if __GNUC__ > 10 || defined(__clang__)
#define spa_clear_ptr(ptr, destructor) \ #define spa_clear_ptr(ptr, destructor) \
__extension__ ({ \ __extension__ ({ \
__typeof__(*(ptr)) *_old_value = spa_steal_ptr(ptr); \ __typeof__(*(ptr)) *_old_value = spa_steal_ptr(ptr); \
@ -54,6 +61,15 @@ __extension__ ({ \
destructor(_old_value); \ destructor(_old_value); \
(void) 0; \ (void) 0; \
}) })
#else
#define spa_clear_ptr(ptr, destructor) \
__extension__ ({ \
__typeof__(ptr) _old_value = spa_steal_ptr(ptr); \
if (_old_value) \
destructor(_old_value); \
(void) 0; \
})
#endif
static inline void _spa_autofree_cleanup_func(void *p) static inline void _spa_autofree_cleanup_func(void *p)
{ {