re PR c++/59378 (Internal compiler error when using __builtin_shuffle in a template function)

2014-01-02  Marc Glisse  <marc.glisse@inria.fr>

	PR c++/59378
gcc/cp/
	* typeck.c (build_x_vec_perm_expr): Handle non-dependent arguments
	in templates.
gcc/testsuite/
	* g++.dg/ext/pr59378.C: New file.

From-SVN: r206300
This commit is contained in:
Marc Glisse 2014-01-02 23:26:24 +01:00 committed by Marc Glisse
parent f82356d214
commit 4939c5f336
4 changed files with 37 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2014-01-02 Marc Glisse <marc.glisse@inria.fr>
PR c++/59378
* typeck.c (build_x_vec_perm_expr): Handle non-dependent arguments
in templates.
2014-01-02 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years

View File

@ -4944,12 +4944,25 @@ 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)
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);
return c_build_vec_perm_expr (loc, arg0, arg1, arg2, complain & tf_error);
|| type_dependent_expression_p (arg2))
return build_min_nt_loc (loc, VEC_PERM_EXPR, arg0, arg1, arg2);
arg0 = build_non_dependent_expr (arg0);
if (arg1)
arg1 = build_non_dependent_expr (arg1);
arg2 = build_non_dependent_expr (arg2);
}
tree exp = c_build_vec_perm_expr (loc, arg0, arg1, arg2, complain & tf_error);
if (processing_template_decl && exp != error_mark_node)
return build_min_non_dep (VEC_PERM_EXPR, exp, orig_arg0,
orig_arg1, orig_arg2);
return exp;
}
/* Return a tree for the sum or difference (RESULTCODE says which)

View File

@ -1,3 +1,8 @@
2014-01-02 Marc Glisse <marc.glisse@inria.fr>
PR c++/59378
* g++.dg/ext/pr59378.C: New file.
2014-01-02 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years

View File

@ -0,0 +1,8 @@
// { dg-do compile }
typedef int v4si __attribute__ ((vector_size (4*sizeof(int))));
template<int C>
void traverse(v4si& bounds){
v4si m = {0,1,2,3};
bounds = __builtin_shuffle(bounds, m);
}
template void traverse<0>(v4si&);