[Ada] Handle pragmas that come from aspects for GNATprove
authorPiotr Trojanek <trojanek@adacore.com>
Tue, 21 Aug 2018 14:44:30 +0000 (14:44 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 21 Aug 2018 14:44:30 +0000 (14:44 +0000)
In GNATprove we appear to abuse a routine related to cross-references and
expect it to deliver exact results, which is not what it was designed for.

This patch is a temporary solution to avoid crashes in GNATprove; it doesn't
affect the frontend or other backends, because this code is used exclusively
by GNATprove (it is located in the frontend for technical reasons). No tests
provided.

2018-08-21  Piotr Trojanek  <trojanek@adacore.com>

gcc/ada/

* lib-xref.ads, lib-xref-spark_specific.adb
(Enclosing_Subprogram_Or_Library_Package): Now roughtly works
for pragmas that come from aspect specifications.

From-SVN: r263707

gcc/ada/ChangeLog
gcc/ada/lib-xref-spark_specific.adb
gcc/ada/lib-xref.ads

index 9bbcc9d8f96fa240056efa910c2370a978a56360..dcbec9b9320c818165f53969555e6370c4d400ea 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-21  Piotr Trojanek  <trojanek@adacore.com>
+
+       * lib-xref.ads, lib-xref-spark_specific.adb
+       (Enclosing_Subprogram_Or_Library_Package): Now roughtly works
+       for pragmas that come from aspect specifications.
+
 2018-08-21  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * sa_messages.ads, sa_messages.adb: New source files.
index 0ce834a616bb5be71eea33802bfbabea8e71942c..00fe71aecf00fdbd6a3b6f7477b4a22f7d554651 100644 (file)
@@ -228,7 +228,17 @@ package body SPARK_Specific is
                end loop;
 
                if Nkind (Context) = N_Pragma then
-                  Context := Parent (Context);
+                  --  When used for cross-references then aspects might not be
+                  --  yet linked to pragmas; when used for AST navigation in
+                  --  GNATprove this routine is expected to follow those links.
+
+                  if From_Aspect_Specification (Context) then
+                     Context := Corresponding_Aspect (Context);
+                     pragma Assert (Nkind (Context) = N_Aspect_Specification);
+                     Context := Entity (Context);
+                  else
+                     Context := Parent (Context);
+                  end if;
                end if;
 
             when N_Entry_Body
index 5c7a08696d68e022805547f8e4431bcf1f0e70e1..903e64e45ec18ec679e2f24d1737a39e73296d7d 100644 (file)
@@ -632,6 +632,11 @@ package Lib.Xref is
       --  Return the closest enclosing subprogram or library-level package.
       --  This ensures that GNATprove can distinguish local variables from
       --  global variables.
+      --
+      --  ??? This routine should only be used for processing related to
+      --  cross-references, where it might return wrong result but must avoid
+      --  crashes on ill-formed source code. It is wrong to use it where exact
+      --  result is needed.
 
       procedure Generate_Dereference
         (N   : Node_Id;