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?

Reply via email to