pragma(explicit_gc)

Timon Gehr timon.gehr at gmx.ch
Thu May 2 01:45:31 UTC 2024


Often, GC is nice but collections should be avoided in an inner loop. 
`@nogc` is too restrictive because may be fine to e.g., allocate an 
`Exception` before throwing it, and programmers are aware that such 
allocations are happening.

A somewhat more insidious case is implicit allocation, because even when 
programs look like they do need to allocate, they may in fact allocate 
due to the compiler's escape analysis being too weak.

For example, there is no reason for the following program to allocate 
with the GC, but it does implicitly allocate a closure:

```d
void main(){ // errors with @nogc
     auto y=2;
     assert(iota(10).filter!((x)=>x%y!=0).sum==25);
}
```

In case the GC is disabled, such imprecise escape analysis in an inner 
loop may result in a memory leak.

Proposal: Add `pragma(explicit_gc)`. Functions marked with this pragma 
will non-transitively error out on implicit GC allocations. This is a 
useful tool to check expectations about escape analysis precision.


More information about the dip.ideas mailing list