d3dcompiler: Parse return statements without a value.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2020-03-01 22:55:24 -06:00 committed by Alexandre Julliard
parent 8b08fec5e3
commit e597b9e555
2 changed files with 41 additions and 16 deletions

View File

@ -481,6 +481,28 @@ static struct hlsl_ir_swizzle *get_swizzle(struct hlsl_ir_node *value, const cha
return NULL;
}
static struct hlsl_ir_jump *new_return(struct hlsl_ir_node *value, struct source_location loc)
{
struct hlsl_ir_jump *jump = d3dcompiler_alloc(sizeof(*jump));
if (!jump)
{
ERR("Out of memory\n");
return NULL;
}
jump->node.type = HLSL_IR_JUMP;
jump->node.loc = loc;
jump->type = HLSL_IR_JUMP_RETURN;
jump->node.data_type = value ? value->data_type
: new_hlsl_type(d3dcompiler_strdup("void"), HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1);
jump->return_value = value;
FIXME("Check for valued return on void function.\n");
FIXME("Implicit conversion to the return type if needed, "
"error out if conversion not possible.\n");
return jump;
}
static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var,
struct parse_initializer *initializer)
{
@ -1769,28 +1791,31 @@ statement: declaration_statement
| selection_statement
| loop_statement
/* FIXME: add rule for return with no value */
jump_statement: KW_RETURN expr ';'
{
struct hlsl_ir_jump *jump = d3dcompiler_alloc(sizeof(*jump));
if (!jump)
{
ERR("Out of memory\n");
YYABORT;
}
jump->node.type = HLSL_IR_JUMP;
set_location(&jump->node.loc, &@1);
jump->type = HLSL_IR_JUMP_RETURN;
jump->node.data_type = node_from_list($2)->data_type;
jump->return_value = node_from_list($2);
struct source_location loc;
struct hlsl_ir_jump *jump;
FIXME("Check for valued return on void function.\n");
FIXME("Implicit conversion to the return type if needed, "
"error out if conversion not possible.\n");
set_location(&loc, &@1);
if (!(jump = new_return(node_from_list($2), loc)))
YYABORT;
$$ = $2;
list_add_tail($$, &jump->node.entry);
}
| KW_RETURN ';'
{
struct source_location loc;
struct hlsl_ir_jump *jump;
set_location(&loc, &@1);
if (!(jump = new_return(NULL, loc)))
YYABORT;
$$ = d3dcompiler_alloc(sizeof(*$$));
list_init($$);
list_add_tail($$, &jump->node.entry);
}
selection_statement: KW_IF '(' expr ')' if_body
{

View File

@ -730,7 +730,7 @@ static void test_fail(void)
compiled = errors = NULL;
hr = ppD3DCompile(tests[i], strlen(tests[i]), NULL, NULL, NULL, "test", targets[j], 0, 0, &compiled, &errors);
todo_wine ok(hr == E_FAIL, "Test %u, target %s, got unexpected hr %#x.\n", i, targets[j], hr);
todo_wine_if (i == 1 || i >= 8) ok(!!errors, "Test %u, target %s, expected non-NULL error blob.\n", i, targets[j]);
todo_wine_if (i == 1 || i >= 7) ok(!!errors, "Test %u, target %s, expected non-NULL error blob.\n", i, targets[j]);
ok(!compiled, "Test %u, target %s, expected no compiled shader blob.\n", i, targets[j]);
if (errors)
ID3D10Blob_Release(errors);