
This patch adds a parser check when a function declaration or function type declaration (in a function pointer declaration, for example) has too many parameters for `FunctionTypeBits::NumParams` to hold. At the moment of writing it's a 16-bit-wide bit-field, limiting the number of parameters at 65536. The check is added in the parser loop that goes over comma-separated list of function parameters. This is not the solution Aaron suggested in https://github.com/llvm/llvm-project/issues/35741#issuecomment-1638086571, because it was found out that it's quite hard to recover from this particular error in `GetFullTypeForDeclarator()`. Multiple options were tried, but all of them led to crashes down the line. I used LLVM Compile Time Tracker to ensure this does not introduce a performance regression. I believe changes are in the noise: https://llvm-compile-time-tracker.com/compare.php?from=de5ea2d122c31e1551654ff506c33df299f351b8&to=424818620766cedb2770e076ee359afeb0cc14ec&stat=instructions:u Fixes #35741
30 lines
1.0 KiB
C++
30 lines
1.0 KiB
C++
// RUN: %clang_cc1 -verify %s
|
|
|
|
#define P_10(x) x##0, x##1, x##2, x##3, x##4, x##5, x##6, x##7, x##8, x##9,
|
|
#define P_100(x) P_10(x##0) P_10(x##1) P_10(x##2) P_10(x##3) P_10(x##4) \
|
|
P_10(x##5) P_10(x##6) P_10(x##7) P_10(x##8) P_10(x##9)
|
|
#define P_1000(x) P_100(x##0) P_100(x##1) P_100(x##2) P_100(x##3) P_100(x##4) \
|
|
P_100(x##5) P_100(x##6) P_100(x##7) P_100(x##8) P_100(x##9)
|
|
#define P_10000(x) P_1000(x##0) P_1000(x##1) P_1000(x##2) P_1000(x##3) P_1000(x##4) \
|
|
P_1000(x##5) P_1000(x##6) P_1000(x##7) P_1000(x##8) P_1000(x##9)
|
|
|
|
void func (
|
|
P_10000(int p)
|
|
P_10000(int q)
|
|
P_10000(int r)
|
|
P_10000(int s)
|
|
P_10000(int t)
|
|
P_10000(int u)
|
|
P_10000(int v) // expected-error {{too many function parameters; subsequent parameters will be ignored}}
|
|
int w);
|
|
|
|
extern double(*func2)(
|
|
P_10000(int p)
|
|
P_10000(int q)
|
|
P_10000(int r)
|
|
P_10000(int s)
|
|
P_10000(int t)
|
|
P_10000(int u)
|
|
P_10000(int v) // expected-error {{too many function parameters; subsequent parameters will be ignored}}
|
|
int w);
|