std.experimental.make allows use to create instances of structs or instances of classes that are not known by the garbage collector.

However, I've recently observed that it could leads to severe bugs when the aggregate that's allocated with 'make()' contains at least one member that's managed by the GC. The issue is here: https://issues.dlang.org/show_bug.cgi?id=15790.


A solution would be, in 'make()', to statically determine if the aggregate contains arrays, pointers or classes. This is very simple, as seen for example in EMSI container library with the 'shouldAddGCRange' template. (https://github.com/economicmodeling/containers/blob/master/src/containers/internal/node.d#L59).


The problem with this template is that it returns false positives. For example an array will be seen as a managed type while actually it may be only modified by 'expandArray()' and 'shrinkArray()' with Mallocator.


The obvious solution is simply to allow to anotate variables with @nogc. But...if it's already accepted by the compiler, it cannot be detected by the built-in traits. Why ? Because '@nogc' is a function attribute and is detectable only with a trait that works on functions.


Finally my proposition is:
0. verify that front really take @nogc on a variable.
1. add a trait to get the non-UDA attributes of a variable.
2. add to phobos the 'shouldAddGCRange' template, but enhanced with the detection of the variables marked @nogc 3. update 'make()' so that it uses the enhanced 'shouldAddGCRange' to declare the content of the aggragate to the GC
4. close issue 15790.


I need your point of view about 0. & 1. Also I'm not a dmd commiter so someone will have to do it (i can do point 2 and 3). If you don't understand well what I'm trying to do, look at this paste, it's more or less what I'd like to add to phobos (except that currently it uses a UDA) https://dpaste.dzfl.pl/25a32c5cf106.

Reply via email to