[Ada] Expand type of static expressions in GNATprove mode
authorYannick Moy <moy@adacore.com>
Tue, 9 Jul 2019 07:53:55 +0000 (07:53 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 9 Jul 2019 07:53:55 +0000 (07:53 +0000)
In the special mode for GNATprove, expand the type of static expressions
like done during compilation, to both get suitable legality checks and
increase the precision of the formal analysis.

There is no impact on compilation.

2019-07-09  Yannick Moy  <moy@adacore.com>

gcc/ada/

* exp_util.adb (Expand_Subtype_From_Expr): Still expand the type
of static expressions in GNATprove_Mode.
* sem_ch3.adb (Analyze_Object_Declaration): Remove obsolete
special case for GNATprove_Mode.

From-SVN: r273273

gcc/ada/ChangeLog
gcc/ada/exp_util.adb
gcc/ada/sem_ch3.adb

index ed8dfdad0620d985e2d5c5bdae153bdd7db758b1..8c0708271dfad509e8bb00e42f0dc20e5e0c8306 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-09  Yannick Moy  <moy@adacore.com>
+
+       * exp_util.adb (Expand_Subtype_From_Expr): Still expand the type
+       of static expressions in GNATprove_Mode.
+       * sem_ch3.adb (Analyze_Object_Declaration): Remove obsolete
+       special case for GNATprove_Mode.
+
 2019-07-09  Piotr Trojanek  <trojanek@adacore.com>
 
        * doc/gnat_rm/the_gnat_library.rst,
index 420609067c9cb96292e21229e7f397b512b37363..6f73ec3bc1fb962350131d16081a095f7fad7777 100644 (file)
@@ -5067,9 +5067,15 @@ package body Exp_Util is
       --  may be constants that depend on the bounds of a string literal, both
       --  standard string types and more generally arrays of characters.
 
-      --  In GNATprove mode, these extra subtypes are not needed
-
-      if GNATprove_Mode then
+      --  In GNATprove mode, these extra subtypes are not needed, unless Exp is
+      --  a static expression. In that case, the subtype will be constrained
+      --  while the original type might be unconstrained, so expanding the type
+      --  is necessary both for passing legality checks in GNAT and for precise
+      --  analysis in GNATprove.
+
+      if GNATprove_Mode
+        and then not Is_Static_Expression (Exp)
+      then
          return;
       end if;
 
index ec8626611208879a7151cca7107b1f324bcfb5d8..38fab902df8093d3c7d1d25c80d6d5e802c857f7 100644 (file)
@@ -4592,14 +4592,6 @@ package body Sem_Ch3 is
             elsif Is_Interface (T) then
                null;
 
-            --  In GNATprove mode, Expand_Subtype_From_Expr does nothing. Thus,
-            --  we should prevent the generation of another Itype with the
-            --  same name as the one already generated, or we end up with
-            --  two identical types in GNATprove.
-
-            elsif GNATprove_Mode then
-               null;
-
             --  If the type is an unchecked union, no subtype can be built from
             --  the expression. Rewrite declaration as a renaming, which the
             --  back-end can handle properly. This is a rather unusual case,