Patchwork [Ada] Entity list of for loop for enumeration with rep gets truncated

login
register
mail settings
Submitter Arnaud Charlet
Date Oct. 13, 2011, 10:39 a.m.
Message ID <20111013103922.GA5409@adacore.com>
Download mbox | patch
Permalink /patch/119412/
State New
Headers show

Comments

Arnaud Charlet - Oct. 13, 2011, 10:39 a.m.
When a for loop for an enumeration type with an enumeration representation
clause is expanded, it's rewritten as a loop over an integer loop parameter
and the original loop parameter is moved into a new nested block. When
the block is analyzed, the moved entity gets appended to the block scope's
entity list (as it should), but is left on the loop scope's entity list,
and no longer has a successor (because its Next_Entity is set to null). This
causes other entities on the loop to get lost from the loop's entity list.
The fix is to remove the loop parameter entity from the loop scope's list,
leaving any other declarations on that list intact (such as an itype for
the loop paramter's subtype). This problem surfaced when generating debugging
info with the GNAAMP compiler, due to encountering a loop parameter's itype
that was not found on any entity list.

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

2011-10-13  Gary Dismukes  <dismukes@adacore.com>

	* exp_ch5.adb (Expand_N_Loop_Statement): For the transformation
	of a for loop for an enumeration type with an enumeration rep
	clause, which involves moving the original loop parameter into
	a nested block, the loop parameter's entity must be removed from
	the entity list of the loop scope.
Duncan Sands - Oct. 13, 2011, 10:41 a.m.
Hi Arnaud,

> --- exp_ch5.adb	(revision 179894)
> +++ exp_ch5.adb	(working copy)
> @@ -3458,6 +3458,20 @@
>                             Statements => Statements (N)))),
>
>                     End_Label => End_Label (N)));
> +
> +               --  The loop parameter's entity must be removed from the loop
> +               --  scope's entity list, since itw will now be located in the

typo: itw -> it

Ciao, Duncan.

Patch

Index: exp_ch5.adb
===================================================================
--- exp_ch5.adb	(revision 179894)
+++ exp_ch5.adb	(working copy)
@@ -3458,6 +3458,20 @@ 
                            Statements => Statements (N)))),
 
                    End_Label => End_Label (N)));
+
+               --  The loop parameter's entity must be removed from the loop
+               --  scope's entity list, since itw will now be located in the
+               --  new block scope. Any other entities already associated with
+               --  the loop scope, such as the loop parameter's subtype, will
+               --  remain there.
+
+               pragma Assert (First_Entity (Scope (Loop_Id)) = Loop_Id);
+
+               Set_First_Entity (Scope (Loop_Id), Next_Entity (Loop_Id));
+               if Last_Entity (Scope (Loop_Id)) = Loop_Id then
+                  Set_Last_Entity (Scope (Loop_Id), Empty);
+               end if;
+
                Analyze (N);
 
             --  Nothing to do with other cases of for loops