aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tccpp.c12
-rw-r--r--tests/tcctest.c5
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