From: Javier Miranda Date: Mon, 6 Jul 2020 12:04:01 +0000 (-0400) Subject: [Ada] Crash in expression function defined in protected object X-Git-Tag: basepoints/gcc-12~4214 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b9d685922c7d960ab5b0beae348cfb37df08d115;p=thirdparty%2Fgcc.git [Ada] Crash in expression function defined in protected object gcc/ada/ * sem_ch8.adb (Find_Direct_Name): Do not trust in the decoration of the Entity attribute in constants associated with discriminals of protected types. --- diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index 73f73c6864b0..c831ed0fac1d 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -5627,6 +5627,21 @@ package body Sem_Ch8 is if Is_Type (Entity (N)) then Set_Etype (N, Entity (N)); + -- The exception to this general rule are constants associated with + -- discriminals of protected types because for each protected op + -- a new set of discriminals is internally created by the frontend + -- (see Exp_Ch9.Set_Discriminals), and the current decoration of the + -- entity pointer may have been set as part of a preanalysis, where + -- discriminals still reference the first subprogram or entry to be + -- expanded (see Expand_Protected_Body_Declarations). + + elsif Full_Analysis + and then Ekind (Entity (N)) = E_Constant + and then Present (Discriminal_Link (Entity (N))) + and then Is_Protected_Type (Scope (Discriminal_Link (Entity (N)))) + then + goto Find_Name; + else declare Entyp : constant Entity_Id := Etype (Entity (N)); @@ -5667,6 +5682,8 @@ package body Sem_Ch8 is return; end if; + <> + -- Preserve relevant elaboration-related attributes of the context which -- are no longer available or very expensive to recompute once analysis, -- resolution, and expansion are over.