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