1121 – Assertion codegen issue with templated function

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 1121 - Assertion codegen issue with templated function
Summary: Assertion codegen issue with templated function
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 All
: P2 critical
Assignee: Walter Bright
URL:
Keywords: wrong-code
Depends on:
Blocks:
Reported: 2007年04月10日 18:47 UTC by Jarrett Billingsley
Modified: 2014年02月16日 15:21 UTC (History)
0 users

See Also:


Attachments
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Jarrett Billingsley 2007年04月10日 18:47:00 UTC
Weirdest. Bug. Ever.
[test.d]------------------------
module test;
import mod;
import std.stdio;
void main()
{
	foo();
	func!(void)();
}
--------------------------------
[mod.d]-------------------------
module mod;
void foo()
{
	assert(false, "GO");
}
public void func(T)()
{
	assert(false, "Blah");
}
--------------------------------
Command line:
C:\dmd\proj\MiniDDebug\minid>dmd test.d mod.d
C:\dmd\bin\..\..\dm\bin\link.exe test+mod,,,user32+kernel32/noi;
C:\dmd\proj\MiniDDebug\minid>test
Error: AssertError Failure GO(5) GO
Notice that the filename reported for the assert error is the same as the error message instead of "mod.d". If you look at the disassembly for that "GO!" assert, it's something like this:
0040204B push 5
0040204D push dword ptr ds:[40F0ECh]
00402053 push dword ptr ds:[40F0E8h]
00402059 push dword ptr ds:[40F0ECh]
0040205F push dword ptr ds:[40F0E8h]
00402065 call __d_assert_msg (004022ac)
First it pushes the line number, then what should be the filename pointer and length, and then the message pointer and length. The message pointer and length are correct, but the filename pointer and length are not right (in this case, it passes the same pointers and length as for the message). The filename pointer and length passed also depend on the amount of code and constants in the executable, resulting in various outputs for this program (such as plain old access violations, or "AssertError out of memory" errors if the length passed is gigantic, or "4invalid UTF-8 sequence" errors when it tries to print out garbage).
However, it's only foo() whose assert is messed up. func()'s assert works fine.
Some other interesting aspects. The following make the problem disappear:
- Removing either assert.
- Removing either assert message (but leaving the condition).
- Declaring foo, func, or both in test.d (both functions have to be declared in mod.d for the problem to happen).
- Removing foo.
I.. just don't know.
Comment 1 Walter Bright 2007年04月20日 13:19:43 UTC
Fixed DMD 1.013
Comment 2 Thomas Kühne 2007年04月27日 12:37:29 UTC
Added to DStress as
http://dstress.kuehne.cn/complex/assert_21 


AltStyle によって変換されたページ (->オリジナル) /