Crash when trying to wraparound __COUNTER__
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
The following program causes a crash (preprocessing only):
```cpp
#define A(...)__VA_ARGS__##__VA_OPT__()__VA_ARGS__##__VA_OPT__()__VA_ARGS__##__VA_OPT__()
#define B(...)A(__VA_ARGS__##__VA_OPT__())A(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define C(...)B(__VA_ARGS__##__VA_OPT__())B(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define D(...)C(__VA_ARGS__##__VA_OPT__())C(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define E(...)D(__VA_ARGS__##__VA_OPT__())D(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define F(...)E(__VA_ARGS__##__VA_OPT__())E(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define G(...)F(__VA_ARGS__##__VA_OPT__())F(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define H(...)G(__VA_ARGS__##__VA_OPT__())G(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define I(...)H(__VA_ARGS__##__VA_OPT__())H(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define J(...)I(__VA_ARGS__##__VA_OPT__())I(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define K(...)J(__VA_ARGS__##__VA_OPT__())J(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define L(...)K(__VA_ARGS__##__VA_OPT__())K(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define M(...)L(__VA_ARGS__##__VA_OPT__())L(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define N(...)M(__VA_ARGS__##__VA_OPT__())M(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define O(...)N(__VA_ARGS__##__VA_OPT__())N(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define P(...)O(__VA_ARGS__##__VA_OPT__())O(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define Q(...)P(__VA_ARGS__##__VA_OPT__())P(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define R(...)Q(__VA_ARGS__##__VA_OPT__())Q(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define S(...)R(__VA_ARGS__##__VA_OPT__())R(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define T(...)S(__VA_ARGS__##__VA_OPT__())S(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define U(...)T(__VA_ARGS__##__VA_OPT__())T(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define V(...)U(__VA_ARGS__##__VA_OPT__())U(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define W(...)V(__VA_ARGS__##__VA_OPT__())V(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define X(...)W(__VA_ARGS__##__VA_OPT__())W(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define Y(...)X(__VA_ARGS__##__VA_OPT__())X(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define Z(...)Y(__VA_ARGS__##__VA_OPT__())Y(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define AA(...)Z(__VA_ARGS__##__VA_OPT__())Z(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define BB(...)AA(__VA_ARGS__##__VA_OPT__())AA(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define CC(...)BB(__VA_ARGS__##__VA_OPT__())BB(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define DD(...)CC(__VA_ARGS__##__VA_OPT__())CC(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define EE(...)DD(__VA_ARGS__##__VA_OPT__())DD(__VA_ARGS__##__VA_OPT__())__VA_ARGS__##__VA_OPT__()
#define EMPTY
#define IGNORE(...)__VA_OPT__(EMPTY)
#define DECREMENT()IGNORE(EE(__COUNTER__))
__COUNTER__/* 0 */
__COUNTER__/* 1 */
DECREMENT()/* expands __COUNTER__ 4294967295 times */
__COUNTER__/* 1 if wraparound occurs, or 4294967297 otherwise */
```
Error message:
```
fatal error: translation unit is too large for Clang to process: ran out of source locations
```
GCC crashes too, for unrelated reasons:
Contributor guide
Assessment
This issue has not been assessed yet.