diff options
author | fw <fw@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-22 11:58:51 +0000 |
---|---|---|
committer | fw <fw@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-22 11:58:51 +0000 |
commit | 3c5d6ca158333e50962b3dd3d9881af9796a9c66 (patch) | |
tree | c00928552111ff9496bdffd2b750652872457a52 /gcc/ada/make.adb | |
parent | 2c7f0b146f5d0e754501597f5bb9ce07b40ba119 (diff) | |
download | gcc-3c5d6ca158333e50962b3dd3d9881af9796a9c66.tar.gz |
* make.adb (Add_Switch): Make Generic_Position a procedure. The
function approach did not work well because of a side effect (the
function call could reallocate the table which was being indexed
using its result). Fixes ada/4851.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48265 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/make.adb')
-rw-r--r-- | gcc/ada/make.adb | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb index 6b61456aa33..500caf8a6e1 100644 --- a/gcc/ada/make.adb +++ b/gcc/ada/make.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- $Revision$ +-- $Revision: 1.9 $ -- -- -- Copyright (C) 1992-2001 Free Software Foundation, Inc. -- -- -- @@ -554,55 +554,60 @@ package body Make is is generic with package T is new Table.Table (<>); - function Generic_Position return Integer; - -- Generic procedure that adds S at the end or beginning of T depending - -- of the value of the boolean Append_Switch. + procedure Generic_Position (New_Position : out Integer); + -- Generic procedure that allocates a position for S in T at the + -- beginning or the end, depending on the boolean Append_Switch. ---------------------- -- Generic_Position -- ---------------------- - function Generic_Position return Integer is + procedure Generic_Position (New_Position : out Integer) is begin T.Increment_Last; if Append_Switch then - return Integer (T.Last); + New_Position := Integer (T.Last); else for J in reverse T.Table_Index_Type'Succ (T.First) .. T.Last loop T.Table (J) := T.Table (T.Table_Index_Type'Pred (J)); end loop; - return Integer (T.First); + New_Position := Integer (T.First); end if; end Generic_Position; - function Gcc_Switches_Pos is new Generic_Position (Gcc_Switches); - function Binder_Switches_Pos is new Generic_Position (Binder_Switches); - function Linker_Switches_Pos is new Generic_Position (Linker_Switches); + procedure Gcc_Switches_Pos is new Generic_Position (Gcc_Switches); + procedure Binder_Switches_Pos is new Generic_Position (Binder_Switches); + procedure Linker_Switches_Pos is new Generic_Position (Linker_Switches); - function Saved_Gcc_Switches_Pos is new + procedure Saved_Gcc_Switches_Pos is new Generic_Position (Saved_Gcc_Switches); - function Saved_Binder_Switches_Pos is new + procedure Saved_Binder_Switches_Pos is new Generic_Position (Saved_Binder_Switches); - function Saved_Linker_Switches_Pos is new + procedure Saved_Linker_Switches_Pos is new Generic_Position (Saved_Linker_Switches); + New_Position : Integer; + -- Start of processing for Add_Switch begin if And_Save then case Program is when Compiler => - Saved_Gcc_Switches.Table (Saved_Gcc_Switches_Pos) := S; + Saved_Gcc_Switches_Pos (New_Position); + Saved_Gcc_Switches.Table (New_Position) := S; when Binder => - Saved_Binder_Switches.Table (Saved_Binder_Switches_Pos) := S; + Saved_Binder_Switches_Pos (New_Position); + Saved_Binder_Switches.Table (New_Position) := S; when Linker => - Saved_Linker_Switches.Table (Saved_Linker_Switches_Pos) := S; + Saved_Linker_Switches_Pos (New_Position); + Saved_Linker_Switches.Table (New_Position) := S; when None => raise Program_Error; @@ -611,13 +616,16 @@ package body Make is else case Program is when Compiler => - Gcc_Switches.Table (Gcc_Switches_Pos) := S; + Gcc_Switches_Pos (New_Position); + Gcc_Switches.Table (New_Position) := S; when Binder => - Binder_Switches.Table (Binder_Switches_Pos) := S; + Binder_Switches_Pos (New_Position); + Binder_Switches.Table (New_Position) := S; when Linker => - Linker_Switches.Table (Linker_Switches_Pos) := S; + Linker_Switches_Pos (New_Position); + Linker_Switches.Table (New_Position) := S; when None => raise Program_Error; |