Jason,

This patch handles vector increment/decrement in build_unary_op and cp_build_binary_op.

In other words, we allow v++ and --v on a vector v.
v + 1 and v - 1 are already allowed.

This fixes an ICE when compiling a vector increment/decrement.

Bootstrapped and reg-tested on x86_64.

OK for trunk?

Thanks,
- Tom

2013-11-26  Tom de Vries  <t...@codesourcery.com>
            Marc Glisse  <marc.gli...@inria.fr>

        PR c++/59032
        * c-typeck.c (build_unary_op): Allow vector increment and decrement.

        * typeck.c (cp_build_unary_op): Allow vector increment and decrement.

        * g++.dg/pr59032.C: New testcase.
        * gcc.dg/pr59032.c: Same.
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 0c9c8c8..f602ca4 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -3982,7 +3982,7 @@ build_unary_op (location_t location,
 
       if (typecode != POINTER_TYPE && typecode != FIXED_POINT_TYPE
 	  && typecode != INTEGER_TYPE && typecode != REAL_TYPE
-	  && typecode != COMPLEX_TYPE)
+	  && typecode != COMPLEX_TYPE && typecode != VECTOR_TYPE)
 	{
 	  if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
 	    error_at (location, "wrong type argument to increment");
@@ -4047,7 +4047,9 @@ build_unary_op (location_t location,
 	  }
 	else
 	  {
-	    inc = integer_one_node;
+	    inc = VECTOR_TYPE_P (argtype)
+	      ? build_one_cst (argtype)
+	      : integer_one_node;
 	    inc = convert (argtype, inc);
 	  }
 
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index a4da037..9f9f7b6 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -5748,7 +5748,9 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
 	    inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
 	  }
 	else
-	  inc = integer_one_node;
+	  inc = VECTOR_TYPE_P (argtype)
+	    ? build_one_cst (argtype)
+	    : integer_one_node;
 
 	inc = cp_convert (argtype, inc, complain);
 
diff --git a/gcc/testsuite/g++.dg/pr59032.C b/gcc/testsuite/g++.dg/pr59032.C
new file mode 100644
index 0000000..73f8889
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr59032.C
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void
+foo()
+{
+  float v __attribute__((vector_size(8)));
+  v++;
+}
+
+void
+foo2 ()
+{
+  float v __attribute__((vector_size(8)));
+  ++v;
+}
+
+void
+foo3 ()
+{
+  float v __attribute__((vector_size(8)));
+  v--;
+}
+
+void
+foo4 ()
+{
+  float v __attribute__((vector_size(8)));
+  --v;
+}
+
diff --git a/gcc/testsuite/gcc.dg/pr59032.c b/gcc/testsuite/gcc.dg/pr59032.c
new file mode 100644
index 0000000..0d8abc6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr59032.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=gnu99" } */
+
+void
+foo()
+{
+  float v __attribute__((vector_size(8)));
+  v++;
+}
+
+void
+foo2 ()
+{
+  float v __attribute__((vector_size(8)));
+  ++v;
+}
+
+void
+foo3 ()
+{
+  float v __attribute__((vector_size(8)));
+  v--;
+}
+
+void
+foo4 ()
+{
+  float v __attribute__((vector_size(8)));
+  --v;
+}

Reply via email to