[multiple changes]
2015-05-21 Robert Dewar <dewar@adacore.com> * exp_util.adb (Activate_Atomic_Synchronization): Do not set Atomic_Sync_Required for an object renaming declaration. * sem_ch8.adb (Analyze_Object_Renaming): Copy Is_Atomic and Is_Independent to renaming object. 2015-05-21 Ed Schonberg <schonberg@adacore.com> * sem_ch5.adb (Analyze_Iterator_Specification): Diagnose various illegalities in iterators over arrays and containers: a) New function Get_Cursor_Type, to verify that the cursor is not a limited type at the point of iteration. b) If the container is a constant, an element_iterator is illegal if the container type does not have a Constant_Indexing aspect. c) If the iterate function has an in-out controlling parameter, the container cannot be a constant object. d) Reject additional cases of iterators over a discriminant-dependent component of a mutable object. From-SVN: r223524
This commit is contained in:
parent
44ae5cd22f
commit
6333ad3d45
@ -1,3 +1,23 @@
|
|||||||
|
2015-05-21 Robert Dewar <dewar@adacore.com>
|
||||||
|
|
||||||
|
* exp_util.adb (Activate_Atomic_Synchronization): Do not set
|
||||||
|
Atomic_Sync_Required for an object renaming declaration.
|
||||||
|
* sem_ch8.adb (Analyze_Object_Renaming): Copy Is_Atomic and
|
||||||
|
Is_Independent to renaming object.
|
||||||
|
|
||||||
|
2015-05-21 Ed Schonberg <schonberg@adacore.com>
|
||||||
|
|
||||||
|
* sem_ch5.adb (Analyze_Iterator_Specification): Diagnose
|
||||||
|
various illegalities in iterators over arrays and containers:
|
||||||
|
a) New function Get_Cursor_Type, to verify that the cursor is
|
||||||
|
not a limited type at the point of iteration.
|
||||||
|
b) If the container is a constant, an element_iterator is illegal
|
||||||
|
if the container type does not have a Constant_Indexing aspect.
|
||||||
|
c) If the iterate function has an in-out controlling parameter,
|
||||||
|
the container cannot be a constant object.
|
||||||
|
d) Reject additional cases of iterators over a
|
||||||
|
discriminant-dependent component of a mutable object.
|
||||||
|
|
||||||
2015-05-21 Hristian Kirtchev <kirtchev@adacore.com>
|
2015-05-21 Hristian Kirtchev <kirtchev@adacore.com>
|
||||||
|
|
||||||
* einfo.adb (Contract): This attribute now applies to constants.
|
* einfo.adb (Contract): This attribute now applies to constants.
|
||||||
|
@ -204,6 +204,13 @@ package body Exp_Util is
|
|||||||
when others => null;
|
when others => null;
|
||||||
end case;
|
end case;
|
||||||
|
|
||||||
|
-- Nothing to do for the identifier in an object renaming declaration,
|
||||||
|
-- the renaming itself does not need atomic syncrhonization.
|
||||||
|
|
||||||
|
if Nkind (Parent (N)) = N_Object_Renaming_Declaration then
|
||||||
|
return;
|
||||||
|
end if;
|
||||||
|
|
||||||
-- Go ahead and set the flag
|
-- Go ahead and set the flag
|
||||||
|
|
||||||
Set_Atomic_Sync_Required (N);
|
Set_Atomic_Sync_Required (N);
|
||||||
|
@ -2015,10 +2015,11 @@ package body Sem_Ch5 is
|
|||||||
-- mutable, to prevent a modification of the container in the
|
-- mutable, to prevent a modification of the container in the
|
||||||
-- course of an iteration.
|
-- course of an iteration.
|
||||||
|
|
||||||
if Is_Entity_Name (Iter_Name)
|
-- Should comment on need to go to Original_Node ???
|
||||||
and then Nkind (Original_Node (Iter_Name)) = N_Selected_Component
|
|
||||||
|
if Nkind (Original_Node (Iter_Name)) = N_Selected_Component
|
||||||
and then Is_Dependent_Component_Of_Mutable_Object
|
and then Is_Dependent_Component_Of_Mutable_Object
|
||||||
(Renamed_Object (Entity (Iter_Name)))
|
(Original_Node (Iter_Name))
|
||||||
then
|
then
|
||||||
Error_Msg_N
|
Error_Msg_N
|
||||||
("container cannot be a discriminant-dependent "
|
("container cannot be a discriminant-dependent "
|
||||||
@ -2089,6 +2090,8 @@ package body Sem_Ch5 is
|
|||||||
declare
|
declare
|
||||||
Element : constant Entity_Id :=
|
Element : constant Entity_Id :=
|
||||||
Find_Value_Of_Aspect (Typ, Aspect_Iterator_Element);
|
Find_Value_Of_Aspect (Typ, Aspect_Iterator_Element);
|
||||||
|
Iterator : constant Entity_Id :=
|
||||||
|
Find_Value_Of_Aspect (Typ, Aspect_Default_Iterator);
|
||||||
Cursor_Type : Entity_Id;
|
Cursor_Type : Entity_Id;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -2120,6 +2123,39 @@ package body Sem_Ch5 is
|
|||||||
if Has_Aspect (Typ, Aspect_Variable_Indexing) then
|
if Has_Aspect (Typ, Aspect_Variable_Indexing) then
|
||||||
Set_Ekind (Def_Id, E_Variable);
|
Set_Ekind (Def_Id, E_Variable);
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
|
-- If the container is a constant, iterating over it
|
||||||
|
-- requires a Constant_Indexing operation.
|
||||||
|
|
||||||
|
if not Is_Variable (Iter_Name)
|
||||||
|
and then not Has_Aspect (Typ, Aspect_Constant_Indexing)
|
||||||
|
then
|
||||||
|
Error_Msg_N ("iteration over constant container "
|
||||||
|
& "require constant_indexing aspect", N);
|
||||||
|
|
||||||
|
-- The Iterate function may have an in_out parameter,
|
||||||
|
-- and a constant container is thus illegal.
|
||||||
|
|
||||||
|
elsif Present (Iterator)
|
||||||
|
and then Ekind (Entity (Iterator)) = E_Function
|
||||||
|
and then Ekind (First_Formal (Entity (Iterator))) /=
|
||||||
|
E_In_Parameter
|
||||||
|
and then not Is_Variable (Iter_Name)
|
||||||
|
then
|
||||||
|
Error_Msg_N
|
||||||
|
("variable container expected", N);
|
||||||
|
end if;
|
||||||
|
|
||||||
|
if Nkind (Original_Node (Iter_Name))
|
||||||
|
= N_Selected_Component
|
||||||
|
and then
|
||||||
|
Is_Dependent_Component_Of_Mutable_Object
|
||||||
|
(Original_Node (Iter_Name))
|
||||||
|
then
|
||||||
|
Error_Msg_N
|
||||||
|
("container cannot be a discriminant-dependent "
|
||||||
|
& "component of a mutable object", N);
|
||||||
|
end if;
|
||||||
end if;
|
end if;
|
||||||
end;
|
end;
|
||||||
end if;
|
end if;
|
||||||
@ -2168,16 +2204,16 @@ package body Sem_Ch5 is
|
|||||||
|
|
||||||
if Nkind (Iter_Name) = N_Identifier then
|
if Nkind (Iter_Name) = N_Identifier then
|
||||||
declare
|
declare
|
||||||
Iter_Kind : constant Node_Kind :=
|
Orig_Node : constant Node_Id := Original_Node (Iter_Name);
|
||||||
Nkind (Original_Node (Iter_Name));
|
Iter_Kind : constant Node_Kind := Nkind (Orig_Node);
|
||||||
Obj : Node_Id;
|
Obj : Node_Id;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
if Iter_Kind = N_Selected_Component then
|
if Iter_Kind = N_Selected_Component then
|
||||||
Obj := Prefix (Original_Node (Iter_Name));
|
Obj := Prefix (Orig_Node);
|
||||||
|
|
||||||
elsif Iter_Kind = N_Function_Call then
|
elsif Iter_Kind = N_Function_Call then
|
||||||
Obj := First_Actual (Original_Node (Iter_Name));
|
Obj := First_Actual (Orig_Node);
|
||||||
|
|
||||||
-- If neither, the name comes from source
|
-- If neither, the name comes from source
|
||||||
|
|
||||||
|
@ -1344,6 +1344,13 @@ package body Sem_Ch8 is
|
|||||||
|
|
||||||
Set_Is_Volatile (Id, Is_Volatile_Object (Nam));
|
Set_Is_Volatile (Id, Is_Volatile_Object (Nam));
|
||||||
|
|
||||||
|
-- Also copy settings of Is_Atomic and Is_Independent
|
||||||
|
|
||||||
|
if Is_Entity_Name (Nam) then
|
||||||
|
Set_Is_Atomic (Id, Is_Atomic (Entity (Nam)));
|
||||||
|
Set_Is_Independent (Id, Is_Independent (Entity (Nam)));
|
||||||
|
end if;
|
||||||
|
|
||||||
-- Treat as volatile if we just set the Volatile flag
|
-- Treat as volatile if we just set the Volatile flag
|
||||||
|
|
||||||
if Is_Volatile (Id)
|
if Is_Volatile (Id)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user