[clang] [C2y] Support WG14 N3457, the __COUNTER__ macro (PR #162662)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 15 10:02:19 PDT 2025


AaronBallman wrote:

> TMK, the wording says that the third number in the diagnostic message from the `static_assert` below should be less than the second because replacement of `__VA_OPT__` with its expanded replacement occurs before the other instance of `__COUNTER__` in the replacement list is encountered during rescanning and further replacement.
> 
> Clang generates `"0 2 3 1"`. The `2` and `3` is transposed compared to expectations.
> 
> ```c
> #define STR0(X)  #X
> #define STR(X) STR0(X)
> #define F(X, Y, ...) STR(Y __COUNTER__ __VA_OPT__(__COUNTER__) X)
> static_assert(0, F(__COUNTER__, __COUNTER__, hi));
> ```
> 
> https://godbolt.org/z/aYGEq94va

Clang and GCC get the same behavior, EDG has `1 2 3 0`, and MSVC comes up with `1 2 __VA_OPT__(3) 0` so there's implementation divergence; changing the behavior to deviate from GCC seems like something we may want to consider outside of the scope of this particular PR. How about I add test coverage for this with a FIXME comment and mark our support as partial? Then I can file an issue to track the behavior and we can get around to fixing that when we do.

https://github.com/llvm/llvm-project/pull/162662


More information about the cfe-commits mailing list