--------------------------------
procedure Analyze_Previous_Contracts (Body_Decl : Node_Id) is
- Body_Id : constant Entity_Id := Defining_Entity (Body_Decl);
- Par : Node_Id;
+ Body_Id : constant Entity_Id := Defining_Entity (Body_Decl);
+ Orig_Decl : constant Node_Id := Original_Node (Body_Decl);
+
+ Par : Node_Id;
begin
-- A body that is in the process of being inlined appears from source,
Freeze_Id => Defining_Entity (Body_Decl));
exit;
+
+ -- Do not look for an enclosing package body when the construct which
+ -- causes freezing is a body generated for an expression function and
+ -- it appears within a package spec. This ensures that the traversal
+ -- will not reach too far up the parent chain and attempt to freeze a
+ -- package body which should not be frozen.
+
+ -- package body Enclosing_Body
+ -- with Refined_State => (State => Var)
+ -- is
+ -- package Nested is
+ -- type Some_Type is ...;
+ -- function Cause_Freezing return ...;
+ -- private
+ -- function Cause_Freezing is (...);
+ -- end Nested;
+ --
+ -- Var : Nested.Some_Type;
+
+ elsif Nkind (Par) = N_Package_Declaration
+ and then Nkind (Orig_Decl) = N_Expression_Function
+ then
+ exit;
end if;
Par := Parent (Par);
-- --
-- S p e c --
-- --
--- Copyright (C) 2015, Free Software Foundation, Inc. --
+-- Copyright (C) 2015-2016, 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- --
procedure Analyze_Previous_Contracts (Body_Decl : Node_Id);
-- Analyze the contracts of all source constructs found in the declarative
-- list which contains entry, package, protected, subprogram, or task body
- -- denoted by Body_Decl. The analysis stops once Body_Decl is reached.
+ -- denoted by Body_Decl. The analysis stops once Body_Decl is reached. In
+ -- addition, analyze the contract of the nearest enclosing package body.
procedure Analyze_Protected_Contract (Prot_Id : Entity_Id);
-- Analyze all delayed pragmas chained on the contract of protected unit