From bf2480e2fbf29772f8acca9d184f18dbfb6d00bc Mon Sep 17 00:00:00 2001 From: Justin Squirek Date: Fri, 28 Feb 2020 10:21:38 -0500 Subject: [PATCH] [Ada] Crash on exit statement within predicated loop 2020-06-09 Justin Squirek gcc/ada/ * exp_ch5.adb (Expand_Predicated_Loop): Perserve the original loop identifier within the expansion. --- gcc/ada/exp_ch5.adb | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index d69e1475564..02e9f46d4ab 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -4920,13 +4920,14 @@ package body Exp_Ch5 is -- mode, the semantic analyzer may disallow one or both forms. procedure Expand_Predicated_Loop (N : Node_Id) is - Loc : constant Source_Ptr := Sloc (N); - Isc : constant Node_Id := Iteration_Scheme (N); - LPS : constant Node_Id := Loop_Parameter_Specification (Isc); - Loop_Id : constant Entity_Id := Defining_Identifier (LPS); - Ltype : constant Entity_Id := Etype (Loop_Id); - Stat : constant List_Id := Static_Discrete_Predicate (Ltype); - Stmts : constant List_Id := Statements (N); + Orig_Loop_Id : Node_Id := Empty; + Loc : constant Source_Ptr := Sloc (N); + Isc : constant Node_Id := Iteration_Scheme (N); + LPS : constant Node_Id := Loop_Parameter_Specification (Isc); + Loop_Id : constant Entity_Id := Defining_Identifier (LPS); + Ltype : constant Entity_Id := Etype (Loop_Id); + Stat : constant List_Id := Static_Discrete_Predicate (Ltype); + Stmts : constant List_Id := Statements (N); begin -- Case of iteration over non-static predicate, should not be possible @@ -5205,7 +5206,13 @@ package body Exp_Ch5 is Alternatives => Alts); Append_To (Stmts, Cstm); - -- Rewrite the loop + -- Rewrite the loop preserving the loop identifier in case there + -- are exit statements referencing it. + + if Present (Identifier (N)) then + Orig_Loop_Id := New_Occurrence_Of + (Entity (Identifier (N)), Loc); + end if; Set_Suppress_Assignment_Checks (D); @@ -5217,6 +5224,7 @@ package body Exp_Ch5 is Statements => New_List ( Make_Loop_Statement (Loc, Statements => Stmts, + Identifier => Orig_Loop_Id, End_Label => Empty))))); Analyze (N); -- 2.30.2