+2014-05-21 Yannick Moy <moy@adacore.com>
+
+ * 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 <miranda@adacore.com>
* sem_ch3.adb (Build_Derived_Record_Type): Initialize Parent_Base
-- --
-- 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- --
-- --
------------------------------------------------------------------------------
-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;
-- 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
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);
end if;
return Result;
- end Enclosing_Subprogram_Or_Package;
+ end Enclosing_Subprogram_Or_Library_Package;
-----------------
-- Entity_Hash --
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;
-- --
-- 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- --
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.
-- --
-- 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- --
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;