diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2018-08-21 14:44:30 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-08-21 14:44:30 +0000 |
commit | b7e875ce96282a9c4ecc6cfd4f043c1039e5b7e3 (patch) | |
tree | a9dfcb7a1ec4ecb3fe41a5b2e8d84f2d56024cef /gcc/ada/lib-xref-spark_specific.adb | |
parent | d40800cfe589cf55e074ed151c7a607d5680997a (diff) | |
download | gcc-b7e875ce96282a9c4ecc6cfd4f043c1039e5b7e3.zip gcc-b7e875ce96282a9c4ecc6cfd4f043c1039e5b7e3.tar.gz gcc-b7e875ce96282a9c4ecc6cfd4f043c1039e5b7e3.tar.bz2 |
[Ada] Handle pragmas that come from aspects for GNATprove
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
Diffstat (limited to 'gcc/ada/lib-xref-spark_specific.adb')
-rw-r--r-- | gcc/ada/lib-xref-spark_specific.adb | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/ada/lib-xref-spark_specific.adb b/gcc/ada/lib-xref-spark_specific.adb index 0ce834a..00fe71a 100644 --- a/gcc/ada/lib-xref-spark_specific.adb +++ b/gcc/ada/lib-xref-spark_specific.adb @@ -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 |