https://gcc.gnu.org/g:503b879d97f08f842afd09f1d29cb03dfab55d8b
commit r17-745-g503b879d97f08f842afd09f1d29cb03dfab55d8b Author: Eric Botcazou <[email protected]> Date: Sun Jan 18 22:12:25 2026 +0100 ada: Fix fallout of recent freezing change for expression functions The change unnecessarily prevents the profile of all dispatching operations from being frozen by their subprogram body, which exposes a weakness in the implementation of freezing for generic units. This just reverts that part. gcc/ada/ChangeLog: PR ada/93702 * exp_ch3.adb (Make_Controlling_Function_Wrappers): Revert latest change. * sem_ch12.adb (Analyze_One_Association): Remove redundant line. * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Freeze the profile again for bodies that are not generated from expression functions. Diff: --- gcc/ada/exp_ch3.adb | 6 +++++- gcc/ada/sem_ch12.adb | 1 - gcc/ada/sem_ch6.adb | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index d1956c1a1bee..1b7b4aae653c 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -11683,7 +11683,10 @@ package body Exp_Ch3 is Null_Record_Present => True); -- GNATprove will use expression of an expression function as an - -- implicit postcondition. + -- implicit postcondition. GNAT will also benefit from expression + -- function to avoid premature freezing, but would struggle if we + -- added an expression function to freezing actions, so we create + -- the expanded form directly. if GNATprove_Mode then Func_Body := @@ -11702,6 +11705,7 @@ package body Exp_Ch3 is Statements => New_List ( Make_Simple_Return_Statement (Loc, Expression => Ext_Aggr)))); + Set_Was_Expression_Function (Func_Body); end if; Append_To (Body_List, Func_Body); diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index 402aa2164270..e25d9c67fceb 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -2455,7 +2455,6 @@ package body Sem_Ch12 is if Is_Expression_Function (Node (Elmt)) then Expr := New_Occurrence_Of (Node (Elmt), Sloc (N)); Set_Comes_From_Source (Expr); - Set_Entity (Expr, Node (Elmt)); Set_Parent (Expr, N); Freeze_Expression (Expr); else diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index d898fb40997c..514ab6eb6181 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -3848,7 +3848,9 @@ package body Sem_Ch6 is Set_Has_Delayed_Freeze (Spec_Id); Create_Extra_Formals (Spec_Id, Related_Nod => N); Freeze_Before (N, Spec_Id, - Do_Freeze_Profile => not Is_Dispatching_Operation (Spec_Id)); + Do_Freeze_Profile => not + (From_Expression_Function + and then Is_Dispatching_Operation (Spec_Id))); end if; end if;
