Thread overview
@safe function with __gshared as default parameter value
Apr 08, 2020
Anonymouse
Apr 08, 2020
data pulverizer
Apr 08, 2020
jmh530
Apr 08, 2020
Anonymouse
Apr 08, 2020
jmh530
Apr 08, 2020
Anonymouse
Apr 08, 2020
data pulverizer
April 08, 2020
```
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?
April 08, 2020
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.

April 08, 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);
}
April 08, 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);
}
```
April 08, 2020
On Wednesday, 8 April 2020 at 19:29:17 UTC, Anonymouse wrote:
> [snip]
>
> 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);
> }
> ```

Well that definitely shouldn't happen. I would file a bug report.
April 08, 2020
On Wednesday, 8 April 2020 at 19:29:17 UTC, Anonymouse wrote:
> ```
> __gshared int gshared = 42;
>
> void foo(ref int i = gshared) @safe
> {
>     ++i;
> }
> void main()
> {
>     assert(gshared == 42);
>     foo();
>     assert(gshared == 43);
> }
> ```

Dude, you just broke `@safe`! Lol!
April 08, 2020
On Wednesday, 8 April 2020 at 19:53:03 UTC, jmh530 wrote:
> Well that definitely shouldn't happen. I would file a bug report.

Filed as https://issues.dlang.org/show_bug.cgi?id=20726