diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-03-13 21:16:38 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-03-13 21:16:38 -0500 |
commit | c9529354a0185752c9f9b688da560c178f6e7df0 (patch) | |
tree | 15921bcd2f67062eed44668b46339c56c3eba8af /gcc/convert.c | |
parent | 2e15b172de724f57679d6cf2acba6b366bc4c7dd (diff) | |
download | gcc-c9529354a0185752c9f9b688da560c178f6e7df0.tar.gz |
(convert_to_integer): When changing type of truthvalue operation,
change types of inputs too.
From-SVN: r6771
Diffstat (limited to 'gcc/convert.c')
-rw-r--r-- | gcc/convert.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/gcc/convert.c b/gcc/convert.c index 032bb516899..0060b60e37c 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 Free Software Foundation, Inc. + Copyright (C) 1987, 1988, 1991, 1992, 1994 Free Software Foundation, Inc. This file is part of GNU C. @@ -143,16 +143,30 @@ convert_to_integer (type, expr) /* If we are widening the type, put in an explicit conversion. Similarly if we are not changing the width. However, if this is a logical operation that just returns 0 or 1, we can change the - type of the expression (see below). */ + type of the expression. For logical operations, we must + also change the types of the operands to maintain type + correctness. */ - if (TREE_CODE_CLASS (ex_form) == '<' - || ex_form == TRUTH_AND_EXPR || ex_form == TRUTH_ANDIF_EXPR - || ex_form == TRUTH_OR_EXPR || ex_form == TRUTH_ORIF_EXPR - || ex_form == TRUTH_XOR_EXPR || ex_form == TRUTH_NOT_EXPR) + if (TREE_CODE_CLASS (ex_form) == '<') { TREE_TYPE (expr) = type; return expr; } + else if (ex_form == TRUTH_AND_EXPR || ex_form == TRUTH_ANDIF_EXPR + || ex_form == TRUTH_OR_EXPR || ex_form == TRUTH_ORIF_EXPR + || ex_form == TRUTH_XOR_EXPR) + { + TREE_OPERAND (expr, 0) = convert (type, TREE_OPERAND (expr, 0)); + TREE_OPERAND (expr, 1) = convert (type, TREE_OPERAND (expr, 1)); + TREE_TYPE (expr) = type; + return expr; + } + else if (ex_form == TRUTH_NOT_EXPR) + { + TREE_OPERAND (expr, 0) = convert (type, TREE_OPERAND (expr, 0)); + TREE_TYPE (expr) = type; + return expr; + } else if (outprec >= inprec) return build1 (NOP_EXPR, type, expr); |