Erroneous usage of variable capture in loops

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Fri Jun 2 10:01:52 PDT 2017


On 02.06.2017 16:03, FreeSlave wrote:
> As known this code will not work as we may expect:
> 
> import std.stdio;
> 
> void main(string[] args)
> {
>      void delegate ()[] delegates;
>      foreach(i; 0..10) {
>          int j = i;
>          delegates ~= delegate() {
>              writeln(j);
>          };
>      }
>      foreach(dlgt; delegates) {
>          dlgt();
>      }
> }
> 
> All delegates will capture the last value of 'j'.
> 
> dmd does not complain about such case at all. Once I made this mistake 
> myself but noticed it thanks to unittesting. Recently I found similar 
> erroneous code in dlangui (no PR yet). Probably there are more projects 
> that have the same mistake unnoticed.
> 
> May be compiler should produce error or at least generate warning on 
> this code.

It should just generate correct code. This is a compiler bug. 
https://issues.dlang.org/show_bug.cgi?id=2043


More information about the Digitalmars-d mailing list