www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Fixing 18615, how to handle safe/pure/nothrow test breakage due to

reply SimonN <eiderdaus gmail.com> writes:

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 

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
Mar 28 2018
parent reply Kagamin <spam here.lot> writes:
See line 1957, attributes are not inferred.
Mar 28 2018
parent SimonN <eiderdaus gmail.com> writes:
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
Mar 28 2018