From 67988e204d2c471b24cae61f3f8fedb4f9375034 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 22 Jun 2023 09:58:39 -0400 Subject: [PATCH] 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 --- include/urcu/compiler.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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 */ -- 2.34.1