+2019-08-20 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_attr.adb (Expand_Loop_Entry_Attribute): When expanding a
+ loop entry attribute for a while_loop we construct a function
+ that incorporates the expanded condition of the loop. The itypes
+ that may be generated in that expansion must carry the scope of
+ the constructed function for proper handling in gigi.
+
2019-08-20 Ed Schonberg <schonberg@adacore.com>
* exp_disp.adb (Build_Class_Wide_Check, Replace_Formals): When a
Insert_Action (Loop_Stmt, Func_Decl);
Pop_Scope;
+ -- The analysis of the condition may have generated itypes
+ -- that are now used within the function: Adjust their
+ -- scopes accordingly so that their use appears in their
+ -- scope of definition.
+
+ declare
+ Ityp : Entity_Id;
+
+ begin
+ Ityp := First_Entity (Loop_Id);
+
+ while Present (Ityp) loop
+ if Is_Itype (Ityp) then
+ Set_Scope (Ityp, Func_Id);
+ end if;
+ Next_Entity (Ityp);
+ end loop;
+ end;
+
-- Transform the original while loop into an infinite loop
-- where the last statement checks the negated condition. This
-- placement ensures that the condition will not be evaluated
+2019-08-20 Ed Schonberg <schonberg@adacore.com>
+
+ * gnat.dg/loop_entry2.adb: New testcase.
+
2019-08-20 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/tagged5.adb, gnat.dg/tagged5.ads: New testcase.
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-gnata" }
+
+procedure Loop_Entry2 (S : String) is
+ J : Integer := S'First;
+begin
+ while S(J..J+1) = S(J..J+1) loop
+ pragma Loop_Invariant (for all K in J'Loop_Entry .. J => K <= J);
+ J := J + 1;
+ end loop;
+end;