From fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 23 Dec 2011 09:56:03 -0800 Subject: [PATCH] glsl: Track descriptions of some expressions that can't be l-values Signed-off-by: Ian Romanick Reviewed-by: Paul Berry --- src/glsl/ast.h | 13 +++++++++++++ src/glsl/ast_to_hir.cpp | 5 +++++ src/glsl/glsl_parser_extras.cpp | 1 + 3 files changed, 19 insertions(+) diff --git a/src/glsl/ast.h b/src/glsl/ast.h index d899bc62a81..1f78af87e5a 100644 --- a/src/glsl/ast.h +++ b/src/glsl/ast.h @@ -207,6 +207,7 @@ public: subexpressions[1] = NULL; subexpressions[2] = NULL; primary_expression.identifier = (char *) identifier; + this->non_lvalue_description = NULL; } static const char *operator_string(enum ast_operators op); @@ -234,6 +235,18 @@ public: * \c ast_function_call */ 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 { diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index f0c92187507..2644ed28567 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -1463,6 +1463,9 @@ ast_expression::hir(exec_list *instructions, case ast_pre_inc: 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[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_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[1] = constant_one_for_inc_dec(ctx, op[0]->type); diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 0b4ccac531d..0b53232e9e7 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -626,6 +626,7 @@ ast_expression::ast_expression(int oper, this->subexpressions[0] = ex0; this->subexpressions[1] = ex1; this->subexpressions[2] = ex2; + this->non_lvalue_description = NULL; } -- 2.30.2