[multiple changes]

2017-01-13  Ed Schonberg  <schonberg@adacore.com>

	* sem_aggr.adb (Resolve_Array_Aggregate): The code that verifies
	the legality of An others clause applies as well to a choice in
	an Iterated_component_ association.
	(Resolve_Iterated_Component_Association): An others choice
	is legal.
	* exp_aggr.adb (Aggr_Assignment_OK_For_Backend): An
	Iterated_Component_Association is not static.

2017-01-13  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch3.adb (Freeze_Type): Mark the Ghost mode as set in case
	control is passed to the expresion handler before the new mode
	is set.
	* sem_ch12.adb (Analyze_Package_Instantiation,
	Analyze_Subprogram_Instantiation): Mark the Ghost mode as set
	in case control is passed to the expresion handler before the
	new mode is set.

From-SVN: r244417
This commit is contained in:
Arnaud Charlet 2017-01-13 11:48:57 +01:00
parent 72cdccfa16
commit b2c1aa8fe9
5 changed files with 64 additions and 19 deletions

View File

@ -1,3 +1,23 @@
2017-01-13 Ed Schonberg <schonberg@adacore.com>
* sem_aggr.adb (Resolve_Array_Aggregate): The code that verifies
the legality of An others clause applies as well to a choice in
an Iterated_component_ association.
(Resolve_Iterated_Component_Association): An others choice
is legal.
* exp_aggr.adb (Aggr_Assignment_OK_For_Backend): An
Iterated_Component_Association is not static.
2017-01-13 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch3.adb (Freeze_Type): Mark the Ghost mode as set in case
control is passed to the expresion handler before the new mode
is set.
* sem_ch12.adb (Analyze_Package_Instantiation,
Analyze_Subprogram_Instantiation): Mark the Ghost mode as set
in case control is passed to the expresion handler before the
new mode is set.
2017-01-13 Hristian Kirtchev <kirtchev@adacore.com>
* sem_aggr.adb, sem_ch3.adb, inline.adb, sem_util.adb, exp_ch4.adb,

View File

@ -4272,7 +4272,7 @@ package body Exp_Aggr is
-- values, and can be passed as is to the back-end without further
-- expansion.
-- An Iterated_component_Association is treated as non-static, but there
-- are posibilities for optimization here.
-- are possibilities for optimization here.
function Flatten
(N : Node_Id;
@ -4945,6 +4945,13 @@ package body Exp_Aggr is
end if;
end loop;
-- An Iterated_Component_Association involves a loop (in most cases)
-- and is never static.
if Nkind (Parent (Expr)) = N_Iterated_Component_Association then
return False;
end if;
if not Is_Discrete_Type (Ctyp) then
return False;
end if;

View File

@ -7106,8 +7106,10 @@ package body Exp_Ch3 is
-- Local variables
Def_Id : constant Entity_Id := Entity (N);
Mode : Ghost_Mode_Type;
Result : Boolean := False;
Mode : Ghost_Mode_Type;
Mode_Set : Boolean := False;
Result : Boolean := False;
-- Start of processing for Freeze_Type
@ -7117,6 +7119,7 @@ package body Exp_Ch3 is
-- marked as Ghost.
Set_Ghost_Mode (Def_Id, Mode);
Mode_Set := True;
-- Process any remote access-to-class-wide types designating the type
-- being frozen.
@ -7444,12 +7447,18 @@ package body Exp_Ch3 is
Build_Invariant_Procedure_Body (Def_Id);
end if;
Restore_Ghost_Mode (Mode);
if Mode_Set then
Restore_Ghost_Mode (Mode);
end if;
return Result;
exception
when RE_Not_Available =>
Restore_Ghost_Mode (Mode);
if Mode_Set then
Restore_Ghost_Mode (Mode);
end if;
return False;
end Freeze_Type;

View File

@ -1656,19 +1656,18 @@ package body Sem_Aggr is
while Present (Choice) loop
if Nkind (Choice) = N_Others_Choice then
Error_Msg_N ("others choice not allowed in this context", N);
Others_Present := True;
else
Analyze_And_Resolve (Choice, Index_Typ);
end if;
Nb_Choices := Nb_Choices + 1;
Next (Choice);
end loop;
-- Create a scope in which to introduce an index, which is usually
-- visible in the expression for the component.
-- visible in the expression for the component, and needed for its
-- analysis.
Ent := New_Internal_Entity (E_Loop, Current_Scope, Loc, 'L');
Set_Etype (Ent, Standard_Void_Type);
@ -1730,16 +1729,15 @@ package body Sem_Aggr is
while Present (Assoc) loop
if Nkind (Assoc) = N_Iterated_Component_Association then
Resolve_Iterated_Component_Association (Assoc, Index_Typ);
goto Next_Assoc;
end if;
Choice := First (Choices (Assoc));
Choice := First (Choice_List (Assoc));
Delete_Choice := False;
while Present (Choice) loop
if Nkind (Choice) = N_Others_Choice then
Others_Present := True;
if Choice /= First (Choices (Assoc))
if Choice /= First (Choice_List (Assoc))
or else Present (Next (Choice))
then
Error_Msg_N
@ -1829,7 +1827,6 @@ package body Sem_Aggr is
end;
end loop;
<<Next_Assoc>>
Next (Assoc);
end loop;
end if;

View File

@ -3668,7 +3668,8 @@ package body Sem_Ch12 is
-- Local declarations
Mode : Ghost_Mode_Type;
Mode : Ghost_Mode_Type;
Mode_Set : Boolean := False;
Vis_Prims_List : Elist_Id := No_Elist;
-- List of primitives made temporarily visible in the instantiation
@ -3746,6 +3747,7 @@ package body Sem_Ch12 is
-- Ghost.
Mark_And_Set_Ghost_Instantiation (N, Gen_Unit, Mode);
Mode_Set := True;
-- Verify that it is the name of a generic package
@ -4438,7 +4440,9 @@ package body Sem_Ch12 is
Analyze_Aspect_Specifications (N, Act_Decl_Id);
end if;
Restore_Ghost_Mode (Mode);
if Mode_Set then
Restore_Ghost_Mode (Mode);
end if;
exception
when Instantiation_Error =>
@ -4455,7 +4459,9 @@ package body Sem_Ch12 is
SPARK_Mode_Pragma := Save_SMP;
Style_Check := Save_Style_Check;
Restore_Ghost_Mode (Mode);
if Mode_Set then
Restore_Ghost_Mode (Mode);
end if;
end Analyze_Package_Instantiation;
--------------------------
@ -5093,8 +5099,6 @@ package body Sem_Ch12 is
-- Local variables
Mode : Ghost_Mode_Type;
Save_IPSM : constant Boolean := Ignore_Pragma_SPARK_Mode;
-- Save flag Ignore_Pragma_SPARK_Mode for restore on exit
@ -5102,6 +5106,9 @@ package body Sem_Ch12 is
Save_SMP : constant Node_Id := SPARK_Mode_Pragma;
-- Save the SPARK_Mode-related data for restore on exit
Mode : Ghost_Mode_Type;
Mode_Set : Boolean := False;
Vis_Prims_List : Elist_Id := No_Elist;
-- List of primitives made temporarily visible in the instantiation
-- to match the visibility of the formal type
@ -5143,6 +5150,7 @@ package body Sem_Ch12 is
-- Ghost.
Mark_And_Set_Ghost_Instantiation (N, Gen_Unit, Mode);
Mode_Set := True;
Generate_Reference (Gen_Unit, Gen_Id);
@ -5404,7 +5412,9 @@ package body Sem_Ch12 is
Analyze_Aspect_Specifications (N, Act_Decl_Id);
end if;
Restore_Ghost_Mode (Mode);
if Mode_Set then
Restore_Ghost_Mode (Mode);
end if;
exception
when Instantiation_Error =>
@ -5420,7 +5430,9 @@ package body Sem_Ch12 is
SPARK_Mode := Save_SM;
SPARK_Mode_Pragma := Save_SMP;
Restore_Ghost_Mode (Mode);
if Mode_Set then
Restore_Ghost_Mode (Mode);
end if;
end Analyze_Subprogram_Instantiation;
-------------------------