Should this patch be cc'd to stable branches? Without it, the compiler crashes on invalid inputs, instead of generating an error.
This patch applies cleanly to 10.5 and 10.6. -Mark Renaud Gaubert <ren...@lse.epita.fr> writes: > This is done by returning an rvalue of type void in the > ast_function_expression::hir function instead of a void expression. > > This produces (in the case of the ternary) an hir with a call > to the void returning function and an assignment of a void variable > which will be optimized out (the assignment) during the optimization > pass. > > This fix results in having a valid subexpression in the many > different cases where the subexpressions are functions whose > return values are void. > > Thus preventing to dereference NULL in the following cases: > * binary operator > * unary operators > * ternary operator > * comparison operators (except equal and nequal operator) > > Equal and nequal had to be handled as a special case because > instead of segfaulting on a forbidden syntax it was now accepting > expressions with a void return value on either (or both) side of > the expression. > > Signed-off-by: Renaud Gaubert <ren...@lse.epita.fr> > Reviewed-by: Gabriel Laskar <gabr...@lse.epita.fr> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85252 > > --- > Piglit tests were sent to the Piglit mailing list: > * glsl-1.10 Adds tests on how void functions are handled > > src/glsl/ast_function.cpp | 9 ++++++++- > src/glsl/ast_to_hir.cpp | 9 ++++++++- > 2 files changed, 16 insertions(+), 2 deletions(-) > > diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp > index 92e26bf..ac32723 100644 > --- a/src/glsl/ast_function.cpp > +++ b/src/glsl/ast_function.cpp > @@ -1785,7 +1785,14 @@ ast_function_expression::hir(exec_list *instructions, > /* an error has already been emitted */ > value = ir_rvalue::error_value(ctx); > } else { > - value = generate_call(instructions, sig, &actual_parameters, state); > + value = generate_call(instructions, sig, &actual_parameters, state); > + if (!value) { > + ir_variable *const tmp = new(ctx) > ir_variable(glsl_type::void_type, > + "void_var", > + ir_var_temporary); > + instructions->push_tail(tmp); > + value = new(ctx) ir_dereference_variable(tmp); > + } > } > > return value; > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp > index 8cb46be..0d0ad2a 100644 > --- a/src/glsl/ast_to_hir.cpp > +++ b/src/glsl/ast_to_hir.cpp > @@ -1270,7 +1270,14 @@ ast_expression::do_hir(exec_list *instructions, > * applied to one operand that can make them match, in which > * case this conversion is done." > */ > - if ((!apply_implicit_conversion(op[0]->type, op[1], state) > + > + if (op[0]->type == glsl_type::void_type || op[1]->type == > glsl_type::void_type) { > + _mesa_glsl_error(& loc, state, "`%s': wrong operand types: " > + "no operation `%1$s' exists that takes a left-hand " > + "operand of type 'void' or a right operand of type " > + "'void'", (this->oper == ast_equal) ? "==" : "!="); > + error_emitted = true; > + } else if ((!apply_implicit_conversion(op[0]->type, op[1], state) > && !apply_implicit_conversion(op[1]->type, op[0], state)) > || (op[0]->type != op[1]->type)) { > _mesa_glsl_error(& loc, state, "operands of `%s' must have the same > " > -- > 2.4.5 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev