[Issue 19444] New: hasRawAliasing loops on class with static array, cannot swap class refs

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 28 21:50:18 UTC 2018


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

          Issue ID: 19444
           Summary: hasRawAliasing loops on class with static array,
                    cannot swap class refs
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: regression
          Priority: P1
         Component: phobos
          Assignee: nobody at puremagic.com
          Reporter: kirsybuu at gmail.com

The following code used to work but now fails to compile:

import std.algorithm : swap;
class Thing {
    Thing[2] child;
    this() { }
    static Thing bug(Thing l, Thing r) {
        swap(l,r);
        return l;
    }
}

DMD 2.081.2 correctly accepts and compiles this code. DMD 2.083.0 outputs these
errors:

/home/kirsybuu/.dvm/compilers/dmd-2.083.0/linux/bin/../../src/phobos/std/traits.d(2890):
Error: forward reference of variable hasRawAliasing
/home/kirsybuu/.dvm/compilers/dmd-2.083.0/linux/bin/../../src/phobos/std/traits.d(2902):
Error: template instance `std.traits.hasRawAliasing!(Thing).Impl!(Thing[2])`
error instantiating
/home/kirsybuu/.dvm/compilers/dmd-2.083.0/linux/bin/../../src/phobos/std/traits.d(3233):
       instantiated from here: hasRawAliasing!(Thing)
/home/kirsybuu/.dvm/compilers/dmd-2.083.0/linux/bin/../../src/phobos/std/algorithm/mutation.d(2744):
       instantiated from here: hasAliasing!(Thing)
swap_hasRawAliasing.d(6):        instantiated from here: swap!(Thing)
Failed: ["/home/kirsybuu/.dvm/compilers/dmd-2.083.0/linux/bin/dmd", "-v",
"-o-", "swap_hasRawAliasing.d", "-I."]

The only code in the backtrace that seems to be different between versions is
hasRawAliasing, which added the following case that is causing a recursive
loop:

            else static if (is(T[0] foo : U[N], U, size_t N))
                enum has = hasRawAliasing!U;

Also, given that I just want to swap two class references, I would expect them
to be handled similarly to pointers: changing Thing to a struct and l/r to
Thing* makes DMD 2.083.0 accept the code.

--


More information about the Digitalmars-d-bugs mailing list