pp-number token may have arbitrary number of dots after first digit pp-number: digit . digit pp-number . which means that merging any pp-number with ... is valid operation and should yield pp-number: #define M(a,b) a##b M(1,...) should preprocess to 1... Signed-off-by: Alexey Dobriyan <adobriyan@xxxxxxxxx> --- pre-process.c | 3 +++ 1 file changed, 3 insertions(+) --- a/pre-process.c +++ b/pre-process.c @@ -482,6 +482,7 @@ static void expand_arguments(int count, struct arg *args) * - number + number -> number * - number + ident -> number * - number + '.' -> number + * - number + '...' -> number * - number + '+' or '-' -> number, if number used to end on [eEpP]. * - '.' + number -> number, if number used to start with a digit. * - special + special -> either special or an error. @@ -524,6 +525,8 @@ static enum token_type combine(struct token *left, struct token *right, char *p) switch (right->special) { case '.': break; + case SPECIAL_ELLIPSIS: + break; case '+': case '-': if (strchr("eEpP", p[len - 2])) break;