Bug 1211 – mixin("__LINE__") gives incorrect value

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2007-05-03T12:53:00Z
Last change time
2014-02-16T15:22:36Z
Keywords
wrong-code
Assigned to
bugzilla
Creator
rueschi

Comments

Comment #0 by rueschi — 2007-05-03T12:53:34Z
import std.stdio; void main() { writefln("%d", mixin("__LINE__")); } Expected output: 2 Actual output: 1 (everywhere)
Comment #1 by lovesyao — 2007-05-03T14:10:22Z
Reply to [email protected], > http://d.puremagic.com/issues/show_bug.cgi?id=1211 > > Summary: mixin("__LINE__") > Product: D > Version: 1.010 > Platform: Other > OS/Version: Windows > Status: NEW > Severity: normal > Priority: P2 > Component: DMD > AssignedTo: [email protected] > ReportedBy: [email protected] > import std.stdio; > void main() { writefln("%d", mixin("__LINE__")); } > Expected output: 2 > Actual output: 1 (everywhere) Well what would you expect? There is more than one option. writef("%\n", mixin(string)); // 1, 3 or 4? what about generated strings? const char[] string = " __LINE__"; how about a dotted form? <mixin_line>.<line_in_mixin>
Comment #2 by smjg — 2007-05-05T08:27:28Z
> writef("%\n", mixin(string)); // 1, 3 or 4? what about generated strings? What is %\n? And how is 3 a plausible value in your example? > how about a dotted form? > > <mixin_line>.<line_in_mixin> Then how would we distinguish between 2.1 and 2.10? IMO it should be the line in which it's mixed in, as that's the first point at which __LINE__ is treated as a token rather than being in a string. If you want the line where __LINE__ actually is in the code, you'd have to use writef("%d\n", mixin(string)); // BTW what is %\n??? const char[] string = " " ~ __LINE__.stringof; This leaves: - the line within the mixed-in code - if we're going to have this, it should probably be by a different token such as __MIXIN_LINE__. - the line at which it would appear in the code after expansion of the mixin - but I don't see any practical use for this.
Comment #3 by davidl — 2007-05-05T09:03:03Z
how about char[] a() {return `__LINE`;} char[] b() {return `__`;} mixin(a+b)
Comment #4 by smjg — 2007-05-05T09:54:52Z
The + operator doesn't work on strings, so what's to ask? If you meant a ~ b, then how I stated it should work works equally in this case.
Comment #5 by bugzilla — 2007-07-01T14:00:53Z
Fixed DMD 1.018 and DMD 2.002