[Ada] Put_Image attribute
authorBob Duff <duff@adacore.com>
Mon, 16 Mar 2020 19:22:25 +0000 (15:22 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Thu, 11 Jun 2020 09:53:46 +0000 (05:53 -0400)
2020-06-11  Bob Duff  <duff@adacore.com>

gcc/ada/

* exp_put_image.adb (Build_Elementary_Put_Image_Call): If the
underlying type is real, call Put_Image_Unknown.
(Build_Unknown_Put_Image_Call): Pass the type name to
Put_Image_Unknown.
* libgnat/s-putima.ads, libgnat/s-putima.adb
(Put_Image_Unknown): Add Type_Name parameter.  Remove
overly-detailed documentation of what it does; better to leave
it open.

gcc/ada/exp_put_image.adb
gcc/ada/libgnat/s-putima.adb
gcc/ada/libgnat/s-putima.ads

index 3a6cbc1f6675f7297c8e08c8587ef7d0cb3ff34f..db7c65bf7fb944cbba49c7e6f6c75d861bfd830a 100644 (file)
@@ -27,6 +27,7 @@ with Atree;    use Atree;
 with Debug;    use Debug;
 with Einfo;    use Einfo;
 with Exp_Tss;  use Exp_Tss;
+with Exp_Util;
 with Lib;      use Lib;
 with Namet;    use Namet;
 with Nlists;   use Nlists;
@@ -340,26 +341,34 @@ package body Exp_Put_Image is
          --
          --  Note that this is putting a leading space for reals.
 
+         --  ???Work around the fact that Put_Image doesn't work for private
+         --  types whose full type is real.
+
+         if Is_Real_Type (U_Type) then
+            return Build_Unknown_Put_Image_Call (N);
+         end if;
+
          declare
             Image : constant Node_Id :=
               Make_Attribute_Reference (Loc,
                 Prefix => New_Occurrence_Of (U_Type, Loc),
                 Attribute_Name => Name_Wide_Wide_Image,
                 Expressions => New_List (Relocate_Node (Item)));
-         begin
-            return
+            Put_Call : constant Node_Id :=
               Make_Procedure_Call_Statement (Loc,
                 Name =>
                   New_Occurrence_Of (RTE (RE_Put_Wide_Wide_String), Loc),
                 Parameter_Associations => New_List
                   (Relocate_Node (Sink), Image));
+         begin
+            return Put_Call;
          end;
       end if;
 
       --  Unchecked-convert parameter to the required type (i.e. the type of
       --  the corresponding parameter), and call the appropriate routine.
       --  We could use a normal type conversion for scalars, but the
-      --  "unchecked" is needed for access types.
+      --  "unchecked" is needed for access and private types.
 
       declare
          Libent : constant Entity_Id := RTE (Lib_RE);
@@ -800,7 +809,10 @@ package body Exp_Put_Image is
         Make_Procedure_Call_Statement (Loc,
           Name => New_Occurrence_Of (Libent, Loc),
           Parameter_Associations => New_List (
-            Relocate_Node (Sink)));
+            Relocate_Node (Sink),
+            Make_String_Literal (Loc,
+              Exp_Util.Fully_Qualified_Name_String (
+                Entity (Prefix (N)), Append_NUL => False))));
    end Build_Unknown_Put_Image_Call;
 
    ----------------------
index cad693f49965779dbd5906f8d838b3205f994e65..50597b2422a1e1aaf004bb5481ec3060ca8aac7e 100644 (file)
@@ -212,9 +212,11 @@ package body System.Put_Images is
       Put_7bit (S, ')');
    end Record_After;
 
-   procedure Put_Image_Unknown (S : in out Sink'Class) is
+   procedure Put_Image_Unknown (S : in out Sink'Class; Type_Name : String) is
    begin
-      Put_UTF_8 (S, "{unknown image}");
+      Put_UTF_8 (S, "{");
+      Put_String (S, Type_Name);
+      Put_UTF_8 (S, " object}");
    end Put_Image_Unknown;
 
 end System.Put_Images;
index 0cfe2171e8f8e9928862cf16867966311f3755e7..0bedd3dace47cd7fbf6d8c7caf5a6a8618829a12 100644 (file)
@@ -86,8 +86,8 @@ package System.Put_Images is
    procedure Record_Between (S : in out Sink'Class);
    procedure Record_After (S : in out Sink'Class);
 
-   procedure Put_Image_Unknown (S : in out Sink'Class);
+   procedure Put_Image_Unknown (S : in out Sink'Class; Type_Name : String);
    --  For Put_Image of types that don't have the attribute, such as type
-   --  Sink. Prints a canned string.
+   --  Sink.
 
 end System.Put_Images;