[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Oct 2012 08:27:31 +0000 (10:27 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Oct 2012 08:27:31 +0000 (10:27 +0200)
2012-10-01  Vincent Celier  <celier@adacore.com>

* make.adb (Scan_Make_Arg): Only test for "vP" of the option
includes at least 3 characters.
* gnatcmd.adb (GNATCmd): Ditto.

2012-10-01  Eric Botcazou  <ebotcazou@adacore.com>

* exp_ch7.adb, sinfo.ads: Add comments.

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

* checks.adb: Remove reference to Enable_Overflow_Checks Use
Suppress_Options rather than Scope_Suppress.
* gnat1drv.adb (Adjust_Global_Switches): Handle new overflow
settings (Adjust_Global_Switches): Initialize Scope_Suppress
from Suppress_Options.
* opt.adb: Remove Enable_Overflow_Checks (use Suppress_Options
instead).
* opt.ads: Remove Overflow_Checks_Unsuppressed (not used)
Remove Enable_Overflow_Checks (use Suppress_Options instead)
Suppress_Options is now current setting (replaces Scope_Suppress).
* osint.adb (Initialize): Deal with initializing overflow
checking.
* par-prag.adb: Add dummy entry for pragma Overflow_Checks.
* sem.adb (Semantics): Save and restore In_Assertion_Expr Use
Suppress_Options instead of Scope_Suppress.
* sem.ads (In_Assertion_Expr): New flag (Scope_Suppress):
Removed, use Suppress_Options instead.
* sem_eval.adb (Compile_Time_Compare): Return Unknown in
preanalysis mode.
* sem_prag.adb (Process_Suppress_Unsuppress): Setting of
Overflow_Checks_Unsuppressed removed (not used anywhere!)
(Analyze_Pragma, case Check): Set In_Assertion_Expression
(Analyze_Pragma, case Overflow_Checks): Implement new pragma
* snames.ads-tmpl: Add names needed for handling pragma
Overflow_Checks
* switch-c.adb (Scan_Front_End_Switches) Handle -gnato? and
-gnato?? where ? is 0-3
* types.ads: Updates and fixes to comment on Suppress_Record.

2012-10-01  Vincent Celier  <celier@adacore.com>

* prj-part.adb (Parse): Remove incorrect comment about checking
imported non extending projects from and "extending all"
one. Minor correction.

From-SVN: r191895

19 files changed:
gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/exp_ch7.adb
gcc/ada/gnat1drv.adb
gcc/ada/gnatcmd.adb
gcc/ada/make.adb
gcc/ada/opt.adb
gcc/ada/opt.ads
gcc/ada/osint.adb
gcc/ada/par-prag.adb
gcc/ada/prj-part.adb
gcc/ada/sem.adb
gcc/ada/sem.ads
gcc/ada/sem_eval.adb
gcc/ada/sem_prag.adb
gcc/ada/sinfo.ads
gcc/ada/snames.ads-tmpl
gcc/ada/switch-c.adb
gcc/ada/types.ads

index c1b2ba3..4a7e8b9 100644 (file)
@@ -1,3 +1,50 @@
+2012-10-01  Vincent Celier  <celier@adacore.com>
+
+       * make.adb (Scan_Make_Arg): Only test for "vP" of the option
+       includes at least 3 characters.
+       * gnatcmd.adb (GNATCmd): Ditto.
+
+2012-10-01  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_ch7.adb, sinfo.ads: Add comments.
+
+2012-10-01  Robert Dewar  <dewar@adacore.com>
+
+       * checks.adb: Remove reference to Enable_Overflow_Checks Use
+       Suppress_Options rather than Scope_Suppress.
+       * gnat1drv.adb (Adjust_Global_Switches): Handle new overflow
+       settings (Adjust_Global_Switches): Initialize Scope_Suppress
+       from Suppress_Options.
+       * opt.adb: Remove Enable_Overflow_Checks (use Suppress_Options
+       instead).
+       * opt.ads: Remove Overflow_Checks_Unsuppressed (not used)
+       Remove Enable_Overflow_Checks (use Suppress_Options instead)
+       Suppress_Options is now current setting (replaces Scope_Suppress).
+       * osint.adb (Initialize): Deal with initializing overflow
+       checking.
+       * par-prag.adb: Add dummy entry for pragma Overflow_Checks.
+       * sem.adb (Semantics): Save and restore In_Assertion_Expr Use
+       Suppress_Options instead of Scope_Suppress.
+       * sem.ads (In_Assertion_Expr): New flag (Scope_Suppress):
+       Removed, use Suppress_Options instead.
+       * sem_eval.adb (Compile_Time_Compare): Return Unknown in
+       preanalysis mode.
+       * sem_prag.adb (Process_Suppress_Unsuppress): Setting of
+       Overflow_Checks_Unsuppressed removed (not used anywhere!)
+       (Analyze_Pragma, case Check): Set In_Assertion_Expression
+       (Analyze_Pragma, case Overflow_Checks): Implement new pragma
+       * snames.ads-tmpl: Add names needed for handling pragma
+       Overflow_Checks
+       * switch-c.adb (Scan_Front_End_Switches) Handle -gnato? and
+       -gnato?? where ? is 0-3
+       * types.ads: Updates and fixes to comment on Suppress_Record.
+
+2012-10-01  Vincent Celier  <celier@adacore.com>
+
+       * prj-part.adb (Parse): Remove incorrect comment about checking
+       imported non extending projects from and "extending all"
+       one. Minor correction.
+
 2012-10-01  Robert Dewar  <dewar@adacore.com>
 
        * make.adb, exp_ch3.adb: Minor reformatting.
index 2861d7c..46cf71c 100644 (file)
@@ -3912,19 +3912,6 @@ package body Checks is
       --  the computed expression is in the range Lor .. Hir. We can use this
       --  to restrict the possible range of results.
 
-      --  If one of the computed bounds is outside the range of the base type,
-      --  the expression may raise an exception and we had better indicate that
-      --  the evaluation has failed, at least if checks are enabled.
-
-      if OK1
-        and then Enable_Overflow_Checks
-        and then not Is_Entity_Name (N)
-        and then (Lor < Lo or else Hir > Hi)
-      then
-         OK := False;
-         return;
-      end if;
-
       if OK1 then
 
          --  If the refined value of the low bound is greater than the type
@@ -6184,10 +6171,20 @@ package body Checks is
 
    function Overflow_Checks_Suppressed (E : Entity_Id) return Boolean is
    begin
+      --  Check overflow suppressed on entity
+
       if Present (E) and then Checks_May_Be_Suppressed (E) then
-         return Is_Check_Suppressed (E, Overflow_Check);
+         if Is_Check_Suppressed (E, Overflow_Check) then
+            return True;
+         end if;
+      end if;
+
+      --  Else return appropriate scope setting
+
+      if In_Assertion_Expr = 0 then
+         return Scope_Suppress.Overflow_Checks_General = Suppressed;
       else
-         return Scope_Suppress.Suppress (Overflow_Check);
+         return Scope_Suppress.Overflow_Checks_Assertions = Suppressed;
       end if;
    end Overflow_Checks_Suppressed;
 
index 725cd2a..9c6955a 100644 (file)
@@ -4585,9 +4585,6 @@ package body Exp_Ch7 is
                --  finalization blocks, and we put everything into a wrapper
                --  block to clearly expose the construct to the back-end.
 
-               --  This requirement for "clearly expose" must be properly
-               --  documented in sinfo/einfo ???
-
                if Present (Prev_Fin) then
                   Insert_Before_And_Analyze (Prev_Fin, Fin_Block);
                else
index b2f371f..3d99884 100644 (file)
@@ -197,12 +197,10 @@ procedure Gnat1drv is
                                            Alignment_Check   => True,
                                            Division_Check    => True,
                                            Elaboration_Check => True,
-                                           Overflow_Check    => True,
                                            others            => False),
-            Overflow_Checks_General    => Suppress,
-            Overflow_Checks_Assertions => Suppress);
+            Overflow_Checks_General    => Suppressed,
+            Overflow_Checks_Assertions => Suppressed);
 
-         Enable_Overflow_Checks     := False;
          Dynamic_Elaboration_Checks := False;
 
          --  Kill debug of generated code, since it messes up sloc values
@@ -330,23 +328,29 @@ procedure Gnat1drv is
          Exception_Mechanism := Back_End_Exceptions;
       end if;
 
-      --  Set proper status for overflow checks. We turn on overflow checks if
-      --  -gnatp was not specified, and either -gnato is set or the back-end
-      --  takes care of overflow checks. Otherwise we suppress overflow checks
-      --  by default (since front end checks are expensive).
-
-      if not Opt.Suppress_Checks
-        and then (Opt.Enable_Overflow_Checks
-                    or else
-                      (Targparm.Backend_Divide_Checks_On_Target
-                        and
-                       Targparm.Backend_Overflow_Checks_On_Target))
+      --  Set proper status for overflow checks. If already set (by -gnato or
+      --  -gnatp) then we have nothing to do.
+
+      if Opt.Suppress_Options.Overflow_Checks_General /= Not_Set then
+         null;
+
+      --  If we have backend divide and overflow checks, then by default
+      --  overflow checks are minimized, which is a reasonable setting.
+
+      elsif Targparm.Backend_Divide_Checks_On_Target
+              and
+            Targparm.Backend_Overflow_Checks_On_Target
       then
-         Suppress_Options.Suppress (Overflow_Check) := False;
+         Suppress_Options.Overflow_Checks_General    := Minimized;
+         Suppress_Options.Overflow_Checks_Assertions := Minimized;
+
+      --  Otherwise for now, default is checks are suppressed. This is likely
+      --  to change in the future, but for now this is the compatible behavior
+      --  with previous versions of GNAT.
+
       else
-         Suppress_Options.Suppress (Overflow_Check)  := True;
-         Suppress_Options.Overflow_Checks_General    := Check_All;
-         Suppress_Options.Overflow_Checks_Assertions := Check_All;
+         Suppress_Options.Overflow_Checks_General    := Suppressed;
+         Suppress_Options.Overflow_Checks_Assertions := Suppressed;
       end if;
 
       --  Set default for atomic synchronization. As this synchronization
@@ -437,8 +441,7 @@ procedure Gnat1drv is
          --  Turn off alignment checks.
          --  Turn off validity checking.
 
-         Suppress_Options := Suppress_All;
-         Enable_Overflow_Checks := False;
+         Suppress_Options           := Suppress_All;
          Dynamic_Elaboration_Checks := False;
          Reset_Validity_Check_Options;
 
@@ -517,6 +520,12 @@ procedure Gnat1drv is
             Inline_Level := 2;
          end if;
       end if;
+
+      --  Finally capture adjusted value of Suppress_Options as the initial
+      --  value for Scope_Suppress, which will be modified as we move from
+      --  scope to scope (by Suppress/Unsuppress/Overflow_Checks pragmas).
+
+      Sem.Scope_Suppress := Opt.Suppress_Options;
    end Adjust_Global_Switches;
 
    --------------------
index ef93f2f..ab4ddcc 100644 (file)
@@ -848,6 +848,9 @@ procedure GNATCmd is
       Unit  : Unit_Index;
       Path  : Path_Name_Type;
 
+      Files_File     : Ada.Text_IO.File_Type;
+      Temp_File_Name : Path_Name_Type;
+
    begin
       if GN_Path = null then
          Put_Line (Standard_Error, "could not locate " & GN_Name);
@@ -856,7 +859,7 @@ procedure GNATCmd is
 
       --  Create the temp file
 
-      Tempdir.Create_Temp_File (FD, Name);
+      Prj.Env.Create_Temp_File (Project_Tree.Shared, FD, Name, "files");
 
       --  And close it, because on VMS Spawn with a file descriptor created
       --  with Create_Temp_File does not redirect output.
@@ -904,8 +907,19 @@ procedure GNATCmd is
          raise Error_Exit;
 
       else
-         --  Get each file name in the file, find its path and add it the
-         --  list of arguments.
+         --  Create a temporary file to put the list of files in the closure
+
+         Tempdir.Create_Temp_File (FD, Temp_File_Name);
+         Last_Switches.Increment_Last;
+         Last_Switches.Table (Last_Switches.Last) :=
+           new String'("-files=" & Get_Name_String (Temp_File_Name));
+
+         Close (FD);
+
+         Open (Files_File, Out_File, Get_Name_String (Temp_File_Name));
+
+         --  Get each file name in the file, find its path and add it the list
+         --  of arguments.
 
          while not End_Of_File (File) loop
             Get_Line (File, Line, Last);
@@ -933,18 +947,16 @@ procedure GNATCmd is
                Unit := Units_Htable.Get_Next (Project_Tree.Units_HT);
             end loop;
 
-            Last_Switches.Increment_Last;
-
             if Path /= No_Path then
-               Last_Switches.Table (Last_Switches.Last) :=
-                  new String'(Get_Name_String (Path));
+               Put_Line (Files_File, Get_Name_String (Path));
 
             else
-               Last_Switches.Table (Last_Switches.Last) :=
-                 new String'(Line (1 .. Last));
+               Put_Line (Files_File, Line (1 .. Last));
             end if;
          end loop;
 
+         Close (Files_File);
+
          begin
             if not Keep_Temporary_Files then
                Delete (File);
@@ -1769,7 +1781,9 @@ begin
 
                   --  -vPx  Specify verbosity while parsing project files
 
-                  elsif Argv (Argv'First + 1 .. Argv'First + 2) = "vP" then
+                  elsif Argv'Length >= 3
+                    and then  Argv (Argv'First + 1 .. Argv'First + 2) = "vP"
+                  then
                      if Argv'Length = 4
                           and then Argv (Argv'Last) in '0' .. '2'
                      then
@@ -2055,6 +2069,11 @@ begin
            or else The_Command = Link
            or else The_Command = Elim
          then
+            if Project.Object_Directory.Name = No_Path then
+               Fail ("project " & Get_Name_String (Project.Display_Name) &
+                     " has no object directory");
+            end if;
+
             Change_Dir (Get_Name_String (Project.Object_Directory.Name));
          end if;
 
index 33611d3..69a996d 100644 (file)
@@ -7825,7 +7825,7 @@ package body Make is
 
          --  -vPx  (verbosity of the parsing of the project files)
 
-         elsif Argv (2 .. 3) = "vP" then
+         elsif Argv'Length >= 3 and then Argv (2 .. 3) = "vP" then
             if Argv'Last /= 4 or else Argv (4) not in '0' .. '2' then
                Make_Failed
                  ("invalid verbosity level " & Argv (4 .. Argv'Last));
index 809816d..a6c1553 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2012, 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- --
@@ -259,7 +259,6 @@ package body Opt is
       Tree_Read_Bool (Debug_Pragmas_Disabled);
       Tree_Read_Bool (Debug_Pragmas_Enabled);
       Tree_Read_Int  (Int (Default_Pool));
-      Tree_Read_Bool (Enable_Overflow_Checks);
       Tree_Read_Bool (Full_List);
 
       Ada_Version_Config :=
@@ -326,7 +325,6 @@ package body Opt is
       Tree_Write_Bool (Debug_Pragmas_Disabled);
       Tree_Write_Bool (Debug_Pragmas_Enabled);
       Tree_Write_Int  (Int (Default_Pool));
-      Tree_Write_Bool (Enable_Overflow_Checks);
       Tree_Write_Bool (Full_List);
       Tree_Write_Int  (Int (Version_String'Length));
       Tree_Write_Data (Version_String'Address, Version_String'Length);
index a6c0cf3..5eac7ed 100644 (file)
@@ -486,11 +486,6 @@ package Opt is
    --  GNAT
    --  Set to True to generate full elaboration warnings (-gnatwl)
 
-   Enable_Overflow_Checks : Boolean := False;
-   --  GNAT
-   --  Set to True if -gnato (enable overflow checks) switch is set,
-   --  but not -gnatp.
-
    Error_Msg_Line_Length : Nat := 0;
    --  GNAT
    --  Records the error message line length limit. If this is set to zero,
@@ -1068,12 +1063,6 @@ package Opt is
    --  True if output of list of objects is requested (-O switch set). List is
    --  output under the given filename, or standard output if not specified.
 
-   Overflow_Checks_Unsuppressed : Boolean := False;
-   --  GNAT
-   --  This flag is True if there has been at least one pragma with the
-   --  effect of unsuppressing overflow checks, meaning that a more careful
-   --  check of the current mode is required.
-
    Persistent_BSS_Mode : Boolean := False;
    --  GNAT
    --  True if a Persistent_BSS configuration pragma is in effect, causing
@@ -1252,10 +1241,10 @@ package Opt is
 
    Suppress_Options : Suppress_Record;
    --  GNAT
-   --  Flags set True to suppress corresponding check, i.e. add an implicit
-   --  pragma Suppress at the outer level of each unit compiled. Note that
-   --  these suppress actions can be overridden by the use of the Unsuppress
-   --  pragma. This variable is initialized by Osint.Initialize.
+   --  Indicates outer level setting of check suppression. This initializes
+   --  the settings of the outer scope level in any unit compiled. This is
+   --  initialized by Osint.Initialize, and further initialized by the
+   --  Adjust_Global_Switches flag in Gnat1drv.
 
    Suppress_Back_Annotation : Boolean := False;
    --  GNAT
index 3e452b5..af355a1 100644 (file)
@@ -1655,11 +1655,12 @@ package body Osint is
       Src_Search_Directories.Init;
       Lib_Search_Directories.Init;
 
-      --  Start off by setting all suppress options to False, these will
-      --  be reset later (turning some on if -gnato is not specified, and
-      --  turning all of them on if -gnatp is specified).
+      --  Start off by setting all suppress options, to False. The special
+      --  overflow fields are set to Not_Set (they will be set by -gnatp, or
+      --  by -gnato, or, if neither of these appear, in Adjust_Global_Switches
+      --  in Gnat1drv.
 
-      Suppress_Options := ((others => False), Check_All, Check_All);
+      Suppress_Options := ((others => False), Not_Set, Not_Set);
 
       --  Reserve the first slot in the search paths table. This is the
       --  directory of the main source file or main library file and is filled
index e083476..8b07142 100644 (file)
@@ -1199,6 +1199,7 @@ begin
            Pragma_Ordered                        |
            Pragma_Optimize                       |
            Pragma_Optimize_Alignment             |
+           Pragma_Overflow_Checks                |
            Pragma_Pack                           |
            Pragma_Passive                        |
            Pragma_Preelaborable_Initialization   |
index 17b72ea..d70480e 100644 (file)
@@ -638,11 +638,6 @@ package body Prj.Part is
          --  Remove from the potentially virtual any project extended by one
          --  of these imported projects.
 
-         --  For non extending imported projects, check that they do not belong
-         --  to the project tree of the project being "extended-all" by the
-         --  main project.
-         --  Where is this check performed???
-
          declare
             With_Clause : Project_Node_Id;
             Imported    : Project_Node_Id := Empty_Node;
index 46fd546..f4beaa6 100644 (file)
@@ -33,6 +33,7 @@ with Fname;    use Fname;
 with Lib;      use Lib;
 with Lib.Load; use Lib.Load;
 with Nlists;   use Nlists;
+with Opt;      use Opt;
 with Output;   use Output;
 with Restrict; use Restrict;
 with Sem_Attr; use Sem_Attr;
@@ -1353,13 +1354,14 @@ package body Sem is
       --  these variables, and also that such calls do not disturb the settings
       --  for units being analyzed at a higher level.
 
-      S_Current_Sem_Unit : constant Unit_Number_Type := Current_Sem_Unit;
-      S_Full_Analysis    : constant Boolean          := Full_Analysis;
-      S_GNAT_Mode        : constant Boolean          := GNAT_Mode;
-      S_Global_Dis_Names : constant Boolean          := Global_Discard_Names;
-      S_In_Spec_Expr     : constant Boolean          := In_Spec_Expression;
-      S_Inside_A_Generic : constant Boolean          := Inside_A_Generic;
-      S_Outer_Gen_Scope  : constant Entity_Id        := Outer_Generic_Scope;
+      S_Current_Sem_Unit  : constant Unit_Number_Type := Current_Sem_Unit;
+      S_Full_Analysis     : constant Boolean          := Full_Analysis;
+      S_GNAT_Mode         : constant Boolean          := GNAT_Mode;
+      S_Global_Dis_Names  : constant Boolean          := Global_Discard_Names;
+      S_In_Assertion_Expr : constant Nat              := In_Assertion_Expr;
+      S_In_Spec_Expr      : constant Boolean          := In_Spec_Expression;
+      S_Inside_A_Generic  : constant Boolean          := Inside_A_Generic;
+      S_Outer_Gen_Scope   : constant Entity_Id        := Outer_Generic_Scope;
 
       Generic_Main : constant Boolean :=
                        Nkind (Unit (Cunit (Main_Unit)))
@@ -1453,6 +1455,7 @@ package body Sem is
 
       Full_Analysis      := True;
       Inside_A_Generic   := False;
+      In_Assertion_Expr  := 0;
       In_Spec_Expression := False;
 
       Set_Comes_From_Source_Default (False);
@@ -1526,6 +1529,7 @@ package body Sem is
       Full_Analysis        := S_Full_Analysis;
       Global_Discard_Names := S_Global_Dis_Names;
       GNAT_Mode            := S_GNAT_Mode;
+      In_Assertion_Expr    := S_In_Assertion_Expr;
       In_Spec_Expression   := S_In_Spec_Expr;
       Inside_A_Generic     := S_Inside_A_Generic;
       Outer_Generic_Scope  := S_Outer_Gen_Scope;
index 00bce69..f219b92 100644 (file)
 
 with Alloc;
 with Einfo;  use Einfo;
-with Opt;    use Opt;
 with Table;
 with Types;  use Types;
 
@@ -243,6 +242,15 @@ package Sem is
    --  frozen from start, because the tree on which they depend will not
    --  be available at the freeze point.
 
+   In_Assertion_Expr : Nat := 0;
+   --  This is set non-zero if we are within the expression of an assertion
+   --  pragma or aspect. It is a counter which is incremented at the start
+   --  of expanding such an expression, and decremented on completion of
+   --  expanding that expression. Probably a boolean would be good enough,
+   --  since we think that such expressions cannot nest, but that might not
+   --  be true in the future (e.g. if let expressions are added to Ada) so
+   --  we prepare for that future possibility by making it a counter.
+
    In_Inlined_Body : Boolean := False;
    --  Switch to indicate that we are analyzing and resolving an inlined body.
    --  Type checking is disabled in this context, because types are known to be
@@ -310,13 +318,13 @@ package Sem is
    --  that are applicable to all entities. A similar search is needed for any
    --  non-predefined check even if no specific entity is involved.
 
-   Scope_Suppress : Suppress_Record := Suppress_Options;
+   Scope_Suppress : Suppress_Record;
    --  This variable contains the current scope based settings of the suppress
-   --  switches. It is initialized from the options as shown, and then modified
-   --  by pragma Suppress. On entry to each scope, the current setting is saved
-   --  the scope stack, and then restored on exit from the scope. This record
-   --  may be rapidly checked to determine the current status of a check if
-   --  no specific entity is involved or if the specific entity involved is
+   --  switches. It is initialized from Suppress_Options in Gnat1drv, and then
+   --  modified by pragma Suppress. On entry to each scope, the current setting
+   --  is saved the scope stack, and then restored on exit from the scope. This
+   --  record may be rapidly checked to determine the current status of a check
+   --  if no specific entity is involved or if the specific entity involved is
    --  one for which no specific Suppress/Unsuppress pragma has been set (as
    --  indicated by the Checks_May_Be_Suppressed flag being set).
 
index 8553ce6..888f3b2 100644 (file)
@@ -743,6 +743,16 @@ package body Sem_Eval is
    begin
       Diff.all := No_Uint;
 
+      --  In preanalysis mode, always return Unknown, it is too early to be
+      --  thinking we know the result of a comparison, save that judgment for
+      --  the full analysis. This is particularly important in the case of
+      --  pre and postconditions, which otherwise can be prematurely collapsed
+      --  into having True or False conditions when this is inappropriate.
+
+      if not Full_Analysis then
+         return Unknown;
+      end if;
+
       --  If either operand could raise constraint error, then we cannot
       --  know the result at compile time (since CE may be raised!)
 
index 55f391f..2b3d7b8 100644 (file)
@@ -286,7 +286,9 @@ package body Sem_Prag is
       --  Preanalyze the boolean expression, we treat this as a spec expression
       --  (i.e. similar to a default expression).
 
+      In_Assertion_Expr := In_Assertion_Expr + 1;
       Preanalyze_Spec_Expression (Get_Pragma_Arg (Arg1), Standard_Boolean);
+      In_Assertion_Expr := In_Assertion_Expr - 1;
 
       --  In ASIS mode, for a pragma generated from a source aspect, also
       --  analyze the original aspect expression.
@@ -5672,12 +5674,11 @@ package body Sem_Prag is
 
          if C = All_Checks or else C = Overflow_Check then
             if Suppress_Case then
-               Scope_Suppress.Overflow_Checks_General    := Suppress;
-               Scope_Suppress.Overflow_Checks_Assertions := Suppress;
+               Scope_Suppress.Overflow_Checks_General    := Suppressed;
+               Scope_Suppress.Overflow_Checks_Assertions := Suppressed;
             else
-               Scope_Suppress.Overflow_Checks_General    := Check_All;
-               Scope_Suppress.Overflow_Checks_Assertions := Check_All;
-               Opt.Overflow_Checks_Unsuppressed := True;
+               Scope_Suppress.Overflow_Checks_General    := Minimized;
+               Scope_Suppress.Overflow_Checks_Assertions := Minimized;
             end if;
          end if;
 
@@ -6799,7 +6800,7 @@ package body Sem_Prag is
          -- Assertion_Policy --
          ----------------------
 
-         --  pragma Assertion_Policy (Check | Disable |Ignore)
+         --  pragma Assertion_Policy (Check | Disable | Ignore)
 
          when Pragma_Assertion_Policy => Assertion_Policy : declare
             Policy : Node_Id;
@@ -7289,7 +7290,9 @@ package body Sem_Prag is
             --  Check is active
 
             else
+               In_Assertion_Expr := In_Assertion_Expr + 1;
                Analyze_And_Resolve (Expr, Any_Boolean);
+               In_Assertion_Expr := In_Assertion_Expr - 1;
             end if;
          end Check;
 
@@ -11753,6 +11756,76 @@ package body Sem_Prag is
             Optimize_Alignment_Local := True;
          end Optimize_Alignment;
 
+         ---------------------
+         -- Overflow_Checks --
+         ---------------------
+
+         --  pragma Overflow_Checks
+         --    ([General => ] MODE [, [Assertions => ] MODE);
+
+         --  MODE := SUPPRESSED | CHECKED | MINIMIZED | ELIMINATED
+
+         when Pragma_Overflow_Checks => Overflow_Checks : declare
+            function Get_Check_Mode
+              (Name : Name_Id;
+               Arg  : Node_Id) return Overflow_Check_Type;
+            --  Function to process one pragma argument, Arg. If an identifier
+            --  is present, it must be Name. Check type is returned if a valid
+            --  argument exists, otherwise an error is signalled.
+
+            --------------------
+            -- Get_Check_Mode --
+            --------------------
+
+            function Get_Check_Mode
+              (Name : Name_Id;
+               Arg  : Node_Id) return Overflow_Check_Type
+            is
+               Argx : constant Node_Id := Get_Pragma_Arg (Arg);
+
+            begin
+               Check_Optional_Identifier (Arg, Name);
+               Check_Arg_Is_Identifier (Argx);
+
+               if Chars (Argx) = Name_Suppressed then
+                  return Suppressed;
+               elsif Chars (Argx) = Name_Checked then
+                  return Checked;
+               elsif Chars (Argx) = Name_Minimized then
+                  return Minimized;
+               elsif Chars (Argx) = Name_Eliminated then
+                  return Eliminated;
+               else
+                  Error_Pragma_Arg ("invalid argument for pragma%", Argx);
+               end if;
+            end Get_Check_Mode;
+
+         --  Start of processing for Overflow_Checks
+
+         begin
+            GNAT_Pragma;
+            Check_At_Least_N_Arguments (1);
+            Check_At_Most_N_Arguments (2);
+
+            --  Process first argument
+
+            Suppress_Options.Overflow_Checks_General :=
+              Get_Check_Mode (Name_General, Arg1);
+
+            --  Case of only one argument
+
+            if Arg_Count = 1 then
+               Scope_Suppress.Overflow_Checks_Assertions :=
+                 Scope_Suppress.Overflow_Checks_General;
+
+            --  Case of two arguments present
+
+            else
+               Scope_Suppress.Overflow_Checks_Assertions  :=
+                 Get_Check_Mode (Name_Assertions, Arg2);
+            end if;
+         end Overflow_Checks;
+
          -------------
          -- Ordered --
          -------------
@@ -15173,6 +15246,7 @@ package body Sem_Prag is
       Pragma_Obsolescent                    =>  0,
       Pragma_Optimize                       => -1,
       Pragma_Optimize_Alignment             => -1,
+      Pragma_Overflow_Checks                =>  0,
       Pragma_Ordered                        =>  0,
       Pragma_Pack                           =>  0,
       Pragma_Page                           => -1,
index 16e92cd..3eab598 100644 (file)
@@ -4289,6 +4289,14 @@ package Sinfo is
       --  Note: Exception_Junk is set for the wrapping blocks created during
       --  local raise optimization (Exp_Ch11.Expand_Local_Exception_Handlers).
 
+      --  Note: from a control flow viewpoint, a block statement defines an
+      --  extended basic block, i.e. the entry of the block dominates every
+      --  statement in the sequence. When generating new statements with
+      --  exception handlers in the expander at the end of a sequence that
+      --  comes from source code, it can be necessary to wrap them all in a
+      --  block statement in order to expose the implicit control flow to
+      --  gigi and thus prevent it from issuing bogus control flow warnings.
+
       --  N_Block_Statement
       --  Sloc points to DECLARE or BEGIN
       --  Identifier (Node1) block direct name (set to Empty if not present)
index f4b31aa..167d110 100644 (file)
@@ -408,6 +408,7 @@ package Snames is
    Name_No_Strict_Aliasing             : constant Name_Id := N + $; -- GNAT
    Name_Normalize_Scalars              : constant Name_Id := N + $;
    Name_Optimize_Alignment             : constant Name_Id := N + $; -- GNAT
+   Name_Overflow_Checks                : constant Name_Id := N + $; -- GNAT
    Name_Persistent_BSS                 : constant Name_Id := N + $; -- GNAT
    Name_Polling                        : constant Name_Id := N + $; -- GNAT
    Name_Priority_Specific_Dispatching  : constant Name_Id := N + $; -- Ada 05
@@ -651,6 +652,7 @@ package Snames is
 
    Name_As_Is                          : constant Name_Id := N + $;
    Name_Assertion                      : constant Name_Id := N + $;
+   Name_Assertions                     : constant Name_Id := N + $;
    Name_Attribute_Name                 : constant Name_Id := N + $;
    Name_Body_File_Name                 : constant Name_Id := N + $;
    Name_Boolean_Entry_Barriers         : constant Name_Id := N + $;
@@ -658,6 +660,8 @@ package Snames is
    Name_By_Entry                       : constant Name_Id := N + $;
    Name_By_Protected_Procedure         : constant Name_Id := N + $;
    Name_Casing                         : constant Name_Id := N + $;
+   Name_Check_All                      : constant Name_Id := N + $;
+   Name_Checked                        : constant Name_Id := N + $;
    Name_Code                           : constant Name_Id := N + $;
    Name_Component                      : constant Name_Id := N + $;
    Name_Component_Size_4               : constant Name_Id := N + $;
@@ -667,6 +671,7 @@ package Snames is
    Name_Disable                        : constant Name_Id := N + $;
    Name_Dot_Replacement                : constant Name_Id := N + $;
    Name_Dynamic                        : constant Name_Id := N + $;
+   Name_Eliminated                     : constant Name_Id := N + $;
    Name_Ensures                        : constant Name_Id := N + $;
    Name_Entity                         : constant Name_Id := N + $;
    Name_Entry_Count                    : constant Name_Id := N + $;
@@ -676,6 +681,7 @@ package Snames is
    Name_Form                           : constant Name_Id := N + $;
    Name_G_Float                        : constant Name_Id := N + $;
    Name_Gcc                            : constant Name_Id := N + $;
+   Name_General                        : constant Name_Id := N + $;
    Name_Gnat                           : constant Name_Id := N + $;
    Name_GPL                            : constant Name_Id := N + $;
    Name_IEEE_Float                     : constant Name_Id := N + $;
@@ -689,6 +695,7 @@ package Snames is
    Name_Max_Size                       : constant Name_Id := N + $;
    Name_Mechanism                      : constant Name_Id := N + $;
    Name_Message                        : constant Name_Id := N + $;
+   Name_Minimized                      : constant Name_Id := N + $;
    Name_Mixedcase                      : constant Name_Id := N + $;
    Name_Mode                           : constant Name_Id := N + $;
    Name_Modified_GPL                   : constant Name_Id := N + $;
@@ -727,6 +734,7 @@ package Snames is
    Name_Static                         : constant Name_Id := N + $;
    Name_Stack_Size                     : constant Name_Id := N + $;
    Name_Subunit_File_Name              : constant Name_Id := N + $;
+   Name_Suppressed                     : constant Name_Id := N + $;
    Name_Task_Stack_Size_Default        : constant Name_Id := N + $;
    Name_Task_Type                      : constant Name_Id := N + $;
    Name_Time_Slicing_Enabled           : constant Name_Id := N + $;
@@ -1656,6 +1664,7 @@ package Snames is
       Pragma_No_Strict_Aliasing,
       Pragma_Normalize_Scalars,
       Pragma_Optimize_Alignment,
+      Pragma_Overflow_Checks,
       Pragma_Persistent_BSS,
       Pragma_Polling,
       Pragma_Priority_Specific_Dispatching,
index 4815c09..04de890 100644 (file)
@@ -128,9 +128,8 @@ package body Switch.C is
 
       --  Handle switches that do not start with -gnat
 
-      if Ptr + 3 > Max
-        or else Switch_Chars (Ptr .. Ptr + 3) /= "gnat"
-      then
+      if Ptr + 3 > Max or else Switch_Chars (Ptr .. Ptr + 3) /= "gnat" then
+
          --  There are two front-end switches that do not start with -gnat:
          --  -I, --RTS
 
@@ -755,10 +754,77 @@ package body Switch.C is
 
             when 'o' =>
                Ptr := Ptr + 1;
-               Suppress_Options.Suppress (Overflow_Check) := False;
-               Suppress_Options.Overflow_Checks_General := Check_All;
-               Suppress_Options.Overflow_Checks_Assertions := Check_All;
-               Opt.Enable_Overflow_Checks := True;
+
+               --  Case of no digits after the -gnato
+
+               if Ptr > Max or else Switch_Chars (Ptr) not in '0' .. '3' then
+                  Suppress_Options.Overflow_Checks_General    := Checked;
+                  Suppress_Options.Overflow_Checks_Assertions := Checked;
+
+               --  At least one digit after the -gnato
+
+               else
+                  --  Handle first digit after -gnato
+
+                  case Switch_Chars (Ptr) is
+                     when '0' =>
+                        Suppress_Options.Overflow_Checks_General :=
+                          Suppressed;
+
+                     when '1' =>
+                        Suppress_Options.Overflow_Checks_General :=
+                          Checked;
+
+                     when '2' =>
+                        Suppress_Options.Overflow_Checks_General :=
+                          Minimized;
+
+                     when '3' =>
+                        Suppress_Options.Overflow_Checks_General :=
+                          Eliminated;
+
+                     when others =>
+                        raise Program_Error;
+                  end case;
+
+                  Ptr := Ptr + 1;
+
+                  --  Only one digit after -gnato, set assertions mode to
+                  --  be the same as general mode.
+
+                  if Ptr > Max
+                    or else Switch_Chars (Ptr) not in '0' .. '3'
+                  then
+                     Suppress_Options.Overflow_Checks_Assertions :=
+                       Suppress_Options.Overflow_Checks_General;
+
+                  --  Process second digit after -gnato
+
+                  else
+                     case Switch_Chars (Ptr) is
+                        when '0' =>
+                           Suppress_Options.Overflow_Checks_Assertions :=
+                             Suppressed;
+
+                        when '1' =>
+                           Suppress_Options.Overflow_Checks_Assertions :=
+                             Checked;
+
+                        when '2' =>
+                           Suppress_Options.Overflow_Checks_Assertions :=
+                             Minimized;
+
+                        when '3' =>
+                           Suppress_Options.Overflow_Checks_Assertions :=
+                             Eliminated;
+
+                        when others =>
+                           raise Program_Error;
+                     end case;
+
+                     Ptr := Ptr + 1;
+                  end if;
+               end if;
 
             --  Processing for O switch
 
@@ -793,13 +859,12 @@ package body Switch.C is
                         Suppress_Options.Suppress (J) := True;
                      end if;
 
-                     Suppress_Options.Overflow_Checks_General    := Suppress;
-                     Suppress_Options.Overflow_Checks_Assertions := Suppress;
+                     Suppress_Options.Overflow_Checks_General    := Suppressed;
+                     Suppress_Options.Overflow_Checks_Assertions := Suppressed;
                   end loop;
 
-                  Validity_Checks_On         := False;
-                  Opt.Suppress_Checks        := True;
-                  Opt.Enable_Overflow_Checks := False;
+                  Validity_Checks_On  := False;
+                  Opt.Suppress_Checks := True;
                end if;
 
             --  Processing for P switch
index 03370cf..0f9cea2 100644 (file)
@@ -706,51 +706,56 @@ package Types is
    --  The following provides precise details on the mode used to check
    --  intermediate overflows in expressions for signed integer arithmetic.
 
-   type Overflow_Check_Type is
-     (Suppress,
-      --  Intermediate overflow suppressed. If an arithmetic operation creates
+   type Overflow_Check_Type is (
+      Not_Set,
+      --  Dummy value used during initialization process to show that the
+      --  corresponding value has not yet been initialized.
+
+      Suppressed,
+      --  Overflow checking is suppressed. If an arithmetic operation creates
       --  an overflow, no exception is raised, and the program is erroneous.
 
-      Check_All,
-      --  All intermediate operations are checked. If the result of any
-      --  arithmetic operation gives a result outside the range of the base
-      --  type, then a Constraint_Error exception is raised.
+      Checked,
+      --  All operations, including all intermediate operations are checked.
+      --  If the result of any arithmetic operation gives a result outside the
+      --  range of the base type, then a Constraint_Error exception is raised.
 
-      Minimize,
+      Minimized,
       --  Where appropriate, arithmetic operations are performed with an
-      --  extended range, using Long_Long_Integer if necessary. As long as
-      --  the result fits in this extended range, then no exception is raised
-      --  and computation continues with the extended result. The final value
-      --  of an expression must fit in the base type of the whole expression.
-      --  If an intermediate result is outside the range of Long_Long_Integer
-      --  then a Constraint_Error exception is raised.
-
-      Eliminate);
+      --  extended range, using Long_Long_Integer if necessary. As long as the
+      --  result fits in this extended range, then no exception is raised and
+      --  computation continues with the extended result. The final value of an
+      --  expression must fit in the base type of the whole expression. If an
+      --  intermediate result is outside the range of Long_Long_Integer then a
+      --  Constraint_Error exception is raised.
+
+      Eliminated);
       --  In this mode arbitrary precision arithmetic is used as needed to
-      --  ensure that it is impossible for intermediate arithmetic to cause
-      --  an overflow. Again the final value of an expression must fit in
-      --  the base type of the whole expression.
+      --  ensure that it is impossible for intermediate arithmetic to cause an
+      --  overflow. Again the final value of an expression must fit in the base
+      --  type of the whole expression.
 
    --  The following structure captures the state of check suppression or
    --  activation at a particular point in the program execution.
 
    type Suppress_Record is record
       Suppress : Suppress_Array;
-      --  Indicates suppression status of each possible check
+      --  Indicates suppression status of each possible check. Note: there
+      --  is an entry for Overflow_Checks in this array, but it is never used.
+      --  Instead we use the more detailed information in the two components
+      --  that follow this one (Overflow_Checks_General/Assertions).
 
       Overflow_Checks_General : Overflow_Check_Type;
-      --  This field is relevant only if Suppress (Overflow_Check) is False.
-      --  It indicates the mode of overflow checking to be applied to general
-      --  expressions outside assertions.
+      --  This field indicates the mode of overflow checking to be applied to
+      --  general expressions outside assertions.
 
       Overflow_Checks_Assertions : Overflow_Check_Type;
-      --  This field is relevant only if Suppress (Overflow_Check) is False.
-      --  It indicates the mode of overflow checking to be applied to any
-      --  expressions occuring inside assertions.
+      --  This field  indicates the mode of overflow checking to be applied to
+      --  any expressions occuring inside assertions.
    end record;
 
    Suppress_All : constant Suppress_Record :=
-                    ((others => True), Suppress, Suppress);
+                    ((others => True), Suppressed, Suppressed);
    --  Constant used to initialize Suppress_Record value to all suppressed.
 
    -----------------------------------