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

          Issue ID: 14299
           Summary: [REG2.067.0-rc1] "ref" parameter in CTFE handled
                    incorrectly for recursive calls
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: ice-on-valid-code, wrong-code
          Severity: regression
          Priority: P1
         Component: DMD
          Assignee: [email protected]
          Reporter: [email protected]

The following code works correctly in DMD 2.066.1:

```
string test2() {
    string n;
    return test(0, n);
}

string test(int idx, ref string name) {
    string ret;
    name = [cast(char)(idx + '0')];
    ret ~= name;
    if (idx < 2) {
        string subname;
        ret ~= test(idx+1, subname);
    }
    ret ~= name;
    return ret;
}

static assert(test2() == "012210");
```

On DMD 2.067-rc1 it fails with:
Assertion failure: 'v->ctfeAdrOnStack >= 0 && v->ctfeAdrOnStack <
stackPointer()
' on line 182 in file 'interpret.c'

In the original, more complex, scenario instead of an ICE, the "name" variable
was silently corrupted instead and contained the contents of "subname" after
the recursive call to test().

--

Reply via email to