Bug 6081 – Function Literal Templates Don't Work when Nested in Templates
Status
RESOLVED
Resolution
WORKSFORME
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2011-05-31T07:36:00Z
Last change time
2013-09-12T07:29:56Z
Assigned to
nobody
Creator
wfunction
Comments
Comment #0 by wfunction — 2011-05-31T07:36:30Z
The following piece of code, which finds the length of the longest line in a file,
pipe!(readText, splitlines, map!((a) { return a.length; }), reduce!max)("Temp.d");
fails with:
Error: expression template map(Range) if (isInputRange!(Unqual!(Range))) is not a valid template value argument
If you try to get around it by saying
pipe!(readText, splitlines, map!(delegate size_t(string a) { return a.length; }), reduce!max)("Temp.d");
you then get:
Error: delegate std.algorithm.__dgliteral1 cannot access frame of function Temp.main.__dgliteral1
and saying "function" instead of "delegate" doesn't change anything.
You can get around it with using a string instead of a function literal as the template argument, but that still doesn't really solve the issue.
Comment #1 by wfunction — 2011-05-31T07:38:43Z
Well, sorry: if you say "function" instead of "delegate", the error _does_ change... it becomes:
Error: delegate std.algorithm.__dgliteral1 cannot access frame of function Temp.main.__dgliteral1
Comment #2 by wfunction — 2011-05-31T07:39:36Z
(In reply to comment #1)
> Well, sorry: if you say "function" instead of "delegate", the error _does_
> change... it becomes:
>
> Error: delegate std.algorithm.__dgliteral1 cannot access frame of function
> Temp.main.__dgliteral1
Whoops, major apologies for the typo and 2nd comment... should've been:
Error: function std.algorithm.__funcliteral1 cannot access frame of function Temp.main.__funcliteral1
Comment #3 by hsteoh — 2013-09-12T07:29:56Z
It would be helpful if code snippets include full compilable code. Anyway, based on the bug description, I constructed the following test case:
----
import std.algorithm, std.file, std.functional, std.string;
void main() {
pipe!(readText, splitLines, map!((a) { return a.length; }),
reduce!max)("Temp.d");
}
----
This code compiles correctly in dmd git HEAD (6a90c4df), so it appears that it has been fixed.
Please reopen this bug if you still encounter problems. Thanks!