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: r119416
This commit is contained in:
parent
d8e1d61976
commit
01c15146e4
4 changed files with 26 additions and 6 deletions
|
@ -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>
|
2006-12-01 Ryan Mansfield <rmansfield@qnx.com>
|
||||||
|
|
||||||
PR c++/29066
|
PR c++/29066
|
||||||
|
|
|
@ -262,7 +262,7 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
|
||||||
|| TREE_CODE (t1) == ENUMERAL_TYPE);
|
|| TREE_CODE (t1) == ENUMERAL_TYPE);
|
||||||
gcc_assert (ARITHMETIC_TYPE_P (t2)
|
gcc_assert (ARITHMETIC_TYPE_P (t2)
|
||||||
|| TREE_CODE (t2) == COMPLEX_TYPE
|
|| TREE_CODE (t2) == COMPLEX_TYPE
|
||||||
|| TREE_CODE (t1) == VECTOR_TYPE
|
|| TREE_CODE (t2) == VECTOR_TYPE
|
||||||
|| TREE_CODE (t2) == ENUMERAL_TYPE);
|
|| TREE_CODE (t2) == ENUMERAL_TYPE);
|
||||||
|
|
||||||
/* In what follows, we slightly generalize the rules given in [expr] so
|
/* 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 == INTEGER_TYPE || code1 == REAL_TYPE
|
||||||
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
|
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
|
||||||
{
|
{
|
||||||
|
enum tree_code tcode0 = code0, tcode1 = code1;
|
||||||
|
|
||||||
if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
|
if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
|
||||||
warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0%>", op0);
|
warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0%>", op0);
|
||||||
else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
|
else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
|
||||||
warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0.%>", op0);
|
warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0.%>", op0);
|
||||||
|
|
||||||
if (code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
|
if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
|
||||||
code0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
|
tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
|
||||||
if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
|
if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
|
||||||
code1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
|
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;
|
resultcode = RDIV_EXPR;
|
||||||
else
|
else
|
||||||
/* When dividing two signed integers, we have to promote to int.
|
/* When dividing two signed integers, we have to promote to int.
|
||||||
|
|
|
@ -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
|
PR c++/30021
|
||||||
* g++.dg/other/main1.C: New test.
|
* g++.dg/other/main1.C: New test.
|
||||||
|
|
||||||
|
|
8
gcc/testsuite/g++.dg/ext/vector5.C
Normal file
8
gcc/testsuite/g++.dg/ext/vector5.C
Normal file
|
@ -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" }
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue