Weird (buggy) behaviour of "protected static" in classes

Arafel er.krali at gmail.com
Tue Aug 28 15:33:15 UTC 2018


Hi all,

I have noticed that "protected static" doesn't work currently with 
classes. In my case, I wanted to use "static immutable", but I have 
tried regular static members and methods, and the same issue happens. 
However, the puzzling part is that protected enums (which are a valid 
workaround for me, perhaps not for others) work.

The spec [1] is a bit unclear about how that's supposed to work, 
although I tend to thing that it allows them:

---
protected only applies inside classes (and templates as they can be 
mixed in) and means that a symbol can only be seen by members of the 
same module, or by a derived class. If accessing a protected instance 
member through a derived class member function, that member can only be 
accessed for the object instance which can be implicitly cast to the 
same type as ‘this’. protected module members are illegal.
---

Is that a bug? I have to say, I think so, since it can also affect other 
symbols that are defined... for *grandchild* classes! You can see the 
multiple problems in the snippet [1]:

```dio.d
module dio;

public class A {
     public enum int a = 1;
     protected enum int b = 2;
     private enum int c = 3;
     public static immutable int d = 4;
     protected static immutable int e = 5;
     private static immutable int f = 6;

     protected static struct S { }
}

public class A2 {
     protected static struct S { }
}
```


```main.d
import dio;

class B : A {
     pragma(msg, "The value of A.a is: ", typeof(super).a);
     pragma(msg, "The value of A.b is: ", typeof(super).b);
     //pragma(msg, "The value of A.c is: ", typeof(super).c); // 
Expected failure
     pragma(msg, "The value of A.d is: ", typeof(super).d);
     pragma(msg, "The value of A.e is: ", typeof(super).e); // *BUG* 
Comment this line and *BOTH* errors will go away!!
     //pragma(msg, "The value of A.f is: ", typeof(super).f); // 
Expected failure

     S s;
}

class C : B {
     S s;
}

class B2 : A2 {
     S s;
}
class C2 : B2 {
     S s;
}

void main()
{
}
```

The most shocking thing is that it is C's access to A.S that gets 
affected, I think that must be a compiler bug. Still, it would be nice 
to confirm that "protected static" is supposed to work as intuitively 
expected.

Best,

A.

[1]: https://glot.io/snippets/f4a1b3x4sf


More information about the Digitalmars-d-learn mailing list