ada: Spurious error on Lock_Free protected type with discriminants

This patch corrects an issue in the compiler whereby unprefixed discriminants
appearing in protected subprograms were unable to be properly resolved -
leading to spurious resolution errors.

gcc/ada/

	* sem_ch8.adb
	(Find_Direct_Name): Remove bypass to reanalyze incorrectly
	analyzed discriminals.
	(Set_Entity_Or_Discriminal): Avoid resetting the entity field of a
	discriminant reference to be the internally generated renaming
	when we are in strict preanalysis mode.
This commit is contained in:
Justin Squirek 2022-11-23 07:56:45 +00:00 committed by Marc Poulhiès
parent a42e39a7b9
commit af94026524

View File

@ -4891,6 +4891,18 @@ package body Sem_Ch8 is
then
null;
-- Don't replace the discriminant in strict preanalysis mode since
-- it can lead to errors during full analysis when the discriminant
-- gets referenced later.
-- This can occur in situations where a protected type contains
-- an expression function which references a discriminant.
elsif Preanalysis_Active
and then Inside_Preanalysis_Without_Freezing = 0
then
null;
else
Set_Entity (N, Discriminal (E));
end if;
@ -6048,21 +6060,6 @@ 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));
@ -6102,8 +6099,6 @@ package body Sem_Ch8 is
return;
end if;
<<Find_Name>>
-- 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.