SDL_shader_tools: Improve error message when encountering a bad expression in #if or #elif

From ed454e7e133cb97438fe000ef4fe54526e3e04ab Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Fri, 22 Sep 2023 20:29:33 +0200
Subject: [PATCH] Improve error message when encountering a bad expression in
 #if or #elif

---
 SDL_shader_preprocessor.c                                 | 8 +++++---
 .../preprocessor/errors/recover-from-bad-elif-expression  | 7 +++++++
 .../errors/recover-from-bad-elif-expression.correct       | 1 +
 .../preprocessor/errors/recover-from-bad-if-expression    | 5 +++++
 .../errors/recover-from-bad-if-expression.correct         | 1 +
 5 files changed, 19 insertions(+), 3 deletions(-)
 create mode 100644 unit_tests/preprocessor/errors/recover-from-bad-elif-expression
 create mode 100644 unit_tests/preprocessor/errors/recover-from-bad-elif-expression.correct
 create mode 100644 unit_tests/preprocessor/errors/recover-from-bad-if-expression
 create mode 100644 unit_tests/preprocessor/errors/recover-from-bad-if-expression.correct

diff --git a/SDL_shader_preprocessor.c b/SDL_shader_preprocessor.c
index 7be0f0a..16477a9 100644
--- a/SDL_shader_preprocessor.c
+++ b/SDL_shader_preprocessor.c
@@ -1982,7 +1982,8 @@ static Conditional *handle_pp_if(Context *ctx)
 
     result = reduce_pp_expression(ctx);
     if (result == -1) {
-        return NULL;
+        /* reduce_pp_expression emitted an error internally. Assume result is false to continue processing. */
+        result = 0;
     }
 
     conditional = get_conditional(ctx);
@@ -2006,12 +2007,13 @@ static Conditional *handle_pp_if(Context *ctx)
 
 static void handle_pp_elif(Context *ctx)
 {
-    const int rc = reduce_pp_expression(ctx);
+    int rc = reduce_pp_expression(ctx);
     IncludeState *state;
     Conditional *cond;
 
     if (rc == -1) {
-        return;
+        /* reduce_pp_expression emitted an error internally. Assume result is false to continue processing. */
+        rc = 0;
     }
 
     state = ctx->include_stack;
diff --git a/unit_tests/preprocessor/errors/recover-from-bad-elif-expression b/unit_tests/preprocessor/errors/recover-from-bad-elif-expression
new file mode 100644
index 0000000..d18713c
--- /dev/null
+++ b/unit_tests/preprocessor/errors/recover-from-bad-elif-expression
@@ -0,0 +1,7 @@
+#if 0
+case_a
+#elif 1+
+case_b
+#else
+case_c
+#endif
diff --git a/unit_tests/preprocessor/errors/recover-from-bad-elif-expression.correct b/unit_tests/preprocessor/errors/recover-from-bad-elif-expression.correct
new file mode 100644
index 0000000..ef84b5e
--- /dev/null
+++ b/unit_tests/preprocessor/errors/recover-from-bad-elif-expression.correct
@@ -0,0 +1 @@
+preprocessor/errors/recover-from-bad-elif-expression:3: error: Invalid expression
diff --git a/unit_tests/preprocessor/errors/recover-from-bad-if-expression b/unit_tests/preprocessor/errors/recover-from-bad-if-expression
new file mode 100644
index 0000000..122d06b
--- /dev/null
+++ b/unit_tests/preprocessor/errors/recover-from-bad-if-expression
@@ -0,0 +1,5 @@
+#if 1+
+case_a
+#else
+case_b
+#endif
diff --git a/unit_tests/preprocessor/errors/recover-from-bad-if-expression.correct b/unit_tests/preprocessor/errors/recover-from-bad-if-expression.correct
new file mode 100644
index 0000000..0914635
--- /dev/null
+++ b/unit_tests/preprocessor/errors/recover-from-bad-if-expression.correct
@@ -0,0 +1 @@
+preprocessor/errors/recover-from-bad-if-expression:1: error: Invalid expression