Lowerings to strongly pure _d_arrayctor trigger warnings or risk being incorrectly removed
Teodor Dutu
teodor.dutu at gmail.com
Tue Oct 12 19:31:34 UTC 2021
On Tuesday, 12 October 2021 at 18:27:53 UTC, Paul Backus wrote:
> On Tuesday, 12 October 2021 at 18:04:21 UTC, Teodor Dutu wrote:
>>
>> I have read the documentation at the links you left, but I
>> can't see why the usage of `_d_arrayctor` would be an
>> undefined behaviour.
>
> `_d_arrayctor` casts away `immutable` internally--either
> [here][1], directly, or [here][2] indirectly via `copyEmplace`
> (which casts it away [here][3]). It then uses `memcpy` to
> mutate the memory that was originally typed as `immutable`.
> This is undefined behavior, according to the language spec.
>
> [1]:
> https://github.com/dlang/druntime/blob/16c836a7b084b935504427579e2d646c462ee6e4/src/core/internal/array/construction.d#L77
> [2]:
> https://github.com/dlang/druntime/blob/16c836a7b084b935504427579e2d646c462ee6e4/src/core/internal/array/construction.d#L59
> [3]:
> https://github.com/dlang/druntime/blob/16c836a7b084b935504427579e2d646c462ee6e4/src/core/lifetime.d#L1239
>
>> This lowering only occurs when initialising static arrays or
>> slices
>
> The spec does not currently make an exception for initializing
> static arrays or slices, so the fact that it only occurs in
> that context does not make any difference to whether the spec
> considers it UB.
I see your point now. But this behaviour is not new. The current
implementation uses [this
hook](https://github.com/dlang/druntime/blob/a17bb23b418405e1ce8e4a317651039758013f39/src/rt/arrayassign.d#L170), which suffers from the same shortcomings. Furthermore, the hook uses `TypeInfo`, which makes it slower than what I'm trying to achieve with the templated approach.
And secondly, bear in mind that the lowering only occurs when the
`lhs` is being constructed, which means that two things can
happen:
- the compiler can perform constant propagation by replacing the
`rhs` variable with an array literal, which will **not** be
lowered to `_d_arrayctor`:
https://github.com/dlang/dmd/blob/3aa786cfb6990ff5f9c5085d0efd3421c3adc956/src/dmd/expressionsem.d#L9778
- the compiler doesn't perform this optimisation, which means
that some data has to be written into the `const`/`immutable`
array (`lhs`).
I don't see how the second scenario can be avoided, with or
without `_d_arrayctor`.
More information about the Digitalmars-d
mailing list