Bug 3306 – bad function/delegate literal generated into header files
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2009-09-07T23:42:00Z
Last change time
2015-06-09T01:26:47Z
Keywords
patch, wrong-code
Assigned to
nobody
Creator
r.sagitario
Comments
Comment #0 by r.sagitario — 2009-09-07T23:42:31Z
While trying to compile tango with dmd 1.046, I ran into the a problem with the di-header generated for atomic.d. A reduced version that reproduces the bug in dmd 2.032 aswell is
test.d:
int foo(int function() fn)
{
return fn();
}
int bar(T)()
{
return foo(function int (){ return 0; });
}
>dmd -c -H test.d
>dmd -c test.di
test.di(10): found 'function' when expecting '.' following 'int'
test.di(10): found '(' when expecting identifier following 'int.'
test.di(11): found '{' when expecting ';' following 'return statement'
test.di(14): Declaration expected, not ')'
test.di(16): unrecognized declaration
This is caused by a wrong function literal being generated into the di-file:
// D import file generated from 'test.d'
int foo(int function() fn)
{
return fn();
}
template bar(T)
{
int bar()
{
return foo(int function()
{
return 0;
}
);
}
}
Note the difference "foo(int function()..." and "foo(function int ()...".
Comment #1 by r.sagitario — 2009-09-07T23:46:41Z
Here is the patch that fixes the problem, but I have no idea why it was implemented the way it was before. There might be other places that may need the original implementation.
--- func.c (revision 196)
+++ func.c (working copy)
@@ -2426,15 +2426,9 @@
void FuncLiteralDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
{
- static Identifier *idfunc;
- static Identifier *iddel;
-
- if (!idfunc)
- idfunc = new Identifier("function", 0);
- if (!iddel)
- iddel = new Identifier("delegate", 0);
-
- type->toCBuffer(buf, ((tok == TOKdelegate) ? iddel : idfunc), hgs);
+ buf->writestring(kind());
+ buf->writeByte(' ');
+ type->toCBuffer(buf, NULL, hgs);
bodyToCBuffer(buf, hgs);
}