OSDN Git Service

PR c++/30022
authorreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Dec 2006 21:35:25 +0000 (21:35 +0000)
committerreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Dec 2006 21:35:25 +0000 (21:35 +0000)
* typeck.c (type_after_usual_arithmetic_conversions):
Fix assertion for vector types.
(build_binary_op): Use temporary for inner type of vector types.

* g++.dg/ext/vector5.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector5.C [new file with mode: 0644]

index edcb388..1ecb96d 100644 (file)
@@ -1,3 +1,10 @@
+2006-12-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/30022
+       * typeck.c (type_after_usual_arithmetic_conversions):
+       Fix assertion for vector types.
+       (build_binary_op): Use temporary for inner type of vector types.
+
 2006-12-01  Ryan Mansfield  <rmansfield@qnx.com>
 
         PR c++/29066
 2006-12-01  Ryan Mansfield  <rmansfield@qnx.com>
 
         PR c++/29066
index c5c9f38..1acd1ff 100644 (file)
@@ -262,7 +262,7 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
              || TREE_CODE (t1) == ENUMERAL_TYPE);
   gcc_assert (ARITHMETIC_TYPE_P (t2)
              || TREE_CODE (t2) == COMPLEX_TYPE
              || TREE_CODE (t1) == ENUMERAL_TYPE);
   gcc_assert (ARITHMETIC_TYPE_P (t2)
              || TREE_CODE (t2) == COMPLEX_TYPE
-             || TREE_CODE (t1) == VECTOR_TYPE
+             || TREE_CODE (t2) == VECTOR_TYPE
              || TREE_CODE (t2) == ENUMERAL_TYPE);
 
   /* In what follows, we slightly generalize the rules given in [expr] so
              || TREE_CODE (t2) == ENUMERAL_TYPE);
 
   /* In what follows, we slightly generalize the rules given in [expr] so
@@ -3093,17 +3093,19 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
          && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
              || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
        {
          && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
              || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
        {
+         enum tree_code tcode0 = code0, tcode1 = code1;
+
          if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
            warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0%>", op0);
          else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
            warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0.%>", op0);
 
          if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
            warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0%>", op0);
          else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
            warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0.%>", op0);
 
-         if (code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
-           code0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
-         if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
-           code1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
+         if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
+           tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
+         if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
+           tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
 
 
-         if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
+         if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
            resultcode = RDIV_EXPR;
          else
            /* When dividing two signed integers, we have to promote to int.
            resultcode = RDIV_EXPR;
          else
            /* When dividing two signed integers, we have to promote to int.
index 31f6ea6..df43234 100644 (file)
@@ -1,5 +1,8 @@
 2006-12-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 2006-12-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
+       PR c++/30022
+       * g++.dg/ext/vector5.C: New test.
+
        PR c++/30021
        * g++.dg/other/main1.C: New test.
 
        PR c++/30021
        * g++.dg/other/main1.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/ext/vector5.C b/gcc/testsuite/g++.dg/ext/vector5.C
new file mode 100644 (file)
index 0000000..e5304bc
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/30022
+// { dg-do compile }
+
+void foo()
+{
+  int __attribute__((vector_size(8))) v;
+  v = 1/v;  // { dg-error "invalid operands of types" }
+}