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