Bug 1324 – __FILE__ in mixin template expand to the definition, not the instantiation

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2007-07-09T07:07:09Z
Last change time
2019-08-15T10:10:24Z
Assigned to
No Owner
Creator
Vladimir Vlasov
Depends on
107
See also
https://issues.dlang.org/show_bug.cgi?id=13229

Comments

Comment #0 by vlasov — 2007-07-09T07:07:09Z
Wrong module name (but right line number) in exception if it occurred in mixin from another module. --- output --- catched exception in t2.d: 'ArrayBoundsError t1(13)' catched exception in t1.d: 'ArrayBoundsError t1(10)' --- file t1.d --- module t1; import t2; void main() { mixin mixinT2; testT2(1); int i = 2; try { arr[i] = i; } catch(Exception e) { writefln("catched exception in %s: '%s'", __FILE__, e.toString); } } --- file t2.d --- module t2; template mixinT2() { import std.stdio; int[1] arr; void testT2(int i) { try { arr[i] = i; } catch(Exception e) { writefln("catched exception in %s: '%s'", __FILE__, e.toString); } } }
Comment #1 by pro.mathias.lang — 2019-05-21T00:43:28Z
Edited the issue title to make the current problem more obvious. The original code uses ranges access to trigger an exception, which are errors (not exception in D2). The actual bug, can be illustrated by those 2 files: ///// t1.d ///// module t1; import t2; import std.stdio; void main() { mixin mixinT2!(); testT2(); } ///// t2.d ///// module t2; template mixinT2() { void testT2() { try throw new Exception("FromT2"); catch(Exception e) writefln("T2: caught exception in %s: '%s'", __FILE__, e.toString); } } /////////////// Running this code: dmd t2.d -run t1.d T2: caught exception in t2.d: '[email protected](8): FromT2 ---------------- ??:? void t1.main().__mixin1.testT2(int) [0x102b84f17] ??:? _Dmain [0x102b84afb]' As the message shows, `__FILE__` expands to `t2.d`, both in the `writeln` call and the default parameter for `Exception` ctor. However, the specs currently mentions: > __FILE__ and __LINE__ expand to the source file name and line number at the point of instantiation. The path of the source file is left up to the compiler. It is not 100% clear to me if "point of instantiation" implies templates as well, and thus not 100% clear if this is a bug and/or can be solved.
Comment #2 by razvan.nitu1305 — 2019-08-12T13:40:53Z
(In reply to Mathias LANG from comment #1) > Edited the issue title to make the current problem more obvious. > The original code uses ranges access to trigger an exception, which are > errors (not exception in D2). > > The actual bug, can be illustrated by those 2 files: > > ///// t1.d ///// > module t1; > import t2; > import std.stdio; > void main() > { > mixin mixinT2!(); > testT2(); > } > > ///// t2.d ///// > module t2; > template mixinT2() > { > void testT2() > { > try > throw new Exception("FromT2"); > catch(Exception e) > writefln("T2: caught exception in %s: '%s'", __FILE__, e.toString); > } > } > > /////////////// > Running this code: > > dmd t2.d -run t1.d > T2: caught exception in t2.d: '[email protected](8): FromT2 > ---------------- > ??:? void t1.main().__mixin1.testT2(int) [0x102b84f17] > ??:? _Dmain [0x102b84afb]' > > > As the message shows, `__FILE__` expands to `t2.d`, both in the `writeln` > call and the default parameter for `Exception` ctor. > However, the specs currently mentions: > > __FILE__ and __LINE__ expand to the source file name and line number at the point of instantiation. The path of the source file is left up to the compiler. > > It is not 100% clear to me if "point of instantiation" implies templates as > well, and thus not 100% clear if this is a bug and/or can be solved. "Point of instantiation" refers to the call site of a function that uses __FILE__ as a default parameter. Even though the mixin introduces the code in there, I like it that __FILE__/__LINE__ point to the actual declaration because it's real code, that generated. IMHO this bug report is invalid.