glsl: Improve error message when read-only vars are written

Improves the cases when:
* an explicit assignment references the read-only variable
* an 'out' or 'inout' function parameter references the read-only variable
This commit is contained in:
Chad Versace
2011-01-21 13:44:08 -08:00
parent 01a584d093
commit b66be7518a
2 changed files with 29 additions and 7 deletions
+21 -6
View File
@@ -145,12 +145,27 @@ match_function_by_name(exec_list *instructions, const char *name,
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");
const char *mode = NULL;
switch (formal->mode) {
case ir_var_out: mode = "out"; break;
case ir_var_inout: mode = "inout"; break;
default: assert(false); break;
}
/* FIXME: 'loc' is incorrect (as of 2011-01-21). It is always
* FIXME: 0:0(0).
*/
if (actual->variable_referenced()
&& actual->variable_referenced()->read_only) {
_mesa_glsl_error(loc, state,
"function parameter '%s %s' references the "
"read-only variable '%s'",
mode, formal->name,
actual->variable_referenced()->name);
} else if (!actual->is_lvalue()) {
_mesa_glsl_error(loc, state,
"function parameter '%s %s' is not an lvalue",
mode, formal->name);
}
}
+8 -1
View File
@@ -639,7 +639,14 @@ do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());
if (!error_emitted) {
if (!lhs->is_lvalue()) {
if (lhs->variable_referenced() != NULL
&& lhs->variable_referenced()->read_only) {
_mesa_glsl_error(&lhs_loc, state,
"assignment to read-only variable '%s'",
lhs->variable_referenced()->name);
error_emitted = true;
} else if (!lhs->is_lvalue()) {
_mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
error_emitted = true;
}