[gcc(refs/users/aoliva/heads/testme)] [Ada] Add range check for GNATprove on 'Pos to Long_Integer conversion

Alexandre Oliva aoliva@gcc.gnu.org
Fri Jul 31 15:11:04 GMT 2020


https://gcc.gnu.org/g:df81923f6d805ebf390e116b1902d0c8ec93c477

commit df81923f6d805ebf390e116b1902d0c8ec93c477
Author: Piotr Trojanek <trojanek@adacore.com>
Date:   Fri Jun 12 19:06:51 2020 +0200

    [Ada] Add range check for GNATprove on 'Pos to Long_Integer conversion
    
    gcc/ada/
    
            * exp_spark.adb (Expand_SPARK_N_Attribute_Reference) Extend
            existing workaround to 'Pos.

Diff:
---
 gcc/ada/exp_spark.adb | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/gcc/ada/exp_spark.adb b/gcc/ada/exp_spark.adb
index 6454902f06b..b400268ac5b 100644
--- a/gcc/ada/exp_spark.adb
+++ b/gcc/ada/exp_spark.adb
@@ -400,13 +400,16 @@ package body Exp_SPARK is
          --  flag as the compiler assumes attributes always fit in this type.
          --  Since in SPARK_Mode we do not take Storage_Error into account, we
          --  cannot make this assumption and need to produce a check.
-         --  ??? It should be enough to add this check for attributes 'Length
-         --  and 'Range_Length when the type is as big as Long_Long_Integer.
+         --  ??? It should be enough to add this check for attributes
+         --  'Length, 'Range_Length and 'Pos when the type is as big
+         --  as Long_Long_Integer.
 
          declare
             Typ : Entity_Id;
          begin
-            if Attr_Id = Attribute_Range_Length then
+            if Attr_Id = Attribute_Range_Length
+              or else Attr_Id = Attribute_Pos
+            then
                Typ := Etype (Prefix (N));
 
             elsif Attr_Id = Attribute_Length then
@@ -421,6 +424,9 @@ package body Exp_SPARK is
             if Present (Typ)
               and then RM_Size (Typ) = RM_Size (Standard_Long_Long_Integer)
             then
+               --  ??? This should rather be a range check, but this would
+               --  crash GNATprove which somehow recovers the proper kind
+               --  of check anyway.
                Set_Do_Overflow_Check (N);
             end if;
          end;


More information about the Gcc-cvs mailing list