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
+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>
* sem_ch3.adb, sem_ch5.adb, sem_type.adb, switch-c.adb, switch-c.ads,
declare
Max_HW_Digs : constant := 18;
- LF_Digs : constant Pos :=
- UI_To_Int (Digits_Value (Standard_Long_Float));
+ -- Maximum hardware digits supported
+
LLF : Entity_Id := Find_Back_End_Float_Type ("long double");
- E : Elmt_Id := First_Elmt (Back_End_Float_Types);
- N : Node_Id;
+ -- Entity for long double type
begin
- if Present (LLF) and then 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
+ if No (LLF) or else Digits_Value (LLF) > Max_HW_Digs then
LLF := Standard_Long_Float;
end if;
Make_Iteration_Scheme (Loc, Condition => Cond),
Statements => Stats,
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 if;
elsif Present (Isc)
and then Present (Condition_Actions (Isc))
+ and then Present (Condition (Isc))
then
declare
ES : Node_Id;
Set_Current_Value_Condition (N);
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
+ Pre_Analyze_Range (Name (Iterator_Specification (N)));
Analyze_Iterator_Specification (Iterator_Specification (N));
-- Else we have a FOR loop
then
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
-- aggregate or a container.
and then not Is_Type (Entity (D_Copy)))
then
-- This is an iterator specification. Rewrite as such
- -- and analyze.
+ -- and analyze, to capture function calls that may
+ -- require finalization actions.
declare
I_Spec : constant Node_Id :=
Defining_Identifier =>
Relocate_Node (Id),
Name => D_Copy,
- Subtype_Indication =>
- Empty,
+ Subtype_Indication => Empty,
Reverse_Present =>
Reverse_Present (LP));
begin