]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
exp_ch5.adb (Expand_N_Loop_Statement): For the transformation of a for loop for an...
authorGary Dismukes <dismukes@adacore.com>
Thu, 13 Oct 2011 10:39:15 +0000 (10:39 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 13 Oct 2011 10:39:15 +0000 (12:39 +0200)
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.

From-SVN: r179904

gcc/ada/ChangeLog
gcc/ada/exp_ch5.adb

index 61da1c3f507662a64ef88d2690fff009af5f72bd..d6c30b39cfa7317972da115078dee19fce60c39e 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2011-10-13  Bob Duff  <duff@adacore.com>
 
        * exp_ch6.ads (BIP_Storage_Pool): New "extra implicit parameter"
index 291d68e7b3ebfff73f092a311a2c0c4dd59f5b6b..75aa2a5ffa2fa34c72cbe230c674364a0aefa50b 100644 (file)
@@ -3458,6 +3458,20 @@ package body Exp_Ch5 is
                            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