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