Hello,this patch makes build_x_vec_perm_expr more similar to the other build_x_* functions (I don't know why I had imagined it wouldn't be necessary).
Bootstrap+testsuite on x86_64-unknown-linux-gnu. 2014-01-01 Marc Glisse <marc.gli...@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. -- Marc Glisse
Index: gcc/cp/typeck.c =================================================================== --- gcc/cp/typeck.c (revision 206274) +++ gcc/cp/typeck.c (working copy) @@ -4937,26 +4937,39 @@ cp_build_binary_op (location_t location, return result; } /* Build a VEC_PERM_EXPR. This is a simple wrapper for c_build_vec_perm_expr. */ 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) + 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) of pointer PTROP and integer INTOP. */ static tree cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop, tsubst_flags_t complain) { tree res_type = TREE_TYPE (ptrop); Index: gcc/testsuite/g++.dg/ext/pr59378.C =================================================================== --- gcc/testsuite/g++.dg/ext/pr59378.C (revision 0) +++ gcc/testsuite/g++.dg/ext/pr59378.C (working copy) @@ -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&); Property changes on: gcc/testsuite/g++.dg/ext/pr59378.C ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision URL \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property