From: Mathieu Desnoyers Date: Thu, 22 Jun 2023 13:58:39 +0000 (-0400) Subject: compiler.h: Introduce caa_unqual_scalar_typeof X-Git-Tag: v0.14.1~22 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=e36d48ad1a312aa3135849e83789701a8311ba44;p=userspace-rcu.git compiler.h: Introduce caa_unqual_scalar_typeof Allow defining variables and cast with a typeof which removes the volatile and const qualifiers. Signed-off-by: Mathieu Desnoyers Change-Id: Ie2ea915a600a69cec3c2ff64209892bf0794cb70 --- diff --git a/include/urcu/compiler.h b/include/urcu/compiler.h index 2f32b38..827ec1f 100644 --- a/include/urcu/compiler.h +++ b/include/urcu/compiler.h @@ -123,4 +123,30 @@ + __GNUC_PATCHLEVEL__) #endif +#ifdef __cplusplus +#define caa_unqual_scalar_typeof(x) \ + std::remove_cv::type>::type +#else +#define caa_scalar_type_to_expr(type) \ + unsigned type: (unsigned type)0, \ + signed type: (signed type)0 + +/* + * Use C11 _Generic to express unqualified type from expression. This removes + * volatile qualifier from expression type. + */ +#define caa_unqual_scalar_typeof(x) \ + __typeof__( \ + _Generic((x), \ + char: (char)0, \ + caa_scalar_type_to_expr(char), \ + caa_scalar_type_to_expr(short), \ + caa_scalar_type_to_expr(int), \ + caa_scalar_type_to_expr(long), \ + caa_scalar_type_to_expr(long long), \ + default: (x) \ + ) \ + ) +#endif + #endif /* _URCU_COMPILER_H */