diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-11-04 20:51:38 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-11-04 20:51:38 +0000 |
commit | 895b662f213e8f3adc92e6875ac2f151a2ad16c9 (patch) | |
tree | 595aa91c7fc54a4edf2a2e8e3b8c3e8535c53bff /gcc/c-common.c | |
parent | e9b9a7d681900974022221d73ee098a7987d39eb (diff) | |
download | gcc-895b662f213e8f3adc92e6875ac2f151a2ad16c9.tar.gz |
PR c/35430
* c-common.c (warn_for_sign_compare): For complex result_type
use component's type.
* gcc.dg/pr35430.c: New test.
* g++.dg/warn/Wsign-compare-2.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141587 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r-- | gcc/c-common.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/gcc/c-common.c b/gcc/c-common.c index 3a97bd7aaf5..ea7379edc5c 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -8241,7 +8241,7 @@ warn_for_sign_compare (location_t location, && TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0)) - != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1))) + != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1))) { warning_at (location, OPT_Wsign_compare, "comparison between types %qT and %qT", @@ -8258,9 +8258,9 @@ warn_for_sign_compare (location_t location, /* OK */; else { - tree sop, uop; + tree sop, uop, base_type; bool ovf; - + if (op0_signed) sop = orig_op0, uop = orig_op1; else @@ -8268,6 +8268,8 @@ warn_for_sign_compare (location_t location, STRIP_TYPE_NOPS (sop); STRIP_TYPE_NOPS (uop); + base_type = (TREE_CODE (result_type) == COMPLEX_TYPE + ? TREE_TYPE (result_type) : result_type); /* Do not warn if the signed quantity is an unsuffixed integer literal (or some static constant expression involving such @@ -8280,7 +8282,7 @@ warn_for_sign_compare (location_t location, in the result if the result were signed. */ else if (TREE_CODE (uop) == INTEGER_CST && (resultcode == EQ_EXPR || resultcode == NE_EXPR) - && int_fits_type_p (uop, c_common_signed_type (result_type))) + && int_fits_type_p (uop, c_common_signed_type (base_type))) /* OK */; /* In C, do not warn if the unsigned quantity is an enumeration constant and its maximum value would fit in the result if the @@ -8288,7 +8290,7 @@ warn_for_sign_compare (location_t location, else if (!c_dialect_cxx() && TREE_CODE (uop) == INTEGER_CST && 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 (base_type))) /* OK */; else warning_at (location, |