[multiple changes]

2014-07-29  Vincent Celier  <celier@adacore.com>

	* gnat_ugn.texi: Document that configuration pragmas files are
	added to the dependencies, unless they contain only pragmas
	Source_File_Name_Project.

2014-07-29  Robert Dewar  <dewar@adacore.com>

	* frontend.adb: Minor reformatting.

2014-07-29  Robert Dewar  <dewar@adacore.com>

	* exp_ch6.adb (Add_Call_By_Copy_Code): Minor reformatting
	(Expand_Actuals): Make sure predicate checks are properly applied
	for the case of OUT or IN OUT parameters.
	* sem_res.adb: Minor reformatting (Resolve_Actuals): Skip
	predicate tests on arguments for Finalize
	* sem_util.adb (No_Predicate_Test_On_Arguments): Returns True
	if predicate tests on subprogram arguments should be skipped.
	* sem_util.ads (No_Predicate_Test_On_Arguments): New function

2014-07-29  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch3.adb (Analyze_Object_Declaration): If there is an address
	clause for the object and the expression is an aggregate, defer
	resolution and expansion of the aggregate until the freeze point
	of the entity.
	* sem_aggr.adb (Resolve_Aggregate): An others_clause is legal if
	the parent node is an N_Reference generated during expansion.

2014-07-29  Vincent Celier  <celier@adacore.com>

	* prj.adb (Add_To_Buffer): Effectively double the size of the buffer.

From-SVN: r213209
This commit is contained in:
Arnaud Charlet 2014-07-29 17:02:05 +02:00
parent fc27e20e72
commit 5f6fb720bb
10 changed files with 174 additions and 56 deletions

View File

@ -1,3 +1,37 @@
2014-07-29 Vincent Celier <celier@adacore.com>
* gnat_ugn.texi: Document that configuration pragmas files are
added to the dependencies, unless they contain only pragmas
Source_File_Name_Project.
2014-07-29 Robert Dewar <dewar@adacore.com>
* frontend.adb: Minor reformatting.
2014-07-29 Robert Dewar <dewar@adacore.com>
* exp_ch6.adb (Add_Call_By_Copy_Code): Minor reformatting
(Expand_Actuals): Make sure predicate checks are properly applied
for the case of OUT or IN OUT parameters.
* sem_res.adb: Minor reformatting (Resolve_Actuals): Skip
predicate tests on arguments for Finalize
* sem_util.adb (No_Predicate_Test_On_Arguments): Returns True
if predicate tests on subprogram arguments should be skipped.
* sem_util.ads (No_Predicate_Test_On_Arguments): New function
2014-07-29 Ed Schonberg <schonberg@adacore.com>
* sem_ch3.adb (Analyze_Object_Declaration): If there is an address
clause for the object and the expression is an aggregate, defer
resolution and expansion of the aggregate until the freeze point
of the entity.
* sem_aggr.adb (Resolve_Aggregate): An others_clause is legal if
the parent node is an N_Reference generated during expansion.
2014-07-29 Vincent Celier <celier@adacore.com>
* prj.adb (Add_To_Buffer): Effectively double the size of the buffer.
2014-07-29 Robert Dewar <dewar@adacore.com>
* frontend.adb, inline.adb, sem_util.adb, sem_res.adb,

View File

@ -23,7 +23,6 @@
-- --
------------------------------------------------------------------------------
with Aspects; use Aspects;
with Atree; use Atree;
with Checks; use Checks;
with Debug; use Debug;
@ -190,6 +189,9 @@ package body Exp_Ch6 is
-- For non-scalar objects that are possibly unaligned, add call by copy
-- code (copy in for IN and IN OUT, copy out for OUT and IN OUT).
--
-- For OUT and IN OUT parameters, add predicate checks after the call
-- based on the predicates of the actual type.
--
-- The parameter N is IN OUT because in some cases, the expansion code
-- rewrites the call as an expression actions with the call inside. In
-- this case N is reset to point to the inside call so that the caller
@ -1082,19 +1084,18 @@ package body Exp_Ch6 is
Init := Empty;
Indic :=
Make_Subtype_Indication (Loc,
Subtype_Mark =>
New_Occurrence_Of (F_Typ, Loc),
Subtype_Mark => New_Occurrence_Of (F_Typ, Loc),
Constraint =>
Make_Index_Or_Discriminant_Constraint (Loc,
Constraints => New_List (
Make_Range (Loc,
Low_Bound =>
Make_Attribute_Reference (Loc,
Prefix => New_Occurrence_Of (Var, Loc),
Prefix => New_Occurrence_Of (Var, Loc),
Attribute_Name => Name_First),
High_Bound =>
Make_Attribute_Reference (Loc,
Prefix => New_Occurrence_Of (Var, Loc),
Prefix => New_Occurrence_Of (Var, Loc),
Attribute_Name => Name_Last)))));
else
@ -1720,7 +1721,7 @@ package body Exp_Ch6 is
Add_Call_By_Copy_Code;
end if;
-- RM 3.2.4 (23/3) : A predicate is checked on in-out and out
-- RM 3.2.4 (23/3): A predicate is checked on in-out and out
-- by-reference parameters on exit from the call. If the actual
-- is a derived type and the operation is inherited, the body
-- of the operation will not contain a call to the predicate
@ -1732,28 +1733,33 @@ package body Exp_Ch6 is
-- for subtype conversion on assignment, but we can generate the
-- required check now.
-- Note that this is needed only if the subtype of the actual has
-- an explicit predicate aspect, not if it inherits them from a
-- base type or ancestor. The check is also superfluous if the
-- subtype is elaborated before the body of the subprogram, but
-- this is harder to verify, and there may be a redundant check.
-- Note also that Subp may be either a subprogram entity for
-- direct calls, or a type entity for indirect calls, which must
-- be handled separately because the name does not denote an
-- overloadable entity.
if not Is_Init_Proc (Subp)
and then (Has_Aspect (E_Actual, Aspect_Predicate)
or else
Has_Aspect (E_Actual, Aspect_Dynamic_Predicate)
or else
Has_Aspect (E_Actual, Aspect_Static_Predicate))
and then Present (Predicate_Function (E_Actual))
then
Append_To (Post_Call,
Make_Predicate_Check (E_Actual, Actual));
end if;
declare
Aund : constant Entity_Id := Underlying_Type (E_Actual);
Atyp : Entity_Id;
begin
if No (Aund) then
Atyp := E_Actual;
else
Atyp := Aund;
end if;
if Has_Predicates (Atyp)
and then Present (Predicate_Function (Atyp))
-- Skip predicate checks for special cases
and then not No_Predicate_Test_On_Arguments (Subp)
then
Append_To (Post_Call,
Make_Predicate_Check (Atyp, Actual));
end if;
end;
-- Processing for IN parameters

View File

@ -71,8 +71,8 @@ procedure Frontend is
Config_Pragmas : List_Id;
-- Gather configuration pragmas
function Need_To_Be_In_The_Dependencies (Pragma_List : List_Id)
return Boolean;
function Need_To_Be_In_The_Dependencies
(Pragma_List : List_Id) return Boolean;
-- Check if a configuration pragmas file that contains the Pragma_List
-- should be a dependency for the source being compiled. Returns
-- False if Pragma_List is Error_List or contains only pragmas
@ -82,11 +82,12 @@ procedure Frontend is
-- Need_To_Be_In_The_Dependencies --
------------------------------------
function Need_To_Be_In_The_Dependencies (Pragma_List : List_Id)
return Boolean
function Need_To_Be_In_The_Dependencies
(Pragma_List : List_Id) return Boolean
is
Prag : Node_Id;
Pname : Name_Id;
begin
if Pragma_List /= Error_List then
Prag := First (Pragma_List);
@ -104,6 +105,8 @@ procedure Frontend is
return False;
end Need_To_Be_In_The_Dependencies;
-- Start of processing for Frontend
begin
-- Carry out package initializations. These are initializations which might
-- logically be performed at elaboration time, were it not for the fact
@ -272,7 +275,8 @@ begin
declare
Pragma_List : constant List_Id :=
Par (Configuration_Pragmas => True);
Par (Configuration_Pragmas => True);
begin
if Need_To_Be_In_The_Dependencies (Pragma_List) then
Prepcomp.Add_Dependency (Source_Config_File);

View File

@ -12319,24 +12319,29 @@ directory is searched for a file whose name is @file{gnat.adc}. If
this file is present, it is expected to contain one or more
configuration pragmas that will be applied to the current compilation.
However, if the switch @option{-gnatA} is used, @file{gnat.adc} is not
considered.
considered. When taken into account, @file{gnat.adc} is added to the
dependencies, so that if @file{gnat.adc} is modified later, an invocation of
@command{gnatmake} will recompile the source.
Configuration pragmas may be entered into the @file{gnat.adc} file
either by running @code{gnatchop} on a source file that consists only of
configuration pragmas, or more conveniently by
direct editing of the @file{gnat.adc} file, which is a standard format
source file.
configuration pragmas, or more conveniently by direct editing of the
@file{gnat.adc} file, which is a standard format source file.
In addition to @file{gnat.adc}, additional files containing configuration
pragmas may be applied to the current compilation using the switch
@option{-gnatec}@var{path}. @var{path} must designate an existing file that
@option{-gnatec=}@var{path}. @var{path} must designate an existing file that
contains only configuration pragmas. These configuration pragmas are
in addition to those found in @file{gnat.adc} (provided @file{gnat.adc}
is present and switch @option{-gnatA} is not used).
It is allowed to specify several switches @option{-gnatec}, all of which
It is allowable to specify several switches @option{-gnatec=}, all of which
will be taken into account.
Files containing configuration pragmas specified with switches
@option{-gnatec=} are added to the dependencies, unless they contain
only pragmas Source_File_Name_Project.
If you are using project file, a separate mechanism is provided using
project attributes, see @ref{Specifying Configuration Pragmas} for more
details.

View File

@ -141,7 +141,7 @@ package body Prj is
while Last + S'Length > To'Last loop
declare
New_Buffer : constant String_Access :=
new String (1 .. 2 * Last);
new String (1 .. 2 * To'Length);
begin
New_Buffer (1 .. Last) := To (1 .. Last);

View File

@ -1055,6 +1055,10 @@ package body Sem_Aggr is
-- formal parameter. Consequently we also need to test for
-- N_Procedure_Call_Statement or N_Function_Call.
-- The context may be an N_Reference node, created by expansion.
-- Legality of the others clause was established in the source,
-- so the context is legal.
Set_Etype (N, Aggr_Typ); -- May be overridden later on
if Pkind = N_Assignment_Statement
@ -1070,6 +1074,7 @@ package body Sem_Aggr is
Pkind = N_Component_Declaration or else
Pkind = N_Parameter_Specification or else
Pkind = N_Qualified_Expression or else
Pkind = N_Reference or else
Pkind = N_Aggregate or else
Pkind = N_Extension_Aggregate or else
Pkind = N_Component_Association))

View File

@ -3493,7 +3493,21 @@ package body Sem_Ch3 is
-- early usage within E is properly diagnosed.
Set_Etype (Id, T);
Resolve (E, T);
-- If the expression is an aggregate we must look ahead to detect
-- the possible presence of an address clause, and defer resolution
-- and expansion of the aggregate to the freeze point of the entity.
if Comes_From_Source (N)
and then Expander_Active
and then Has_Following_Address_Clause (N)
and then Nkind (E) = N_Aggregate
then
Set_Etype (E, T);
else
Resolve (E, T);
end if;
-- No further action needed if E is a call to an inlined function
-- which returns an unconstrained type and it has been expanded into

View File

@ -4044,35 +4044,29 @@ package body Sem_Res is
return;
end if;
-- Apply appropriate range checks for in, out, and in-out
-- parameters. Out and in-out parameters also need a separate
-- check, if there is a type conversion, to make sure the return
-- value meets the constraints of the variable before the
-- conversion.
-- Gigi looks at the check flag and uses the appropriate types.
-- For now since one flag is used there is an optimization which
-- might not be done in the In Out case since Gigi does not do
-- any analysis. More thought required about this ???
-- Apply appropriate constraint/predicate checks for IN [OUT] case
if Ekind_In (F, E_In_Parameter, E_In_Out_Parameter) then
-- Apply predicate checks, unless this is a call to the
-- predicate check function itself, which would cause an
-- infinite recursion, or it is a call to an initialization
-- procedure whose operand is of course an unfinished object.
-- Apply predicate tests except in certain special cases. Note
-- that it might be more consistent to apply these only when
-- expansion is active (in Exp_Ch6.Expand_Actuals), as we do
-- for the outbound predicate tests.
if not (Ekind (Nam) = E_Function
and then (Is_Predicate_Function (Nam)
or else
Is_Predicate_Function_M (Nam)))
and then not Is_Init_Proc (Nam)
then
if not No_Predicate_Test_On_Arguments (Nam) then
Apply_Predicate_Check (A, F_Typ);
end if;
-- Apply required constraint checks
-- Gigi looks at the check flag and uses the appropriate types.
-- For now since one flag is used there is an optimization
-- which might not be done in the IN OUT case since Gigi does
-- not do any analysis. More thought required about this ???
-- In fact is this comment obsolete??? doesn't the expander now
-- generate all these tests anyway???
if Is_Scalar_Type (Etype (A)) then
Apply_Scalar_Range_Check (A, F_Typ);
@ -4138,7 +4132,13 @@ package body Sem_Res is
end if;
end if;
-- Checks for OUT parameters and IN OUT parameters
if Ekind_In (F, E_Out_Parameter, E_In_Out_Parameter) then
-- If there is a type conversion, to make sure the return value
-- meets the constraints of the variable before the conversion.
if Nkind (A) = N_Type_Conversion then
if Is_Scalar_Type (A_Typ) then
Apply_Scalar_Range_Check
@ -4148,6 +4148,9 @@ package body Sem_Res is
(Expression (A), Etype (Expression (A)), A_Typ);
end if;
-- If no conversion apply scalar range checks and length checks
-- base on the subtype of the actual (NOT that of the formal).
else
if Is_Scalar_Type (F_Typ) then
Apply_Scalar_Range_Check (A, A_Typ, F_Typ);
@ -4159,6 +4162,10 @@ package body Sem_Res is
Apply_Range_Check (A, A_Typ, F_Typ);
end if;
end if;
-- Note: we do not apply the predicate checks for the case of
-- OUT and IN OUT parameters. They are instead applied in the
-- Expand_Actuals routine in Exp_Ch6.
end if;
-- An actual associated with an access parameter is implicitly

View File

@ -13785,6 +13785,44 @@ package body Sem_Util is
Actual_Id := Next_Actual (Actual_Id);
end Next_Actual;
------------------------------------
-- No_Predicate_Test_On_Arguments --
------------------------------------
function No_Predicate_Test_On_Arguments (Subp : Entity_Id) return Boolean is
begin
-- Do not test predicates on call to generated default Finalize, since
-- we are not interested in whether something we are finalizing (and
-- typically destroying) satisfies its predicates.
if Chars (Subp) = Name_Finalize
and then not Comes_From_Source (Subp)
then
return True;
-- Do not test predicates on call to Init_Proc, since if needed the
-- predicate test will occur at some other point.
elsif Is_Init_Proc (Subp) then
return True;
-- Do not test predicates on call to predicate function, since this
-- would cause infinite recursion.
elsif Ekind (Subp) = E_Function
and then (Is_Predicate_Function (Subp)
or else
Is_Predicate_Function_M (Subp))
then
return True;
-- For now, no other cases
else
return False;
end if;
end No_Predicate_Test_On_Arguments;
---------------------
-- No_Scalar_Parts --
---------------------

View File

@ -1582,6 +1582,11 @@ package Sem_Util is
-- Note that the result produced is always an expression, not a parameter
-- association node, even if named notation was used.
function No_Predicate_Test_On_Arguments (Subp : Entity_Id) return Boolean;
-- Subp is the entity for a subprogram call. This function returns True to
-- eliminate predicate tests on the input or output arguments in a call to
-- this subprogram. See body for exact cases currently covered.
function No_Scalar_Parts (T : Entity_Id) return Boolean;
-- Tests if type T can be determined at compile time to have no scalar
-- parts in the sense of the Valid_Scalars attribute. Returns True if