From 63b5225b44626f58396430f11b1592f3b7f155f4 Mon Sep 17 00:00:00 2001 From: Yannick Moy Date: Wed, 21 May 2014 12:56:05 +0000 Subject: [PATCH] 2014-05-21 Yannick Moy * lib-xref-spark_specific.adb, lib-xref.ads, lib-xref.adb (Enclosing_Subprogram_Or_Package): Only return a library-level package. From-SVN: r210700 --- gcc/ada/ChangeLog | 6 +++++ gcc/ada/lib-xref-spark_specific.adb | 39 ++++++++++++++++++++--------- gcc/ada/lib-xref.adb | 8 +++--- gcc/ada/lib-xref.ads | 10 +++++--- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 9c47f98ad7d0..0091301dacfb 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2014-05-21 Yannick Moy + + * lib-xref-spark_specific.adb, lib-xref.ads, lib-xref.adb + (Enclosing_Subprogram_Or_Package): Only return a library-level + package. + 2014-05-21 Javier Miranda * sem_ch3.adb (Build_Derived_Record_Type): Initialize Parent_Base diff --git a/gcc/ada/lib-xref-spark_specific.adb b/gcc/ada/lib-xref-spark_specific.adb index 0b32aada218b..aea8b2cfee88 100644 --- a/gcc/ada/lib-xref-spark_specific.adb +++ b/gcc/ada/lib-xref-spark_specific.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2011-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 2011-2014, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -23,10 +23,9 @@ -- -- ------------------------------------------------------------------------------ -with SPARK_Xrefs; use SPARK_Xrefs; -with Einfo; use Einfo; -with Nmake; use Nmake; -with Put_SPARK_Xrefs; +with SPARK_Xrefs; use SPARK_Xrefs; +with Einfo; use Einfo; +with Nmake; use Nmake; with GNAT.HTable; @@ -972,7 +971,9 @@ package body SPARK_Specific is -- Enclosing_Subprogram_Or_Package -- ------------------------------------- - function Enclosing_Subprogram_Or_Package (N : Node_Id) return Entity_Id is + function Enclosing_Subprogram_Or_Library_Package + (N : Node_Id) return Entity_Id + is Result : Entity_Id; begin @@ -990,12 +991,26 @@ package body SPARK_Specific is while Present (Result) loop case Nkind (Result) is when N_Package_Specification => - Result := Defining_Unit_Name (Result); - exit; + + -- Only return a library-level package + + if Is_Library_Level_Entity (Defining_Entity (Result)) then + Result := Defining_Entity (Result); + exit; + else + Result := Parent (Result); + end if; when N_Package_Body => - Result := Defining_Unit_Name (Result); - exit; + + -- Only return a library-level package + + if Is_Library_Level_Entity (Defining_Entity (Result)) then + Result := Defining_Entity (Result); + exit; + else + Result := Parent (Result); + end if; when N_Subprogram_Specification => Result := Defining_Unit_Name (Result); @@ -1045,7 +1060,7 @@ package body SPARK_Specific is end if; return Result; - end Enclosing_Subprogram_Or_Package; + end Enclosing_Subprogram_Or_Library_Package; ----------------- -- Entity_Hash -- @@ -1107,7 +1122,7 @@ package body SPARK_Specific is Create_Heap; end if; - Ref_Scope := Enclosing_Subprogram_Or_Package (N); + Ref_Scope := Enclosing_Subprogram_Or_Library_Package (N); Deref.Ent := Heap; Deref.Loc := Loc; diff --git a/gcc/ada/lib-xref.adb b/gcc/ada/lib-xref.adb index 28c5dbbd3939..ed1138927cf3 100644 --- a/gcc/ada/lib-xref.adb +++ b/gcc/ada/lib-xref.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1998-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 1998-2014, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -1029,8 +1029,10 @@ package body Lib.Xref is Ref := Sloc (Nod); Def := Sloc (Ent); - Ref_Scope := SPARK_Specific.Enclosing_Subprogram_Or_Package (Nod); - Ent_Scope := SPARK_Specific.Enclosing_Subprogram_Or_Package (Ent); + Ref_Scope := + SPARK_Specific.Enclosing_Subprogram_Or_Library_Package (Nod); + Ent_Scope := + SPARK_Specific.Enclosing_Subprogram_Or_Library_Package (Ent); -- Since we are reaching through renamings in SPARK mode, we may -- end up with standard constants. Ignore those. diff --git a/gcc/ada/lib-xref.ads b/gcc/ada/lib-xref.ads index 7f397a868a5f..17733a0c9303 100644 --- a/gcc/ada/lib-xref.ads +++ b/gcc/ada/lib-xref.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1998-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 1998-2014, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -624,8 +624,12 @@ package Lib.Xref is package SPARK_Specific is - function Enclosing_Subprogram_Or_Package (N : Node_Id) return Entity_Id; - -- Return the closest enclosing subprogram of package + function Enclosing_Subprogram_Or_Library_Package + (N : Node_Id) return Entity_Id; + -- Return the closest enclosing subprogram of package. Only return a + -- library level package. If the package is enclosed in a subprogram, + -- return the subprogram. This ensures that GNATprove can distinguish + -- local variables from global variables. procedure Generate_Dereference (N : Node_Id; -- 2.47.2