diff options
| -rw-r--r-- | src/tokenize.c | 10 | ||||
| -rw-r--r-- | tests/include_errors.sh | 11 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/tokenize.c b/src/tokenize.c index 1e7a8df..26c6e13 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -361,6 +361,16 @@ static void do_tokenize_all(Lexer* l) { } else if (c == '\n') { infile_next_char(l->src); tok->kind = TokenKind_newline; + + // Reset expect_header_name at the end of line. It handles cases like: + // + // #ifdef ADDITIONAL_HEADER + // #include ADDITIONAL_HEADER + // #endif + // + // Even if ADDITIONAL_HEADER is undefined, this include directive line is tokenized. If the flag were not + // reset, the next occurrence of '<' or '"' would be recognized as part of a header name. + l->expect_header_name = false; } else if (isspace(c)) { while (isspace((c = infile_peek_char(l->src)))) { if (c == '\n') diff --git a/tests/include_errors.sh b/tests/include_errors.sh index 3ac546f..e0f856e 100644 --- a/tests/include_errors.sh +++ b/tests/include_errors.sh @@ -50,3 +50,14 @@ test_compile_error <<'EOF' #include <hoge.h> EOF +cat <<'EOF' > expected +42 +EOF + +test_exit_code 0 <<'EOF' +#ifdef FOO +#include FOO +#endif + +int main() { 1 < 2; } +EOF |
