re PR c++/29734 (ICE with vector in switch condition)
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Nov 2006 09:41:27 +0000 (10:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 21 Nov 2006 09:41:27 +0000 (10:41 +0100)
PR c++/29734
* cp-tree.h (WANT_VECTOR): Define.
(WANT_ARITH): Add WANT_VECTOR.
* cvt.c (build_expr_type_conversion): Handle vector types.
* typeck.c (build_unary_op): Add WANT_VECTOR to
build_expr_type_conversion flags.

* g++.dg/conversion/simd4.C: New test.

From-SVN: r119044

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/cvt.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/conversion/simd4.C [new file with mode: 0644]

index 5d0dd5c2f558061bca5a90668cca24992633c98f..295ed765dc462aae0ede992b8238dbaf8ecf46d4 100644 (file)
@@ -1,3 +1,12 @@
+2006-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/29734
+       * cp-tree.h (WANT_VECTOR): Define.
+       (WANT_ARITH): Add WANT_VECTOR.
+       * cvt.c (build_expr_type_conversion): Handle vector types.
+       * typeck.c (build_unary_op): Add WANT_VECTOR to
+       build_expr_type_conversion flags.
+
 2006-11-20  Simon Martin  <simartin@users.sourceforge.net>
 
        PR c++/29475
index d7e523ba382804866211866aa863b5fae03fd217..43e6e29d0cec945f40a5d570c2cda8436a5363c3 100644 (file)
@@ -3468,7 +3468,8 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
 #define WANT_ENUM      4 /* enumerated types */
 #define WANT_POINTER   8 /* pointer types */
 #define WANT_NULL      16 /* null pointer constant */
-#define WANT_ARITH     (WANT_INT | WANT_FLOAT)
+#define WANT_VECTOR    32 /* vector types */
+#define WANT_ARITH     (WANT_INT | WANT_FLOAT | WANT_VECTOR)
 
 /* Used with comptypes, and related functions, to guide type
    comparison.  */
index 6f61218b2324d23cfd92d4f006ce03a69898cbf5..f09f70860697b7e5c9a5555ec1ea298d907bafb9 100644 (file)
@@ -1103,7 +1103,6 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
          return expr;
        /* else fall through...  */
 
-      case VECTOR_TYPE:
       case BOOLEAN_TYPE:
        return (desires & WANT_INT) ? expr : NULL_TREE;
       case ENUMERAL_TYPE:
@@ -1117,6 +1116,23 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
       case ARRAY_TYPE:
        return (desires & WANT_POINTER) ? decay_conversion (expr)
                                        : NULL_TREE;
+
+      case VECTOR_TYPE:
+       if ((desires & WANT_VECTOR) == 0)
+         return NULL_TREE;
+       switch (TREE_CODE (TREE_TYPE (basetype)))
+         {
+         case INTEGER_TYPE:
+         case BOOLEAN_TYPE:
+           return (desires & WANT_INT) ? expr : NULL_TREE;
+         case ENUMERAL_TYPE:
+           return (desires & WANT_ENUM) ? expr : NULL_TREE;
+         case REAL_TYPE:
+           return (desires & WANT_FLOAT) ? expr : NULL_TREE;
+         default:
+           return NULL_TREE;
+         }
+
       default:
        return NULL_TREE;
       }
@@ -1151,6 +1167,23 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
        case POINTER_TYPE:
          win = (desires & WANT_POINTER); break;
 
+       case VECTOR_TYPE:
+         if ((desires & WANT_VECTOR) == 0)
+           break;
+         switch (TREE_CODE (TREE_TYPE (candidate)))
+           {
+           case BOOLEAN_TYPE:
+           case INTEGER_TYPE:
+             win = (desires & WANT_INT); break;
+           case ENUMERAL_TYPE:
+             win = (desires & WANT_ENUM); break;
+           case REAL_TYPE:
+             win = (desires & WANT_FLOAT); break;
+           default:
+             break;
+           }
+         break;
+
        default:
          break;
        }
index c257f00178e65230e6d78c8950bddb65086d978c..4146bf0e5970ba286cfee7e96d6e656fb4d847b3 100644 (file)
@@ -3995,7 +3995,8 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
          if (!noconvert)
            arg = default_conversion (arg);
        }
-      else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM,
+      else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM
+                                                  | WANT_VECTOR,
                                                   arg, true)))
        errstring = "wrong type argument to bit-complement";
       else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
index 3393c8ed9b187934b5c0591e4376bbb620b5c80c..99e57c7ac70402188ea8ef529aaab1ae722b6c54 100644 (file)
@@ -1,3 +1,8 @@
+2006-11-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/29734
+       * g++.dg/conversion/simd4.C: New test.
+
 2006-11-20  Simon Martin  <simartin@users.sourceforge.net>
 
        PR c++/29475
diff --git a/gcc/testsuite/g++.dg/conversion/simd4.C b/gcc/testsuite/g++.dg/conversion/simd4.C
new file mode 100644 (file)
index 0000000..f8f7f2e
--- /dev/null
@@ -0,0 +1,34 @@
+// PR c++/29734
+// { dg-do compile }
+// { dg-options "" }
+
+int t;
+float u;
+int __attribute__((vector_size (8))) v;
+float __attribute__((vector_size (8))) w;
+int b[10];
+
+void
+foo ()
+{
+  b[t];
+  b[u];                // { dg-error "invalid types" }
+  b[v];                // { dg-error "invalid types" }
+  b[w];                // { dg-error "invalid types" }
+  t[b];
+  u[b];                // { dg-error "invalid types" }
+  v[b];                // { dg-error "invalid types" }
+  w[b];                // { dg-error "invalid types" }
+  new int[t];
+  new int[u];  // { dg-error "new-declarator must have integral" }
+  new int[v];  // { dg-error "new-declarator must have integral" }
+  new int[w];  // { dg-error "new-declarator must have integral" }
+  switch (t) { default: break; }
+  switch (u) { default: break; }       // { dg-error "switch quantity not an integer" }
+  switch (v) { default: break; }       // { dg-error "switch quantity not an integer" }
+  switch (w) { default: break; }       // { dg-error "switch quantity not an integer" }
+  t = ~t;
+  u = ~u;      // { dg-error "wrong type argument to bit-complement" }
+  v = ~v;
+  w = ~w;      // { dg-error "wrong type argument to bit-complement" }
+}