OSDN Git Service

2008-07-31 Hristian Kirtchev <kirtchev@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Jul 2008 10:27:04 +0000 (10:27 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Jul 2008 10:27:04 +0000 (10:27 +0000)
* exp_attr.adb (Find_Stream_Subprogram): Check the base type instead
of the type when looking for stream subprograms for type String,
Wide_String and Wide_Wide_String.

* s-ststop.adb: Change the initialization expression of constant
Use_Block_IO.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138383 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/exp_attr.adb
gcc/ada/s-ststop.adb

index 1637863..006b8f8 100644 (file)
@@ -5314,7 +5314,8 @@ package body Exp_Attr is
      (Typ : Entity_Id;
       Nam : TSS_Name_Type) return Entity_Id
    is
-      Ent : constant Entity_Id := TSS (Typ, Nam);
+      Base_Typ : constant Entity_Id := Base_Type (Typ);
+      Ent      : constant Entity_Id := TSS (Typ, Nam);
 
    begin
       if Present (Ent) then
@@ -5340,7 +5341,7 @@ package body Exp_Attr is
 
          --  String as defined in package Ada
 
-         if Typ = Standard_String then
+         if Base_Typ = Standard_String then
             if Nam = TSS_Stream_Input then
                return RTE (RE_String_Input);
 
@@ -5356,7 +5357,7 @@ package body Exp_Attr is
 
          --  Wide_String as defined in package Ada
 
-         elsif Typ = Standard_Wide_String then
+         elsif Base_Typ = Standard_Wide_String then
             if Nam = TSS_Stream_Input then
                return RTE (RE_Wide_String_Input);
 
@@ -5372,7 +5373,7 @@ package body Exp_Attr is
 
          --  Wide_Wide_String as defined in package Ada
 
-         elsif Typ = Standard_Wide_Wide_String then
+         elsif Base_Typ = Standard_Wide_Wide_String then
             if Nam = TSS_Stream_Input then
                return RTE (RE_Wide_Wide_String_Input);
 
index 8d18108..88e29f0 100644 (file)
@@ -92,17 +92,12 @@ package body System.Strings.Stream_Ops is
 
       subtype String_Block is String_Type (1 .. C_In_Default_Block);
 
-      --  Block IO is used in the following two scenarios:
-
-      --    1) When the size of the character type equals that of the stream
-      --    element type, regardless of endianness.
-
-      --    2) When using the standard stream IO routines for elementary
-      --    types which guarantees the same endianness over partitions.
+      --  Block IO is used when the low level can support block IO and the size
+      --  of the character type is a multiple of the stream element type.
 
       Use_Block_IO : constant Boolean :=
-                       C_Size = SE_Size
-                         or else Stream_Attributes.Block_IO_OK;
+                       Stream_Attributes.Block_IO_OK
+                         and then C_Size mod SE_Size = 0;
 
       --  Conversions to and from Default_Block