Bug 265 – Selective import from renamed import behaves strangely

Status
RESOLVED
Resolution
FIXED
Severity
minor
Priority
P3
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2006-07-22T08:11:00Z
Last change time
2014-02-15T13:21:08Z
Keywords
spec
Assigned to
bugzilla
Creator
matti.niemenmaa+dbugzilla
Blocks
677

Comments

Comment #0 by matti.niemenmaa+dbugzilla — 2006-07-22T08:11:29Z
import io = std.stdio : foo = writefln; void main() { //writefln("bar"); // doesn't work, good //std.stdio.foo("bar"); // doesn't work, good //std.stdio.writefln("bar"); // doesn't work, good foo("bar"); // works fine, but a renamed import should require a FQN according to the spec io.writefln("bar"); // works fine, but there shouldn't be a writefln in io, just a foo //io.foo("bar"); // doesn't work: undefined identifier module stdio.foo } -- The inline comments hopefully explain my view of the situation well enough. Essentially: the behaviour of the first three lines in main() is correct and that of the last three is incorrect. Only the last call, io.foo("bar"), should, in my opinion, compile. Or then the specification needs correcting. Issue 264 and this are both about combining different import methods in ways that apparently haven't been considered, and probably need to be explicitly allowed and shown in examples or disallowed. In addition, I feel that the last error message is somewhat strange: "module stdio.foo"? As I understand it there should be nothing but a module io, which contains only one function, foo.
Comment #1 by bugzilla — 2006-07-26T21:07:05Z
import io = std.stdio : foo = writefln; void main() { //writefln("bar"); // doesn't work, good //std.stdio.foo("bar"); // doesn't work, good //std.stdio.writefln("bar"); // doesn't work, good foo("bar"); // works fine, but a renamed import should // require a FQN according to the spec **> The "foo = writefln" binds writefln to the name foo in the current namespace, hence it does not require a FQN. Not a bug. io.writefln("bar"); // works fine, but there shouldn't be a // writefln in io, just a foo **> Yes there is a writefln in io, because io=std.stdio bound the name io in the current namespace to refer to the entire module. Not a bug. //io.foo("bar"); // doesn't work: undefined identifier // module stdio.foo **> That's because foo is put into the current namespace, not the module namespace. foo is not a member of io. Not a bug. }
Comment #2 by matti.niemenmaa+dbugzilla — 2006-07-28T08:38:11Z
(In reply to comment #1) So essentially, the statement "import mymodule = module : myname = name;" is equivalent to the two statements "import mymodule = module; import module : myname = name;". Once again, this is worth noting in the documentation: the way I figured it, the two import methods would combine, as I indicated in the comments. Reopening with the "spec" keyword and a lower severity.
Comment #3 by matti.niemenmaa+dbugzilla — 2006-12-24T03:47:36Z
Fixed in DMD 0.178, but the code snippet under "Renamed and Selective Imports" in module.html is missing an ending brace, so this shouldn't be resolved yet.
Comment #4 by bugzilla — 2006-12-27T01:58:36Z
Fixed DMD 0.178