diff --git a/tccpp.c b/tccpp.c index 01f5b37..2c276c2 100644 --- a/tccpp.c +++ b/tccpp.c @@ -2553,9 +2553,15 @@ maybe_newline: } else if ((isidnum_table['.' - CH_EOF] & IS_ID) != 0) { /* asm mode */ *--p = c = '.'; goto parse_ident_fast; - } else if (c == '.' && p[1] == '.') { - p += 2; - tok = TOK_DOTS; + } else if (c == '.') { + PEEKC(c, p); + if (c == '.') { + p++; + tok = TOK_DOTS; + } else { + *--p = '.'; /* may underflow into file->unget[] */ + tok = '.'; + } } else { tok = '.'; } diff --git a/tests/tcctest.c b/tests/tcctest.c index 41cca11..381a992 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -114,6 +114,11 @@ void num(int n); void forward_ref(void); int isid(int c); +/* Line joining happens before tokenization, so the following + must be parsed as ellipsis. */ +void funny_line_continuation (int, ..\ +. ); + #define A 2 #define N 1234 + A #define pf printf