All previous versions of GNAT have set overflow checking off by default (with -gnato switches to enable overflow checking). This update sets the default to checking on, and implements a new switch -gnato0 to turn overflow checking on. The old switch -gnato, which used to enable overflow checking can still be used but simply sets the default, so normally has no effect.
The following program: 1. procedure OvTest is 2. A : Integer; 3. function Ident (X : Integer) return Integer is 4. begin 5. return X; 6. end; 7. begin 8. A := Ident (Integer'Last) + 1; 9. end; raises an exception: raised CONSTRAINT_ERROR : ovtest.adb:8 overflow check failed if compiled with no options or with -gnato, and runs silently if compiled with -gnato0. Tested on x86_64-pc-linux-gnu, committed on trunk 2014-07-31 Robert Dewar <de...@adacore.com> * gnat1drv.adb (Adjust_Global_Switches): Default for overflow checking is enabled except in GNAT_Mode. * switch-c.adb (Scan_Front_End_Switches): Implement -gnato0 (suppress overflow checks).
Index: switch-c.adb =================================================================== --- switch-c.adb (revision 213263) +++ switch-c.adb (working copy) @@ -953,38 +953,57 @@ when 'o' => Ptr := Ptr + 1; - Suppress_Options.Suppress (Overflow_Check) := False; - -- Case of no digits after the -gnato + -- Case of -gnato0 (overflow checking turned off) - if Ptr > Max or else Switch_Chars (Ptr) not in '1' .. '3' then + if Ptr <= Max and then Switch_Chars (Ptr) = '0' then + Ptr := Ptr + 1; + Suppress_Options.Suppress (Overflow_Check) := True; + + -- We set strict mode in case overflow checking is turned + -- on locally (also records that we had a -gnato switch). + Suppress_Options.Overflow_Mode_General := Strict; Suppress_Options.Overflow_Mode_Assertions := Strict; - -- At least one digit after the -gnato + -- All cases other than -gnato0 (overflow checking turned on) else - -- Handle first digit after -gnato + Suppress_Options.Suppress (Overflow_Check) := False; - Suppress_Options.Overflow_Mode_General := - Get_Overflow_Mode (Switch_Chars (Ptr)); - Ptr := Ptr + 1; + -- Case of no digits after the -gnato - -- 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 '1' .. '3' then - Suppress_Options.Overflow_Mode_Assertions := - Suppress_Options.Overflow_Mode_General; + Suppress_Options.Overflow_Mode_General := Strict; + Suppress_Options.Overflow_Mode_Assertions := Strict; - -- Process second digit after -gnato + -- At least one digit after the -gnato else - Suppress_Options.Overflow_Mode_Assertions := + -- Handle first digit after -gnato + + Suppress_Options.Overflow_Mode_General := Get_Overflow_Mode (Switch_Chars (Ptr)); 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 '1' .. '3' + then + Suppress_Options.Overflow_Mode_Assertions := + Suppress_Options.Overflow_Mode_General; + + -- Process second digit after -gnato + + else + Suppress_Options.Overflow_Mode_Assertions := + Get_Overflow_Mode (Switch_Chars (Ptr)); + Ptr := Ptr + 1; + end if; end if; end if; @@ -1026,6 +1045,13 @@ Validity_Checks_On := False; Opt.Suppress_Checks := True; + + -- Set overflow mode checking to strict in case it gets + -- turned on locally (also signals that overflow checking + -- has been specifically turned off). + + Suppress_Options.Overflow_Mode_General := Strict; + Suppress_Options.Overflow_Mode_Assertions := Strict; end if; -- -gnatP (periodic poll) Index: gnat1drv.adb =================================================================== --- gnat1drv.adb (revision 213263) +++ gnat1drv.adb (working copy) @@ -511,9 +511,13 @@ -- Otherwise set overflow mode defaults else - -- Otherwise set overflow checks off by default + -- Overflow checks are on by default (Suppress set False) except in + -- GNAT_Mode, where we want them off by default (we are not ready to + -- enable overflow checks in the compiler yet, for one thing the case + -- of 64-bit checks needs System.Arith_64 which is not a compiler + -- unit and it is a pain to try to include it in the compiler. - Suppress_Options.Suppress (Overflow_Check) := True; + Suppress_Options.Suppress (Overflow_Check) := GNAT_Mode; -- Set appropriate default overflow handling mode. Note: at present -- we set STRICT in all three of the following cases. They are @@ -531,8 +535,8 @@ -- flags set, so this was dead code anyway. elsif Targparm.Backend_Divide_Checks_On_Target - and - Targparm.Backend_Overflow_Checks_On_Target + and + Targparm.Backend_Overflow_Checks_On_Target then Suppress_Options.Overflow_Mode_General := Strict; Suppress_Options.Overflow_Mode_Assertions := Strict;