aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/exp_ch5.adb14
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 61da1c3..d6c30b3 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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"
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb
index 291d68e..75aa2a5 100644
--- a/gcc/ada/exp_ch5.adb
+++ b/gcc/ada/exp_ch5.adb
@@ -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