package body Outer is package Inner is function Foo return Integer; end Inner; package body Inner is V : Integer; -- V is visible within the body of -- Inner, e.g. to Foo function Foo return Integer is . . . end Inner; function Foo renames Inner.Foo; end Outer;
...gives you what you want. Here, Inner exists just to hide V. If you added more things to Inner, they could also see V; this would then be wider visibility than a function static variable.
If you don't care about hiding V to other things in the body of Outer, you can dispense with Inner (and the rename-as-body) altogether:
package body Outer is V : Integer; function Foo return Integer is . . . end Foo; end Outer;