X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=include%2Furcu%2Fcompiler.h;fp=include%2Furcu%2Fcompiler.h;h=827ec1fd6eee0d00d5e863f9268fa89b7ae2d59e;hp=2f32b38d6fb1850291ebd500f0a2fdca53f5c428;hb=67988e204d2c471b24cae61f3f8fedb4f9375034;hpb=e58cdfcfc3884d003b7a0b097fd02c6969382edc 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 */