aaron.ballman added inline comments.

================
Comment at: clang/lib/Headers/limits.h:55
 #define UCHAR_MAX (__SCHAR_MAX__*2  +1)
-#define USHRT_MAX (__SHRT_MAX__ *2  +1)
+#define USHRT_MAX (__SHRT_MAX__ * 2U + 1U)
 #define UINT_MAX  (__INT_MAX__  *2U +1U)
----------------
mysterymath wrote:
> aaron.ballman wrote:
> > It's worth double-checking that this still gives the correct type for the 
> > macro:
> > 
> > C2x 5.2.4.2.1p2: For all unsigned integer types for which <limits.h> or 
> > <stdint.h> define a macro with suffix _WIDTH holding its width N, there is 
> > a macro with suffix _MAX holding the maximal value 2N − 1 that is 
> > representable by the type and that has the same type as would an expression 
> > that is an object of the corresponding type converted according to the 
> > integer promotions. ...
> Ah, thanks; it hadn't occurred to me that the type of the expression would be 
> specified in the standard. It could be either `unsigned int` or `int`, 
> depending on the target.
> 
> The most straightforward approach I could think of to produce the right type 
> is:
> 1) Perform the arithmetic in `unsigned int` to produce the right value
> 2) Cast to `unsigned short` to produce the right type
> 3) Directly perform integer promotion using unary plus
> 
> The use of unary plus is a bit odd here, but it seems like the most direct 
> way to express the logic, and the overall expression seems less fragile than 
> the `#if` alternative. I've added a comment to explain this as well.
Now the trouble is with the cast operation, because that runs afoul of 
5.2.4.2.1p1: The values given below shall be replaced by constant expressions 
suitable for use in conditional expression inclusion preprocessing directives. 
...

https://godbolt.org/z/K9cs66sdK

I'm almost wondering if the most direct solution is for `__SHRT_MAX__` to be 
generated with or without the `U` suffix depending on target.

We should probably use this as an opportunity to add more exhaustive testing 
for all the _MIN and _MAX macros to ensure the type properties hold. I was 
playing around with something like this: https://godbolt.org/z/o7KjY3asW


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144218/new/

https://reviews.llvm.org/D144218

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to