Hi!

The change for better warnings on vector shifts unfortunately started
accepting even shifts of floating point vectors by int shift count, which is
something that shouldn't be supported and ICEs later on.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2018-03-14  Jakub Jelinek  <ja...@redhat.com>

        PR c/84853
        * c-typeck.c (build_binary_op) <case RSHIFT_EXPR, case LSHIFT_EXPR>:
        If code1 is INTEGER_TYPE, only allow code0 VECTOR_TYPE if it has
        INTEGER_TYPE element type.

        * gcc.dg/pr84853.c: New test.

--- gcc/c/c-typeck.c.jj 2018-03-13 21:32:00.441647458 +0100
+++ gcc/c/c-typeck.c    2018-03-13 23:03:27.659789112 +0100
@@ -11350,7 +11350,8 @@ build_binary_op (location_t location, en
          converted = 1;
        }
       else if ((code0 == INTEGER_TYPE || code0 == FIXED_POINT_TYPE
-               || code0 == VECTOR_TYPE)
+               || (code0 == VECTOR_TYPE
+                   && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE))
               && code1 == INTEGER_TYPE)
        {
          doing_shift = true;
@@ -11408,7 +11409,8 @@ build_binary_op (location_t location, en
          converted = 1;
        }
       else if ((code0 == INTEGER_TYPE || code0 == FIXED_POINT_TYPE
-               || code0 == VECTOR_TYPE)
+               || (code0 == VECTOR_TYPE
+                   && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE))
               && code1 == INTEGER_TYPE)
        {
          doing_shift = true;
--- gcc/testsuite/gcc.dg/pr84853.c.jj   2018-03-13 23:07:05.910890067 +0100
+++ gcc/testsuite/gcc.dg/pr84853.c      2018-03-13 23:06:38.546877404 +0100
@@ -0,0 +1,19 @@
+/* PR c/84853 */
+/* { dg-do compile } */
+
+typedef float V __attribute__((__vector_size__ (16)));
+typedef int W __attribute__((__vector_size__ (16)));
+
+void
+foo (int x, V *y, V *z, W *w)
+{
+  *y = *y << x;                /* { dg-error "invalid operands to binary <<" } 
*/
+  *z = *z << *w;       /* { dg-error "invalid operands to binary <<" } */
+}
+
+void
+bar (int x, V *y, V *z, W *w)
+{
+  *y = *y >> x;                /* { dg-error "invalid operands to binary >>" } 
*/
+  *z = *z >> *w;       /* { dg-error "invalid operands to binary >>" } */
+}

        Jakub

Reply via email to