https://gcc.gnu.org/g:e49eac82e805ede5dd9b3c5d4ae9f8d90b0cc034

commit r15-739-ge49eac82e805ede5dd9b3c5d4ae9f8d90b0cc034
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Tue Feb 6 12:57:38 2024 +0100

    ada: Avoid temporary for conditional expression of discriminated record type
    
    This just aligns the definite case (discriminants with default) with the
    indefinite case (discriminants without default), the latter case having
    been properly handled for long.  In the former case, the maximum size is
    used so a temporary can be much larger than the actual data it contains.
    
    gcc/ada/
    
            * gcc-interface/utils2.cc (build_cond_expr): Use the indirect path
            for all types containing a placeholder.

Diff:
---
 gcc/ada/gcc-interface/utils2.cc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gcc/ada/gcc-interface/utils2.cc b/gcc/ada/gcc-interface/utils2.cc
index a953b070ed8..fb0ccf59224 100644
--- a/gcc/ada/gcc-interface/utils2.cc
+++ b/gcc/ada/gcc-interface/utils2.cc
@@ -1715,8 +1715,8 @@ build_cond_expr (tree result_type, tree condition_operand,
      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
-      || TYPE_IS_BY_REFERENCE_P (result_type)
-      || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type)))
+      || type_contains_placeholder_p (result_type)
+      || TYPE_IS_BY_REFERENCE_P (result_type))
     {
       result_type = build_pointer_type (result_type);
       true_operand = build_unary_op (ADDR_EXPR, result_type, true_operand);

Reply via email to