On Thu, Jun 27, 2013 at 05:24:45PM +0200, Marc Glisse wrote:
> On Thu, 27 Jun 2013, Jason Merrill wrote:
>
> >On 06/27/2013 07:59 AM, Marc Glisse wrote:
> >>I assume I can't call directly c_build_vec_perm_expr on the original
> >>arguments without build_non_dependent_expr?
> >
> >It looks like c_build_vec_perm_expr is safe to take the original
> >arguments, since it doesn't look deep into the expression. So
> >either way is fine.
>
> Cool, I'll go with the short version then (I tested it before posting):
>
> +tree
> +build_x_vec_perm_expr (location_t loc,
> + tree arg0, tree arg1, tree arg2,
> + tsubst_flags_t complain)
> +{
> + if (processing_template_decl
> + && (type_dependent_expression_p (arg0)
> + || type_dependent_expression_p (arg1)
> + || type_dependent_expression_p (arg2)))
> + return build_min_nt_loc (loc, VEC_PERM_EXPR, arg0, arg1, arg2);
> + return c_build_vec_perm_expr (loc, arg0, arg1, arg2, complain & tf_error);
> +}
But then you won't diagnose errors in never instantiated templates that
could be diagnosed (i.e. where the arguments aren't type dependent).
I think the standard C++ FE way is doing something like:
+ tree expr;
+ tree orig_arg0 = arg0;
+ tree orig_arg1 = arg1;
+ tree orig_arg2 = arg2;
+ if (processing_template_decl)
+ {
+ if (type_dependent_expression_p (arg0)
+ || type_dependent_expression_p (arg1)
+ || type_dependent_expression_p (arg2))
+ return build_min_nt_loc (loc, VEC_PERM_EXPR, arg0, arg1, arg2);
+ arg0 = build_non_dependent_expr (arg0);
+ arg1 = build_non_dependent_expr (arg1);
+ arg2 = build_non_dependent_expr (arg2);
+ }
+ expr = c_build_vec_perm_expr (loc, arg0, arg1, arg2, complain & tf_error);
+ if (processing_template_decl && expr != error_mark_node)
+ return build_min_nt_loc (loc, VEC_PERM_EXPR, orig_arg0, orig_arg1,
+ orig_arg2);
+ return expr;
Jakub