@safe function with __gshared as default parameter value

Anonymouse zorael at gmail.com
Wed Apr 8 19:29:17 UTC 2020


On Wednesday, 8 April 2020 at 19:22:11 UTC, jmh530 wrote:
> On Wednesday, 8 April 2020 at 18:50:16 UTC, data pulverizer 
> wrote:
>> On Wednesday, 8 April 2020 at 16:53:05 UTC, Anonymouse wrote:
>>> ```
>>> import std.stdio;
>>>
>>> @safe:
>>>
>>> __gshared int gshared = 42;
>>>
>>> void foo(int i = gshared)
>>> {
>>>     writeln(i);
>>> }
>>>
>>> void main()
>>> {
>>>     foo();
>>> }
>>> ```
>>>
>>> This currently works; `foo` is `@safe` and prints the value 
>>> of `gshared`. Changing the call in main to `foo(gshared)` 
>>> errors.
>>>
>>> Should it work, and can I expect it to keep working?
>>
>> According to the manual it shouldn't work at all 
>> https://dlang.org/spec/function.html#function-safety where it 
>> says Safe Functions: "Cannot access __gshared variables.", I 
>> don't know why calling as `foo()` works.
>
> You still wouldn't be able to manipulate gshared within the 
> function. Though it may still be a problem for @safe...

It works with `ref int` too.


```
__gshared int gshared = 42;

void foo(ref int i = gshared) @safe
{
     ++i;
}
void main()
{
     assert(gshared == 42);
     foo();
     assert(gshared == 43);
}
```


More information about the Digitalmars-d-learn mailing list