Commit 9cb62ce3 by Arnaud Charlet

[multiple changes]

2012-10-04  Robert Dewar  <dewar@adacore.com>

	* sem_res.adb (Resolve_Set_Membership): Warn on duplicates.

2012-10-04  Emmanuel Briot  <briot@adacore.com>

	* g-comlin.adb (Getopt): Fix value of Full_Switch returned in case of
	invalid switch.

2012-10-04  Arnaud Charlet  <charlet@adacore.com>

	* gcc-interface/Make-lang.in: Update dependencies.

From-SVN: r192073
parent 9479ded4
2012-10-04 Robert Dewar <dewar@adacore.com> 2012-10-04 Robert Dewar <dewar@adacore.com>
* sem_res.adb (Resolve_Set_Membership): Warn on duplicates.
2012-10-04 Emmanuel Briot <briot@adacore.com>
* g-comlin.adb (Getopt): Fix value of Full_Switch returned in case of
invalid switch.
2012-10-04 Arnaud Charlet <charlet@adacore.com>
* gcc-interface/Make-lang.in: Update dependencies.
2012-10-04 Robert Dewar <dewar@adacore.com>
* sem_eval.adb (Fold_Str, Fold_Uint, Fold_Ureal): Reset static * sem_eval.adb (Fold_Str, Fold_Uint, Fold_Ureal): Reset static
expression state after Resolve call. expression state after Resolve call.
......
...@@ -39,6 +39,10 @@ with GNAT.OS_Lib; use GNAT.OS_Lib; ...@@ -39,6 +39,10 @@ with GNAT.OS_Lib; use GNAT.OS_Lib;
package body GNAT.Command_Line is package body GNAT.Command_Line is
-- General note: this entire body could use much more commenting. There
-- are large sections of uncommented code throughout, and many formal
-- parameters of local subprograms are not documented at all ???
package CL renames Ada.Command_Line; package CL renames Ada.Command_Line;
type Switch_Parameter_Type is type Switch_Parameter_Type is
...@@ -56,6 +60,12 @@ package body GNAT.Command_Line is ...@@ -56,6 +60,12 @@ package body GNAT.Command_Line is
Extra : Character := ASCII.NUL); Extra : Character := ASCII.NUL);
pragma Inline (Set_Parameter); pragma Inline (Set_Parameter);
-- Set the parameter that will be returned by Parameter below -- Set the parameter that will be returned by Parameter below
--
-- Extra is a character that needs to be added when reporting Full_Switch.
-- (it will in general be the switch character, for instance '-').
-- Otherwise, Full_Switch will report 'f' instead of '-f'. In particular,
-- it needs to be set when reporting an invalid switch or handling '*'.
--
-- Parameters need to be defined ??? -- Parameters need to be defined ???
function Goto_Next_Argument_In_Section (Parser : Opt_Parser) return Boolean; function Goto_Next_Argument_In_Section (Parser : Opt_Parser) return Boolean;
...@@ -95,9 +105,9 @@ package body GNAT.Command_Line is ...@@ -95,9 +105,9 @@ package body GNAT.Command_Line is
Index_In_Switches : out Integer; Index_In_Switches : out Integer;
Switch_Length : out Integer; Switch_Length : out Integer;
Param : out Switch_Parameter_Type); Param : out Switch_Parameter_Type);
-- Return the Longest switch from Switches that at least partially -- Return the Longest switch from Switches that at least partially matches
-- partially Arg. Index_In_Switches is set to 0 if none matches. -- Arg. Index_In_Switches is set to 0 if none matches. What are other
-- What are other parameters??? in particular Param is not always set??? -- parameters??? in particular Param is not always set???
procedure Unchecked_Free is new Ada.Unchecked_Deallocation procedure Unchecked_Free is new Ada.Unchecked_Deallocation
(Argument_List, Argument_List_Access); (Argument_List, Argument_List_Access);
...@@ -663,17 +673,45 @@ package body GNAT.Command_Line is ...@@ -663,17 +673,45 @@ package body GNAT.Command_Line is
if Index_Switches = 0 then if Index_Switches = 0 then
-- Depending on the value of Concatenate, the full switch is -- Find the current switch that we did not recognize. This is in
-- a single character or the rest of the argument. -- fact difficult because Getopt does not know explicitly about
-- short and long switches. Ideally, we would want the following
-- behavior:
-- * for short switches, with Concatenate:
-- if -a is not recognized, and the command line has -daf
-- we should report the invalid switch as "-a".
-- * for short switches, wihtout Concatenate:
-- we should report the invalid switch as "-daf".
-- * for long switches:
-- if the commadn line is "--long" we should report --long
-- as unrecongized.
-- Unfortunately, the fact that long switches start with a
-- duplicate switch character is just a convention (so we could
-- have a long switch "-long" for instance). We'll still rely on
-- this convention here to try and get as helpful an error message
-- as possible.
-- Long switch case (starting with double switch character)
if Arg (Arg'First + 1) = Parser.Switch_Character then
End_Index := Arg'Last;
-- Short switch case
else
End_Index := End_Index :=
(if Concatenate then Parser.Current_Index else Arg'Last); (if Concatenate then Parser.Current_Index else Arg'Last);
end if;
if Switches (Switches'First) = '*' then if Switches (Switches'First) = '*' then
-- Always prepend the switch character, so that users know that -- Always prepend the switch character, so that users know
-- this comes from a switch on the command line. This is -- that this comes from a switch on the command line. This
-- especially important when Concatenate is False, since -- is especially important when Concatenate is False, since
-- otherwise the current argument first character is lost. -- otherwise the current argument first character is lost.
if Parser.Section (Parser.Current_Argument) = 0 then if Parser.Section (Parser.Current_Argument) = 0 then
...@@ -696,11 +734,21 @@ package body GNAT.Command_Line is ...@@ -696,11 +734,21 @@ package body GNAT.Command_Line is
end if; end if;
end if; end if;
if Parser.Current_Index = Arg'First then
Set_Parameter Set_Parameter
(Parser.The_Switch, (Parser.The_Switch,
Arg_Num => Parser.Current_Argument, Arg_Num => Parser.Current_Argument,
First => Parser.Current_Index, First => Parser.Current_Index,
Last => End_Index); Last => End_Index);
else
Set_Parameter
(Parser.The_Switch,
Arg_Num => Parser.Current_Argument,
First => Parser.Current_Index,
Last => End_Index,
Extra => Parser.Switch_Character);
end if;
Parser.Current_Index := End_Index + 1; Parser.Current_Index := End_Index + 1;
raise Invalid_Switch; raise Invalid_Switch;
...@@ -762,7 +810,7 @@ package body GNAT.Command_Line is ...@@ -762,7 +810,7 @@ package body GNAT.Command_Line is
raise Invalid_Parameter; raise Invalid_Parameter;
end if; end if;
-- If the switch is of the form <switch> xxx -- Case of switch of the form <switch> xxx
elsif Parser.Current_Argument < Parser.Arg_Count elsif Parser.Current_Argument < Parser.Arg_Count
and then Parser.Section (Parser.Current_Argument + 1) /= 0 and then Parser.Section (Parser.Current_Argument + 1) /= 0
...@@ -830,7 +878,8 @@ package body GNAT.Command_Line is ...@@ -830,7 +878,8 @@ package body GNAT.Command_Line is
(Parser.The_Switch, (Parser.The_Switch,
Arg_Num => Parser.Current_Argument, Arg_Num => Parser.Current_Argument,
First => Parser.Current_Index, First => Parser.Current_Index,
Last => Arg'Last); Last => Arg'Last,
Extra => Parser.Switch_Character);
Parser.Current_Index := Arg'Last + 1; Parser.Current_Index := Arg'Last + 1;
raise Invalid_Switch; raise Invalid_Switch;
end if; end if;
...@@ -1170,9 +1219,7 @@ package body GNAT.Command_Line is ...@@ -1170,9 +1219,7 @@ package body GNAT.Command_Line is
procedure Unchecked_Free is new procedure Unchecked_Free is new
Ada.Unchecked_Deallocation (Opt_Parser_Data, Opt_Parser); Ada.Unchecked_Deallocation (Opt_Parser_Data, Opt_Parser);
begin begin
if Parser /= null if Parser /= null and then Parser /= Command_Line_Parser then
and then Parser /= Command_Line_Parser
then
Free (Parser.Arguments); Free (Parser.Arguments);
Unchecked_Free (Parser); Unchecked_Free (Parser);
end if; end if;
...@@ -1189,6 +1236,7 @@ package body GNAT.Command_Line is ...@@ -1189,6 +1236,7 @@ package body GNAT.Command_Line is
Section : String := "") Section : String := "")
is is
Def : Alias_Definition; Def : Alias_Definition;
begin begin
if Config = null then if Config = null then
Config := new Command_Line_Configuration_Record; Config := new Command_Line_Configuration_Record;
...@@ -1255,7 +1303,8 @@ package body GNAT.Command_Line is ...@@ -1255,7 +1303,8 @@ package body GNAT.Command_Line is
-- Add -- -- Add --
--------- ---------
procedure Add (Def : in out Alias_Definitions_List; procedure Add
(Def : in out Alias_Definitions_List;
Alias : Alias_Definition) Alias : Alias_Definition)
is is
procedure Unchecked_Free is new procedure Unchecked_Free is new
...@@ -1511,7 +1560,7 @@ package body GNAT.Command_Line is ...@@ -1511,7 +1560,7 @@ package body GNAT.Command_Line is
Foreach (Config, Section => Section); Foreach (Config, Section => Section);
-- Adding relevant aliases -- Add relevant aliases
if Config.Aliases /= null then if Config.Aliases /= null then
for A in Config.Aliases'Range loop for A in Config.Aliases'Range loop
...@@ -1585,8 +1634,8 @@ package body GNAT.Command_Line is ...@@ -1585,8 +1634,8 @@ package body GNAT.Command_Line is
function Real_Full_Switch function Real_Full_Switch
(S : Character; (S : Character;
Parser : Opt_Parser) return String; Parser : Opt_Parser) return String;
-- Ensure that the returned switch value contains the -- Ensure that the returned switch value contains the Switch_Char prefix
-- Switch_Char prefix if needed. -- if needed.
---------------------- ----------------------
-- Real_Full_Switch -- -- Real_Full_Switch --
...@@ -2465,13 +2514,12 @@ package body GNAT.Command_Line is ...@@ -2465,13 +2514,12 @@ package body GNAT.Command_Line is
((Cmd.Params (C) = null and then Param = "") ((Cmd.Params (C) = null and then Param = "")
or else or else
(Cmd.Params (C) /= null (Cmd.Params (C) /= null
and then
-- Ignore the separator stored in Parameter -- Ignore the separator stored in Parameter
and then
Cmd.Params (C) (Cmd.Params (C)'First + 1 Cmd.Params (C) (Cmd.Params (C)'First + 1
.. Cmd.Params (C)'Last) = .. Cmd.Params (C)'Last) = Param))
Param))
then then
Remove (Cmd.Expanded, C); Remove (Cmd.Expanded, C);
Remove (Cmd.Params, C); Remove (Cmd.Params, C);
...@@ -2550,9 +2598,7 @@ package body GNAT.Command_Line is ...@@ -2550,9 +2598,7 @@ package body GNAT.Command_Line is
-- Start of processing for Group_Switches -- Start of processing for Group_Switches
begin begin
if Cmd.Config = null if Cmd.Config = null or else Cmd.Config.Prefixes = null then
or else Cmd.Config.Prefixes = null
then
return; return;
end if; end if;
...@@ -2638,10 +2684,9 @@ package body GNAT.Command_Line is ...@@ -2638,10 +2684,9 @@ package body GNAT.Command_Line is
First : Natural; First : Natural;
procedure Check_Cb (Switch, Separator, Param : String; Index : Integer); procedure Check_Cb (Switch, Separator, Param : String; Index : Integer);
-- Checks whether the command line contains [Switch]. -- Checks whether the command line contains [Switch]. Sets the global
-- Sets the global variable [Found] appropriately. -- variable [Found] appropriately. This is called for each simple switch
-- This will be called for each simple switch that make up an alias, to -- that make up an alias, to know whether the alias should be applied.
-- know whether the alias should be applied.
procedure Remove_Cb (Switch, Separator, Param : String; Index : Integer); procedure Remove_Cb (Switch, Separator, Param : String; Index : Integer);
-- Remove the simple switch [Switch] from the command line, since it is -- Remove the simple switch [Switch] from the command line, since it is
...@@ -2708,9 +2753,7 @@ package body GNAT.Command_Line is ...@@ -2708,9 +2753,7 @@ package body GNAT.Command_Line is
-- Start of processing for Alias_Switches -- Start of processing for Alias_Switches
begin begin
if Cmd.Config = null if Cmd.Config = null or else Cmd.Config.Aliases = null then
or else Cmd.Config.Aliases = null
then
return; return;
end if; end if;
...@@ -3488,7 +3531,7 @@ package body GNAT.Command_Line is ...@@ -3488,7 +3531,7 @@ package body GNAT.Command_Line is
Put_Line (Standard_Error, Put_Line (Standard_Error,
Base_Name (Ada.Command_Line.Command_Name) Base_Name (Ada.Command_Line.Command_Name)
& ": unrecognized option '" & ": unrecognized option '"
& Parser.Switch_Character & Full_Switch (Parser) & Full_Switch (Parser)
& "'"); & "'");
Put_Line (Standard_Error, Put_Line (Standard_Error,
"Try `" "Try `"
......
...@@ -7686,9 +7686,10 @@ package body Sem_Res is ...@@ -7686,9 +7686,10 @@ package body Sem_Res is
procedure Resolve_Set_Membership is procedure Resolve_Set_Membership is
Alt : Node_Id; Alt : Node_Id;
Ltyp : constant Entity_Id := Etype (L);
begin begin
Resolve (L, Etype (L)); Resolve (L, Ltyp);
Alt := First (Alternatives (N)); Alt := First (Alternatives (N));
while Present (Alt) loop while Present (Alt) loop
...@@ -7699,11 +7700,51 @@ package body Sem_Res is ...@@ -7699,11 +7700,51 @@ package body Sem_Res is
if not Is_Entity_Name (Alt) if not Is_Entity_Name (Alt)
or else not Is_Type (Entity (Alt)) or else not Is_Type (Entity (Alt))
then then
Resolve (Alt, Etype (L)); Resolve (Alt, Ltyp);
end if; end if;
Next (Alt); Next (Alt);
end loop; end loop;
-- Check for duplicates for discrete case
if Is_Discrete_Type (Ltyp) then
declare
type Ent is record
Alt : Node_Id;
Val : Uint;
end record;
Alts : array (0 .. List_Length (Alternatives (N))) of Ent;
Nalts : Nat;
begin
-- Loop checking duplicates. This is quadratic, but giant sets
-- are unlikely in this context so it's a reasonable choice.
Nalts := 0;
Alt := First (Alternatives (N));
while Present (Alt) loop
if Is_Static_Expression (Alt)
and then (Nkind_In (Alt, N_Integer_Literal,
N_Character_Literal)
or else Nkind (Alt) in N_Has_Entity)
then
Nalts := Nalts + 1;
Alts (Nalts) := (Alt, Expr_Value (Alt));
for J in 1 .. Nalts - 1 loop
if Alts (J).Val = Alts (Nalts).Val then
Error_Msg_Sloc := Sloc (Alts (J).Alt);
Error_Msg_N ("duplicate of value given#?", Alt);
end if;
end loop;
end if;
Alt := Next (Alt);
end loop;
end;
end if;
end Resolve_Set_Membership; end Resolve_Set_Membership;
-- Start of processing for Resolve_Membership_Op -- Start of processing for Resolve_Membership_Op
......
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