This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/35430] [4.1/4.2/4.3/4.4 regression] ICE with complex arithmetic
- From: "pinskia at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 29 Mar 2008 19:44:12 -0000
- Subject: [Bug c/35430] [4.1/4.2/4.3/4.4 regression] ICE with complex arithmetic
- References: <bug-35430-1771@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #3 from pinskia at gcc dot gnu dot org 2008-03-29 19:44 -------
This is the patch which I am testing:
Index: cp/typeck.c
===================================================================
--- cp/typeck.c (revision 133711)
+++ cp/typeck.c (working copy)
@@ -3917,6 +3917,10 @@ cp_build_binary_op (enum tree_code code,
int unsignedp0, unsignedp1;
tree primop0 = get_narrower (op0, &unsignedp0);
tree primop1 = get_narrower (op1, &unsignedp1);
+ tree undertype = result_type;
+
+ if (TREE_CODE (undertype) == COMPLEX_TYPE)
+ undertype = TREE_TYPE (undertype);
/* Check for comparison of different enum types. */
if (TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
@@ -3937,7 +3941,7 @@ cp_build_binary_op (enum tree_code code,
/* Do not warn if the comparison is being done in a signed type,
since the signed type will only be chosen if it can represent
all the values of the unsigned type. */
- if (!TYPE_UNSIGNED (result_type))
+ if (!TYPE_UNSIGNED (undertype))
/* OK */;
/* Do not warn if both operands are unsigned. */
else if (op0_signed == op1_signed)
@@ -3955,10 +3959,10 @@ cp_build_binary_op (enum tree_code code,
else if ((resultcode == EQ_EXPR || resultcode == NE_EXPR)
&& ((op0_signed && TREE_CODE (orig_op1) == INTEGER_CST
&& int_fits_type_p (orig_op1, c_common_signed_type
- (result_type)))
+ (undertype)))
|| (op1_signed && TREE_CODE (orig_op0) == INTEGER_CST
&& int_fits_type_p (orig_op0, c_common_signed_type
- (result_type)))))
+ (undertype)))))
/* OK */;
else if (complain & tf_warning)
warning (OPT_Wsign_compare,
Index: c-typeck.c
===================================================================
--- c-typeck.c (revision 133711)
+++ c-typeck.c (working copy)
@@ -8483,6 +8483,9 @@ build_binary_op (enum tree_code code, tr
{
tree sop, uop;
bool ovf;
+ tree undertype = result_type;
+ if (TREE_CODE (undertype) == COMPLEX_TYPE)
+ undertype = TREE_TYPE (undertype);
if (op0_signed)
sop = xop0, uop = xop1;
@@ -8502,7 +8505,7 @@ build_binary_op (enum tree_code code, tr
else if (TREE_CODE (uop) == INTEGER_CST
&& (resultcode == EQ_EXPR || resultcode == NE_EXPR)
&& int_fits_type_p
- (uop, c_common_signed_type (result_type)))
+ (uop, c_common_signed_type (undertype)))
/* OK */;
/* Do not warn if the unsigned quantity is an enumeration
constant and its maximum value would fit in the result
@@ -8511,7 +8514,7 @@ build_binary_op (enum tree_code code, tr
&& TREE_CODE (TREE_TYPE (uop)) == ENUMERAL_TYPE
&& int_fits_type_p
(TYPE_MAX_VALUE (TREE_TYPE (uop)),
- c_common_signed_type (result_type)))
+ c_common_signed_type (undertype)))
/* OK */;
else
warning (OPT_Wsign_compare, "comparison between signed and
unsigned");
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35430