checks.adb (Get_E_First_Or_Last): When the expression being retrieved is an N_Raise_C...
authorThomas Quinot <quinot@adacore.com>
Tue, 15 Mar 2005 15:58:36 +0000 (16:58 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 15 Mar 2005 15:58:36 +0000 (16:58 +0100)
2005-03-08  Thomas Quinot  <quinot@adacore.com>

* checks.adb (Get_E_First_Or_Last): When the expression being retrieved
is an N_Raise_Constraint_Error node, create a new copy of it without
going through a call to Duplicate_Subexpr.

From-SVN: r96491

gcc/ada/checks.adb

index 6801837..1f66e3c 100644 (file)
@@ -5775,7 +5775,17 @@ package body Checks is
             return Get_Discriminal (E, Bound);
 
          elsif Nkind (Bound) = N_Integer_Literal then
-            return  Make_Integer_Literal (Loc, Intval (Bound));
+            return Make_Integer_Literal (Loc, Intval (Bound));
+
+         --  Case of a bound that has been rewritten to an
+         --  N_Raise_Constraint_Error node because it is an out-of-range
+         --  value. We may not call Duplicate_Subexpr on this node because
+         --  an N_Raise_Constraint_Error is not side effect free, and we may
+         --  not assume that we are in the proper context to remove side
+         --  effects on it at the point of reference.
+
+         elsif Nkind (Bound) = N_Raise_Constraint_Error then
+            return New_Copy_Tree (Bound);
 
          else
             return Duplicate_Subexpr_No_Checks (Bound);