<div dir="ltr">2013/5/19 Rainer Schuetze <span dir="ltr"><<a href="mailto:r.sagitario@gmx.de" target="_blank">r.sagitario@gmx.de</a>></span><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="im">On 18.05.2013 21:51, Walter Bright wrote:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I agree that it is changing behavior, and should be properly documented.<br>
However, I also believe it is correct behavior and fixed a bug.<br>
<br>
It's *always* true that when you change a base class, you affect the<br>
derived classes.<br>
</blockquote>
<br></div>
I think the new behaviour is consistent with symbol lookup rules, but I'm not so sure about import rules. The actual case that triggered the issue was with the base class in a different file. Usually non-public imports in a module don't have an effect on another module that imports the module. In this case it has.<br>

<br>
Actually, I can live with it, but I cannot see a reasonable use case for the new behaviour. My rule of thumb would be to not use local import in classes. Otherwise all imported symbols are treated as static members with respect to lookup, hiding global functions or variables in derived classes.</blockquote>
<div><br></div><div style>Hmm, in module level, import declaration will add name lookup path _in private_.</div><div style><br></div><div style>module a;</div><div style>import std.algorithm;   // default is private</div>
<div style><br></div><div style>module b;</div><div style>import a;</div><div style>void main() {</div><div style>    [1,2,3].map!(a=>a);  // Error: no property 'map' for type 'int[]'</div><div style>}</div>
<div style><br></div><div style>But with current master, import declaration in base class member adds name lookup path _in public_.</div><div style><div>I had not recognize this behavior.<br></div><div><br></div></div><div style>
<div>class A {</div><div>    import std.algorithm;  // default is public!?</div><div>}</div><div>class B : A {</div><div>    void test() {</div><div>        auto r = [1,2,3].map!(a=>a);    // succeeds to compile</div><div>
    }</div><div>}</div><div><div>void main() {</div><div>    auto r = B.map!(a=>a)([1,2,3]);    // also succeeds to compile</div><div>}</div><div><br></div></div><div>I think this is inconsistent, and class case should be fixed.<br>
</div><div style><br></div><div style>Kenji Hara</div></div></div></div></div>