On Sun, Jan 11, 2026 at 07:59:19AM -0800, Stephen Hemminger wrote: > On Sun, 11 Jan 2026 10:00:32 -0500 > [email protected] wrote: > > > +#define RTE_PTR_ADD(ptr, x) \ > > + (__extension__ ({ \ > > + /* Diagnostics suppressed for internal macro operations only. \ > > + * Compiler type-checks all _Generic branches even when > > unselected, \ > > + * triggering warnings with no external impact. */ \ > > + __rte_diagnostic_push \ > > + __rte_diagnostic_ignored_wcast_qual \ > > + _Pragma("GCC diagnostic ignored > > \"-Wconditional-type-mismatch\"") \ > > + /* Uses uintptr_t arithmetic for integer types (API > > compatibility), \ > > + * and char* arithmetic for pointer types (enables > > optimization). */ \ > > + __auto_type _ptr_result = _Generic((ptr), \ > > + unsigned long long: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + long long: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + unsigned long: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + long: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + unsigned int: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + int: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + unsigned short: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + short: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + unsigned char: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + signed char: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + char: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + _Bool: ((void *)((uintptr_t)(ptr) + (x))), > > \ > > + /* Ternary with null pointer constant: per C11, if one > > operand \ > > + * is a null pointer constant and the other is a > > pointer, the \ > > + * result type is qualified per the pointer operand, > > normalizing \ > > + * const T* to const void* and T* to void*. */ \ > > + default: _Generic((1 ? (ptr) : (void *)0), \ > > + const void *: ((void *)((const char *)(ptr) + > > (x))), \ > > + default: ((void *)((char *)(ptr) + (x))) \ > > + ) \ > > + ); \ > > + __rte_diagnostic_pop \ > > + _ptr_result; \ > > + })) > > Good idea in general but the macro is way to big and therefore hard to read. > The comments could be outside the macro. > > Any code that adds dependency on a pragma to work is brittle and likely > to allow bugs through. Please figure out how to do it without.
Do we need to handle the case of users calling RTE_PTR_ADD with integer values? Using this macro to essentially cast an integer to pointer seems strange. Even if it's occasionally used, I think keeping things simple and just globally changing to use "char *" is a better approach. The only case where I'd consider trying to keep compatibility using uintptr_t is if the pointer parameter is a volatile one. Even then, we can probably handle that as with the "const" modifier, right? /Bruce

