Commit c961d820 by Eric Botcazou Committed by Pierre-Marie de Rodat

[Ada] Fix internal error on array slice in loop and Loop_Invariant

This fixes an internal error caused by the presence of an Itype in a
wrong scope.  This Itype is created for an array slice present in the
condition of a while loop whose body also contains a pragma
Loop_Invariant, initially in the correct scope but then relocated into a
function created for the pragma.

2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* exp_attr.adb (Expand_Loop_Entry_Attribute): Copy the condition
	of a while loop instead of simply relocating it.

gcc/testsuite/

	* gnat.dg/loop_invariant1.adb, gnat.dg/loop_invariant1.ads: New
	testcase.

From-SVN: r273668
parent 8801ca5c
2019-07-22 Eric Botcazou <ebotcazou@adacore.com>
* exp_attr.adb (Expand_Loop_Entry_Attribute): Copy the condition
of a while loop instead of simply relocating it.
2019-07-18 Arnaud Charlet <charlet@adacore.com> 2019-07-18 Arnaud Charlet <charlet@adacore.com>
* Makefile.rtl, expect.c, env.c, aux-io.c, mkdir.c, initialize.c, * Makefile.rtl, expect.c, env.c, aux-io.c, mkdir.c, initialize.c,
......
...@@ -1384,6 +1384,8 @@ package body Exp_Attr is ...@@ -1384,6 +1384,8 @@ package body Exp_Attr is
Stmts : List_Id; Stmts : List_Id;
begin begin
Func_Id := Make_Temporary (Loc, 'F');
-- Wrap the condition of the while loop in a Boolean function. -- Wrap the condition of the while loop in a Boolean function.
-- This avoids the duplication of the same code which may lead -- This avoids the duplication of the same code which may lead
-- to gigi issues with respect to multiple declaration of the -- to gigi issues with respect to multiple declaration of the
...@@ -1403,7 +1405,9 @@ package body Exp_Attr is ...@@ -1403,7 +1405,9 @@ package body Exp_Attr is
Append_To (Stmts, Append_To (Stmts,
Make_Simple_Return_Statement (Loc, Make_Simple_Return_Statement (Loc,
Expression => Relocate_Node (Condition (Scheme)))); Expression =>
New_Copy_Tree (Condition (Scheme),
New_Scope => Func_Id)));
-- Generate: -- Generate:
-- function Fnn return Boolean is -- function Fnn return Boolean is
...@@ -1411,7 +1415,6 @@ package body Exp_Attr is ...@@ -1411,7 +1415,6 @@ package body Exp_Attr is
-- <Stmts> -- <Stmts>
-- end Fnn; -- end Fnn;
Func_Id := Make_Temporary (Loc, 'F');
Func_Decl := Func_Decl :=
Make_Subprogram_Body (Loc, Make_Subprogram_Body (Loc,
Specification => Specification =>
......
2019-07-22 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/loop_invariant1.adb, gnat.dg/loop_invariant1.ads: New
testcase.
2019-07-22 Richard Biener <rguenther@suse.de> 2019-07-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/91221 PR tree-optimization/91221
......
-- { dg-do compile }
-- { dg-options "-gnata" }
package body Loop_Invariant1 is
procedure Proc (A : Arr; N : Integer) is
I : Integer := A'First;
begin
while i <= A'Last and then A(A'First .. A'Last) /= A loop
pragma Loop_Invariant (N = N'Loop_Entry);
i := i + 1;
end loop;
end;
end Loop_Invariant1;
package Loop_Invariant1 is
type Arr is array (Natural range <>) of Integer;
procedure Proc (A : Arr; N : Integer);
end Loop_Invariant1;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment