[COMMITTED] ada: Enhance Is_Null_Range and Not_Null_Range predicates
Checks
Commit Message
From: Eric Botcazou <ebotcazou@adacore.com>
Both predicates bail out if the bounds of the range are not known at compile
time, whereas Compile_Time_Compare can deal with them in specific cases.
gcc/ada/
* sem_eval.ads (Is_Null_Range): Remove requirements of compile-time
known bounds and add WARNING line.
(Not_Null_Range): Remove requirements of compile-time known bounds.
* sem_eval.adb (Is_Null_Range): Fall back to Compile_Time_Compare.
(Not_Null_Range): Likewise.
* fe.h (Is_Null_Range): New predicate.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/fe.h | 2 ++
gcc/ada/sem_eval.adb | 8 +++++---
gcc/ada/sem_eval.ads | 10 ++++------
3 files changed, 11 insertions(+), 9 deletions(-)
@@ -300,8 +300,10 @@ extern Boolean Is_Derived_Type (Entity_Id);
/* sem_eval: */
#define Compile_Time_Known_Value sem_eval__compile_time_known_value
+#define Is_Null_Range sem_eval__is_null_range
extern Boolean Compile_Time_Known_Value (Node_Id);
+extern Boolean Is_Null_Range (Node_Id, Node_Id);
/* sem_util: */
@@ -5416,8 +5416,9 @@ package body Sem_Eval is
return Expr_Value_R (Lo) > Expr_Value_R (Hi);
end if;
end;
+
else
- return False;
+ return Compile_Time_Compare (Lo, Hi, Assume_Valid => False) = GT;
end if;
end Is_Null_Range;
@@ -6028,10 +6029,11 @@ package body Sem_Eval is
return Expr_Value_R (Lo) <= Expr_Value_R (Hi);
end if;
end;
+
else
- return False;
+ return
+ Compile_Time_Compare (Lo, Hi, Assume_Valid => False) in Compare_LE;
end if;
-
end Not_Null_Range;
-------------
@@ -409,9 +409,9 @@ package Sem_Eval is
-- an entity with Is_Known_Valid set, or Assume_No_Invalid_Values is True.
function Is_Null_Range (Lo : Node_Id; Hi : Node_Id) return Boolean;
- -- Returns True if it can guarantee that Lo .. Hi is a null range. If it
- -- cannot (because the value of Lo or Hi is not known at compile time) then
- -- it returns False.
+ -- Returns True if it can guarantee that Lo .. Hi is a null range
+
+ -- WARNING: There is a matching C declaration of this subprogram in fe.h
function Is_OK_Static_Expression (N : Node_Id) return Boolean;
-- An OK static expression is one that is static in the RM definition sense
@@ -485,9 +485,7 @@ package Sem_Eval is
-- per RM 4.9(38/2). N is a node only used to post warnings.
function Not_Null_Range (Lo : Node_Id; Hi : Node_Id) return Boolean;
- -- Returns True if it can guarantee that Lo .. Hi is not a null range. If
- -- it cannot (because the value of Lo or Hi is not known at compile time)
- -- then it returns False.
+ -- Returns True if it can guarantee that Lo .. Hi is not a null range
function Predicates_Compatible (T1, T2 : Entity_Id) return Boolean;
-- In Ada 2012, subtypes are statically compatible if the predicates are