On Friday, 6 May 2022 at 09:24:06 UTC, vit wrote:
It look like examples at page https://dlang.org/spec/function.html#ref-return-scope-parameters are no longer relevant.

They were recently updated to match the implementation in 2.100.

What difference are between `return scope`, `scope return` and `return`?

`return scope` means pointer members (such `this.ptr`, `C.ptr`) may not escape the function, unless they are returned. If you call `test()` on a `scope` variable, the return value will be a scope pointer.

`scope return` on a struct member is `scope` + `return ref`, meaning pointer members may not escape the function (the `scope` part), but you can return a reference to the struct member itself (`&this.val`, the `return ref` part). If you call `test()` on a local variable (`scope` or not), the return value will be a scope pointer.

Just `return` allows you to return a reference to the struct member itself (`&this.val`), and also to escape pointer members (`this.ptr`) since there is no `scope`. However, that means you can't call `test` on `scope` variables.

```
        int* test() scope return{
return &this.val; // Error: returning `&this.val` escapes a reference to parameter `this`
        }
}
```

I think you're using an older DMD version, the error should be gone in 2.100

Why void* ptr in struct change effect of scope return ?

`scope` is ignored when the struct has no pointers, and before 2.100, the meaning of `return` + `scope` on `ref` parameters was very inconsistent.

Reply via email to