Commit ae05cdd6 by Robert Dewar Committed by Arnaud Charlet

exp_prag.adb, [...]: Minor reformatting.

2013-01-04  Robert Dewar  <dewar@adacore.com>

	* exp_prag.adb, gnatcmd.adb, exp_util.adb, table.adb, sem_prag.adb,
	freeze.adb, sem_ch4.adb, sem_warn.adb, opt.ads, exp_aggr.adb,
	prj-conf.adb, sem_ch13.adb: Minor reformatting.

From-SVN: r194888
parent 3a3af4c3
2013-01-04 Robert Dewar <dewar@adacore.com>
* exp_prag.adb, gnatcmd.adb, exp_util.adb, table.adb, sem_prag.adb,
freeze.adb, sem_ch4.adb, sem_warn.adb, opt.ads, exp_aggr.adb,
prj-conf.adb, sem_ch13.adb: Minor reformatting.
2013-01-04 Thomas Quinot <quinot@adacore.com> 2013-01-04 Thomas Quinot <quinot@adacore.com>
* sinfo.ads: Minor documentation update. * sinfo.ads: Minor documentation update.
......
...@@ -2962,9 +2962,10 @@ package body Exp_Aggr is ...@@ -2962,9 +2962,10 @@ package body Exp_Aggr is
Node_After : Node_Id) Node_After : Node_Id)
is is
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
Init_Actions : constant List_Id := New_List;
Init_Node : Node_Id; Init_Node : Node_Id;
EA : Node_Id; EA : Node_Id;
Init_Actions : constant List_Id := New_List;
begin begin
-- Nothing to do if Obj is already frozen, as in this case we known we -- Nothing to do if Obj is already frozen, as in this case we known we
-- won't need to move the initialization statements about later on. -- won't need to move the initialization statements about later on.
...@@ -2974,15 +2975,15 @@ package body Exp_Aggr is ...@@ -2974,15 +2975,15 @@ package body Exp_Aggr is
end if; end if;
Init_Node := N; Init_Node := N;
while Next (Init_Node) /= Node_After loop while Next (Init_Node) /= Node_After loop
Append_To (Init_Actions, Remove_Next (Init_Node)); Append_To (Init_Actions, Remove_Next (Init_Node));
end loop; end loop;
if not Is_Empty_List (Init_Actions) then if not Is_Empty_List (Init_Actions) then
EA := Make_Expression_With_Actions (Loc, EA :=
Actions => Init_Actions, Make_Expression_With_Actions (Loc,
Expression => Make_Null_Statement (Loc)); Actions => Init_Actions,
Expression => Make_Null_Statement (Loc));
Insert_Action_After (Init_Node, EA); Insert_Action_After (Init_Node, EA);
Set_Initialization_Statements (Obj, EA); Set_Initialization_Statements (Obj, EA);
end if; end if;
...@@ -5123,6 +5124,7 @@ package body Exp_Aggr is ...@@ -5123,6 +5124,7 @@ package body Exp_Aggr is
if Comes_From_Source (Tmp) then if Comes_From_Source (Tmp) then
declare declare
Node_After : constant Node_Id := Next (Parent_Node); Node_After : constant Node_Id := Next (Parent_Node);
begin begin
Insert_Actions_After (Parent_Node, Aggr_Code); Insert_Actions_After (Parent_Node, Aggr_Code);
......
...@@ -530,16 +530,16 @@ package body Exp_Prag is ...@@ -530,16 +530,16 @@ package body Exp_Prag is
-- Expand_Pragma_Import_Or_Interface -- -- Expand_Pragma_Import_Or_Interface --
--------------------------------------- ---------------------------------------
-- When applied to a variable, the default initialization must not be -- When applied to a variable, the default initialization must not be done.
-- done. As it is already done when the pragma is found, we just get rid -- As it is already done when the pragma is found, we just get rid of the
-- of the call the initialization procedure which followed the object -- call the initialization procedure which followed the object declaration.
-- declaration. The call is inserted after the declaration, but validity -- The call is inserted after the declaration, but validity checks may
-- checks may also have been inserted and the initialization call does -- also have been inserted and the initialization call does not necessarily
-- not necessarily appear immediately after the object declaration. -- appear immediately after the object declaration.
-- We can't use the freezing mechanism for this purpose, since we -- We can't use the freezing mechanism for this purpose, since we have to
-- have to elaborate the initialization expression when it is first -- elaborate the initialization expression when it is first seen (i.e. this
-- seen (i.e. this elaboration cannot be deferred to the freeze point). -- elaboration cannot be deferred to the freeze point).
procedure Expand_Pragma_Import_Or_Interface (N : Node_Id) is procedure Expand_Pragma_Import_Or_Interface (N : Node_Id) is
Def_Id : Entity_Id; Def_Id : Entity_Id;
...@@ -553,11 +553,11 @@ package body Exp_Prag is ...@@ -553,11 +553,11 @@ package body Exp_Prag is
Init_Call := Remove_Init_Call (Def_Id, Rep_Clause => N); Init_Call := Remove_Init_Call (Def_Id, Rep_Clause => N);
-- Any default initialization expression should be removed -- Any default initialization expression should be removed (e.g.,
-- (e.g., null defaults for access objects, zero initialization -- null defaults for access objects, zero initialization of packed
-- of packed bit arrays). Imported objects aren't allowed to -- bit arrays). Imported objects aren't allowed to have explicit
-- have explicit initialization, so the expression must have -- initialization, so the expression must have been generated by
-- been generated by the compiler. -- the compiler.
if No (Init_Call) and then Present (Expression (Parent (Def_Id))) then if No (Init_Call) and then Present (Expression (Parent (Def_Id))) then
Set_Expression (Parent (Def_Id), Empty); Set_Expression (Parent (Def_Id), Empty);
......
...@@ -6227,9 +6227,9 @@ package body Exp_Util is ...@@ -6227,9 +6227,9 @@ package body Exp_Util is
function Find_Init_Call_In_List (From : Node_Id) return Node_Id is function Find_Init_Call_In_List (From : Node_Id) return Node_Id is
Init_Call : Node_Id; Init_Call : Node_Id;
begin begin
Init_Call := From; Init_Call := From;
while Present (Init_Call) and then Init_Call /= Rep_Clause loop while Present (Init_Call) and then Init_Call /= Rep_Clause loop
if Nkind (Init_Call) = N_Procedure_Call_Statement if Nkind (Init_Call) = N_Procedure_Call_Statement
and then Is_Entity_Name (Name (Init_Call)) and then Is_Entity_Name (Name (Init_Call))
......
...@@ -1114,9 +1114,7 @@ package body Freeze is ...@@ -1114,9 +1114,7 @@ package body Freeze is
Attribute_Scalar_Storage_Order); Attribute_Scalar_Storage_Order);
if Is_Record_Type (Comp_Type) or else Is_Array_Type (Comp_Type) then if Is_Record_Type (Comp_Type) or else Is_Array_Type (Comp_Type) then
if Present (Comp) if Present (Comp) and then Chars (Comp) = Name_uParent then
and then Chars (Comp) = Name_uParent
then
if Reverse_Storage_Order (Encl_Type) if Reverse_Storage_Order (Encl_Type)
/= /=
Reverse_Storage_Order (Comp_Type) Reverse_Storage_Order (Comp_Type)
...@@ -3358,9 +3356,8 @@ package body Freeze is ...@@ -3358,9 +3356,8 @@ package body Freeze is
Initialization_Statements (E); Initialization_Statements (E);
begin begin
if Present (Init_Stmts) if Present (Init_Stmts)
and then Nkind (Init_Stmts) = N_Expression_With_Actions and then Nkind (Init_Stmts) = N_Expression_With_Actions
and then Nkind (Expression (Init_Stmts)) and then Nkind (Expression (Init_Stmts)) = N_Null_Statement
= N_Null_Statement
then then
Insert_List_Before (Init_Stmts, Actions (Init_Stmts)); Insert_List_Before (Init_Stmts, Actions (Init_Stmts));
Remove (Init_Stmts); Remove (Init_Stmts);
......
...@@ -2001,10 +2001,10 @@ begin ...@@ -2001,10 +2001,10 @@ begin
Name_Len := 0; Name_Len := 0;
-- If the single main has been specified as an absolute -- If the single main has been specified as an absolute
-- path, we use only the simple file name. If the -- path, use only the simple file name. If the absolute
-- absolute path is incorrect, an error will be reported -- path is incorrect, an error will be reported by the
-- by the underlying tool and it does not make a -- underlying tool and it does not make a difference
-- difference what switches are used. -- what switches are used.
if Is_Absolute_Path (Main.all) then if Is_Absolute_Path (Main.all) then
Add_Str_To_Name_Buffer (File_Name (Main.all)); Add_Str_To_Name_Buffer (File_Name (Main.all));
......
...@@ -537,16 +537,16 @@ package Opt is ...@@ -537,16 +537,16 @@ package Opt is
-- Determines the handling of exceptions. See Exp_Ch11 for details -- Determines the handling of exceptions. See Exp_Ch11 for details
-- --
(Front_End_Setjmp_Longjmp_Exceptions, (Front_End_Setjmp_Longjmp_Exceptions,
-- Exceptions use setjmp/longjmp generated explicitly by the -- Exceptions use setjmp/longjmp generated explicitly by the front end
-- front end (this includes gigi or other equivalent parts of -- (this includes gigi or other equivalent parts of the code generator).
-- the code generator). AT END handlers are converted into -- AT END handlers are converted into exception handlers by the front
-- exception handlers by the front end in this mode. -- end in this mode.
Back_End_Exceptions); Back_End_Exceptions);
-- Exceptions are handled by the back end. The front end simply -- Exceptions are handled by the back end. The front end simply
-- generates the handlers as they appear in the source, and AT -- generates the handlers as they appear in the source, and AT END
-- END handlers are left untouched (they are not converted into -- handlers are left untouched (they are not converted into exception
-- exception handlers when operating in this mode. -- handlers when operating in this mode.
pragma Convention (C, Exception_Mechanism_Type); pragma Convention (C, Exception_Mechanism_Type);
Exception_Mechanism : Exception_Mechanism_Type := Exception_Mechanism : Exception_Mechanism_Type :=
......
...@@ -1187,8 +1187,9 @@ package body Prj.Conf is ...@@ -1187,8 +1187,9 @@ package body Prj.Conf is
declare declare
Variable : Variable_Value; Variable : Variable_Value;
Proj : Project_Id; Proj : Project_Id;
Tgt_Name : Name_Id := No_Name; Tgt_Name : Name_Id := No_Name;
begin begin
Proj := Project; Proj := Project;
Project_Loop : Project_Loop :
...@@ -1196,9 +1197,9 @@ package body Prj.Conf is ...@@ -1196,9 +1197,9 @@ package body Prj.Conf is
Variable := Variable :=
Value_Of (Name_Target, Proj.Decl.Attributes, Shared); Value_Of (Name_Target, Proj.Decl.Attributes, Shared);
if Variable /= Nil_Variable_Value and then if Variable /= Nil_Variable_Value
not Variable.Default and then and then not Variable.Default
Variable.Value /= No_Name and then Variable.Value /= No_Name
then then
Tgt_Name := Variable.Value; Tgt_Name := Variable.Value;
exit Project_Loop; exit Project_Loop;
......
...@@ -1318,14 +1318,16 @@ package body Sem_Ch13 is ...@@ -1318,14 +1318,16 @@ package body Sem_Ch13 is
P_Name := A_Name; P_Name := A_Name;
elsif A_Name = Name_Link_Name then elsif A_Name = Name_Link_Name then
L_Assoc := Make_Pragma_Argument_Association (Loc, L_Assoc :=
Chars => A_Name, Make_Pragma_Argument_Association (Loc,
Expression => Relocate_Node (Expression (A))); Chars => A_Name,
Expression => Relocate_Node (Expression (A)));
elsif A_Name = Name_External_Name then elsif A_Name = Name_External_Name then
E_Assoc := Make_Pragma_Argument_Association (Loc, E_Assoc :=
Chars => A_Name, Make_Pragma_Argument_Association (Loc,
Expression => Relocate_Node (Expression (A))); Chars => A_Name,
Expression => Relocate_Node (Expression (A)));
end if; end if;
Next (A); Next (A);
...@@ -2905,6 +2907,7 @@ package body Sem_Ch13 is ...@@ -2905,6 +2907,7 @@ package body Sem_Ch13 is
declare declare
Init_Call : constant Node_Id := Init_Call : constant Node_Id :=
Remove_Init_Call (U_Ent, N); Remove_Init_Call (U_Ent, N);
begin begin
if Present (Init_Call) then if Present (Init_Call) then
...@@ -2912,8 +2915,8 @@ package body Sem_Ch13 is ...@@ -2912,8 +2915,8 @@ package body Sem_Ch13 is
-- null expression, just extract the actions. -- null expression, just extract the actions.
if Nkind (Init_Call) = N_Expression_With_Actions if Nkind (Init_Call) = N_Expression_With_Actions
and then Nkind (Expression (Init_Call)) and then
= N_Null_Statement Nkind (Expression (Init_Call)) = N_Null_Statement
then then
Append_Freeze_Actions (U_Ent, Actions (Init_Call)); Append_Freeze_Actions (U_Ent, Actions (Init_Call));
...@@ -2930,9 +2933,8 @@ package body Sem_Ch13 is ...@@ -2930,9 +2933,8 @@ package body Sem_Ch13 is
("& cannot be exported if an address clause is given", ("& cannot be exported if an address clause is given",
Nam); Nam);
Error_Msg_N Error_Msg_N
("\define and export a variable " & ("\define and export a variable "
"that holds its address instead", & "that holds its address instead", Nam);
Nam);
end if; end if;
-- Entity has delayed freeze, so we will generate an -- Entity has delayed freeze, so we will generate an
...@@ -4698,15 +4700,19 @@ package body Sem_Ch13 is ...@@ -4698,15 +4700,19 @@ package body Sem_Ch13 is
function Is_Inherited (Comp : Entity_Id) return Boolean is function Is_Inherited (Comp : Entity_Id) return Boolean is
Comp_Base : Entity_Id; Comp_Base : Entity_Id;
begin begin
if Ekind (Rectype) = E_Record_Subtype then if Ekind (Rectype) = E_Record_Subtype then
Comp_Base := Original_Record_Component (Comp); Comp_Base := Original_Record_Component (Comp);
else else
Comp_Base := Comp; Comp_Base := Comp;
end if; end if;
return Comp_Base /= Original_Record_Component (Comp_Base); return Comp_Base /= Original_Record_Component (Comp_Base);
end Is_Inherited; end Is_Inherited;
-- Local variables
Is_Record_Extension : Boolean; Is_Record_Extension : Boolean;
-- True if Rectype is a record extension -- True if Rectype is a record extension
...@@ -4723,9 +4729,7 @@ package body Sem_Ch13 is ...@@ -4723,9 +4729,7 @@ package body Sem_Ch13 is
Find_Type (Ident); Find_Type (Ident);
Rectype := Entity (Ident); Rectype := Entity (Ident);
if Rectype = Any_Type if Rectype = Any_Type or else Rep_Item_Too_Early (Rectype, N) then
or else Rep_Item_Too_Early (Rectype, N)
then
return; return;
else else
Rectype := Underlying_Type (Rectype); Rectype := Underlying_Type (Rectype);
...@@ -5155,8 +5159,9 @@ package body Sem_Ch13 is ...@@ -5155,8 +5159,9 @@ package body Sem_Ch13 is
return Empty; return Empty;
end if; end if;
SId := Make_Defining_Identifier (Loc, SId :=
Chars => New_External_Name (Chars (Typ), "Invariant")); Make_Defining_Identifier (Loc,
Chars => New_External_Name (Chars (Typ), "Invariant"));
Set_Has_Invariants (SId); Set_Has_Invariants (SId);
Set_Has_Invariants (Typ); Set_Has_Invariants (Typ);
Set_Ekind (SId, E_Procedure); Set_Ekind (SId, E_Procedure);
...@@ -8779,10 +8784,11 @@ package body Sem_Ch13 is ...@@ -8779,10 +8784,11 @@ package body Sem_Ch13 is
Designated_Type (Etype (F)), Loc)))); Designated_Type (Etype (F)), Loc))));
if Nam = TSS_Stream_Input then if Nam = TSS_Stream_Input then
Spec := Make_Function_Specification (Loc, Spec :=
Defining_Unit_Name => Subp_Id, Make_Function_Specification (Loc,
Parameter_Specifications => Formals, Defining_Unit_Name => Subp_Id,
Result_Definition => T_Ref); Parameter_Specifications => Formals,
Result_Definition => T_Ref);
else else
-- V : [out] T -- V : [out] T
......
...@@ -1902,6 +1902,8 @@ package body Sem_Ch4 is ...@@ -1902,6 +1902,8 @@ package body Sem_Ch4 is
exit when No (A); exit when No (A);
end loop; end loop;
-- This test needs a comment ???
if Nkind (Expression (N)) = N_Null_Statement then if Nkind (Expression (N)) = N_Null_Statement then
Set_Etype (N, Standard_Void_Type); Set_Etype (N, Standard_Void_Type);
else else
......
...@@ -6775,7 +6775,7 @@ package body Sem_Prag is ...@@ -6775,7 +6775,7 @@ package body Sem_Prag is
if Volatile_Seen if Volatile_Seen
and then and then
((Input_Seen and then Output_Seen) -- both ((Input_Seen and then Output_Seen) -- both
or else or else
(not Input_Seen and then not Output_Seen)) -- none (not Input_Seen and then not Output_Seen)) -- none
then then
Error_Msg_N Error_Msg_N
...@@ -6785,7 +6785,7 @@ package body Sem_Prag is ...@@ -6785,7 +6785,7 @@ package body Sem_Prag is
-- Either Input or Output require Volatile -- Either Input or Output require Volatile
if (Input_Seen or else Output_Seen) if (Input_Seen or Output_Seen)
and then not Volatile_Seen and then not Volatile_Seen
then then
Error_Msg_N Error_Msg_N
......
...@@ -3281,7 +3281,7 @@ package body Sem_Warn is ...@@ -3281,7 +3281,7 @@ package body Sem_Warn is
begin begin
return return
(Warn_On_Modified_Unread and then Is_Only_Out_Parameter (E)) (Warn_On_Modified_Unread and then Is_Only_Out_Parameter (E))
or else Warn_On_All_Unread_Out_Parameters; or else Warn_On_All_Unread_Out_Parameters;
end Warn_On_Modified_As_Out_Parameter; end Warn_On_Modified_As_Out_Parameter;
--------------------------------- ---------------------------------
...@@ -3293,7 +3293,7 @@ package body Sem_Warn is ...@@ -3293,7 +3293,7 @@ package body Sem_Warn is
Form1, Form2 : Entity_Id; Form1, Form2 : Entity_Id;
function Is_Covered_Formal (Formal : Node_Id) return Boolean; function Is_Covered_Formal (Formal : Node_Id) return Boolean;
-- Return True if Formal is covered by the rule. -- Return True if Formal is covered by the rule
function Refer_Same_Object (Act1, Act2 : Node_Id) return Boolean; function Refer_Same_Object (Act1, Act2 : Node_Id) return Boolean;
-- Two names are known to refer to the same object if the two names -- Two names are known to refer to the same object if the two names
...@@ -3321,11 +3321,10 @@ package body Sem_Warn is ...@@ -3321,11 +3321,10 @@ package body Sem_Warn is
function Is_Covered_Formal (Formal : Node_Id) return Boolean is function Is_Covered_Formal (Formal : Node_Id) return Boolean is
begin begin
return return
Ekind_In (Formal, E_Out_Parameter, Ekind_In (Formal, E_Out_Parameter, E_In_Out_Parameter)
E_In_Out_Parameter)
and then (Is_Elementary_Type (Etype (Formal)) and then (Is_Elementary_Type (Etype (Formal))
or else Is_Record_Type (Etype (Formal)) or else Is_Record_Type (Etype (Formal))
or else Is_Array_Type (Etype (Formal))); or else Is_Array_Type (Etype (Formal)));
end Is_Covered_Formal; end Is_Covered_Formal;
begin begin
...@@ -3347,13 +3346,12 @@ package body Sem_Warn is ...@@ -3347,13 +3346,12 @@ package body Sem_Warn is
-- there is no other name among the other parameters of mode in out or -- 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)) -- out to C that is known to denote the same object (RM 6.4.1(6.15/3))
-- Compiling under -gnatw.i we also report warnings on overlapping -- If appropriate warning switch is set, we also report warnings on
-- parameters that are record types or array types. -- overlapping parameters that are record types or array types.
Form1 := First_Formal (Subp); Form1 := First_Formal (Subp);
Act1 := First_Actual (N); Act1 := First_Actual (N);
while Present (Form1) and then Present (Act1) loop while Present (Form1) and then Present (Act1) loop
if Is_Covered_Formal (Form1) then if Is_Covered_Formal (Form1) then
Form2 := First_Formal (Subp); Form2 := First_Formal (Subp);
Act2 := First_Actual (N); Act2 := First_Actual (N);
...@@ -3376,25 +3374,24 @@ package body Sem_Warn is ...@@ -3376,25 +3374,24 @@ package body Sem_Warn is
elsif Nkind (Act2) = N_Function_Call then elsif Nkind (Act2) = N_Function_Call then
null; null;
-- If type is not by-copy we can assume that the aliasing is -- If type is not by-copy, assume that aliasing is intended
-- intended.
elsif elsif
Present (Underlying_Type (Etype (Form1))) Present (Underlying_Type (Etype (Form1)))
and then and then
(Is_By_Reference_Type (Underlying_Type (Etype (Form1))) (Is_By_Reference_Type (Underlying_Type (Etype (Form1)))
or else or else
Convention (Underlying_Type (Etype (Form1))) Convention (Underlying_Type (Etype (Form1))) =
= Convention_Ada_Pass_By_Reference) Convention_Ada_Pass_By_Reference)
then then
null; null;
-- Under Ada 2012 we only report warnings on overlapping -- Under Ada 2012 we only report warnings on overlapping
-- arrays and record types if compiling under -gnatw.i -- arrays and record types if switch is set.
elsif Ada_Version >= Ada_2012 elsif Ada_Version >= Ada_2012
and then not Is_Elementary_Type (Etype (Form1)) and then not Is_Elementary_Type (Etype (Form1))
and then not Warn_On_Overlap and then not Warn_On_Overlap
then then
null; null;
...@@ -3449,7 +3446,7 @@ package body Sem_Warn is ...@@ -3449,7 +3446,7 @@ package body Sem_Warn is
& "actual for&?I?", Act1, Form); & "actual for&?I?", Act1, Form);
else else
-- For greater clarity, give name of formal. -- For greater clarity, give name of formal
Error_Msg_Node_2 := Form; Error_Msg_Node_2 := Form;
Error_Msg_FE Error_Msg_FE
...@@ -3460,8 +3457,8 @@ package body Sem_Warn is ...@@ -3460,8 +3457,8 @@ package body Sem_Warn is
else else
Error_Msg_Node_2 := Form; Error_Msg_Node_2 := Form;
Error_Msg_FE Error_Msg_FE
("writable actual for & overlaps with" ("writable actual for & overlaps with "
& " actual for&?I?", Act1, Form1); & "actual for&?I?", Act1, Form1);
end if; end if;
end; end;
end if; end if;
......
...@@ -172,7 +172,7 @@ package body Table is ...@@ -172,7 +172,7 @@ package body Table is
procedure Reallocate is procedure Reallocate is
New_Size : Memory.size_t; New_Size : Memory.size_t;
New_Length : Long_Integer; New_Length : Long_Long_Integer;
begin begin
if Max < Last_Val then if Max < Last_Val then
...@@ -188,12 +188,14 @@ package body Table is ...@@ -188,12 +188,14 @@ package body Table is
-- for the use of 10 here is to ensure that the table does really -- for the use of 10 here is to ensure that the table does really
-- increase in size (which would not be the case for a table of -- increase in size (which would not be the case for a table of
-- length 10 increased by 3% for instance). Do the intermediate -- length 10 increased by 3% for instance). Do the intermediate
-- calculation in Long_Integer to avoid overflow. -- calculation in Long_Long_Integer to avoid overflow. Note that
-- Long_Integer has the same range as Integer on Windows, so we
-- need Long_Long_.
while Max < Last_Val loop while Max < Last_Val loop
New_Length := New_Length :=
Long_Integer (Length) * Long_Long_Integer (Length) *
(100 + Long_Integer (Table_Increment)) (100 + Long_Long_Integer (Table_Increment))
/ 100; / 100;
Length := Int'Max (Int (New_Length), Length + 10); Length := Int'Max (Int (New_Length), Length + 10);
Max := Min + Length - 1; Max := Min + Length - 1;
......
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