diff --git a/src/util/u_vector.h b/src/util/u_vector.h index 1283e78b70c..f13fd72ed16 100644 --- a/src/util/u_vector.h +++ b/src/util/u_vector.h @@ -98,10 +98,18 @@ u_vector_finish(struct u_vector *queue) free(queue->data); } +#ifdef __cplusplus +#define u_vector_element_cast(elem) (decltype(elem)) +#else +#define u_vector_element_cast(elem) (void *) +#endif + #define u_vector_foreach(elem, queue) \ STATIC_ASSERT(__builtin_types_compatible_p(__typeof__(queue), struct u_vector *)); \ for (uint32_t __u_vector_offset = (queue)->tail; \ - elem = (void *)((char *)(queue)->data + (__u_vector_offset & ((queue)->size - 1))), __u_vector_offset != (queue)->head; \ + elem = u_vector_element_cast(elem)((char *)(queue)->data + \ + (__u_vector_offset & ((queue)->size - 1))), \ + __u_vector_offset != (queue)->head; \ __u_vector_offset += (queue)->element_size) #ifdef __cplusplus