OSDN Git Service

PR c++/29734
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Nov 2006 09:41:27 +0000 (09:41 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Nov 2006 09:41:27 +0000 (09:41 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119044 138bc75d-0d04-0410-961f-82ee72b054a4

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 5d0dd5c..295ed76 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 d7e523b..43e6e29 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 6f61218..f09f708 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 c257f00..4146bf0 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 3393c8e..99e57c7 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" }
+}