https://gcc.gnu.org/g:a687d5da7015042fa7ff047430e3c5cb57524a7c
commit r15-742-ga687d5da7015042fa7ff047430e3c5cb57524a7c Author: Ronan Desplanques <desplanq...@adacore.com> Date: Fri Feb 23 09:53:32 2024 +0100 ada: Fix crash with aliased array and if expression 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. Diff: --- gcc/ada/gcc-interface/utils2.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gcc/ada/gcc-interface/utils2.cc b/gcc/ada/gcc-interface/utils2.cc index 64712cb9962..161f0f11e5c 100644 --- a/gcc/ada/gcc-interface/utils2.cc +++ b/gcc/ada/gcc-interface/utils2.cc @@ -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);