This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]