On Sunday, 15 December 2024 at 08:45:22 UTC, DLearner wrote:
Please consider:

```
size_t foo() {
   static size_t var1 = 1;

   var1 = var1 + 1;
   return var1;
}

unittest {

   assert(foo() == 2);
   assert(foo() == 3);
}

```

which works as expected.

But

```
size_t foo1() {
   static size_t var1 = 1;

   var1 = var1 + 1;
   return var1;
}

unittest {
   assert(foo1() == 2);
}

unittest {
   assert(foo1() == 2);
}

```

Fails on the second unittest.

I appreciate this behaviour matches the docs (so not a bug), but is it desirable?

Yes. Remember that you have the function attribute `pure` [[1]]. It would have avoided the problem.. for instance:

```d
size_t foo1() {
   static size_t var1 = 1;

   var1 = var1 + 1;
   return var1;
}

pure unittest {
   assert(foo1() == 2);
}

pure unittest {
   assert(foo1() == 2);
}
```
refuses to compile with the following errors

test.d(9,15): Error: `pure` function `temp_7F58D0140210.__unittest_L8_C6` cannot call impure function `temp_7F58D0140210.foo1` test.d(13,15): Error: `pure` function `temp_7F58D0140210.__unittest_L12_C6` cannot call impure function `temp_7F58D0140210.foo1`

With `pure` that you would have seen the problem, that is "oh, the global state".

[1]: https://dlang.org/spec/function.html#pure-functions

Reply via email to