It silence by default warnings with function parameters, as the parameters need to be processed in order to have the actual and the formal parameter, and the function signature. Then it raises the warning if needed at verify_parameter_modes where other in/out/inout modes checks are done.
v2: fix comment style, multi-line condition style, simplify check, remove extra blank (Ian Romanick) v3: inout function parameters can raise the warning too (Ian Romanick) --- One of the extra tests Ian proposed for patch 05 showed that the patch was wrong, as inout function parameters should raise the warning too. So the warning should be raised too inside the out/inout if (the one that starts with the comment /* Verify that 'out' and 'inout' ...) for inout vars, and before var->data.assigned is set. src/compiler/glsl/ast_function.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp index 37fb3e79..68bccbd 100644 --- a/src/compiler/glsl/ast_function.cpp +++ b/src/compiler/glsl/ast_function.cpp @@ -43,6 +43,12 @@ process_parameters(exec_list *instructions, exec_list *actual_parameters, unsigned count = 0; foreach_list_typed(ast_node, ast, link, parameters) { + /* We need to process the parameters first in order to know if we can + * raise or not a unitialized warning. Calling set_is_lhs silence the + * warning for now. Raising the warning or not will be checked at + * verify_parameter_modes. + */ + ast->set_is_lhs(true); ir_rvalue *result = ast->hir(instructions, state); ir_constant *const constant = result->constant_expression_value(); @@ -247,6 +253,16 @@ verify_parameter_modes(_mesa_glsl_parse_state *state, } ir_variable *var = actual->variable_referenced(); + + if (var && formal->data.mode == ir_var_function_inout) { + if ((var->data.mode == ir_var_auto || var->data.mode == ir_var_shader_out) && + !var->data.assigned && + !is_gl_identifier(var->name)) { + _mesa_glsl_warning(&loc, state, "`%s' used uninitialized", + var->name); + } + } + if (var) var->data.assigned = true; @@ -263,6 +279,18 @@ verify_parameter_modes(_mesa_glsl_parse_state *state, mode, formal->name); return false; } + } else { + assert(formal->data.mode == ir_var_function_in || + formal->data.mode == ir_var_const_in); + ir_variable *var = actual->variable_referenced(); + if (var) { + if ((var->data.mode == ir_var_auto || var->data.mode == ir_var_shader_out) && + !var->data.assigned && + !is_gl_identifier(var->name)) { + _mesa_glsl_warning(&loc, state, "`%s' used uninitialized", + var->name); + } + } } if (formal->type->is_image() && -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev