Commit a7f1b24f by Robert Dewar Committed by Arnaud Charlet

checks.ads, [...]: Minor changes throughout for new overflow checking.

2012-11-06  Robert Dewar  <dewar@adacore.com>

	* checks.ads, checks.adb, exp_ch4.adb: Minor changes throughout for
	new overflow checking.
	* exp_util.adb (Insert_Actions): Remove special casing of
	Overflow_Check.
	* gnat1drv.adb (Adjust_Global_Switches): Fixes for new handling
	of overflow checks.
	* sem.adb (Analyze): Remove special casing of Overflow_Check
	(Analyze_List): ditto.
	* sem_prag.adb (Analyze_Pragma, case Overflow_Checks): Remove
	SUPPRESSED and change CHECKED to STRICT.
	* sem_res.adb (Analyze_And_Resolve): No longer treat
	Overflow_Check specially.
	(Preanalyze_And_Resolve): ditto.
	(Resolve): ditto.
	* snames.ads-tmpl: Replace Name_Checked by Name_Strict.
	* switch-c.adb (Get_Overflow_Mode): Eliminate 0 setting,
	CHECKED => STRICT.
	* types.ads (Overflow_Check_Type): Remove Suppressed, change
	Checked to Strict (Suppress_Record): Overflow check controlled
	by Suppress array.

From-SVN: r193233
parent c4ae9877
2012-11-06 Robert Dewar <dewar@adacore.com>
* checks.ads, checks.adb, exp_ch4.adb: Minor changes throughout for
new overflow checking.
* exp_util.adb (Insert_Actions): Remove special casing of
Overflow_Check.
* gnat1drv.adb (Adjust_Global_Switches): Fixes for new handling
of overflow checks.
* sem.adb (Analyze): Remove special casing of Overflow_Check
(Analyze_List): ditto.
* sem_prag.adb (Analyze_Pragma, case Overflow_Checks): Remove
SUPPRESSED and change CHECKED to STRICT.
* sem_res.adb (Analyze_And_Resolve): No longer treat
Overflow_Check specially.
(Preanalyze_And_Resolve): ditto.
(Resolve): ditto.
* snames.ads-tmpl: Replace Name_Checked by Name_Strict.
* switch-c.adb (Get_Overflow_Mode): Eliminate 0 setting,
CHECKED => STRICT.
* types.ads (Overflow_Check_Type): Remove Suppressed, change
Checked to Strict (Suppress_Record): Overflow check controlled
by Suppress array.
2012-11-06 Ed Schonberg <schonberg@adacore.com> 2012-11-06 Ed Schonberg <schonberg@adacore.com>
* sem_res.adb (Preanalyze_And_Resolve): In Alfa mode do not * sem_res.adb (Preanalyze_And_Resolve): In Alfa mode do not
......
...@@ -72,12 +72,11 @@ package Checks is ...@@ -72,12 +72,11 @@ package Checks is
-- determine whether check C is suppressed either on the entity E or -- determine whether check C is suppressed either on the entity E or
-- as the result of a scope suppress pragma. If Checks_May_Be_Suppressed -- as the result of a scope suppress pragma. If Checks_May_Be_Suppressed
-- is False, then the status of the check can be determined simply by -- is False, then the status of the check can be determined simply by
-- examining Scope_Checks (C), so this routine is not called in that case. -- examining Scope_Suppress, so this routine is not called in that case.
function Overflow_Check_Mode (E : Entity_Id) return Overflow_Check_Type; function Overflow_Check_Mode return Overflow_Check_Type;
-- Returns current overflow checking mode, taking into account whether -- Returns current overflow checking mode, taking into account whether
-- we are inside an assertion expression. Always returns Suppressed if -- we are inside an assertion expression.
-- overflow checks are suppressed for entity E.
------------------------------------------- -------------------------------------------
-- Procedures to Activate Checking Flags -- -- Procedures to Activate Checking Flags --
...@@ -142,7 +141,10 @@ package Checks is ...@@ -142,7 +141,10 @@ package Checks is
-- overflow checking for dependent expressions. This routine handles -- overflow checking for dependent expressions. This routine handles
-- front end vs back end overflow checks (in the front end case it expands -- front end vs back end overflow checks (in the front end case it expands
-- the necessary check). Note that divide is handled separately using -- the necessary check). Note that divide is handled separately using
-- Apply_Divide_Checks. -- Apply_Divide_Checks. Node N may or may not have Do_Overflow_Check.
-- In STRICT mode, there is nothing to do if this flag is off, but in
-- MINIMIZED/ELIMINATED mode we still have to deal with possible use
-- of doing operations in Long_Long_Integer or Bignum mode.
procedure Apply_Constraint_Check procedure Apply_Constraint_Check
(N : Node_Id; (N : Node_Id;
...@@ -266,15 +268,16 @@ package Checks is ...@@ -266,15 +268,16 @@ package Checks is
-- Insert_Action of the whole block (it is returned unanalyzed). The Loc -- Insert_Action of the whole block (it is returned unanalyzed). The Loc
-- parameter is used to supply Sloc values for the constructed tree. -- parameter is used to supply Sloc values for the constructed tree.
procedure Minimize_Eliminate_Overflow_Checks procedure Minimize_Eliminate_Overflows
(N : Node_Id; (N : Node_Id;
Lo : out Uint; Lo : out Uint;
Hi : out Uint; Hi : out Uint;
Top_Level : Boolean); Top_Level : Boolean);
-- This is the main routine for handling MINIMIZED and ELIMINATED overflow -- This is the main routine for handling MINIMIZED and ELIMINATED overflow
-- checks. On entry N is a node whose result is a signed integer subtype. -- processing. On entry N is a node whose result is a signed integer
-- If the node is an arithmetic operation, then a range analysis is carried -- subtype. The Do_Overflow_Check flag may or may not be set on N. If the
-- out, and there are three possibilities: -- node is an arithmetic operation, then a range analysis is carried out,
-- and there are three possibilities:
-- --
-- The node is left unchanged (apart from expansion of an exponentiation -- The node is left unchanged (apart from expansion of an exponentiation
-- operation). This happens if the routine can determine that the result -- operation). This happens if the routine can determine that the result
...@@ -313,16 +316,16 @@ package Checks is ...@@ -313,16 +316,16 @@ package Checks is
-- The routine is called in three situations if we are operating in either -- The routine is called in three situations if we are operating in either
-- MINIMIZED or ELIMINATED modes. -- MINIMIZED or ELIMINATED modes.
-- --
-- Overflow checks applied to the top node of an expression tree when -- Overflow processing applied to the top node of an expression tree when
-- that node is an arithmetic operator. In this case the result is -- that node is an arithmetic operator. In this case the result is
-- converted to the appropriate result type (there is special processing -- converted to the appropriate result type (there is special processing
-- when the parent is a conversion, see body for details). -- when the parent is a conversion, see body for details).
-- --
-- Overflow checks are applied to the operands of a comparison operation. -- Overflow processing applied to the operands of a comparison operation.
-- In this case, the comparison is done on the result Long_Long_Integer -- In this case, the comparison is done on the result Long_Long_Integer
-- or Bignum values, without raising any exceptions. -- or Bignum values, without raising any exceptions.
-- --
-- Overflow checks are applied to the left operand of a membership test. -- Overflow processing applied to the left operand of a membership test.
-- In this case no exception is raised if a Long_Long_Integer or Bignum -- In this case no exception is raised if a Long_Long_Integer or Bignum
-- result is outside the range of the type of that left operand (it is -- result is outside the range of the type of that left operand (it is
-- just that the result of IN is false in that case). -- just that the result of IN is false in that case).
...@@ -332,13 +335,13 @@ package Checks is ...@@ -332,13 +335,13 @@ package Checks is
-- --
-- Top_Level is used to avoid inefficient unnecessary transitions into the -- Top_Level is used to avoid inefficient unnecessary transitions into the
-- Bignum domain. If Top_Level is True, it means that the caller will have -- Bignum domain. If Top_Level is True, it means that the caller will have
-- to convert any Bignum value back to Long_Long_Integer, checking that the -- to convert any Bignum value back to Long_Long_Integer, possibly checking
-- value is in range. This is the normal case for a top level operator in -- that the value is in range. This is the normal case for a top level
-- a subexpression. There is no point in going into Bignum mode to avoid an -- operator in a subexpression. There is no point in going into Bignum mode
-- overflow just so we can check for overflow the next moment. For calls -- to avoid an overflow just so we can check for overflow the next moment.
-- from comparisons and membership tests, and for all recursive calls, we -- For calls from comparisons and membership tests, and for all recursive
-- do want to transition into the Bignum domain if necessary. Note that -- calls, we do want to transition into the Bignum domain if necessary.
-- this setting is only relevant in ELIMINATED mode. -- Note that this setting is only relevant in ELIMINATED mode.
------------------------------------------------------- -------------------------------------------------------
-- Control and Optimization of Range/Overflow Checks -- -- Control and Optimization of Range/Overflow Checks --
...@@ -370,9 +373,7 @@ package Checks is ...@@ -370,9 +373,7 @@ package Checks is
-- has no effect. If a check is needed then this routine sets the flag -- has no effect. If a check is needed then this routine sets the flag
-- Do_Overflow_Check in node N to True, unless it can be determined that -- Do_Overflow_Check in node N to True, unless it can be determined that
-- the check is not needed. The only condition under which this is the -- the check is not needed. The only condition under which this is the
-- case is if there was an identical check earlier on. These optimziations -- case is if there was an identical check earlier on.
-- apply to CHECKED mode, but not to MINIMIZED/ELIMINATED modes. See the
-- body for a full explanation.
procedure Enable_Range_Check (N : Node_Id); procedure Enable_Range_Check (N : Node_Id);
-- Set Do_Range_Check flag in node N True, unless it can be determined -- Set Do_Range_Check flag in node N True, unless it can be determined
......
...@@ -213,19 +213,19 @@ package body Exp_Ch4 is ...@@ -213,19 +213,19 @@ package body Exp_Ch4 is
-- Convert_To_Actual_Subtype if necessary). -- Convert_To_Actual_Subtype if necessary).
function Minimized_Eliminated_Overflow_Check (N : Node_Id) return Boolean; function Minimized_Eliminated_Overflow_Check (N : Node_Id) return Boolean;
-- For signed arithmetic operations with Do_Overflow_Check set when the -- For signed arithmetic operations when the current overflow mode is
-- current overflow mode is MINIMIZED or ELIMINATED, we need to make a -- MINIMIZED or ELIMINATED, we must call Apply_Arithmetic_Overflow_Checks
-- call to Apply_Arithmetic_Overflow_Checks as the first thing we do. We -- as the first thing we do. We then return. We count on the recursive
-- then return. We count on the recursive apparatus for overflow checks -- apparatus for overflow checks to call us back with an equivalent
-- to call us back with an equivalent operation that does not have the -- operation that is in CHECKED mode, avoiding a recursive entry into this
-- Do_Overflow_Check flag set, and that is when we will proceed with the -- routine, and that is when we will proceed with the expansion of the
-- expansion of the operator (e.g. converting X+0 to X, or X**2 to X*X). -- operator (e.g. converting X+0 to X, or X**2 to X*X). We cannot do
-- We cannot do these optimizations without first making this check, since -- these optimizations without first making this check, since there may be
-- there may be operands further down the tree that are relying on the -- operands further down the tree that are relying on the recursive calls
-- recursive calls triggered by the top level nodes to properly process -- triggered by the top level nodes to properly process overflow checking
-- overflow checking and remaining expansion on these nodes. Note that -- and remaining expansion on these nodes. Note that this call back may be
-- this call back may be skipped if the operation is done in Bignum mode -- skipped if the operation is done in Bignum mode but that's fine, since
-- but that's fine, since the Bignum call takes care of everything. -- the Bignum call takes care of everything.
procedure Optimize_Length_Comparison (N : Node_Id); procedure Optimize_Length_Comparison (N : Node_Id);
-- Given an expression, if it is of the form X'Length op N (or the other -- Given an expression, if it is of the form X'Length op N (or the other
...@@ -2274,8 +2274,8 @@ package body Exp_Ch4 is ...@@ -2274,8 +2274,8 @@ package body Exp_Ch4 is
LLIB : constant Entity_Id := Base_Type (Standard_Long_Long_Integer); LLIB : constant Entity_Id := Base_Type (Standard_Long_Long_Integer);
-- Entity for Long_Long_Integer'Base -- Entity for Long_Long_Integer'Base
Check : constant Overflow_Check_Type := Overflow_Check_Mode (Empty); Check : constant Overflow_Check_Type := Overflow_Check_Mode;
-- Current checking mode -- Current overflow checking mode
procedure Set_True; procedure Set_True;
procedure Set_False; procedure Set_False;
...@@ -2320,9 +2320,9 @@ package body Exp_Ch4 is ...@@ -2320,9 +2320,9 @@ package body Exp_Ch4 is
-- our operands using the Minimize_Eliminate circuitry which applies -- our operands using the Minimize_Eliminate circuitry which applies
-- this processing to the two operand subtrees. -- this processing to the two operand subtrees.
Minimize_Eliminate_Overflow_Checks Minimize_Eliminate_Overflows
(Left_Opnd (N), Llo, Lhi, Top_Level => False); (Left_Opnd (N), Llo, Lhi, Top_Level => False);
Minimize_Eliminate_Overflow_Checks Minimize_Eliminate_Overflows
(Right_Opnd (N), Rlo, Rhi, Top_Level => False); (Right_Opnd (N), Rlo, Rhi, Top_Level => False);
-- See if the range information decides the result of the comparison. -- See if the range information decides the result of the comparison.
...@@ -3721,7 +3721,7 @@ package body Exp_Ch4 is ...@@ -3721,7 +3721,7 @@ package body Exp_Ch4 is
-- Entity for Long_Long_Integer'Base (Standard should export this???) -- Entity for Long_Long_Integer'Base (Standard should export this???)
begin begin
Minimize_Eliminate_Overflow_Checks (Lop, Lo, Hi, Top_Level => False); Minimize_Eliminate_Overflows (Lop, Lo, Hi, Top_Level => False);
-- If right operand is a subtype name, and the subtype name has no -- If right operand is a subtype name, and the subtype name has no
-- predicate, then we can just replace the right operand with an -- predicate, then we can just replace the right operand with an
...@@ -3751,9 +3751,9 @@ package body Exp_Ch4 is ...@@ -3751,9 +3751,9 @@ package body Exp_Ch4 is
-- have not been processed for minimized or eliminated checks. -- have not been processed for minimized or eliminated checks.
if Nkind (Rop) = N_Range then if Nkind (Rop) = N_Range then
Minimize_Eliminate_Overflow_Checks Minimize_Eliminate_Overflows
(Low_Bound (Rop), Lo, Hi, Top_Level => False); (Low_Bound (Rop), Lo, Hi, Top_Level => False);
Minimize_Eliminate_Overflow_Checks Minimize_Eliminate_Overflows
(High_Bound (Rop), Lo, Hi, Top_Level => False); (High_Bound (Rop), Lo, Hi, Top_Level => False);
-- We have A in B .. C, treated as A >= B and then A <= C -- We have A in B .. C, treated as A >= B and then A <= C
...@@ -5498,7 +5498,7 @@ package body Exp_Ch4 is ...@@ -5498,7 +5498,7 @@ package body Exp_Ch4 is
-- in which case, this usage makes sense, and in any case, we have -- in which case, this usage makes sense, and in any case, we have
-- actually eliminated the danger of optimization above. -- actually eliminated the danger of optimization above.
if Overflow_Check_Mode (Restyp) not in Minimized_Or_Eliminated then if Overflow_Check_Mode not in Minimized_Or_Eliminated then
Error_Msg_N ("?explicit membership test may be optimized away", N); Error_Msg_N ("?explicit membership test may be optimized away", N);
Error_Msg_N -- CODEFIX Error_Msg_N -- CODEFIX
("\?use ''Valid attribute instead", N); ("\?use ''Valid attribute instead", N);
...@@ -5526,7 +5526,7 @@ package body Exp_Ch4 is ...@@ -5526,7 +5526,7 @@ package body Exp_Ch4 is
-- type, then expand with a separate procedure. Note the use of the -- type, then expand with a separate procedure. Note the use of the
-- flag No_Minimize_Eliminate to prevent infinite recursion. -- flag No_Minimize_Eliminate to prevent infinite recursion.
if Overflow_Check_Mode (Empty) in Minimized_Or_Eliminated if Overflow_Check_Mode in Minimized_Or_Eliminated
and then Is_Signed_Integer_Type (Ltyp) and then Is_Signed_Integer_Type (Ltyp)
and then not No_Minimize_Eliminate (N) and then not No_Minimize_Eliminate (N)
then then
...@@ -11785,8 +11785,7 @@ package body Exp_Ch4 is ...@@ -11785,8 +11785,7 @@ package body Exp_Ch4 is
begin begin
return return
Is_Signed_Integer_Type (Etype (N)) Is_Signed_Integer_Type (Etype (N))
and then Do_Overflow_Check (N) and then Overflow_Check_Mode in Minimized_Or_Eliminated;
and then Overflow_Check_Mode (Empty) in Minimized_Or_Eliminated;
end Minimized_Eliminated_Overflow_Check; end Minimized_Eliminated_Overflow_Check;
-------------------------------- --------------------------------
......
...@@ -3840,11 +3840,11 @@ package body Exp_Util is ...@@ -3840,11 +3840,11 @@ package body Exp_Util is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Sva : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Insert_Actions (Assoc_Node, Ins_Actions); Insert_Actions (Assoc_Node, Ins_Actions);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Sva;
end; end;
else else
...@@ -6727,7 +6727,7 @@ package body Exp_Util is ...@@ -6727,7 +6727,7 @@ package body Exp_Util is
-- All this must not have any checks -- All this must not have any checks
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
-- If it is a scalar type and we need to capture the value, just make -- If it is a scalar type and we need to capture the value, just make
-- a copy. Likewise for a function call, an attribute reference, an -- a copy. Likewise for a function call, an attribute reference, an
......
...@@ -192,14 +192,12 @@ procedure Gnat1drv is ...@@ -192,14 +192,12 @@ procedure Gnat1drv is
-- Enable all other language checks -- Enable all other language checks
Suppress_Options := Suppress_Options.Suppress :=
(Suppress => (Access_Check => True, (Access_Check => True,
Alignment_Check => True, Alignment_Check => True,
Division_Check => True, Division_Check => True,
Elaboration_Check => True, Elaboration_Check => True,
others => False), others => False);
Overflow_Checks_General => Suppressed,
Overflow_Checks_Assertions => Suppressed);
Dynamic_Elaboration_Checks := False; Dynamic_Elaboration_Checks := False;
...@@ -328,42 +326,50 @@ procedure Gnat1drv is ...@@ -328,42 +326,50 @@ procedure Gnat1drv is
Exception_Mechanism := Back_End_Exceptions; Exception_Mechanism := Back_End_Exceptions;
end if; end if;
-- Set proper status for overflow checks -- Set proper status for overflow check mechanism
-- If already set (by - gnato or -gnatp) then we have nothing to do -- If already set (by -gnato) then we have nothing to do
if Opt.Suppress_Options.Overflow_Checks_General /= Not_Set then if Opt.Suppress_Options.Overflow_Checks_General /= Not_Set then
null; null;
-- Otherwise set appropriate default mode. Note: at present we set -- Otherwise set overflow mode defaults
-- SUPPRESSED in all three of the following cases. They are separated
-- because in the future we may make different choices.
-- By default suppress overflow checks in -gnatg mode else
-- Otherwise set overflow checks off by default
elsif GNAT_Mode then Suppress_Options.Suppress (Overflow_Check) := True;
Suppress_Options.Overflow_Checks_General := Suppressed;
Suppress_Options.Overflow_Checks_Assertions := Suppressed;
-- If we have backend divide and overflow checks, then by default -- Set appropriate default overflow handling mode. Note: at present
-- overflow checks are suppressed. Historically this code used to -- we set STRICT in all three of the following cases. They are
-- activate overflow checks, although no target currently has these -- separated because in the future we may make different choices.
-- flags set, so this was dead code anyway.
elsif Targparm.Backend_Divide_Checks_On_Target -- By default set STRICT mode if -gnatg in effect
and
Targparm.Backend_Overflow_Checks_On_Target
then
Suppress_Options.Overflow_Checks_General := Suppressed;
Suppress_Options.Overflow_Checks_Assertions := Suppressed;
-- Otherwise for now, default is checks are suppressed. This is subject if GNAT_Mode then
-- to change in the future, but for now this is the compatible behavior Suppress_Options.Overflow_Checks_General := Strict;
-- with previous versions of GNAT. Suppress_Options.Overflow_Checks_Assertions := Strict;
else -- If we have backend divide and overflow checks, then by default
Suppress_Options.Overflow_Checks_General := Suppressed; -- overflow checks are STRICT. Historically this code used to also
Suppress_Options.Overflow_Checks_Assertions := Suppressed; -- activate overflow checks, although no target currently has these
-- flags set, so this was dead code anyway.
elsif Targparm.Backend_Divide_Checks_On_Target
and
Targparm.Backend_Overflow_Checks_On_Target
then
Suppress_Options.Overflow_Checks_General := Strict;
Suppress_Options.Overflow_Checks_Assertions := Strict;
-- Otherwise for now, default is STRICT mode. This may change in the
-- future, but for now this is the compatible behavior with previous
-- versions of GNAT.
else
Suppress_Options.Overflow_Checks_General := Strict;
Suppress_Options.Overflow_Checks_Assertions := Strict;
end if;
end if; end if;
-- Set default for atomic synchronization. As this synchronization -- Set default for atomic synchronization. As this synchronization
......
...@@ -723,29 +723,15 @@ package body Sem is ...@@ -723,29 +723,15 @@ package body Sem is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Svs : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Analyze (N); Analyze (N);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Svs;
end; end;
elsif Suppress = Overflow_Check then elsif Suppress = Overflow_Check then
declare declare
Svg : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_General;
Sva : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_Assertions;
begin
Scope_Suppress.Overflow_Checks_General := Suppressed;
Scope_Suppress.Overflow_Checks_Assertions := Suppressed;
Analyze (N);
Scope_Suppress.Overflow_Checks_General := Svg;
Scope_Suppress.Overflow_Checks_Assertions := Sva;
end;
else
declare
Svg : constant Boolean := Scope_Suppress.Suppress (Suppress); Svg : constant Boolean := Scope_Suppress.Suppress (Suppress);
begin begin
Scope_Suppress.Suppress (Suppress) := True; Scope_Suppress.Suppress (Suppress) := True;
...@@ -776,25 +762,11 @@ package body Sem is ...@@ -776,25 +762,11 @@ package body Sem is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Svs : constant Suppress_Array := Scope_Suppress.Suppress;
begin
Scope_Suppress := Suppress_All;
Analyze_List (L);
Scope_Suppress := Svg;
end;
elsif Suppress = Overflow_Check then
declare
Svg : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_General;
Sva : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_Assertions;
begin begin
Scope_Suppress.Overflow_Checks_General := Suppressed; Scope_Suppress.Suppress := (others => True);
Scope_Suppress.Overflow_Checks_Assertions := Suppressed;
Analyze_List (L); Analyze_List (L);
Scope_Suppress.Overflow_Checks_General := Svg; Scope_Suppress.Suppress := Svs;
Scope_Suppress.Overflow_Checks_Assertions := Sva;
end; end;
else else
...@@ -1051,11 +1023,11 @@ package body Sem is ...@@ -1051,11 +1023,11 @@ package body Sem is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Svs : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Insert_After_And_Analyze (N, M); Insert_After_And_Analyze (N, M);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Svs;
end; end;
else else
...@@ -1111,11 +1083,11 @@ package body Sem is ...@@ -1111,11 +1083,11 @@ package body Sem is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Svs : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Insert_Before_And_Analyze (N, M); Insert_Before_And_Analyze (N, M);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Svs;
end; end;
else else
...@@ -1170,11 +1142,11 @@ package body Sem is ...@@ -1170,11 +1142,11 @@ package body Sem is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Svs : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Insert_List_After_And_Analyze (N, L); Insert_List_After_And_Analyze (N, L);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Svs;
end; end;
else else
...@@ -1228,11 +1200,11 @@ package body Sem is ...@@ -1228,11 +1200,11 @@ package body Sem is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Svs : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Insert_List_Before_And_Analyze (N, L); Insert_List_Before_And_Analyze (N, L);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Svs;
end; end;
else else
......
...@@ -2121,7 +2121,8 @@ package body Sem_Prag is ...@@ -2121,7 +2121,8 @@ package body Sem_Prag is
(Get_Pragma_Arg (Arg2), Standard_String); (Get_Pragma_Arg (Arg2), Standard_String);
end if; end if;
-- Record if pragma is disabled -- For a pragma in the extended main source unit, record enabled
-- status in SCO (note: there is never any SCO for an instance).
if Check_Enabled (Pname) then if Check_Enabled (Pname) then
Set_SCO_Pragma_Enabled (Loc); Set_SCO_Pragma_Enabled (Loc);
...@@ -5058,7 +5059,8 @@ package body Sem_Prag is ...@@ -5058,7 +5059,8 @@ package body Sem_Prag is
-- If previous error, avoid cascaded errors -- If previous error, avoid cascaded errors
Applies := True; Cascaded_Error;
Applies := True;
Effective := True; Effective := True;
else else
...@@ -5703,18 +5705,6 @@ package body Sem_Prag is ...@@ -5703,18 +5705,6 @@ package body Sem_Prag is
("argument of pragma% is not valid check name", Arg1); ("argument of pragma% is not valid check name", Arg1);
end if; end if;
-- Special processing for overflow check case
if C = All_Checks or else C = Overflow_Check then
if Suppress_Case then
Scope_Suppress.Overflow_Checks_General := Suppressed;
Scope_Suppress.Overflow_Checks_Assertions := Suppressed;
else
Scope_Suppress.Overflow_Checks_General := Checked;
Scope_Suppress.Overflow_Checks_Assertions := Checked;
end if;
end if;
if Arg_Count = 1 then if Arg_Count = 1 then
-- Make an entry in the local scope suppress table. This is the -- Make an entry in the local scope suppress table. This is the
...@@ -12007,10 +11997,11 @@ package body Sem_Prag is ...@@ -12007,10 +11997,11 @@ package body Sem_Prag is
-- pragma Overflow_Checks -- pragma Overflow_Checks
-- ([General => ] MODE [, [Assertions => ] MODE]); -- ([General => ] MODE [, [Assertions => ] MODE]);
-- MODE := SUPPRESSED | CHECKED | MINIMIZED | ELIMINATED -- MODE := STRICT | MINIMIZED | ELIMINATED
-- Note: ELIMINATED is allowed only if Long_Long_Integer'Size is 64 -- Note: ELIMINATED is allowed only if Long_Long_Integer'Size is 64
-- since System.Bignums makes this assumption. -- since System.Bignums makes this assumption. This is true of nearly
-- all (all?) targets.
when Pragma_Overflow_Checks => Overflow_Checks : declare when Pragma_Overflow_Checks => Overflow_Checks : declare
function Get_Check_Mode function Get_Check_Mode
...@@ -12034,19 +12025,8 @@ package body Sem_Prag is ...@@ -12034,19 +12025,8 @@ package body Sem_Prag is
Check_Optional_Identifier (Arg, Name); Check_Optional_Identifier (Arg, Name);
Check_Arg_Is_Identifier (Argx); Check_Arg_Is_Identifier (Argx);
-- Do not suppress overflow checks for formal verification. if Chars (Argx) = Name_Strict then
-- Instead, require that a check is inserted so that formal return Strict;
-- verification can detect wraparound errors.
if Chars (Argx) = Name_Suppressed then
if Alfa_Mode then
return Checked;
else
return Suppressed;
end if;
elsif Chars (Argx) = Name_Checked then
return Checked;
elsif Chars (Argx) = Name_Minimized then elsif Chars (Argx) = Name_Minimized then
return Minimized; return Minimized;
...@@ -14545,6 +14525,7 @@ package body Sem_Prag is ...@@ -14545,6 +14525,7 @@ package body Sem_Prag is
-- Note: in previous versions of GNAT we used to check for limited -- Note: in previous versions of GNAT we used to check for limited
-- types and give an error, but in fact the standard does allow -- types and give an error, but in fact the standard does allow
-- Unchecked_Union on limited types, so this check was removed. -- Unchecked_Union on limited types, so this check was removed.
-- Similarly, GNAT used to require that all discriminants have -- Similarly, GNAT used to require that all discriminants have
-- default values, but this is not mandated by the RM. -- default values, but this is not mandated by the RM.
......
...@@ -334,25 +334,11 @@ package body Sem_Res is ...@@ -334,25 +334,11 @@ package body Sem_Res is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Sva : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Analyze_And_Resolve (N, Typ); Analyze_And_Resolve (N, Typ);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Sva;
end;
elsif Suppress = Overflow_Check then
declare
Svg : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_General;
Sva : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_Assertions;
begin
Scope_Suppress.Overflow_Checks_General := Suppressed;
Scope_Suppress.Overflow_Checks_Assertions := Suppressed;
Analyze_And_Resolve (N, Typ);
Scope_Suppress.Overflow_Checks_General := Svg;
Scope_Suppress.Overflow_Checks_Assertions := Sva;
end; end;
else else
...@@ -388,25 +374,11 @@ package body Sem_Res is ...@@ -388,25 +374,11 @@ package body Sem_Res is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Sva : constant Suppress_Array := Scope_Suppress.Suppress;
begin
Scope_Suppress := Suppress_All;
Analyze_And_Resolve (N);
Scope_Suppress := Svg;
end;
elsif Suppress = Overflow_Check then
declare
Svg : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_General;
Sva : constant Overflow_Check_Type :=
Scope_Suppress.Overflow_Checks_Assertions;
begin begin
Scope_Suppress.Overflow_Checks_General := Suppressed; Scope_Suppress.Suppress := (others => True);
Scope_Suppress.Overflow_Checks_Assertions := Suppressed;
Analyze_And_Resolve (N); Analyze_And_Resolve (N);
Scope_Suppress.Overflow_Checks_General := Svg; Scope_Suppress.Suppress := Sva;
Scope_Suppress.Overflow_Checks_Assertions := Sva;
end; end;
else else
...@@ -1690,19 +1662,23 @@ package body Sem_Res is ...@@ -1690,19 +1662,23 @@ package body Sem_Res is
Full_Analysis := False; Full_Analysis := False;
Expander_Mode_Save_And_Set (False); Expander_Mode_Save_And_Set (False);
-- We suppress all checks for this analysis, except in Alfa mode. -- Normally, we suppress all checks for this preanalysis. There is no
-- Otherwise the checks are applied properly, and in the proper -- point in processing them now, since they will be applied properly
-- location, when the default expressions are reanalyzed and reexpanded -- and in the proper location when the default expressions reanalyzed
-- later on. -- and reexpanded later on. We will also have more information at that
-- point for possible suppression of individual checks.
-- Alfa mode suppresses all expansion but requires the setting of -- However, in Alfa mode, most expansion is suppressed, and this
-- checking flags (DIvision_Check and others) in particular for Ada 2012 -- later reanalysis and reexpansion may not occur. Alfa mode does
-- constructs such as quantified expressions, that are expanded in two -- require the setting of checking flags for proof purposes, so we
-- separate steps. -- do the Alfa preanalysis without suppressing checks.
-- This special handling for Alfa mode is required for example in the
-- case of Ada 2012 constructs such as quantified expressions, which are
-- expanded in two separate steps.
if Alfa_Mode then if Alfa_Mode then
Analyze_And_Resolve (N, T); Analyze_And_Resolve (N, T);
else else
Analyze_And_Resolve (N, T, Suppress => All_Checks); Analyze_And_Resolve (N, T, Suppress => All_Checks);
end if; end if;
...@@ -2946,11 +2922,11 @@ package body Sem_Res is ...@@ -2946,11 +2922,11 @@ package body Sem_Res is
begin begin
if Suppress = All_Checks then if Suppress = All_Checks then
declare declare
Svg : constant Suppress_Record := Scope_Suppress; Sva : constant Suppress_Array := Scope_Suppress.Suppress;
begin begin
Scope_Suppress := Suppress_All; Scope_Suppress.Suppress := (others => True);
Resolve (N, Typ); Resolve (N, Typ);
Scope_Suppress := Svg; Scope_Suppress.Suppress := Sva;
end; end;
else else
...@@ -5959,16 +5935,6 @@ package body Sem_Res is ...@@ -5959,16 +5935,6 @@ package body Sem_Res is
Set_Etype (N, Typ); Set_Etype (N, Typ);
Eval_Case_Expression (N); Eval_Case_Expression (N);
-- If we still have a case expression, and overflow checks are enabled
-- in MINIMIZED or ELIMINATED modes, then set Do_Overflow_Check to
-- ensure that we handle overflow for dependent expressions.
if Nkind (N) = N_Case_Expression
and then Overflow_Check_Mode (Typ) in Minimized_Or_Eliminated
then
Set_Do_Overflow_Check (N);
end if;
end Resolve_Case_Expression; end Resolve_Case_Expression;
------------------------------- -------------------------------
...@@ -7215,16 +7181,6 @@ package body Sem_Res is ...@@ -7215,16 +7181,6 @@ package body Sem_Res is
Set_Etype (N, Typ); Set_Etype (N, Typ);
Eval_If_Expression (N); Eval_If_Expression (N);
-- If we still have a if expression, and overflow checks are enabled in
-- MINIMIZED or ELIMINATED modes, then set Do_Overflow_Check to ensure
-- that we handle overflow for dependent expressions.
if Nkind (N) = N_If_Expression
and then Overflow_Check_Mode (Typ) in Minimized_Or_Eliminated
then
Set_Do_Overflow_Check (N);
end if;
end Resolve_If_Expression; end Resolve_If_Expression;
------------------------------- -------------------------------
......
...@@ -665,7 +665,6 @@ package Snames is ...@@ -665,7 +665,6 @@ package Snames is
Name_By_Protected_Procedure : constant Name_Id := N + $; Name_By_Protected_Procedure : constant Name_Id := N + $;
Name_Casing : constant Name_Id := N + $; Name_Casing : constant Name_Id := N + $;
Name_Check_All : constant Name_Id := N + $; Name_Check_All : constant Name_Id := N + $;
Name_Checked : constant Name_Id := N + $;
Name_Code : constant Name_Id := N + $; Name_Code : constant Name_Id := N + $;
Name_Component : constant Name_Id := N + $; Name_Component : constant Name_Id := N + $;
Name_Component_Size_4 : constant Name_Id := N + $; Name_Component_Size_4 : constant Name_Id := N + $;
...@@ -739,6 +738,7 @@ package Snames is ...@@ -739,6 +738,7 @@ package Snames is
Name_State : constant Name_Id := N + $; Name_State : constant Name_Id := N + $;
Name_Static : constant Name_Id := N + $; Name_Static : constant Name_Id := N + $;
Name_Stack_Size : constant Name_Id := N + $; Name_Stack_Size : constant Name_Id := N + $;
Name_Strict : constant Name_Id := N + $;
Name_Subunit_File_Name : constant Name_Id := N + $; Name_Subunit_File_Name : constant Name_Id := N + $;
Name_Suppressed : constant Name_Id := N + $; Name_Suppressed : constant Name_Id := N + $;
Name_Task_Stack_Size_Default : constant Name_Id := N + $; Name_Task_Stack_Size_Default : constant Name_Id := N + $;
......
...@@ -97,11 +97,8 @@ package body Switch.C is ...@@ -97,11 +97,8 @@ package body Switch.C is
function Get_Overflow_Mode (C : Character) return Overflow_Check_Type is function Get_Overflow_Mode (C : Character) return Overflow_Check_Type is
begin begin
case C is case C is
when '0' =>
return Suppressed;
when '1' => when '1' =>
return Checked; return Strict;
when '2' => when '2' =>
return Minimized; return Minimized;
...@@ -801,12 +798,13 @@ package body Switch.C is ...@@ -801,12 +798,13 @@ package body Switch.C is
when 'o' => when 'o' =>
Ptr := Ptr + 1; Ptr := Ptr + 1;
Suppress_Options.Suppress (Overflow_Check) := False;
-- Case of no digits after the -gnato -- Case of no digits after the -gnato
if Ptr > Max or else Switch_Chars (Ptr) not in '0' .. '3' then if Ptr > Max or else Switch_Chars (Ptr) not in '1' .. '3' then
Suppress_Options.Overflow_Checks_General := Checked; Suppress_Options.Overflow_Checks_General := Strict;
Suppress_Options.Overflow_Checks_Assertions := Checked; Suppress_Options.Overflow_Checks_Assertions := Strict;
-- At least one digit after the -gnato -- At least one digit after the -gnato
...@@ -821,7 +819,7 @@ package body Switch.C is ...@@ -821,7 +819,7 @@ package body Switch.C is
-- be the same as general mode. -- be the same as general mode.
if Ptr > Max if Ptr > Max
or else Switch_Chars (Ptr) not in '0' .. '3' or else Switch_Chars (Ptr) not in '1' .. '3'
then then
Suppress_Options.Overflow_Checks_Assertions := Suppress_Options.Overflow_Checks_Assertions :=
Suppress_Options.Overflow_Checks_General; Suppress_Options.Overflow_Checks_General;
...@@ -869,9 +867,6 @@ package body Switch.C is ...@@ -869,9 +867,6 @@ package body Switch.C is
end if; end if;
end loop; end loop;
Suppress_Options.Overflow_Checks_General := Suppressed;
Suppress_Options.Overflow_Checks_Assertions := Suppressed;
Validity_Checks_On := False; Validity_Checks_On := False;
Opt.Suppress_Checks := True; Opt.Suppress_Checks := True;
end if; end if;
......
...@@ -703,43 +703,39 @@ package Types is ...@@ -703,43 +703,39 @@ package Types is
-- 4. Add a new Do_xxx_Check flag to Sinfo (if required) -- 4. Add a new Do_xxx_Check flag to Sinfo (if required)
-- 5. Add appropriate checks for the new test -- 5. Add appropriate checks for the new test
-- The following provides precise details on the mode used to check -- The following provides precise details on the mode used to generate
-- intermediate overflows in expressions for signed integer arithmetic. -- code for intermediate overflows in expressions for signed integer
-- arithmetic (and how to generate overflow checks if enabled). Note
-- that this only affects handling of intermediate results. The final
-- result must always fit within the target range, and if overflow
-- checking is enabled, the check on the final result is against this
-- target range.
type Overflow_Check_Type is ( type Overflow_Check_Type is (
Not_Set, Not_Set,
-- Dummy value used during initialization process to show that the -- Dummy value used during initialization process to show that the
-- corresponding value has not yet been initialized. -- corresponding value has not yet been initialized.
Suppressed, Strict,
-- Overflow checking is suppressed. If an arithmetic operation creates -- Operations are done in the base type of the subexpression. If
-- an overflow, no exception is raised, and the program is erroneous. -- overflow checks are enabled, then the check is against the range
-- of this base type.
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.
Minimized, Minimized,
-- Where appropriate, arithmetic operations are performed with an -- Where appropriate, intermediate arithmetic operations are performed
-- extended range, using Long_Long_Integer if necessary. As long as the -- with an extended range, using Long_Long_Integer if necessary. If
-- result fits in this extended range, then no exception is raised and -- overflow checking is enabled, then the check is against the range
-- computation continues with the extended result. The final value of an -- of Long_Long_Integer.
-- 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); Eliminated);
-- In this mode arbitrary precision arithmetic is used as needed to -- In this mode arbitrary precision arithmetic is used as needed to
-- ensure that it is impossible for intermediate arithmetic to cause an -- ensure that it is impossible for intermediate arithmetic to cause an
-- overflow. Again the final value of an expression must fit in the base -- overflow. In this mode, intermediate expressions are not affected by
-- type of the whole expression. -- the overflow checking mode, since overflows are eliminated.
subtype Minimized_Or_Eliminated is subtype Minimized_Or_Eliminated is
Overflow_Check_Type range Minimized .. Eliminated; Overflow_Check_Type range Minimized .. Eliminated;
subtype Suppressed_Or_Checked is -- Define subtype so that clients don't need to know ordering. Note that
Overflow_Check_Type range Suppressed .. Checked;
-- Define subtypes so that clients don't need to know ordering. Note that
-- Overflow_Check_Type is not marked as an ordered enumeration type. -- Overflow_Check_Type is not marked as an ordered enumeration type.
-- The following structure captures the state of check suppression or -- The following structure captures the state of check suppression or
...@@ -747,24 +743,19 @@ package Types is ...@@ -747,24 +743,19 @@ package Types is
type Suppress_Record is record type Suppress_Record is record
Suppress : Suppress_Array; Suppress : Suppress_Array;
-- Indicates suppression status of each possible check. Note: there -- Indicates suppression status of each possible check
-- is an entry for Overflow_Check 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; Overflow_Checks_General : Overflow_Check_Type;
-- This field indicates the mode of overflow checking to be applied to -- This field indicates the mode for handling code generation and
-- general expressions outside assertions. -- overflow checking (if enabled) for intermediate expression values.
-- This applies to general expressions outside assertions.
Overflow_Checks_Assertions : Overflow_Check_Type; Overflow_Checks_Assertions : Overflow_Check_Type;
-- This field indicates the mode of overflow checking to be applied to -- This field indicates the mode for handling code generation and
-- any expression occuring inside assertions. -- overflow checking (if enabled) for intermediate expression values.
-- This applies to any expression occuring inside assertions.
end record; end record;
Suppress_All : constant Suppress_Record :=
((others => True), Suppressed, Suppressed);
-- Constant used to initialize Suppress_Record value to all suppressed.
----------------------------------- -----------------------------------
-- Global Exception Declarations -- -- Global Exception Declarations --
----------------------------------- -----------------------------------
......
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