diff options
Diffstat (limited to 'gcc/ada/sem_ch6.adb')
-rw-r--r-- | gcc/ada/sem_ch6.adb | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 5885e3f4538..cc6795b1b53 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -369,6 +369,18 @@ package body Sem_Ch6 is elsif Present (Prev) and then Comes_From_Source (Prev) then Set_Has_Completion (Prev, False); + -- An expression function that is a completion freezes the + -- expression. This means freezing the return type, and if it is + -- an access type, freezing its designated type as well. + -- Note that we cannot defer this freezing to the analysis of the + -- expression itself, because a freeze node might appear in a + -- nested scope, leading to an elaboration order issue in gigi. + + Freeze_Before (N, Etype (Prev)); + if Is_Access_Type (Etype (Prev)) then + Freeze_Before (N, Designated_Type (Etype (Prev))); + end if; + -- For navigation purposes, indicate that the function is a body Generate_Reference (Prev, Defining_Entity (N), 'b', Force => True); |