Mesa (master): glsl: Clarify error message about whole-array assignment in GLSL 1.10.

Eric Anholt anholt at kemper.freedesktop.org
Fri Sep 9 03:21:04 UTC 2011


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

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Sep  7 12:03:36 2011 -0700

glsl: Clarify error message about whole-array assignment in GLSL 1.10.

Previously, it would produce:

    Failed to compile FS: 0:6(7): error: non-lvalue in assignment

and now it produces:

    Failed to compile FS: 0:5(7): error: whole array assignment is not
    allowed in GLSL 1.10 or GLSL ES 1.00.

Also, add spec quotation to the two places we have code for array
lvalues in GLSL 1.10.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

---

 src/glsl/ast_to_hir.cpp |   31 +++++++++++++++++++++++++------
 1 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index e70e0b3..777f190 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -679,16 +679,20 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
                           lhs->variable_referenced()->name);
          error_emitted = true;
 
+      } else if (state->language_version <= 110 && lhs->type->is_array()) {
+	 /* From page 32 (page 38 of the PDF) of the GLSL 1.10 spec:
+	  *
+	  *    "Other binary or unary expressions, non-dereferenced
+	  *     arrays, function names, swizzles with repeated fields,
+	  *     and constants cannot be l-values."
+	  */
+	 _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not "
+			  "allowed in GLSL 1.10 or GLSL ES 1.00.");
+	 error_emitted = true;
       } else if (!lhs->is_lvalue()) {
 	 _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
 	 error_emitted = true;
       }
-
-      if (state->es_shader && lhs->type->is_array()) {
-	 _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not "
-			  "allowed in GLSL ES 1.00.");
-	 error_emitted = true;
-      }
    }
 
    ir_rvalue *new_rhs =
@@ -2117,6 +2121,21 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
    else
        var->depth_layout = ir_depth_layout_none;
 
+   /* From page 46 (page 52 of the PDF) of the GLSL ES specification:
+    *
+    *    "Array variables are l-values and may be passed to parameters
+    *     declared as out or inout. However, they may not be used as
+    *     the target of an assignment."
+    *
+    * From page 32 (page 38 of the PDF) of the GLSL 1.10 spec:
+    *
+    *    "Other binary or unary expressions, non-dereferenced arrays,
+    *     function names, swizzles with repeated fields, and constants
+    *     cannot be l-values."
+    *
+    * So we only mark 1.10 as non-lvalues, and check for array
+    * assignment in 100 specifically in do_assignment.
+    */
    if (var->type->is_array() && state->language_version != 110) {
       var->array_lvalue = true;
    }




More information about the mesa-commit mailing list