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
This commit is contained in:
Eric Anholt 2010-08-23 14:54:06 -07:00
parent d1e6b31cb8
commit e11757bb89

View 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);
}
}
}