[Issue 20115] New: std.typecons.Rebindable / UnqualRef do not work with inout

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Aug 8 15:50:05 UTC 2019


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

          Issue ID: 20115
           Summary: std.typecons.Rebindable / UnqualRef do not work with
                    inout
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody at puremagic.com
          Reporter: htvennik at gmail.com

In functions it may be necessary (e.g. for scoping reasons) to assign the
return value to a variable and return it later. If the return value is a
inout/const/immutable class reference, this fails (cannot modify
inout/const/immutable expression...). For const/immutable this is quite easily
fixed using Rebindable, but not so for inout...

----

import std.typecons : Rebindable;

class A { }

class C
{
    private A _a;

    @property const(A) aConst() const nothrow @nogc @safe
    {
         const A retVal;
         retVal = _a; // ERROR: cannot modify const expression retVal

         // in this simple case, the error could be avoided by assigning
         // directly in the declaration of retVal, but something like an
         // if or try/catch block may force to declare the variable separate
         // from assigning its value.

         return retVal;
    }

    @property const(A) aConstRebindable() const nothrow @nogc @safe
    {
         Rebindable!(const A) retVal;
         retVal = _a; // WORKS
         return retVal;
    }

    @property inout(A) aInoutRebindable() inout nothrow @nogc @safe
    {
         Rebindable!(inout A) retVal;
         retVal = _a; // ERROR: cannot modify inout expression retVal
         return retVal;
    }
}

----

Same problem with UnqualRef, which does the same, but also removes shared.

--


More information about the Digitalmars-d-bugs mailing list