Thread overview
Fixing 18615, how to handle @safe/pure/nothrow test breakage due to object.opEquals?
Mar 28, 2018
SimonN
Mar 28, 2018
Kagamin
Mar 28, 2018
SimonN
March 28, 2018
Hi,

I'm trying to fix Bugzilla 18615, Rebindable!A doesn't use class A's opEquals (returns a is b instead) [1]. The fix looks reasonably obvious, my code is at [2]. Most of the added lines is the unittest; the essence of the fix is:

    struct RebindableCommon(/* ... */)
    {
        // ...
        bool opEquals(ref const(typeof(this)) rhs) const
        {
            return this.original == rhs.original;
        }
    }

But this breaks several existing unittests throughout Phobos because the comparison in object.d lacks @safe, @nogc, nothrow and pure. For example, unittests in systime.d fail:

    pure function [...]RebindableCommon[...].opEquals cannot call impure function object.opEquals
    nothrow function [...]RebindableCommon[...].opEquals may throw
    std/datetime/systime.d(9006): Error: template instance `std.typecons.Rebindable!(immutable(TimeZone))` error instantiating

I'd rather not add attributes to the Rebindable.opEquals because this function sits in a templated struct RebindableCommon, where the compiler should deduce attributes automatically.

But I don't want to remove correct attributes from unittests in systime.d either.

Can I reasonably continue here to fix 18615?

-- Simon

[1] https://issues.dlang.org/show_bug.cgi?id=18615
[2] https://github.com/SimonN/phobos/commit/5a6fc6fd905b02e5ff93f2aaeaee2487fe8b38d0
March 28, 2018
See line 1957, attributes are not inferred.
March 28, 2018
On Wednesday, 28 March 2018 at 15:04:27 UTC, Kagamin wrote:
> See line 1957, attributes are not inferred.

Wow, that hit my blind spot. :-O Thanks. I've moved the RebindableCommon.opEquals outside of the attributes and all tests pass, as expected.

-- Simon