On Tuesday, 28 December 2021 at 07:54:56 UTC, frame wrote:
On Tuesday, 28 December 2021 at 06:38:03 UTC, Tejas wrote:
The workaround is okay, but I think we should file a bug report for this.
This is very ~~stupid~~ undesirable behaviour

I agree. I'll just wait if somebody can explain why this isn't a bug or wanted behaviour or a known issue.

[The spec says](https://dlang.org/spec/hash-map.html#construction_assignment_entries):
```
2. If the assigned value type is equivalent with the AA element type:

1. If the indexing key does not yet exist in AA, a new AA entry will be allocated, and it will be initialized with the assigned value. 2. If the indexing key already exists in the AA, the setting runs normal assignment.
```
Thus, when the value type is constructable but not assignable:
```d
struct S
{
  const(int) a;
}

void test(S[string] aa, string key, int value)
{
  // Should be a compile-time error, because it might reassign:
  test[key] = S(value);

// Should be accepted, because they can be proven at compile time to never reassign:
  test.require("a", S(value));
  test.update("a", () => S(value), (ref const(S)) => { });
}
```

`require` and `update` can be fixed rather easily in `object.d`; I have submitted [issue 22633](https://issues.dlang.org/show_bug.cgi?id=22633) with sample code.

Reply via email to