summaryrefslogtreecommitdiff
path: root/src/glsl/ast_to_hir.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-07-20 03:53:47 -0700
committerKenneth Graunke <kenneth@whitecape.org>2010-07-21 16:38:32 -0700
commite1d71850faba23d1bea3858a8c2e05a45fd21143 (patch)
treeb3854a93eb048700703102f19526cbe0e57f546d /src/glsl/ast_to_hir.cpp
parent46d6b8d1ba09d9d6844ce99a30416283004f77c6 (diff)
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.
Diffstat (limited to 'src/glsl/ast_to_hir.cpp')
-rw-r--r--src/glsl/ast_to_hir.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index e9257eee28..99a2183cf8 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1804,6 +1804,16 @@ ast_declarator_list::hir(exec_list *instructions,
* declaration.
*/
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();
if (!constant_value) {
_mesa_glsl_error(& initializer_loc, state,