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
return Get_Discriminal (E, Bound);
elsif Nkind (Bound) = N_Integer_Literal then
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);
else
return Duplicate_Subexpr_No_Checks (Bound);