Mesa (master): glsl: When unable to assign the initializer for a const variable, set it to 0.
Eric Anholt
anholt at kemper.freedesktop.org
Mon Aug 23 21:59:35 UTC 2010
Module: Mesa
Branch: master
Commit: e11757bb896e3dadc54fb3d18adf4b71e3e883b3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e11757bb896e3dadc54fb3d18adf4b71e3e883b3
Author: Eric Anholt <eric at anholt.net>
Date: Mon Aug 23 14:54:06 2010 -0700
glsl: When unable to assign the initializer for a const variable, set it to 0.
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 | 34 +++++++++++++++++++++-------------
1 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 7ac24b0..57e3317 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -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);
+ }
}
}
More information about the mesa-commit
mailing list