https://gcc.gnu.org/g:c00ed72920735a228b0380b59c1ae13ce86d881b
commit r16-5654-gc00ed72920735a228b0380b59c1ae13ce86d881b Author: Eric Botcazou <[email protected]> Date: Thu Nov 13 21:12:54 2025 +0100 ada: Fix fallout of recent finalization fix for limited types The recent finalization fix made for limited types has uncovered cases where the object returned by calls to build-in-place functions was not finalized in selected anonymous contexts, most notably the dependent expressions of conditional expressions. The specific finalization machinery that handles conditional expressions requires the temporaries built for their dependent expressions to be visible as early as possible, and this was not the case. gcc/ada/ChangeLog: * exp_ch4.adb (Expand_N_Case_Expression): When not optimizing for a specific context, call Make_Build_In_Place_Call_In_Anonymous_Context on expressions of alternatives when they are calls to BIP functions. (Expand_N_If_Expression): Likewise for the Then & Else expressions. Diff: --- gcc/ada/exp_ch4.adb | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 7c90aa0d1b8e..520ab683a6e2 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -5368,7 +5368,17 @@ package body Exp_Ch4 is -- When the alternative's expression involves controlled function -- calls, generated temporaries are chained on the corresponding -- list of actions. These temporaries need to be finalized after - -- the case expression is evaluated. + -- the case expression is evaluated. We first need to make them + -- explicit for build-in-place functions in anonymous contexts, + -- because calls to these do not go through Expand_Ctrl_Actions. + + if Is_Build_In_Place_Function_Call (Expression (Alt)) + and then not Optimize_Assignment_Stmt + and then not Optimize_Return_Stmt + and then not Optimize_Object_Decl + then + Make_Build_In_Place_Call_In_Anonymous_Context (Expression (Alt)); + end if; Process_Transients_In_Expression (N, Actions (Alt)); @@ -6345,7 +6355,17 @@ package body Exp_Ch4 is -- When the "then" or "else" expressions involve controlled function -- calls, generated temporaries are chained on the corresponding list -- of actions. These temporaries need to be finalized after the if - -- expression is evaluated. + -- expression is evaluated. We first need to make them explicit for + -- build-in-place functions in anonymous contexts, because calls to + -- these do not go through Expand_Ctrl_Actions. + + if Is_Build_In_Place_Function_Call (Thenx) then + Make_Build_In_Place_Call_In_Anonymous_Context (Thenx); + end if; + + if Is_Build_In_Place_Function_Call (Elsex) then + Make_Build_In_Place_Call_In_Anonymous_Context (Elsex); + end if; Process_Transients_In_Expression (N, Then_Actions (N)); Process_Transients_In_Expression (N, Else_Actions (N));
