digitalmars.D.learn - Pacikage level access broken?
- Era Scarecrow (71/71) Apr 22 2012 I think I have a misunderstanding of how 'package' is suppose to
- Jonathan M Davis (8/11) Apr 22 2012 1. Package access is _very_ broken:
- Era Scarecrow (7/10) Apr 22 2012 Fun... So it's not just me... Guess for the 1-2 places I 'll
- simendsjo (17/31) Apr 23 2012 These things comes up quite often: "shared is broken", "alias this is
- Jacob Carlborg (4/18) Apr 22 2012 "public" is the default access level.
- Era Scarecrow (4/5) Apr 23 2012 So it is... That explains why the tests came out backwards on
- Jacob Carlborg (6/11) Apr 23 2012 I think so. If you use "class" it's private by default. If use "struct"
- Jonathan M Davis (4/15) Apr 23 2012 That's correct. In C++, struct and class are identical except that a cla...
- Timon Gehr (2/17) Apr 24 2012 The same holds for the default base class access.
I think I have a misunderstanding of how 'package' is suppose to work. How I understand it, you will give access to the directory, unlike private which will hide it outside of the same file. This problem comes up since a struct is declared inside a package (and even instantiated), however access to it is lacking. Here's my two sources. Using DMD v2.059 (Win32) --- t1.d module t1; import std.stdio; class Priv { //private by default int i; struct S { int s_i; } S s; } class Pack { package: int i; struct S { int s_i; } S s; } void test() { auto pr = new Priv(); auto pa = new Pack(); writefln("pr.i: %s\npr.s_i: %s\n", pr.i, pr.s.s_i); writefln("pa.i: %s\npa.s_i: %s\n", pa.i, pa.s.s_i); //okay, module level. pr.i = 10; pa.i = 10; pr.s.s_i = 10; pa.s.s_i = 10; } --- t2.d module t2; import std.stdio; import t1; //non-unittest void test(){ auto pr = new Priv(); auto pa = new Pack(); writefln("pr.i: %s\npr.s_i: %s\n", pr.i, pr.s.s_i); //should err, private writefln("pa.i: %s\npa.s_i: %s\n", pa.i, pa.s.s_i); //should pass? (Package level) //should fail, private pr.i = 10; pr.s.s_i = 10; //should pass, package pa.i = 10; pa.s.s_i = 10; } --- Errors t2.d(12): Error: undefined identifier 'i', did you mean 'import t1'? t2.d(12): Error: undefined identifier 's', did you mean 'import t1'? t2.d(19): Error: undefined identifier 'i', did you mean 'import t1'? t2.d(20): Error: undefined identifier 's', did you mean 'import t1'? The errors present refer to the 'pack' class, so it seems backwards. Did I miss something?
Apr 22 2012
On Monday, April 23, 2012 01:21:21 Era Scarecrow wrote:I think I have a misunderstanding of how 'package' is suppose to work. How I understand it, you will give access to the directory, unlike private which will hide it outside of the same file.1. Package access is _very_ broken: http://d.puremagic.com/issues/show_bug.cgi?id=143 2. I'm not sure that your code is even using package properly. Note that t1 and t2 arguably don't _have_ a package. They're not pkg.t1 and pkg.t2, they're just straight t1 and t2. So, even if package were working properly, I'm not sure that t1 and t2 would ever be considered to be in the same package. - Jonathan M Davis
Apr 22 2012
On Sunday, 22 April 2012 at 23:32:40 UTC, Jonathan M Davis wrote:1. Package access is _very_ broken: http://d.puremagic.com/issues/show_bug.cgi?id=143Fun... So it's not just me... Guess for the 1-2 places I 'll need package level access instead I gotta either do public or get some getters (Was just hoping to ignore that).2. I'm not sure that your code is even using package properly.No, they may not be in a package specifically; I but with them being directory/hierarchy they should be in the package group. Anyways, thanks for the quick and easy response.
Apr 22 2012
On Mon, 23 Apr 2012 01:32:25 +0200, Jonathan M Davis <jmdavisProg gmx.com> wrote:On Monday, April 23, 2012 01:21:21 Era Scarecrow wrote:These things comes up quite often: "shared is broken", "alias this is broken", "package is broken", "scope is broken", "X is broken", "Y is broken". I believe this should be addressed in a very visible place to avoid getting the impression that everything in D is "horribly broken". The frontpage on the wiki could list incomplete features that you should steer away to avoid hitting compiler bugs. http://prowiki.org/wiki4d/wiki.cgi?LanguageDevel#DMDCompilerStability includes some of these issues, but it's hidden and doesn't show it in an easy to grasp way for beginners. It shouldn't be necessary to be following the development of D intimately to know what features are implemented and considered production ready. I think it gives a better impression to list the features still under development than to let (new) users hit bugs within the first hours (read: minutes) of hacking around.I think I have a misunderstanding of how 'package' is suppose to work. How I understand it, you will give access to the directory, unlike private which will hide it outside of the same file.1. Package access is _very_ broken: http://d.puremagic.com/issues/show_bug.cgi?id=143 2. I'm not sure that your code is even using package properly. Note that t1 and t2 arguably don't _have_ a package. They're not pkg.t1 and pkg.t2, they're just straight t1 and t2. So, even if package were working properly, I'm not sure that t1 and t2 would ever be considered to be in the same package. - Jonathan M Davis
Apr 23 2012
On 2012-04-23 01:21, Era Scarecrow wrote:I think I have a misunderstanding of how 'package' is suppose to work. How I understand it, you will give access to the directory, unlike private which will hide it outside of the same file. This problem comes up since a struct is declared inside a package (and even instantiated), however access to it is lacking. Here's my two sources. Using DMD v2.059 (Win32) --- t1.d module t1; import std.stdio; class Priv { //private by default int i; struct S { int s_i; }"public" is the default access level. -- /Jacob Carlborg
Apr 22 2012
On Monday, 23 April 2012 at 06:19:12 UTC, Jacob Carlborg wrote:"public" is the default access level.So it is... That explains why the tests came out backwards on the results.... Wasn't it private by default in C++? I honestly don't know sometimes.
Apr 23 2012
On 2012-04-23 10:26, Era Scarecrow wrote:On Monday, 23 April 2012 at 06:19:12 UTC, Jacob Carlborg wrote:I think so. If you use "class" it's private by default. If use "struct" it's public by default. That's basically the only difference between "class" and "struct" in C++, if I recall correctly. -- /Jacob Carlborg"public" is the default access level.So it is... That explains why the tests came out backwards on the results.... Wasn't it private by default in C++? I honestly don't know sometimes.
Apr 23 2012
On Monday, April 23, 2012 13:42:36 Jacob Carlborg wrote:On 2012-04-23 10:26, Era Scarecrow wrote:That's correct. In C++, struct and class are identical except that a class' members are private by default and a struct's members are public by default. - Jonathan M DavisOn Monday, 23 April 2012 at 06:19:12 UTC, Jacob Carlborg wrote:I think so. If you use "class" it's private by default. If use "struct" it's public by default. That's basically the only difference between "class" and "struct" in C++, if I recall correctly."public" is the default access level.So it is... That explains why the tests came out backwards on the results.... Wasn't it private by default in C++? I honestly don't know sometimes.
Apr 23 2012
On 04/23/2012 07:43 PM, Jonathan M Davis wrote:On Monday, April 23, 2012 13:42:36 Jacob Carlborg wrote:The same holds for the default base class access.On 2012-04-23 10:26, Era Scarecrow wrote:That's correct. In C++, struct and class are identical except that a class' members are private by default and a struct's members are public by default. - Jonathan M DavisOn Monday, 23 April 2012 at 06:19:12 UTC, Jacob Carlborg wrote:I think so. If you use "class" it's private by default. If use "struct" it's public by default. That's basically the only difference between "class" and "struct" in C++, if I recall correctly."public" is the default access level.So it is... That explains why the tests came out backwards on the results.... Wasn't it private by default in C++? I honestly don't know sometimes.
Apr 24 2012