From 8fc5a6a2a49f05c358e293c79c0bf18e8eb4830e Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Thu, 24 Mar 2016 15:58:32 +0100 Subject: [PATCH] Fix tokenization of TOK_DOTS We really need to use PEEKC during tokenization so as to skip line continuations automatically. --- tccpp.c | 12 +++++++++--- tests/tcctest.c | 5 +++++ 2 files changed, 14 insertions(+), 3 deletions(-) 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