[Ada] ACATS 4.1R-c611a04: Class-wide preconditions in dispatching calls
authorJavier Miranda <miranda@adacore.com>
Thu, 18 Feb 2021 18:47:10 +0000 (13:47 -0500)
committerPierre-Marie de Rodat <derodat@adacore.com>
Wed, 16 Jun 2021 08:42:58 +0000 (04:42 -0400)
gcc/ada/

* exp_disp.adb (Build_Class_Wide_Check): Ensure that evaluation
of actuals is side effects free (since the check duplicates
actuals).

gcc/ada/exp_disp.adb

index 20a32cd..eb6b352 100644 (file)
@@ -868,6 +868,7 @@ package body Exp_Disp is
 
          Str_Loc : constant String := Build_Location_String (Loc);
 
+         A    : Node_Id;
          Cond : Node_Id;
          Msg  : Node_Id;
          Prec : Node_Id;
@@ -900,6 +901,15 @@ package body Exp_Disp is
                return;
             end if;
 
+            --  Ensure that the evaluation of the actuals will not produce side
+            --  effects (since the check will use a copy of the actuals).
+
+            A := First_Actual (Call_Node);
+            while Present (A) loop
+               Remove_Side_Effects (A);
+               Next_Actual (A);
+            end loop;
+
             --  The expression for the precondition is analyzed within the
             --  generated pragma. The message text is the last parameter of
             --  the generated pragma, indicating source of precondition.