Thread overview
Pacikage level access broken?
Apr 22, 2012
Era Scarecrow
Apr 22, 2012
Jonathan M Davis
Re: Package level access broken?
Apr 22, 2012
Era Scarecrow
Apr 23, 2012
simendsjo
Apr 23, 2012
Jacob Carlborg
Apr 23, 2012
Era Scarecrow
Apr 23, 2012
Jacob Carlborg
Apr 23, 2012
Jonathan M Davis
Apr 24, 2012
Timon Gehr
April 22, 2012
 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?
April 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
April 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=143

 Fun... 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.
April 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
April 23, 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.
April 23, 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:
>>   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

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.
April 23, 2012
On 2012-04-23 10:26, Era Scarecrow wrote:
> 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.

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
April 23, 2012
On Monday, April 23, 2012 13:42:36 Jacob Carlborg wrote:
> On 2012-04-23 10:26, Era Scarecrow wrote:
> > 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.
> 
> 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.

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 Davis
April 24, 2012
On 04/23/2012 07:43 PM, Jonathan M Davis wrote:
> On Monday, April 23, 2012 13:42:36 Jacob Carlborg wrote:
>> On 2012-04-23 10:26, Era Scarecrow wrote:
>>> 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.
>>
>> 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.
>
> 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 Davis

The same holds for the default base class access.