ast_to_hir: Fix bug in constant initializers.
Implicit conversions were not being performed, nor was there any type checking - it was possible to have, say, var->type == float and var->constant_value->type == int. Later use of the constant expression would trigger an assertion. Fixes piglit test const-implicit-conversion.frag.
This commit is contained in:
@@ -1804,6 +1804,16 @@ ast_declarator_list::hir(exec_list *instructions,
|
|||||||
* declaration.
|
* declaration.
|
||||||
*/
|
*/
|
||||||
if (this->type->qualifier.constant || this->type->qualifier.uniform) {
|
if (this->type->qualifier.constant || this->type->qualifier.uniform) {
|
||||||
|
ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs);
|
||||||
|
if (new_rhs != NULL) {
|
||||||
|
rhs = new_rhs;
|
||||||
|
} 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();
|
ir_constant *constant_value = rhs->constant_expression_value();
|
||||||
if (!constant_value) {
|
if (!constant_value) {
|
||||||
_mesa_glsl_error(& initializer_loc, state,
|
_mesa_glsl_error(& initializer_loc, state,
|
||||||
|
Reference in New Issue
Block a user