mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 21:31:54 +08:00
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:
parent
a42e39a7b9
commit
af94026524
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user