Bug 5686 – Explicit template instantiation with __FILE__ and __LINE__ associates those symbols with the declaration
Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2011-03-02T21:04:00Z
Last change time
2012-03-20T22:10:46Z
Assigned to
nobody
Creator
changlon
Comments
Comment #0 by changlon — 2011-03-02T21:04:08Z
test.d
--------------------------
ptrdiff_t Test1( string file = __FILE__, ptrdiff_t line = __LINE__)(){
static assert( line != __LINE__ -1 );
return line ;
}
class Test2(string name, string file = __FILE__, ptrdiff_t line = __LINE__){
static assert( line != __LINE__ -1 );
int i = 1;
this(){
}
}
void main(){
auto test1 = Test1();
auto test2 = new Test2!("test") ;
}
---------------------------------
test.d(8): Error: static assert (7 != 7) is false
test.d(17): instantiated from here: Test2!("test")
Comment #1 by changlon — 2011-03-03T00:27:11Z
update test case:
-----------------
class Test2(string name, string file = __FILE__, ptrdiff_t line = __LINE__){
static assert( line != __LINE__ -1 );
ptrdiff_t test( string file = __FILE__, ptrdiff_t line = __LINE__)(){
static assert( line != __LINE__ -1 );
return line ;
}
}
void main(){
auto test2 = new Test2!("test") ;
test2.test ;
}
-------------------------------
Comment #2 by schveiguy — 2011-03-03T06:31:04Z
Can you be more specific what is the problem? 7 != 7 *is* false.
In the static assert line (line 8), __LINE__ should be 8, and line should be 7, since the previous line contains the declaration of line.
Are you saying that __LINE__ should be the line number of the instantiation (i.e. 17)?
Not sure what the intended behavior is here.
Comment #3 by schveiguy — 2011-03-03T06:36:13Z
(In reply to comment #2)
> In the static assert line (line 8), __LINE__ should be 8, and line should be 7,
> since the previous line contains the declaration of line.
Wow, that was confusing :) Let's call the template parameter lineno. I'll try again:
In the static assert line (line 8), __LINE__ should be 8, and lineno should be 7,
since the previous line contains the declaration of lineno.
Comment #4 by changlon — 2011-03-03T06:45:53Z
The lineno shoule be the lineno where template is be instantiated, not where it be declared .
for template and function template it is working . for class template and class member template it is not working .
Comment #5 by changlon — 2011-03-03T06:50:13Z
-----------------------------------
ptrdiff_t Test1( string file = __FILE__, ptrdiff_t line = __LINE__)(){
pragma(msg, line.stringof);
return line ;
}
class Test2(string name, string file = __FILE__, ptrdiff_t line = __LINE__){
pragma(msg, line.stringof);
}
void main(){
auto test1 = Test1();
auto test2 = new Test2!("test") ;
}
---------------------------------------
compile this the dmd print 11, 7. dmd should print 11, 12 .
Comment #6 by schveiguy — 2011-03-03T07:16:34Z
With some testing, I discovered that it's the act of explicit instantiation that causes the line number to be tied to the declaration line:
ptrdiff_t Test1(string name, string file = __FILE__, ptrdiff_t line = __LINE__)(){
pragma(msg, line.stringof);
return line ;
}
void main(){
auto test1 = Test1!("test")();
}
prints 1.
This workaround does work:
Test2!(file, line) createTest2(string file = __FILE__, ptrdiff_t line = __LINE__)()
{
return new Test2!(file line);
}
I agree with the request that the line number and file should be tied to the instantiation line, not the declaration line.
Comment #7 by clugdbug — 2011-03-19T18:19:11Z
This isn't a regression. It didn't work in DMD2.000 either.
Comment #8 by code — 2012-03-20T22:10:46Z
*** This issue has been marked as a duplicate of issue 4018 ***