@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