Bug 532 – Wrong name mangling for template alias params of local vars
Status
RESOLVED
Resolution
FIXED
Severity
critical
Priority
P1
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2006-11-16T14:35:00Z
Last change time
2014-02-15T13:22:00Z
Assigned to
bugzilla
Creator
clugdbug
Comments
Comment #0 by clugdbug — 2006-11-16T14:35:38Z
In this example, in moo!(A), the value of Mang!(A).mangledname depends on whether it is inside a 'static assert' or not. This seems to be a symptom of a more general problem: I've seen many similar effects, but this is the simplest so far.
---------
template Mang(alias F)
{
class G { }
alias void function (G ) H;
const char [] mangledname = typeof(H).mangleof;
}
template moo(alias A)
{
const char [] a = Mang!(A).mangledname;
static assert(Mang!(A).mangledname == a); // FAILS !!!
}
void main()
{
int q;
char [] b = moo!(q).a;
}
(In reply to comment #0)
> template Mang(alias F)
> {
> class G { }
> alias void function (G ) H;
> const char [] mangledname = typeof(H).mangleof;
> }
>
> template moo(alias A)
> {
> const char [] a = Mang!(A).mangledname;
> static assert(Mang!(A).mangledname == a); // FAILS !!!
> }
>
> void main()
> {
> int q;
> char [] b = moo!(q).a;
> }
Some more information....
Inside the static assert, the type is:
void function ( Mang!(bug.main().q).G );
PFC3bug29__T4MangS17_D3bug4mainFZv1qiZ1GZv
but outside the static assert, it is:
void function ( main.moo(bug.main().q)).Mang!(bug.main().q).G );
PFCmain28__T3mooS17_D3bug4mainFZv1qiZ29__T4MangS17_D3bug4mainFZv1qiZ1GZv
The problem is that in this second case, the mangled name of the calling function gets appended to the start of the fully qualified name. I can't see why this would be necessary ('q' is already fully qualified in the alias parameter, so it cannot conflict with anything else).
A secondary problem is that in the second case, extern (C),(Windows), (Pascal) symbols such 'main' are not mangled correctly with the new scheme from D0.176: it doesn't have the length information included.
main.moo!(...) is Cmain28__T3moo...
but it should be C4main28_T3moo...
This applies to any extern(C), (Windows), or (Pascal) function, not just "main",
but doesn't apply to normal D functions.
It is still a problem with D1.0.
All other name mangling bugs I've reported since D0.176 seem to be consequences of this one. The mangling used inside the static assert seems natural, and I think it should be used in the other case as well, unless there's a known problem with it.
Comment #3 by clugdbug — 2007-01-24T06:31:53Z
Changing status to critical because I've seen bad code generation in library code as a result of this bug. There seems to be a fundamental instability in the compiler at this point, almost as though there's an uninitialised variable.
This issue is a blocker for my meta.NameOf code.
Comment #4 by davidl — 2007-02-12T19:49:53Z
i change d's version of this bug. and priority to 1 , hope walter could fix this bug sooner.