www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 20448] New: Error: unknown when mutating an escaped member

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

          Issue ID: 20448
           Summary: Error: unknown when mutating an escaped member
                    reference from a template function
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: mipri minimaltype.com

The following complete program

```
import std.stdio : writeln;

struct S {
    int x, y;
}

ref int member(string mem)(S p) { 
    return p.x;
}

void main() {
    S p;
    //writeln(p.member!"x");
    p.member!"x" = 2;
    writeln(p);
}
```

fails to compile with this error:

Error: unknown, please file report on issues.dlang.org

With the mutation commented out, and the writeln uncommented, it fails more
gracefully:

./x271.d(11): Error: returning p.x escapes a reference to parameter p, perhaps
annotate with return
./x271.d(16): Error: template instance x271.member!"x" error instantiating

Meanwhile a non-template version also has a proper error message:

```
import std.stdio : writeln;

struct S {
    int x, y;
}

ref int member(S p) {
    return p.x;
}

void main() {
    S p;
    p.member = 2;
    writeln(p);
}
```
./x272.d(10): Error: returning p.x escapes a reference to parameter p, perhaps
annotate with return

--
Dec 13 2019