aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/utils2.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-05-05 16:22:16 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-05-05 16:22:16 +0000
commit805e60a08685ba76925f557137adf836f3b4a751 (patch)
tree9e62d25cb4781804834463a8fd123bbf1c17f2bf /gcc/ada/gcc-interface/utils2.c
parent4eec64ff1d3b88cce8af5fe81787fd7e2e1cb371 (diff)
downloadgcc-805e60a08685ba76925f557137adf836f3b4a751.zip
gcc-805e60a08685ba76925f557137adf836f3b4a751.tar.gz
gcc-805e60a08685ba76925f557137adf836f3b4a751.tar.bz2
re PR ada/48844 (ICE on assignment of aggregate with discriminated record type)
PR ada/48844 * gcc-interface/gigi.h (get_variant_part): Declare. * gcc-interface/decl.c (get_variant_part): Make global. * gcc-interface/utils2.c (find_common_type): Do not return T1 if the types have the same constant size, are record types and T1 has a variant part while T2 doesn't. From-SVN: r173442
Diffstat (limited to 'gcc/ada/gcc-interface/utils2.c')
-rw-r--r--gcc/ada/gcc-interface/utils2.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c
index 240d345..db19032 100644
--- a/gcc/ada/gcc-interface/utils2.c
+++ b/gcc/ada/gcc-interface/utils2.c
@@ -193,15 +193,21 @@ find_common_type (tree t1, tree t2)
calling into build_binary_op), some others are really expected and we
have to be careful. */
- /* We must prevent writing more than what the target may hold if this is for
+ /* We must avoid writing more than what the target can hold if this is for
an assignment and the case of tagged types is handled in build_binary_op
- so use the lhs type if it is known to be smaller, or of constant size and
- the rhs type is not, whatever the modes. We also force t1 in case of
+ so we use the lhs type if it is known to be smaller or of constant size
+ and the rhs type is not, whatever the modes. We also force t1 in case of
constant size equality to minimize occurrences of view conversions on the
- lhs of assignments. */
+ lhs of an assignment, except for the case of record types with a variant
+ part on the lhs but not on the rhs to make the conversion simpler. */
if (TREE_CONSTANT (TYPE_SIZE (t1))
&& (!TREE_CONSTANT (TYPE_SIZE (t2))
- || !tree_int_cst_lt (TYPE_SIZE (t2), TYPE_SIZE (t1))))
+ || tree_int_cst_lt (TYPE_SIZE (t1), TYPE_SIZE (t2))
+ || (TYPE_SIZE (t1) == TYPE_SIZE (t2)
+ && !(TREE_CODE (t1) == RECORD_TYPE
+ && TREE_CODE (t2) == RECORD_TYPE
+ && get_variant_part (t1) != NULL_TREE
+ && get_variant_part (t2) == NULL_TREE))))
return t1;
/* Otherwise, if the lhs type is non-BLKmode, use it. Note that we know