X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Furcu%2Fcompiler.h;h=fb3c8f160dc580aa8ede55e1ad0fa525e5942ade;hb=20865c71e59536962252babe23c8ebdbd1cc28b0;hp=34eb564bb77795e9e77d21983240c3327b3401d1;hpb=220d1a7fc2af7d204a23b3fb9ece3fa7d9d8a518;p=userspace-rcu.git diff --git a/include/urcu/compiler.h b/include/urcu/compiler.h index 34eb564..fb3c8f1 100644 --- a/include/urcu/compiler.h +++ b/include/urcu/compiler.h @@ -119,4 +119,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 */