This patch makes the missing return statement illegal in GNATprove
mode as required by official SPARK 2014 syntax/semantics. The
following program is compiled with -gnatd.F

     1. package Various is
     2.    subtype Index_Type is
     3.      Positive range 1 .. 10;
     4.    type Integer_Array is
     5.      array (Index_Type) of Integer;
     6.    function Search_For_Zero
     7.      (Values : Integer_Array) return Index_Type;
     8. end Various;

     1. package body Various is
     2.    function Search_For_Zero
     3.      (Values : Integer_Array) return Index_Type
     4.    is
     5.    begin
     6.       for J in Values'Range loop
                                    |
        >>> "return" statement missing following this statement

     7.          if Values(J) = 0 then
     8.             return J;
     9.          end if;
    10.       end loop;
    11.    end Search_For_Zero;

Tested on x86_64-pc-linux-gnu, committed on trunk

2014-01-20  Robert Dewar  <de...@adacore.com>

        * errout.ads, errout.adb: Implement >? >x? >X? sequences in error
        messages.
        * sem_ch6.adb (Check_Statement_Sequence): Missing return is an
        error in GNATprove mode.

Index: errout.adb
===================================================================
--- errout.adb  (revision 206837)
+++ errout.adb  (working copy)
@@ -2713,7 +2713,8 @@
       P : Natural;     -- Current index;
 
       procedure Set_Msg_Insertion_Warning;
-      --  Deal with ? ?? ?x? ?X? insertion sequences
+      --  Deal with ? ?? ?x? ?X? insertion sequences (also < <? <x? <X?). The
+      --  caller has already bumped the pointer past the initial ? or <.
 
       -------------------------------
       -- Set_Msg_Insertion_Warning --
@@ -2819,14 +2820,12 @@
 
             when '<' =>
 
-               --  If tagging of messages is enabled, and this is a warning,
-               --  then it is treated as being [enabled by default].
+               --  Note: the prescan already set Is_Warning_Msg True if and
+               --  only if Error_Msg_Warn is set to True. If Error_Msg_Warn
+               --  is False, the call to Set_Msg_Insertion_Warning here does
+               --  no harm, since Warning_Msg_Char is ignored in that case.
 
-               if Error_Msg_Warn
-                 and Warning_Doc_Switch
-               then
-                  Warning_Msg_Char := '?';
-               end if;
+               Set_Msg_Insertion_Warning;
 
             when '|' =>
                null; -- already dealt with
Index: errout.ads
===================================================================
--- errout.ads  (revision 206809)
+++ errout.ads  (working copy)
@@ -64,7 +64,6 @@
    --  are active (see errout.ads for details). If this switch is False, then
    --  these sequences are ignored (i.e. simply equivalent to a single ?). The
    --  -gnatw.d switch sets this flag True, -gnatw.D sets this flag False.
-   --  Note: always ignored in VMS mode where we do not provide this feature.
 
    -----------------------------------
    -- Suppression of Error Messages --
@@ -305,8 +304,10 @@
    --    Insertion character < (Less Than: conditional warning message)
    --      The character < appearing anywhere in a message is used for a
    --      conditional error message. If Error_Msg_Warn is True, then the
-   --      effect is the same as ? described above. If Error_Msg_Warn is
-   --      False, then there is no effect.
+   --      effect is the same as ? described above, and in particular <? and
+   --      <X? have the effect of ?? and ?X? respectively. If Error_Msg_Warn
+   --      is False, then the < <? or <X? sequence is ignored and the message
+   --      is treated as a error rather than a warning.
 
    --    Insertion character A-Z (Upper case letter: Ada reserved word)
    --      If two or more upper case letters appear in the message, they are
Index: sem_ch6.adb
===================================================================
--- sem_ch6.adb (revision 206827)
+++ sem_ch6.adb (working copy)
@@ -7222,12 +7222,24 @@
 
          if Mode = 'F' then
             if not Raise_Exception_Call then
-               Error_Msg_N
-                 ("RETURN statement missing following this statement??!",
-                  Last_Stm);
-               Error_Msg_N
-                 ("\Program_Error may be raised at run time??!",
-                  Last_Stm);
+
+               --  In GNATprove mode, it is an error to have a missing return
+
+               if GNATprove_Mode then
+                  Error_Msg_N
+                    ("RETURN statement missing following this statement!",
+                     Last_Stm);
+
+               --  Otherwise normal case of warning (RM insists this is legal)
+
+               else
+                  Error_Msg_N
+                    ("RETURN statement missing following this statement??!",
+                     Last_Stm);
+                  Error_Msg_N
+                    ("\Program_Error may be raised at run time??!",
+                     Last_Stm);
+               end if;
             end if;
 
             --  Note: we set Err even though we have not issued a warning

Reply via email to