From: Richard Sandiford Date: Thu, 28 Jul 2005 08:08:25 +0000 (+0000) Subject: re PR c/22589 (ICE casting to long long) X-Git-Tag: releases/gcc-3.4.5~304 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b495ab5a85882204b1f8857bc938e15c2fe58af8;p=thirdparty%2Fgcc.git re PR c/22589 (ICE casting to long long) PR c/22589 Backport from mainline: 2004-06-16 Alexandre Oliva * tree.c (get_narrower): Don't narrow integral types into non-integral types. From-SVN: r102471 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 72fba35bca14..ec9f065d9b21 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-07-28 Richard Sandiford + + PR c/22589 + Backport from mainline: + + 2004-06-16 Alexandre Oliva + * tree.c (get_narrower): Don't narrow integral types into + non-integral types. + 2005-07-26 Bernardo Innocenti Backport from mainline: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7233b8c65a98..db8235038775 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-07-28 Richard Sandiford + + PR c/22589 + * gcc.c-torture/compile/pr22589.c: New test. + 2005-07-25 Giovanni Bajo PR c++/19208 diff --git a/gcc/tree.c b/gcc/tree.c index 1d1a8e375ddf..aa5c35842bb6 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -4156,6 +4156,7 @@ get_narrower (tree op, int *unsignedp_ptr) int uns = 0; int first = 1; tree win = op; + bool integral_p = INTEGRAL_TYPE_P (TREE_TYPE (op)); while (TREE_CODE (op) == NOP_EXPR) { @@ -4192,6 +4193,10 @@ get_narrower (tree op, int *unsignedp_ptr) uns = TREE_UNSIGNED (TREE_TYPE (op)); first = 0; op = TREE_OPERAND (op, 0); + /* Keep trying to narrow, but don't assign op to win if it + would turn an integral type into something else. */ + if (INTEGRAL_TYPE_P (TREE_TYPE (op)) != integral_p) + continue; } win = op;