www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 22225] New: SumType: Some assignments should be able to

https://issues.dlang.org/show_bug.cgi?id=22225

          Issue ID: 22225
           Summary: SumType: Some assignments should be able to execute in
                    safe code
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: snarwin+bugzilla gmail.com

In general, assigning to a SumType that may contain a pointer or reference must
be  system, because it could overwrite a pointer or reference that  safe code
has access to, leading to undefined behavior:

---
int n;

int example()  safe
{
    SumType!(int*, int) x = &n;
    return x.match!(
        (int n) => n,
        (ref int* p) {
            x = 123456789; // overwrites p (currently  system)
            return *p; // kaboom
        }
    );
}
---

However, in the special case where only one member of the SumType contains
pointers or references, such an assignment could be  safe, because (a)
overwriting a non-pointer with a pointer is  safe, and (b) overwriting a
pointer with another pointer of the same type is  safe.

Example:

---
void main()  safe
{
        alias SM = SumType!(string, int);
        auto sm = SM(123);
        sm = SM("this should be  safe");
}
---

See also: https://github.com/pbackus/sumtype/issues/67

--
Aug 19 2021