[Mesa-dev] [PATCH] glsl: emit a specific error when ast_*_assign changes type
Timothy Arceri
timothy.arceri at collabora.com
Sat Jul 30 05:48:17 UTC 2016
On Fri, 2016-07-08 at 23:30 -0400, Ilia Mirkin wrote:
> For regular ast_add, we can implicitly change either a or b's type.
> However in an assignment situation, the type of the lvalue is fixed.
> So
> if the implicit conversion logic decides to change it, it means that
> the
> rhs's type could not be converted to the lhs type.
>
> Emit a specific error for this rather than the rather mysterious "is
> not
> an lvalue" error that results from having a i2f or other operation as
> the lvalue.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96729
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/compiler/glsl/ast_to_hir.cpp | 28 +++++++++++++++++++++++++++-
> 1 file changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/glsl/ast_to_hir.cpp
> b/src/compiler/glsl/ast_to_hir.cpp
> index 8ddc084..55ee840 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -1353,7 +1353,7 @@ ast_expression::do_hir(exec_list *instructions,
> };
> ir_rvalue *result = NULL;
> ir_rvalue *op[3];
> - const struct glsl_type *type; /* a temporary variable for switch
> cases */
> + const struct glsl_type *type, *orig_type;
> bool error_emitted = false;
> YYLTYPE loc;
>
> @@ -1639,10 +1639,18 @@ ast_expression::do_hir(exec_list
> *instructions,
> op[0] = this->subexpressions[0]->hir(instructions, state);
> op[1] = this->subexpressions[1]->hir(instructions, state);
>
> + orig_type = op[0]->type;
> type = arithmetic_result_type(op[0], op[1],
> (this->oper == ast_mul_assign),
> state, & loc);
>
> + if (type != orig_type) {
> + _mesa_glsl_error(& loc, state,
> + "could not implicitly convert "
> + "rvalue type to lvalue type");
Why not do:
"%s to %s", type->name, orig_type->name);
Otherwise this looks good to me.
Reviewed-by: Timothy Arceri <timothy.arceri at collabora.com>
> + type = glsl_type::error_type;
> + }
> +
> ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this-
> >oper], type,
> op[0], op[1]);
>
> @@ -1666,8 +1674,16 @@ ast_expression::do_hir(exec_list
> *instructions,
> op[0] = this->subexpressions[0]->hir(instructions, state);
> op[1] = this->subexpressions[1]->hir(instructions, state);
>
> + orig_type = op[0]->type;
> type = modulus_result_type(op[0], op[1], state, &loc);
>
> + if (type != orig_type) {
> + _mesa_glsl_error(& loc, state,
> + "could not implicitly convert "
> + "rvalue type to lvalue type");
> + type = glsl_type::error_type;
> + }
> +
> assert(operations[this->oper] == ir_binop_mod);
>
> ir_rvalue *temp_rhs;
> @@ -1707,7 +1723,17 @@ ast_expression::do_hir(exec_list
> *instructions,
> this->subexpressions[0]->set_is_lhs(true);
> op[0] = this->subexpressions[0]->hir(instructions, state);
> op[1] = this->subexpressions[1]->hir(instructions, state);
> +
> + orig_type = op[0]->type;
> type = bit_logic_result_type(op[0], op[1], this->oper, state,
> &loc);
> +
> + if (type != orig_type) {
> + _mesa_glsl_error(& loc, state,
> + "could not implicitly convert "
> + "rvalue type to lvalue type");
> + type = glsl_type::error_type;
> + }
> +
> ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this-
> >oper],
> type, op[0],
> op[1]);
> error_emitted =
More information about the mesa-dev
mailing list