aboutsummaryrefslogtreecommitdiff
path: root/gcc/convert.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-07-17 12:54:50 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-07-17 12:54:50 -0400
commit1c013b45fd7b60e956c9e8bb1f1c6733e12c5907 (patch)
treea8cd1f18cfbdc7fa335dc96d2fbd361c959f438a /gcc/convert.c
parentb83b72a6fa53139ea1e2a39186c108925d66be6c (diff)
downloadgcc-1c013b45fd7b60e956c9e8bb1f1c6733e12c5907.zip
gcc-1c013b45fd7b60e956c9e8bb1f1c6733e12c5907.tar.gz
gcc-1c013b45fd7b60e956c9e8bb1f1c6733e12c5907.tar.bz2
(convert_to_integer): If TYPE is a enumeral type or if its precision is not the same as the size of its mode...
(convert_to_integer): If TYPE is a enumeral type or if its precision is not the same as the size of its mode, convert in two steps. From-SVN: r10140
Diffstat (limited to 'gcc/convert.c')
-rw-r--r--gcc/convert.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/convert.c b/gcc/convert.c
index e7b5df0..17e7552 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -1,5 +1,5 @@
/* Utility routines for data type conversion for GNU C.
- Copyright (C) 1987, 1988, 1991, 1992, 1994 Free Software Foundation, Inc.
+ Copyright (C) 1987, 88, 91, 92, 94, 1995 Free Software Foundation, Inc.
This file is part of GNU C.
@@ -171,6 +171,17 @@ convert_to_integer (type, expr)
else if (outprec >= inprec)
return build1 (NOP_EXPR, 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
+ type corresponding to its mode, then do a nop conversion
+ to TYPE. */
+ else if (TREE_CODE (type) == ENUMERAL_TYPE
+ || outprec != GET_MODE_BITSIZE (TYPE_MODE (type)))
+ return build1 (NOP_EXPR, type,
+ convert (type_for_mode (TYPE_MODE (type),
+ TREE_UNSIGNED (type)),
+ expr));
+
/* Here detect when we can distribute the truncation down past some
arithmetic. For example, if adding two longs and converting to an
int, we can equally well convert both to ints and then add.