[PATCH 3/5] d3dcompiler: Check for missing return value semantics on the entry point.

Zebediah Figura z.figura12 at gmail.com
Fri Jun 5 17:19:31 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/hlsl.y            | 42 +++++++++++++++------------
 dlls/d3dcompiler_43/tests/hlsl_d3d9.c |  6 ++++
 2 files changed, 30 insertions(+), 18 deletions(-)

diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index d5247d69b5c..d3b50e3858d 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -2952,24 +2952,6 @@ struct bwriter_shader *parse_hlsl(enum shader_type type, DWORD major, DWORD mino
 
     hlsl_parse();
 
-    TRACE("Compilation status = %d\n", hlsl_ctx.status);
-    if (messages)
-    {
-        if (hlsl_ctx.messages.size)
-            *messages = hlsl_ctx.messages.string;
-        else
-            *messages = NULL;
-    }
-    else
-    {
-        if (hlsl_ctx.messages.capacity)
-            d3dcompiler_free(hlsl_ctx.messages.string);
-    }
-
-    for (i = 0; i < hlsl_ctx.source_files_count; ++i)
-        d3dcompiler_free((void *)hlsl_ctx.source_files[i]);
-    d3dcompiler_free(hlsl_ctx.source_files);
-
     if (hlsl_ctx.status == PARSE_ERR)
         goto out;
 
@@ -2979,6 +2961,13 @@ struct bwriter_shader *parse_hlsl(enum shader_type type, DWORD major, DWORD mino
         goto out;
     }
 
+    if (!type_is_void(entry_func->return_type)
+            && entry_func->return_type->type != HLSL_CLASS_STRUCT && !entry_func->semantic)
+    {
+        hlsl_report_message(entry_func->loc, HLSL_LEVEL_ERROR,
+                "entry point \"%s\" is missing a return value semantic", entry_func->func->name);
+    }
+
     /* Index 0 means unused; index 1 means function entry, so start at 2. */
     index_instructions(entry_func->body, 2);
 
@@ -2991,6 +2980,23 @@ struct bwriter_shader *parse_hlsl(enum shader_type type, DWORD major, DWORD mino
     compute_liveness(entry_func);
 
 out:
+    if (messages)
+    {
+        if (hlsl_ctx.messages.size)
+            *messages = hlsl_ctx.messages.string;
+        else
+            *messages = NULL;
+    }
+    else
+    {
+        if (hlsl_ctx.messages.capacity)
+            d3dcompiler_free(hlsl_ctx.messages.string);
+    }
+
+    for (i = 0; i < hlsl_ctx.source_files_count; ++i)
+        d3dcompiler_free((void *)hlsl_ctx.source_files[i]);
+    d3dcompiler_free(hlsl_ctx.source_files);
+
     TRACE("Freeing functions IR.\n");
     wine_rb_destroy(&hlsl_ctx.functions, free_function_rb, NULL);
 
diff --git a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
index 059f39e4c3e..16d1e6dda05 100644
--- a/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
+++ b/dlls/d3dcompiler_43/tests/hlsl_d3d9.c
@@ -1092,6 +1092,12 @@ static void test_fail(void)
         "{\n"
         "    return float4(0, 0, 0, 0);\n"
         "}",
+
+        /* 15 */
+        "float4 test()\n"
+        "{\n"
+        "    return float4(0, 0, 0, 0);\n"
+        "}",
     };
 
     static const char *targets[] = {"ps_2_0", "ps_3_0", "ps_4_0"};
-- 
2.26.2




More information about the wine-devel mailing list