confusing (buggy?) closure behaviour

Sergey Gromov snake.scaly at gmail.com
Sat Dec 13 12:49:33 PST 2008


Sat, 13 Dec 2008 06:59:51 -0500, Zoran Isailovski wrote:

> Anyway, following the latter pattern, you don't need global analysis.
> You can determine if n is on the stack (it is - it's an argument),
> you can determine if it's referenced from within the closure (it is),
> and you can determine if the closure is being returned (it is). The
> compiler should IMO then generate an error (or warning) about the
> return statement, perhaps stating something like "cannot return a
> delegate that refers to variables in local scope", or something like
> that.

There was a long discussion on this topic.  See
http://www.digitalmars.com/d/archives/digitalmars/D/Escape_analysis_78791.html
for an insight.  To summarize, it's almost always potentially unsafe to
use stack closures.  For instance, if you pass closure to a function,
that function can save that closure to a global variable, so the closure
outlives the container function without being explicitly returned.  If
compiler forbids any potentially unsafe use of closures, it would make
them next to useless and also would break lots of valid code, for
instance a significant part of Tango library.


More information about the Digitalmars-d-learn mailing list