This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Fix latent problem with conditional expressions
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 11 Apr 2010 13:23:37 +0200
- Subject: [Ada] Fix latent problem with conditional expressions
This makes sure that gigi doesn't make a copy for a by-reference type when it
generates a conditional expression. No visible effect for the time being as
the front-end proper already does an equivalent thing.
Tested on i586-suse-linux, applied on the mainline.
2010-04-11 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils2.c (build_cond_expr): Take the address and
dereference if the result type is passed by reference.
--
Eric Botcazou
Index: gcc-interface/utils2.c
===================================================================
--- gcc-interface/utils2.c (revision 158159)
+++ gcc-interface/utils2.c (working copy)
@@ -1291,10 +1291,12 @@ build_cond_expr (tree result_type, tree
true_operand = convert (result_type, true_operand);
false_operand = convert (result_type, false_operand);
- /* If the result type is unconstrained, take the address of the operands
- and then dereference our result. */
+ /* If the result type is unconstrained, take the address of the operands and
+ then dereference the result. Likewise if the result type is passed by
+ reference because creating a temporary of this type is not allowed. */
if (TREE_CODE (result_type) == UNCONSTRAINED_ARRAY_TYPE
- || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type)))
+ || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type))
+ || (AGGREGATE_TYPE_P (result_type) && TYPE_BY_REFERENCE_P (result_type)))
{
result_type = build_pointer_type (result_type);
true_operand = build_unary_op (ADDR_EXPR, result_type, true_operand);