Mesa (master): glsl: Track descriptions of some expressions that can' t be l-values

Ian Romanick idr at kemper.freedesktop.org
Fri Jan 6 14:33:46 PST 2012


Module: Mesa
Branch: master
Commit: fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Fri Dec 23 09:56:03 2011 -0800

glsl: Track descriptions of some expressions that can't be l-values

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Paul Berry <stereotype441 at gmail.com>

---

 src/glsl/ast.h                  |   13 +++++++++++++
 src/glsl/ast_to_hir.cpp         |    5 +++++
 src/glsl/glsl_parser_extras.cpp |    1 +
 3 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index d899bc6..1f78af8 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 f0c9218..2644ed2 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 0b4ccac..0b53232 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;
 }
 
 



More information about the mesa-commit mailing list