]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/30022 (ICE on vector operand in division)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Fri, 1 Dec 2006 21:35:25 +0000 (21:35 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Fri, 1 Dec 2006 21:35:25 +0000 (21:35 +0000)
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.

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

From-SVN: r119416

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

index edcb3880e6810bdeed97ed60c0a0483510aee262..1ecb96d1542dabd44be6b5659b01bb567a5fe087 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
index c5c9f38bbb94e4d5c511247aecff4c44e20df135..1acd1ffdecfd0554d666e1c6dc4107866319dd08 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) == VECTOR_TYPE
+             || TREE_CODE (t2) == VECTOR_TYPE
              || 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))
        {
+         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 (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.
index 31f6ea6d6a68619cec302d9d31cae7629b11f7a5..df43234265c374f1a740d4e6dc5064544f9cfb5c 100644 (file)
@@ -1,5 +1,8 @@
 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.
 
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" }
+}