glsl: Track descriptions of some expressions that can't be l-values
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
@@ -207,6 +207,7 @@ public:
|
|||||||
subexpressions[1] = NULL;
|
subexpressions[1] = NULL;
|
||||||
subexpressions[2] = NULL;
|
subexpressions[2] = NULL;
|
||||||
primary_expression.identifier = (char *) identifier;
|
primary_expression.identifier = (char *) identifier;
|
||||||
|
this->non_lvalue_description = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *operator_string(enum ast_operators op);
|
static const char *operator_string(enum ast_operators op);
|
||||||
@@ -234,6 +235,18 @@ public:
|
|||||||
* \c ast_function_call
|
* \c ast_function_call
|
||||||
*/
|
*/
|
||||||
exec_list expressions;
|
exec_list expressions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For things that can't be l-values, this describes what it is.
|
||||||
|
*
|
||||||
|
* This text is used by the code that generates IR for assignments to
|
||||||
|
* detect and emit useful messages for assignments to some things that
|
||||||
|
* can't be l-values. For example, pre- or post-incerement expressions.
|
||||||
|
*
|
||||||
|
* \note
|
||||||
|
* This pointer may be \c NULL.
|
||||||
|
*/
|
||||||
|
const char *non_lvalue_description;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ast_expression_bin : public ast_expression {
|
class ast_expression_bin : public ast_expression {
|
||||||
|
@@ -1463,6 +1463,9 @@ ast_expression::hir(exec_list *instructions,
|
|||||||
|
|
||||||
case ast_pre_inc:
|
case ast_pre_inc:
|
||||||
case ast_pre_dec: {
|
case ast_pre_dec: {
|
||||||
|
this->non_lvalue_description = (this->oper == ast_pre_inc)
|
||||||
|
? "pre-increment operation" : "pre-decrement operation";
|
||||||
|
|
||||||
op[0] = this->subexpressions[0]->hir(instructions, state);
|
op[0] = this->subexpressions[0]->hir(instructions, state);
|
||||||
op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
|
op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
|
||||||
|
|
||||||
@@ -1481,6 +1484,8 @@ ast_expression::hir(exec_list *instructions,
|
|||||||
|
|
||||||
case ast_post_inc:
|
case ast_post_inc:
|
||||||
case ast_post_dec: {
|
case ast_post_dec: {
|
||||||
|
this->non_lvalue_description = (this->oper == ast_post_inc)
|
||||||
|
? "post-increment operation" : "post-decrement operation";
|
||||||
op[0] = this->subexpressions[0]->hir(instructions, state);
|
op[0] = this->subexpressions[0]->hir(instructions, state);
|
||||||
op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
|
op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
|
||||||
|
|
||||||
|
@@ -626,6 +626,7 @@ ast_expression::ast_expression(int oper,
|
|||||||
this->subexpressions[0] = ex0;
|
this->subexpressions[0] = ex0;
|
||||||
this->subexpressions[1] = ex1;
|
this->subexpressions[1] = ex1;
|
||||||
this->subexpressions[2] = ex2;
|
this->subexpressions[2] = ex2;
|
||||||
|
this->non_lvalue_description = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user