[Ada] Fix a freezing issue
2018-07-31 Javier Miranda <miranda@adacore.com> gcc/ada/ * sem.ads (Inside_Preanalysis_Without_Freezing): New global counter. * sem.adb (Semantics): This subprogram has now the responsibility of resetting the counter before analyzing a unit, and restoring its previous value before returning. * freeze.adb (Freeze_Entity): Do not freeze if we are preanalyzing without freezing. * sem_res.adb (Preanalyze_And_Resolve): Set & restore In_Preanalysis_Without_Freezing. From-SVN: r263091
This commit is contained in:
parent
3bb9bd7dcc
commit
b09a237ab8
|
@ -1,3 +1,15 @@
|
|||
2018-07-31 Javier Miranda <miranda@adacore.com>
|
||||
|
||||
* sem.ads (Inside_Preanalysis_Without_Freezing): New global
|
||||
counter.
|
||||
* sem.adb (Semantics): This subprogram has now the
|
||||
responsibility of resetting the counter before analyzing a unit,
|
||||
and restoring its previous value before returning.
|
||||
* freeze.adb (Freeze_Entity): Do not freeze if we are
|
||||
preanalyzing without freezing.
|
||||
* sem_res.adb (Preanalyze_And_Resolve): Set & restore
|
||||
In_Preanalysis_Without_Freezing.
|
||||
|
||||
2018-07-31 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* sem_ch4.adb (Traverse_Homonyms): Consider generic actuals that
|
||||
|
|
|
@ -5280,6 +5280,12 @@ package body Freeze is
|
|||
Result := No_List;
|
||||
goto Leave;
|
||||
|
||||
-- Do not freeze if we are preanalyzing without freezing
|
||||
|
||||
elsif Inside_Preanalysis_Without_Freezing > 0 then
|
||||
Result := No_List;
|
||||
goto Leave;
|
||||
|
||||
elsif Ekind (E) = E_Generic_Package then
|
||||
Result := Freeze_Generic_Entities (E);
|
||||
goto Leave;
|
||||
|
|
|
@ -1447,9 +1447,18 @@ package body Sem is
|
|||
-- unit. All with'ed units are analyzed with config restrictions reset
|
||||
-- and we need to restore these saved values at the end.
|
||||
|
||||
Save_Preanalysis_Counter : constant Nat :=
|
||||
Inside_Preanalysis_Without_Freezing;
|
||||
-- Saves the preanalysis nesting-level counter; required since we may
|
||||
-- need to analyze a unit as a consequence of the preanalysis of an
|
||||
-- expression without freezing (and the loaded unit must be fully
|
||||
-- analyzed).
|
||||
|
||||
-- Start of processing for Semantics
|
||||
|
||||
begin
|
||||
Inside_Preanalysis_Without_Freezing := 0;
|
||||
|
||||
if Debug_Unit_Walk then
|
||||
if Already_Analyzed then
|
||||
Write_Str ("(done)");
|
||||
|
@ -1622,6 +1631,8 @@ package body Sem is
|
|||
Unit (Comp_Unit),
|
||||
Prefix => "<-- ");
|
||||
end if;
|
||||
|
||||
Inside_Preanalysis_Without_Freezing := Save_Preanalysis_Counter;
|
||||
end Semantics;
|
||||
|
||||
--------
|
||||
|
|
|
@ -286,6 +286,11 @@ package Sem is
|
|||
-- freezing nodes can modify the status of this flag, any other client
|
||||
-- should regard it as read-only.
|
||||
|
||||
Inside_Preanalysis_Without_Freezing : Nat := 0;
|
||||
-- Flag indicating whether we are preanalyzing an expression performing no
|
||||
-- freezing. Non-zero means we are inside (it is actually a level counter
|
||||
-- to deal with nested calls).
|
||||
|
||||
Unloaded_Subunits : Boolean := False;
|
||||
-- This flag is set True if we have subunits that are not loaded. This
|
||||
-- occurs when the main unit is a subunit, and contains lower level
|
||||
|
|
|
@ -1671,14 +1671,17 @@ package body Sem_Res is
|
|||
T : Entity_Id;
|
||||
With_Freezing : Boolean)
|
||||
is
|
||||
Save_Full_Analysis : constant Boolean := Full_Analysis;
|
||||
Save_Must_Not_Freeze : constant Boolean := Must_Not_Freeze (N);
|
||||
|
||||
Save_Full_Analysis : constant Boolean := Full_Analysis;
|
||||
Save_Must_Not_Freeze : constant Boolean := Must_Not_Freeze (N);
|
||||
Save_Preanalysis_Count : constant Nat :=
|
||||
Inside_Preanalysis_Without_Freezing;
|
||||
begin
|
||||
pragma Assert (Nkind (N) in N_Subexpr);
|
||||
|
||||
if not With_Freezing then
|
||||
Set_Must_Not_Freeze (N);
|
||||
Inside_Preanalysis_Without_Freezing :=
|
||||
Inside_Preanalysis_Without_Freezing + 1;
|
||||
end if;
|
||||
|
||||
Full_Analysis := False;
|
||||
|
@ -1708,6 +1711,14 @@ package body Sem_Res is
|
|||
Expander_Mode_Restore;
|
||||
Full_Analysis := Save_Full_Analysis;
|
||||
Set_Must_Not_Freeze (N, Save_Must_Not_Freeze);
|
||||
|
||||
if not With_Freezing then
|
||||
Inside_Preanalysis_Without_Freezing :=
|
||||
Inside_Preanalysis_Without_Freezing - 1;
|
||||
end if;
|
||||
|
||||
pragma Assert
|
||||
(Inside_Preanalysis_Without_Freezing = Save_Preanalysis_Count);
|
||||
end Preanalyze_And_Resolve;
|
||||
|
||||
----------------------------
|
||||
|
|
Loading…
Reference in New Issue