[multiple changes]

2013-01-03  Emmanuel Briot  <briot@adacore.com>

	* xref_lib.adb (Parse_Identifier_Info): Fix handling of arrays, which
	have information in the ALI file for both the index and the component
	types.

2013-01-03  Emmanuel Briot  <briot@adacore.com>

	* projects.texi: Fix error in documenting the project path
	computed for an aggregate project.

2013-01-03  Javier Miranda  <miranda@adacore.com>

	* sem_warn.adb (Warn_On_Overlapping_Actuals): Adding documentation
	plus restricting the functionality of this routine to cover the
	cases described in the Ada 2012 reference manual. The previous
	extended support is now available under -gnatX.
	* s-tassta.adb (Finalize_Global_Tasks): Addition of a dummy
	variable to call Timed_Sleep.  Required to avoid warning on
	overlapping out-mode actuals.
	* opt.ads (Extensions_Allowed): Update documentation.

2013-01-03  Tristan Gingold  <gingold@adacore.com>

	* s-arit64.ads: Use Multiply_With_Ovflo_Check as __gnat_mulv64.
	* arit64.c: Removed
	* gcc-interface/Makefile.in: Remove reference to arit64.c.

2013-01-03  Thomas Quinot  <quinot@adacore.com>

	* checks.adb, checks.ads (Apply_Address_Clause_Check): The check must
	be generated at the start of the freeze actions for the entity, not
	before (or after) the freeze node.

2013-01-03  Thomas Quinot  <quinot@adacore.com>

	* exp_aggr.adb (Exp_Aggr.Convert_Aggregate_In_Obj_Decl):
	Reorganize code to capture initialization statements in a block,
	so that freeze nodes are excluded from the captured block.

From-SVN: r194848
This commit is contained in:
Arnaud Charlet 2013-01-03 12:05:20 +01:00
parent 02217452f0
commit 6f5c2c4b49
12 changed files with 193 additions and 127 deletions

View File

@ -1,3 +1,43 @@
2013-01-03 Emmanuel Briot <briot@adacore.com>
* xref_lib.adb (Parse_Identifier_Info): Fix handling of arrays, which
have information in the ALI file for both the index and the component
types.
2013-01-03 Emmanuel Briot <briot@adacore.com>
* projects.texi: Fix error in documenting the project path
computed for an aggregate project.
2013-01-03 Javier Miranda <miranda@adacore.com>
* sem_warn.adb (Warn_On_Overlapping_Actuals): Adding documentation
plus restricting the functionality of this routine to cover the
cases described in the Ada 2012 reference manual. The previous
extended support is now available under -gnatX.
* s-tassta.adb (Finalize_Global_Tasks): Addition of a dummy
variable to call Timed_Sleep. Required to avoid warning on
overlapping out-mode actuals.
* opt.ads (Extensions_Allowed): Update documentation.
2013-01-03 Tristan Gingold <gingold@adacore.com>
* s-arit64.ads: Use Multiply_With_Ovflo_Check as __gnat_mulv64.
* arit64.c: Removed
* gcc-interface/Makefile.in: Remove reference to arit64.c.
2013-01-03 Thomas Quinot <quinot@adacore.com>
* checks.adb, checks.ads (Apply_Address_Clause_Check): The check must
be generated at the start of the freeze actions for the entity, not
before (or after) the freeze node.
2013-01-03 Thomas Quinot <quinot@adacore.com>
* exp_aggr.adb (Exp_Aggr.Convert_Aggregate_In_Obj_Decl):
Reorganize code to capture initialization statements in a block,
so that freeze nodes are excluded from the captured block.
2013-01-03 Thomas Quinot <quinot@adacore.com>
* exp_ch11.adb: Minor reformatting.

View File

@ -1,57 +0,0 @@
/****************************************************************************
* *
* GNAT COMPILER COMPONENTS *
* *
* A R I T 6 4 . C *
* *
* C Implementation File *
* *
* Copyright (C) 2009-2012, Free Software Foundation, Inc. *
* *
* 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- *
* ware Foundation; either version 3, or (at your option) any later ver- *
* sion. GNAT is distributed in the hope that it will be useful, but WITH- *
* OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. *
* *
* As a special exception under Section 7 of GPL version 3, you are granted *
* additional permissions described in the GCC Runtime Library Exception, *
* version 3.1, as published by the Free Software Foundation. *
* *
* You should have received a copy of the GNU General Public License and *
* a copy of the GCC Runtime Library Exception along with this program; *
* see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
* <http://www.gnu.org/licenses/>. *
* *
* GNAT was originally developed by the GNAT team at New York University. *
* Extensive contributions were provided by Ada Core Technologies Inc. *
* *
****************************************************************************/
extern void __gnat_rcheck_CE_Overflow_Check(char *file, int line)
__attribute__ ((__noreturn__));
long long int __gnat_mulv64 (long long int x, long long int y)
{
unsigned neg = (x >= 0) ^ (y >= 0);
long long unsigned xa = x >= 0 ? (long long unsigned) x
: -(long long unsigned) x;
long long unsigned ya = y >= 0 ? (long long unsigned) y
: -(long long unsigned) y;
unsigned xhi = (unsigned) (xa >> 32);
unsigned yhi = (unsigned) (ya >> 32);
unsigned xlo = (unsigned) xa;
unsigned ylo = (unsigned) ya;
long long unsigned mid
= xhi ? (long long unsigned) xhi * (long long unsigned) ylo
: (long long unsigned) yhi * (long long unsigned) xlo;
long long unsigned low = (long long unsigned) xlo * (long long unsigned) ylo;
if ((xhi && yhi) || mid + (low >> 32) > 0x7fffffff + neg)
__gnat_rcheck_CE_Overflow_Check (__FILE__, __LINE__);
low += ((long long unsigned) (unsigned) mid) << 32;
return (long long int) (neg ? -low : low);
}

View File

@ -575,6 +575,8 @@ package body Checks is
--------------------------------
procedure Apply_Address_Clause_Check (E : Entity_Id; N : Node_Id) is
pragma Assert (Nkind (N) = N_Freeze_Entity);
AC : constant Node_Id := Address_Clause (E);
Loc : constant Source_Ptr := Sloc (AC);
Typ : constant Entity_Id := Etype (E);
@ -734,7 +736,11 @@ package body Checks is
Remove_Side_Effects (Expr);
end if;
Insert_After_And_Analyze (N,
if No (Actions (N)) then
Set_Actions (N, New_List);
end if;
Prepend_To (Actions (N),
Make_Raise_Program_Error (Loc,
Condition =>
Make_Op_Ne (Loc,
@ -748,8 +754,8 @@ package body Checks is
Prefix => New_Occurrence_Of (E, Loc),
Attribute_Name => Name_Alignment)),
Right_Opnd => Make_Integer_Literal (Loc, Uint_0)),
Reason => PE_Misaligned_Address_Value),
Suppress => All_Checks);
Reason => PE_Misaligned_Address_Value));
Analyze (First (Actions (N)), Suppress => All_Checks);
return;
end if;

View File

@ -131,8 +131,11 @@ package Checks is
-- are enabled, then this procedure generates a check that the specified
-- address has an alignment consistent with the alignment of the object,
-- raising PE if this is not the case. The resulting check (if one is
-- generated) is inserted before node N. check is also made for the case of
-- a clear overlay situation that the size of the overlaying object is not
-- generated) is prepended to the Actions list of N_Freeze_Entity node N.
-- Note that the check references E'Alignment, so it cannot be emitted
-- before N (its freeze node), otherwise this would cause an illegal
-- access before elaboration error in GIGI. For the case of a clear overlay
-- situation, we also check that the size of the overlaying object is not
-- larger than the overlaid object.
procedure Apply_Arithmetic_Overflow_Check (N : Node_Id);

View File

@ -3012,8 +3012,6 @@ package body Exp_Aggr is
Loc : constant Source_Ptr := Sloc (Aggr);
Typ : constant Entity_Id := Etype (Aggr);
Occ : constant Node_Id := New_Occurrence_Of (Obj, Loc);
Blk : Node_Id := Empty;
Ins : Node_Id;
function Discriminants_Ok return Boolean;
-- If the object type is constrained, the discriminants in the
@ -3118,27 +3116,39 @@ package body Exp_Aggr is
(Aggr,
Sec_Stack =>
Is_Controlled (Typ) or else Has_Controlled_Component (Typ));
Ins := N;
end if;
-- Need to Set_Initialization_Statements??? (see below)
declare
Node_After : constant Node_Id := Next (N);
Init_Node : Node_Id;
Blk : Node_Id;
Init_Actions : constant List_Id := New_List;
begin
Insert_Actions_After (N, Late_Expansion (Aggr, Typ, Occ));
-- Move inserted, analyzed actions to Init_Actions, but skip over
-- freeze nodes as these need to remain in the proper scope.
Init_Node := N;
while Next (Init_Node) /= Node_After loop
if Nkind (Next (Init_Node)) = N_Freeze_Entity then
Next (Init_Node);
else
-- Capture initialization statements within an identified block
-- statement, as we might need to move them to the freeze actions
-- of Obj later on if a representation clause (such as an address
-- clause) makes it necessary to delay freezing.
Append_To (Init_Actions, Remove_Next (Init_Node));
end if;
end loop;
Ins := Make_Null_Statement (Loc);
if not Is_Empty_List (Init_Actions) then
Blk := Make_Block_Statement (Loc,
Declarations => New_List,
Handled_Statement_Sequence =>
Make_Handled_Sequence_Of_Statements (Loc,
Statements => New_List (Ins)));
Insert_Action_After (N, Blk);
Statements => Init_Actions));
Insert_Action_After (Init_Node, Blk);
Set_Initialization_Statements (Obj, Blk);
end if;
Insert_Actions_After (Ins, Late_Expansion (Aggr, Typ, Occ));
end;
Set_No_Initialization (N);
Initialize_Discriminants (N, Typ);
end Convert_Aggr_In_Object_Decl;

View File

@ -2308,7 +2308,7 @@ endif
# LIBGNAT_SRCS is the list of all C files (including headers) of the runtime
# library. LIBGNAT_OBJS is the list of object files for libgnat.
# thread.c is special as put into GNATRTL_TASKING_OBJS by Makefile.rtl
LIBGNAT_OBJS = adadecode.o adaint.o argv.o arit64.o aux-io.o \
LIBGNAT_OBJS = adadecode.o adaint.o argv.o aux-io.o \
cal.o cio.o cstreams.o ctrl_c.o \
env.o errno.o exit.o expect.o final.o \
init.o initialize.o locales.o mkdir.o \

View File

@ -563,7 +563,7 @@ package Opt is
Extensions_Allowed : Boolean := False;
-- GNAT
-- Set to True by switch -gnatX if GNAT specific language extensions
-- are allowed. Currently there are no such defined extensions.
-- are allowed.
type External_Casing_Type is (
As_Is, -- External names cased as they appear in the Ada source

View File

@ -2514,11 +2514,17 @@ project files specified with @code{Project_Files}.
Each aggregate project has its own (that is if agg1.gpr includes
agg2.gpr, they can potentially both have a different project path).
This project path is defined as the concatenation, in that order, of
the current directory, followed by the command line -aP switches,
then the directories from the Project_Path attribute, then the
directories from the GPR_PROJECT_PATH and ADA_PROJECT_PATH env.
variables, and finally the predefined directories.
This project path is defined as the concatenation, in that order, of:
@itemize @bullet
@item the current directory;
@item followed by the command line -aP switches;
@item then the directories from the GPR_PROJECT_PATH and ADA_PROJECT_PATH environment
variables;
@item then the directories from the Project_Path attribute;
@item and finally the predefined directories.
@end itemize
In the example above, agg2.gpr's project path is not influenced by
the attribute agg1'Project_Path, nor is agg1 influenced by

View File

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
-- --
-- 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- --
@ -33,6 +33,9 @@
-- signed integer values in cases where either overflow checking is
-- required, or intermediate results are longer than 64 bits.
pragma Restrictions (No_Elaboration_Code);
-- Allow direct call from gigi generated code
with Interfaces;
package System.Arith_64 is
@ -49,8 +52,10 @@ package System.Arith_64 is
-- bits, otherwise returns the 64-bit signed integer difference.
function Multiply_With_Ovflo_Check (X, Y : Int64) return Int64;
pragma Export (C, Multiply_With_Ovflo_Check, "__gnat_mulv64");
-- Raises Constraint_Error if product of operands overflows 64
-- bits, otherwise returns the 64-bit signed integer product.
-- GIGI may also call this routine directly.
procedure Scaled_Divide
(X, Y, Z : Int64;

View File

@ -806,8 +806,9 @@ package body System.Tasking.Stages is
procedure Finalize_Global_Tasks is
Self_ID : constant Task_Id := STPO.Self;
Ignore : Boolean;
pragma Unreferenced (Ignore);
Ignore_1 : Boolean;
Ignore_2 : Boolean;
pragma Unreferenced (Ignore_1, Ignore_2);
function State
(Int : System.Interrupt_Management.Interrupt_ID) return Character;
@ -877,7 +878,7 @@ package body System.Tasking.Stages is
Timed_Sleep
(Self_ID, 0.01, System.OS_Primitives.Relative,
Self_ID.Common.State, Ignore, Ignore);
Self_ID.Common.State, Ignore_1, Ignore_2);
end loop;
end if;
@ -886,7 +887,7 @@ package body System.Tasking.Stages is
Timed_Sleep
(Self_ID, 0.01, System.OS_Primitives.Relative,
Self_ID.Common.State, Ignore, Ignore);
Self_ID.Common.State, Ignore_1, Ignore_2);
Unlock (Self_ID);

View File

@ -3292,41 +3292,89 @@ package body Sem_Warn is
Act1, Act2 : Node_Id;
Form1, Form2 : Entity_Id;
function Is_Covered_Formal (Formal : Node_Id) return Boolean;
-- Return True if Formal is covered by the Ada 2012 rule. Under -gnatX
-- the rule is extended to cover record and array types.
function Refer_Same_Object (Act1, Act2 : Node_Id) return Boolean;
-- Two names are known to refer to the same object if the two names
-- are known to denote the same object; or one of the names is a
-- selected_component, indexed_component, or slice and its prefix is
-- known to refer to the same object as the other name; or one of the
-- two names statically denotes a renaming declaration whose renamed
-- object_name is known to refer to the same object as the other name
-- (RM 6.4.1(6.11/3))
-----------------------
-- Refer_Same_Object --
-----------------------
function Refer_Same_Object (Act1, Act2 : Node_Id) return Boolean is
begin
if not Warn_On_Overlap then
return Denotes_Same_Object (Act1, Act2)
or else Denotes_Same_Prefix (Act1, Act2);
end Refer_Same_Object;
-----------------------
-- Is_Covered_Formal --
-----------------------
function Is_Covered_Formal (Formal : Node_Id) return Boolean is
begin
-- Ada 2012 rule
if not Extensions_Allowed then
return
Ekind_In (Formal, E_Out_Parameter,
E_In_Out_Parameter)
and then Is_Elementary_Type (Etype (Formal));
-- Under -gnatX the rule is extended to cover array and record types
else
return
Ekind_In (Formal, E_Out_Parameter,
E_In_Out_Parameter)
and then (Is_Elementary_Type (Etype (Formal))
or else Is_Record_Type (Etype (Formal))
or else Is_Array_Type (Etype (Formal)));
end if;
end Is_Covered_Formal;
begin
if Ada_Version < Ada_2012 and then not Warn_On_Overlap then
return;
end if;
-- Exclude calls rewritten as enumeration literals
if Nkind (N) not in N_Subprogram_Call then
return;
end if;
-- Exclude calls to library subprograms. Container operations specify
-- safe behavior when source and target coincide.
if Is_Predefined_File_Name
(Unit_File_Name (Get_Source_Unit (Sloc (Subp))))
if Nkind (N) not in N_Subprogram_Call
and then Nkind (N) /= N_Entry_Call_Statement
then
return;
end if;
-- If a call C has two or more parameters of mode in out or out that are
-- of an elementary type, then the call is legal only if for each name
-- N that is passed as a parameter of mode in out or out to the call C,
-- there is no other name among the other parameters of mode in out or
-- out to C that is known to denote the same object (RM 6.4.1(6.15/3))
-- Under -gnatX the rule is extended to cover array and record types.
Form1 := First_Formal (Subp);
Act1 := First_Actual (N);
while Present (Form1) and then Present (Act1) loop
if Ekind (Form1) /= E_In_Parameter then
if Is_Covered_Formal (Form1) then
Form2 := First_Formal (Subp);
Act2 := First_Actual (N);
while Present (Form2) and then Present (Act2) loop
if Form1 /= Form2
and then Ekind (Form2) /= E_Out_Parameter
and then
(Denotes_Same_Object (Act1, Act2)
or else
Denotes_Same_Prefix (Act1, Act2))
and then Is_Covered_Formal (Form2)
and then Refer_Same_Object (Act1, Act2)
then
-- Exclude generic types and guard against previous errors
-- Guard against previous errors
if Error_Posted (N)
or else No (Etype (Act1))
@ -3334,12 +3382,6 @@ package body Sem_Warn is
then
null;
elsif Is_Generic_Type (Etype (Act1))
or else
Is_Generic_Type (Etype (Act2))
then
null;
-- If the actual is a function call in prefix notation,
-- there is no real overlap.
@ -3350,11 +3392,20 @@ package body Sem_Warn is
-- intended.
elsif
Is_By_Reference_Type (Underlying_Type (Etype (Form1)))
Present (Underlying_Type (Etype (Form1)))
and then
(Is_By_Reference_Type (Underlying_Type (Etype (Form1)))
or else
Convention (Underlying_Type (Etype (Form1)))
= Convention_Ada_Pass_By_Reference)
then
null;
-- Here we may need to issue message
else
Error_Msg_Warn := Ada_Version < Ada_2012;
declare
Act : Node_Id;
Form : Entity_Id;

View File

@ -925,10 +925,11 @@ package body Xref_Lib is
end;
end if;
if Ali (Ptr) = '<'
while Ptr <= Ali'Last
and then (Ali (Ptr) = '<'
or else Ali (Ptr) = '('
or else Ali (Ptr) = '{'
then
or else Ali (Ptr) = '{')
loop
-- Here we have a type derivation information. The format is
-- <3|12I45> which means that the current entity is derived from the
-- type defined in unit number 3, line 12 column 45. The pipe and
@ -1065,7 +1066,7 @@ package body Xref_Lib is
end loop;
Ptr := Ptr + 1;
end if;
end if;
end loop;
-- To find the body, we will have to parse the file too