aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/gcc-interface/utils.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 013fccd..1d49db9 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -4930,10 +4930,6 @@ convert (tree type, tree expr)
convert (TREE_TYPE (type),
TYPE_MIN_VALUE (type))));
- /* ... fall through ... */
-
- case ENUMERAL_TYPE:
- case BOOLEAN_TYPE:
/* If we are converting an additive expression to an integer type
with lower precision, be wary of the optimization that can be
applied by convert_to_integer. There are 2 problematic cases:
@@ -4945,8 +4941,7 @@ convert (tree type, tree expr)
intermediate conversion that changes the sign could
be inserted and thus introduce an artificial overflow
at compile time when the placeholder is substituted. */
- if (code == INTEGER_TYPE
- && ecode == INTEGER_TYPE
+ if (ecode == INTEGER_TYPE
&& TYPE_PRECISION (type) < TYPE_PRECISION (etype)
&& (TREE_CODE (expr) == PLUS_EXPR || TREE_CODE (expr) == MINUS_EXPR))
{
@@ -4955,11 +4950,18 @@ convert (tree type, tree expr)
if ((TREE_CODE (TREE_TYPE (op0)) == INTEGER_TYPE
&& TYPE_BIASED_REPRESENTATION_P (TREE_TYPE (op0)))
|| CONTAINS_PLACEHOLDER_P (expr))
- return build1 (NOP_EXPR, type, expr);
+ return fold_convert (type, expr);
}
+ /* ... fall through ... */
+
+ case ENUMERAL_TYPE:
return fold (convert_to_integer (type, expr));
+ case BOOLEAN_TYPE:
+ /* Do not use convert_to_integer with boolean types. */
+ return fold_convert_loc (EXPR_LOCATION (expr), type, expr);
+
case POINTER_TYPE:
case REFERENCE_TYPE:
/* If converting between two thin pointers, adjust if needed to account