aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/preprocess.c7
-rw-r--r--tests/106.sh50
2 files changed, 57 insertions, 0 deletions
diff --git a/src/preprocess.c b/src/preprocess.c
index 3f0161d..e47a390 100644
--- a/src/preprocess.c
+++ b/src/preprocess.c
@@ -1157,8 +1157,15 @@ static void preprocess_group_part(Preprocessor* pp) {
if (tok->kind == TokenKind_pp_directive_if || tok->kind == TokenKind_pp_directive_ifdef ||
tok->kind == TokenKind_pp_directive_ifndef) {
preprocess_if_section(pp);
+ } else if (tok->kind == TokenKind_pp_directive_elif || tok->kind == TokenKind_pp_directive_elifdef ||
+ tok->kind == TokenKind_pp_directive_elifndef || tok->kind == TokenKind_pp_directive_else ||
+ tok->kind == TokenKind_pp_directive_endif) {
+ fatal_error("%s:%d: unexpected '%s'; no corresponding '#if'*", tok->loc.filename, tok->loc.line,
+ token_kind_stringify(tok->kind));
} else if (tok->kind == TokenKind_pp_directive_include) {
preprocess_include_directive(pp);
+ } else if (tok->kind == TokenKind_pp_directive_embed) {
+ preprocess_embed_directive(pp);
} else if (tok->kind == TokenKind_pp_directive_define) {
preprocess_define_directive(pp);
} else if (tok->kind == TokenKind_pp_directive_undef) {
diff --git a/tests/106.sh b/tests/106.sh
new file mode 100644
index 0000000..2a61a33
--- /dev/null
+++ b/tests/106.sh
@@ -0,0 +1,50 @@
+cat <<'EOF' > expected
+main.c:1: unexpected '#elif'; no corresponding '#if'*
+EOF
+test_compile_error <<'EOF'
+#elif
+#endif
+
+int main() {}
+EOF
+
+cat <<'EOF' > expected
+main.c:1: unexpected '#endif'; no corresponding '#if'*
+EOF
+test_compile_error <<'EOF'
+#endif
+
+int main() {}
+EOF
+
+cat <<'EOF' > expected
+main.c:1: unexpected '#else'; no corresponding '#if'*
+EOF
+test_compile_error <<'EOF'
+#else
+#endif
+
+int main() {}
+EOF
+
+cat <<'EOF' > expected
+main.c:4: expected '#endif', but got '<eof>'
+EOF
+test_compile_error <<'EOF'
+#if 1
+
+int main() {}
+EOF
+
+cat <<'EOF' > a.h
+#if 1
+EOF
+cat <<'EOF' > expected
+./a.h:2: expected '#endif', but got '<eof>'
+EOF
+test_compile_error <<'EOF'
+#include "a.h"
+#endif
+
+int main() {}
+EOF