summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-04-02 15:51:02 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-04-02 15:51:02 -0700
commitc35bb00130a3f400af1ab9c5eff555c4f9e143d2 (patch)
tree65a45a35fe0dc03c8ec026468546115b3225a2bf
parentcf37c9e8dad4349e45cb91d36957484fd76ce264 (diff)
Ensure that 'in' and 'inout' formal parameters are valid lvalues
This causes the following tests to pass: glslparsertest/shaders/function10.frag
-rw-r--r--ast_function.cpp31
-rw-r--r--ir_function.cpp3
2 files changed, 31 insertions, 3 deletions
diff --git a/ast_function.cpp b/ast_function.cpp
index 09b7879185..2869837572 100644
--- a/ast_function.cpp
+++ b/ast_function.cpp
@@ -63,6 +63,37 @@ process_call(exec_list *instructions, ir_function *f,
(void) instructions;
if (sig != NULL) {
+ /* Verify that 'out' and 'inout' actual parameters are lvalues. This
+ * isn't done in ir_function::matching_signature because that function
+ * cannot generate the necessary diagnostics.
+ */
+ exec_list_iterator actual_iter = actual_parameters->iterator();
+ exec_list_iterator formal_iter = sig->parameters.iterator();
+
+ while (actual_iter.has_next()) {
+ ir_rvalue *actual =
+ ((ir_instruction *) actual_iter.get())->as_rvalue();
+ ir_variable *formal =
+ ((ir_instruction *) formal_iter.get())->as_variable();
+
+ assert(actual != NULL);
+ assert(formal != NULL);
+
+ if ((formal->mode == ir_var_out)
+ || (formal->mode == ir_var_inout)) {
+ if (! actual->is_lvalue()) {
+ /* FINISHME: Log a better diagnostic here. There is no way
+ * FINISHME: to tell the user which parameter is invalid.
+ */
+ _mesa_glsl_error(loc, state, "`%s' parameter is not lvalue",
+ (formal->mode == ir_var_out) ? "out" : "inout");
+ }
+ }
+
+ actual_iter.next();
+ formal_iter.next();
+ }
+
/* FINISHME: The list of actual parameters needs to be modified to
* FINISHME: include any necessary conversions.
*/
diff --git a/ir_function.cpp b/ir_function.cpp
index 4d246392ad..a8b73f1e1a 100644
--- a/ir_function.cpp
+++ b/ir_function.cpp
@@ -126,13 +126,10 @@ parameter_lists_match(exec_list *list_a, exec_list *list_b)
break;
case ir_var_out:
- /* FINISHME: Make sure that actual is a valid lvalue. */
score = type_compare(actual->type, param->type);
break;
case ir_var_inout:
- /* FINISHME: Make sure that actual is a valid lvalue. */
-
/* Since there are no bi-directional automatic conversions (e.g.,
* there is int -> float but no float -> int), inout parameters must
* be exact matches.