From fe9e434a5d8b24ca8a10e29ccbd0a25ff059a40b Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Fri, 1 Dec 2006 22:32:00 +0000 Subject: [PATCH] re PR c++/30022 (ICE on vector operand in division) 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: r119420 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/typeck.c | 16 +++++++++------- gcc/testsuite/ChangeLog | 7 ++++++- gcc/testsuite/g++.dg/ext/vector5.C | 8 ++++++++ 4 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/vector5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eb53b785c34a..25363ad048d4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2006-12-01 Volker Reichelt + + 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-10-11 Andrew Pinski PR c++/28302 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 38e542b4964c..cc3d57bae2aa 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -274,7 +274,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 @@ -2901,17 +2901,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 ("division by zero in %<%E / 0%>", op0); else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1)) warning ("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 (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)) + 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 (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE)) resultcode = RDIV_EXPR; else /* When dividing two signed integers, we have to promote to int. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4f891090b112..d18693da0703 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ +2006-12-01 Volker Reichelt + + PR c++/30022 + * g++.dg/ext/vector5.C: New test. + 2006-11-02 Zdenek Dvorak - * gcc++.dg/tree-ssa/pr27891.c: New test. + * g++.dg/tree-ssa/pr27891.c: New test. 2006-11-01 Kaveh R. Ghazi diff --git a/gcc/testsuite/g++.dg/ext/vector5.C b/gcc/testsuite/g++.dg/ext/vector5.C new file mode 100644 index 000000000000..e5304bcb12de --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector5.C @@ -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" } +} -- 2.47.2