diff options
| author | Michael Matz <matz@suse.de> | 2016-03-24 15:58:32 +0100 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2016-03-24 15:58:32 +0100 |
| commit | 8fc5a6a2a49f05c358e293c79c0bf18e8eb4830e (patch) | |
| tree | 1022e80c1e6cfebd23214f032a45061257f17fb9 | |
| parent | f85db99ff0b48b5837fa985dcf9c58190b35f96a (diff) | |
| download | tinycc-8fc5a6a2a49f05c358e293c79c0bf18e8eb4830e.tar.gz tinycc-8fc5a6a2a49f05c358e293c79c0bf18e8eb4830e.tar.bz2 | |
Fix tokenization of TOK_DOTS
We really need to use PEEKC during tokenization so as to
skip line continuations automatically.
| -rw-r--r-- | tccpp.c | 12 | ||||
| -rw-r--r-- | tests/tcctest.c | 5 |
2 files changed, 14 insertions, 3 deletions
@@ -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 |
