[Ada] More permissive use of GNAT attribute Enum_Rep
authorEd Schonberg <schonberg@adacore.com>
Mon, 1 Jul 2019 13:37:37 +0000 (13:37 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 1 Jul 2019 13:37:37 +0000 (13:37 +0000)
This patch allows the prefix of the attribute Enum_Rep to be an
attribute referece (such as Enum_Type'First). A recent patch had
restricted the prefix to be an object of a discrete type, which is
incompatible with orevious usage.

2019-07-01  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_attr.adb (Analyze_Attribute, case Enum_Rep): Allow prefix
of attribute to be an attribute reference of a discrete type.

gcc/testsuite/

* gnat.dg/enum_rep.adb, gnat.dg/enum_rep.ads: New testcase.

From-SVN: r272881

gcc/ada/ChangeLog
gcc/ada/sem_attr.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/enum_rep.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/enum_rep.ads [new file with mode: 0644]

index a342b98..63ed0d8 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-01  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_attr.adb (Analyze_Attribute, case Enum_Rep): Allow prefix
+       of attribute to be an attribute reference of a discrete type.
+
 2019-07-01  Eric Botcazou  <ebotcazou@adacore.com>
 
        * sem_ch12.adb (Analyze_Subprogram_Instantiation): Move up
index e966bf1..bdc76c3 100644 (file)
@@ -3833,14 +3833,16 @@ package body Sem_Attr is
             Check_Discrete_Type;
             Resolve (E1, P_Base_Type);
 
-         --  X'Enum_Rep case. X must be an object or enumeration literal, and
-         --  it must be of a discrete type.
+         --  X'Enum_Rep case. X must be an object or enumeration literal
+         --  (including an attribute reference), and it must be of a
+         --  discrete type.
 
          elsif not
            ((Is_Object_Reference (P)
                or else
                  (Is_Entity_Name (P)
-                    and then Ekind (Entity (P)) = E_Enumeration_Literal))
+                    and then Ekind (Entity (P)) = E_Enumeration_Literal)
+               or else Nkind (P) = N_Attribute_Reference)
              and then Is_Discrete_Type (Etype (P)))
          then
             Error_Attr_P ("prefix of % attribute must be discrete object");
index 6b2e983..8af4499 100644 (file)
@@ -1,5 +1,9 @@
 2019-07-01  Ed Schonberg  <schonberg@adacore.com>
 
+       * gnat.dg/enum_rep.adb, gnat.dg/enum_rep.ads: New testcase.
+
+2019-07-01  Ed Schonberg  <schonberg@adacore.com>
+
        * gnat.dg/derived_type6.adb, gnat.dg/derived_type6.ads: New
        testcase.
 
diff --git a/gcc/testsuite/gnat.dg/enum_rep.adb b/gcc/testsuite/gnat.dg/enum_rep.adb
new file mode 100644 (file)
index 0000000..4b13078
--- /dev/null
@@ -0,0 +1,5 @@
+--  { dg-do compile }
+
+package body Enum_Rep is
+   procedure Foo is null;
+end;
diff --git a/gcc/testsuite/gnat.dg/enum_rep.ads b/gcc/testsuite/gnat.dg/enum_rep.ads
new file mode 100644 (file)
index 0000000..acf282c
--- /dev/null
@@ -0,0 +1,22 @@
+with Interfaces;
+
+package Enum_Rep is
+
+   type My_Type is range 00 .. 100;
+
+   subtype My_Subtype2 is Interfaces.Unsigned_32
+        range My_Type'First'Enum_Rep .. My_Type'Last'Enum_Rep;
+
+   My_Type_First : constant My_Type :=  My_Type'First;
+   My_Type_Last : constant My_Type :=  My_Type'Last;
+
+   subtype My_Subtype is Interfaces.Unsigned_32
+         range My_Type_First'Enum_Rep .. My_Type_Last'Enum_Rep;
+
+   subtype My_Subtype1 is Interfaces.Unsigned_32
+        range My_Type'Enum_Rep (My_Type'First) ..
+               My_Type'Enum_Rep (MY_Type'Last);
+
+   procedure Foo;
+
+end;