[Mesa-dev] [PATCH] glsl: Move error message inside validation check reducing duplicate message handling

Paul Berry stereotype441 at gmail.com
Fri Oct 25 23:51:33 CEST 2013


On 17 October 2013 04:42, Timothy Arceri <t_arceri at yahoo.com.au> wrote:

> ---
>  src/glsl/ast_to_hir.cpp | 27 ++++++++++++++-------------
>  1 file changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index dfa32d9..f96ed53 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -637,8 +637,8 @@ shift_result_type(const struct glsl_type *type_a,
>   */
>  ir_rvalue *
>  validate_assignment(struct _mesa_glsl_parse_state *state,
> -                   const glsl_type *lhs_type, ir_rvalue *rhs,
> -                   bool is_initializer)
> +                    YYLTYPE loc, const glsl_type *lhs_type,
> +                    ir_rvalue *rhs, bool is_initializer)
>  {
>     /* If there is already some error in the RHS, just return it.  Anything
>      * else will lead to an avalanche of error message back to the user.
> @@ -670,6 +670,12 @@ validate_assignment(struct _mesa_glsl_parse_state
> *state,
>          return rhs;
>     }
>
> +   _mesa_glsl_error(&loc, state,
> +                    is_initializer ? "initializer" : "value"
> +                    " of type %s cannot be assigned to "
> +                    "variable of type %s",
> +                    rhs->type->name, lhs_type->name);
> +
>

This doesn't produce the output you want.  String concatenation happens at
compile time and takes precedence over everything else, so this is being
interpreted as:

_mesa_glsl_error(&loc, state, is_initializer ? "initializer" : "value of
type %s cannot be assigned to variable of type %s", rhs->type->name,
lhs_type->name);

Adding parenthesis doesn't help because string concatenation only works on
string literals.  I believe what you actually want is:

   _mesa_glsl_error(&loc, state,
                    "%s of type %s cannot be assigned to "
                    "variable of type %s",
                    is_initializer ? "initializer" : "value",
                    rhs->type->name, lhs_type->name);

With that change, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>

Do you have push access?  I can push the patch for you (with this change)
if you'd like.


>     return NULL;
>  }
>
> @@ -700,10 +706,10 @@ do_assignment(exec_list *instructions, struct
> _mesa_glsl_parse_state *state,
>
>        if (unlikely(expr->operation == ir_binop_vector_extract)) {
>           ir_rvalue *new_rhs =
> -            validate_assignment(state, lhs->type, rhs, is_initializer);
> +            validate_assignment(state, lhs_loc, lhs->type,
> +                                rhs, is_initializer);
>
>           if (new_rhs == NULL) {
> -            _mesa_glsl_error(& lhs_loc, state, "type mismatch");
>              return lhs;
>           } else {
>              rhs = new(ctx) ir_expression(ir_triop_vector_insert,
> @@ -752,10 +758,8 @@ do_assignment(exec_list *instructions, struct
> _mesa_glsl_parse_state *state,
>     }
>
>     ir_rvalue *new_rhs =
> -      validate_assignment(state, lhs->type, rhs, is_initializer);
> -   if (new_rhs == NULL) {
> -      _mesa_glsl_error(& lhs_loc, state, "type mismatch");
> -   } else {
> +      validate_assignment(state, lhs_loc, lhs->type, rhs, is_initializer);
> +   if (new_rhs != NULL) {
>        rhs = new_rhs;
>
>        /* If the LHS array was not declared with a size, it takes it size
> from
> @@ -2495,7 +2499,8 @@ process_initializer(ir_variable *var,
> ast_declaration *decl,
>      */
>     if (type->qualifier.flags.q.constant
>         || type->qualifier.flags.q.uniform) {
> -      ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs,
> true);
> +      ir_rvalue *new_rhs = validate_assignment(state, initializer_loc,
> +                                               var->type, rhs, true);
>        if (new_rhs != NULL) {
>          rhs = new_rhs;
>
> @@ -2524,10 +2529,6 @@ process_initializer(ir_variable *var,
> ast_declaration *decl,
>             var->constant_value = constant_value;
>          }
>        } else {
> -        _mesa_glsl_error(&initializer_loc, state,
> -                         "initializer of type %s cannot be assigned to "
> -                         "variable of type %s",
> -                         rhs->type->name, var->type->name);
>          if (var->type->is_numeric()) {
>             /* Reduce cascading errors. */
>             var->constant_value = ir_constant::zero(state, var->type);
> --
> 1.8.3.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131025/1145517f/attachment.html>


More information about the mesa-dev mailing list