aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2017-05-02 11:06:41 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2017-05-02 11:06:41 +0200
commitd6fd1f07ac1f21f0dd84202088102b7b77bcd104 (patch)
tree090074251d194c3bc6f75ede05214292ce38ebfa
parent2d249f52b53c9c4b0d6fdbd1490f3871d1df5d40 (diff)
downloadgcc-d6fd1f07ac1f21f0dd84202088102b7b77bcd104.zip
gcc-d6fd1f07ac1f21f0dd84202088102b7b77bcd104.tar.gz
gcc-d6fd1f07ac1f21f0dd84202088102b7b77bcd104.tar.bz2
[multiple changes]
2017-05-02 Bob Duff <duff@adacore.com> * sem_attr.adb (Attribute_Enum_Rep): Disallow T'Enum_Rep. 2017-05-02 Vasiliy Fofanov <fofanov@adacore.com> * s-os_lib.ads: Minor typo fix. 2017-05-02 Vasiliy Fofanov <fofanov@adacore.com> * gnatls.adb: Merge and refactor code from Prj.Env and remove this deprecated dependency. 2017-05-02 Ed Schonberg <schonberg@adacore.com> * exp_util.ads: minor comment addition. 2017-05-02 Eric Botcazou <ebotcazou@adacore.com> * sem_ch3.adb (Build_Derived_Record_Type): Fix a few typos and pastos in part #3 of the head comment. 2017-05-02 Ed Schonberg <schonberg@adacore.com> * exp_ch3.adb (Freeze_Type): Do not generate an invariant procedure body for a local (sub)type declaration within a predicate function. Invariant checks do not apply to these, and the expansion of the procedure will happen in the wrong scope, leading to misplaced freeze nodes. 2017-05-02 Ed Schonberg <schonberg@adacore.com> * exp_util.adb (Insert_Library_Level_Action): Use proper scope to analyze generated actions. If the main unit is a body, the required scope is that of the corresponding unit declaration. 2017-05-02 Arnaud Charlet <charlet@adacore.com> * einfo.adb (Declaration_Node): flip branches of an IF statement to avoid repeated negations in its condition; no change in semantics, only to improve readability. From-SVN: r247480
-rw-r--r--gcc/ada/ChangeLog42
-rw-r--r--gcc/ada/einfo.adb12
-rw-r--r--gcc/ada/exp_ch3.adb13
-rw-r--r--gcc/ada/exp_util.adb6
-rw-r--r--gcc/ada/exp_util.ads4
-rw-r--r--gcc/ada/gnatls.adb493
-rw-r--r--gcc/ada/s-os_lib.ads4
-rw-r--r--gcc/ada/sem_attr.adb14
-rw-r--r--gcc/ada/sem_ch3.adb14
9 files changed, 556 insertions, 46 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index f91a3eb..77477d4 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,45 @@
+2017-05-02 Bob Duff <duff@adacore.com>
+
+ * sem_attr.adb (Attribute_Enum_Rep): Disallow T'Enum_Rep.
+
+2017-05-02 Vasiliy Fofanov <fofanov@adacore.com>
+
+ * s-os_lib.ads: Minor typo fix.
+
+2017-05-02 Vasiliy Fofanov <fofanov@adacore.com>
+
+ * gnatls.adb: Merge and refactor code from Prj.Env and remove
+ this deprecated dependency.
+
+2017-05-02 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_util.ads: minor comment addition.
+
+2017-05-02 Eric Botcazou <ebotcazou@adacore.com>
+
+ * sem_ch3.adb (Build_Derived_Record_Type): Fix a few typos and
+ pastos in part #3 of the head comment.
+
+2017-05-02 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch3.adb (Freeze_Type): Do not generate an invariant
+ procedure body for a local (sub)type declaration within a
+ predicate function. Invariant checks do not apply to these, and
+ the expansion of the procedure will happen in the wrong scope,
+ leading to misplaced freeze nodes.
+
+2017-05-02 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_util.adb (Insert_Library_Level_Action): Use proper scope
+ to analyze generated actions. If the main unit is a body,
+ the required scope is that of the corresponding unit declaration.
+
+2017-05-02 Arnaud Charlet <charlet@adacore.com>
+
+ * einfo.adb (Declaration_Node): flip branches of
+ an IF statement to avoid repeated negations in its condition;
+ no change in semantics, only to improve readability.
+
2017-05-02 Arnaud Charlet <charlet@adacore.com>
* sem_case.adb: Remove extra spaces in parameter declarations.
diff --git a/gcc/ada/einfo.adb b/gcc/ada/einfo.adb
index 76ab625..2d283db 100644
--- a/gcc/ada/einfo.adb
+++ b/gcc/ada/einfo.adb
@@ -7117,15 +7117,13 @@ package body Einfo is
end if;
loop
- if Nkind (P) /= N_Selected_Component
- and then Nkind (P) /= N_Expanded_Name
- and then
- not (Nkind (P) = N_Defining_Program_Unit_Name
- and then Is_Child_Unit (Id))
+ if Nkind_In (P, N_Selected_Component, N_Expanded_Name)
+ or else (Nkind (P) = N_Defining_Program_Unit_Name
+ and then Is_Child_Unit (Id))
then
- return P;
- else
P := Parent (P);
+ else
+ return P;
end if;
end loop;
end Declaration_Node;
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index 899accd..6d9bdaa 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -7554,8 +7554,19 @@ package body Exp_Ch3 is
-- Non-interface types
+ -- Do not generate invariant procedure within other assertion
+ -- subprograms, which may involve local declarations of local
+ -- subtypes to which these checks don't apply.
+
elsif Has_Invariants (Def_Id) then
- Build_Invariant_Procedure_Body (Def_Id);
+ if Within_Internal_Subprogram
+ or else (Ekind (Current_Scope) = E_Function
+ and then Is_Predicate_Function (Current_Scope))
+ then
+ null;
+ else
+ Build_Invariant_Procedure_Body (Def_Id);
+ end if;
end if;
Restore_Ghost_Mode (Saved_GM);
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 1713ff6..8270ea5 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -7491,8 +7491,10 @@ package body Exp_Util is
Aux : constant Node_Id := Aux_Decls_Node (Cunit (Main_Unit));
begin
- Push_Scope (Cunit_Entity (Main_Unit));
- -- ??? should this be Current_Sem_Unit instead of Main_Unit?
+ Push_Scope (Cunit_Entity (Current_Sem_Unit));
+ -- And not Main_Unit as previously. If the main unit is a body,
+ -- the scope needed to analyze the actions is the entity of the
+ -- corresponding declaration.
if No (Actions (Aux)) then
Set_Actions (Aux, New_List (N));
diff --git a/gcc/ada/exp_util.ads b/gcc/ada/exp_util.ads
index 485374b..1873cb1 100644
--- a/gcc/ada/exp_util.ads
+++ b/gcc/ada/exp_util.ads
@@ -1177,7 +1177,9 @@ package Exp_Util is
function Within_Internal_Subprogram return Boolean;
-- Indicates that some expansion is taking place within the body of a
-- predefined primitive operation. Some expansion activity (e.g. predicate
- -- checks) is disabled in such.
+ -- checks) is disabled in such. Because we want to detect invalid uses
+ -- of function calls within predicates (which lead to infinite recursion)
+ -- predicate functions themselves are not considered internal here.
private
pragma Inline (Duplicate_Subexpr);
diff --git a/gcc/ada/gnatls.adb b/gcc/ada/gnatls.adb
index 10cc662..b31277b 100644
--- a/gcc/ada/gnatls.adb
+++ b/gcc/ada/gnatls.adb
@@ -23,6 +23,8 @@
-- --
------------------------------------------------------------------------------
+pragma Ada_2012;
+
with ALI; use ALI;
with ALI.Util; use ALI.Util;
with Binderr; use Binderr;
@@ -30,13 +32,12 @@ with Butil; use Butil;
with Csets; use Csets;
with Fname; use Fname;
with Gnatvsn; use Gnatvsn;
-with GNAT.OS_Lib; use GNAT.OS_Lib;
+with Makeutl; use Makeutl;
with Namet; use Namet;
with Opt; use Opt;
with Osint; use Osint;
with Osint.L; use Osint.L;
with Output; use Output;
-with Prj.Env; use Prj.Env;
with Rident; use Rident;
with Sdefault;
with Snames;
@@ -44,10 +45,10 @@ with Stringt;
with Switch; use Switch;
with Types; use Types;
-with Ada.Command_Line; use Ada.Command_Line;
-
-with GNAT.Command_Line; use GNAT.Command_Line;
-with GNAT.Case_Util; use GNAT.Case_Util;
+with GNAT.Case_Util; use GNAT.Case_Util;
+with GNAT.Command_Line; use GNAT.Command_Line;
+with GNAT.Directory_Operations; use GNAT.Directory_Operations;
+with GNAT.OS_Lib; use GNAT.OS_Lib;
procedure Gnatls is
pragma Ident (Gnat_Static_Version_String);
@@ -59,7 +60,7 @@ procedure Gnatls is
-- Label displayed in verbose mode before the directories in the project
-- search path. Do not modify without checking NOTE above.
- Prj_Path : Prj.Env.Project_Search_Path;
+ Prj_Path : String_Access;
Max_Column : constant := 80;
@@ -212,6 +213,46 @@ procedure Gnatls is
end GNATDIST;
+ ------------------------------
+ -- Support for project path --
+ ------------------------------
+
+ package Prj_Env is
+
+ procedure Initialize_Default_Project_Path
+ (Self : in out String_Access;
+ Target_Name : String;
+ Runtime_Name : String := "");
+ -- Initialize Self. It will then contain the default project path on
+ -- the given target and runtime (including directories specified by the
+ -- environment variables GPR_PROJECT_PATH_FILE, GPR_PROJECT_PATH and
+ -- ADA_PROJECT_PATH). If one of the directory or Target_Name is "-",
+ -- then the path contains only those directories specified by the
+ -- environment variables (except "-"). This does nothing if Self has
+ -- already been initialized.
+
+ procedure Add_Directories
+ (Self : in out String_Access;
+ Path : String;
+ Prepend : Boolean := False);
+ -- Add one or more directories to the path. Directories added with this
+ -- procedure are added in order after the current directory and before
+ -- the path given by the environment variable GPR_PROJECT_PATH. A value
+ -- of "-" will remove the default project directory from the project
+ -- path.
+ --
+ -- Calls to this subprogram must be performed before the first call to
+ -- Find_Project below, or PATH will be added at the end of the search
+ -- path.
+
+ function Get_Runtime_Path
+ (Self : String_Access;
+ Path : String) return String_Access;
+ -- Compute the full path for the project-based runtime name.
+ -- Path is simply searched on the project path.
+
+ end Prj_Env;
+
-----------------
-- Add_Lib_Dir --
-----------------
@@ -1187,6 +1228,412 @@ procedure Gnatls is
end if;
end Output_Unit;
+ package body Prj_Env is
+
+ Uninitialized_Prefix : constant String := '#' & Path_Separator;
+ -- Prefix to indicate that the project path has not been initialized
+ -- yet. Must be two characters long
+
+ ---------------------
+ -- Add_Directories --
+ ---------------------
+
+ procedure Add_Directories
+ (Self : in out String_Access;
+ Path : String;
+ Prepend : Boolean := False)
+ is
+ Tmp : String_Access;
+ begin
+ if Self = null then
+ Self := new String'(Uninitialized_Prefix & Path);
+ else
+ Tmp := Self;
+ if Prepend then
+ Self := new String'(Path & Path_Separator & Tmp.all);
+ else
+ Self := new String'(Tmp.all & Path_Separator & Path);
+ end if;
+ Free (Tmp);
+ end if;
+
+ end Add_Directories;
+
+ -------------------------------------
+ -- Initialize_Default_Project_Path --
+ -------------------------------------
+
+ procedure Initialize_Default_Project_Path
+ (Self : in out String_Access;
+ Target_Name : String;
+ Runtime_Name : String := "")
+ is
+ Add_Default_Dir : Boolean := Target_Name /= "-";
+ First : Positive;
+ Last : Positive;
+
+ Ada_Project_Path : constant String := "ADA_PROJECT_PATH";
+ Gpr_Project_Path : constant String := "GPR_PROJECT_PATH";
+ Gpr_Project_Path_File : constant String := "GPR_PROJECT_PATH_FILE";
+ -- Names of alternate env. variables that contain path name(s) of
+ -- directories where project files may reside. They are taken into
+ -- account in this order: GPR_PROJECT_PATH_FILE, GPR_PROJECT_PATH,
+ -- ADA_PROJECT_PATH.
+
+ Gpr_Prj_Path_File : String_Access;
+ Gpr_Prj_Path : String_Access;
+ Ada_Prj_Path : String_Access;
+ -- The path name(s) of directories where project files may reside.
+ -- May be empty.
+
+ Prefix : String_Ptr;
+ Runtime : String_Ptr;
+
+ procedure Add_Target (Suffix : String);
+ -- Add :<prefix>/<target>/Suffix to the project path
+
+ FD : File_Descriptor;
+ Len : Integer;
+
+ ----------------
+ -- Add_Target --
+ ----------------
+
+ procedure Add_Target (Suffix : String) is
+ Extra_Sep : constant String :=
+ (if Target_Name (Target_Name'Last) = '/' then
+ ""
+ else
+ (1 => Directory_Separator));
+ -- Note: Target_Name has a trailing / when it comes from Sdefault
+ begin
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Prefix.all & Target_Name & Extra_Sep & Suffix);
+ end Add_Target;
+
+ -- Start of processing for Initialize_Default_Project_Path
+
+ begin
+ if Self /= null
+ and then (Self'Length = 0
+ or else Self (Self'First) /= '#')
+ then
+ return;
+ end if;
+
+ -- The current directory is always first in the search path. Since
+ -- the Project_Path currently starts with '#:' as a sign that it
+ -- isn't initialized, we simply replace '#' with '.'
+
+ if Self = null then
+ Self := new String'('.' & Path_Separator);
+ else
+ Self (Self'First) := '.';
+ end if;
+
+ -- Then the reset of the project path (if any) currently contains the
+ -- directories added through Add_Search_Project_Directory
+
+ -- If environment variables are defined and not empty, add their
+ -- content
+
+ Gpr_Prj_Path_File := Getenv (Gpr_Project_Path_File);
+ Gpr_Prj_Path := Getenv (Gpr_Project_Path);
+ Ada_Prj_Path := Getenv (Ada_Project_Path);
+
+ if Gpr_Prj_Path_File.all /= "" then
+
+ FD := Open_Read (Gpr_Prj_Path_File.all, GNAT.OS_Lib.Text);
+
+ if FD = Invalid_FD then
+ Osint.Fail ("warning: could not read project path file """ &
+ Gpr_Prj_Path_File.all & """");
+ end if;
+
+ Len := Integer (File_Length (FD));
+
+ declare
+ Buffer : String (1 .. Len);
+ Index : Positive := 1;
+ Last : Positive;
+ Tmp : String_Access;
+
+ begin
+ -- Read the file
+
+ Len := Read (FD, Buffer (1)'Address, Len);
+ Close (FD);
+
+ -- Scan the file line by line
+
+ while Index < Buffer'Last loop
+
+ -- Find the end of line
+
+ Last := Index;
+ while Last <= Buffer'Last
+ and then Buffer (Last) /= ASCII.LF
+ and then Buffer (Last) /= ASCII.CR
+ loop
+ Last := Last + 1;
+ end loop;
+
+ -- Ignore empty lines
+
+ if Last > Index then
+ Tmp := Self;
+ Self :=
+ new String'
+ (Tmp.all & Path_Separator &
+ Buffer (Index .. Last - 1));
+ Free (Tmp);
+ end if;
+
+ -- Find the beginning of the next line
+
+ Index := Last;
+ while Buffer (Index) = ASCII.CR or else
+ Buffer (Index) = ASCII.LF
+ loop
+ Index := Index + 1;
+ end loop;
+ end loop;
+ end;
+
+ end if;
+
+ if Gpr_Prj_Path.all /= "" then
+ Add_Directories (Self, Gpr_Prj_Path.all);
+ end if;
+
+ Free (Gpr_Prj_Path);
+
+ if Ada_Prj_Path.all /= "" then
+ Add_Directories (Self, Ada_Prj_Path.all);
+ end if;
+
+ Free (Ada_Prj_Path);
+
+ -- Copy to Name_Buffer, since we will need to manipulate the path
+
+ Name_Len := Self'Length;
+ Name_Buffer (1 .. Name_Len) := Self.all;
+
+ -- Scan the directory path to see if "-" is one of the directories.
+ -- Remove each occurrence of "-" and set Add_Default_Dir to False.
+ -- Also resolve relative paths and symbolic links.
+
+ First := 3;
+ loop
+ while First <= Name_Len
+ and then (Name_Buffer (First) = Path_Separator)
+ loop
+ First := First + 1;
+ end loop;
+
+ exit when First > Name_Len;
+
+ Last := First;
+
+ while Last < Name_Len
+ and then Name_Buffer (Last + 1) /= Path_Separator
+ loop
+ Last := Last + 1;
+ end loop;
+
+ -- If the directory is "-", set Add_Default_Dir to False and
+ -- remove from path.
+
+ if Name_Buffer (First .. Last) = "-" then
+ Add_Default_Dir := False;
+
+ for J in Last + 1 .. Name_Len loop
+ Name_Buffer (J - 2) :=
+ Name_Buffer (J);
+ end loop;
+
+ Name_Len := Name_Len - 2;
+
+ -- After removing the '-', go back one character to get the
+ -- next directory correctly.
+
+ Last := Last - 1;
+
+ else
+ declare
+ New_Dir : constant String :=
+ Normalize_Pathname
+ (Name_Buffer (First .. Last),
+ Resolve_Links => Opt.Follow_Links_For_Dirs);
+ New_Len : Positive;
+ New_Last : Positive;
+
+ begin
+ -- If the absolute path was resolved and is different from
+ -- the original, replace original with the resolved path.
+
+ if New_Dir /= Name_Buffer (First .. Last)
+ and then New_Dir'Length /= 0
+ then
+ New_Len := Name_Len + New_Dir'Length - (Last - First + 1);
+ New_Last := First + New_Dir'Length - 1;
+ Name_Buffer (New_Last + 1 .. New_Len) :=
+ Name_Buffer (Last + 1 .. Name_Len);
+ Name_Buffer (First .. New_Last) := New_Dir;
+ Name_Len := New_Len;
+ Last := New_Last;
+ end if;
+ end;
+ end if;
+
+ First := Last + 1;
+ end loop;
+
+ Free (Self);
+
+ -- Set the initial value of Current_Project_Path
+
+ if Add_Default_Dir then
+ if Sdefault.Search_Dir_Prefix = null then
+
+ -- gprbuild case
+
+ Prefix := new String'(Executable_Prefix_Path);
+
+ else
+ Prefix := new String'(Sdefault.Search_Dir_Prefix.all
+ & ".." & Dir_Separator
+ & ".." & Dir_Separator
+ & ".." & Dir_Separator
+ & ".." & Dir_Separator);
+ end if;
+
+ if Prefix.all /= "" then
+ if Target_Name /= "" then
+
+ if Runtime_Name /= "" then
+ if Base_Name (Runtime_Name) = Runtime_Name then
+
+ -- $prefix/$target/$runtime/lib/gnat
+ Add_Target
+ (Runtime_Name & Directory_Separator &
+ "lib" & Directory_Separator & "gnat");
+
+ -- $prefix/$target/$runtime/share/gpr
+ Add_Target
+ (Runtime_Name & Directory_Separator &
+ "share" & Directory_Separator & "gpr");
+
+ else
+ Runtime :=
+ new String'(Normalize_Pathname (Runtime_Name));
+
+ -- $runtime_dir/lib/gnat
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Runtime.all & Directory_Separator &
+ "lib" & Directory_Separator & "gnat");
+
+ -- $runtime_dir/share/gpr
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Runtime.all & Directory_Separator &
+ "share" & Directory_Separator & "gpr");
+ end if;
+ end if;
+
+ -- $prefix/$target/lib/gnat
+ Add_Target
+ ("lib" & Directory_Separator & "gnat");
+
+ -- $prefix/$target/share/gpr
+ Add_Target
+ ("share" & Directory_Separator & "gpr");
+ end if;
+
+ -- $prefix/share/gpr
+
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Prefix.all & "share"
+ & Directory_Separator & "gpr");
+
+ -- $prefix/lib/gnat
+
+ Add_Str_To_Name_Buffer
+ (Path_Separator & Prefix.all & "lib"
+ & Directory_Separator & "gnat");
+ end if;
+
+ Free (Prefix);
+ end if;
+
+ Self := new String'(Name_Buffer (1 .. Name_Len));
+ end Initialize_Default_Project_Path;
+
+ -----------------------
+ -- Get_Runtime_Path --
+ -----------------------
+
+ function Get_Runtime_Path
+ (Self : String_Access;
+ Path : String) return String_Access
+ is
+ First : Natural;
+ Last : Natural;
+
+ begin
+
+ if Is_Absolute_Path (Path) then
+ if Is_Directory (Path) then
+ return new String'(Path);
+ else
+ return null;
+ end if;
+
+ else
+ -- Because we don't want to resolve symbolic links, we cannot
+ -- use Locate_Regular_File. So, we try each possible path
+ -- successively.
+
+ First := Self'First;
+ while First <= Self'Last loop
+ while First <= Self'Last
+ and then Self (First) = Path_Separator
+ loop
+ First := First + 1;
+ end loop;
+
+ exit when First > Self'Last;
+
+ Last := First;
+ while Last < Self'Last
+ and then Self (Last + 1) /= Path_Separator
+ loop
+ Last := Last + 1;
+ end loop;
+
+ Name_Len := 0;
+
+ if not Is_Absolute_Path (Self (First .. Last)) then
+ Add_Str_To_Name_Buffer (Get_Current_Dir); -- ??? System call
+ Add_Char_To_Name_Buffer (Directory_Separator);
+ end if;
+
+ Add_Str_To_Name_Buffer (Self (First .. Last));
+ Add_Char_To_Name_Buffer (Directory_Separator);
+ Add_Str_To_Name_Buffer (Path);
+
+ if Is_Directory (Name_Buffer (1 .. Name_Len)) then
+ return new String'(Name_Buffer (1 .. Name_Len));
+ end if;
+
+ First := Last + 1;
+ end loop;
+ end if;
+
+ return null;
+ end Get_Runtime_Path;
+
+ end Prj_Env;
+
-----------------
-- Reset_Print --
-----------------
@@ -1225,7 +1672,7 @@ procedure Gnatls is
if Src_Path /= null and then Lib_Path /= null then
Add_Search_Dirs (Src_Path, Include);
Add_Search_Dirs (Lib_Path, Objects);
- Initialize_Default_Project_Path
+ Prj_Env.Initialize_Default_Project_Path
(Prj_Path,
Target_Name => Sdefault.Target_Name.all,
Runtime_Name => Name);
@@ -1240,12 +1687,12 @@ procedure Gnatls is
-- Try to find the RTS on the project path. First setup the project path
- Initialize_Default_Project_Path
+ Prj_Env.Initialize_Default_Project_Path
(Prj_Path,
Target_Name => Sdefault.Target_Name.all,
Runtime_Name => Name);
- Rts_Full_Path := Get_Runtime_Path (Prj_Path, Name);
+ Rts_Full_Path := Prj_Env.Get_Runtime_Path (Prj_Path, Name);
if Rts_Full_Path /= null then
@@ -1330,7 +1777,7 @@ procedure Gnatls is
-- Processing for -aP<dir>
elsif Argv'Length > 3 and then Argv (1 .. 3) = "-aP" then
- Add_Directories (Prj_Path, Argv (4 .. Argv'Last));
+ Prj_Env.Add_Directories (Prj_Path, Argv (4 .. Argv'Last));
-- Processing for -nostdinc
@@ -1719,36 +2166,34 @@ begin
Write_Str (" <Current_Directory>");
Write_Eol;
- Initialize_Default_Project_Path
+ Prj_Env.Initialize_Default_Project_Path
(Prj_Path, Target_Name => Sdefault.Target_Name.all);
declare
- Project_Path : String_Access;
First : Natural;
Last : Natural;
begin
- Get_Path (Prj_Path, Project_Path);
- if Project_Path.all /= "" then
- First := Project_Path'First;
+ if Prj_Path.all /= "" then
+ First := Prj_Path'First;
loop
- while First <= Project_Path'Last
- and then (Project_Path (First) = Path_Separator)
+ while First <= Prj_Path'Last
+ and then (Prj_Path (First) = Path_Separator)
loop
First := First + 1;
end loop;
- exit when First > Project_Path'Last;
+ exit when First > Prj_Path'Last;
Last := First;
- while Last < Project_Path'Last
- and then Project_Path (Last + 1) /= Path_Separator
+ while Last < Prj_Path'Last
+ and then Prj_Path (Last + 1) /= Path_Separator
loop
Last := Last + 1;
end loop;
- if First /= Last or else Project_Path (First) /= '.' then
+ if First /= Last or else Prj_Path (First) /= '.' then
-- If the directory is ".", skip it as it is the current
-- directory and it is already the first directory in the
@@ -1758,7 +2203,7 @@ begin
Write_Str
(Normalize
(To_Host_Dir_Spec
- (Project_Path (First .. Last), True).all));
+ (Prj_Path (First .. Last), True).all));
Write_Eol;
end if;
@@ -1778,7 +2223,7 @@ begin
if not More_Lib_Files then
if not Print_Usage and then not Verbose_Mode then
- if Argument_Count = 0 then
+ if Arg_Count = 1 then
Usage;
else
Try_Help;
diff --git a/gcc/ada/s-os_lib.ads b/gcc/ada/s-os_lib.ads
index 31e171b..5fba00a 100644
--- a/gcc/ada/s-os_lib.ads
+++ b/gcc/ada/s-os_lib.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1995-2016, Free Software Foundation, Inc. --
+-- Copyright (C) 1995-2017, 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- --
@@ -366,7 +366,7 @@ package System.OS_Lib is
type Large_File_Size is range -2**63 .. 2**63 - 1;
-- Maximum supported size for a file (8 exabytes = 8 million terabytes,
- -- should be enough to accomodate all possible needs for quite a while).
+ -- should be enough to accommodate all possible needs for quite a while).
function File_Length64 (FD : File_Descriptor) return Large_File_Size;
pragma Import (C, File_Length64, "__gnat_file_length");
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 5cbc08c..7f2d105 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -3763,13 +3763,23 @@ package body Sem_Attr is
--------------
when Attribute_Enum_Rep =>
+ -- T'Enum_Rep (X) case
+
if Present (E1) then
Check_E1;
Check_Discrete_Type;
Resolve (E1, P_Base_Type);
- elsif not Is_Discrete_Type (Etype (P)) then
- Error_Attr_P ("prefix of % attribute must be of discrete type");
+ -- X'Enum_Rep case. X must be an object or enumeration literal, and
+ -- it must be of a discrete type.
+
+ elsif not ((Is_Object_Reference (P)
+ or else (Is_Entity_Name (P)
+ and then Ekind (Entity (P)) =
+ E_Enumeration_Literal))
+ and then Is_Discrete_Type (Etype (P)))
+ then
+ Error_Attr_P ("prefix of % attribute must be discrete object");
end if;
Set_Etype (N, Universal_Integer);
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index addc4c0..b15ee3d 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -8028,7 +8028,7 @@ package body Sem_Ch3 is
-- 3. DISCRIMINANTS IN DERIVED UNTAGGED RECORD TYPES
-- We have spoken about stored discriminants in point 1 (introduction)
- -- above. There are two sort of stored discriminants: implicit and
+ -- above. There are two sorts of stored discriminants: implicit and
-- explicit. As long as the derived type inherits the same discriminants as
-- the root record type, stored discriminants are the same as regular
-- discriminants, and are said to be implicit. However, if any discriminant
@@ -8047,7 +8047,7 @@ package body Sem_Ch3 is
-- type T4 (Y : Int) is new T3 (Y, 99);
-- The following table summarizes the discriminants and stored
- -- discriminants in R and T1 through T4.
+ -- discriminants in R and T1 through T4:
-- Type Discrim Stored Discrim Comment
-- R (D1, D2, D3) (D1, D2, D3) Girder discrims implicit in R
@@ -8058,7 +8058,7 @@ package body Sem_Ch3 is
-- Field Corresponding_Discriminant (abbreviated CD below) allows us to
-- find the corresponding discriminant in the parent type, while
- -- Original_Record_Component (abbreviated ORC below), the actual physical
+ -- Original_Record_Component (abbreviated ORC below) the actual physical
-- component that is renamed. Finally the field Is_Completely_Hidden
-- (abbreviated ICH below) is set for all explicit stored discriminants
-- (see einfo.ads for more info). For the above example this gives:
@@ -8085,10 +8085,10 @@ package body Sem_Ch3 is
-- D2 in T3 empty itself yes
-- D3 in T3 empty itself yes
- -- Y in T4 X1 in T3 D3 in T3 no
- -- D1 in T3 empty itself yes
- -- D2 in T3 empty itself yes
- -- D3 in T3 empty itself yes
+ -- Y in T4 X1 in T3 D3 in T4 no
+ -- D1 in T4 empty itself yes
+ -- D2 in T4 empty itself yes
+ -- D3 in T4 empty itself yes
-- 4. DISCRIMINANTS IN DERIVED TAGGED RECORD TYPES