summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-12-10 15:48:15 -0800
committerIan Romanick <ian.d.romanick@intel.com>2011-01-03 14:25:34 -0800
commitd3fa3c60f2e12915813eabbbeecc5976d749a9dc (patch)
treefe1f12ae2d853eb024459cd20d39cda31307e76b
parent4ad4c700bf87dfcb4ef62154964302d4bf148505 (diff)
glsl: Inherrit type of declared variable from initializer after processing assignment
do_assignment may apply implicit conversions to coerce the base type of initializer to the base type of the variable being declared. Fixes piglit test glsl-implicit-conversion-02 (bugzilla #32287). This probably also fixes bugzilla #32273. NOTE: This is a candidate for the 7.9 branch and the 7.10 branch. (cherry picked from commit d7f27e2e76eac9bc2ee0fa36f52542fdcb9563dd)
-rw-r--r--src/glsl/ast_to_hir.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 1f4972cfca2..df1b2abf302 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2242,6 +2242,17 @@ ast_declarator_list::hir(exec_list *instructions,
if (this->type->qualifier.flags.q.constant)
var->read_only = false;
+ /* Never emit code to initialize a uniform.
+ */
+ const glsl_type *initializer_type;
+ if (!this->type->qualifier.flags.q.uniform) {
+ result = do_assignment(&initializer_instructions, state,
+ lhs, rhs,
+ this->get_location());
+ initializer_type = result->type;
+ } else
+ initializer_type = rhs->type;
+
/* If the declared variable is an unsized array, it must inherrit
* its full type from the initializer. A declaration such as
*
@@ -2256,16 +2267,14 @@ ast_declarator_list::hir(exec_list *instructions,
*
* If the declared variable is not an array, the types must
* already match exactly. As a result, the type assignment
- * here can be done unconditionally.
+ * here can be done unconditionally. For non-uniforms the call
+ * to do_assignment can change the type of the initializer (via
+ * the implicit conversion rules). For uniforms the initializer
+ * must be a constant expression, and the type of that expression
+ * was validated above.
*/
- var->type = rhs->type;
+ var->type = initializer_type;
- /* Never emit code to initialize a uniform.
- */
- if (!this->type->qualifier.flags.q.uniform)
- result = do_assignment(&initializer_instructions, state,
- lhs, rhs,
- this->get_location());
var->read_only = temp;
}
}