On Sun, Mar 15, 2009 at 7:53 PM, Daniel Keep <[email protected]> wrote: > > > Jarrett Billingsley wrote: >> On Sun, Mar 15, 2009 at 5:55 PM, Jeremie Pelletier <[email protected]> >> wrote: >>> I don't know if it's really a bug, but the package protection attribute >>> seems to have a different semantic in the current packages than in nested >>> packages. >>> >>> For example, say you have the module test which declares the following: >>> --- >>> module test.Foo; >>> >>> package uint myVar; >>> package class MyClass {} >>> >>> package void MyFunc(); >>> >>> class Foo { >>> package void MyFoo(); >>> } >>> --- >>> >>> All declarations are accessible from any module in the test package, but if >>> you try and access them from a child package, say test.somepackage.Foo, >>> then only myVar and MyClass are accessible, both MyFunc and Foo.MyFoo says >>> they aren't accessible from test.somepackage.Foo. >>> >>> I'm using the latest DMD version 2. >>> >> >> http://d.puremagic.com/issues/show_bug.cgi?id=2529 >> >> Feel free to comment or vote. > > A quick poke in the source code reveals a hasPackageAccess function in > access.c. Haven't tried this, but maybe the attached patch (made > against the 1.041 release) will get the desired behaviour; I just > quickly changed it to search not just the scope's package, but also its > ancestors. > > -- Daniel > > > > --- access.c 2009-03-05 01:56:46.000000000 +1100 > +++ access.c 2009-03-16 10:47:56.187500000 +1100 > @@ -305,12 +305,21 @@ > printf("\tthis is in package '%s'\n", s->toChars()); > #endif > > - if (s && s == sc->module->parent) > + if (s) > { > -#if LOG > - printf("\ts is in same package as sc\n"); > -#endif > - return 1; > + Dsymbol scp = sc->module->parent; > + for (Dsymbol scp = sc->module->parent; > + scp && scp->isPackage() && !scp->isModule(); > + scp = scp->parent) > + { > + if (s && s == scp) > + { > +#if LOG > + printf("\ts is in same package as or ancestor package of > sc\n"); > +#endif > + return 1; > + } > + } > }
Oh! I suppose we can now.. give this a shot, and recompile the thing! :D
