## Razvan
### Reference counting
Going through some old DRuntime pull requests, Razvan found several PRs
adding reference-counted things (RCArray, RCPointer, etc) from a period
when reference counting was a hot topic in the D community. The problem
with reference counting in D has been the transitivity of qualifiers
(e.g., you can't reference count an immutable object). Razvan remembered
he had drafted [a DIP for a `__metadata` storage
class](https://github.com/RazvanN7/DIPs/blob/Mutable_Dip/DIPs/DIP1xxx-rn.md).
In a forum discussion on that DIP, Timon Gehr had pointed out two
fundamental issues with it (anyone interested can see [the forum
discussion
thread](https://forum.dlang.org/post/[email protected])).
Ultimately Razvan's progress stalled and he never submitted the DIP.
I stand by my comments about read only memory.
A person can still at runtime mark memory as read only, unfortunately I
don't know how you can detect this in a compiler and fail compilation
because of it.
My preference continues to be three new operator overloads methods for
classes and structs.
opRefAdd, opRefSub, opReadOnly.
The first two are like destructors, they ignore const.
The last tells the type (must not be const) that it is going into read
only memory allowing it to know that it is no longer writable. It would
be required if reference counting methods are implemented.
The main difference to __mutable which was argued that it should not
allow going into read only memory is that: the compiler can't detect if
the user does it, but can prevent itself from doing it. That gives a
very false sense of guarantee that it will not be.
Where as with this approach it is clearly the responsibility of the one
who put it into read only memory to call the method and for the
programmer who wrote the type to have done the right thing in the
methods. Giving no guarantees and hence no sense of security.
### Attribute inference on private functions
Mathias thinks that inference on private functions is something everyone
would want. It's something he heard Walter mention in the past. The
current blocker on that is that attribute inference doesn't work for
recursive functions. He thinks the solution is simple: you should assume
that the function has all the attributes; if you recurse on yourself,
the rest of the code will help you infer the attributes. Walter said
that makes sense; the more attribute inference we can do the better.
+1 infer everything!
I suspect you can do some quick and cheap tests in the parser to
determine if given a function scope if a given attribute such as @safe
should be inferred later on.
If done well, it could mean @safe by default!
## Andrei
He started by arguing that reflection on built-in bitfields is "just
warped". You're going to have things less than 8-bit and to which you
cannot take a pointer. Any proposal for bitfields must account for that.
Walter's solution of having `__traits(getMembers)` return an aggregate
is only half of the story. What about the getters and setters? A library
solution has those, but for the built-ins, they're compiler magic.
Martin agreed (and this is his main sticking point; he brought it up in
the last meeting).
enum __c_bitfield;
is(typeof(value.bitfield) == __c_bitfield)
As long as .sizeof is the real size accounting for "empty" bits and
alignment that should be a fairly safe way to go. It accounts for a
single pointer and requires a special reflection mechanism to get the
tuples of number of bits + names + types.