Commit 5fd3fd79 by Arnaud Charlet

[multiple changes]

2009-10-30  Robert Dewar  <dewar@adacore.com>

	* a-tideio.adb: Minor reformatting
	* a-wtdeio.adb, a-ztdeio.adb: Update comments, code clean up.

	* a-reatim.adb, a-tideau.adb, a-ngelfu.adb, a-ztdeau.adb, a-ngrear.adb,
	a-wtedit.adb, a-ststio.adb, a-ztedit.adb: Minor code reorganization
	(use conditional expressions).

2009-10-30  Ed Schonberg  <schonberg@adacore.com>

	* gnat_ugn.texi: Additional info on gnatw.i and gnatw.I

	* sem_case.adb: Improved error message.

2009-10-30  Emmanuel Briot  <briot@adacore.com>

	* a-direct.adb, gnatcmd.adb, gnatname.adb, makeutl.adb, opt.ads,
	osint.adb, prj-ext.adb, switch-m.adb (Follow_Links_For_Dirs): Now
	defaults to False, and controlled by -eL.
	* a-direct.adb: Add comments.
	* osint.adb (File_Stamp): Avoid unneeded duplicate system call

From-SVN: r153744
parent 297f34d7
2009-10-30 Robert Dewar <dewar@adacore.com> 2009-10-30 Robert Dewar <dewar@adacore.com>
* a-tideio.adb: Minor reformatting
* a-wtdeio.adb, a-ztdeio.adb: Update comments, code clean up.
* a-reatim.adb, a-tideau.adb, a-ngelfu.adb, a-ztdeau.adb, a-ngrear.adb,
a-wtedit.adb, a-ststio.adb, a-ztedit.adb: Minor code reorganization
(use conditional expressions).
2009-10-30 Ed Schonberg <schonberg@adacore.com>
* gnat_ugn.texi: Additional info on gnatw.i and gnatw.I
* sem_case.adb: Improved error message.
2009-10-30 Emmanuel Briot <briot@adacore.com>
* a-direct.adb, gnatcmd.adb, gnatname.adb, makeutl.adb, opt.ads,
osint.adb, prj-ext.adb, switch-m.adb (Follow_Links_For_Dirs): Now
defaults to False, and controlled by -eL.
* a-direct.adb: Add comments.
* osint.adb (File_Stamp): Avoid unneeded duplicate system call
2009-10-30 Robert Dewar <dewar@adacore.com>
* sem_res.adb (Resolve_Type_Conversion): Avoid false positive when * sem_res.adb (Resolve_Type_Conversion): Avoid false positive when
converting non-static subtype to "identical" static subtype. converting non-static subtype to "identical" static subtype.
......
...@@ -210,6 +210,8 @@ package body Ada.Directories is ...@@ -210,6 +210,8 @@ package body Ada.Directories is
else else
declare declare
-- We need to resolve links because of A.16(47), since we must not
-- return alternative names for files
Norm : constant String := Normalize_Pathname (Name); Norm : constant String := Normalize_Pathname (Name);
Last_DS : constant Natural := Last_DS : constant Natural :=
Strings.Fixed.Index Strings.Fixed.Index
...@@ -441,6 +443,8 @@ package body Ada.Directories is ...@@ -441,6 +443,8 @@ package body Ada.Directories is
Local_Get_Current_Dir (Buffer'Address, Path_Len'Address); Local_Get_Current_Dir (Buffer'Address, Path_Len'Address);
declare declare
-- We need to resolve links because of A.16(47), since we must not
-- return alternative names for files
Cur : constant String := Normalize_Pathname (Buffer (1 .. Path_Len)); Cur : constant String := Normalize_Pathname (Buffer (1 .. Path_Len));
begin begin
...@@ -781,6 +785,8 @@ package body Ada.Directories is ...@@ -781,6 +785,8 @@ package body Ada.Directories is
-- Use System.OS_Lib.Normalize_Pathname -- Use System.OS_Lib.Normalize_Pathname
declare declare
-- We need to resolve links because of A.16(47), since we must not
-- return alternative names for files
Value : constant String := Normalize_Pathname (Name); Value : constant String := Normalize_Pathname (Name);
subtype Result is String (1 .. Value'Length); subtype Result is String (1 .. Value'Length);
begin begin
......
...@@ -729,21 +729,12 @@ package body Ada.Numerics.Generic_Elementary_Functions is ...@@ -729,21 +729,12 @@ package body Ada.Numerics.Generic_Elementary_Functions is
Raw_Atan : Float_Type'Base; Raw_Atan : Float_Type'Base;
begin begin
if abs Y > abs X then Z := (if abs Y > abs X then abs (X / Y) else abs (Y / X));
Z := abs (X / Y);
else
Z := abs (Y / X);
end if;
if Z < Sqrt_Epsilon then
Raw_Atan := Z;
elsif Z = 1.0 then Raw_Atan :=
Raw_Atan := Pi / 4.0; (if Z < Sqrt_Epsilon then Z
elsif Z = 1.0 then Pi / 4.0
else else Float_Type'Base (Aux.Atan (Double (Z))));
Raw_Atan := Float_Type'Base (Aux.Atan (Double (Z)));
end if;
if abs Y > abs X then if abs Y > abs X then
Raw_Atan := Half_Pi - Raw_Atan; Raw_Atan := Half_Pi - Raw_Atan;
......
...@@ -433,11 +433,7 @@ package body Ada.Numerics.Generic_Real_Arrays is ...@@ -433,11 +433,7 @@ package body Ada.Numerics.Generic_Real_Arrays is
end if; end if;
for J in 1 .. N loop for J in 1 .. N loop
if Piv (J) /= J then Det := (if Piv (J) /= J then -Det * LU (J, J) else Det * LU (J, J));
Det := -Det * LU (J, J);
else
Det := Det * LU (J, J);
end if;
end loop; end loop;
return Det; return Det;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1991-1994, Florida State University -- -- Copyright (C) 1991-1994, Florida State University --
-- Copyright (C) 1995-2006, AdaCore -- -- Copyright (C) 1995-2009, AdaCore --
-- -- -- --
-- GNARL is free software; you can redistribute it and/or modify it under -- -- GNARL 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -189,19 +189,12 @@ package body Ada.Real_Time is ...@@ -189,19 +189,12 @@ package body Ada.Real_Time is
-- Special-case for Time_First, whose absolute value is anomalous, -- Special-case for Time_First, whose absolute value is anomalous,
-- courtesy of two's complement. -- courtesy of two's complement.
if T = Time_First then T_Val := (if T = Time_First then abs (Time_Last) else abs (T));
T_Val := abs (Time_Last);
else
T_Val := abs (T);
end if;
-- Extract the integer part of T, truncating towards zero -- Extract the integer part of T, truncating towards zero
if T_Val < 0.5 then SC :=
SC := 0; (if T_Val < 0.5 then 0 else Seconds_Count (Time_Span'(T_Val - 0.5)));
else
SC := Seconds_Count (Time_Span'(T_Val - 0.5));
end if;
if T < 0.0 then if T < 0.0 then
SC := -SC; SC := -SC;
......
...@@ -241,11 +241,7 @@ package body Ada.Streams.Stream_IO is ...@@ -241,11 +241,7 @@ package body Ada.Streams.Stream_IO is
-- (and furthermore there are situations (such as the case of writing -- (and furthermore there are situations (such as the case of writing
-- a sequential Posix FIFO file) where the lseek would cause problems. -- a sequential Posix FIFO file) where the lseek would cause problems.
if Mode = Out_File then File.Last_Op := (if Mode = Out_File then Op_Write else Op_Read);
File.Last_Op := Op_Write;
else
File.Last_Op := Op_Read;
end if;
end Open; end Open;
---------- ----------
......
...@@ -242,11 +242,8 @@ package body Ada.Text_IO.Decimal_Aux is ...@@ -242,11 +242,8 @@ package body Ada.Text_IO.Decimal_Aux is
Ptr : Natural := 0; Ptr : Natural := 0;
begin begin
if Exp = 0 then Fore :=
Fore := To'Length - 1 - Aft; (if Exp = 0 then To'Length - 1 - Aft else To'Length - 2 - Aft - Exp);
else
Fore := To'Length - 2 - Aft - Exp;
end if;
if Fore < 1 then if Fore < 1 then
raise Layout_Error; raise Layout_Error;
......
...@@ -51,7 +51,6 @@ package body Ada.Text_IO.Decimal_IO is ...@@ -51,7 +51,6 @@ package body Ada.Text_IO.Decimal_IO is
begin begin
if Num'Size > Integer'Size then if Num'Size > Integer'Size then
Item := Num'Fixed_Value (Aux.Get_LLD (File, Width, Scale)); Item := Num'Fixed_Value (Aux.Get_LLD (File, Width, Scale));
else else
Item := Num'Fixed_Value (Aux.Get_Dec (File, Width, Scale)); Item := Num'Fixed_Value (Aux.Get_Dec (File, Width, Scale));
end if; end if;
......
...@@ -54,16 +54,10 @@ package body Ada.Wide_Text_IO.Decimal_IO is ...@@ -54,16 +54,10 @@ package body Ada.Wide_Text_IO.Decimal_IO is
is is
begin begin
if Num'Size > Integer'Size then if Num'Size > Integer'Size then
Item := Num (Aux.Get_LLD (TFT (File), Width, Scale)); Item := Num'Fixed_Value (Aux.Get_LLD (TFT (File), Width, Scale));
-- Item := Num'Fixed_Value (Aux.Get_LLD (TFT (File), Width, Scale));
-- above is what we should write, but gets assert error ???
else else
Item := Num (Aux.Get_Dec (TFT (File), Width, Scale)); Item := Num'Fixed_Value (Aux.Get_Dec (TFT (File), Width, Scale));
-- Item := Num'Fixed_Value (Aux.Get_Dec (TFT (File), Width, Scale));
-- above is what we should write, but gets assert error ???
end if; end if;
exception exception
when Constraint_Error => raise Data_Error; when Constraint_Error => raise Data_Error;
end Get; end Get;
......
...@@ -477,21 +477,17 @@ package body Ada.Wide_Text_IO.Editing is ...@@ -477,21 +477,17 @@ package body Ada.Wide_Text_IO.Editing is
raise Layout_Error; raise Layout_Error;
end if; end if;
if Pic.Radix_Position = Invalid_Position then Position :=
Position := Answer'Last; (if Pic.Radix_Position = Invalid_Position then Answer'Last
else else Pic.Radix_Position - 1);
Position := Pic.Radix_Position - 1;
end if;
for J in reverse Attrs.Start_Of_Int .. Attrs.End_Of_Int loop for J in reverse Attrs.Start_Of_Int .. Attrs.End_Of_Int loop
while Answer (Position) /= '9' while Answer (Position) /= '9'
and then and then
Answer (Position) /= Pic.Floater Answer (Position) /= Pic.Floater
loop loop
if Answer (Position) = '_' then if Answer (Position) = '_' then
Answer (Position) := Separator_Character; Answer (Position) := Separator_Character;
elsif Answer (Position) = 'b' then elsif Answer (Position) = 'b' then
Answer (Position) := ' '; Answer (Position) := ' ';
end if; end if;
...@@ -790,25 +786,22 @@ package body Ada.Wide_Text_IO.Editing is ...@@ -790,25 +786,22 @@ package body Ada.Wide_Text_IO.Editing is
-- No trailing digits, but now J may need to stick in a currency -- No trailing digits, but now J may need to stick in a currency
-- symbol or sign. -- symbol or sign.
if Pic.Start_Currency = Invalid_Position then Position :=
Position := Answer'Last + 1; (if Pic.Start_Currency = Invalid_Position then Answer'Last + 1
else else Pic.Start_Currency);
Position := Pic.Start_Currency;
end if;
end if; end if;
for J in Position .. Answer'Last loop for J in Position .. Answer'Last loop
if Pic.Start_Currency /= Invalid_Position and then if Pic.Start_Currency /= Invalid_Position and then
Answer (Pic.Start_Currency) = '#' then Answer (Pic.Start_Currency) = '#' then
Currency_Pos := 1; Currency_Pos := 1;
end if; end if;
-- Note: There are some weird cases J can imagine with 'b' or '#' -- Note: There are some weird cases J can imagine with 'b' or '#' in
-- in currency strings where the following code will cause -- currency strings where the following code will cause glitches. The
-- glitches. The trick is to tell when the character in the -- trick is to tell when the character in the answer should be
-- answer should be checked, and when to look at the original -- checked, and when to look at the original string. Some other time.
-- string. Some other time. RIE 11/26/96 ??? -- RIE 11/26/96 ???
case Answer (J) is case Answer (J) is
when '*' => when '*' =>
...@@ -942,8 +935,9 @@ package body Ada.Wide_Text_IO.Editing is ...@@ -942,8 +935,9 @@ package body Ada.Wide_Text_IO.Editing is
-- 1) Expand $, replace '.' with Radix_Point -- 1) Expand $, replace '.' with Radix_Point
return Answer (1 .. Currency_Pos - 1) & Currency_Symbol & return
Answer (Currency_Pos + 1 .. Answer'Last); Answer (1 .. Currency_Pos - 1) & Currency_Symbol &
Answer (Currency_Pos + 1 .. Answer'Last);
else else
-- 2) No currency expansion, replace '.' with Radix_Point -- 2) No currency expansion, replace '.' with Radix_Point
......
...@@ -244,11 +244,8 @@ package body Ada.Wide_Wide_Text_IO.Decimal_Aux is ...@@ -244,11 +244,8 @@ package body Ada.Wide_Wide_Text_IO.Decimal_Aux is
Ptr : Natural := 0; Ptr : Natural := 0;
begin begin
if Exp = 0 then Fore :=
Fore := To'Length - 1 - Aft; (if Exp = 0 then To'Length - 1 - Aft else To'Length - 2 - Aft - Exp);
else
Fore := To'Length - 2 - Aft - Exp;
end if;
if Fore < 1 then if Fore < 1 then
raise Layout_Error; raise Layout_Error;
......
...@@ -54,16 +54,10 @@ package body Ada.Wide_Wide_Text_IO.Decimal_IO is ...@@ -54,16 +54,10 @@ package body Ada.Wide_Wide_Text_IO.Decimal_IO is
is is
begin begin
if Num'Size > Integer'Size then if Num'Size > Integer'Size then
Item := Num (Aux.Get_LLD (TFT (File), Width, Scale)); Item := Num'Fixed_Value (Aux.Get_LLD (TFT (File), Width, Scale));
-- Item := Num'Fixed_Value (Aux.Get_LLD (TFT (File), Width, Scale));
-- above is what we should write, but gets assert error ???
else else
Item := Num (Aux.Get_Dec (TFT (File), Width, Scale)); Item := Num'Fixed_Value (Aux.Get_Dec (TFT (File), Width, Scale));
-- Item := Num'Fixed_Value (Aux.Get_Dec (TFT (File), Width, Scale));
-- above is what we should write, but gets assert error ???
end if; end if;
exception exception
when Constraint_Error => raise Data_Error; when Constraint_Error => raise Data_Error;
end Get; end Get;
......
...@@ -478,21 +478,17 @@ package body Ada.Wide_Wide_Text_IO.Editing is ...@@ -478,21 +478,17 @@ package body Ada.Wide_Wide_Text_IO.Editing is
raise Layout_Error; raise Layout_Error;
end if; end if;
if Pic.Radix_Position = Invalid_Position then Position :=
Position := Answer'Last; (if Pic.Radix_Position = Invalid_Position then Answer'Last
else else Pic.Radix_Position - 1);
Position := Pic.Radix_Position - 1;
end if;
for J in reverse Attrs.Start_Of_Int .. Attrs.End_Of_Int loop for J in reverse Attrs.Start_Of_Int .. Attrs.End_Of_Int loop
while Answer (Position) /= '9' while Answer (Position) /= '9'
and then and then
Answer (Position) /= Pic.Floater Answer (Position) /= Pic.Floater
loop loop
if Answer (Position) = '_' then if Answer (Position) = '_' then
Answer (Position) := Separator_Character; Answer (Position) := Separator_Character;
elsif Answer (Position) = 'b' then elsif Answer (Position) = 'b' then
Answer (Position) := ' '; Answer (Position) := ' ';
end if; end if;
...@@ -791,15 +787,12 @@ package body Ada.Wide_Wide_Text_IO.Editing is ...@@ -791,15 +787,12 @@ package body Ada.Wide_Wide_Text_IO.Editing is
-- No trailing digits, but now J may need to stick in a currency -- No trailing digits, but now J may need to stick in a currency
-- symbol or sign. -- symbol or sign.
if Pic.Start_Currency = Invalid_Position then Position :=
Position := Answer'Last + 1; (if Pic.Start_Currency = Invalid_Position then Answer'Last + 1
else else Pic.Start_Currency);
Position := Pic.Start_Currency;
end if;
end if; end if;
for J in Position .. Answer'Last loop for J in Position .. Answer'Last loop
if Pic.Start_Currency /= Invalid_Position and then if Pic.Start_Currency /= Invalid_Position and then
Answer (Pic.Start_Currency) = '#' then Answer (Pic.Start_Currency) = '#' then
Currency_Pos := 1; Currency_Pos := 1;
......
...@@ -5271,9 +5271,15 @@ implementation unit. ...@@ -5271,9 +5271,15 @@ implementation unit.
@item -gnatw.i @item -gnatw.i
@emph{Activate warnings on overlapping actuals.} @emph{Activate warnings on overlapping actuals.}
@cindex @option{-gnatw.i} (@command{gcc}) @cindex @option{-gnatw.i} (@command{gcc})
This switch enables a warning on statically detectable overlapping actuals This switch enables a warning on statically detectable overlapping actuals in
in a subprogram call, when one of the actuals is an in-out parameter, and a subprogram call, when one of the actuals is an in-out parameter, and the
the types of the actuals are not by-copy types. types of the actuals are not by-copy types. The warning is off by default,
and is not included under -gnatwa.
@item -gnatw.I
@emph{Disable warnings on overlapping actuals.}
@cindex @option{-gnatw.I} (@command{gcc})
This switch disables warnings on overlapping actuals in a call..
@item -gnatwj @item -gnatwj
@emph{Activate warnings on obsolescent features (Annex J).} @emph{Activate warnings on obsolescent features (Annex J).}
...@@ -1612,6 +1612,7 @@ begin ...@@ -1612,6 +1612,7 @@ begin
elsif Argv.all = "-eL" then elsif Argv.all = "-eL" then
Follow_Links_For_Files := True; Follow_Links_For_Files := True;
Follow_Links_For_Dirs := True;
Remove_Switch (Arg_Num); Remove_Switch (Arg_Num);
......
...@@ -385,6 +385,7 @@ procedure Gnatname is ...@@ -385,6 +385,7 @@ procedure Gnatname is
elsif Arg = "-eL" then elsif Arg = "-eL" then
Opt.Follow_Links_For_Files := True; Opt.Follow_Links_For_Files := True;
Opt.Follow_Links_For_Dirs := True;
-- -f -- -f
......
...@@ -328,7 +328,9 @@ package body Makeutl is ...@@ -328,7 +328,9 @@ package body Makeutl is
return ""; return "";
end if; end if;
return Normalize_Pathname (Exec (Exec'First .. Path_Last - 4)) return Normalize_Pathname
(Exec (Exec'First .. Path_Last - 4),
Resolve_Links => Opt.Follow_Links_For_Dirs)
& Directory_Separator; & Directory_Separator;
end Get_Install_Dir; end Get_Install_Dir;
......
...@@ -663,7 +663,7 @@ package Opt is ...@@ -663,7 +663,7 @@ package Opt is
-- still valid if they point to a file which is outside of the project), -- still valid if they point to a file which is outside of the project),
-- and that no directory has a name which is a valid source name. -- and that no directory has a name which is a valid source name.
Follow_Links_For_Dirs : Boolean := True; Follow_Links_For_Dirs : Boolean := False;
-- PROJECT MANAGER -- PROJECT MANAGER
-- Set to True if directories can be links in this project, and therefore -- Set to True if directories can be links in this project, and therefore
-- additional system calls must be performed to ensure that we always see -- additional system calls must be performed to ensure that we always see
......
...@@ -80,7 +80,8 @@ package body Osint is ...@@ -80,7 +80,8 @@ package body Osint is
-- Appends Suffix to Name and returns the new name -- Appends Suffix to Name and returns the new name
function OS_Time_To_GNAT_Time (T : OS_Time) return Time_Stamp_Type; function OS_Time_To_GNAT_Time (T : OS_Time) return Time_Stamp_Type;
-- Convert OS format time to GNAT format time stamp -- Convert OS format time to GNAT format time stamp.
-- Returns Empty_Time_Stamp if T is Invalid_Time
function Executable_Prefix return String_Ptr; function Executable_Prefix return String_Ptr;
-- Returns the name of the root directory where the executable is stored. -- Returns the name of the root directory where the executable is stored.
...@@ -970,12 +971,13 @@ package body Osint is ...@@ -970,12 +971,13 @@ package body Osint is
Get_Name_String (Name); Get_Name_String (Name);
if not Is_Regular_File (Name_Buffer (1 .. Name_Len)) then -- File_Time_Stamp will always return Invalid_Time if the file does not
return Empty_Time_Stamp; -- exist, and that OS_Time_To_GNAT_Time will convert that to
else -- Empty_Time_Stamp. Therefore we do not need to first test whether the
Name_Buffer (Name_Len + 1) := ASCII.NUL; -- file actually exists, which saves a system call
return OS_Time_To_GNAT_Time (File_Time_Stamp (Name_Buffer));
end if; return OS_Time_To_GNAT_Time
(File_Time_Stamp (Name_Buffer (1 .. Name_Len)));
end File_Stamp; end File_Stamp;
function File_Stamp (Name : Path_Name_Type) return Time_Stamp_Type is function File_Stamp (Name : Path_Name_Type) return Time_Stamp_Type is
...@@ -1887,6 +1889,10 @@ package body Osint is ...@@ -1887,6 +1889,10 @@ package body Osint is
S : Second_Type; S : Second_Type;
begin begin
if T = Invalid_Time then
return Empty_Time_Stamp;
end if;
GM_Split (T, Y, Mo, D, H, Mn, S); GM_Split (T, Y, Mo, D, H, Mn, S);
Make_Time_Stamp Make_Time_Stamp
(Year => Nat (Y), (Year => Nat (Y),
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
with System.OS_Lib; use System.OS_Lib; with System.OS_Lib; use System.OS_Lib;
with Hostparm; with Hostparm;
with Makeutl; use Makeutl; with Makeutl; use Makeutl;
with Opt;
with Osint; use Osint; with Osint; use Osint;
with Prj.Tree; use Prj.Tree; with Prj.Tree; use Prj.Tree;
with Sdefault; with Sdefault;
...@@ -212,7 +213,9 @@ package body Prj.Ext is ...@@ -212,7 +213,9 @@ package body Prj.Ext is
declare declare
New_Dir : constant String := New_Dir : constant String :=
Normalize_Pathname (Name_Buffer (First .. Last)); Normalize_Pathname
(Name_Buffer (First .. Last),
Resolve_Links => Opt.Follow_Links_For_Dirs);
begin begin
-- If the absolute path was resolved and is different from -- If the absolute path was resolved and is different from
......
...@@ -239,7 +239,7 @@ package body Sem_Case is ...@@ -239,7 +239,7 @@ package body Sem_Case is
" alternatives must cover base type", Expr, Expr); " alternatives must cover base type", Expr, Expr);
else else
Error_Msg_N ("expression is not static," & Error_Msg_N ("subtype of expression is not static," &
" alternatives must cover base type!", Expr); " alternatives must cover base type!", Expr);
end if; end if;
...@@ -249,8 +249,8 @@ package body Sem_Case is ...@@ -249,8 +249,8 @@ package body Sem_Case is
elsif not Is_Entity_Name (Expr) then elsif not Is_Entity_Name (Expr) then
Error_Msg_N Error_Msg_N
("expression is not static, alternatives must cover base type!", ("subtype of expression is not static, " &
Expr); "alternatives must cover base type!", Expr);
end if; end if;
end Explain_Non_Static_Bound; end Explain_Non_Static_Bound;
......
...@@ -656,6 +656,7 @@ package body Switch.M is ...@@ -656,6 +656,7 @@ package body Switch.M is
else else
Follow_Links_For_Files := True; Follow_Links_For_Files := True;
Follow_Links_For_Dirs := True;
end if; end if;
-- Processing for eS switch -- Processing for eS switch
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment