[Ada] Further evaluation of type bounds in GNATprove mode
authorYannick Moy <moy@adacore.com>
Mon, 28 May 2018 08:52:53 +0000 (08:52 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 28 May 2018 08:52:53 +0000 (08:52 +0000)
Some static bounds of types are not recognized and evaluated as such in the
semantic analysis phase of the frontend, which leads to incomplete information
in GNATprove. Fix that in the GNATprove mode only, as this is not needed when
full expansion is used.

There is no impact on compilation.

2018-05-28  Yannick Moy  <moy@adacore.com>

gcc/ada/

* sem_res.adb (Resolve_Range): Re-resolve the low bound of a range in
GNATprove mode, as the order of resolution (low then high) means that
all the information is not available when resolving the low bound the
first time.

From-SVN: r260816

gcc/ada/ChangeLog
gcc/ada/sem_res.adb

index 41df33f78eb49611b65b26080964f2bc068cd55d..b1ccf573b06fdbe05591465615330bbeeed7df87 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-28  Yannick Moy  <moy@adacore.com>
+
+       * sem_res.adb (Resolve_Range): Re-resolve the low bound of a range in
+       GNATprove mode, as the order of resolution (low then high) means that
+       all the information is not available when resolving the low bound the
+       first time.
+
 2018-05-28  Eric Botcazou  <ebotcazou@adacore.com>
 
        * repinfo.adb (List_Array_Info): Start with an explicit blank line and
index d11296c9e57fb2ce0d86442c89b95455cdc9fe51..f0b77c1ba92094abf243f42e5f73477806ac8f1d 100644 (file)
@@ -9800,6 +9800,17 @@ package body Sem_Res is
       Resolve (L, Typ);
       Resolve (H, Base_Type (Typ));
 
+      --  Reanalyze the lower bound after both bounds have been analyzed, so
+      --  that the range is known to be static or not by now. This may trigger
+      --  more compile-time evaluation, which is useful for static analysis
+      --  with GNATprove. This is not needed for compilation or static analysis
+      --  with CodePeer, as full expansion does that evaluation then.
+
+      if GNATprove_Mode then
+         Set_Analyzed (L, False);
+         Resolve (L, Typ);
+      end if;
+
       --  Check for inappropriate range on unordered enumeration type
 
       if Bad_Unordered_Enumeration_Reference (N, Typ)