re PR c++/59378 (Internal compiler error when using __builtin_shuffle in a template...
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 2 Jan 2014 22:26:24 +0000 (23:26 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 2 Jan 2014 22:26:24 +0000 (22:26 +0000)
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

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/pr59378.C [new file with mode: 0644]

index d27c2a2..01a01ab 100644 (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
index f45c5b9..84e287e 100644 (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;
 }
 \f
 /* Return a tree for the sum or difference (RESULTCODE says which)
index 4a31319..fad02af 100644 (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
diff --git a/gcc/testsuite/g++.dg/ext/pr59378.C b/gcc/testsuite/g++.dg/ext/pr59378.C
new file mode 100644 (file)
index 0000000..19d06b5
--- /dev/null
@@ -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&);