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

Reply via email to