Why does `static foreach` lead to something calling `~=` internally?

Exil Exil at gmall.com
Tue Jul 9 13:32:34 UTC 2019


On Sunday, 7 July 2019 at 18:45:14 UTC, 0xEAB wrote:
> On Sunday, 7 July 2019 at 16:51:57 UTC, 0xEAB wrote:
>> Why does this `static foreach` lead to hidden usage of operator
>
>
> Further notes by Dan (aka "Wild"):
>> I added some small printfs to the compiler, http://ix.io/1NWM
>> It seems like it lowers it into something weird

Static foreach needs a tuple. When you have a range like "0 .. 
10" it has to convert that to a tuple. It does this by generating 
some code and running it at CTFE. Guess this was done as it was a 
lot simpler to do, you don't have to worry about recreating 
ranges as that's already done by using CTFE.

What it ends up lowering to: 
https://github.com/dlang/dmd/blob/v2.087.0/src/dmd/cond.d#L274

      *     static foreach (x; {
      *         typeof({
      *             foreach (x; range) return x;
      *         }())[] __res;
      *         foreach (x; range) __res ~= x;
      *         return __res;
      *     }()) { ... }


More information about the Digitalmars-d-learn mailing list