Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- Makefile.am | 1 - libs/vkd3d-shader/preproc.l | 3 +++ libs/vkd3d-shader/preproc.y | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/Makefile.am b/Makefile.am index 32c8777f..f6fbe416 100644 --- a/Makefile.am +++ b/Makefile.am @@ -241,7 +241,6 @@ XFAIL_TESTS = \ tests/hlsl-vector-indexing.shader_test \ tests/hlsl-vector-indexing-uniform.shader_test \ tests/math.shader_test \ - tests/preproc-if.shader_test \ tests/preproc-ifdef.shader_test \ tests/preproc-if-expr.shader_test \ tests/preproc-invalid.shader_test \ diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l index fc3c5fa2..bf1ef5c0 100644 --- a/libs/vkd3d-shader/preproc.l +++ b/libs/vkd3d-shader/preproc.l @@ -100,6 +100,8 @@ IDENTIFIER [A-Za-z_][A-Za-z0-9_]* for (p = yytext + 1; strchr(" \t", *p); ++p) ;
+ if (!strcmp(p, "elif")) + return T_ELIF; if (!strcmp(p, "else")) return T_ELSE; if (!strcmp(p, "endif")) @@ -192,6 +194,7 @@ int yylex(YYSTYPE *lval, YYLTYPE *lloc, yyscan_t scanner) { switch (token) { + case T_ELIF: case T_ELSE: case T_ENDIF: case T_IF: diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y index add39735..e0b3c4c1 100644 --- a/libs/vkd3d-shader/preproc.y +++ b/libs/vkd3d-shader/preproc.y @@ -163,6 +163,7 @@ static uint32_t preproc_parse_integer(const char *s)
%token T_NEWLINE
+%token T_ELIF "#elif" %token T_ELSE "#else" %token T_ENDIF "#endif" %token T_IF "#if" @@ -184,6 +185,28 @@ directive if (!preproc_push_if(ctx, !!$2)) YYABORT; } + | T_ELIF expr T_NEWLINE + { + if (ctx->if_count) + { + struct preproc_if_state *state = &ctx->if_stack[ctx->if_count - 1]; + + if (state->seen_else) + { + preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE, "Ignoring #elif after #else."); + } + else + { + state->current_true = $2 && !state->seen_true && preproc_was_writing(ctx); + state->seen_true = $2 || state->seen_true; + } + } + else + { + preproc_warning(ctx, &@$, VKD3D_SHADER_WARNING_PP_INVALID_DIRECTIVE, + "Ignoring #elif without prior #if."); + } + } | T_ELSE T_NEWLINE { if (ctx->if_count)