+2019-09-18 Eric Botcazou <ebotcazou@adacore.com>
+
+ * exp_aggr.adb (Build_Array_Aggr_Code): In STEP 1 (c), duplicate
+ the expression and reset the Loop_Actions for each loop
+ generated for an others choice.
+
2019-09-18 Justin Squirek <squirek@adacore.com>
* einfo.adb, einfo.ads (Minimum_Accessibility): Added new field.
Choice := First (Choice_List (Assoc));
while Present (Choice) loop
if Nkind (Choice) = N_Others_Choice then
- Set_Loop_Actions (Assoc, New_List);
Others_Assoc := Assoc;
exit;
end if;
if Present (Others_Assoc) then
declare
- First : Boolean := True;
+ First : Boolean := True;
+ Dup_Expr : Node_Id;
begin
for J in 0 .. Nb_Choices loop
or else not Empty_Range (Low, High)
then
First := False;
+
+ -- Duplicate the expression in case we will be generating
+ -- several loops. As a result the expression is no longer
+ -- shared between the loops and is reevaluated for each
+ -- such loop.
+
+ Expr := Get_Assoc_Expr (Others_Assoc);
+ Dup_Expr := New_Copy_Tree (Expr);
+ Set_Parent (Dup_Expr, Parent (Expr));
+
+ Set_Loop_Actions (Others_Assoc, New_List);
Append_List
- (Gen_Loop (Low, High,
- Get_Assoc_Expr (Others_Assoc)), To => New_Code);
+ (Gen_Loop (Low, High, Dup_Expr), To => New_Code);
end if;
end loop;
end;
+2019-09-18 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/aggr28.adb: New testcase.
+
2019-09-18 Steve Baird <baird@adacore.com>
* gnat.dg/ai12_0086_example.adb: New testcase.
--- /dev/null
+-- { dg-do run }
+
+procedure Aggr28 is
+
+ Count : Natural := 0;
+
+ function Get (S: String) return String is
+ begin
+ Count := Count + 1;
+ return S;
+ end;
+
+ Max_Error_Length : constant := 8;
+ subtype Error_Type is String (1 .. Max_Error_Length);
+
+ type Rec is record
+ Text : Error_Type;
+ end record;
+
+ type Arr is array (1 .. 16) of Rec;
+
+ Table : constant Arr :=
+ (3 => (Text => Get ("INVALID ")), others => (Text => Get ("OTHERS ")));
+
+begin
+ if Count /= Table'Length then
+ raise Program_Error;
+ end if;
+end;
\ No newline at end of file