Patchwork vector comparisons in C++

login
register
mail settings
Submitter Marc Glisse
Date Aug. 31, 2012, 10:22 p.m.
Message ID <alpine.DEB.2.02.1209010021460.11410@stedding.saclay.inria.fr>
Download mbox | patch
Permalink /patch/181063/
State New
Headers show

Comments

Marc Glisse - Aug. 31, 2012, 10:22 p.m.
With the patch...

On Sat, 1 Sep 2012, Marc Glisse wrote:

> Hello,
>
> this patch copies some more vector extensions from the C front-end to the C++ 
> front-end. There seemed to be some reluctance to add those, but I guess a 
> patch is the best way to ask. Note that I only added the vector x vector 
> operations, not the vector x scalar ones.
>
> I have some issues with the vector-compare-2.c torture test. It passes a 
> vector by value (argument and return type), which is likely to warn (although 
> for some reason it doesn't for me, with today's compiler). And it takes 
> -Wno-psabi through a .x file, but those are not read in c-c++-common, so I 
> put it in dg-options. I would have changed the function to use pointers, but 
> I don't know if it specifically wants to test passing by value...
>
>
>
> 2012-08-31  Marc Glisse  <marc.glisse@inria.fr>
> 	PR c++/54427
>
> cp/ChangeLog
> 	* typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
> 	NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.
>
> testsuite/ChangeLog
> 	* gcc.dg/vector-shift.c: Move ...
> 	* c-c++-common/vector-shift.c: ... here.
> 	* gcc.dg/vector-shift1.c: Move ...
> 	* c-c++-common/vector-shift1.c: ... here.
> 	* gcc.dg/vector-shift3.c: Move ...
> 	* c-c++-common/vector-shift3.c: ... here.
> 	* gcc.dg/vector-compare-1.c: Move ...
> 	* c-c++-common/vector-compare-1.c: ... here.
> 	* gcc.dg/vector-compare-2.c: Move ...
> 	* c-c++-common/vector-compare-2.c: ... here.
> 	* gcc.c-torture/execute/vector-compare-1.c: Move ...
> 	* c-c++-common/torture/vector-compare-1.c: ... here.
> 	* gcc.c-torture/execute/vector-compare-2.x: Delete.
> 	* gcc.c-torture/execute/vector-compare-2.c: Move ...
> 	* c-c++-common/torture/vector-compare-2.c: ... here.
> 	* gcc.c-torture/execute/vector-shift.c: Move ...
> 	* c-c++-common/torture/vector-shift.c: ... here.
> 	* gcc.c-torture/execute/vector-shift2.c: Move ...
> 	* c-c++-common/torture/vector-shift2.c: ... here.
> 	* gcc.c-torture/execute/vector-subscript-1.c: Move ...
> 	* c-c++-common/torture/vector-subscript-1.c: ... here.
> 	* gcc.c-torture/execute/vector-subscript-2.c: Move ...
> 	* c-c++-common/torture/vector-subscript-2.c: ... here.
> 	* gcc.c-torture/execute/vector-subscript-3.c: Move ...
> 	* c-c++-common/torture/vector-subscript-3.c: ... here.
Marc Glisse - Sept. 11, 2012, 11:25 a.m.
Any comment?
http://gcc.gnu.org/ml/gcc-patches/2012-08/msg02098.html

Maybe separately on the technical and political aspects?


On Sat, 1 Sep 2012, Marc Glisse wrote:

> With the patch...
>
> On Sat, 1 Sep 2012, Marc Glisse wrote:
>
>> Hello,
>> 
>> this patch copies some more vector extensions from the C front-end to the 
>> C++ front-end. There seemed to be some reluctance to add those, but I guess 
>> a patch is the best way to ask. Note that I only added the vector x vector 
>> operations, not the vector x scalar ones.
>> 
>> I have some issues with the vector-compare-2.c torture test. It passes a 
>> vector by value (argument and return type), which is likely to warn 
>> (although for some reason it doesn't for me, with today's compiler). And it 
>> takes -Wno-psabi through a .x file, but those are not read in c-c++-common, 
>> so I put it in dg-options. I would have changed the function to use 
>> pointers, but I don't know if it specifically wants to test passing by 
>> value...
>> 
>> 
>> 
>> 2012-08-31  Marc Glisse  <marc.glisse@inria.fr>
>> 	PR c++/54427
>> 
>> cp/ChangeLog
>> 	* typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
>> 	NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.
>> 
>> testsuite/ChangeLog
>> 	* gcc.dg/vector-shift.c: Move ...
>> 	* c-c++-common/vector-shift.c: ... here.
>> 	* gcc.dg/vector-shift1.c: Move ...
>> 	* c-c++-common/vector-shift1.c: ... here.
>> 	* gcc.dg/vector-shift3.c: Move ...
>> 	* c-c++-common/vector-shift3.c: ... here.
>> 	* gcc.dg/vector-compare-1.c: Move ...
>> 	* c-c++-common/vector-compare-1.c: ... here.
>> 	* gcc.dg/vector-compare-2.c: Move ...
>> 	* c-c++-common/vector-compare-2.c: ... here.
>> 	* gcc.c-torture/execute/vector-compare-1.c: Move ...
>> 	* c-c++-common/torture/vector-compare-1.c: ... here.
>> 	* gcc.c-torture/execute/vector-compare-2.x: Delete.
>> 	* gcc.c-torture/execute/vector-compare-2.c: Move ...
>> 	* c-c++-common/torture/vector-compare-2.c: ... here.
>> 	* gcc.c-torture/execute/vector-shift.c: Move ...
>> 	* c-c++-common/torture/vector-shift.c: ... here.
>> 	* gcc.c-torture/execute/vector-shift2.c: Move ...
>> 	* c-c++-common/torture/vector-shift2.c: ... here.
>> 	* gcc.c-torture/execute/vector-subscript-1.c: Move ...
>> 	* c-c++-common/torture/vector-subscript-1.c: ... here.
>> 	* gcc.c-torture/execute/vector-subscript-2.c: Move ...
>> 	* c-c++-common/torture/vector-subscript-2.c: ... here.
>> 	* gcc.c-torture/execute/vector-subscript-3.c: Move ...
>> 	* c-c++-common/torture/vector-subscript-3.c: ... here.

Patch

Index: cp/typeck.c

===================================================================
--- cp/typeck.c	(revision 190842)

+++ cp/typeck.c	(working copy)

@@ -3977,21 +3977,29 @@  cp_build_binary_op (location_t location,

     case TRUTH_AND_EXPR:
     case TRUTH_OR_EXPR:
       result_type = boolean_type_node;
       break;
 
       /* Shift operations: result has same type as first operand;
 	 always convert second operand to int.
 	 Also set SHORT_SHIFT if shifting rightward.  */
 
     case RSHIFT_EXPR:
-      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)

+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE

+	  && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE

+	  && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE

+	  && TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))

+	{

+	  result_type = type0;

+	  converted = 1;

+	}

+      else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)

 	{
 	  result_type = type0;
 	  if (TREE_CODE (op1) == INTEGER_CST)
 	    {
 	      if (tree_int_cst_lt (op1, integer_zero_node))
 		{
 		  if ((complain & tf_warning)
 		      && c_inhibit_evaluation_warnings == 0)
 		    warning (0, "right shift count is negative");
 		}
@@ -4006,21 +4014,29 @@  cp_build_binary_op (location_t location,

 	  /* Convert the shift-count to an integer, regardless of
 	     size of value being shifted.  */
 	  if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
 	    op1 = cp_convert (integer_type_node, op1, complain);
 	  /* Avoid converting op1 to result_type later.  */
 	  converted = 1;
 	}
       break;
 
     case LSHIFT_EXPR:
-      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)

+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE

+	  && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE

+	  && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE

+	  && TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))

+	{

+	  result_type = type0;

+	  converted = 1;

+	}

+      else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)

 	{
 	  result_type = type0;
 	  if (TREE_CODE (op1) == INTEGER_CST)
 	    {
 	      if (tree_int_cst_lt (op1, integer_zero_node))
 		{
 		  if ((complain & tf_warning)
 		      && c_inhibit_evaluation_warnings == 0)
 		    warning (0, "left shift count is negative");
 		}
@@ -4064,20 +4080,22 @@  cp_build_binary_op (location_t location,

 	    }
 	  /* Convert the shift-count to an integer, regardless of
 	     size of value being shifted.  */
 	  if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
 	    op1 = cp_convert (integer_type_node, op1, complain);
 	}
       break;
 
     case EQ_EXPR:
     case NE_EXPR:
+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)

+	goto vector_compare;

       if ((complain & tf_warning)
 	  && (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
 	warning (OPT_Wfloat_equal,
 		 "comparing floating point with == or != is unsafe");
       if ((complain & tf_warning)
 	  && ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1))
 	      || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))))
 	warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
 
       build_type = boolean_type_node;
@@ -4306,20 +4324,46 @@  cp_build_binary_op (location_t location,

     case GE_EXPR:
     case LT_EXPR:
     case GT_EXPR:
       if (TREE_CODE (orig_op0) == STRING_CST
 	  || TREE_CODE (orig_op1) == STRING_CST)
 	{
 	  if (complain & tf_warning)
 	    warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
 	}
 
+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)

+	{

+	vector_compare:

+	  tree intt;

+	  if (TREE_TYPE (type0) != TREE_TYPE (type1))

+	    {

+	      error_at (location, "comparing vectors with different "

+				  "element types");

+	      return error_mark_node;

+	    }

+

+	  if (TYPE_VECTOR_SUBPARTS (type0) != TYPE_VECTOR_SUBPARTS (type1))

+	    {

+	      error_at (location, "comparing vectors with different "

+				  "number of elements");

+	      return error_mark_node;

+	    }

+

+	  /* Always construct signed integer vector type.  */

+	  intt = c_common_type_for_size (GET_MODE_BITSIZE

+					   (TYPE_MODE (TREE_TYPE (type0))), 0);

+	  result_type = build_opaque_vector_type (intt,

+						  TYPE_VECTOR_SUBPARTS (type0));

+	  converted = 1;

+	  break;

+	}

       build_type = boolean_type_node;
       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
 	   || code0 == ENUMERAL_TYPE)
 	   && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
 	       || code1 == ENUMERAL_TYPE))
 	short_compare = 1;
       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
 	result_type = composite_pointer_type (type0, type1, op0, op1,
 					      CPO_COMPARISON, complain);
       else if (code0 == POINTER_TYPE && null_ptr_cst_p (op1))
Index: testsuite/c-c++-common/vector-compare-1.c

===================================================================
--- testsuite/c-c++-common/vector-compare-1.c	(revision 190834)

+++ testsuite/c-c++-common/vector-compare-1.c	(working copy)

@@ -7,13 +7,13 @@  __attribute__((vector_size((elcount)*siz

 void
 foo (vector (4, int) x, vector (4, float) y)
 {
   vector (4, int) p4;
   vector (4, int) r4;
   vector (4, unsigned int) q4;
   vector (8, int) r8;
   vector (4, float) f4;
   
   r4 = x > y;	    /* { dg-error "comparing vectors with different element types" } */
-  r8 = (x != p4);   /* { dg-error "incompatible types when assigning to type" } */

+  r8 = (x != p4);   /* { dg-error "incompatible types when assigning to type|cannot convert" } */

   r8 == r4;	    /* { dg-error "comparing vectors with different number of elements" } */
 }
Index: testsuite/c-c++-common/vector-shift.c

===================================================================
--- testsuite/c-c++-common/vector-shift.c	(revision 190834)

+++ testsuite/c-c++-common/vector-shift.c	(working copy)

@@ -1,11 +1,12 @@ 

 /* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */

 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 int main (int argc, char *argv[]) {
     vector(4,char) vchar = {1,2,3,4};
     vector(4, int) vint  = {1,1,1,1};
     
     vint <<= vchar;  /* { dg-error "nvalid operands to binary <<" } */
     vchar >>= vint;  /* { dg-error "nvalid operands to binary >>" } */
 
Index: testsuite/c-c++-common/torture/vector-subscript-1.c

===================================================================
--- testsuite/c-c++-common/torture/vector-subscript-1.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-subscript-1.c	(working copy)

@@ -1,11 +1,11 @@ 

-/* dg-do run */

+/* { dg-do run } */

 #define vector __attribute__((vector_size(sizeof(int)*4) ))
 
 /* Check to make sure that we extract and insert the vector at the same
    location for vector subscripting and that vectors layout are the same
    as arrays. */
 
 struct TV4
 {
     vector int v;
 };
Index: testsuite/c-c++-common/torture/vector-subscript-2.c

===================================================================
--- testsuite/c-c++-common/torture/vector-subscript-2.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-subscript-2.c	(working copy)

@@ -1,10 +1,11 @@ 

+/* { dg-do run } */

 #define vector __attribute__((vector_size(sizeof(int)*4) ))
 
 /* Check to make sure that we extract and insert the vector at the same
    location for vector subscripting (with constant indexes) and
    that vectors layout are the same as arrays. */
 
 struct TV4
 {
     vector int v;
 };
Index: testsuite/c-c++-common/torture/vector-shift.c

===================================================================
--- testsuite/c-c++-common/torture/vector-shift.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-shift.c	(working copy)

@@ -1,29 +1,30 @@ 

+/* { dg-do run } */

 
 #define vector __attribute__((vector_size(sizeof(int)*4) ))
 
 static vector int allones = {1, 1, 1, 1};
 static vector int allzeros = {0, 0, 0, 0};
 static vector int numbers = {0, 1, 2, 3};
 static vector int numbersleftshiftallones = {0, 2, 4, 6};
 static vector int numbersrightshiftallones = {0, 0, 1, 1};
 
 
 static vector unsigned int uallones = {1, 1, 1, 1};
 static vector unsigned int uallzeros = {0, 0, 0, 0};
 static vector unsigned int unumbers = {0, 1, 2, 3};
 static vector unsigned int unumbersleftshiftallones = {0, 2, 4, 6};
 static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
 
 #define TEST(result, expected) \
 do { \
-  typeof(result) result1 = result; \

+  __typeof__(result) result1 = result; \

   if(sizeof (result1) != sizeof (expected)) \
     __builtin_abort (); \
   if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \
     __builtin_abort (); \
 }while (0);
 
 int main(void)
 {
   vector int result;
   TEST ((numbers << allzeros), numbers);
Index: testsuite/c-c++-common/torture/vector-subscript-3.c

===================================================================
--- testsuite/c-c++-common/torture/vector-subscript-3.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-subscript-3.c	(working copy)

@@ -1,11 +1,11 @@ 

-/* dg-do run */

+/* { dg-do run } */

 #define vector __attribute__((vector_size(16) ))
 
 /* Check whether register declaration of vector type still 
    allow us to subscript this type.  */
 
 typedef vector short myvec_t;
 
 struct vec_s {
     vector short member;
 };
Index: testsuite/c-c++-common/torture/vector-shift2.c

===================================================================
--- testsuite/c-c++-common/torture/vector-shift2.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-shift2.c	(working copy)

@@ -1,10 +1,11 @@ 

+/* { dg-do run } */

 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 #define vidx(type, vec, idx) (*((type *) &(vec) + idx))
 #define uint unsigned int
 
 int main (int argc, char *argv[]) {
     vector(4, uint) vuint  = { 1,  2,  3,  4};
     vector(4,  int) vint0  = { 1,  1,  1,  1};
     vector(4,  int) vint1  = {-1, -1, -1, -1};
Index: testsuite/c-c++-common/torture/vector-compare-1.c

===================================================================
--- testsuite/c-c++-common/torture/vector-compare-1.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-compare-1.c	(working copy)

@@ -1,10 +1,11 @@ 

+/* { dg-do run } */

 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 #define check_compare(count, res, i0, i1, op, fmt) \
 do { \
     int __i; \
     for (__i = 0; __i < count; __i ++) { \
       if ((res)[__i] != ((i0)[__i] op (i1)[__i] ? -1 : 0)) \
 	{ \
             __builtin_printf ("%i != ((" fmt " " #op " " fmt " ? -1 : 0) ", \
@@ -31,76 +32,76 @@  do { \

 } while (0)
 
 
 int main (int argc, char *argv[]) {
 #define INT  int
     vector (4, INT) i0;
     vector (4, INT) i1;
     vector (4, int) ires;
     int i;
 
-    i0 = (vector (4, INT)){argc, 1,  2,  10};

+    i0 = (vector (4, INT)){(INT)argc, 1,  2,  10};

     i1 = (vector (4, INT)){0, 3, 2, (INT)-23};
     test (4, i0, i1, ires, "%i");
 #undef INT
 
 #define INT unsigned int
     vector (4, int) ures;
     vector (4, INT) u0;
     vector (4, INT) u1;
 
-    u0 = (vector (4, INT)){argc, 1,  2,  10};

+    u0 = (vector (4, INT)){(INT)argc, 1,  2,  10};

     u1 = (vector (4, INT)){0, 3, 2, (INT)-23};
     test (4, u0, u1, ures, "%u");
 #undef INT
 
 
 #define SHORT short
     vector (8, SHORT) s0;
     vector (8, SHORT) s1;
     vector (8, short) sres;
 
-    s0 = (vector (8, SHORT)){argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};

+    s0 = (vector (8, SHORT)){(SHORT)argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};

     s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
     test (8, s0, s1, sres, "%i");
 #undef SHORT
 
 #define SHORT unsigned short
     vector (8, SHORT) us0;
     vector (8, SHORT) us1;
     vector (8, short) usres;
 
-    us0 = (vector (8, SHORT)){argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};

+    us0 = (vector (8, SHORT)){(SHORT)argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};

     us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
     test (8, us0, us1, usres, "%u");
 #undef SHORT
 
 #define CHAR signed char
     vector (16, CHAR) c0;
     vector (16, CHAR) c1;
     vector (16, signed char) cres;
 
-    c0 = (vector (16, CHAR)){argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \

-                             argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };

+    c0 = (vector (16, CHAR)){(CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \

+                             (CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };

 
     c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
                              0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
     test (16, c0, c1, cres, "%i");
 #undef CHAR
 
 #define CHAR unsigned char
     vector (16, CHAR) uc0;
     vector (16, CHAR) uc1;
     vector (16, signed char) ucres;
 
-    uc0 = (vector (16, CHAR)){argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \

-                             argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };

+    uc0 = (vector (16, CHAR)){(CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \

+                              (CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };

 
     uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
                              0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
     test (16, uc0, uc1, ucres, "%u");
 #undef CHAR
 /* Float comparison.  */
     vector (4, float) f0;
     vector (4, float) f1;
     __typeof (f0 == f1) ifres;
 
Index: testsuite/c-c++-common/torture/vector-compare-2.c

===================================================================
--- testsuite/c-c++-common/torture/vector-compare-2.c	(revision 190838)

+++ testsuite/c-c++-common/torture/vector-compare-2.c	(working copy)

@@ -1,10 +1,12 @@ 

+/* { dg-do run } */

+/* { dg-options "-Wno-psabi" } */

 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 /* Check that constant folding in 
    these simple cases works.  */
 vector (4, int)
 foo (vector (4, int) x)
 {
   return   (x == x) + (x != x) + (x >  x) 
 	 + (x <  x) + (x >= x) + (x <= x);
Index: testsuite/c-c++-common/vector-shift1.c

===================================================================
--- testsuite/c-c++-common/vector-shift1.c	(revision 190834)

+++ testsuite/c-c++-common/vector-shift1.c	(working copy)

@@ -1,18 +1,19 @@ 

 /* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */

 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 int main (int argc, char *argv[]) {
     vector(4, float) vfloat0 = {1., 2., 3., 4.};
     vector(4, float) vfloat1 = {1., 2., 3., 4.};
     
     vector(4,   int) vint   = {1,  1,  1,  1 };
     
     vint <<= vfloat0;  /* { dg-error "nvalid operands to binary <<" } */
     vfloat0 >>= vint;  /* { dg-error "nvalid operands to binary >>" } */
 
-    vfloat0 <<= vfloat1;  /* { dg-error "nvalid operands to binary <<" } */

+    vfloat0 <<= vfloat1;  /* { dg-error "nvalid operands" } */

 
     return 0;
 }
 
Index: testsuite/c-c++-common/vector-shift3.c

===================================================================
--- testsuite/c-c++-common/vector-shift3.c	(revision 190834)

+++ testsuite/c-c++-common/vector-shift3.c	(working copy)

@@ -1,16 +1,16 @@ 

 /* { dg-do compile } */
 
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 
 int main (int argc, char *argv[]) {
-    vector(8, short) v0 = {argc,2,3,4,5,6,7};

+    vector(8, short) v0 = {(short)argc,2,3,4,5,6,7};

     short sc;
 
     
-    scalar1 <<= v0; /* { dg-error ".*scalar1.*undeclared" } */

+    scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */

    
     return 0;
 }