[Ada] Implement tiered support for floating-point input operations
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 23 Nov 2020 14:42:08 +0000 (15:42 +0100)
committerPierre-Marie de Rodat <derodat@adacore.com>
Tue, 15 Dec 2020 11:41:55 +0000 (06:41 -0500)
gcc/ada/

* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Remove s-fatsfl$(objext)
and add s-valflt$(objext), s-vallfl$(objext), s-valllf$(objext).
* exp_attr.adb (Find_Fat_Info): Merge Short_Float and Float cases.
* exp_imgv.adb (Expand_Value_Attribute): Replace RE_Value_Real with
RE_Value_Long_Long_Float for fixed-point types and use appropriate
base type for floating-point types.
* rtsfind.ads (RTU_Id): Remove System_Fat_IEEE_Long_Float,
System_Fat_IEEE_Short_Float and System_Val_Real, add System_Val_Flt,
System_Val_LFlt and System_Val_LLF.
(RE_Id): Remove RE_Attr_IEEE_Long, RE_Fat_IEEE_Long,
RE_Attr_IEEE_Short, RE_Fat_IEEE_Short, RE_Attr_Short_Float, add
RE_Value_Float, RE_Value_Long_Float, RE_Value_Long_Long_Float,
(RE_Unit_Table): Likewise.
* libgnat/a-ticoau.ads: Add with clause for Float_Aux and make the
package generic.
(Get): Change parameter types to Num.
(Put): Likewise.
(Gets): Likewise.
(Puts): Likewise.
* libgnat/a-ticoau.adb: Remove clause and renaming for Float_Aux.
(Get): Change parameter types to Num.
(Gets): Likewise.
(Put): Likewise.
(Puts): Likewise.  Add conversion to Long_Long_Float.
* libgnat/a-ticoio.adb: Remove with clause for Ada.Text_IO, add with
clause for Float_Aux, add with and use clauses for System.Val_Flt,
System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux and
Complex_Aux on Float, Long_Float, and Long_Long_Float.
(OK_Float): New boolean constant.
(OK_Long_Float): Likewise.
(Get): Call appropriate Get routine from auxiliary package.
(Get): Call appropriate Gets routine from auxiliary package.
(Put): Call appropriate Put routine from auxiliary package.
(Put): Call appropriate Puts routine from auxiliary package.
* libgnat/a-tideau.adb: Remove with and use clause for Float_Aux.
* libgnat/a-tifiau.adb: Likewise.
* libgnat/a-tifiio.adb: Add with and use clause for System.Val_LLF.
Instantiate Float_Aux on Long_Long_Float.
(Get): Adjust call to Get routine from auxiliary package.
(Get): Adjust call to Gets routine from auxiliary package.
(Put): Adjust call to Put routine from auxiliary package.
(Put): Adjust call to Puts routine from auxiliary package.
* libgnat/a-tifiio__128.adb: Likewise.
(Get): Likewise.
(Get): Likewise.
(Put): Likewise.
(Put): Likewise.
* libgnat/a-tiflau.ads: Make the package generic.
(Get): Change parameter type to Num.
(Put): Likewise.
(Gets): Likewise.
(Puts): Likewise.
* libgnat/a-tiflau.adb: Remove clauses for System.Val_Real.
(Get): Change parameter type to Num and call Scan routine.
(Gets): Likewise.
(Load_Real): Move to...
(Put): Change parameter type and add conversion to Long_Long_Float.
(Puts): Likewise.
* libgnat/a-tiflio.adb: Add with and use clauses for System.Val_Flt,
System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux on Float,
Long_Float and Long_Long_Float.
(OK_Float): New boolean constant.
(OK_Long_Float): Likewise.
(Get): Call appropriate Get routine from auxiliary package.
(Get): Call previous variant.
(Get): Call appropriate Gets routine from auxiliary package.
(Put): Call appropriate Put routine from auxiliary package.
(Put): Call previous variant.
(Put): Call appropriate Puts routine from auxiliary package.
* libgnat/a-tigeau.ads (Load_Real): New procedure.
* libgnat/a-tigeau.adb (Load_Real): ...here.
* libgnat/a-wtcoau.ads: Add with clause for Float_Aux and make the
package generic.
(Get): Change parameter types to Num.
(Put): Likewise.
(Gets): Likewise.
(Puts): Likewise.
* libgnat/a-wtcoau.adb: Remove clause and renaming for Float_Aux.
(Get): Change parameter types to Num.
(Gets): Likewise.
(Put): Likewise.
(Puts): Likewise.  Add conversion to Long_Long_Float.
* libgnat/a-wtcoio.ads: Remove use clause for Complex_Types and use
qualified names throughout accordingly.
* libgnat/a-wtcoio.adb: Remove clause for Ada.Unchecked_Conversion,
add with clause for Float_Aux, add clauses for System.Val_Flt,
System.Val_LFlt and System.Val_LLF. Add clause for Complex_Types.
Instantiate Float_Aux and Complex_Aux on Float, Long_Float, and
Long_Long_Float.  Remove LLF subtype and TFT instantiation.
(OK_Float): New boolean constant.
(OK_Long_Float): Likewise.
(Get): Call appropriate Get routine from auxiliary package.
(Get): Call appropriate Gets routine from auxiliary package.
(Put): Call appropriate Put routine from auxiliary package.
(Put): Call appropriate Puts routine from auxiliary package.
* libgnat/a-wtdeau.adb: Remove with and use clause for Float_Aux.
* libgnat/a-wtfiau.adb: Likewise.
* libgnat/a-wtfiio.adb: Add with and use clause for System.Val_LLF.
Instantiate Float_Aux on Long_Long_Float.
(Get): Adjust call to Get routine from auxiliary package.
(Get): Adjust call to Gets routine from auxiliary package.
(Put): Adjust call to Put routine from auxiliary package.
(Put): Adjust call to Puts routine from auxiliary package.
* libgnat/a-wtfiio__128.adb: Likewise.
(Get): Likewise.
(Get): Likewise.
(Put): Likewise.
(Put): Likewise.
* libgnat/a-wtflau.ads: Make the package generic.
(Get): Change parameter type to Num.
(Put): Likewise.
(Gets): Likewise.
(Puts): Likewise.
* libgnat/a-wtflau.adb: Remove clauses for System.Val_Real.
(Get): Change parameter type to Num and call Scan routine. Set
Ptr parameter lazily.
(Gets): Likewise.
(Load_Real): Move to...
(Put): Change parameter type and add conversion to Long_Long_Float.
Bump buffer length to Max_Real_Image_Length.
(Puts): Likewise.
* libgnat/a-wtflio.adb: Add with and use clauses for System.Val_Flt,
System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux on Float,
Long_Float and Long_Long_Float.
(OK_Float): New boolean constant.
(OK_Long_Float): Likewise.
(Get): Call appropriate Get routine from auxiliary package.  Add
pragma Unsuppress (Range_Check) and manual validity check.
(Get): Call appropriate Gets routine from auxiliary package. Add
pragma Unsuppress (Range_Check) and manual validity check.
(Put): Call appropriate Put routine from auxiliary package.
(Put): Call appropriate Puts routine from auxiliary package.
* libgnat/a-wtgeau.ads (Load_Real): New procedure.
* libgnat/a-wtgeau.adb (Load_Real): ...here.
* libgnat/a-ztcoau.ads: Add with clause for Float_Aux and make the
package generic.
(Get): Change parameter types to Num.
(Put): Likewise.
(Gets): Likewise.
(Puts): Likewise.
* libgnat/a-ztcoau.adb: Remove clause and renaming for Float_Aux.
(Get): Change parameter types to Num.
(Gets): Likewise.
(Put): Likewise.
(Puts): Likewise.  Add conversion to Long_Long_Float.
* libgnat/a-ztcoio.ads: Remove use clause for Complex_Types and use
qualified names throughout accordingly.
* libgnat/a-ztcoio.adb: Remove clause for Ada.Unchecked_Conversion,
add with clause for Float_Aux, add clauses for System.Val_Flt,
System.Val_LFlt and System.Val_LLF. Add clause for Complex_Types.
Instantiate Float_Aux and Complex_Aux on Float, Long_Float, and
Long_Long_Float. Remove LLF subtype and TFT instantiation.
(OK_Float): New boolean constant.
(OK_Long_Float): Likewise.
(Get): Call appropriate Get routine from auxiliary package.
(Get): Call appropriate Gets routine from auxiliary package.
(Put): Call appropriate Put routine from auxiliary package.
(Put): Call appropriate Puts routine from auxiliary package.
* libgnat/a-ztdeau.adb: Remove with and use clause for Float_Aux.
* libgnat/a-ztfiau.adb: Likewise.
* libgnat/a-ztfiio.adb: Add with and use clause for System.Val_LLF.
Instantiate Float_Aux on Long_Long_Float.
(Get): Adjust call to Get routine from auxiliary package.
(Get): Adjust call to Gets routine from auxiliary package.
(Put): Adjust call to Put routine from auxiliary package.
(Put): Adjust call to Puts routine from auxiliary package.
* libgnat/a-ztfiio__128.adb: Likewise.
(Get): Likewise.
(Get): Likewise.
(Put): Likewise.
(Put): Likewise.
* libgnat/a-ztflau.ads: Make the package generic.
(Get): Change parameter type to Num.
(Put): Likewise.
(Gets): Likewise.
(Puts): Likewise.
* libgnat/a-ztflau.adb: Remove clauses for System.Val_Real.
(Get): Change parameter type to Num and call Scan routine. Set
Ptr parameter lazily.
(Gets): Likewise.
(Load_Real): Move to...
(Put): Change parameter type and add conversion to Long_Long_Float.
Bump buffer length to Max_Real_Image_Length.
(Puts): Likewise.
* libgnat/a-ztflio.adb: Add with and use clauses for System.Val_Flt,
System.Val_LFlt and System.Val_LLF. Instantiate Float_Aux on Float,
Long_Float and Long_Long_Float.
(OK_Float): New boolean constant.
(OK_Long_Float): Likewise.
(Get): Call appropriate Get routine from auxiliary package.  Add
pragma Unsuppress (Range_Check) and manual validity check.
(Get): Call appropriate Gets routine from auxiliary package. Add
pragma Unsuppress (Range_Check) and manual validity check.
(Put): Call appropriate Put routine from auxiliary package.
(Put): Call appropriate Puts routine from auxiliary package.
* libgnat/a-ztgeau.ads (Load_Real): New procedure.
* libgnat/a-ztgeau.adb (Load_Real): ...here.
* libgnat/s-fatsfl.ads: Delete.
* libgnat/s-valflt.ads: New package.
* libgnat/s-vallfl.ads: Likewise.
* libgnat/s-valllf.ads: Likewise.
* libgnat/s-valrea.ads: Make generic. Add assertions, defensive
code and clarify intent.
(Scan_Real): Change parameter type to Num.
(Value_Real): Likewise.
* libgnat/s-valrea.adb: Instantiate Value_R on Uns.
(Integer_to_Real): Change parameter and result to Num.
Call Float_Control.Reset only if the mantissa is 64 bits.  Use
a divide to compute the final value if the scale is negative.
(Scan_Real): Change result to Num.
(Value_Real): Likewise.
* libgnat/s-valuer.adb: Add assertions, defensive code and
clarify intent.
(F_Limit): Delete.
(I_Limit): Likewise.
(Precision_Limit): Always use the integer limit.
* libgnat/s-fatgen.adb: Add pragma Annotate.

50 files changed:
gcc/ada/Makefile.rtl
gcc/ada/exp_attr.adb
gcc/ada/exp_imgv.adb
gcc/ada/libgnat/a-ticoau.adb
gcc/ada/libgnat/a-ticoau.ads
gcc/ada/libgnat/a-ticoio.adb
gcc/ada/libgnat/a-tideau.adb
gcc/ada/libgnat/a-tifiau.adb
gcc/ada/libgnat/a-tifiio.adb
gcc/ada/libgnat/a-tifiio__128.adb
gcc/ada/libgnat/a-tiflau.adb
gcc/ada/libgnat/a-tiflau.ads
gcc/ada/libgnat/a-tiflio.adb
gcc/ada/libgnat/a-tigeau.adb
gcc/ada/libgnat/a-tigeau.ads
gcc/ada/libgnat/a-wtcoau.adb
gcc/ada/libgnat/a-wtcoau.ads
gcc/ada/libgnat/a-wtcoio.adb
gcc/ada/libgnat/a-wtcoio.ads
gcc/ada/libgnat/a-wtdeau.adb
gcc/ada/libgnat/a-wtfiau.adb
gcc/ada/libgnat/a-wtfiio.adb
gcc/ada/libgnat/a-wtfiio__128.adb
gcc/ada/libgnat/a-wtflau.adb
gcc/ada/libgnat/a-wtflau.ads
gcc/ada/libgnat/a-wtflio.adb
gcc/ada/libgnat/a-wtgeau.adb
gcc/ada/libgnat/a-wtgeau.ads
gcc/ada/libgnat/a-ztcoau.adb
gcc/ada/libgnat/a-ztcoau.ads
gcc/ada/libgnat/a-ztcoio.adb
gcc/ada/libgnat/a-ztcoio.ads
gcc/ada/libgnat/a-ztdeau.adb
gcc/ada/libgnat/a-ztfiau.adb
gcc/ada/libgnat/a-ztfiio.adb
gcc/ada/libgnat/a-ztfiio__128.adb
gcc/ada/libgnat/a-ztflau.adb
gcc/ada/libgnat/a-ztflau.ads
gcc/ada/libgnat/a-ztflio.adb
gcc/ada/libgnat/a-ztgeau.adb
gcc/ada/libgnat/a-ztgeau.ads
gcc/ada/libgnat/s-fatgen.adb
gcc/ada/libgnat/s-fatsfl.ads [deleted file]
gcc/ada/libgnat/s-valflt.ads [new file with mode: 0644]
gcc/ada/libgnat/s-vallfl.ads [new file with mode: 0644]
gcc/ada/libgnat/s-valllf.ads [new file with mode: 0644]
gcc/ada/libgnat/s-valrea.adb
gcc/ada/libgnat/s-valrea.ads
gcc/ada/libgnat/s-valuer.adb
gcc/ada/rtsfind.ads

index 64ddc2678df2ca68d538e52e035f683facfc63ae..8c99258f7b828fff2c398f8d5902a31356da695f 100644 (file)
@@ -596,7 +596,6 @@ GNATRTL_NONTASKING_OBJS= \
   s-fatgen$(objext) \
   s-fatlfl$(objext) \
   s-fatllf$(objext) \
-  s-fatsfl$(objext) \
   s-ficobl$(objext) \
   s-filatt$(objext) \
   s-fileio$(objext) \
@@ -756,7 +755,10 @@ GNATRTL_NONTASKING_OBJS= \
   s-vafi32$(objext) \
   s-vafi64$(objext) \
   s-valenu$(objext) \
+  s-valflt$(objext) \
   s-valint$(objext) \
+  s-vallfl$(objext) \
+  s-valllf$(objext) \
   s-vallli$(objext) \
   s-valllu$(objext) \
   s-valrea$(objext) \
index ff3d54f7880181a0ed3f8ae69d5175915d7eaaf3..7f63a2d88d13924a7a5954027192986fd2fb60a9 100644 (file)
@@ -8311,27 +8311,25 @@ package body Exp_Attr is
       --  All we do is use the root type (historically this dealt with
       --  VAX-float .. to be cleaned up further later ???)
 
-      Fat_Type := Rtyp;
+      if Rtyp = Standard_Short_Float or else Rtyp = Standard_Float then
+         Fat_Type := Standard_Float;
+         Fat_Pkg  := RE_Attr_Float;
 
-      if Fat_Type = Standard_Short_Float then
-         Fat_Pkg := RE_Attr_Short_Float;
+      elsif Rtyp = Standard_Long_Float then
+         Fat_Type := Standard_Long_Float;
+         Fat_Pkg  := RE_Attr_Long_Float;
 
-      elsif Fat_Type = Standard_Float then
-         Fat_Pkg := RE_Attr_Float;
-
-      elsif Fat_Type = Standard_Long_Float then
-         Fat_Pkg := RE_Attr_Long_Float;
-
-      elsif Fat_Type = Standard_Long_Long_Float then
-         Fat_Pkg := RE_Attr_Long_Long_Float;
+      elsif Rtyp = Standard_Long_Long_Float then
+         Fat_Type := Standard_Long_Long_Float;
+         Fat_Pkg  := RE_Attr_Long_Long_Float;
 
          --  Universal real (which is its own root type) is treated as being
          --  equivalent to Standard.Long_Long_Float, since it is defined to
          --  have the same precision as the longest Float type.
 
-      elsif Fat_Type = Universal_Real then
+      elsif Rtyp = Universal_Real then
          Fat_Type := Standard_Long_Long_Float;
-         Fat_Pkg := RE_Attr_Long_Long_Float;
+         Fat_Pkg  := RE_Attr_Long_Long_Float;
 
       else
          raise Program_Error;
index b79d30afa5b1d9a790d860e95db0a9b0c0fb8dc5..3faa90f1216af9efc09fb676c08e4ddefdbde709 100644 (file)
@@ -1008,10 +1008,10 @@ package body Exp_Imgv is
             then
                Vid := RE_Value_Fixed128;
             else
-               Vid := RE_Value_Real;
+               Vid := RE_Value_Long_Long_Float;
             end if;
 
-            if Vid /= RE_Value_Real then
+            if Vid /= RE_Value_Long_Long_Float then
                Append_To (Args,
                  Make_Integer_Literal (Loc, -Norm_Num (Small_Value (Rtyp))));
 
@@ -1031,7 +1031,18 @@ package body Exp_Imgv is
          end;
 
       elsif Is_Floating_Point_Type (Rtyp) then
-         Vid := RE_Value_Real;
+         if Rtyp = Standard_Short_Float or else Rtyp = Standard_Float then
+            Vid := RE_Value_Float;
+
+         elsif Rtyp = Standard_Long_Float then
+            Vid := RE_Value_Long_Float;
+
+         elsif Rtyp = Standard_Long_Long_Float then
+            Vid := RE_Value_Long_Long_Float;
+
+         else
+            raise Program_Error;
+         end if;
 
       --  Only other possibility is user-defined enumeration type
 
index e4f56dd74e1606f213cc6ac65fdc6a0169be84b8..cf9430582d5f18245694ee479cfc9b04bb9469a8 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
-with Ada.Text_IO.Float_Aux;
 
 with System.Img_Real; use System.Img_Real;
 
 package body Ada.Text_IO.Complex_Aux is
 
-   package Aux renames Ada.Text_IO.Float_Aux;
-
    ---------
    -- Get --
    ---------
 
    procedure Get
      (File  : File_Type;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Width : Field)
    is
       Buf   : String (1 .. Field'Last);
@@ -95,8 +92,8 @@ package body Ada.Text_IO.Complex_Aux is
 
    procedure Gets
      (From  : String;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Last  : out Positive)
    is
       Paren : Boolean;
@@ -139,8 +136,8 @@ package body Ada.Text_IO.Complex_Aux is
 
    procedure Put
      (File  : File_Type;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Fore  : Field;
       Aft   : Field;
       Exp   : Field)
@@ -159,8 +156,8 @@ package body Ada.Text_IO.Complex_Aux is
 
    procedure Puts
      (To    : out String;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Aft   : Field;
       Exp   : Field)
    is
@@ -174,9 +171,9 @@ package body Ada.Text_IO.Complex_Aux is
       --  Both parts are initially converted with a Fore of 0
 
       Rptr := 0;
-      Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (ItemR), R_String, Rptr, 0, Aft, Exp);
       Iptr := 0;
-      Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (ItemI), I_String, Iptr, 0, Aft, Exp);
 
       --  Check room for both parts plus parens plus comma (RM G.1.3(34))
 
index 739dce873838dfaf0a11951605d73a30a9169b3f..22555cf3faaa14e5f4515526685181300e827bd3 100644 (file)
 ------------------------------------------------------------------------------
 
 --  This package contains the routines for Ada.Text_IO.Complex_IO that are
---  shared among separate instantiations of this package. The routines in
---  this package are identical semantically to those in Complex_IO itself,
---  except that the generic parameter Complex has been replaced by separate
---  real and imaginary values of type Long_Long_Float, and default parameters
---  have been removed because they are supplied explicitly by the calls from
---  within the generic template.
+--  shared among separate instantiations of this package. The routines in this
+--  package are identical semantically to those in Complex_IO, except that the
+--  generic parameter Complex has been replaced by separate real and imaginary
+--  parameters, and default parameters have been removed because they are
+--  supplied explicitly by the calls from within the generic template.
+
+with Ada.Text_IO.Float_Aux;
+
+private generic
+
+   type Num is digits <>;
+
+   with package Aux is new Ada.Text_IO.Float_Aux (Num, <>);
 
 package Ada.Text_IO.Complex_Aux is
 
    procedure Get
      (File  : File_Type;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Width : Field);
 
    procedure Put
      (File  : File_Type;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Fore  : Field;
       Aft   : Field;
       Exp   : Field);
 
    procedure Gets
      (From  : String;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Last  : out Positive);
 
    procedure Puts
      (To    : out String;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Aft   : Field;
       Exp   : Field);
 
index fa52b60b78288910d06b275db7f63d1192fe4aca..e35a745e3fd4f4d8e0f318e6b6c54a8faa9518c4 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
-with Ada.Text_IO;
-
 with Ada.Text_IO.Complex_Aux;
+with Ada.Text_IO.Float_Aux;
+with System.Val_Flt;  use System.Val_Flt;
+with System.Val_LFlt; use System.Val_LFlt;
+with System.Val_LLF;  use System.Val_LLF;
 
 package body Ada.Text_IO.Complex_IO is
 
    use Complex_Types;
 
-   package Aux renames Ada.Text_IO.Complex_Aux;
+   package Scalar_Float is new
+      Ada.Text_IO.Float_Aux (Float, Scan_Float);
+
+   package Scalar_Long_Float is new
+      Ada.Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
+
+   package Scalar_Long_Long_Float is new
+      Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
+   package Aux_Float is new
+      Ada.Text_IO.Complex_Aux (Float, Scalar_Float);
+
+   package Aux_Long_Float is new
+      Ada.Text_IO.Complex_Aux (Long_Float, Scalar_Long_Float);
 
-   subtype LLF is Long_Long_Float;
-   --  Type used for calls to routines in Aux
+   package Aux_Long_Long_Float is new
+      Ada.Text_IO.Complex_Aux (Long_Long_Float, Scalar_Long_Long_Float);
+
+   --  Throughout this generic body, we distinguish between the case where type
+   --  Float is OK, where type Long_Float is OK and where type Long_Long_Float
+   --  is needed. These boolean constants are used to test for this, such that
+   --  only code for the relevant case is included in the instance.
+
+   OK_Float : constant Boolean := Real'Base'Digits <= Float'Digits;
+
+   OK_Long_Float : constant Boolean := Real'Base'Digits <= Long_Float'Digits;
 
    ---------
    -- Get --
@@ -48,14 +72,24 @@ package body Ada.Text_IO.Complex_IO is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Complex_Types.Complex;
+      Item  : out Complex;
       Width : Field := 0)
    is
       Real_Item : Real'Base;
       Imag_Item : Real'Base;
 
    begin
-      Aux.Get (File, LLF (Real_Item), LLF (Imag_Item), Width);
+      if OK_Float then
+         Aux_Float.Get (File, Float (Real_Item), Float (Imag_Item), Width);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Get
+           (File, Long_Float (Real_Item), Long_Float (Imag_Item), Width);
+      else
+         Aux_Long_Long_Float.Get
+           (File, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
+            Width);
+      end if;
+
       Item := (Real_Item, Imag_Item);
 
    exception
@@ -67,7 +101,7 @@ package body Ada.Text_IO.Complex_IO is
    ---------
 
    procedure Get
-     (Item  : out Complex_Types.Complex;
+     (Item  : out Complex;
       Width : Field := 0)
    is
    begin
@@ -80,14 +114,24 @@ package body Ada.Text_IO.Complex_IO is
 
    procedure Get
      (From : String;
-      Item : out Complex_Types.Complex;
+      Item : out Complex;
       Last : out Positive)
    is
       Real_Item : Real'Base;
       Imag_Item : Real'Base;
 
    begin
-      Aux.Gets (From, LLF (Real_Item), LLF (Imag_Item), Last);
+      if OK_Float then
+         Aux_Float.Gets (From, Float (Real_Item), Float (Imag_Item), Last);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Gets
+           (From, Long_Float (Real_Item), Long_Float (Imag_Item), Last);
+      else
+         Aux_Long_Long_Float.Gets
+           (From, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
+            Last);
+      end if;
+
       Item := (Real_Item, Imag_Item);
 
    exception
@@ -100,13 +144,24 @@ package body Ada.Text_IO.Complex_IO is
 
    procedure Put
      (File : File_Type;
-      Item : Complex_Types.Complex;
+      Item : Complex;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (File, LLF (Re (Item)), LLF (Im (Item)), Fore, Aft, Exp);
+      if OK_Float then
+         Aux_Float.Put
+           (File, Float (Re (Item)), Float (Im (Item)), Fore, Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Put
+           (File, Long_Float (Re (Item)), Long_Float (Im (Item)), Fore, Aft,
+            Exp);
+      else
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
+            Fore, Aft, Exp);
+      end if;
    end Put;
 
    ---------
@@ -114,7 +169,7 @@ package body Ada.Text_IO.Complex_IO is
    ---------
 
    procedure Put
-     (Item : Complex_Types.Complex;
+     (Item : Complex;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp)
@@ -129,12 +184,21 @@ package body Ada.Text_IO.Complex_IO is
 
    procedure Put
      (To   : out String;
-      Item : Complex_Types.Complex;
+      Item : Complex;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Puts (To, LLF (Re (Item)), LLF (Im (Item)), Aft, Exp);
+      if OK_Float then
+         Aux_Float.Puts (To, Float (Re (Item)), Float (Im (Item)), Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Puts
+           (To, Long_Float (Re (Item)), Long_Float (Im (Item)), Aft, Exp);
+      else
+         Aux_Long_Long_Float.Puts
+           (To, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
+            Aft, Exp);
+      end if;
    end Put;
 
 end Ada.Text_IO.Complex_IO;
index 5878234dde459c70c9aad9fcec174d2b3e6f7409..ac751c13e1abe4e94e843d7e4abbd1c444b871a6 100644 (file)
@@ -30,7 +30,6 @@
 ------------------------------------------------------------------------------
 
 with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
-with Ada.Text_IO.Float_Aux;   use Ada.Text_IO.Float_Aux;
 
 package body Ada.Text_IO.Decimal_Aux is
 
index 92595524febb77d750950df1e310774e929f4344..c6f4430e7cbef9862dee6f483169eda692fa4b6a 100644 (file)
@@ -30,7 +30,6 @@
 ------------------------------------------------------------------------------
 
 with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
-with Ada.Text_IO.Float_Aux;   use Ada.Text_IO.Float_Aux;
 
 package body Ada.Text_IO.Fixed_Aux is
 
index 61c68ec8ba746b6ae832ab568420e83cc4903ecc..0d9f6a55090f9dc4d4714d5d42e5bd3b7162c8a6 100644 (file)
@@ -160,6 +160,7 @@ with System.Img_Fixed_32; use System.Img_Fixed_32;
 with System.Img_Fixed_64; use System.Img_Fixed_64;
 with System.Val_Fixed_32; use System.Val_Fixed_32;
 with System.Val_Fixed_64; use System.Val_Fixed_64;
+with System.Val_LLF;      use System.Val_LLF;
 
 package body Ada.Text_IO.Fixed_IO is
 
@@ -177,6 +178,9 @@ package body Ada.Text_IO.Fixed_IO is
    package Aux64 is new
      Ada.Text_IO.Fixed_Aux (Int64, Scan_Fixed64, Set_Image_Fixed64);
 
+   package Aux_Long_Long_Float is new
+     Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
    --  Throughout this generic body, we distinguish between the case where type
    --  Int32 is OK and where type Int64 is OK. These boolean constants are used
    --  to test for this, such that only code for the relevant case is included
@@ -279,7 +283,7 @@ package body Ada.Text_IO.Fixed_IO is
                                -Num'Small_Numerator,
                                -Num'Small_Denominator));
       else
-         Float_Aux.Get (File, Long_Long_Float (Item), Width);
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
       end if;
 
    exception
@@ -313,7 +317,7 @@ package body Ada.Text_IO.Fixed_IO is
                                 -Num'Small_Numerator,
                                 -Num'Small_Denominator));
       else
-         Float_Aux.Gets (From, Long_Long_Float (Item), Last);
+         Aux_Long_Long_Float.Gets (From, Long_Long_Float (Item), Last);
       end if;
 
    exception
@@ -341,7 +345,8 @@ package body Ada.Text_IO.Fixed_IO is
                     -Num'Small_Numerator, -Num'Small_Denominator,
                     For0, Num'Aft);
       else
-         Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
       end if;
    end Put;
 
@@ -371,7 +376,7 @@ package body Ada.Text_IO.Fixed_IO is
                      -Num'Small_Numerator, -Num'Small_Denominator,
                      For0, Num'Aft);
       else
-         Float_Aux.Puts (To, Long_Long_Float (Item), Aft, Exp);
+         Aux_Long_Long_Float.Puts (To, Long_Long_Float (Item), Aft, Exp);
       end if;
    end Put;
 
index 578beb1fb1c56583147d6faeb256363ac9e4635e..ba96bd83f25ceaf4d2983bbc24273dc2d41a6942 100644 (file)
@@ -162,6 +162,7 @@ with System.Img_Fixed_128; use System.Img_Fixed_128;
 with System.Val_Fixed_32;  use System.Val_Fixed_32;
 with System.Val_Fixed_64;  use System.Val_Fixed_64;
 with System.Val_Fixed_128; use System.Val_Fixed_128;
+with System.Val_LLF;       use System.Val_LLF;
 
 package body Ada.Text_IO.Fixed_IO is
 
@@ -183,6 +184,9 @@ package body Ada.Text_IO.Fixed_IO is
    package Aux128 is new
      Ada.Text_IO.Fixed_Aux (Int128, Scan_Fixed128, Set_Image_Fixed128);
 
+   package Aux_Long_Long_Float is new
+     Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
    --  Throughout this generic body, we distinguish between the case where type
    --  Int32 is OK, where type Int64 is OK and where type Int128 is OK. These
    --  boolean constants are used to test for this, such that only code for the
@@ -319,7 +323,7 @@ package body Ada.Text_IO.Fixed_IO is
                                 -Num'Small_Numerator,
                                 -Num'Small_Denominator));
       else
-         Float_Aux.Get (File, Long_Long_Float (Item), Width);
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
       end if;
 
    exception
@@ -358,7 +362,7 @@ package body Ada.Text_IO.Fixed_IO is
                                  -Num'Small_Numerator,
                                  -Num'Small_Denominator));
       else
-         Float_Aux.Gets (From, Long_Long_Float (Item), Last);
+         Aux_Long_Long_Float.Gets (From, Long_Long_Float (Item), Last);
       end if;
 
    exception
@@ -390,7 +394,8 @@ package body Ada.Text_IO.Fixed_IO is
                      -Num'Small_Numerator, -Num'Small_Denominator,
                      For0, Num'Aft);
       else
-         Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
       end if;
    end Put;
 
@@ -424,7 +429,7 @@ package body Ada.Text_IO.Fixed_IO is
                       -Num'Small_Numerator, -Num'Small_Denominator,
                       For0, Num'Aft);
       else
-         Float_Aux.Puts (To, Long_Long_Float (Item), Aft, Exp);
+         Aux_Long_Long_Float.Puts (To, Long_Long_Float (Item), Aft, Exp);
       end if;
    end Put;
 
index ddb52a5eebf178a6ac98ee1bacb744b6cb2e3f52..4955a992f73fd53c0c7c26dc2d1bae42fad69887 100644 (file)
@@ -32,7 +32,6 @@
 with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
 
 with System.Img_Real; use System.Img_Real;
-with System.Val_Real; use System.Val_Real;
 
 package body Ada.Text_IO.Float_Aux is
 
@@ -42,7 +41,7 @@ package body Ada.Text_IO.Float_Aux is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Long_Long_Float;
+      Item  : out Num;
       Width : Field)
    is
       Buf  : String (1 .. Field'Last);
@@ -58,7 +57,7 @@ package body Ada.Text_IO.Float_Aux is
          Ptr := 1;
       end if;
 
-      Item := Scan_Real (Buf, Ptr'Access, Stop);
+      Item := Scan (Buf, Ptr'Access, Stop);
       Check_End_Of_Field (Buf, Stop, Ptr, Width);
    end Get;
 
@@ -68,127 +67,27 @@ package body Ada.Text_IO.Float_Aux is
 
    procedure Gets
      (From : String;
-      Item : out Long_Long_Float;
+      Item : out Num;
       Last : out Positive)
    is
       Pos : aliased Integer;
 
    begin
       String_Skip (From, Pos);
-      Item := Scan_Real (From, Pos'Access, From'Last);
+      Item := Scan (From, Pos'Access, From'Last);
       Last := Pos - 1;
 
    exception
       when Constraint_Error => raise Data_Error;
    end Gets;
 
-   ---------------
-   -- Load_Real --
-   ---------------
-
-   procedure Load_Real
-     (File : File_Type;
-      Buf  : out String;
-      Ptr  : in out Natural)
-   is
-      Loaded   : Boolean;
-
-   begin
-      --  Skip initial blanks, and load possible sign
-
-      Load_Skip (File);
-      Load (File, Buf, Ptr, '+', '-');
-
-      --  Case of .nnnn
-
-      Load (File, Buf, Ptr, '.', Loaded);
-
-      if Loaded then
-         Load_Digits (File, Buf, Ptr, Loaded);
-
-         --  Hopeless junk if no digits loaded
-
-         if not Loaded then
-            return;
-         end if;
-
-      --  Otherwise must have digits to start
-
-      else
-         Load_Digits (File, Buf, Ptr, Loaded);
-
-         --  Hopeless junk if no digits loaded
-
-         if not Loaded then
-            return;
-         end if;
-
-         --  Based cases. We recognize either the standard '#' or the
-         --  allowed alternative replacement ':' (see RM J.2(3)).
-
-         Load (File, Buf, Ptr, '#', ':', Loaded);
-
-         if Loaded then
-
-            --  Case of nnn#.xxx#
-
-            Load (File, Buf, Ptr, '.', Loaded);
-
-            if Loaded then
-               Load_Extended_Digits (File, Buf, Ptr);
-               Load (File, Buf, Ptr, '#', ':');
-
-            --  Case of nnn#xxx.[xxx]# or nnn#xxx#
-
-            else
-               Load_Extended_Digits (File, Buf, Ptr);
-               Load (File, Buf, Ptr, '.', Loaded);
-
-               if Loaded then
-                  Load_Extended_Digits (File, Buf, Ptr);
-               end if;
-
-               --  As usual, it seems strange to allow mixed base characters,
-               --  but that is what ACVC tests expect, see CE3804M, case (3).
-
-               Load (File, Buf, Ptr, '#', ':');
-            end if;
-
-         --  Case of nnn.[nnn] or nnn
-
-         else
-            --  Prevent the potential processing of '.' in cases where the
-            --  initial digits have a trailing underscore.
-
-            if Buf (Ptr) = '_' then
-               return;
-            end if;
-
-            Load (File, Buf, Ptr, '.', Loaded);
-
-            if Loaded then
-               Load_Digits (File, Buf, Ptr);
-            end if;
-         end if;
-      end if;
-
-      --  Deal with exponent
-
-      Load (File, Buf, Ptr, 'E', 'e', Loaded);
-
-      if Loaded then
-         Load (File, Buf, Ptr, '+', '-');
-         Load_Digits (File, Buf, Ptr);
-      end if;
-   end Load_Real;
-
    ---------
    -- Put --
    ---------
 
    procedure Put
      (File : File_Type;
-      Item : Long_Long_Float;
+      Item : Num;
       Fore : Field;
       Aft  : Field;
       Exp  : Field)
@@ -197,7 +96,7 @@ package body Ada.Text_IO.Float_Aux is
       Ptr : Natural := 0;
 
    begin
-      Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (Item), Buf, Ptr, Fore, Aft, Exp);
       Put_Item (File, Buf (1 .. Ptr));
    end Put;
 
@@ -207,7 +106,7 @@ package body Ada.Text_IO.Float_Aux is
 
    procedure Puts
      (To   : out String;
-      Item : Long_Long_Float;
+      Item : Num;
       Aft  : Field;
       Exp  : Field)
    is
@@ -215,7 +114,8 @@ package body Ada.Text_IO.Float_Aux is
       Ptr : Natural := 0;
 
    begin
-      Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
+      Set_Image_Real
+        (Long_Long_Float (Item), Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
 
       if Ptr > To'Length then
          raise Layout_Error;
index 68ac9ebffe6bef535edd72ec80bf74d681d7c074..2dfe76da97437d69a7b10736eb3f5133c50b9fce 100644 (file)
 
 --  This package contains the routines for Ada.Text_IO.Float_IO that are
 --  shared among separate instantiations of this package. The routines in
---  this package are identical semantically to those in Float_IO itself,
---  except that generic parameter Num has been replaced by Long_Long_Float,
---  and the default parameters have been removed because they are supplied
+--  this package are identical semantically to those in Float_IO, except
+--  that the default parameters have been removed because they are supplied
 --  explicitly by the calls from within the generic template. This package
---  is also used by Ada.Text_IO.Fixed_IO, and Ada.Text_IO.Decimal_IO.
+--  is also used by Ada.Text_IO.Fixed_IO and Ada.Text_IO.Decimal_IO.
 
-private package Ada.Text_IO.Float_Aux is
+private generic
 
-   procedure Load_Real
-     (File : File_Type;
-      Buf  : out String;
-      Ptr  : in out Natural);
-   --  This is an auxiliary routine that is used to load a possibly signed
-   --  real literal value from the input file into Buf, starting at Ptr + 1.
+   type Num is digits <>;
+
+   with function Scan
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Num;
+
+package Ada.Text_IO.Float_Aux is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Long_Long_Float;
+      Item  : out Num;
       Width : Field);
 
    procedure Put
      (File : File_Type;
-      Item : Long_Long_Float;
+      Item : Num;
       Fore : Field;
       Aft  : Field;
       Exp  : Field);
 
    procedure Gets
      (From : String;
-      Item : out Long_Long_Float;
+      Item : out Num;
       Last : out Positive);
 
    procedure Puts
      (To   : out String;
-      Item : Long_Long_Float;
+      Item : Num;
       Aft  : Field;
       Exp  : Field);
 
index 8da79f102f105bcfbbab52a1ff947d19b039160a..db1cea2dcd04ea5ffaf05502507f65f48e7c5840 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Text_IO.Float_Aux;
+with System.Val_Flt;  use System.Val_Flt;
+with System.Val_LFlt; use System.Val_LFlt;
+with System.Val_LLF;  use System.Val_LLF;
 
 package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
 
-   package Aux renames Ada.Text_IO.Float_Aux;
+   package Aux_Float is new
+      Ada.Text_IO.Float_Aux (Float, Scan_Float);
+
+   package Aux_Long_Float is new
+      Ada.Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
+
+   package Aux_Long_Long_Float is new
+      Ada.Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
+   --  Throughout this generic body, we distinguish between the case where type
+   --  Float is OK, where type Long_Float is OK and where type Long_Long_Float
+   --  is needed. These boolean constants are used to test for this, such that
+   --  only code for the relevant case is included in the instance.
+
+   OK_Float : constant Boolean := Num'Base'Digits <= Float'Digits;
+
+   OK_Long_Float : constant Boolean := Num'Base'Digits <= Long_Float'Digits;
 
    ---------
    -- Get --
@@ -47,7 +66,13 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
       pragma Unsuppress (Range_Check);
 
    begin
-      Aux.Get (File, Long_Long_Float (Item), Width);
+      if OK_Float then
+         Aux_Float.Get (File, Float (Item), Width);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Get (File, Long_Float (Item), Width);
+      else
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
+      end if;
 
       --  In the case where the type is unconstrained (e.g. Standard'Float),
       --  the above conversion may result in an infinite value, which is
@@ -66,22 +91,8 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
      (Item  : out Num;
       Width : Field := 0)
    is
-      pragma Unsuppress (Range_Check);
-
    begin
-      Aux.Get (Current_In, Long_Long_Float (Item), Width);
-
-      --  In the case where the type is unconstrained (e.g. Standard'Float),
-      --  the above conversion may result in an infinite value, which is
-      --  normally fine for a conversion, but in this case, we want to treat
-      --  that as a data error.
-
-      if not Item'Valid then
-         raise Data_Error;
-      end if;
-
-   exception
-      when Constraint_Error => raise Data_Error;
+      Get (Current_In, Item, Width);
    end Get;
 
    procedure Get
@@ -92,7 +103,13 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
       pragma Unsuppress (Range_Check);
 
    begin
-      Aux.Gets (From, Long_Long_Float (Item), Last);
+      if OK_Float then
+         Aux_Float.Gets (From, Float (Item), Last);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Gets (From, Long_Float (Item), Last);
+      else
+         Aux_Long_Long_Float.Gets (From, Long_Long_Float (Item), Last);
+      end if;
 
       --  In the case where the type is unconstrained (e.g. Standard'Float),
       --  the above conversion may result in an infinite value, which is
@@ -119,7 +136,14 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+      if OK_Float then
+         Aux_Float.Put (File, Float (Item), Fore, Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Put (File, Long_Float (Item), Fore, Aft, Exp);
+      else
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
+      end if;
    end Put;
 
    procedure Put
@@ -129,7 +153,7 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (Current_Out, Long_Long_Float (Item), Fore, Aft, Exp);
+      Put (Current_Out, Item, Fore, Aft, Exp);
    end Put;
 
    procedure Put
@@ -139,7 +163,13 @@ package body Ada.Text_IO.Float_IO with SPARK_Mode => Off is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Puts (To, Long_Long_Float (Item), Aft, Exp);
+      if OK_Float then
+         Aux_Float.Puts (To, Float (Item), Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Puts (To, Long_Float (Item), Aft, Exp);
+      else
+         Aux_Long_Long_Float.Puts (To, Long_Long_Float (Item), Aft, Exp);
+      end if;
    end Put;
 
 end Ada.Text_IO.Float_IO;
index f1ba60a6839370af906f258d23f301f1d7e10e2f..5e13dae20ba6f256a42e70d48169b771e4c416cc 100644 (file)
@@ -376,6 +376,106 @@ package body Ada.Text_IO.Generic_Aux is
       end if;
    end Load_Integer;
 
+   ---------------
+   -- Load_Real --
+   ---------------
+
+   procedure Load_Real
+     (File : File_Type;
+      Buf  : out String;
+      Ptr  : in out Natural)
+   is
+      Loaded   : Boolean;
+
+   begin
+      --  Skip initial blanks, and load possible sign
+
+      Load_Skip (File);
+      Load (File, Buf, Ptr, '+', '-');
+
+      --  Case of .nnnn
+
+      Load (File, Buf, Ptr, '.', Loaded);
+
+      if Loaded then
+         Load_Digits (File, Buf, Ptr, Loaded);
+
+         --  Hopeless junk if no digits loaded
+
+         if not Loaded then
+            return;
+         end if;
+
+      --  Otherwise must have digits to start
+
+      else
+         Load_Digits (File, Buf, Ptr, Loaded);
+
+         --  Hopeless junk if no digits loaded
+
+         if not Loaded then
+            return;
+         end if;
+
+         --  Based cases. We recognize either the standard '#' or the
+         --  allowed alternative replacement ':' (see RM J.2(3)).
+
+         Load (File, Buf, Ptr, '#', ':', Loaded);
+
+         if Loaded then
+
+            --  Case of nnn#.xxx#
+
+            Load (File, Buf, Ptr, '.', Loaded);
+
+            if Loaded then
+               Load_Extended_Digits (File, Buf, Ptr);
+               Load (File, Buf, Ptr, '#', ':');
+
+            --  Case of nnn#xxx.[xxx]# or nnn#xxx#
+
+            else
+               Load_Extended_Digits (File, Buf, Ptr);
+               Load (File, Buf, Ptr, '.', Loaded);
+
+               if Loaded then
+                  Load_Extended_Digits (File, Buf, Ptr);
+               end if;
+
+               --  As usual, it seems strange to allow mixed base characters,
+               --  but that is what ACVC tests expect, see CE3804M, case (3).
+
+               Load (File, Buf, Ptr, '#', ':');
+            end if;
+
+         --  Case of nnn.[nnn] or nnn
+
+         else
+            --  Prevent the potential processing of '.' in cases where the
+            --  initial digits have a trailing underscore.
+
+            if Buf (Ptr) = '_' then
+               return;
+            end if;
+
+            Load (File, Buf, Ptr, '.', Loaded);
+
+            if Loaded then
+               Load_Digits (File, Buf, Ptr);
+            end if;
+         end if;
+      end if;
+
+      --  Deal with exponent
+
+      Load (File, Buf, Ptr, 'E', 'e', Loaded);
+
+      if Loaded then
+         Load (File, Buf, Ptr, '+', '-');
+         Load_Digits (File, Buf, Ptr);
+      end if;
+   end Load_Real;
+
    ---------------
    -- Load_Skip --
    ---------------
index 09334b371dda26f46e70bb8f8985e2c849da1bdb..d6acd8db32adfb6f14c22e16cd50ce2202c4f567 100644 (file)
@@ -156,6 +156,12 @@ private package Ada.Text_IO.Generic_Aux is
       Ptr  : in out Natural);
    --  Loads a possibly signed integer literal value
 
+   procedure Load_Real
+     (File : File_Type;
+      Buf  : out String;
+      Ptr  : in out Natural);
+   --  Loads a possibly signed real literal value
+
    function Nextc (File : File_Type) return Integer;
    --  Like Getc, but includes a call to Ungetc, so that the file
    --  pointer is not moved by the call.
index a60336b3d5d78c1ce27914fad2d9bfa460422f55..05a6d9d1ebc04a10bc12819f977fedc3eb475abe 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
-with Ada.Wide_Text_IO.Float_Aux;
 
 with System.Img_Real; use System.Img_Real;
 
 package body Ada.Wide_Text_IO.Complex_Aux is
 
-   package Aux renames Ada.Wide_Text_IO.Float_Aux;
-
    ---------
    -- Get --
    ---------
 
    procedure Get
      (File  : File_Type;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Width : Field)
    is
       Buf   : String (1 .. Field'Last);
@@ -95,8 +92,8 @@ package body Ada.Wide_Text_IO.Complex_Aux is
 
    procedure Gets
      (From  : String;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Last  : out Positive)
    is
       Paren : Boolean;
@@ -139,8 +136,8 @@ package body Ada.Wide_Text_IO.Complex_Aux is
 
    procedure Put
      (File  : File_Type;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Fore  : Field;
       Aft   : Field;
       Exp   : Field)
@@ -159,8 +156,8 @@ package body Ada.Wide_Text_IO.Complex_Aux is
 
    procedure Puts
      (To    : out String;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Aft   :  Field;
       Exp   :  Field)
    is
@@ -174,9 +171,9 @@ package body Ada.Wide_Text_IO.Complex_Aux is
       --  Both parts are initially converted with a Fore of 0
 
       Rptr := 0;
-      Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (ItemR), R_String, Rptr, 0, Aft, Exp);
       Iptr := 0;
-      Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (ItemI), I_String, Iptr, 0, Aft, Exp);
 
       --  Check room for both parts plus parens plus comma (RM G.1.3(34))
 
index 781dd8dc945263d75bb7577ee665fe0f33961b0f..affb969548a58a8316f349c99b6a24684e87bf73 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
---  This package contains the routines for Ada.Wide_Text_IO.Complex_IO that
---  are shared among separate instantiations of this package. The routines
---  in this package are identical semantically to those in Complex_IO itself,
---  except that the generic parameter Complex has been replaced by separate
---  real and imaginary values of type Long_Long_Float, and default parameters
---  have been removed because they are supplied explicitly by the calls from
---  within the generic template.
+--  This package contains the routines for Ada.Wide_Text_IO.Complex_IO that are
+--  shared among separate instantiations of this package. The routines in this
+--  package are identical semantically to those in Complex_IO, except that the
+--  generic parameter Complex has been replaced by separate real and imaginary
+--  parameters, and default parameters have been removed because they are
+--  supplied explicitly by the calls from within the generic template.
+
+with Ada.Wide_Text_IO.Float_Aux;
+
+private generic
+
+   type Num is digits <>;
+
+   with package Aux is new Ada.Wide_Text_IO.Float_Aux (Num, <>);
 
 package Ada.Wide_Text_IO.Complex_Aux is
 
    procedure Get
      (File  : File_Type;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Width : Field);
 
-   procedure Gets
-     (From  : String;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
-      Last  : out Positive);
-
    procedure Put
      (File  : File_Type;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Fore  : Field;
       Aft   : Field;
       Exp   : Field);
 
+   procedure Gets
+     (From  : String;
+      ItemR : out Num;
+      ItemI : out Num;
+      Last  : out Positive);
+
    procedure Puts
      (To    : out String;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Aft   : Field;
       Exp   : Field);
 
index 1dc4a2e2f2c397c82b84ae26761e987dbbe0de5b..8e9ff7af385624f5605678ac080b86c456889d93 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Text_IO.Complex_Aux;
+with Ada.Wide_Text_IO.Float_Aux;
+with System.Val_Flt;  use System.Val_Flt;
+with System.Val_LFlt; use System.Val_LFlt;
+with System.Val_LLF;  use System.Val_LLF;
+with System.WCh_Con;  use System.WCh_Con;
+with System.WCh_WtS;  use System.WCh_WtS;
 
-with System.WCh_Con; use System.WCh_Con;
-with System.WCh_WtS; use System.WCh_WtS;
+package body Ada.Wide_Text_IO.Complex_IO is
 
-with Ada.Unchecked_Conversion;
+   use Complex_Types;
 
-package body Ada.Wide_Text_IO.Complex_IO is
+   package Scalar_Float is new
+      Ada.Wide_Text_IO.Float_Aux (Float, Scan_Float);
+
+   package Scalar_Long_Float is new
+      Ada.Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
+
+   package Scalar_Long_Long_Float is new
+      Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
+   package Aux_Float is new
+      Ada.Wide_Text_IO.Complex_Aux (Float, Scalar_Float);
 
-   package Aux renames Ada.Wide_Text_IO.Complex_Aux;
+   package Aux_Long_Float is new
+      Ada.Wide_Text_IO.Complex_Aux (Long_Float, Scalar_Long_Float);
 
-   subtype LLF is Long_Long_Float;
-   --  Type used for calls to routines in Aux
+   package Aux_Long_Long_Float is new
+      Ada.Wide_Text_IO.Complex_Aux (Long_Long_Float, Scalar_Long_Long_Float);
 
-   function TFT is new
-     Ada.Unchecked_Conversion (File_Type, Ada.Wide_Text_IO.File_Type);
-   --  This unchecked conversion is to get around a visibility bug in
-   --  GNAT version 2.04w. It should be possible to simply use the
-   --  subtype declared above and do normal checked conversions.
+   --  Throughout this generic body, we distinguish between the case where type
+   --  Float is OK, where type Long_Float is OK and where type Long_Long_Float
+   --  is needed. These boolean constants are used to test for this, such that
+   --  only code for the relevant case is included in the instance.
+
+   OK_Float : constant Boolean := Real'Base'Digits <= Float'Digits;
+
+   OK_Long_Float : constant Boolean := Real'Base'Digits <= Long_Float'Digits;
 
    ---------
    -- Get --
@@ -62,7 +81,17 @@ package body Ada.Wide_Text_IO.Complex_IO is
       Imag_Item : Real'Base;
 
    begin
-      Aux.Get (TFT (File), LLF (Real_Item), LLF (Imag_Item), Width);
+      if OK_Float then
+         Aux_Float.Get (File, Float (Real_Item), Float (Imag_Item), Width);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Get
+           (File, Long_Float (Real_Item), Long_Float (Imag_Item), Width);
+      else
+         Aux_Long_Long_Float.Get
+           (File, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
+            Width);
+      end if;
+
       Item := (Real_Item, Imag_Item);
 
    exception
@@ -100,7 +129,17 @@ package body Ada.Wide_Text_IO.Complex_IO is
       --  Aux.Gets will raise Data_Error in any case.
 
    begin
-      Aux.Gets (S, LLF (Real_Item), LLF (Imag_Item), Last);
+      if OK_Float then
+         Aux_Float.Gets (S, Float (Real_Item), Float (Imag_Item), Last);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Gets
+           (S, Long_Float (Real_Item), Long_Float (Imag_Item), Last);
+      else
+         Aux_Long_Long_Float.Gets
+           (S, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
+            Last);
+      end if;
+
       Item := (Real_Item, Imag_Item);
 
    exception
@@ -119,7 +158,18 @@ package body Ada.Wide_Text_IO.Complex_IO is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (TFT (File), LLF (Re (Item)), LLF (Im (Item)), Fore, Aft, Exp);
+      if OK_Float then
+         Aux_Float.Put
+           (File, Float (Re (Item)), Float (Im (Item)), Fore, Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Put
+           (File, Long_Float (Re (Item)), Long_Float (Im (Item)), Fore, Aft,
+            Exp);
+      else
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
+            Fore, Aft, Exp);
+      end if;
    end Put;
 
    ---------
@@ -149,7 +199,16 @@ package body Ada.Wide_Text_IO.Complex_IO is
       S : String (To'First .. To'Last);
 
    begin
-      Aux.Puts (S, LLF (Re (Item)), LLF (Im (Item)), Aft, Exp);
+      if OK_Float then
+         Aux_Float.Puts (S, Float (Re (Item)), Float (Im (Item)), Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Puts
+           (S, Long_Float (Re (Item)), Long_Float (Im (Item)), Aft, Exp);
+      else
+         Aux_Long_Long_Float.Puts
+           (S, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
+            Aft, Exp);
+      end if;
 
       for J in S'Range loop
          To (J) := Wide_Character'Val (Character'Pos (S (J)));
index 31fab2b6f229c7f6a6d59c38e6956d3deda0297d..f80a5b9719a0640d870471a83dc29e08e5dc3c58 100644 (file)
@@ -20,42 +20,40 @@ generic
 
 package Ada.Wide_Text_IO.Complex_IO is
 
-   use Complex_Types;
-
    Default_Fore : Field := 2;
-   Default_Aft  : Field := Real'Digits - 1;
+   Default_Aft  : Field := Complex_Types.Real'Digits - 1;
    Default_Exp  : Field := 3;
 
    procedure Get
      (File  : File_Type;
-      Item  : out Complex;
+      Item  : out Complex_Types.Complex;
       Width : Field := 0);
 
    procedure Get
-     (Item  : out Complex;
+     (Item  : out Complex_Types.Complex;
       Width : Field := 0);
 
    procedure Put
      (File : File_Type;
-      Item : Complex;
+      Item : Complex_Types.Complex;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp);
 
    procedure Put
-     (Item : Complex;
+     (Item : Complex_Types.Complex;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp);
 
    procedure Get
      (From : Wide_String;
-      Item : out Complex;
+      Item : out Complex_Types.Complex;
       Last : out Positive);
 
    procedure Put
      (To   : out Wide_String;
-      Item : Complex;
+      Item : Complex_Types.Complex;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp);
 
index 268ba4da606e9220118d2588136b90fc78c29c60..57fcc92a20ff6f26b3b342c4689e7f5ec78c429c 100644 (file)
@@ -30,7 +30,6 @@
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
-with Ada.Wide_Text_IO.Float_Aux;   use Ada.Wide_Text_IO.Float_Aux;
 
 package body Ada.Wide_Text_IO.Decimal_Aux is
 
index d4a153413af5288f3f3ec319cdad6faaf5f3cccd..611b76ddf5b8a14c0eca32d4896b889664411887 100644 (file)
@@ -30,7 +30,6 @@
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
-with Ada.Wide_Text_IO.Float_Aux;   use Ada.Wide_Text_IO.Float_Aux;
 
 package body Ada.Wide_Text_IO.Fixed_Aux is
 
index 570c5da72d839b37513148add086e9cd944aeeb4..e2537ae0ce30843718e90be38e6f2335979b34df 100644 (file)
@@ -36,6 +36,7 @@ with System.Img_Fixed_32; use System.Img_Fixed_32;
 with System.Img_Fixed_64; use System.Img_Fixed_64;
 with System.Val_Fixed_32; use System.Val_Fixed_32;
 with System.Val_Fixed_64; use System.Val_Fixed_64;
+with System.Val_LLF;       use System.Val_LLF;
 with System.WCh_Con;      use System.WCh_Con;
 with System.WCh_WtS;      use System.WCh_WtS;
 
@@ -55,6 +56,9 @@ package body Ada.Wide_Text_IO.Fixed_IO is
    package Aux64 is new
      Ada.Wide_Text_IO.Fixed_Aux (Int64, Scan_Fixed64, Set_Image_Fixed64);
 
+   package Aux_Long_Long_Float is new
+     Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
    --  Throughout this generic body, we distinguish between the case where type
    --  Int32 is OK and where type Int64 is OK. These boolean constants are used
    --  to test for this, such that only code for the relevant case is included
@@ -157,7 +161,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                                -Num'Small_Numerator,
                                -Num'Small_Denominator));
       else
-         Float_Aux.Get (File, Long_Long_Float (Item), Width);
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
       end if;
 
    exception
@@ -197,7 +201,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                                 -Num'Small_Numerator,
                                 -Num'Small_Denominator));
       else
-         Float_Aux.Gets (S, Long_Long_Float (Item), Last);
+         Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
       end if;
 
    exception
@@ -225,7 +229,8 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                     -Num'Small_Numerator, -Num'Small_Denominator,
                     For0, Num'Aft);
       else
-         Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
       end if;
    end Put;
 
@@ -257,7 +262,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                      -Num'Small_Numerator, -Num'Small_Denominator,
                      For0, Num'Aft);
       else
-         Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
+         Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
       end if;
 
       for J in S'Range loop
index aa45e5d375de1f170d8541bbe1e7ad852367cef1..a5801be16ee363f50074012625181f46960edcc2 100644 (file)
@@ -38,6 +38,7 @@ with System.Img_Fixed_128; use System.Img_Fixed_128;
 with System.Val_Fixed_32;  use System.Val_Fixed_32;
 with System.Val_Fixed_64;  use System.Val_Fixed_64;
 with System.Val_Fixed_128; use System.Val_Fixed_128;
+with System.Val_LLF;       use System.Val_LLF;
 with System.WCh_Con;       use System.WCh_Con;
 with System.WCh_WtS;       use System.WCh_WtS;
 
@@ -61,6 +62,9 @@ package body Ada.Wide_Text_IO.Fixed_IO is
    package Aux128 is new
      Ada.Wide_Text_IO.Fixed_Aux (Int128, Scan_Fixed128, Set_Image_Fixed128);
 
+   package Aux_Long_Long_Float is new
+     Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
    --  Throughout this generic body, we distinguish between the case where type
    --  Int32 is OK, where type Int64 is OK and where type Int128 is OK. These
    --  boolean constants are used to test for this, such that only code for the
@@ -197,7 +201,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                                 -Num'Small_Numerator,
                                 -Num'Small_Denominator));
       else
-         Float_Aux.Get (File, Long_Long_Float (Item), Width);
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
       end if;
 
    exception
@@ -242,7 +246,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                                  -Num'Small_Numerator,
                                  -Num'Small_Denominator));
       else
-         Float_Aux.Gets (S, Long_Long_Float (Item), Last);
+         Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
       end if;
 
    exception
@@ -274,7 +278,8 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                      -Num'Small_Numerator, -Num'Small_Denominator,
                      For0, Num'Aft);
       else
-         Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
       end if;
    end Put;
 
@@ -310,7 +315,7 @@ package body Ada.Wide_Text_IO.Fixed_IO is
                       -Num'Small_Numerator, -Num'Small_Denominator,
                       For0, Num'Aft);
       else
-         Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
+         Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
       end if;
 
       for J in S'Range loop
index fd9ff1a6aa1693914d3295a732fd4998d4cbcb93..7db1b7867b6f759d2c1bc0c526c418f8988216cb 100644 (file)
@@ -31,8 +31,7 @@
 
 with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
 
-with System.Img_Real;  use System.Img_Real;
-with System.Val_Real;  use System.Val_Real;
+with System.Img_Real; use System.Img_Real;
 
 package body Ada.Wide_Text_IO.Float_Aux is
 
@@ -42,12 +41,12 @@ package body Ada.Wide_Text_IO.Float_Aux is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Long_Long_Float;
+      Item  : out Num;
       Width : Field)
    is
       Buf  : String (1 .. Field'Last);
       Stop : Integer := 0;
-      Ptr  : aliased Integer := 1;
+      Ptr  : aliased Integer;
 
    begin
       if Width /= 0 then
@@ -55,10 +54,10 @@ package body Ada.Wide_Text_IO.Float_Aux is
          String_Skip (Buf, Ptr);
       else
          Load_Real (File, Buf, Stop);
+         Ptr := 1;
       end if;
 
-      Item := Scan_Real (Buf, Ptr'Access, Stop);
-
+      Item := Scan (Buf, Ptr'Access, Stop);
       Check_End_Of_Field (Buf, Stop, Ptr, Width);
    end Get;
 
@@ -68,137 +67,36 @@ package body Ada.Wide_Text_IO.Float_Aux is
 
    procedure Gets
      (From : String;
-      Item : out Long_Long_Float;
+      Item : out Num;
       Last : out Positive)
    is
       Pos : aliased Integer;
 
    begin
       String_Skip (From, Pos);
-      Item := Scan_Real (From, Pos'Access, From'Last);
+      Item := Scan (From, Pos'Access, From'Last);
       Last := Pos - 1;
 
    exception
-      when Constraint_Error =>
-         raise Data_Error;
+      when Constraint_Error => raise Data_Error;
    end Gets;
 
-   ---------------
-   -- Load_Real --
-   ---------------
-
-   procedure Load_Real
-     (File : File_Type;
-      Buf  : out String;
-      Ptr  : in out Natural)
-   is
-      Loaded   : Boolean;
-
-   begin
-      --  Skip initial blanks and load possible sign
-
-      Load_Skip (File);
-      Load (File, Buf, Ptr, '+', '-');
-
-      --  Case of .nnnn
-
-      Load (File, Buf, Ptr, '.', Loaded);
-
-      if Loaded then
-         Load_Digits (File, Buf, Ptr, Loaded);
-
-         --  Hopeless junk if no digits loaded
-
-         if not Loaded then
-            return;
-         end if;
-
-      --  Otherwise must have digits to start
-
-      else
-         Load_Digits (File, Buf, Ptr, Loaded);
-
-         --  Hopeless junk if no digits loaded
-
-         if not Loaded then
-            return;
-         end if;
-
-         --  Deal with based case. We recognize either the standard '#' or the
-         --  allowed alternative replacement ':' (see RM J.2(3)).
-
-         Load (File, Buf, Ptr, '#', ':', Loaded);
-
-         if Loaded then
-
-            --  Case of nnn#.xxx#
-
-            Load (File, Buf, Ptr, '.', Loaded);
-
-            if Loaded then
-               Load_Extended_Digits (File, Buf, Ptr);
-               Load (File, Buf, Ptr, '#', ':');
-
-            --  Case of nnn#xxx.[xxx]# or nnn#xxx#
-
-            else
-               Load_Extended_Digits (File, Buf, Ptr);
-               Load (File, Buf, Ptr, '.', Loaded);
-
-               if Loaded then
-                  Load_Extended_Digits (File, Buf, Ptr);
-               end if;
-
-               --  As usual, it seems strange to allow mixed base characters,
-               --  but that is what ACVC tests expect, see CE3804M, case (3).
-
-               Load (File, Buf, Ptr, '#', ':');
-            end if;
-
-         --  Case of nnn.[nnn] or nnn
-
-         else
-            --  Prevent the potential processing of '.' in cases where the
-            --  initial digits have a trailing underscore.
-
-            if Buf (Ptr) = '_' then
-               return;
-            end if;
-
-            Load (File, Buf, Ptr, '.', Loaded);
-
-            if Loaded then
-               Load_Digits (File, Buf, Ptr);
-            end if;
-         end if;
-      end if;
-
-      --  Deal with exponent
-
-      Load (File, Buf, Ptr, 'E', 'e', Loaded);
-
-      if Loaded then
-         Load (File, Buf, Ptr, '+', '-');
-         Load_Digits (File, Buf, Ptr);
-      end if;
-   end Load_Real;
-
    ---------
    -- Put --
    ---------
 
    procedure Put
      (File : File_Type;
-      Item : Long_Long_Float;
+      Item : Num;
       Fore : Field;
       Aft  : Field;
       Exp  : Field)
    is
-      Buf : String (1 .. Field'Last);
+      Buf : String (1 .. Max_Real_Image_Length);
       Ptr : Natural := 0;
 
    begin
-      Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (Item), Buf, Ptr, Fore, Aft, Exp);
       Put_Item (File, Buf (1 .. Ptr));
    end Put;
 
@@ -208,15 +106,16 @@ package body Ada.Wide_Text_IO.Float_Aux is
 
    procedure Puts
      (To   : out String;
-      Item : Long_Long_Float;
+      Item : Num;
       Aft  : Field;
       Exp  : Field)
    is
-      Buf : String (1 .. Field'Last);
+      Buf : String (1 .. Max_Real_Image_Length);
       Ptr : Natural := 0;
 
    begin
-      Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
+      Set_Image_Real
+        (Long_Long_Float (Item), Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
 
       if Ptr > To'Length then
          raise Layout_Error;
index 3598f77d73ea64ebb0259d7b7797b9a187891ab8..82ace794bc4aa6c3726d61bbb605b3277ed45a3e 100644 (file)
 
 --  This package contains the routines for Ada.Wide_Text_IO.Float_IO that
 --  are shared among separate instantiations of this package. The routines
---  in this package are identical semantically to those in Float_IO itself,
---  except that generic parameter Num has been replaced by Long_Long_Float,
---  and the default parameters have been removed because they are supplied
+--  in this package are identical semantically to those in Float_IO, except
+--  that the default parameters have been removed because they are supplied
 --  explicitly by the calls from within the generic template. This package
---  is also used by Ada.Wide_Text_IO.Fixed_IO, Ada.Wide_Text_IO.Decimal_IO.
+--  is also used by Ada.Wide_Text_IO.Fixed_IO and Ada.Wide_Text_IO.Decimal_IO.
 
-private package Ada.Wide_Text_IO.Float_Aux is
+private generic
 
-   procedure Load_Real
-     (File : File_Type;
-      Buf  : out String;
-      Ptr  : in out Natural);
-   --  This is an auxiliary routine that is used to load a possibly signed
-   --  real literal value from the input file into Buf, starting at Ptr + 1.
+   type Num is digits <>;
+
+   with function Scan
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Num;
+
+package Ada.Wide_Text_IO.Float_Aux is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Long_Long_Float;
+      Item  : out Num;
       Width : Field);
 
-   procedure Gets
-     (From : String;
-      Item : out Long_Long_Float;
-      Last : out Positive);
-
    procedure Put
      (File : File_Type;
-      Item : Long_Long_Float;
+      Item : Num;
       Fore : Field;
       Aft  : Field;
       Exp  : Field);
 
+   procedure Gets
+     (From : String;
+      Item : out Num;
+      Last : out Positive);
+
    procedure Puts
      (To   : out String;
-      Item : Long_Long_Float;
+      Item : Num;
       Aft  : Field;
       Exp  : Field);
 
index 07d33b1d83052737a6b14088beb21ce42bf7510f..369178633f12cb1c73cdb4d732601a49d2286e8d 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Text_IO.Float_Aux;
-
-with System.WCh_Con; use System.WCh_Con;
-with System.WCh_WtS; use System.WCh_WtS;
+with System.Val_Flt;  use System.Val_Flt;
+with System.Val_LFlt; use System.Val_LFlt;
+with System.Val_LLF;  use System.Val_LLF;
+with System.WCh_Con;  use System.WCh_Con;
+with System.WCh_WtS;  use System.WCh_WtS;
 
 package body Ada.Wide_Text_IO.Float_IO is
 
-   package Aux renames Ada.Wide_Text_IO.Float_Aux;
+   package Aux_Float is new
+      Ada.Wide_Text_IO.Float_Aux (Float, Scan_Float);
+
+   package Aux_Long_Float is new
+      Ada.Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
+
+   package Aux_Long_Long_Float is new
+      Ada.Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
+   --  Throughout this generic body, we distinguish between the case where type
+   --  Float is OK, where type Long_Float is OK and where type Long_Long_Float
+   --  is needed. These boolean constants are used to test for this, such that
+   --  only code for the relevant case is included in the instance.
+
+   OK_Float : constant Boolean := Num'Base'Digits <= Float'Digits;
+
+   OK_Long_Float : constant Boolean := Num'Base'Digits <= Long_Float'Digits;
 
    ---------
    -- Get --
@@ -47,8 +65,25 @@ package body Ada.Wide_Text_IO.Float_IO is
       Item  : out Num;
       Width : Field := 0)
    is
+      pragma Unsuppress (Range_Check);
+
    begin
-      Aux.Get (File, Long_Long_Float (Item), Width);
+      if OK_Float then
+         Aux_Float.Get (File, Float (Item), Width);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Get (File, Long_Float (Item), Width);
+      else
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
+      end if;
+
+      --  In the case where the type is unconstrained (e.g. Standard'Float),
+      --  the above conversion may result in an infinite value, which is
+      --  normally fine for a conversion, but in this case, we want to treat
+      --  that as a data error.
+
+      if not Item'Valid then
+         raise Data_Error;
+      end if;
 
    exception
       when Constraint_Error => raise Data_Error;
@@ -67,6 +102,8 @@ package body Ada.Wide_Text_IO.Float_IO is
       Item : out Num;
       Last : out Positive)
    is
+      pragma Unsuppress (Range_Check);
+
       S : constant String := Wide_String_To_String (From, WCEM_Upper);
       --  String on which we do the actual conversion. Note that the method
       --  used for wide character encoding is irrelevant, since if there is
@@ -74,7 +111,22 @@ package body Ada.Wide_Text_IO.Float_IO is
       --  Aux.Gets will raise Data_Error in any case.
 
    begin
-      Aux.Gets (S, Long_Long_Float (Item), Last);
+      if OK_Float then
+         Aux_Float.Gets (S, Float (Item), Last);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Gets (S, Long_Float (Item), Last);
+      else
+         Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
+      end if;
+
+      --  In the case where the type is unconstrained (e.g. Standard'Float),
+      --  the above conversion may result in an infinite value, which is
+      --  normally fine for a conversion, but in this case, we want to treat
+      --  that as a data error.
+
+      if not Item'Valid then
+         raise Data_Error;
+      end if;
 
    exception
       when Constraint_Error => raise Data_Error;
@@ -92,7 +144,14 @@ package body Ada.Wide_Text_IO.Float_IO is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+      if OK_Float then
+         Aux_Float.Put (File, Float (Item), Fore, Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Put (File, Long_Float (Item), Fore, Aft, Exp);
+      else
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
+      end if;
    end Put;
 
    procedure Put
@@ -114,7 +173,13 @@ package body Ada.Wide_Text_IO.Float_IO is
       S : String (To'First .. To'Last);
 
    begin
-      Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
+      if OK_Float then
+         Aux_Float.Puts (S, Float (Item), Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Puts (S, Long_Float (Item), Aft, Exp);
+      else
+         Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
+      end if;
 
       for J in S'Range loop
          To (J) := Wide_Character'Val (Character'Pos (S (J)));
index 9d24070e98df50edf163db0f8071350a8e71a90c..bc9b459a9f7b60d6a80f6c99b674b1c041a69d0a 100644 (file)
@@ -402,6 +402,106 @@ package body Ada.Wide_Text_IO.Generic_Aux is
       end if;
    end Load_Integer;
 
+   ---------------
+   -- Load_Real --
+   ---------------
+
+   procedure Load_Real
+     (File : File_Type;
+      Buf  : out String;
+      Ptr  : in out Natural)
+   is
+      Loaded   : Boolean;
+
+   begin
+      --  Skip initial blanks and load possible sign
+
+      Load_Skip (File);
+      Load (File, Buf, Ptr, '+', '-');
+
+      --  Case of .nnnn
+
+      Load (File, Buf, Ptr, '.', Loaded);
+
+      if Loaded then
+         Load_Digits (File, Buf, Ptr, Loaded);
+
+         --  Hopeless junk if no digits loaded
+
+         if not Loaded then
+            return;
+         end if;
+
+      --  Otherwise must have digits to start
+
+      else
+         Load_Digits (File, Buf, Ptr, Loaded);
+
+         --  Hopeless junk if no digits loaded
+
+         if not Loaded then
+            return;
+         end if;
+
+         --  Deal with based case. We recognize either the standard '#' or the
+         --  allowed alternative replacement ':' (see RM J.2(3)).
+
+         Load (File, Buf, Ptr, '#', ':', Loaded);
+
+         if Loaded then
+
+            --  Case of nnn#.xxx#
+
+            Load (File, Buf, Ptr, '.', Loaded);
+
+            if Loaded then
+               Load_Extended_Digits (File, Buf, Ptr);
+               Load (File, Buf, Ptr, '#', ':');
+
+            --  Case of nnn#xxx.[xxx]# or nnn#xxx#
+
+            else
+               Load_Extended_Digits (File, Buf, Ptr);
+               Load (File, Buf, Ptr, '.', Loaded);
+
+               if Loaded then
+                  Load_Extended_Digits (File, Buf, Ptr);
+               end if;
+
+               --  As usual, it seems strange to allow mixed base characters,
+               --  but that is what ACVC tests expect, see CE3804M, case (3).
+
+               Load (File, Buf, Ptr, '#', ':');
+            end if;
+
+         --  Case of nnn.[nnn] or nnn
+
+         else
+            --  Prevent the potential processing of '.' in cases where the
+            --  initial digits have a trailing underscore.
+
+            if Buf (Ptr) = '_' then
+               return;
+            end if;
+
+            Load (File, Buf, Ptr, '.', Loaded);
+
+            if Loaded then
+               Load_Digits (File, Buf, Ptr);
+            end if;
+         end if;
+      end if;
+
+      --  Deal with exponent
+
+      Load (File, Buf, Ptr, 'E', 'e', Loaded);
+
+      if Loaded then
+         Load (File, Buf, Ptr, '+', '-');
+         Load_Digits (File, Buf, Ptr);
+      end if;
+   end Load_Real;
+
    ---------------
    -- Load_Skip --
    ---------------
index 9577ac2bd33c1a7cc5e9476080e4ae0cbcffc389..7c899717c2db402a5a0b341e62d22274f2b9218e 100644 (file)
@@ -155,6 +155,12 @@ package Ada.Wide_Text_IO.Generic_Aux is
       Ptr  : in out Natural);
    --  Loads a possibly signed integer literal value
 
+   procedure Load_Real
+     (File : File_Type;
+      Buf  : out String;
+      Ptr  : in out Natural);
+   --  Loads a possibly signed real literal value
+
    procedure Put_Item (File : File_Type; Str : String);
    --  This routine is like Wide_Text_IO.Put, except that it checks for
    --  overflow of bounded lines, as described in (RM A.10.6(8)). It is used
index ffe0a9012e92cd0fbd7e524eef26abc9ad58ac05..bb3368095427724dc2094e7f372cbf56b62b0173 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
-with Ada.Wide_Wide_Text_IO.Float_Aux;
 
 with System.Img_Real; use System.Img_Real;
 
 package body Ada.Wide_Wide_Text_IO.Complex_Aux is
 
-   package Aux renames Ada.Wide_Wide_Text_IO.Float_Aux;
-
    ---------
    -- Get --
    ---------
 
    procedure Get
      (File  : File_Type;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Width : Field)
    is
       Buf   : String (1 .. Field'Last);
@@ -95,8 +92,8 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
 
    procedure Gets
      (From  : String;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Last  : out Positive)
    is
       Paren : Boolean;
@@ -139,8 +136,8 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
 
    procedure Put
      (File  : File_Type;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Fore  : Field;
       Aft   : Field;
       Exp   : Field)
@@ -159,8 +156,8 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
 
    procedure Puts
      (To    : out String;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Aft   :  Field;
       Exp   :  Field)
    is
@@ -174,9 +171,9 @@ package body Ada.Wide_Wide_Text_IO.Complex_Aux is
       --  Both parts are initially converted with a Fore of 0
 
       Rptr := 0;
-      Set_Image_Real (ItemR, R_String, Rptr, 0, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (ItemR), R_String, Rptr, 0, Aft, Exp);
       Iptr := 0;
-      Set_Image_Real (ItemI, I_String, Iptr, 0, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (ItemI), I_String, Iptr, 0, Aft, Exp);
 
       --  Check room for both parts plus parens plus comma (RM G.1.3(34))
 
index b68c38b18ccd6285fcd9c90eb951b09182f18a1d..43546d804dfcfcaff96cc2648bf392798daf97e3 100644 (file)
 
 --  This package contains the routines for Ada.Wide_Wide_Text_IO.Complex_IO
 --  that are shared among separate instantiations of this package. The routines
---  in this package are identical semantically to those in Complex_IO itself,
---  except that the generic parameter Complex has been replaced by separate
---  real and imaginary values of type Long_Long_Float, and default parameters
---  have been removed because they are supplied explicitly by the calls from
---  within the generic template.
+--  in this package are identical semantically to those in Complex_IO, except
+--  that the generic parameter Complex has been replaced by separate real and
+--  imaginary parameters, and default parameters have been removed because they
+--  are supplied explicitly by the calls from within the generic template.
+
+with Ada.Wide_Wide_Text_IO.Float_Aux;
+
+private generic
+
+   type Num is digits <>;
+
+   with package Aux is new Ada.Wide_Wide_Text_IO.Float_Aux (Num, <>);
 
 package Ada.Wide_Wide_Text_IO.Complex_Aux is
 
    procedure Get
      (File  : File_Type;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
+      ItemR : out Num;
+      ItemI : out Num;
       Width : Field);
 
-   procedure Gets
-     (From  : String;
-      ItemR : out Long_Long_Float;
-      ItemI : out Long_Long_Float;
-      Last  : out Positive);
-
    procedure Put
      (File  : File_Type;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Fore  : Field;
       Aft   : Field;
       Exp   : Field);
 
+   procedure Gets
+     (From  : String;
+      ItemR : out Num;
+      ItemI : out Num;
+      Last  : out Positive);
+
    procedure Puts
      (To    : out String;
-      ItemR : Long_Long_Float;
-      ItemI : Long_Long_Float;
+      ItemR : Num;
+      ItemI : Num;
       Aft   : Field;
       Exp   : Field);
 
index 711c7bbc733da4541f6e616ae65ab2919bd216ee..51031912604c04e6535acb606e20f99215bb1d5e 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Wide_Text_IO.Complex_Aux;
-
-with System.WCh_Con; use System.WCh_Con;
-with System.WCh_WtS; use System.WCh_WtS;
+with Ada.Wide_Wide_Text_IO.Float_Aux;
+with System.Val_Flt;  use System.Val_Flt;
+with System.Val_LFlt; use System.Val_LFlt;
+with System.Val_LLF;  use System.Val_LLF;
+with System.WCh_Con;  use System.WCh_Con;
+with System.WCh_WtS;  use System.WCh_WtS;
 
 with Ada.Unchecked_Conversion;
 
 package body Ada.Wide_Wide_Text_IO.Complex_IO is
 
-   package Aux renames Ada.Wide_Wide_Text_IO.Complex_Aux;
+   use Complex_Types;
+
+   package Scalar_Float is new
+      Ada.Wide_Wide_Text_IO.Float_Aux (Float, Scan_Float);
+
+   package Scalar_Long_Float is new
+      Ada.Wide_Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
+
+   package Scalar_Long_Long_Float is new
+      Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
+   package Aux_Float is new
+      Ada.Wide_Wide_Text_IO.Complex_Aux (Float, Scalar_Float);
 
-   subtype LLF is Long_Long_Float;
-   --  Type used for calls to routines in Aux
+   package Aux_Long_Float is new
+      Ada.Wide_Wide_Text_IO.Complex_Aux (Long_Float, Scalar_Long_Float);
 
-   function TFT is new
-     Ada.Unchecked_Conversion (File_Type, Ada.Wide_Wide_Text_IO.File_Type);
-   --  This unchecked conversion is to get around a visibility bug in
-   --  GNAT version 2.04w. It should be possible to simply use the
-   --  subtype declared above and do normal checked conversions.
+   package Aux_Long_Long_Float is new
+      Ada.Wide_Wide_Text_IO.Complex_Aux
+        (Long_Long_Float, Scalar_Long_Long_Float);
+
+   --  Throughout this generic body, we distinguish between the case where type
+   --  Float is OK, where type Long_Float is OK and where type Long_Long_Float
+   --  is needed. These boolean constants are used to test for this, such that
+   --  only code for the relevant case is included in the instance.
+
+   OK_Float : constant Boolean := Real'Base'Digits <= Float'Digits;
+
+   OK_Long_Float : constant Boolean := Real'Base'Digits <= Long_Float'Digits;
 
    ---------
    -- Get --
@@ -62,7 +84,17 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
       Imag_Item : Real'Base;
 
    begin
-      Aux.Get (TFT (File), LLF (Real_Item), LLF (Imag_Item), Width);
+      if OK_Float then
+         Aux_Float.Get (File, Float (Real_Item), Float (Imag_Item), Width);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Get
+           (File, Long_Float (Real_Item), Long_Float (Imag_Item), Width);
+      else
+         Aux_Long_Long_Float.Get
+           (File, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
+            Width);
+      end if;
+
       Item := (Real_Item, Imag_Item);
 
    exception
@@ -100,7 +132,17 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
       --  Aux.Gets will raise Data_Error in any case.
 
    begin
-      Aux.Gets (S, LLF (Real_Item), LLF (Imag_Item), Last);
+      if OK_Float then
+         Aux_Float.Gets (S, Float (Real_Item), Float (Imag_Item), Last);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Gets
+           (S, Long_Float (Real_Item), Long_Float (Imag_Item), Last);
+      else
+         Aux_Long_Long_Float.Gets
+           (S, Long_Long_Float (Real_Item), Long_Long_Float (Imag_Item),
+            Last);
+      end if;
+
       Item := (Real_Item, Imag_Item);
 
    exception
@@ -119,7 +161,18 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (TFT (File), LLF (Re (Item)), LLF (Im (Item)), Fore, Aft, Exp);
+      if OK_Float then
+         Aux_Float.Put
+           (File, Float (Re (Item)), Float (Im (Item)), Fore, Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Put
+           (File, Long_Float (Re (Item)), Long_Float (Im (Item)), Fore, Aft,
+            Exp);
+      else
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
+            Fore, Aft, Exp);
+      end if;
    end Put;
 
    ---------
@@ -149,7 +202,16 @@ package body Ada.Wide_Wide_Text_IO.Complex_IO is
       S : String (To'First .. To'Last);
 
    begin
-      Aux.Puts (S, LLF (Re (Item)), LLF (Im (Item)), Aft, Exp);
+      if OK_Float then
+         Aux_Float.Puts (S, Float (Re (Item)), Float (Im (Item)), Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Puts
+           (S, Long_Float (Re (Item)), Long_Float (Im (Item)), Aft, Exp);
+      else
+         Aux_Long_Long_Float.Puts
+           (S, Long_Long_Float (Re (Item)), Long_Long_Float (Im (Item)),
+            Aft, Exp);
+      end if;
 
       for J in S'Range loop
          To (J) := Wide_Wide_Character'Val (Character'Pos (S (J)));
index 866fd879c642f4dc10114f2a813a2a6bd4b490c7..2a08153a36d28420fdabd5bf71f0711ca2a57732 100644 (file)
@@ -23,39 +23,39 @@ package Ada.Wide_Wide_Text_IO.Complex_IO is
    use Complex_Types;
 
    Default_Fore : Field := 2;
-   Default_Aft  : Field := Real'Digits - 1;
+   Default_Aft  : Field := Complex_Types.Real'Digits - 1;
    Default_Exp  : Field := 3;
 
    procedure Get
      (File  : File_Type;
-      Item  : out Complex;
+      Item  : out Complex_Types.Complex;
       Width : Field := 0);
 
    procedure Get
-     (Item  : out Complex;
+     (Item  : out Complex_Types.Complex;
       Width : Field := 0);
 
    procedure Put
      (File : File_Type;
-      Item : Complex;
+      Item : Complex_Types.Complex;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp);
 
    procedure Put
-     (Item : Complex;
+     (Item : Complex_Types.Complex;
       Fore : Field := Default_Fore;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp);
 
    procedure Get
      (From : Wide_Wide_String;
-      Item : out Complex;
+      Item : out Complex_Types.Complex;
       Last : out Positive);
 
    procedure Put
      (To   : out Wide_Wide_String;
-      Item : Complex;
+      Item : Complex_Types.Complex;
       Aft  : Field := Default_Aft;
       Exp  : Field := Default_Exp);
 
index 6c2af9f2ce128d572f77ad8e9699239c53327024..ec6431bee9973740e92b9dcea9c79ccebcf9979d 100644 (file)
@@ -30,7 +30,6 @@
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
-with Ada.Wide_Wide_Text_IO.Float_Aux;   use Ada.Wide_Wide_Text_IO.Float_Aux;
 
 package body Ada.Wide_Wide_Text_IO.Decimal_Aux is
 
index f26a16a41ae1f781b16f29c3b9bc1790975b3684..1e94fef0231b6c3e0718fa4ab045434bb78d48ac 100644 (file)
@@ -30,7 +30,6 @@
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
-with Ada.Wide_Wide_Text_IO.Float_Aux;   use Ada.Wide_Wide_Text_IO.Float_Aux;
 
 package body Ada.Wide_Wide_Text_IO.Fixed_Aux is
 
index 3c3224d3c577b36aa6e0353d61444319fd49ef06..53ed45b8ee3a26ee4b145c54d80ecb82b0056e19 100644 (file)
@@ -36,6 +36,7 @@ with System.Img_Fixed_32; use System.Img_Fixed_32;
 with System.Img_Fixed_64; use System.Img_Fixed_64;
 with System.Val_Fixed_32; use System.Val_Fixed_32;
 with System.Val_Fixed_64; use System.Val_Fixed_64;
+with System.Val_LLF;      use System.Val_LLF;
 with System.WCh_Con;      use System.WCh_Con;
 with System.WCh_WtS;      use System.WCh_WtS;
 
@@ -55,6 +56,9 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
    package Aux64 is new
      Ada.Wide_Wide_Text_IO.Fixed_Aux (Int64, Scan_Fixed64, Set_Image_Fixed64);
 
+   package Aux_Long_Long_Float is new
+     Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
    --  Throughout this generic body, we distinguish between the case where type
    --  Int32 is OK and where type Int64 is OK. These boolean constants are used
    --  to test for this, such that only code for the relevant case is included
@@ -157,7 +161,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                                -Num'Small_Numerator,
                                -Num'Small_Denominator));
       else
-         Float_Aux.Get (File, Long_Long_Float (Item), Width);
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
       end if;
 
    exception
@@ -197,7 +201,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                                 -Num'Small_Numerator,
                                 -Num'Small_Denominator));
       else
-         Float_Aux.Gets (S, Long_Long_Float (Item), Last);
+         Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
       end if;
 
    exception
@@ -225,7 +229,8 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                     -Num'Small_Numerator, -Num'Small_Denominator,
                     For0, Num'Aft);
       else
-         Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
       end if;
    end Put;
 
@@ -257,7 +262,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                      -Num'Small_Numerator, -Num'Small_Denominator,
                      For0, Num'Aft);
       else
-         Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
+         Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
       end if;
 
       for J in S'Range loop
index 3254fb8c7de28592230fa1f131eda13d0702aead..13ed410354fd250bdcd5694eaaf9be0065fa5c67 100644 (file)
@@ -38,6 +38,7 @@ with System.Img_Fixed_128; use System.Img_Fixed_128;
 with System.Val_Fixed_32;  use System.Val_Fixed_32;
 with System.Val_Fixed_64;  use System.Val_Fixed_64;
 with System.Val_Fixed_128; use System.Val_Fixed_128;
+with System.Val_LLF;       use System.Val_LLF;
 with System.WCh_Con;       use System.WCh_Con;
 with System.WCh_WtS;       use System.WCh_WtS;
 
@@ -62,6 +63,9 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
      Ada.Wide_Wide_Text_IO.Fixed_Aux
       (Int128, Scan_Fixed128, Set_Image_Fixed128);
 
+   package Aux_Long_Long_Float is new
+     Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
    --  Throughout this generic body, we distinguish between the case where type
    --  Int32 is OK, where type Int64 is OK and where type Int128 is OK. These
    --  boolean constants are used to test for this, such that only code for the
@@ -198,7 +202,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                                 -Num'Small_Numerator,
                                 -Num'Small_Denominator));
       else
-         Float_Aux.Get (File, Long_Long_Float (Item), Width);
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
       end if;
 
    exception
@@ -243,7 +247,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                                  -Num'Small_Numerator,
                                  -Num'Small_Denominator));
       else
-         Float_Aux.Gets (S, Long_Long_Float (Item), Last);
+         Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
       end if;
 
    exception
@@ -275,7 +279,8 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                      -Num'Small_Numerator, -Num'Small_Denominator,
                      For0, Num'Aft);
       else
-         Float_Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
       end if;
    end Put;
 
@@ -311,7 +316,7 @@ package body Ada.Wide_Wide_Text_IO.Fixed_IO is
                       -Num'Small_Numerator, -Num'Small_Denominator,
                       For0, Num'Aft);
       else
-         Float_Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
+         Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
       end if;
 
       for J in S'Range loop
index c0c55ba8ba2150a63bb1ac256e522ab8955bc4bd..1bddcd86ddf6830f5132ccea5d8953941c2b3a51 100644 (file)
@@ -31,8 +31,7 @@
 
 with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
 
-with System.Img_Real;  use System.Img_Real;
-with System.Val_Real;  use System.Val_Real;
+with System.Img_Real; use System.Img_Real;
 
 package body Ada.Wide_Wide_Text_IO.Float_Aux is
 
@@ -42,12 +41,12 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Long_Long_Float;
+      Item  : out Num;
       Width : Field)
    is
       Buf  : String (1 .. Field'Last);
       Stop : Integer := 0;
-      Ptr  : aliased Integer := 1;
+      Ptr  : aliased Integer;
 
    begin
       if Width /= 0 then
@@ -55,10 +54,10 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
          String_Skip (Buf, Ptr);
       else
          Load_Real (File, Buf, Stop);
+         Ptr := 1;
       end if;
 
-      Item := Scan_Real (Buf, Ptr'Access, Stop);
-
+      Item := Scan (Buf, Ptr'Access, Stop);
       Check_End_Of_Field (Buf, Stop, Ptr, Width);
    end Get;
 
@@ -68,137 +67,36 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
 
    procedure Gets
      (From : String;
-      Item : out Long_Long_Float;
+      Item : out Num;
       Last : out Positive)
    is
       Pos : aliased Integer;
 
    begin
       String_Skip (From, Pos);
-      Item := Scan_Real (From, Pos'Access, From'Last);
+      Item := Scan (From, Pos'Access, From'Last);
       Last := Pos - 1;
 
    exception
-      when Constraint_Error =>
-         raise Data_Error;
+      when Constraint_Error => raise Data_Error;
    end Gets;
 
-   ---------------
-   -- Load_Real --
-   ---------------
-
-   procedure Load_Real
-     (File : File_Type;
-      Buf  : out String;
-      Ptr  : in out Natural)
-   is
-      Loaded   : Boolean;
-
-   begin
-      --  Skip initial blanks and load possible sign
-
-      Load_Skip (File);
-      Load (File, Buf, Ptr, '+', '-');
-
-      --  Case of .nnnn
-
-      Load (File, Buf, Ptr, '.', Loaded);
-
-      if Loaded then
-         Load_Digits (File, Buf, Ptr, Loaded);
-
-         --  Hopeless junk if no digits loaded
-
-         if not Loaded then
-            return;
-         end if;
-
-      --  Otherwise must have digits to start
-
-      else
-         Load_Digits (File, Buf, Ptr, Loaded);
-
-         --  Hopeless junk if no digits loaded
-
-         if not Loaded then
-            return;
-         end if;
-
-         --  Deal with based case. We recognize either the standard '#' or the
-         --  allowed alternative replacement ':' (see RM J.2(3)).
-
-         Load (File, Buf, Ptr, '#', ':', Loaded);
-
-         if Loaded then
-
-            --  Case of nnn#.xxx#
-
-            Load (File, Buf, Ptr, '.', Loaded);
-
-            if Loaded then
-               Load_Extended_Digits (File, Buf, Ptr);
-               Load (File, Buf, Ptr, '#', ':');
-
-            --  Case of nnn#xxx.[xxx]# or nnn#xxx#
-
-            else
-               Load_Extended_Digits (File, Buf, Ptr);
-               Load (File, Buf, Ptr, '.', Loaded);
-
-               if Loaded then
-                  Load_Extended_Digits (File, Buf, Ptr);
-               end if;
-
-               --  As usual, it seems strange to allow mixed base characters,
-               --  but that is what ACVC tests expect, see CE3804M, case (3).
-
-               Load (File, Buf, Ptr, '#', ':');
-            end if;
-
-         --  Case of nnn.[nnn] or nnn
-
-         else
-            --  Prevent the potential processing of '.' in cases where the
-            --  initial digits have a trailing underscore.
-
-            if Buf (Ptr) = '_' then
-               return;
-            end if;
-
-            Load (File, Buf, Ptr, '.', Loaded);
-
-            if Loaded then
-               Load_Digits (File, Buf, Ptr);
-            end if;
-         end if;
-      end if;
-
-      --  Deal with exponent
-
-      Load (File, Buf, Ptr, 'E', 'e', Loaded);
-
-      if Loaded then
-         Load (File, Buf, Ptr, '+', '-');
-         Load_Digits (File, Buf, Ptr);
-      end if;
-   end Load_Real;
-
    ---------
    -- Put --
    ---------
 
    procedure Put
      (File : File_Type;
-      Item : Long_Long_Float;
+      Item : Num;
       Fore : Field;
       Aft  : Field;
       Exp  : Field)
    is
-      Buf : String (1 .. Field'Last);
+      Buf : String (1 .. Max_Real_Image_Length);
       Ptr : Natural := 0;
 
    begin
-      Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
+      Set_Image_Real (Long_Long_Float (Item), Buf, Ptr, Fore, Aft, Exp);
       Put_Item (File, Buf (1 .. Ptr));
    end Put;
 
@@ -208,15 +106,16 @@ package body Ada.Wide_Wide_Text_IO.Float_Aux is
 
    procedure Puts
      (To   : out String;
-      Item : Long_Long_Float;
+      Item : Num;
       Aft  : Field;
       Exp  : Field)
    is
-      Buf    : String (1 .. Field'Last);
-      Ptr    : Natural := 0;
+      Buf : String (1 .. Max_Real_Image_Length);
+      Ptr : Natural := 0;
 
    begin
-      Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
+      Set_Image_Real
+        (Long_Long_Float (Item), Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
 
       if Ptr > To'Length then
          raise Layout_Error;
index dc24682bd32066b3321af6fd2501ce13e2d4886e..48fba8267acf81cc49a70a7041fa0d463a99de1b 100644 (file)
 
 --  This package contains the routines for Ada.Wide_Wide_Text_IO.Float_IO that
 --  are shared among separate instantiations of this package. The routines
---  in this package are identical semantically to those in Float_IO itself,
---  except that generic parameter Num has been replaced by Long_Long_Float,
---  and the default parameters have been removed because they are supplied
+--  in this package are identical semantically to those in Float_IO, except
+--  that the default parameters have been removed because they are supplied
 --  explicitly by the calls from within the generic template. Also used by
---  Ada.Wide_Wide_Text_IO.Fixed_IO, and by Ada.Wide_Wide_Text_IO.Decimal_IO.
+--  Ada.Wide_Wide_Text_IO.Fixed_IO and by Ada.Wide_Wide_Text_IO.Decimal_IO.
 
-private package Ada.Wide_Wide_Text_IO.Float_Aux is
+private generic
 
-   procedure Load_Real
-     (File : File_Type;
-      Buf  : out String;
-      Ptr  : in out Natural);
-   --  This is an auxiliary routine that is used to load a possibly signed
-   --  real literal value from the input file into Buf, starting at Ptr + 1.
+   type Num is digits <>;
+
+   with function Scan
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Num;
+
+package Ada.Wide_Wide_Text_IO.Float_Aux is
 
    procedure Get
      (File  : File_Type;
-      Item  : out Long_Long_Float;
+      Item  : out Num;
       Width : Field);
 
-   procedure Gets
-     (From : String;
-      Item : out Long_Long_Float;
-      Last : out Positive);
-
    procedure Put
      (File : File_Type;
-      Item : Long_Long_Float;
+      Item : Num;
       Fore : Field;
       Aft  : Field;
       Exp  : Field);
 
+   procedure Gets
+     (From : String;
+      Item : out Num;
+      Last : out Positive);
+
    procedure Puts
      (To   : out String;
-      Item : Long_Long_Float;
+      Item : Num;
       Aft  : Field;
       Exp  : Field);
 
index 0640dacdbbdc14d27735b16e20dfa99e259efbb2..e491e6298976c9818d41807a46ffa5471d37368d 100644 (file)
 ------------------------------------------------------------------------------
 
 with Ada.Wide_Wide_Text_IO.Float_Aux;
-with System.WCh_Con; use System.WCh_Con;
-with System.WCh_WtS; use System.WCh_WtS;
+with System.Val_Flt;  use System.Val_Flt;
+with System.Val_LFlt; use System.Val_LFlt;
+with System.Val_LLF;  use System.Val_LLF;
+with System.WCh_Con;  use System.WCh_Con;
+with System.WCh_WtS;  use System.WCh_WtS;
 
 package body Ada.Wide_Wide_Text_IO.Float_IO is
 
-   package Aux renames Ada.Wide_Wide_Text_IO.Float_Aux;
+   package Aux_Float is new
+      Ada.Wide_Wide_Text_IO.Float_Aux (Float, Scan_Float);
+
+   package Aux_Long_Float is new
+      Ada.Wide_Wide_Text_IO.Float_Aux (Long_Float, Scan_Long_Float);
+
+   package Aux_Long_Long_Float is new
+      Ada.Wide_Wide_Text_IO.Float_Aux (Long_Long_Float, Scan_Long_Long_Float);
+
+   --  Throughout this generic body, we distinguish between the case where type
+   --  Float is OK, where type Long_Float is OK and where type Long_Long_Float
+   --  is needed. These boolean constants are used to test for this, such that
+   --  only code for the relevant case is included in the instance.
+
+   OK_Float : constant Boolean := Num'Base'Digits <= Float'Digits;
+
+   OK_Long_Float : constant Boolean := Num'Base'Digits <= Long_Float'Digits;
 
    ---------
    -- Get --
@@ -46,8 +65,25 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
       Item  : out Num;
       Width : Field := 0)
    is
+      pragma Unsuppress (Range_Check);
+
    begin
-      Aux.Get (File, Long_Long_Float (Item), Width);
+      if OK_Float then
+         Aux_Float.Get (File, Float (Item), Width);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Get (File, Long_Float (Item), Width);
+      else
+         Aux_Long_Long_Float.Get (File, Long_Long_Float (Item), Width);
+      end if;
+
+      --  In the case where the type is unconstrained (e.g. Standard'Float),
+      --  the above conversion may result in an infinite value, which is
+      --  normally fine for a conversion, but in this case, we want to treat
+      --  that as a data error.
+
+      if not Item'Valid then
+         raise Data_Error;
+      end if;
 
    exception
       when Constraint_Error => raise Data_Error;
@@ -66,6 +102,8 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
       Item : out Num;
       Last : out Positive)
    is
+      pragma Unsuppress (Range_Check);
+
       S : constant String := Wide_Wide_String_To_String (From, WCEM_Upper);
       --  String on which we do the actual conversion. Note that the method
       --  used for wide character encoding is irrelevant, since if there is
@@ -73,7 +111,22 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
       --  Aux.Gets will raise Data_Error in any case.
 
    begin
-      Aux.Gets (S, Long_Long_Float (Item), Last);
+      if OK_Float then
+         Aux_Float.Gets (S, Float (Item), Last);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Gets (S, Long_Float (Item), Last);
+      else
+         Aux_Long_Long_Float.Gets (S, Long_Long_Float (Item), Last);
+      end if;
+
+      --  In the case where the type is unconstrained (e.g. Standard'Float),
+      --  the above conversion may result in an infinite value, which is
+      --  normally fine for a conversion, but in this case, we want to treat
+      --  that as a data error.
+
+      if not Item'Valid then
+         raise Data_Error;
+      end if;
 
    exception
       when Constraint_Error => raise Data_Error;
@@ -91,7 +144,14 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
       Exp  : Field := Default_Exp)
    is
    begin
-      Aux.Put (File, Long_Long_Float (Item), Fore, Aft, Exp);
+      if OK_Float then
+         Aux_Float.Put (File, Float (Item), Fore, Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Put (File, Long_Float (Item), Fore, Aft, Exp);
+      else
+         Aux_Long_Long_Float.Put
+           (File, Long_Long_Float (Item), Fore, Aft, Exp);
+      end if;
    end Put;
 
    procedure Put
@@ -113,7 +173,13 @@ package body Ada.Wide_Wide_Text_IO.Float_IO is
       S : String (To'First .. To'Last);
 
    begin
-      Aux.Puts (S, Long_Long_Float (Item), Aft, Exp);
+      if OK_Float then
+         Aux_Float.Puts (S, Float (Item), Aft, Exp);
+      elsif OK_Long_Float then
+         Aux_Long_Float.Puts (S, Long_Float (Item), Aft, Exp);
+      else
+         Aux_Long_Long_Float.Puts (S, Long_Long_Float (Item), Aft, Exp);
+      end if;
 
       for J in S'Range loop
          To (J) := Wide_Wide_Character'Val (Character'Pos (S (J)));
index be7aecc9ecf4d1448c3efd7f4180740bc001c709..6b5e4c5add8e2af1eeed750a789a4745a04f1dd9 100644 (file)
@@ -402,6 +402,106 @@ package body Ada.Wide_Wide_Text_IO.Generic_Aux is
       end if;
    end Load_Integer;
 
+   ---------------
+   -- Load_Real --
+   ---------------
+
+   procedure Load_Real
+     (File : File_Type;
+      Buf  : out String;
+      Ptr  : in out Natural)
+   is
+      Loaded   : Boolean;
+
+   begin
+      --  Skip initial blanks and load possible sign
+
+      Load_Skip (File);
+      Load (File, Buf, Ptr, '+', '-');
+
+      --  Case of .nnnn
+
+      Load (File, Buf, Ptr, '.', Loaded);
+
+      if Loaded then
+         Load_Digits (File, Buf, Ptr, Loaded);
+
+         --  Hopeless junk if no digits loaded
+
+         if not Loaded then
+            return;
+         end if;
+
+      --  Otherwise must have digits to start
+
+      else
+         Load_Digits (File, Buf, Ptr, Loaded);
+
+         --  Hopeless junk if no digits loaded
+
+         if not Loaded then
+            return;
+         end if;
+
+         --  Deal with based case. We recognize either the standard '#' or the
+         --  allowed alternative replacement ':' (see RM J.2(3)).
+
+         Load (File, Buf, Ptr, '#', ':', Loaded);
+
+         if Loaded then
+
+            --  Case of nnn#.xxx#
+
+            Load (File, Buf, Ptr, '.', Loaded);
+
+            if Loaded then
+               Load_Extended_Digits (File, Buf, Ptr);
+               Load (File, Buf, Ptr, '#', ':');
+
+            --  Case of nnn#xxx.[xxx]# or nnn#xxx#
+
+            else
+               Load_Extended_Digits (File, Buf, Ptr);
+               Load (File, Buf, Ptr, '.', Loaded);
+
+               if Loaded then
+                  Load_Extended_Digits (File, Buf, Ptr);
+               end if;
+
+               --  As usual, it seems strange to allow mixed base characters,
+               --  but that is what ACVC tests expect, see CE3804M, case (3).
+
+               Load (File, Buf, Ptr, '#', ':');
+            end if;
+
+         --  Case of nnn.[nnn] or nnn
+
+         else
+            --  Prevent the potential processing of '.' in cases where the
+            --  initial digits have a trailing underscore.
+
+            if Buf (Ptr) = '_' then
+               return;
+            end if;
+
+            Load (File, Buf, Ptr, '.', Loaded);
+
+            if Loaded then
+               Load_Digits (File, Buf, Ptr);
+            end if;
+         end if;
+      end if;
+
+      --  Deal with exponent
+
+      Load (File, Buf, Ptr, 'E', 'e', Loaded);
+
+      if Loaded then
+         Load (File, Buf, Ptr, '+', '-');
+         Load_Digits (File, Buf, Ptr);
+      end if;
+   end Load_Real;
+
    ---------------
    -- Load_Skip --
    ---------------
index 68d4a33cb379812b481a44602a56e2c88fa902a3..6b80ed4cfe107846a75a0d0d8ae280f16d661bdc 100644 (file)
@@ -155,6 +155,12 @@ package Ada.Wide_Wide_Text_IO.Generic_Aux is
       Ptr  : in out Natural);
    --  Loads a possibly signed integer literal value
 
+   procedure Load_Real
+     (File : File_Type;
+      Buf  : out String;
+      Ptr  : in out Natural);
+   --  Loads a possibly signed real literal value
+
    procedure Put_Item (File : File_Type; Str : String);
    --  This routine is like Wide_Wide_Text_IO.Put, except that it checks for
    --  overflow of bounded lines, as described in (RM A.10.6(8)). It is used
index 950b377bb3892d38712d5b49a730a55e130148e8..9f25987e42885b4e9d014ce40efb3b42a4547528 100644 (file)
@@ -654,6 +654,8 @@ package body System.Fat_Gen is
          if Adjustment > IEEE_Emax - Exp then
             XX := 0.0;
             return (if Minus then -1.0 / XX else 1.0 / XX);
+            pragma Annotate
+              (CodePeer, Intentional, "overflow check", "Infinity produced");
             pragma Annotate
               (CodePeer, Intentional, "divide by zero", "Infinity produced");
 
diff --git a/gcc/ada/libgnat/s-fatsfl.ads b/gcc/ada/libgnat/s-fatsfl.ads
deleted file mode 100644 (file)
index 45b13e1..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-------------------------------------------------------------------------------
---                                                                          --
---                         GNAT COMPILER COMPONENTS                         --
---                                                                          --
---                      S Y S T E M . F A T _ S F L T                       --
---                                                                          --
---                                 S p e c                                  --
---                                                                          --
---          Copyright (C) 1992-2020, 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- --
--- ware  Foundation;  either version 3,  or (at your option) any later ver- --
--- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
--- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
--- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
---                                                                          --
--- As a special exception under Section 7 of GPL version 3, you are granted --
--- additional permissions described in the GCC Runtime Library Exception,   --
--- version 3.1, as published by the Free Software Foundation.               --
---                                                                          --
--- You should have received a copy of the GNU General Public License and    --
--- a copy of the GCC Runtime Library Exception along with this program;     --
--- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
--- <http://www.gnu.org/licenses/>.                                          --
---                                                                          --
--- GNAT was originally developed  by the GNAT team at  New York University. --
--- Extensive contributions were provided by Ada Core Technologies Inc.      --
---                                                                          --
-------------------------------------------------------------------------------
-
---  This package contains an instantiation of the floating-point attribute
---  runtime routines for the type Short_Float.
-
-with System.Fat_Gen;
-
-package System.Fat_SFlt is
-   pragma Pure;
-
-   --  Note the only entity from this package that is accessed by Rtsfind
-   --  is the name of the package instantiation. Entities within this package
-   --  (i.e. the individual floating-point attribute routines) are accessed
-   --  by name using selected notation.
-
-   package Attr_Short_Float is new System.Fat_Gen (Short_Float);
-
-end System.Fat_SFlt;
diff --git a/gcc/ada/libgnat/s-valflt.ads b/gcc/ada/libgnat/s-valflt.ads
new file mode 100644 (file)
index 0000000..476a251
--- /dev/null
@@ -0,0 +1,52 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--                       S Y S T E M . V A L _ F L T                        --
+--                                                                          --
+--                                 S p e c                                  --
+--                                                                          --
+--            Copyright (C) 2020, 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- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This package contains routines for scanning real values for floating point
+--  type Float, for use in Text_IO.Float_IO and the Value attribute.
+
+with Interfaces;
+with System.Val_Real;
+
+package System.Val_Flt is
+   pragma Preelaborate;
+
+   package Impl is new Val_Real (Float, Interfaces.Unsigned_32);
+
+   function Scan_Float
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Float
+     renames Impl.Scan_Real;
+
+   function Value_Float (Str : String) return Float
+     renames Impl.Value_Real;
+
+end System.Val_Flt;
diff --git a/gcc/ada/libgnat/s-vallfl.ads b/gcc/ada/libgnat/s-vallfl.ads
new file mode 100644 (file)
index 0000000..5bb6da4
--- /dev/null
@@ -0,0 +1,52 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--                      S Y S T E M . V A L _ L F L T                       --
+--                                                                          --
+--                                 S p e c                                  --
+--                                                                          --
+--            Copyright (C) 2020, 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- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This package contains routines for scanning real values for floating point
+--  type Long_Float, for use in Text_IO.Float_IO and the Value attribute.
+
+with Interfaces;
+with System.Val_Real;
+
+package System.Val_LFlt is
+   pragma Preelaborate;
+
+   package Impl is new Val_Real (Long_Float, Interfaces.Unsigned_64);
+
+   function Scan_Long_Float
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Long_Float
+     renames Impl.Scan_Real;
+
+   function Value_Long_Float (Str : String) return Long_Float
+     renames Impl.Value_Real;
+
+end System.Val_LFlt;
diff --git a/gcc/ada/libgnat/s-valllf.ads b/gcc/ada/libgnat/s-valllf.ads
new file mode 100644 (file)
index 0000000..715f6ac
--- /dev/null
@@ -0,0 +1,52 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--                       S Y S T E M . V A L _ L L F                        --
+--                                                                          --
+--                                 S p e c                                  --
+--                                                                          --
+--            Copyright (C) 2020, 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- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This package contains routines for scanning real values for floating point
+--  type Long_Long_Float, for use in Text_IO.Float_IO and the Value attribute.
+
+with Interfaces;
+with System.Val_Real;
+
+package System.Val_LLF is
+   pragma Preelaborate;
+
+   package Impl is new Val_Real (Long_Long_Float, Interfaces.Unsigned_64);
+
+   function Scan_Long_Long_Float
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Long_Long_Float
+     renames Impl.Scan_Real;
+
+   function Value_Long_Long_Float (Str : String) return Long_Long_Float
+     renames Impl.Value_Real;
+
+end System.Val_LLF;
index 693b261657d9617bbe166b5b99192e995fe5fe8d..cd02dfea5f64954e718ea9d03547cfd489d284e3 100644 (file)
@@ -36,14 +36,14 @@ with System.Value_R;
 
 package body System.Val_Real is
 
-   package Impl is new Value_R (Long_Long_Unsigned, Floating => True);
+   package Impl is new Value_R (Uns, Floating => True);
 
    function Integer_to_Real
      (Str   : String;
-      Val   : Long_Long_Unsigned;
+      Val   : Uns;
       Base  : Unsigned;
       Scale : Integer;
-      Minus : Boolean) return Long_Long_Float;
+      Minus : Boolean) return Num;
    --  Convert the real value from integer to real representation
 
    ---------------------
@@ -52,26 +52,34 @@ package body System.Val_Real is
 
    function Integer_to_Real
      (Str   : String;
-      Val   : Long_Long_Unsigned;
+      Val   : Uns;
       Base  : Unsigned;
       Scale : Integer;
-      Minus : Boolean) return Long_Long_Float
+      Minus : Boolean) return Num
    is
+      pragma Assert (Base in 2 .. 16);
+
       pragma Unsuppress (Range_Check);
 
-      R_Val : Long_Long_Float;
+      R_Val : Num;
 
    begin
       --  We call the floating-point processor reset routine so we can be sure
-      --  that the processor is properly set for conversions. This is notably
+      --  that the x87 FPU is properly set for conversions. This is especially
       --  needed on Windows, where calls to the operating system randomly reset
       --  the processor into 64-bit mode.
 
-      System.Float_Control.Reset;
+      if Num'Machine_Mantissa = 64 then
+         System.Float_Control.Reset;
+      end if;
 
-      --  Compute the final value
+      --  Compute the final value with a single rounding if possible
 
-      R_Val := Long_Long_Float (Val) * Long_Long_Float (Base) ** Scale;
+      if Scale < 0 then
+         R_Val := Num (Val) / Num (Base) ** (-Scale);
+      else
+         R_Val := Num (Val) * Num (Base) ** Scale;
+      end if;
 
       --  Finally deal with initial minus sign, note that this processing is
       --  done even if Uval is zero, so that -0.0 is correctly interpreted.
@@ -87,16 +95,16 @@ package body System.Val_Real is
    ---------------
 
    function Scan_Real
-      (Str : String;
-       Ptr : not null access Integer;
-       Max : Integer)
-      return Long_Long_Float
+     (Str : String;
+      Ptr : not null access Integer;
+      Max : Integer) return Num
    is
       Base  : Unsigned;
       Scale : Integer;
       Extra : Unsigned;
+      pragma Unreferenced (Extra);
       Minus : Boolean;
-      Val   : Long_Long_Unsigned;
+      Val   : Uns;
 
    begin
       Val := Impl.Scan_Raw_Real (Str, Ptr, Max, Base, Scale, Extra, Minus);
@@ -108,12 +116,13 @@ package body System.Val_Real is
    -- Value_Real --
    ----------------
 
-   function Value_Real (Str : String) return Long_Long_Float is
+   function Value_Real (Str : String) return Num is
       Base  : Unsigned;
       Scale : Integer;
       Extra : Unsigned;
+      pragma Unreferenced (Extra);
       Minus : Boolean;
-      Val   : Long_Long_Unsigned;
+      Val   : Uns;
 
    begin
       Val := Impl.Value_Raw_Real (Str, Base, Scale, Extra, Minus);
index cb5374c7ba0f115e8f8e49cfc59838c560505fc8..961c4803a84caa706a902d280dda4b367fbf4b42 100644 (file)
 --                                                                          --
 ------------------------------------------------------------------------------
 
+--  This package contains routines for scanning real values for use in
+--  Text_IO.Float_IO and the Value attribute.
+
+generic
+
+   type Num is digits <>;
+
+   type Uns is mod <>;
+
 package System.Val_Real is
    pragma Preelaborate;
 
    function Scan_Real
      (Str : String;
       Ptr : not null access Integer;
-      Max : Integer) return Long_Long_Float;
+      Max : Integer) return Num;
    --  This function scans the string starting at Str (Ptr.all) for a valid
    --  real literal according to the syntax described in (RM 3.5(43)). The
    --  substring scanned extends no further than Str (Max). There are three
@@ -65,10 +74,10 @@ package System.Val_Real is
    --  If this occurs Program_Error is raised with a message noting that this
    --  case is not supported. Most such cases are eliminated by the caller.
 
-   function Value_Real (Str : String) return Long_Long_Float;
+   function Value_Real (Str : String) return Num;
    --  Used in computing X'Value (Str) where X is a floating-point type or an
    --  ordinary fixed-point type. Str is the string argument of the attribute.
    --  Constraint_Error is raised if the string is malformed, or if the value
-   --  out of range of Long_Long_Float.
+   --  out of range of Num.
 
 end System.Val_Real;
index 06d7adcbd7a29a3077346ff1660bef676c8aa5d3..04b064fbe08e59e72f0b63d88a04ac1d96a284cc 100644 (file)
@@ -33,11 +33,7 @@ with System.Val_Util; use System.Val_Util;
 
 package body System.Value_R is
 
-   F_Limit : constant Uns := 2 ** (Long_Long_Float'Machine_Mantissa - 1);
-   I_Limit : constant Uns := 2 ** (Uns'Size - 1);
-   --  Absolute value of largest representable signed integer
-
-   Precision_Limit : constant Uns := (if Floating then F_Limit else I_Limit);
+   Precision_Limit : constant Uns := 2 ** (Uns'Size - 1);
    --  Limit beyond which additional digits are dropped
 
    subtype Char_As_Digit is Unsigned range 0 .. 17;
@@ -133,6 +129,8 @@ package body System.Value_R is
 
    is
       pragma Assert (Base in 2 .. 16);
+      pragma Assert (Index in Str'Range);
+      pragma Assert (Max <= Str'Last);
 
       Umax : constant Uns := (Precision_Limit - Uns (Base) + 1) / Uns (Base);
       --  Max value which cannot overflow on accumulating next digit
@@ -144,8 +142,9 @@ package body System.Value_R is
       --  Set to True if addition of a digit will cause Value to be superior
       --  to Precision_Limit.
 
-      Precision_Limit_Just_Reached : Boolean := False;
+      Precision_Limit_Just_Reached : Boolean;
       --  Set to True if Precision_Limit_Reached was just set to True
+      --  Only used when Floating = False.
 
       Digit : Char_As_Digit;
       --  The current digit
@@ -166,6 +165,10 @@ package body System.Value_R is
          Extra := 0;
       end if;
 
+      if not Floating then
+         Precision_Limit_Just_Reached := False;
+      end if;
+
       --  The function precondition is that the first character is a valid
       --  digit.
 
@@ -194,7 +197,7 @@ package body System.Value_R is
          --  continue only to assess the validity of the string.
 
          if Precision_Limit_Reached then
-            if Precision_Limit_Just_Reached and then not Floating then
+            if not Floating and then Precision_Limit_Just_Reached then
                if Digit >= Base / 2 then
                   if Extra = Base - 1 then
                      Extra := 0;
@@ -244,7 +247,10 @@ package body System.Value_R is
                else
                   Extra := Digit;
                   Precision_Limit_Reached := True;
-                  Precision_Limit_Just_Reached := True;
+
+                  if not Floating then
+                     Precision_Limit_Just_Reached := True;
+                  end if;
                end if;
             end if;
          end if;
@@ -308,8 +314,9 @@ package body System.Value_R is
       --  Set to True if addition of a digit will cause Value to be superior
       --  to Precision_Limit.
 
-      Precision_Limit_Just_Reached : Boolean := False;
-      --  Set to True if Precision_Limit_Reached was just set to True
+      Precision_Limit_Just_Reached : Boolean;
+      --  Set to True if Precision_Limit_Reached was just set to True.
+      --  Only used when Floating = False.
 
       Digit : Char_As_Digit;
       --  The current digit
@@ -324,6 +331,12 @@ package body System.Value_R is
       Scale := 0;
       Extra := 0;
 
+      if not Floating then
+         Precision_Limit_Just_Reached := False;
+      end if;
+
+      pragma Assert (Max <= Str'Last);
+
       --  The function precondition is that the first character is a valid
       --  digit.
 
@@ -354,7 +367,7 @@ package body System.Value_R is
          if Precision_Limit_Reached then
             Scale := Scale + 1;
 
-            if Precision_Limit_Just_Reached and then not Floating then
+            if not Floating and then Precision_Limit_Just_Reached then
                if Digit >= Base / 2 then
                   if Extra = Base - 1 then
                      Extra := 0;
@@ -378,7 +391,11 @@ package body System.Value_R is
             else
                Extra := Digit;
                Precision_Limit_Reached := True;
-               Precision_Limit_Just_Reached := True;
+
+               if not Floating then
+                  Precision_Limit_Just_Reached := True;
+               end if;
+
                Scale := Scale + 1;
             end if;
          end if;
@@ -409,7 +426,6 @@ package body System.Value_R is
             end if;
          end if;
       end loop;
-
    end Scan_Integral_Digits;
 
    -------------------
@@ -425,6 +441,8 @@ package body System.Value_R is
       Extra : out Unsigned;
       Minus : out Boolean) return Uns
    is
+      pragma Assert (Max <= Str'Last);
+
       After_Point : Boolean;
       --  True if a decimal should be parsed
 
@@ -440,7 +458,7 @@ package body System.Value_R is
       --  Local copy of string pointer
 
       Start : Positive;
-      --  Position of starting non-blank character
+      pragma Unreferenced (Start);
 
       Value : Uns;
       --  Mantissa as an Integer
@@ -461,14 +479,15 @@ package body System.Value_R is
 
       Scan_Sign (Str, Ptr, Max, Minus, Start);
       Index := Ptr.all;
-      Ptr.all := Start;
 
-      --  First character can be either a decimal digit or a dot
+      pragma Assert (Index >= Str'First);
 
-      if Str (Index) in '0' .. '9' then
-         pragma Annotate
-           (CodePeer, False_Positive, "test always true", "defensive code");
+      pragma Annotate (CodePeer, Modified, Str (Index));
+
+      --  First character can be either a decimal digit or a dot and for some
+      --  reason CodePeer incorrectly thinks it is always a digit.
 
+      if Str (Index) in '0' .. '9' then
          After_Point := False;
 
          --  If this is a digit it can indicates either the float decimal
@@ -496,13 +515,16 @@ package body System.Value_R is
 
       --  Check if the first number encountered is a base
 
+      pragma Assert (Index >= Str'First);
+
       if Index < Max
         and then (Str (Index) = '#' or else Str (Index) = ':')
       then
          Base_Char := Str (Index);
-         Base := Unsigned (Value);
 
-         if Base < 2 or else Base > 16 then
+         if Value in 2 .. 16 then
+            Base := Unsigned (Value);
+         else
             Base_Violation := True;
             Base := 16;
          end if;
@@ -533,6 +555,8 @@ package body System.Value_R is
 
       --  Do we have a dot?
 
+      pragma Assert (Index >= Str'First);
+
       if not After_Point and then Index <= Max and then Str (Index) = '.' then
 
          --  At this stage if After_Point was not set, this means that an
@@ -549,6 +573,8 @@ package body System.Value_R is
       --  Scan the decimal part
 
       if After_Point then
+         pragma Assert (Index <= Max);
+
          Scan_Decimal_Digits
            (Str, Index, Max, Value, Scale, Char_As_Digit (Extra),
             Base_Violation, Base, Base_Specified => Base_Char /= ASCII.NUL);
@@ -557,6 +583,8 @@ package body System.Value_R is
       --  If an explicit base was specified ensure that the delimiter is found
 
       if Base_Char /= ASCII.NUL then
+         pragma Assert (Index > Max or else Index in Str'Range);
+
          if Index > Max or else Str (Index) /= Base_Char then
             Bad_Value (Str);
          else
index 665458fb1f07f82a0a24debd8f2cd6d96abb544d..27bbe0915ee3c3466a8d81b662e73eed40a3f4df 100644 (file)
@@ -239,8 +239,6 @@ package Rtsfind is
       System_Exp_Mod,
       System_Exp_Uns,
       System_Fat_Flt,
-      System_Fat_IEEE_Long_Float,
-      System_Fat_IEEE_Short_Float,
       System_Fat_LFlt,
       System_Fat_LLF,
       System_Fat_SFlt,
@@ -434,13 +432,15 @@ package Rtsfind is
       System_Val_Fixed_32,
       System_Val_Fixed_64,
       System_Val_Fixed_128,
+      System_Val_Flt,
       System_Val_Int,
+      System_Val_LFlt,
+      System_Val_LLF,
       System_Val_LLI,
       System_Val_LLLI,
       System_Val_LLU,
       System_Val_LLLU,
       System_Val_Name,
-      System_Val_Real,
       System_Val_Uns,
       System_Val_WChar,
       System_Version_Control,
@@ -925,18 +925,10 @@ package Rtsfind is
 
      RE_Attr_Float,                      -- System.Fat_Flt
 
-     RE_Attr_IEEE_Long,                  -- System.Fat_IEEE_Long_Float
-     RE_Fat_IEEE_Long,                   -- System.Fat_IEEE_Long_Float
-
-     RE_Attr_IEEE_Short,                 -- System.Fat_IEEE_Short_Float
-     RE_Fat_IEEE_Short,                  -- System.Fat_IEEE_Short_Float
-
      RE_Attr_Long_Float,                 -- System.Fat_LFlt
 
      RE_Attr_Long_Long_Float,            -- System.Fat_LLF
 
-     RE_Attr_Short_Float,                -- System.Fat_SFlt
-
      RE_Attr_VAX_D_Float,                -- System.Fat_VAX_D_Float
      RE_Fat_VAX_D,                       -- System.Fat_VAX_D_Float
 
@@ -2045,8 +2037,14 @@ package Rtsfind is
 
      RE_Value_Fixed128,                  -- System_Val_Fixed_128
 
+     RE_Value_Float,                     -- System_Val_Flt
+
      RE_Value_Integer,                   -- System.Val_Int
 
+     RE_Value_Long_Float,                -- System_Val_LFlt
+
+     RE_Value_Long_Long_Float,           -- System_Val_LLF
+
      RE_Value_Long_Long_Integer,         -- System.Val_LLI
 
      RE_Value_Long_Long_Long_Integer,    -- System.Val_LLLI
@@ -2055,8 +2053,6 @@ package Rtsfind is
 
      RE_Value_Long_Long_Long_Unsigned,   -- System.Val_LLLU
 
-     RE_Value_Real,                      -- System.Val_Real
-
      RE_Value_Unsigned,                  -- System.Val_Uns
 
      RE_Value_Wide_Character,            -- System.Val_WChar
@@ -2610,18 +2606,10 @@ package Rtsfind is
 
      RE_Attr_Float                       => System_Fat_Flt,
 
-     RE_Attr_IEEE_Long                   => System_Fat_IEEE_Long_Float,
-     RE_Fat_IEEE_Long                    => System_Fat_IEEE_Long_Float,
-
-     RE_Attr_IEEE_Short                  => System_Fat_IEEE_Short_Float,
-     RE_Fat_IEEE_Short                   => System_Fat_IEEE_Short_Float,
-
      RE_Attr_Long_Float                  => System_Fat_LFlt,
 
      RE_Attr_Long_Long_Float             => System_Fat_LLF,
 
-     RE_Attr_Short_Float                 => System_Fat_SFlt,
-
      RE_Attr_VAX_D_Float                 => System_Fat_VAX_D_Float,
      RE_Fat_VAX_D                        => System_Fat_VAX_D_Float,
 
@@ -3730,8 +3718,14 @@ package Rtsfind is
 
      RE_Value_Fixed128                   => System_Val_Fixed_128,
 
+     RE_Value_Float                      => System_Val_Flt,
+
      RE_Value_Integer                    => System_Val_Int,
 
+     RE_Value_Long_Float                 => System_Val_LFlt,
+
+     RE_Value_Long_Long_Float            => System_Val_LLF,
+
      RE_Value_Long_Long_Integer          => System_Val_LLI,
 
      RE_Value_Long_Long_Long_Integer     => System_Val_LLLI,
@@ -3740,8 +3734,6 @@ package Rtsfind is
 
      RE_Value_Long_Long_Long_Unsigned    => System_Val_LLLU,
 
-     RE_Value_Real                       => System_Val_Real,
-
      RE_Value_Unsigned                   => System_Val_Uns,
 
      RE_Value_Wide_Character             => System_Val_WChar,