Challenge: write a reference counted slice that works as much as possible like a built-in slice
Stanislav Blinov
stanislav.blinov at gmail.com
Tue Dec 14 16:45:20 UTC 2021
On Tuesday, 14 December 2021 at 16:17:30 UTC, user1234 wrote:
> On Tuesday, 14 December 2021 at 15:51:58 UTC, Atila Neves wrote:
>> On Tuesday, 14 December 2021 at 12:14:52 UTC, Tejas wrote:
>>> On Thursday, 11 November 2021 at 09:24:17 UTC, Atila Neves
>>> wrote:
>>>> On Wednesday, 10 November 2021 at 13:52:26 UTC, deadalnix
>>>> wrote:
>>>>> [...]
>>>>
>>>> `@disable this();`, but you knew that. It's true that
>>>> requiring a programmer to do something to prevent bugs is a
>>>> terrible idea. Sigh.
>>>
>>> Sorry for reviving this thread, was just sifting through...
>>> The following code also outputs `dtor!`, unfortunately :(
>>>
>>> ```d
>>>
>>> import std.stdio:writeln;
>>>
>>> struct S{
>>> @disable this();
>>> ~this(){
>>> writeln("dtor!");
>>> }
>>> }
>>>
>>> void main(){
>>> S s = void;
>>> }
>>>
>>> ```
>>>
>>> Compiler :
>>> LDC - the LLVM D compiler (1.25.0):
>>> based on DMD v2.095.1 and LLVM 11.1.0
>>
>> Is there an issue for this?
>
> There no issue there, `this` not used at all. Segfaults will
> start to happen, as expected, when trying to access a member
> variable.
No, they wouldn't, per current spec.
https://dlang.org/spec/declaration.html#void_init
https://dlang.org/spec/function.html#safe-functions
Per that, this is @safe:
```d
import core.sys.linux.fcntl;
import core.sys.linux.unistd;
struct MMap
{
private int fd;
@disable this();
@disable this(this);
// ...
~this() @trusted {
if (isValid) {
auto msg = "closed";
size_t len = msg.length;
write(fd, &len, len.sizeof);
write(fd, msg.ptr, len);
close(fd);
}
}
private bool isValid() const @trusted {
import core.stdc.errno;
return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
}
}
void main() @safe
{
// ...
MMap mm = void; // currently allowed because MMap doesn't
contain indirections
// ...
} // nothing may happen, or may crash, or may write into someone
else's memory, or to stdout...
```
Prolly should make an enhancement request for spec of @safe to
disallow void initialization altogether.
More information about the Digitalmars-d
mailing list