]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix crash with aliased array and if expression
authorRonan Desplanques <desplanques@adacore.com>
Fri, 23 Feb 2024 08:53:32 +0000 (09:53 +0100)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 21 May 2024 07:27:56 +0000 (09:27 +0200)
The way if expressions were translated led the gimplifying phase
to attempt to create a temporary of a variable-sized type in some
cases. This patch fixes this by adding an address indirection layer
in those cases.

gcc/ada/

* gcc-interface/utils2.cc (build_cond_expr): Also apply an
indirection when the result type is variable-sized.

gcc/ada/gcc-interface/utils2.cc

index 64712cb9962be4a48e2744d29ac528f1f1acd9a9..161f0f11e5c7b8ef8fc1ae38283632b4729e72b5 100644 (file)
@@ -1711,11 +1711,13 @@ build_cond_expr (tree result_type, tree condition_operand,
   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 the result.  Likewise if the result type is passed by
-     reference, because creating a temporary of this type is not allowed.  */
+  /* If the result type is unconstrained or variable-sized, 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
       || type_contains_placeholder_p (result_type)
+      || !TREE_CONSTANT (TYPE_SIZE (result_type))
       || TYPE_IS_BY_REFERENCE_P (result_type))
     {
       result_type = build_pointer_type (result_type);