Patchwork [Ada] Attribute 'Width and pragma Discard_Names

login
register
mail settings
Submitter Arnaud Charlet
Date Dec. 20, 2011, 2:01 p.m.
Message ID <20111220140120.GA28854@adacore.com>
Download mbox | patch
Permalink /patch/132426/
State New
Headers show

Comments

Arnaud Charlet - Dec. 20, 2011, 2:01 p.m.
This patch corrects the expansion of attribute 'Width when applied to a
dynamic enumeration type with suppressed names.

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-12-20  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_imgv.adb (Expand_Width_Attribute): Add a
	type conversion from the enumeration subtype to its base subtype.

Patch

Index: exp_imgv.adb
===================================================================
--- exp_imgv.adb	(revision 182532)
+++ exp_imgv.adb	(working copy)
@@ -1177,7 +1177,7 @@ 
          --                  ...
          --                      else n)))...
 
-         --  where n is equal to Rtyp'Pos (Rtyp'Last) + 1
+         --  where n is equal to Rtyp'Pos (Ptyp'Last) + 1
 
          --  Note: The above processing is in accordance with the intent of
          --  the RM, which is that Width should be related to the impl-defined
@@ -1206,12 +1206,13 @@ 
                      New_Occurrence_Of (Standard_Integer, Loc),
                    Expression =>
                      Make_Attribute_Reference (Loc,
-                       Prefix            => New_Occurrence_Of (Rtyp, Loc),
-                       Attribute_Name    => Name_Pos,
-                       Expressions       => New_List (
-                         Make_Attribute_Reference (Loc,
-                           Prefix            => New_Occurrence_Of (Ptyp, Loc),
-                           Attribute_Name    => Name_Last)))));
+                       Prefix         => New_Occurrence_Of (Rtyp, Loc),
+                       Attribute_Name => Name_Pos,
+                       Expressions    => New_List (
+                         Convert_To (Rtyp,
+                           Make_Attribute_Reference (Loc,
+                             Prefix         => New_Occurrence_Of (Ptyp, Loc),
+                             Attribute_Name => Name_Last))))));
 
                --  OK, now we need to build the conditional expression. First
                --  get the value of M, the largest possible value needed.