Symbol lookup rules and imports
H. S. Teoh via Digitalmars-d
digitalmars-d at puremagic.com
Thu Dec 4 16:04:09 PST 2014
On Fri, Dec 05, 2014 at 12:25:49AM +0100, Rainer Schuetze via Digitalmars-d wrote:
>
>
> On 02.12.2014 23:00, H. S. Teoh via Digitalmars-d wrote:
> >4) This isn't the end of the story. There's also this lovely bug:
> >
> > https://issues.dlang.org/show_bug.cgi?id=1238
> >
> >which, as its number should tell you, has been around for a LONG
> >time. Executive summary:
> >
> > // mymod.d
> > module mymod;
> > private int impl;
> >
> > // main.d
> > module main;
> > import mymod;
> >
> > void impl() { ... }
> >
> > void main() {
> > impl(); // Error: main.impl conflicts with mymod.impl (WAT?)
> > }
>
> This compiles as expected. I guess you rather mean to import impl from
> two modules, one with a public impl, the other with a private impl. I
> don't think this belongs to the same set of issues as the other
> examples (though I agree private symbols from imports should not be
> considered in overload sets).
Sorry, poor example. Here's a tested example that produces an error:
// mod.d
module mod;
private struct S {
}
// main.d
module main;
struct S {
float x;
int y;
}
void main() {
import mod;
S s;
}
Compiler output:
/tmp/test.d(10): Error: ScopeDsymbol main.__anonymous.__anonymous struct mod.S is private
> Here is another bad example of local import symbol hijacking:
[...]
My favorite variation on your example:
import std.stdio;
void say(string text) {
import std.conv;
writeln(text);
}
void main() {
say("Hello world");
}
prints an empty line. :-P Commenting out the `import std.conv;` line
fixes the problem.
T
--
"A man's wife has more power over him than the state has." -- Ralph Emerson
More information about the Digitalmars-d
mailing list