@safe function with __gshared as default parameter value

jmh530 john.michael.hall at gmail.com
Wed Apr 8 19:22:11 UTC 2020


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...

import std.stdio;

__gshared int gshared = 42;

@safe void foo(int i = gshared)
{
     i++;
     writeln(i);
}

void main()
{
     writeln(gshared);
     foo();
     writeln(gshared);
     gshared++;
     writeln(gshared);
     foo();
     writeln(gshared);
}


More information about the Digitalmars-d-learn mailing list