diff mbox series

[COMMITTED] ada: Enhance Is_Null_Range and Not_Null_Range predicates

Message ID 20230526073528.2067472-1-poulhies@adacore.com
State New
Headers show
Series [COMMITTED] ada: Enhance Is_Null_Range and Not_Null_Range predicates | expand

Commit Message

Marc Poulhiès May 26, 2023, 7:35 a.m. UTC
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(-)
diff mbox series

Patch

diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h
index 2d8f299903d..f283064c728 100644
--- a/gcc/ada/fe.h
+++ b/gcc/ada/fe.h
@@ -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: */
 
diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb
index 905e7ff55b7..4608b1b18c1 100644
--- a/gcc/ada/sem_eval.adb
+++ b/gcc/ada/sem_eval.adb
@@ -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;
 
    -------------
diff --git a/gcc/ada/sem_eval.ads b/gcc/ada/sem_eval.ads
index c2e2b4589b8..5cb97ba057d 100644
--- a/gcc/ada/sem_eval.ads
+++ b/gcc/ada/sem_eval.ads
@@ -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