On Tuesday, 2 December 2014 at 22:02:23 UTC, H. S. Teoh via Digitalmars-d wrote:
2) OK, so the conclusion is that unqualified scoped imports are
dangerous, right? Alright, let's see what happens when we use qualified
imports:

        // mod.d
        module mod;
        struct S {
                // Use a fully-qualified import.
                // We place it in the body of S because S's methods
                // repeatedly needs it -- after all, DRY is good, right?
                import std.format : format;

                void method1(string fmt) {
                        writeln(format(fmt, ... ));
                }

                void method2() {
                        auto s = format("abc %s def", ...);
                        ...
                }
        }

        // main.d
        module main;
        import mod; // we need the definition of S

        void format(S s) {
                ... /* do something with s */
        }

        void main() {
                S s;
                s.format(); // UFCS -- should call main.format(s), right?
        }

Wrong. That last line in main() actually calls std.format.format. Why? Because in mod.d, the `import std.format : format` declaration actually pulls in std.format.format into the symbol table of S, therefore, S.format now refers to std.format.format. This, therefore, hijacks the
intended call to main.format.

This is: https://issues.dlang.org/show_bug.cgi?id=13808

Surely this can't be intended behaviour? It seems its imported publically instead of privately, so that it gets "reexported" to outside users of the struct. If so, I don't think we should add workarounds to std.datetime or any other places where this could occur.

Reply via email to