Hi all,

I really missing something here, because the following code is taking two different path based on the presence or not of a field with SysTime, where the field itself is not involved at all in the process.

It seems that I'm using something forbidden, or something that it is leading to an undefined behaviour, but I have not idea of what it is the source of the problem.

Note that I'm using array() as in the original code I was using it over a range, this is a reduction of the same problem.

Suggestions are welcome! http://dpaste.dzfl.pl/fc130984

Paolo Invernizzi

---
import std.datetime;
import std.math;

struct A
{
    double i;
}


struct B
{
    invariant()
    {
                if(j == 0)
                        assert(a.i.isNaN, "why is 'j' zero?? and i is not 
NaN?");
                else
                        assert( ! a.i.isNaN );
    }
        
    SysTime when; // comment this line avoid the breakage
    int j;
    A a;
}
void main()
{
    B b1 = B.init;
        assert(&b1); // verify that default eyes invariants are ok;

        auto b2 = B(
                SysTime(0, UTC()),  // comment this line avoid the breakage
                1, A(1));
        assert(&b2);
        auto b3 = B(
                SysTime(0, UTC()),  // comment this line avoid the breakage
                1, A(1)
        );
        assert(&b3);
        
    import std.array;
    auto arr = [b2, b3];
        
        assert(arr[0].j == 1);
        assert(arr[1].j == 1);
auto a2 = arr.array(); // << bang, invariant is raised, also if b2 and b3 are good
}
--

Reply via email to