aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/tokenize.c10
-rw-r--r--tests/include_errors.sh11
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