Commit 75c90775 by Arnaud Charlet

[multiple changes]

2011-08-02  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch5.adb (Analyze_Iteration_Scheme): For an Ada2012 iterator with
	"of", pre-analyze expression in case it is a function call with
	finalization actions that must be placed ahead of the loop.
	* exp_ch5.adb (Expand_Iterator_Loop): If condition_actions are present
	on an Ada2012 iterator, insert them ahead of the rewritten loop.

2011-08-02  Geert Bosch  <bosch@adacore.com>

	* cstand.adb (Create_Float_Types): Only consider C's long double for
	Long_Long_Float, in addition to double.

From-SVN: r177146
parent ded8909b
2011-08-02 Ed Schonberg <schonberg@adacore.com>
* sem_ch5.adb (Analyze_Iteration_Scheme): For an Ada2012 iterator with
"of", pre-analyze expression in case it is a function call with
finalization actions that must be placed ahead of the loop.
* exp_ch5.adb (Expand_Iterator_Loop): If condition_actions are present
on an Ada2012 iterator, insert them ahead of the rewritten loop.
2011-08-02 Geert Bosch <bosch@adacore.com>
* cstand.adb (Create_Float_Types): Only consider C's long double for
Long_Long_Float, in addition to double.
2011-08-02 Robert Dewar <dewar@adacore.com> 2011-08-02 Robert Dewar <dewar@adacore.com>
* sem_ch3.adb, sem_ch5.adb, sem_type.adb, switch-c.adb, switch-c.ads, * sem_ch3.adb, sem_ch5.adb, sem_type.adb, switch-c.adb, switch-c.ads,
......
...@@ -466,29 +466,13 @@ package body CStand is ...@@ -466,29 +466,13 @@ package body CStand is
declare declare
Max_HW_Digs : constant := 18; Max_HW_Digs : constant := 18;
LF_Digs : constant Pos := -- Maximum hardware digits supported
UI_To_Int (Digits_Value (Standard_Long_Float));
LLF : Entity_Id := Find_Back_End_Float_Type ("long double"); LLF : Entity_Id := Find_Back_End_Float_Type ("long double");
E : Elmt_Id := First_Elmt (Back_End_Float_Types); -- Entity for long double type
N : Node_Id;
begin begin
if Present (LLF) and then Digits_Value (LLF) > Max_HW_Digs then if No (LLF) or else Digits_Value (LLF) > Max_HW_Digs then
LLF := Empty;
end if;
while No (LLF) and then Present (E) loop
N := Node (E);
if UI_To_Int (Digits_Value (N)) in LF_Digs + 1 .. Max_HW_Digs
and then Machine_Radix_Value (N) = Uint_2
then
LLF := N;
end if;
Next_Elmt (E);
end loop;
if No (LLF) then
LLF := Standard_Long_Float; LLF := Standard_Long_Float;
end if; end if;
......
...@@ -2952,6 +2952,15 @@ package body Exp_Ch5 is ...@@ -2952,6 +2952,15 @@ package body Exp_Ch5 is
Make_Iteration_Scheme (Loc, Condition => Cond), Make_Iteration_Scheme (Loc, Condition => Cond),
Statements => Stats, Statements => Stats,
End_Label => Empty); End_Label => Empty);
-- If the range of iteration is given by a function call that
-- returns a container, the finalization actions have been saved
-- in the Condition_Actions of the iterator. Insert them now at
-- the head of the loop.
if Present (Condition_Actions (Isc)) then
Insert_List_Before (N, Condition_Actions (Isc));
end if;
end; end;
end if; end if;
...@@ -3158,6 +3167,7 @@ package body Exp_Ch5 is ...@@ -3158,6 +3167,7 @@ package body Exp_Ch5 is
elsif Present (Isc) elsif Present (Isc)
and then Present (Condition_Actions (Isc)) and then Present (Condition_Actions (Isc))
and then Present (Condition (Isc))
then then
declare declare
ES : Node_Id; ES : Node_Id;
......
...@@ -1919,7 +1919,11 @@ package body Sem_Ch5 is ...@@ -1919,7 +1919,11 @@ package body Sem_Ch5 is
Set_Current_Value_Condition (N); Set_Current_Value_Condition (N);
return; return;
-- For an iterator specification with "of", pre-analyze range to
-- capture function calls that may require finalization actions.
elsif Present (Iterator_Specification (N)) then elsif Present (Iterator_Specification (N)) then
Pre_Analyze_Range (Name (Iterator_Specification (N)));
Analyze_Iterator_Specification (Iterator_Specification (N)); Analyze_Iterator_Specification (Iterator_Specification (N));
-- Else we have a FOR loop -- Else we have a FOR loop
...@@ -1974,7 +1978,7 @@ package body Sem_Ch5 is ...@@ -1974,7 +1978,7 @@ package body Sem_Ch5 is
then then
Process_Bounds (DS); Process_Bounds (DS);
-- Expander not active or else domain of iteration is a subtype -- expander not active or else range of iteration is a subtype
-- indication, an entity, or a function call that yields an -- indication, an entity, or a function call that yields an
-- aggregate or a container. -- aggregate or a container.
...@@ -1989,7 +1993,8 @@ package body Sem_Ch5 is ...@@ -1989,7 +1993,8 @@ package body Sem_Ch5 is
and then not Is_Type (Entity (D_Copy))) and then not Is_Type (Entity (D_Copy)))
then then
-- This is an iterator specification. Rewrite as such -- This is an iterator specification. Rewrite as such
-- and analyze. -- and analyze, to capture function calls that may
-- require finalization actions.
declare declare
I_Spec : constant Node_Id := I_Spec : constant Node_Id :=
...@@ -1997,8 +2002,7 @@ package body Sem_Ch5 is ...@@ -1997,8 +2002,7 @@ package body Sem_Ch5 is
Defining_Identifier => Defining_Identifier =>
Relocate_Node (Id), Relocate_Node (Id),
Name => D_Copy, Name => D_Copy,
Subtype_Indication => Subtype_Indication => Empty,
Empty,
Reverse_Present => Reverse_Present =>
Reverse_Present (LP)); Reverse_Present (LP));
begin begin
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment