+2013-10-14 Vincent Celier <celier@adacore.com>
+
+ * errout.adb (Write_Error_Summary): Do not output the number
+ of lines when Main_Source_File is unknown.
+ (Output_Messages): Do not write the header when Main_Source_File is
+ unknown.
+
+2013-10-14 Vincent Celier <celier@adacore.com>
+
+ * prep.adb (Expression): Accept terms of the form 'symbol <relop>
+ integer", where relop is =, <, <=, > or >=.
+ (Parse_Def_File): Accept literal integer values.
+ * gcc-interface/Make-lang.in: Add s-valint.o, s-valuns.o and
+ s-valuti.o to the compiler object files.
+
2013-10-14 Robert Dewar <dewar@adacore.com>
* exp_prag.adb, exp_ch11.adb, s-exctab.adb: Minor reformatting.
Set_Standard_Error;
end if;
- -- Message giving total number of lines
+ -- Message giving total number of lines, only when Main_Source_Line
+ -- is known.
- Write_Str (" ");
- Write_Int (Num_Source_Lines (Main_Source_File));
+ if Main_Source_File /= No_Source_File then
+ Write_Str (" ");
+ Write_Int (Num_Source_Lines (Main_Source_File));
- if Num_Source_Lines (Main_Source_File) = 1 then
- Write_Str (" line: ");
- else
- Write_Str (" lines: ");
+ if Num_Source_Lines (Main_Source_File) = 1 then
+ Write_Str (" line: ");
+ else
+ Write_Str (" lines: ");
+ end if;
end if;
if Total_Errors_Detected = 0 then
begin
Write_Eol;
- Write_Header (Sfile);
- Write_Eol;
+
+ -- Only write the header if Sfile is known
+
+ if Sfile /= No_Source_File then
+ Write_Header (Sfile);
+ Write_Eol;
+ end if;
-- Normally, we don't want an "error messages from file"
-- message when listing the entire file, so we set the
Current_Error_Source_File := Sfile;
end if;
- for N in 1 .. Last_Source_Line (Sfile) loop
- while E /= No_Error_Msg
- and then Errors.Table (E).Deleted
- loop
- E := Errors.Table (E).Next;
- end loop;
+ -- Only output the listing if Sfile is known, to avoid
+ -- crashing the compiler.
- Err_Flag :=
- E /= No_Error_Msg
- and then Errors.Table (E).Line = N
- and then Errors.Table (E).Sfile = Sfile;
+ if Sfile /= No_Source_File then
+ for N in 1 .. Last_Source_Line (Sfile) loop
+ while E /= No_Error_Msg
+ and then Errors.Table (E).Deleted
+ loop
+ E := Errors.Table (E).Next;
+ end loop;
- Output_Source_Line (N, Sfile, Err_Flag);
+ Err_Flag :=
+ E /= No_Error_Msg
+ and then Errors.Table (E).Line = N
+ and then Errors.Table (E).Sfile = Sfile;
- if Err_Flag then
- Output_Error_Msgs (E);
+ Output_Source_Line (N, Sfile, Err_Flag);
- if not Debug_Flag_2 then
- Write_Eol;
+ if Err_Flag then
+ Output_Error_Msgs (E);
+
+ if not Debug_Flag_2 then
+ Write_Eol;
+ end if;
end if;
- end if;
- end loop;
+ end loop;
+ end if;
end;
end if;
end loop;
and then (not Full_List or else Full_List_File_Name /= null)
then
Write_Eol;
- Write_Header (Main_Source_File);
+
+ -- Output the header only when Main_Source_File is known
+
+ if Main_Source_File /= No_Source_File then
+ Write_Header (Main_Source_File);
+ end if;
+
E := First_Error_Msg;
-- Loop through error lines
-- --
-- B o d y --
-- --
--- Copyright (C) 2002-2012, Free Software Foundation, Inc. --
+-- Copyright (C) 2002-2013, Free Software Foundation, Inc. --
-- --
-- GNAT 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- --
with Sinput;
with Stringt; use Stringt;
with Table;
+with Uintp; use Uintp;
with GNAT.Heap_Sort_G;
-- Check the syntax of the value
- if Definition (Index + 1) /= '"'
- or else Definition (Definition'Last) /= '"'
+ if Definition (Index + 1) = '"'
+ and then Definition (Definition'Last) = '"'
then
+ Result.Is_A_String := True;
+
+ else
+ Result.Is_A_String := False;
+
for J in Index + 1 .. Definition'Last loop
case Definition (J) is
when '_' | '.' | '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' =>
-- And put the value in the result
- Result.Is_A_String := False;
Start_String;
Store_String_Chars (Definition (Index + 1 .. Definition'Last));
Result.Value := End_String;
Symbol_Value1 : String_Id;
Symbol_Value2 : String_Id;
+ Relop : Token_Type;
+
begin
-- Loop for each term
Current_Result := Index_Of (Symbol_Name1) /= No_Symbol;
end if;
- elsif Token = Tok_Equal then
+ elsif
+ Token = Tok_Equal or else
+ Token = Tok_Less or else
+ Token = Tok_Less_Equal or else
+ Token = Tok_Greater or else
+ Token = Tok_Greater_Equal
+ then
+ Relop := Token;
Scan.all;
-
Change_Reserved_Keyword_To_Symbol;
- if Token = Tok_Identifier then
+ if Token = Tok_Integer_Literal then
+
+ -- symbol = integer
+ -- symbol < integer
+ -- symbol <= integer
+ -- symbol > integer
+ -- symbol >= integer
+
+ declare
+ Value : constant Int := UI_To_Int (Int_Literal_Value);
+ Data : Symbol_Data;
+ Symbol_Value : Int;
+ begin
+ if Evaluation then
+ Symbol1 := Index_Of (Symbol_Name1);
+
+ if Symbol1 = No_Symbol then
+ Error_Msg_Name_1 := Symbol_Name1;
+ Error_Msg ("unknown symbol %", Symbol_Pos1);
+ Symbol_Value1 := No_String;
+
+ else
+ Data := Mapping.Table (Symbol1);
+
+ if Data.Is_A_String then
+ Error_Msg_Name_1 := Symbol_Name1;
+ Error_Msg
+ ("symbol % value is not integer",
+ Symbol_Pos1);
+
+ else
+ begin
+ String_To_Name_Buffer (Data.Value);
+ Symbol_Value :=
+ Int'Value (Name_Buffer (1 .. Name_Len));
+
+ case Relop is
+ when Tok_Equal =>
+ Current_Result :=
+ Symbol_Value = Value;
+
+ when Tok_Less =>
+ Current_Result :=
+ Symbol_Value < Value;
+
+ when Tok_Less_Equal =>
+ Current_Result :=
+ Symbol_Value <= Value;
+
+ when Tok_Greater =>
+ Current_Result :=
+ Symbol_Value > Value;
+
+ when Tok_Greater_Equal =>
+ Current_Result :=
+ Symbol_Value >= Value;
+
+ when others =>
+ null;
+ end case;
+
+ exception
+ when Constraint_Error =>
+ Error_Msg_Name_1 := Symbol_Name1;
+ Error_Msg
+ ("symbol % value is not integer",
+ Symbol_Pos1);
+ end;
+ end if;
+ end if;
+ end if;
+
+ Scan.all;
+ end;
+
+ elsif Relop /= Tok_Equal then
+ Error_Msg ("number expected", Token_Ptr);
+
+ elsif Token = Tok_Identifier then
-- symbol = symbol
else
Error_Msg
- ("symbol or literal string expected", Token_Ptr);
+ ("literal integer, symbol or literal string expected",
+ Token_Ptr);
end if;
else
Scan.all;
- if Token = Tok_String_Literal then
+ if Token = Tok_Integer_Literal then
+ declare
+ Ptr : Source_Ptr := Token_Ptr;
+
+ begin
+ Start_String;
+
+ while Ptr < Scan_Ptr loop
+ Store_String_Char (Sinput.Source (Ptr));
+ Ptr := Ptr + 1;
+ end loop;
+
+ Data := (Symbol => Symbol_Name,
+ Original => Original_Name,
+ On_The_Command_Line => False,
+ Is_A_String => False,
+ Value => End_String);
+ end;
+
+ Scan.all;
+
+ if Token /= Tok_End_Of_Line and then Token /= Tok_EOF then
+ Error_Msg ("extraneous text in definition", Token_Ptr);
+ goto Cleanup;
+ end if;
+
+ elsif Token = Tok_String_Literal then
Data := (Symbol => Symbol_Name,
Original => Original_Name,
On_The_Command_Line => False,
begin
Start_Of_Processing := Scan_Ptr;
- -- We need to call Scan for the first time, because Initialize_Scanner
- -- is no longer doing it.
+ -- First a call to Scan, because Initialize_Scanner is not doing it
Scan.all;