glsl: When unable to assign the initializer for a const variable, set it to 0.
authorEric Anholt <eric@anholt.net>
Mon, 23 Aug 2010 21:54:06 +0000 (14:54 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 23 Aug 2010 21:58:38 +0000 (14:58 -0700)
This prevents assertion failures or cascading errors after we've
logged the fact that we were unable to handle the initializer.

Fixes unsized-array-non-const-index-2.vert

src/glsl/ast_to_hir.cpp

index 7ac24b06fe78120ddcd9167fe69e134a322aade2..57e331742ea27802e771e558e5bae648b060de4b 100644 (file)
@@ -1827,24 +1827,32 @@ ast_declarator_list::hir(exec_list *instructions,
            ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs);
            if (new_rhs != NULL) {
               rhs = new_rhs;
+
+              ir_constant *constant_value = rhs->constant_expression_value();
+              if (!constant_value) {
+                 _mesa_glsl_error(& initializer_loc, state,
+                                  "initializer of %s variable `%s' must be a "
+                                  "constant expression",
+                                  (this->type->qualifier.constant)
+                                  ? "const" : "uniform",
+                                  decl->identifier);
+                 if (var->type->is_numeric()) {
+                    /* Reduce cascading errors. */
+                    var->constant_value = ir_constant::zero(ctx, var->type);
+                 }
+              } else {
+                 rhs = constant_value;
+                 var->constant_value = constant_value;
+              }
            } else {
               _mesa_glsl_error(&initializer_loc, state,
                                "initializer of type %s cannot be assigned to "
                                "variable of type %s",
                                rhs->type->name, var->type->name);
-           }
-
-           ir_constant *constant_value = rhs->constant_expression_value();
-           if (!constant_value) {
-              _mesa_glsl_error(& initializer_loc, state,
-                               "initializer of %s variable `%s' must be a "
-                               "constant expression",
-                               (this->type->qualifier.constant)
-                               ? "const" : "uniform",
-                               decl->identifier);
-           } else {
-              rhs = constant_value;
-              var->constant_value = constant_value;
+              if (var->type->is_numeric()) {
+                 /* Reduce cascading errors. */
+                 var->constant_value = ir_constant::zero(ctx, var->type);
+              }
            }
         }