[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 31 Oct 2014 11:22:19 +0000 (12:22 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 31 Oct 2014 11:22:19 +0000 (12:22 +0100)
2014-10-31  Vincent Celier  <celier@adacore.com>

* prj-conf.adb (Look_For_Project_Paths): New procedure
(Parse_Project_And_Apply_Config): Initially, parse the project
files ignoring missing withs. If there are missing withs, extend
the project path with directories rooted at the compiler roots,
including directories rooted at the runtime roots, if there are
non default runtimes, in the PATH orser.
* prj-env.adb (Initialize_Default_Project_Path): Do not add
any directory from the prefix if the target is "-".
* prj-part.adb (Parse): Initialize the tables, as Parse may be
call several times by gprbuild.
* prj.adb (Update_Ignore_Missing_With): New procedure.

2014-10-31  Ed Schonberg  <schonberg@adacore.com>

* sem_aux.adb (First_Stored_Discriminant,
Has_Completely_Hidden_Discriminant): When scanning the list of
discriminants to locate possibly hidden (inherited) discriminants,
ignore itypes that may appear in the entity list, when an access
discriminants is constrained by an access attribute reference.

2014-10-31  Javier Miranda  <miranda@adacore.com>

* freeze.adb (Freeze_Record_Type): Add missing
check to verify that all the primitives of an interface type
are abstract or null procedures.

2014-10-31  Vincent Celier  <celier@adacore.com>

* s-os_lib.adb, s-os_lib.ads: New function Non_Blocking_Spawn that
redirects standard output and standard error to two different files.

2014-10-31  Bob Duff  <duff@adacore.com>

* makeutl.ads: Minor comment fix.

2014-10-31  Arnaud Charlet  <charlet@adacore.com>

* system-linux-x86_64.ads, system-mingw-x86_64.ads (Word_Size,
Memory_Size): Use Standard'Word_Size so that the value can be changed
via a target configuration file.

From-SVN: r216965

14 files changed:
gcc/ada/ChangeLog
gcc/ada/freeze.adb
gcc/ada/makeutl.ads
gcc/ada/prj-conf.adb
gcc/ada/prj-env.adb
gcc/ada/prj-env.ads
gcc/ada/prj-part.adb
gcc/ada/prj.adb
gcc/ada/prj.ads
gcc/ada/s-os_lib.adb
gcc/ada/s-os_lib.ads
gcc/ada/sem_aux.adb
gcc/ada/system-linux-x86_64.ads
gcc/ada/system-mingw-x86_64.ads

index a31639b95a74ed0e6e8f8b3eec5ba30fa4642782..9e76cbb5f68e25ac7e57446f2bd0d1fa3423d9cc 100644 (file)
@@ -1,3 +1,46 @@
+2014-10-31  Vincent Celier  <celier@adacore.com>
+
+       * prj-conf.adb (Look_For_Project_Paths): New procedure
+       (Parse_Project_And_Apply_Config): Initially, parse the project
+       files ignoring missing withs. If there are missing withs, extend
+       the project path with directories rooted at the compiler roots,
+       including directories rooted at the runtime roots, if there are
+       non default runtimes, in the PATH orser.
+       * prj-env.adb (Initialize_Default_Project_Path): Do not add
+       any directory from the prefix if the target is "-".
+       * prj-part.adb (Parse): Initialize the tables, as Parse may be
+       call several times by gprbuild.
+       * prj.adb (Update_Ignore_Missing_With): New procedure.
+
+2014-10-31  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_aux.adb (First_Stored_Discriminant,
+       Has_Completely_Hidden_Discriminant): When scanning the list of
+       discriminants to locate possibly hidden (inherited) discriminants,
+       ignore itypes that may appear in the entity list, when an access
+       discriminants is constrained by an access attribute reference.
+
+2014-10-31  Javier Miranda  <miranda@adacore.com>
+
+       * freeze.adb (Freeze_Record_Type): Add missing
+       check to verify that all the primitives of an interface type
+       are abstract or null procedures.
+
+2014-10-31  Vincent Celier  <celier@adacore.com>
+
+       * s-os_lib.adb, s-os_lib.ads: New function Non_Blocking_Spawn that
+       redirects standard output and standard error to two different files.
+
+2014-10-31  Bob Duff  <duff@adacore.com>
+
+       * makeutl.ads: Minor comment fix.
+
+2014-10-31  Arnaud Charlet  <charlet@adacore.com>
+
+       * system-linux-x86_64.ads, system-mingw-x86_64.ads (Word_Size,
+       Memory_Size): Use Standard'Word_Size so that the value can be changed
+       via a target configuration file.
+
 2014-10-31  Eric Botcazou  <ebotcazou@adacore.com>
 
        * exp_ch4.adb: Minor tweak.
index caef71f91979f16a184a20ae50fdae9f0dad8414..e20aebb1df2b3d2d451d4a0b5fab2d301c4a1892 100644 (file)
@@ -4004,6 +4004,47 @@ package body Freeze is
             --  call to the Analyze_Freeze_Entity for the record type.
 
          end Check_Variant_Part;
+
+         --  Check that all the primitives of an interface type are abstract
+         --  or null procedures.
+
+         if Is_Interface (Rec)
+           and then not Error_Posted (Parent (Rec))
+         then
+            declare
+               Elmt : Elmt_Id;
+               Subp : Entity_Id;
+
+            begin
+               Elmt := First_Elmt (Primitive_Operations (Rec));
+               while Present (Elmt) loop
+                  Subp := Node (Elmt);
+
+                  if not Is_Abstract_Subprogram (Subp)
+
+                     --  Avoid reporting the error on inherited primitives
+
+                    and then Comes_From_Source (Subp)
+                  then
+                     Error_Msg_Name_1 := Chars (Subp);
+
+                     if Ekind (Subp) = E_Procedure then
+                        if not Null_Present (Parent (Subp)) then
+                           Error_Msg_N
+                             ("interface procedure % must be abstract or null",
+                              Parent (Subp));
+                        end if;
+                     else
+                        Error_Msg_N
+                          ("interface function % must be abstract",
+                           Parent (Subp));
+                     end if;
+                  end if;
+
+                  Next_Elmt (Elmt);
+               end loop;
+            end;
+         end if;
       end Freeze_Record_Type;
 
       -------------------------------
index 045370903189451107ee53f3615915b9cc9eaf20..cf28b1ec1da4a9dd8cb815905cbf75e306726edd 100644 (file)
@@ -254,8 +254,8 @@ package Makeutl is
    --  file. This checks various attributes to see if there are file specific
    --  switches, or else defaults on the switches for the corresponding
    --  language. Is_Default is set to False if there were file-specific
-   --  switches Source_File can be set to No_File to force retrieval of the
-   --  default switches. If Test_Without_Suffix is True, and there is no " for
+   --  switches. Source_File can be set to No_File to force retrieval of the
+   --  default switches. If Test_Without_Suffix is True, and there is no "for
    --  Switches(Source_File) use", then this procedure also tests without the
    --  extension of the filename. If Test_Without_Suffix is True and
    --  Check_ALI_Suffix is True, then we also replace the file extension with
index 1afdb2ce55ac2223994e8b8f0e6717eab3ca6246..fe6cb60b3816c59da6c54e16d89e2210229226ec 100644 (file)
@@ -53,6 +53,32 @@ package body Prj.Conf is
 
    Gprconfig_Name : constant String := "gprconfig";
 
+   Warn_For_RTS : Boolean := True;
+   --  Set to False when gprbuild parse again the project files, to avoid
+   --  an incorrect warning.
+
+   type Runtime_Root_Data;
+   type Runtime_Root_Ptr is access Runtime_Root_Data;
+   type Runtime_Root_Data is record
+      Root : String_Access;
+      Next : Runtime_Root_Ptr;
+   end record;
+   --  Data for a runtime root to be used when adding directories to the
+   --  project path.
+
+   type Compiler_Root_Data;
+   type Compiler_Root_Ptr is access Compiler_Root_Data;
+   type Compiler_Root_Data is record
+      Root : String_Access;
+      Runtimes : Runtime_Root_Ptr;
+      Next     : Compiler_Root_Ptr;
+   end record;
+   --  Data for a compiler root to be used when adding directories to the
+   --  project path.
+
+   First_Compiler_Root : Compiler_Root_Ptr := null;
+   --  Head of the list of compiler roots
+
    package RTS_Languages is new GNAT.HTable.Simple_HTable
      (Header_Num => Prj.Header_Num,
       Element    => Name_Id,
@@ -98,6 +124,21 @@ package body Prj.Conf is
    --  projects, so that when the second phase of the processing is performed
    --  these attributes are automatically taken into account.
 
+   type State is (No_State);
+
+   procedure Look_For_Project_Paths
+     (Project    : Project_Id;
+      Tree       : Project_Tree_Ref;
+      With_State : in out State);
+   --  Check the compilers in the Project and add record them in the list
+   --  rooted at First_Compiler_Root, with their runtimes, if they are not
+   --  already in the list.
+
+   procedure Update_Project_Path is new
+     For_Every_Project_Imported
+       (State  => State,
+        Action => Look_For_Project_Paths);
+
    ------------------------------------
    -- Add_Default_GNAT_Naming_Scheme --
    ------------------------------------
@@ -1448,7 +1489,8 @@ package body Prj.Conf is
       --  If the config file is not auto-generated, warn if there is any --RTS
       --  switch, but not when the config file is generated in memory.
 
-      elsif RTS_Languages.Get_First /= No_Name
+      elsif Warn_For_RTS
+        and then RTS_Languages.Get_First /= No_Name
         and then Opt.Warning_Mode /= Opt.Suppress
         and then On_Load_Config = null
       then
@@ -1558,11 +1600,36 @@ package body Prj.Conf is
       On_New_Tree_Loaded         : Prj.Proc.Tree_Loaded_Callback := null)
    is
       Success : Boolean := False;
-      Try_Again : Boolean := True;
+      Target_Try_Again : Boolean := True;
+      Config_Try_Again : Boolean;
+
+      S : State := No_State;
+
+      Conf_File_Name : String_Access := new String'(Config_File_Name);
+
+      procedure Add_Directory (Dir : String);
+      --  Add a directory at the end of the Project Path
+
+      -------------------
+      -- Add_Directory --
+      -------------------
+
+      procedure Add_Directory (Dir : String) is
+      begin
+         if Opt.Verbose_Mode then
+            Write_Line ("   Adding directory """ & Dir & """");
+         end if;
+
+         Prj.Env.Add_Directories (Env.Project_Path, Dir);
+      end Add_Directory;
 
    begin
       pragma Assert (Prj.Env.Is_Initialized (Env.Project_Path));
 
+      --  Start with ignoring missing withed projects
+
+      Update_Ignore_Missing_With (Env.Flags, True);
+
       --  Record Target_Value and Target_Origin.
 
       if Target_Name = "" then
@@ -1630,10 +1697,10 @@ package body Prj.Conf is
               and then
                 Get_Name_String (Variable.Value) /= Opt.Target_Value.all
             then
-               if Try_Again then
+               if Target_Try_Again then
                   Opt.Target_Value :=
                     new String'(Get_Name_String (Variable.Value));
-                  Try_Again := False;
+                  Target_Try_Again := False;
                   goto Parse_Again;
 
                else
@@ -1643,13 +1710,18 @@ package body Prj.Conf is
                end if;
             end if;
          end;
-
       end if;
 
+      --  If there are missing withed projects, the projects will be parsed
+      --  again after the project path is extended with directories rooted
+      --  at the compiler roots.
+
+      Config_Try_Again := Project_Node_Tree.Incomplete_With;
+
       Process_Project_And_Apply_Config
         (Main_Project               => Main_Project,
          User_Project_Node          => User_Project_Node,
-         Config_File_Name           => Config_File_Name,
+         Config_File_Name           => Conf_File_Name.all,
          Autoconf_Specified         => Autoconf_Specified,
          Project_Tree               => Project_Tree,
          Project_Node_Tree          => Project_Node_Tree,
@@ -1663,6 +1735,194 @@ package body Prj.Conf is
          On_Load_Config             => On_Load_Config,
          On_New_Tree_Loaded         => On_New_Tree_Loaded,
          Do_Phase_1                 => Opt.Target_Origin = Specified);
+
+      --  Exit if there was an error. Otherwise, if Config_Try_Again is True,
+      --  update the project path and try again.
+
+      if Main_Project /= No_Project and then Config_Try_Again then
+         Update_Ignore_Missing_With (Env.Flags, False);
+
+         if Config_File_Path /= null then
+            Conf_File_Name := new String'(Simple_Name (Config_File_Path.all));
+         end if;
+
+         --  For the second time the project files are parsed, the warning for
+         --  --RTS= being only taken into account in auto-configuration are
+         --  suppressed, as we are no longer in auto-configuration.
+
+         Warn_For_RTS := False;
+
+         --  Add the default directories corresponding to the compilers
+
+         Update_Project_Path
+           (By                 => Main_Project,
+            Tree               => Project_Tree,
+            With_State         => S,
+            Include_Aggregated => True,
+            Imported_First     => False);
+
+         declare
+            Compiler_Root : Compiler_Root_Ptr;
+            Prefix        : String_Access;
+            Runtime_Root  : Runtime_Root_Ptr;
+            Path_Value : constant String_Access := Getenv ("PATH");
+
+         begin
+            if Opt.Verbose_Mode then
+               Write_Line ("Setting the default project search directories");
+
+               if Prj.Current_Verbosity = High then
+                  if Path_Value = null or else Path_Value'Length = 0 then
+                     Write_Line ("No environment variable PATH");
+
+                  else
+                     Write_Line ("PATH =");
+                     Write_Line ("   " & Path_Value.all);
+                  end if;
+               end if;
+            end if;
+
+            --  Reorder the compiler roots in the PATH order
+
+            if First_Compiler_Root /= null
+              and then First_Compiler_Root.Next /= null
+            then
+               declare
+                  Pred : Compiler_Root_Ptr;
+                  First_New_Comp : Compiler_Root_Ptr := null;
+                  New_Comp : Compiler_Root_Ptr := null;
+                  First : Positive := Path_Value'First;
+                  Last  : Positive;
+                  Path_Last : Positive;
+               begin
+                  while First <= Path_Value'Last loop
+                     Last := First;
+
+                     if Path_Value (First) /= Path_Separator then
+                        while Last < Path_Value'Last
+                          and then Path_Value (Last + 1) /= Path_Separator
+                        loop
+                           Last := Last + 1;
+                        end loop;
+
+                        Path_Last := Last;
+                        while Path_Last > First
+                          and then
+                            Path_Value (Path_Last) = Directory_Separator
+                        loop
+                           Path_Last := Path_Last - 1;
+                        end loop;
+
+                        if Path_Last > First + 4
+                          and then
+                            Path_Value (Path_Last - 2 .. Path_Last) = "bin"
+                          and then
+                            Path_Value (Path_Last - 3) = Directory_Separator
+                        then
+                           Path_Last := Path_Last - 4;
+                           Pred := null;
+                           Compiler_Root := First_Compiler_Root;
+                           while Compiler_Root /= null
+                             and then Compiler_Root.Root.all /=
+                               Path_Value (First .. Path_Last)
+                           loop
+                              Pred := Compiler_Root;
+                              Compiler_Root := Compiler_Root.Next;
+                           end loop;
+
+                           if Compiler_Root /= null then
+                              if Pred = null then
+                                 First_Compiler_Root :=
+                                   First_Compiler_Root.Next;
+                              else
+                                 Pred.Next := Compiler_Root.Next;
+                              end if;
+
+                              if First_New_Comp = null then
+                                 First_New_Comp := Compiler_Root;
+                              else
+                                 New_Comp.Next := Compiler_Root;
+                              end if;
+
+                              New_Comp := Compiler_Root;
+                              New_Comp.Next := null;
+                           end if;
+                        end if;
+                     end if;
+
+                     First := Last + 1;
+                  end loop;
+
+                  if First_New_Comp /= null then
+                     New_Comp.Next := First_Compiler_Root;
+                     First_Compiler_Root := First_New_Comp;
+                  end if;
+               end;
+            end if;
+
+            --  Now that the compiler roots are in a correct order, add the
+            --  directories corresponding to these compiler roots in the
+            --  project path.
+
+            Compiler_Root := First_Compiler_Root;
+            while Compiler_Root /= null loop
+               Prefix := Compiler_Root.Root;
+
+               Runtime_Root := Compiler_Root.Runtimes;
+               while Runtime_Root /= null loop
+                  Add_Directory
+                    (Runtime_Root.Root.all &
+                       Directory_Separator &
+                       "lib" &
+                       Directory_Separator &
+                       "gnat");
+                  Add_Directory
+                    (Runtime_Root.Root.all &
+                       Directory_Separator &
+                       "share" &
+                       Directory_Separator &
+                       "gpr");
+                  Runtime_Root := Runtime_Root.Next;
+               end loop;
+
+               Add_Directory
+                 (Prefix.all &
+                    Directory_Separator &
+                    Opt.Target_Value.all &
+                    Directory_Separator &
+                    "lib" &
+                    Directory_Separator &
+                    "gnat");
+               Add_Directory
+                 (Prefix.all &
+                    Directory_Separator &
+                    Opt.Target_Value.all &
+                    Directory_Separator &
+                    "share" &
+                    Directory_Separator &
+                    "gpr");
+               Add_Directory
+                 (Prefix.all &
+                    Directory_Separator &
+                    "share" &
+                    Directory_Separator &
+                    "gpr");
+               Add_Directory
+                 (Prefix.all &
+                    Directory_Separator &
+                    "lib" &
+                    Directory_Separator &
+                    "gnat");
+               Compiler_Root := Compiler_Root.Next;
+            end loop;
+         end;
+
+         --  And parse again the project files. There will be no missing
+         --  withed projects, as Ignore_Missing_With is set to False in
+         --  the environment flags, so there is no risk of endless loop here.
+
+         goto Parse_Again;
+      end if;
    end Parse_Project_And_Apply_Config;
 
    --------------------------------------
@@ -1886,4 +2146,112 @@ package body Prj.Conf is
       RTS_Languages.Set (Language, Name_Find);
    end Set_Runtime_For;
 
+   ----------------------------
+   -- Look_For_Project_Paths --
+   ----------------------------
+
+   procedure Look_For_Project_Paths
+     (Project    : Project_Id;
+      Tree       : Project_Tree_Ref;
+      With_State : in out State)
+   is
+      Lang_Id : Language_Ptr;
+      Compiler_Root : Compiler_Root_Ptr;
+      Runtime_Root : Runtime_Root_Ptr;
+      Comp_Driver : String_Access;
+      Comp_Dir : String_Access;
+      Prefix   : String_Access;
+
+      pragma Unreferenced (Tree);
+
+   begin
+      With_State := No_State;
+
+      Lang_Id := Project.Languages;
+      while Lang_Id /= No_Language_Index loop
+         if Lang_Id.Config.Compiler_Driver /= No_File then
+            Comp_Driver :=
+              new String'
+                (Get_Name_String (Lang_Id.Config.Compiler_Driver));
+
+            --  Get the absolute path of the compiler driver
+
+            if not Is_Absolute_Path (Comp_Driver.all) then
+               Comp_Driver := Locate_Exec_On_Path (Comp_Driver.all);
+            end if;
+
+            if Comp_Driver /= null and then Comp_Driver'Length > 0 then
+               Comp_Dir :=
+                 new String'
+                   (Containing_Directory (Comp_Driver.all));
+
+               --  Consider only the compiler drivers that are in "bin"
+               --  subdirectories.
+
+               if Simple_Name (Comp_Dir.all) = "bin" then
+                  Prefix :=
+                    new String'(Containing_Directory (Comp_Dir.all));
+
+                  --  Check if the compiler root is already in the list. If it
+                  --  is not, add it to the list.
+
+                  Compiler_Root := First_Compiler_Root;
+                  while Compiler_Root /= null loop
+                     exit when Prefix.all = Compiler_Root.Root.all;
+                     Compiler_Root := Compiler_Root.Next;
+                  end loop;
+
+                  if Compiler_Root = null then
+                     First_Compiler_Root :=
+                       new Compiler_Root_Data'
+                         (Root => Prefix,
+                          Runtimes => null,
+                          Next => First_Compiler_Root);
+                     Compiler_Root := First_Compiler_Root;
+                  end if;
+
+                  --  If there is a runtime for this compiler, check if it is
+                  --  recorded with the compiler root. If it is not, record
+                  --  the runtime.
+
+                  declare
+                     Runtime : constant String :=
+                       Runtime_Name_For (Lang_Id.Name);
+                     Root : String_Access;
+                  begin
+                     if Runtime'Length > 0 then
+                        if Is_Absolute_Path (Runtime) then
+                           Root := new String'(Runtime);
+
+                        else
+                           Root :=
+                             new String'
+                               (Prefix.all &
+                                  Directory_Separator &
+                                  Opt.Target_Value.all &
+                                  Directory_Separator &
+                                  Runtime);
+                        end if;
+
+                        Runtime_Root := Compiler_Root.Runtimes;
+                        while Runtime_Root /= null loop
+                           exit when Root.all = Runtime_Root.Root.all;
+                           Runtime_Root := Runtime_Root.Next;
+                        end loop;
+
+                        if Runtime_Root = null then
+                           Compiler_Root.Runtimes :=
+                             new Runtime_Root_Data'
+                               (Root => Root,
+                                Next => Compiler_Root.Runtimes);
+                        end if;
+                     end if;
+                  end;
+               end if;
+            end if;
+         end if;
+
+         Lang_Id := Lang_Id.Next;
+      end loop;
+   end Look_For_Project_Paths;
 end Prj.Conf;
index b6bb25fcbf8666949f96c95361b03ffafef274df..7dbb4ce7c8cdc1e405db4dbcd4e82d05d5e7acca 100644 (file)
@@ -1876,7 +1876,7 @@ package body Prj.Env is
      (Self        : in out Project_Search_Path;
       Target_Name : String)
    is
-      Add_Default_Dir : Boolean := True;
+      Add_Default_Dir : Boolean := Target_Name /= "-";
       First           : Positive;
       Last            : Positive;
 
index 08f2b400f6b8ba62ce634ad8cc7f10ea232164a4..f070a75fce3ee191edeb5de4244f02b94d214550 100644 (file)
@@ -175,8 +175,10 @@ package Prj.Env is
       Target_Name : String);
    --  Initialize Self. It will then contain the default project path on the
    --  given target (including directories specified by the environment
-   --  variables ADA_PROJECT_PATH and GPR_PROJECT_PATH). This does nothing if
-   --  Self has already been initialized.
+   --  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 Copy (From : Project_Search_Path; To : out Project_Search_Path);
    --  Copy From into To
index 5f04158bebfcc6a9e1cd85fe2ba45dda5eb48681..34b13bc1e80b5581b37c28ab7f5a863cb71cf331 100644 (file)
@@ -553,6 +553,8 @@ package body Prj.Part is
 
    begin
       In_Tree.Incomplete_With := False;
+      Project_Stack.Init;
+      Tree_Private_Part.Projects_Htable.Reset (In_Tree.Projects_HT);
 
       if not Is_Initialized (Env.Project_Path) then
          Prj.Env.Initialize_Default_Project_Path
index 88196e10f419ad5a30aba5191bbb21d191dffc8b..8a267cf476fa646e142280293953d01be2c1e797 100644 (file)
@@ -2147,6 +2147,17 @@ package body Prj is
         (Root_Project, Root_Tree, Project_Context'(False, False));
    end For_Project_And_Aggregated_Context;
 
+   --------------------------------
+   -- Update_Ignore_Missing_With --
+   --------------------------------
+
+   procedure Update_Ignore_Missing_With
+     (Flags : in out Processing_Flags; Value : Boolean)
+   is
+   begin
+      Flags.Ignore_Missing_With := Value;
+   end Update_Ignore_Missing_With;
+
 --  Package initialization for Prj
 
 begin
index 804d88aa2100876e90b36b33c287053d16c70ab7..4ba3fac3bcaffd38101ec4c5877fa09338a7701b 100644 (file)
@@ -1893,6 +1893,10 @@ package Prj is
    --       * user project also includes a "with" that can only be resolved
    --         once we have found the gnatls
 
+   procedure Update_Ignore_Missing_With
+     (Flags : in out Processing_Flags; Value : Boolean);
+   --  Update the value of component Ignore_Missing_With in Flags with Value
+
    Gprbuild_Flags   : constant Processing_Flags;
    Gprinstall_Flags : constant Processing_Flags;
    Gprclean_Flags   : constant Processing_Flags;
index 5f70faba0ab6ea61bd9c997c573d448a938fb768..46fdd0067847b03fb1d62e475d51868605b13484 100644 (file)
@@ -1698,6 +1698,54 @@ package body System.OS_Lib is
       end if;
    end Non_Blocking_Spawn;
 
+   function Non_Blocking_Spawn
+     (Program_Name : String;
+      Args         : Argument_List;
+      Stdout_File  : String;
+      Stderr_File  : String) return Process_Id
+   is
+      Stdout_FD : constant File_Descriptor :=
+                     Create_Output_Text_File (Stdout_File);
+      Stderr_FD : constant File_Descriptor :=
+                     Create_Output_Text_File (Stderr_File);
+
+      Saved_Output : File_Descriptor;
+      Saved_Error  : File_Descriptor;
+
+      Result : Process_Id;
+
+   begin
+      --  Do not attempt to spawn if the output files could not be created
+
+      if Stdout_FD = Invalid_FD or else Stderr_FD = Invalid_FD then
+         return Invalid_Pid;
+      end if;
+
+      --  Set standard output and error to the specified files
+
+      Saved_Output := Dup (Standout);
+      Dup2 (Stdout_FD, Standout);
+
+      Saved_Error  := Dup (Standerr);
+      Dup2 (Stderr_FD, Standerr);
+
+      --  Spawn the program
+
+      Result := Non_Blocking_Spawn (Program_Name, Args);
+
+      --  Restore the standard output and error
+
+      Dup2 (Saved_Output, Standout);
+      Dup2 (Saved_Error, Standerr);
+
+      --  And close the saved standard output and error file descriptors
+
+      Close (Saved_Output);
+      Close (Saved_Error);
+
+      return Result;
+   end Non_Blocking_Spawn;
+
    -------------------------
    -- Normalize_Arguments --
    -------------------------
index 2a24ca29d62bb3637cfd42218d1a5e0279be10a4..d285fd4cb071068e696bdd6c23e59ef6010b8929 100644 (file)
@@ -856,6 +856,15 @@ package System.OS_Lib is
    --  This function will always return Invalid_Pid under VxWorks, since there
    --  is no notion of executables under this OS.
 
+   function Non_Blocking_Spawn
+     (Program_Name : String;
+      Args         : Argument_List;
+      Stdout_File  : String;
+      Stderr_File  : String) return Process_Id;
+   --  Similar to the procedure above, but saves the standard output of the
+   --  command to a file with the name Stdout_File and the standard output
+   --  of the command to a file with the name Stderr_File.
+
    procedure Wait_Process (Pid : out Process_Id; Success : out Boolean);
    --  Wait for the completion of any of the processes created by previous
    --  calls to Non_Blocking_Spawn. The caller will be suspended until one of
index 4b251e31c5161b031fac10ad4d4f55ddee302f73..68104b906ff0ae236ff186957cbf2d80fd1bfc67 100644 (file)
@@ -282,6 +282,8 @@ package body Sem_Aux is
         (Typ : Entity_Id) return Boolean;
       --  Scans the Discriminants to see whether any are Completely_Hidden
       --  (the mechanism for describing non-specified stored discriminants)
+      --  Note that the entity list for the type may contain anonymous access
+      --  types created by expressions that constrain access discriminants.
 
       ----------------------------------------
       -- Has_Completely_Hidden_Discriminant --
@@ -296,8 +298,17 @@ package body Sem_Aux is
          pragma Assert (Ekind (Typ) = E_Discriminant);
 
          Ent := Typ;
-         while Present (Ent) and then Ekind (Ent) = E_Discriminant loop
-            if Is_Completely_Hidden (Ent) then
+         while Present (Ent) loop
+
+            --  Skip anonymous types that may be created by expressions
+            --  used as discriminant constraints on inherited discriminants.
+
+            if Is_Itype (Ent) then
+               null;
+
+            elsif  Ekind (Ent) = E_Discriminant
+              and then Is_Completely_Hidden (Ent)
+            then
                return True;
             end if;
 
@@ -322,7 +333,8 @@ package body Sem_Aux is
 
       if Has_Completely_Hidden_Discriminant (Ent) then
          while Present (Ent) loop
-            exit when Is_Completely_Hidden (Ent);
+            exit when Ekind (Ent) = E_Discriminant
+              and then Is_Completely_Hidden (Ent);
             Ent := Next_Entity (Ent);
          end loop;
       end if;
index 2874376f0029d6d9d84e4536efe9586da7dcf476..3103cf781d90a337d9523f2b6a0bb33d888583e1 100644 (file)
@@ -69,8 +69,8 @@ package System is
    Null_Address : constant Address;
 
    Storage_Unit : constant := 8;
-   Word_Size    : constant := 64;
-   Memory_Size  : constant := 2 ** 64;
+   Word_Size    : constant := Standard'Word_Size;
+   Memory_Size  : constant := 2 ** Word_Size;
 
    --  Address comparison
 
index 7b73968d10c2a91a6defde41e4de7cbcc60b39a1..865bcd6b161df887a1c99e88728bfe38f9f4d3fd 100644 (file)
@@ -69,8 +69,8 @@ package System is
    Null_Address : constant Address;
 
    Storage_Unit : constant := 8;
-   Word_Size    : constant := 64;
-   Memory_Size  : constant := 2 ** 64;
+   Word_Size    : constant := Standard'Word_Size;
+   Memory_Size  : constant := 2 ** Word_Size;
 
    --  Address comparison