Commit bb9e2aa2 by Arnaud Charlet

[multiple changes]

2017-04-27  Yannick Moy  <moy@adacore.com>

	* exp_unst.ads: Fix typos in comments.

2017-04-27  Ed Schonberg  <schonberg@adacore.com>

	* sem_eval.adb (Choice_Matches): Handle properly a real literal
	whose type has a defined static predicate.

2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch4.adb (Insert_Dereference_Action):
	Do not adjust the address of a controlled object when the
	associated access type is subject to pragma No_Heap_Finalization.
	Code reformatting.

From-SVN: r247304
parent ed8cbbaf
2017-04-27 Yannick Moy <moy@adacore.com>
* exp_unst.ads: Fix typos in comments.
2017-04-27 Ed Schonberg <schonberg@adacore.com>
* sem_eval.adb (Choice_Matches): Handle properly a real literal
whose type has a defined static predicate.
2017-04-27 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch4.adb (Insert_Dereference_Action):
Do not adjust the address of a controlled object when the
associated access type is subject to pragma No_Heap_Finalization.
Code reformatting.
2017-04-27 Pierre-Marie de Rodat <derodat@adacore.com> 2017-04-27 Pierre-Marie de Rodat <derodat@adacore.com>
* gcc-interface/utils.c (gnat_type_for_size): Set * gcc-interface/utils.c (gnat_type_for_size): Set
......
...@@ -12032,7 +12032,6 @@ package body Exp_Ch4 is ...@@ -12032,7 +12032,6 @@ package body Exp_Ch4 is
------------------------------- -------------------------------
procedure Insert_Dereference_Action (N : Node_Id) is procedure Insert_Dereference_Action (N : Node_Id) is
function Is_Checked_Storage_Pool (P : Entity_Id) return Boolean; function Is_Checked_Storage_Pool (P : Entity_Id) return Boolean;
-- Return true if type of P is derived from Checked_Pool; -- Return true if type of P is derived from Checked_Pool;
...@@ -12062,11 +12061,12 @@ package body Exp_Ch4 is ...@@ -12062,11 +12061,12 @@ package body Exp_Ch4 is
-- Local variables -- Local variables
Typ : constant Entity_Id := Etype (N); Context : constant Node_Id := Parent (N);
Desig : constant Entity_Id := Available_View (Designated_Type (Typ)); Ptr_Typ : constant Entity_Id := Etype (N);
Desig_Typ : constant Entity_Id :=
Available_View (Designated_Type (Ptr_Typ));
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
Pool : constant Entity_Id := Associated_Storage_Pool (Typ); Pool : constant Entity_Id := Associated_Storage_Pool (Ptr_Typ);
Pnod : constant Node_Id := Parent (N);
Addr : Entity_Id; Addr : Entity_Id;
Alig : Entity_Id; Alig : Entity_Id;
...@@ -12078,18 +12078,18 @@ package body Exp_Ch4 is ...@@ -12078,18 +12078,18 @@ package body Exp_Ch4 is
-- Start of processing for Insert_Dereference_Action -- Start of processing for Insert_Dereference_Action
begin begin
pragma Assert (Nkind (Pnod) = N_Explicit_Dereference); pragma Assert (Nkind (Context) = N_Explicit_Dereference);
-- Do not re-expand a dereference which has already been processed by -- Do not re-expand a dereference which has already been processed by
-- this routine. -- this routine.
if Has_Dereference_Action (Pnod) then if Has_Dereference_Action (Context) then
return; return;
-- Do not perform this type of expansion for internally-generated -- Do not perform this type of expansion for internally-generated
-- dereferences. -- dereferences.
elsif not Comes_From_Source (Original_Node (Pnod)) then elsif not Comes_From_Source (Original_Node (Context)) then
return; return;
-- A dereference action is only applicable to objects which have been -- A dereference action is only applicable to objects which have been
...@@ -12131,15 +12131,15 @@ package body Exp_Ch4 is ...@@ -12131,15 +12131,15 @@ package body Exp_Ch4 is
-- Special case of an unconstrained array: need to add descriptor size -- Special case of an unconstrained array: need to add descriptor size
if Is_Array_Type (Desig) if Is_Array_Type (Desig_Typ)
and then not Is_Constrained (First_Subtype (Desig)) and then not Is_Constrained (First_Subtype (Desig_Typ))
then then
Size_Bits := Size_Bits :=
Make_Op_Add (Loc, Make_Op_Add (Loc,
Left_Opnd => Left_Opnd =>
Make_Attribute_Reference (Loc, Make_Attribute_Reference (Loc,
Prefix => Prefix =>
New_Occurrence_Of (First_Subtype (Desig), Loc), New_Occurrence_Of (First_Subtype (Desig_Typ), Loc),
Attribute_Name => Name_Descriptor_Size), Attribute_Name => Name_Descriptor_Size),
Right_Opnd => Size_Bits); Right_Opnd => Size_Bits);
end if; end if;
...@@ -12181,7 +12181,14 @@ package body Exp_Ch4 is ...@@ -12181,7 +12181,14 @@ package body Exp_Ch4 is
-- knowledge of hidden pointers, we have to bring the two pointers back -- knowledge of hidden pointers, we have to bring the two pointers back
-- in view in order to restore the original state of the object. -- in view in order to restore the original state of the object.
if Needs_Finalization (Desig) then -- The address manipulation is not performed for access types that are
-- subject to pragma No_Heap_Finalization because the two pointers do
-- not exist in the first place.
if No_Heap_Finalization (Ptr_Typ) then
null;
elsif Needs_Finalization (Desig_Typ) then
-- Adjust the address and size of the dereferenced object. Generate: -- Adjust the address and size of the dereferenced object. Generate:
-- Adjust_Controlled_Dereference (Addr, Size, Alig); -- Adjust_Controlled_Dereference (Addr, Size, Alig);
...@@ -12203,7 +12210,7 @@ package body Exp_Ch4 is ...@@ -12203,7 +12210,7 @@ package body Exp_Ch4 is
-- <Stmt>; -- <Stmt>;
-- end if; -- end if;
if Is_Class_Wide_Type (Desig) then if Is_Class_Wide_Type (Desig_Typ) then
Deref := Deref :=
Make_Explicit_Dereference (Loc, Make_Explicit_Dereference (Loc,
Prefix => Duplicate_Subexpr_Move_Checks (N)); Prefix => Duplicate_Subexpr_Move_Checks (N));
...@@ -12242,7 +12249,7 @@ package body Exp_Ch4 is ...@@ -12242,7 +12249,7 @@ package body Exp_Ch4 is
-- Mark the explicit dereference as processed to avoid potential -- Mark the explicit dereference as processed to avoid potential
-- infinite expansion. -- infinite expansion.
Set_Has_Dereference_Action (Pnod); Set_Has_Dereference_Action (Context);
exception exception
when RE_Not_Available => when RE_Not_Available =>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 2014-2016, Free Software Foundation, Inc. -- -- Copyright (C) 2014-2017, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -294,13 +294,13 @@ package Exp_Unst is ...@@ -294,13 +294,13 @@ package Exp_Unst is
-- What we do is to always generate a local constant for any dynamic -- What we do is to always generate a local constant for any dynamic
-- bound in a dynamic subtype xx with name xx_FIRST or xx_LAST. The one -- bound in a dynamic subtype xx with name xx_FIRST or xx_LAST. The one
-- case where we can skip this is where the bound is e.g. in the third -- case where we can skip this is where the bound is already a constant.
-- example above, subtype dynam is expanded as -- E.g. in the third example above, subtype dynam is expanded as
-- dynam_LAST : constant Integer := y + 3; -- dynam_LAST : constant Integer := y + 3;
-- subtype dynam is integer range x .. dynam_LAST; -- subtype dynam is integer range x .. dynam_LAST;
-- Now if type dynam is uplevel referenced (as it is this case), then -- Now if type dynam is uplevel referenced (as it is in this case), then
-- the bounds x and dynam_LAST are marked as uplevel references -- the bounds x and dynam_LAST are marked as uplevel references
-- so that appropriate entries are made in the activation record. Any -- so that appropriate entries are made in the activation record. Any
-- explicit reference to such a bound in the front end generated code -- explicit reference to such a bound in the front end generated code
...@@ -310,7 +310,7 @@ package Exp_Unst is ...@@ -310,7 +310,7 @@ package Exp_Unst is
-- these bounds can be replaced by an appropriate reference to the entry -- these bounds can be replaced by an appropriate reference to the entry
-- in the activation record for xx_FIRST or xx_LAST. Thus the back end -- in the activation record for xx_FIRST or xx_LAST. Thus the back end
-- can eliminate the problematical uplevel reference without the need to -- can eliminate the problematical uplevel reference without the need to
-- do the heavy tree modification to do that at the code expansion level -- do the heavy tree modification to do that at the code expansion level.
-- Looking at case 3 again, here is the normal -gnatG expanded code -- Looking at case 3 again, here is the normal -gnatG expanded code
...@@ -347,7 +347,7 @@ package Exp_Unst is ...@@ -347,7 +347,7 @@ package Exp_Unst is
-- we ignore that detail to clarify the examples. -- we ignore that detail to clarify the examples.
-- Here we see that some of the bounds references are expanded by the -- Here we see that some of the bounds references are expanded by the
-- front end, so that we get explicit references to y or dynamLast. These -- front end, so that we get explicit references to y or dynam_Last. These
-- cases are handled by the normal uplevel reference mechanism described -- cases are handled by the normal uplevel reference mechanism described
-- above for case 2. This is the case for the constraint check for the -- above for case 2. This is the case for the constraint check for the
-- initialization of xx, and the range check in function inner. -- initialization of xx, and the range check in function inner.
......
...@@ -626,7 +626,8 @@ package body Sem_Eval is ...@@ -626,7 +626,8 @@ package body Sem_Eval is
return Non_Static; return Non_Static;
-- When the choice denotes a subtype with a static predictate, check the -- When the choice denotes a subtype with a static predictate, check the
-- expression against the predicate values. -- expression against the predicate values. Different procedures apply
-- to discrete and non-discrete types.
elsif (Nkind (Choice) = N_Subtype_Indication elsif (Nkind (Choice) = N_Subtype_Indication
or else (Is_Entity_Name (Choice) or else (Is_Entity_Name (Choice)
...@@ -634,10 +635,20 @@ package body Sem_Eval is ...@@ -634,10 +635,20 @@ package body Sem_Eval is
and then Has_Predicates (Etype (Choice)) and then Has_Predicates (Etype (Choice))
and then Has_Static_Predicate (Etype (Choice)) and then Has_Static_Predicate (Etype (Choice))
then then
return if Is_Discrete_Type (Etype (Choice)) then
Choices_Match (Expr, Static_Discrete_Predicate (Etype (Choice))); return Choices_Match
(Expr, Static_Discrete_Predicate (Etype (Choice)));
elsif
Real_Or_String_Static_Predicate_Matches (Expr, Etype (Choice))
then
return Match;
else
return No_Match;
end if;
-- Discrete type case -- Discrete type case only
elsif Is_Discrete_Type (Etyp) then elsif Is_Discrete_Type (Etyp) then
Val := Expr_Value (Expr); Val := Expr_Value (Expr);
......
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