http://d.puremagic.com/issues/show_bug.cgi?id=8832
Maxim Fomin <ma...@maxim-fomin.ru> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ma...@maxim-fomin.ru --- Comment #3 from Maxim Fomin <ma...@maxim-fomin.ru> 2012-10-26 11:41:40 PDT --- (In reply to comment #0) > import std.algorithm; > import std.range; > import std.stdio; > > auto boo() { > auto C = [2]; > return [1,1].map!((a) => C).joiner; > } > > void main() { > writeln(boo().take(12)); > } > > This code will either segfault or produce nonsensical output. Replacing (a)=>C > with (a)=>[2] makes the problem go away; shortening [1,1] to [1] also makes > the > problem go away, and removing .joiner also makes the problem go away. Removing > the .map makes the problem go away too. > > The problem is suspected to be the delegate (a)=>C which references the local > variable C, which goes out of scope when boo() returns. For whatever reason, > dmd isn't emitting code to allocate the delegate's context on the heap, > causing > a crash when writeln() tries to read the second element off the range. (I'm > not > sure why it doesn't crash with the first element. Maybe luck.) > > Replacing the delegate with function(a)=>[1] makes the problem go away. The problem is in erroneous treating (a) => C of type void. If this is fixed to: - delegate(int a) { return C; } - (int a) { return C; ) - (int a) => C; everything works fine. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------