diff options
| author | 2026-01-09 12:31:32 +0100 | |
|---|---|---|
| committer | 2026-01-09 12:33:27 +0100 | |
| commit | 96e5ce447a6e5bf7302a5f905b1bb0a996c0502c (patch) | |
| tree | 35731f6db078b2d70d06064a1f913d0ed425bc2b | |
| parent | 08a2f1a3dc834ed5ba7266be99306fccfb768c1a (diff) | |
cpp: fix multiline comment in skipped preprocessor directive
| -rw-r--r-- | c/lex.c | 18 | ||||
| -rw-r--r-- | test/07-pp.c | 2 | ||||
| -rw-r--r-- | test/07-pp.h | 3 |
3 files changed, 19 insertions, 4 deletions
@@ -722,8 +722,22 @@ static void ppskipline(struct lexer *lx) { while (lx->macstk) popmac(lx); - while (peek(lx, 0) != '\n' && !lx->eof) - next(lx); + for (int c; (c = peek(lx, 0)) != '\n' && !lx->eof; next(lx)) { + if (c == '/' && peek(lx, 1) == '*') { /* comment */ + next(lx), next(lx); + bool done = 0; + while (!((c = peek(lx, 0)) == '*' && peek(lx, 1) == '/')) { + if (lx->eof) { + struct span span = {{ lx->idx, lx->chridx - lx->idx, lx->fileid }}; + fatal(&span, "unterminated comment"); + } + done = c == '\n'; + next(lx); + } + next(lx); + if (done) return; + } + } } static bool diff --git a/test/07-pp.c b/test/07-pp.c index 47b9dbb..071b359 100644 --- a/test/07-pp.c +++ b/test/07-pp.c @@ -37,7 +37,7 @@ s #ifdef CMD_WORKING int main(V) -#endif +#endif // comment { int CATl(foo); ++foobar; diff --git a/test/07-pp.h b/test/07-pp.h index 63de6f5..c0725b5 100644 --- a/test/07-pp.h +++ b/test/07-pp.h @@ -9,7 +9,8 @@ void hi(int x) { } #if 1 #endif -#elifndef Ww +#elifndef Ww /* + t'e */ #define Bar 7 #define SQR_(x) ((x)*(x)) #define SQR(y) SQR_(1+(y)-1) |