aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/checks.adb
diff options
context:
space:
mode:
authorRobert Dewar <dewar@adacore.com>2014-07-29 12:56:31 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2014-07-29 14:56:31 +0200
commitedab608853d34224b204dc42d751a3f90daabe39 (patch)
tree6cc8f3aef60cefb58f69e4a2c8d62232b4c13f10 /gcc/ada/checks.adb
parentc5c780e6deb9cf337f4898db5716659698311d7d (diff)
downloadgcc-edab608853d34224b204dc42d751a3f90daabe39.zip
gcc-edab608853d34224b204dc42d751a3f90daabe39.tar.gz
gcc-edab608853d34224b204dc42d751a3f90daabe39.tar.bz2
sem_aggr.adb (Resolve_Array_Aggregate): Change Is_Static_Range to Is_OK_Static_Range.
2014-07-29 Robert Dewar <dewar@adacore.com> * sem_aggr.adb (Resolve_Array_Aggregate): Change Is_Static_Range to Is_OK_Static_Range. * sem_attr.adb (Eval_Attribute): Make sure we properly flag static attributes (Eval_Attribute, case Size): Handle size of zero properly (Eval_Attribute, case Value_Size): Handle size of zero properly. * sem_ch13.adb: Minor reformatting. * sem_ch3.adb (Process_Range_Expr_In_Decl): Change Is_Static_Range to Is_OK_Static_Range. * sem_eval.adb (Eval_Case_Expression): Total rewrite, was wrong in several ways (Is_Static_Range): Moved here from spec (Is_Static_Subtype): Moved here from spec Change some incorrect Is_Static_Subtype calls to Is_OK_Static_Subtype. * sem_eval.ads: Add comments to section on Is_Static_Expression/Raises_Constraint_Error (Is_OK_Static_Range): Add clarifying comments (Is_Static_Range): Moved to body (Is_Statically_Unevaluated): New function. * sem_util.ads, sem_util.adb (Is_Preelaborable_Expression): Change Is_Static_Range to Is_OK_Static_Range. * sinfo.ads: Additional commments for Is_Static_Expression noting that clients should almost always use Is_OK_Static_Expression instead. Many other changes throughout front end units to obey this rule. * tbuild.ads, tbuild.adb (New_Occurrence_Of): Set Is_Static_Expression for enumeration literal. * exp_ch5.adb, sem_intr.adb, sem_ch5.adb, exp_attr.adb, exp_ch9.adb, lib-writ.adb, sem_ch9.adb, einfo.ads, checks.adb, checks.ads, sem_prag.adb, sem_ch12.adb, freeze.adb, sem_res.adb, exp_ch4.adb, exp_ch6.adb, sem_ch4.adb, sem_ch6.adb, exp_aggr.adb, sem_cat.adb: Replace all occurrences of Is_Static_Expression by Is_OK_Static_Expression. From-SVN: r213159
Diffstat (limited to 'gcc/ada/checks.adb')
-rw-r--r--gcc/ada/checks.adb31
1 files changed, 24 insertions, 7 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index d055306..d875cb5 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -5914,7 +5914,7 @@ package body Checks is
-- First special case, if the source type is already within the range
-- of the target type, then no check is needed (probably we should have
-- stopped Do_Range_Check from being set in the first place, but better
- -- late than never in preventing junk code.
+ -- late than never in preventing junk code and junk flag settings.
if In_Subrange_Of (Source_Type, Target_Type)
@@ -5933,13 +5933,30 @@ package body Checks is
and then not
(Is_Floating_Point_Type (Source_Type) and Check_Float_Overflow)
then
+ Set_Do_Range_Check (N, False);
return;
end if;
- -- We need a check, so force evaluation of the node, so that it does
- -- not get evaluated twice (once for the check, once for the actual
- -- reference). Such a double evaluation is always a potential source
- -- of inefficiency, and is functionally incorrect in the volatile case.
+ -- Here a check is needed. If the expander is not active, or if we are
+ -- in GNATProve mode, then simply set the Do_Range_Check flag and we
+ -- are done. In both these cases, we just want to see the range check
+ -- flag set, we do not want to generate the explicit range check code.
+
+ if GNATprove_Mode or else not Expander_Active then
+ Set_Do_Range_Check (N, True);
+ return;
+ end if;
+
+ -- Here we will generate an explicit range check, so we don't want to
+ -- set the Do_Range check flag, since the range check is taken care of
+ -- by the code we will generate.
+
+ Set_Do_Range_Check (N, False);
+
+ -- Force evaluation of the node, so that it does not get evaluated twice
+ -- (once for the check, once for the actual reference). Such a double
+ -- evaluation is always a potential source of inefficiency, and is
+ -- functionally incorrect in the volatile case.
if not Is_Entity_Name (N) or else Treat_As_Volatile (Entity (N)) then
Force_Evaluation (N);
@@ -6876,7 +6893,7 @@ package body Checks is
--------------------------
procedure Install_Static_Check (R_Cno : Node_Id; Loc : Source_Ptr) is
- Stat : constant Boolean := Is_Static_Expression (R_Cno);
+ Stat : constant Boolean := Is_OK_Static_Expression (R_Cno);
Typ : constant Entity_Id := Etype (R_Cno);
begin
@@ -7148,7 +7165,7 @@ package body Checks is
if Lo = No_Uint or else Hi = No_Uint then
return False;
- elsif Is_Static_Subtype (Etype (N)) then
+ elsif Is_OK_Static_Subtype (Etype (N)) then
return Lo >= Expr_Value (Type_Low_Bound (Rtyp))
and then
Hi <= Expr_Value (Type_High_Bound (Rtyp));