[Ada] Extend legality of Scalar_Storage_Order to formal types
authorEd Schonberg <schonberg@adacore.com>
Mon, 21 May 2018 14:50:06 +0000 (14:50 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 21 May 2018 14:50:06 +0000 (14:50 +0000)
This patch extends the legality of the GNAT attribute Scalar_Storage_Order,
to apply to formal private types. Previously this extension applied only
in GNAT_Mode, to support instantiations of Ada.Sequential_IO, but it is more
generally useful.

The following must compile quietly:

----
with Memory_View_Generic;
procedure Main is
   type T is array (1..10) of integer;
   package OK is new Memory_View_Generic (T);

   type T2 is new Long_Float;
   package Wrong is new Memory_View_Generic (T2);
begin
   null;
end;
----
with System;
generic
   type Source_Type is private;
package Memory_View_Generic is
   -- various declarations ...
   SSO : System.Bit_Order := Source_Type'Scalar_Storage_Order;
end Memory_View_Generic;

2018-05-21  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_attr.adb (Analyze_Attribute, case Scalar_Storage_Order): The
attribute reference is legal within a generic unit when the prefix is a
formal private type.

From-SVN: r260444

gcc/ada/ChangeLog
gcc/ada/sem_attr.adb

index e729f1851fe01cdbf75074ac67c177200dbc0e6f..8233aa4a7fe99c5c6a1661cbca6c70664637c44e 100644 (file)
@@ -1,3 +1,9 @@
+2018-04-04  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_attr.adb (Analyze_Attribute, case Scalar_Storage_Order): The
+       attribute reference is legal within a generic unit when the prefix is a
+       formal private type.
+
 2018-04-04  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * exp_ch7.adb (Establish_Transient_Scope): Code cleanup. Do not
index f3824a8bb1ae0ffe6a3e7e2e25dcef9bb167e28d..9cc3055a6d2dcf05701741c0b842d697b83ac096 100644 (file)
@@ -5709,11 +5709,15 @@ package body Sem_Attr is
 
          if not (Is_Record_Type (P_Type) or else Is_Array_Type (P_Type)) then
 
-            --  In GNAT mode, the attribute applies to generic types as well
-            --  as composite types, and for non-composite types always returns
-            --  the default bit order for the target.
-
-            if not (GNAT_Mode and then Is_Generic_Type (P_Type))
+            --  The attribute applies to generic private types (in which case
+            --  the legality rule is applied in the instance) as well as to
+            --  composite types. For noncomposite types it always returns the
+            --  default bit order for the target.
+            --  Allowing formal private types was originally introduced in
+            --  GNAT_Mode only, to compile instances of Sequential_IO, but
+            --  users find it more generally useful in generic units.
+
+            if not (Is_Generic_Type (P_Type) and then Is_Private_Type (P_Type))
               and then not In_Instance
             then
                Error_Attr_P
@@ -11074,7 +11078,7 @@ package body Sem_Attr is
 
             --  The context may be a constrained access type (however ill-
             --  advised such subtypes might be) so in order to generate a
-            --  constraint check when needed set the type of the attribute
+            --  constraint check we need to set the type of the attribute
             --  reference to the base type of the context.
 
             Set_Etype (N, Btyp);
@@ -11837,6 +11841,8 @@ package body Sem_Attr is
       if Attr_Id = Attribute_Elaborated then
          null;
 
+      --  Should this be restricted to Expander_Active???
+
       else
          Freeze_Expression (P);
       end if;