[Ada] Add contracts to Ada.Text_IO for SPARK
authorJoffrey Huguet <huguet@adacore.com>
Fri, 5 Jul 2019 07:03:44 +0000 (07:03 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 5 Jul 2019 07:03:44 +0000 (07:03 +0000)
This change removes the warnings returned when using Ada.Text_IO library
in SPARK. An abstract state and global contracts were added to modelize
the action of Text_IO procedures and function on the memory and the
files.

2019-07-05  Joffrey Huguet  <huguet@adacore.com>

gcc/ada/

* libgnat/a-textio.adb: Add abstract state refinment.
* libgnat/a-textio.ads: Add File_System abstract state.  Add
global contracts, contract cases, preconditions and
postconditions to procedures and functions.
(Set_Input, Set_Output, Set_Error, Standard_Input,
Standard_Output, Standard_Error, Current_Input, Current_Output,
Current_Error): Turn SPARK_Mode off.
(Get_Line): Turn SPARK_Mode off on Get_Line functions.
* libgnat/a-tideio.ads, libgnat/a-tienio.ads,
libgnat/a-tifiio.ads, libgnat/a-tiflio.ads,
libgnat/a-tiinio.ads, libgnat/a-timoio.ads: Add global
contracts, contract cases, preconditions and postconditions to
procedures and functions.

From-SVN: r273127

gcc/ada/ChangeLog
gcc/ada/libgnat/a-textio.adb
gcc/ada/libgnat/a-textio.ads
gcc/ada/libgnat/a-tideio.ads
gcc/ada/libgnat/a-tienio.ads
gcc/ada/libgnat/a-tifiio.ads
gcc/ada/libgnat/a-tiflio.ads
gcc/ada/libgnat/a-tiinio.ads
gcc/ada/libgnat/a-timoio.ads

index 002d535c450596aec23ae47ac31ee24f635660f3..882011336c12c00bd6bc05825a35f9ae45871a1e 100644 (file)
@@ -1,3 +1,19 @@
+2019-07-05  Joffrey Huguet  <huguet@adacore.com>
+
+       * libgnat/a-textio.adb: Add abstract state refinment.
+       * libgnat/a-textio.ads: Add File_System abstract state.  Add
+       global contracts, contract cases, preconditions and
+       postconditions to procedures and functions.
+       (Set_Input, Set_Output, Set_Error, Standard_Input,
+       Standard_Output, Standard_Error, Current_Input, Current_Output,
+       Current_Error): Turn SPARK_Mode off.
+       (Get_Line): Turn SPARK_Mode off on Get_Line functions.
+       * libgnat/a-tideio.ads, libgnat/a-tienio.ads,
+       libgnat/a-tifiio.ads, libgnat/a-tiflio.ads,
+       libgnat/a-tiinio.ads, libgnat/a-timoio.ads: Add global
+       contracts, contract cases, preconditions and postconditions to
+       procedures and functions.
+
 2019-07-05  Arnaud Charlet  <charlet@adacore.com>
 
        * doc/gnat_ugn/platform_specific_information.rst: Refresh doc on
index 5b6e28a5341bdd0f55fda752d46cede15f9b9449..276be122c0917337b3ba7617a26110558705d35a 100644 (file)
@@ -43,7 +43,18 @@ with Ada.Unchecked_Deallocation;
 pragma Elaborate_All (System.File_IO);
 --  Needed because of calls to Chain_File in package body elaboration
 
-package body Ada.Text_IO is
+package body Ada.Text_IO with
+  Refined_State => (File_System => (Standard_In,
+                                    Standard_Out,
+                                    Standard_Err,
+                                    Current_In,
+                                    Current_Out,
+                                    Current_Err,
+                                    In_Name,
+                                    Out_Name,
+                                    Err_Name,
+                                    WC_Encoding))
+is
 
    package FIO renames System.File_IO;
 
index 32bbc6cb6a0d37058ff6fc05a31045da65f82e3f..a2e1daf043ede01a2e0f6386e9392b7b09040ad8 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
+--  Preconditions in this unit are meant for analysis only, not for run-time
+--  checking, so that the expected exceptions are raised. This is enforced by
+--  setting the corresponding assertion policy to Ignore. These preconditions
+--  are partial and protect against Status_Error, Mode_Error, and Layout_Error,
+--  but not against other types of errors.
+
+pragma Assertion_Policy (Pre => Ignore);
+
 --  Note: the generic subpackages of Text_IO (Integer_IO, Float_IO, Fixed_IO,
 --  Modular_IO, Decimal_IO and Enumeration_IO) appear as private children in
 --  GNAT. These children are with'ed automatically if they are referenced, so
@@ -46,10 +54,15 @@ with System;
 with System.File_Control_Block;
 with System.WCh_Con;
 
-package Ada.Text_IO is
+package Ada.Text_IO with
+  Abstract_State    => (File_System),
+  Initializes       => (File_System),
+  Initial_Condition => Line_Length = 0 and Page_Length = 0
+is
    pragma Elaborate_Body;
 
-   type File_Type is limited private with Default_Initial_Condition;
+   type File_Type is limited private with
+     Default_Initial_Condition => (not Is_Open (File_Type));
    type File_Mode is (In_File, Out_File, Append_File);
 
    --  The following representation clause allows the use of unchecked
@@ -87,50 +100,97 @@ package Ada.Text_IO is
      (File : in out File_Type;
       Mode : File_Mode := Out_File;
       Name : String := "";
-      Form : String := "");
+      Form : String := "")
+   with
+     Pre    => not Is_Open (File),
+     Post   =>
+       Is_Open (File)
+       and then Ada.Text_IO.Mode (File) = Mode
+       and then (if Mode /= In_File
+                   then (Line_Length (File) = 0
+                         and then Page_Length (File) = 0)),
+     Global => (In_Out => File_System);
 
    procedure Open
      (File : in out File_Type;
       Mode : File_Mode;
       Name : String;
-      Form : String := "");
-
-   procedure Close  (File : in out File_Type);
-   procedure Delete (File : in out File_Type);
-   procedure Reset  (File : in out File_Type; Mode : File_Mode);
-   procedure Reset  (File : in out File_Type);
-
-   function Mode (File : File_Type) return File_Mode;
-   function Name (File : File_Type) return String;
-   function Form (File : File_Type) return String;
-
-   function Is_Open (File : File_Type) return Boolean;
+      Form : String := "")
+   with
+     Pre    => not Is_Open (File),
+     Post   =>
+      Is_Open (File)
+      and then Ada.Text_IO.Mode (File) = Mode
+      and then (if Mode /= In_File
+                  then (Line_Length (File) = 0
+                        and then Page_Length (File) = 0)),
+     Global => (In_Out => File_System);
+
+   procedure Close  (File : in out File_Type) with
+     Pre    => Is_Open (File),
+     Post   => not Is_Open (File),
+     Global => (In_Out => File_System);
+   procedure Delete (File : in out File_Type) with
+     Pre    => Is_Open (File),
+     Post   => not Is_Open (File),
+     Global => (In_Out => File_System);
+   procedure Reset  (File : in out File_Type; Mode : File_Mode) with
+     Pre    => Is_Open (File),
+     Post   =>
+       Is_Open (File)
+       and then Ada.Text_IO.Mode (File) = Mode
+       and then (if Mode /= In_File
+                   then (Line_Length (File) = 0
+                         and then Page_Length (File) = 0)),
+     Global => (In_Out => File_System);
+   procedure Reset  (File : in out File_Type) with
+     Pre    => Is_Open (File),
+     Post   =>
+       Is_Open (File)
+       and Mode (File)'Old = Mode (File)
+       and (if Mode (File) /= In_File
+                then (Line_Length (File) = 0
+                      and then Page_Length (File) = 0)),
+     Global => (In_Out => File_System);
+
+   function Mode (File : File_Type) return File_Mode with
+     Pre    => Is_Open (File),
+     Global => null;
+   function Name (File : File_Type) return String with
+     Pre    => Is_Open (File),
+     Global => null;
+   function Form (File : File_Type) return String with
+     Pre    => Is_Open (File),
+     Global => null;
+
+   function Is_Open (File : File_Type) return Boolean with
+     Global => null;
 
    ------------------------------------------------------
    -- Control of default input, output and error files --
    ------------------------------------------------------
 
-   procedure Set_Input  (File : File_Type);
-   procedure Set_Output (File : File_Type);
-   procedure Set_Error  (File : File_Type);
+   procedure Set_Input  (File : File_Type) with SPARK_Mode => Off;
+   procedure Set_Output (File : File_Type) with SPARK_Mode => Off;
+   procedure Set_Error  (File : File_Type) with SPARK_Mode => Off;
 
-   function Standard_Input  return File_Type;
-   function Standard_Output return File_Type;
-   function Standard_Error  return File_Type;
+   function Standard_Input  return File_Type with SPARK_Mode => Off;
+   function Standard_Output return File_Type with SPARK_Mode => Off;
+   function Standard_Error  return File_Type with SPARK_Mode => Off;
 
-   function Current_Input  return File_Type;
-   function Current_Output return File_Type;
-   function Current_Error  return File_Type;
+   function Current_Input  return File_Type with SPARK_Mode => Off;
+   function Current_Output return File_Type with SPARK_Mode => Off;
+   function Current_Error  return File_Type with SPARK_Mode => Off;
 
    type File_Access is access constant File_Type;
 
-   function Standard_Input  return File_Access;
-   function Standard_Output return File_Access;
-   function Standard_Error  return File_Access;
+   function Standard_Input  return File_Access with SPARK_Mode => Off;
+   function Standard_Output return File_Access with SPARK_Mode => Off;
+   function Standard_Error  return File_Access with SPARK_Mode => Off;
 
-   function Current_Input  return File_Access;
-   function Current_Output return File_Access;
-   function Current_Error  return File_Access;
+   function Current_Input  return File_Access with SPARK_Mode => Off;
+   function Current_Output return File_Access with SPARK_Mode => Off;
+   function Current_Error  return File_Access with SPARK_Mode => Off;
 
    --------------------
    -- Buffer control --
@@ -139,129 +199,319 @@ package Ada.Text_IO is
    --  Note: The parameter file is IN OUT in the RM, but this is clearly
    --  an oversight, and was intended to be IN, see AI95-00057.
 
-   procedure Flush (File : File_Type);
-   procedure Flush;
+   procedure Flush (File : File_Type) with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
+   procedure Flush with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    --------------------------------------------
    -- Specification of line and page lengths --
    --------------------------------------------
 
-   procedure Set_Line_Length (File : File_Type; To : Count);
-   procedure Set_Line_Length (To : Count);
-
-   procedure Set_Page_Length (File : File_Type; To : Count);
-   procedure Set_Page_Length (To : Count);
-
-   function Line_Length (File : File_Type) return Count;
-   function Line_Length return Count;
-
-   function Page_Length (File : File_Type) return Count;
-   function Page_Length return Count;
+   procedure Set_Line_Length (File : File_Type; To : Count) with
+     Pre    => Is_Open (File)  and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File) = To
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
+   procedure Set_Line_Length (To : Count) with
+     Post   =>
+       Line_Length = To
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   procedure Set_Page_Length (File : File_Type; To : Count) with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Page_Length (File) = To
+       and Line_Length (File)'Old = Line_Length (File),
+     Global => (In_Out => File_System);
+   procedure Set_Page_Length (To : Count) with
+     Post   =>
+       Page_Length = To
+       and Line_Length'Old = Line_Length,
+     Global => (In_Out => File_System);
+
+   function Line_Length (File : File_Type) return Count with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Global => (Input => File_System);
+   function Line_Length return Count with
+     Global => (Input => File_System);
+
+   function Page_Length (File : File_Type) return Count with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Global => (Input => File_System);
+   function Page_Length return Count with
+     Global => (Input => File_System);
 
    ------------------------------------
    -- Column, Line, and Page Control --
    ------------------------------------
 
-   procedure New_Line (File : File_Type; Spacing : Positive_Count := 1);
-   procedure New_Line (Spacing : Positive_Count := 1);
-
-   procedure Skip_Line (File : File_Type; Spacing : Positive_Count := 1);
-   procedure Skip_Line (Spacing : Positive_Count := 1);
-
-   function End_Of_Line (File : File_Type) return Boolean;
-   function End_Of_Line return Boolean;
-
-   procedure New_Page (File : File_Type);
-   procedure New_Page;
-
-   procedure Skip_Page (File : File_Type);
-   procedure Skip_Page;
-
-   function End_Of_Page (File : File_Type) return Boolean;
-   function End_Of_Page return Boolean;
-
-   function End_Of_File (File : File_Type) return Boolean;
-   function End_Of_File return Boolean;
-
-   procedure Set_Col (File : File_Type;  To : Positive_Count);
-   procedure Set_Col (To : Positive_Count);
-
-   procedure Set_Line (File : File_Type; To : Positive_Count);
-   procedure Set_Line (To : Positive_Count);
-
-   function Col (File : File_Type) return Positive_Count;
-   function Col return Positive_Count;
-
-   function Line (File : File_Type) return Positive_Count;
-   function Line return Positive_Count;
-
-   function Page (File : File_Type) return Positive_Count;
-   function Page return Positive_Count;
+   procedure New_Line (File : File_Type; Spacing : Positive_Count := 1) with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
+   procedure New_Line (Spacing : Positive_Count := 1) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   procedure Skip_Line (File : File_Type; Spacing : Positive_Count := 1) with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
+   procedure Skip_Line (Spacing : Positive_Count := 1) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   function End_Of_Line (File : File_Type) return Boolean with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (Input => File_System);
+   function End_Of_Line return Boolean with
+     Global => (Input => File_System);
+
+   procedure New_Page (File : File_Type) with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
+   procedure New_Page with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   procedure Skip_Page (File : File_Type) with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
+   procedure Skip_Page with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   function End_Of_Page (File : File_Type) return Boolean with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (Input => File_System);
+   function End_Of_Page return Boolean with
+     Global => (Input => File_System);
+
+   function End_Of_File (File : File_Type) return Boolean with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (Input => File_System);
+   function End_Of_File return Boolean with
+     Global => (Input => File_System);
+
+   procedure Set_Col (File : File_Type;  To : Positive_Count) with
+     Pre            =>
+       Is_Open (File)
+       and then (if Mode (File) /= In_File
+                     then (Line_Length (File) = 0
+                           or else To <= Line_Length (File))),
+     Contract_Cases =>
+       (Mode (File) /= In_File =>
+              Line_Length (File)'Old = Line_Length (File)
+              and Page_Length (File)'Old = Page_Length (File),
+        others                 => True),
+     Global         => (In_Out => File_System);
+   procedure Set_Col (To : Positive_Count) with
+     Pre    => Line_Length = 0 or To <= Line_Length,
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   procedure Set_Line (File : File_Type; To : Positive_Count) with
+     Pre            =>
+       Is_Open (File)
+       and then (if Mode (File) /= In_File
+                     then (Page_Length (File) = 0
+                           or else To <= Page_Length (File))),
+     Contract_Cases =>
+       (Mode (File) /= In_File =>
+              Line_Length (File)'Old = Line_Length (File)
+              and Page_Length (File)'Old = Page_Length (File),
+        others                 => True),
+     Global         => (In_Out => File_System);
+   procedure Set_Line (To : Positive_Count) with
+     Pre    => Page_Length = 0 or To <= Page_Length,
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+
+   function Col (File : File_Type) return Positive_Count with
+     Pre    => Is_Open (File),
+     Global => (Input => File_System);
+   function Col return Positive_Count with
+     Global => (Input => File_System);
+
+   function Line (File : File_Type) return Positive_Count with
+     Pre    => Is_Open (File),
+     Global => (Input => File_System);
+   function Line return Positive_Count with
+     Global => (Input => File_System);
+
+   function Page (File : File_Type) return Positive_Count with
+     Pre => Is_Open (File),
+     Global => (Input => File_System);
+   function Page return Positive_Count with
+     Global => (Input => File_System);
 
    ----------------------------
    -- Character Input-Output --
    ----------------------------
 
-   procedure Get (File : File_Type; Item : out Character);
-   procedure Get (Item : out Character);
-   procedure Put (File : File_Type; Item : Character);
-   procedure Put (Item : Character);
+   procedure Get (File : File_Type; Item : out Character) with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
+   procedure Get (Item : out Character) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+   procedure Put (File : File_Type; Item : Character) with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
+   procedure Put (Item : Character) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Look_Ahead
      (File        : File_Type;
       Item        : out Character;
-      End_Of_Line : out Boolean);
+      End_Of_Line : out Boolean)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (Input => File_System);
 
    procedure Look_Ahead
      (Item        : out Character;
-      End_Of_Line : out Boolean);
+      End_Of_Line : out Boolean)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (Input => File_System);
 
    procedure Get_Immediate
      (File : File_Type;
-      Item : out Character);
+      Item : out Character)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get_Immediate
-     (Item : out Character);
+     (Item : out Character)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get_Immediate
      (File      : File_Type;
       Item      : out Character;
-      Available : out Boolean);
+      Available : out Boolean)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get_Immediate
      (Item      : out Character;
-      Available : out Boolean);
+      Available : out Boolean)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    -------------------------
    -- String Input-Output --
    -------------------------
 
-   procedure Get (File : File_Type; Item : out String);
-   procedure Get (Item : out String);
-   procedure Put (File : File_Type; Item : String);
-   procedure Put (Item : String);
+   procedure Get (File : File_Type; Item : out String) with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
+   procedure Get (Item : out String) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
+   procedure Put (File : File_Type; Item : String) with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
+   procedure Put (Item : String) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get_Line
      (File : File_Type;
       Item : out String;
-      Last : out Natural);
+      Last : out Natural)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Post   => (if Item'Length > 0 then Last in Item'First - 1 .. Item'Last
+               else Last = Item'First - 1),
+     Global => (In_Out => File_System);
 
    procedure Get_Line
      (Item : out String;
-      Last : out Natural);
-
-   function Get_Line (File : File_Type) return String;
+      Last : out Natural)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length
+       and (if Item'Length > 0 then Last in Item'First - 1 .. Item'Last
+            else Last = Item'First - 1),
+     Global => (In_Out => File_System);
+
+   function Get_Line (File : File_Type) return String with SPARK_Mode => Off;
    pragma Ada_05 (Get_Line);
 
-   function Get_Line return String;
+   function Get_Line return String with SPARK_Mode => Off;
    pragma Ada_05 (Get_Line);
 
    procedure Put_Line
      (File : File_Type;
-      Item : String);
+      Item : String)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put_Line
-     (Item : String);
+     (Item : String)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    ---------------------------------------
    -- Generic packages for Input-Output --
@@ -447,14 +697,20 @@ private
    Standard_Out_AFCB : aliased Text_AFCB;
    Standard_Err_AFCB : aliased Text_AFCB;
 
-   Standard_In  : aliased File_Type := Standard_In_AFCB'Access;
-   Standard_Out : aliased File_Type := Standard_Out_AFCB'Access;
-   Standard_Err : aliased File_Type := Standard_Err_AFCB'Access;
+   Standard_In  : aliased File_Type := Standard_In_AFCB'Access with
+     Part_Of => File_System;
+   Standard_Out : aliased File_Type := Standard_Out_AFCB'Access with
+     Part_Of => File_System;
+   Standard_Err : aliased File_Type := Standard_Err_AFCB'Access with
+     Part_Of => File_System;
    --  Standard files
 
-   Current_In   : aliased File_Type := Standard_In;
-   Current_Out  : aliased File_Type := Standard_Out;
-   Current_Err  : aliased File_Type := Standard_Err;
+   Current_In   : aliased File_Type := Standard_In with
+     Part_Of => File_System;
+   Current_Out  : aliased File_Type := Standard_Out with
+     Part_Of => File_System;
+   Current_Err  : aliased File_Type := Standard_Err with
+     Part_Of => File_System;
    --  Current files
 
    function EOF_Char return Integer;
index c504707b665c84bff83911d65767de5061a4907b..efe52c565d2d8f0dbc479aaf47dea734f8e859ae 100644 (file)
@@ -52,35 +52,58 @@ package Ada.Text_IO.Decimal_IO is
    procedure Get
      (File  : File_Type;
       Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get
      (Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Put
      (File : File_Type;
       Item : Num;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put
      (Item : Num;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get
      (From : String;
       Item : out Num;
-      Last : out Positive);
+      Last : out Positive)
+   with
+     Global => null;
 
    procedure Put
      (To   : out String;
       Item : Num;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Global => null;
 
 private
    pragma Inline (Get);
index 68f4694321b3dec40f5bb54f40bc4ccbbee3b400..fb80abdf8ff79817db1b0b8912ded4a2c5f1dc16 100644 (file)
@@ -28,28 +28,49 @@ package Ada.Text_IO.Enumeration_IO is
    Default_Width : Field := 0;
    Default_Setting : Type_Set := Upper_Case;
 
-   procedure Get (File : File_Type; Item : out Enum);
-   procedure Get (Item : out Enum);
+   procedure Get (File : File_Type; Item : out Enum) with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
+   procedure Get (Item : out Enum) with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Put
      (File  : File_Type;
       Item  : Enum;
       Width : Field := Default_Width;
-      Set   : Type_Set := Default_Setting);
+      Set   : Type_Set := Default_Setting)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put
      (Item  : Enum;
       Width : Field := Default_Width;
-      Set   : Type_Set := Default_Setting);
+      Set   : Type_Set := Default_Setting)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get
      (From : String;
       Item : out Enum;
-      Last : out Positive);
+      Last : out Positive)
+   with
+     Global => null;
 
    procedure Put
      (To   : out String;
       Item : Enum;
-      Set  : Type_Set := Default_Setting);
+      Set  : Type_Set := Default_Setting)
+   with
+     Global => null;
 
 end Ada.Text_IO.Enumeration_IO;
index 265600dbe464a1651f768e4e511719042f51579f..1acf67ab760c546017107c4982b38eec02891ac8 100644 (file)
@@ -32,35 +32,58 @@ package Ada.Text_IO.Fixed_IO is
    procedure Get
      (File  : File_Type;
       Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get
      (Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Put
      (File : File_Type;
       Item : Num;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put
      (Item : Num;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get
      (From : String;
       Item : out Num;
-      Last : out Positive);
+      Last : out Positive)
+   with
+     Global => null;
 
    procedure Put
      (To   : out String;
       Item : Num;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Global => null;
 
 private
    pragma Inline (Get);
index dcc4856bea831e54d454d2ec77a5a17c3b0d9b7c..16e65a55de2482b8af7b22b9ab43c24357e0c3da 100644 (file)
@@ -52,35 +52,58 @@ package Ada.Text_IO.Float_IO is
    procedure Get
      (File  : File_Type;
       Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get
      (Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Put
      (File : File_Type;
       Item : Num;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put
      (Item : Num;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get
      (From : String;
       Item : out Num;
-      Last : out Positive);
+      Last : out Positive)
+   with
+     Global => null;
 
    procedure Put
      (To   : out String;
       Item : Num;
       Aft  : Field := Default_Aft;
-      Exp  : Field := Default_Exp);
+      Exp  : Field := Default_Exp)
+   with
+     Global => null;
 
 private
    pragma Inline (Get);
index 429f3b183ba47c349b3484d5ed45bb9b20e0eea0..28f8d54abf79bf1cb92b09d69a4f96c7d7d4243a 100644 (file)
@@ -51,32 +51,55 @@ package Ada.Text_IO.Integer_IO is
    procedure Get
      (File  : File_Type;
       Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get
      (Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Put
      (File  : File_Type;
       Item  : Num;
       Width : Field := Default_Width;
-      Base  : Number_Base := Default_Base);
+      Base  : Number_Base := Default_Base)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put
      (Item  : Num;
       Width : Field := Default_Width;
-      Base  : Number_Base := Default_Base);
+      Base  : Number_Base := Default_Base)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get
      (From : String;
       Item : out Num;
-      Last : out Positive);
+      Last : out Positive)
+   with
+     Global => null;
 
    procedure Put
      (To   : out String;
       Item : Num;
-      Base : Number_Base := Default_Base);
+      Base : Number_Base := Default_Base)
+   with
+     Global => null;
 
 private
    pragma Inline (Get);
index 5b8a72ebf1b39f620ad6930be3d3c1d276f4b62d..2d1ab91d4a4d573933ac798a4ad6953dc7bf79d9 100644 (file)
@@ -51,32 +51,55 @@ package Ada.Text_IO.Modular_IO is
    procedure Get
      (File  : File_Type;
       Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Pre    => Is_Open (File) and then Mode (File) = In_File,
+     Global => (In_Out => File_System);
 
    procedure Get
      (Item  : out Num;
-      Width : Field := 0);
+      Width : Field := 0)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Put
      (File  : File_Type;
       Item  : Num;
       Width : Field := Default_Width;
-      Base  : Number_Base := Default_Base);
+      Base  : Number_Base := Default_Base)
+   with
+     Pre    => Is_Open (File) and then Mode (File) /= In_File,
+     Post   =>
+       Line_Length (File)'Old = Line_Length (File)
+       and Page_Length (File)'Old = Page_Length (File),
+     Global => (In_Out => File_System);
 
    procedure Put
      (Item  : Num;
       Width : Field := Default_Width;
-      Base  : Number_Base := Default_Base);
+      Base  : Number_Base := Default_Base)
+   with
+     Post   =>
+       Line_Length'Old = Line_Length
+       and Page_Length'Old = Page_Length,
+     Global => (In_Out => File_System);
 
    procedure Get
      (From : String;
       Item : out Num;
-      Last : out Positive);
+      Last : out Positive)
+   with
+     Global => null;
 
    procedure Put
      (To   : out String;
       Item : Num;
-      Base : Number_Base := Default_Base);
+      Base : Number_Base := Default_Base)
+   with
+     Global => null;
 
 private
    pragma Inline (Get);