From f8c3ec86492d2a6f445e138b105e31c07f806f65 Mon Sep 17 00:00:00 2001 From: Josef Zlomek Date: Mon, 28 Jun 2004 10:03:47 +0200 Subject: [PATCH] re PR c/15549 (true !< 'a') PR c/15549 Backport from mainline 2003-08-19 Mark Mitchell PR c++/11946 * convert.c (convert_to_integer): Use CONVERT_EXPR (instead of NOP_EXPR) when necessary. PR c/15549 Backport from mainline 2003-08-19 Mark Mitchell PR c++/11946.C * gcc.dg/c99-bool-1.c: Remove bogus warning. From-SVN: r83765 --- gcc/ChangeLog | 10 ++++++++++ gcc/convert.c | 22 +++++++++++++++++++++- gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/gcc.dg/c99-bool-1.c | 4 +--- 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c801706698f..d6a49f1543c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2004-06-28 Josef Zlomek + + PR c/15549 + Backport from mainline + 2003-08-19 Mark Mitchell + + PR c++/11946 + * convert.c (convert_to_integer): Use CONVERT_EXPR (instead of + NOP_EXPR) when necessary. + 2004-06-17 Ian Lance Taylor PR middle-end/16038 diff --git a/gcc/convert.c b/gcc/convert.c index e440e35f5757..aa0d0fb41406 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -182,7 +182,27 @@ convert_to_integer (type, expr) we are truncating EXPR. */ else if (outprec >= inprec) - return build1 (NOP_EXPR, type, expr); + { + enum tree_code code; + + /* If the precision of the EXPR's type is K bits and the + destination mode has more bits, and the sign is changing, + it is not safe to use a NOP_EXPR. For example, suppose + that EXPR's type is a 3-bit unsigned integer type, the + TYPE is a 3-bit signed integer type, and the machine mode + for the types is 8-bit QImode. In that case, the + conversion necessitates an explicit sign-extension. In + the signed-to-unsigned case the high-order bits have to + be cleared. */ + if (TREE_UNSIGNED (type) != TREE_UNSIGNED (TREE_TYPE (expr)) + && (TYPE_PRECISION (TREE_TYPE (expr)) + != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr))))) + code = CONVERT_EXPR; + else + code = NOP_EXPR; + + return build1 (code, type, expr); + } /* If TYPE is an enumeral type or a type with a precision less than the number of bits in its mode, do the conversion to the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 051e1ff2d07b..da385606296a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2004-06-28 Josef Zlomek + + PR c/15549 + Backport from mainline + 2003-08-19 Mark Mitchell + + PR c++/11946.C + * gcc.dg/c99-bool-1.c: Remove bogus warning. + 2004-05-31 Release Manager * GCC 3.3.4 Released. diff --git a/gcc/testsuite/gcc.dg/c99-bool-1.c b/gcc/testsuite/gcc.dg/c99-bool-1.c index 1037eb55173a..710219620b7e 100644 --- a/gcc/testsuite/gcc.dg/c99-bool-1.c +++ b/gcc/testsuite/gcc.dg/c99-bool-1.c @@ -228,9 +228,7 @@ main (void) abort (); if ((u |= 2) != 1) abort (); - /* ??? A bit queer, since this gets optimized to ((u = (u != 3)) != 1) - early in semantic analysis, which then yields the warning below. */ - if ((u ^= 3) != 1) /* { dg-warning "always true due to limited range" } */ + if ((u ^= 3) != 1) abort (); /* Test comma expressions. */ u = 1; -- 2.47.2