[Issue 21908] New: protected struct static opCall from mixin template not available from child class

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat May 8 13:07:54 UTC 2021


https://issues.dlang.org/show_bug.cgi?id=21908

          Issue ID: 21908
           Summary: protected struct static opCall from mixin template not
                    available from child class
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: destructionator at gmail.com

file mix2.d:

---
class C {
        mixin Signal foo;

        protected struct protstruct {}
}

mixin template Signal() {
        final:
        protected struct emit {
                static void opCall() {}
        };
        public struct connect {
                static void opCall() {}
        };
}
---

file mix.d:

---
import mix2;
void main() {
        auto d = new D;

        //d.foo.emit(); // correctly hidden because it is protected (though the
error message is not great, it isn't wrong)
        d.foo.connect(); // it is public so this works

        d.bar.emit(); // this is ok because it our same module
        d.bar.connect(); // again public so we're ok

        //C.protstruct not_available; // correctly hidden because it is
protected
}

class D : C {
        this() {
                // no trouble off the one here
                bar.emit();
                bar.connect();

                protstruct available; // protected works just fine as it should

                foo.emit actually_works; // the symbol isn't just hidden...

                foo.connect(); // public off the other one works ok
                // and BUG here
                foo.emit(); // but the protected one is not letting me call it
        }

        mixin Signal bar;
}
---


That foo.emit should be the same as the protstruct, but instead it says:

mix.d(27): Error: no property `emit` for type `void`


It shouldn't be saying "type void" at all, making me pretty sure this is a bug.
And it works if i do the static opCall thing on protstruct too - surely the
mixin template should behave the same way.

--


More information about the Digitalmars-d-bugs mailing list