A very strange bug. DMD 2.058 64-bit Linux

2012-02-26 Thread Caligo
bug.d
88
@trusted:

import std.datetime : benchmark;
import std.stdio: writefln, writeln;

alias double Real;

void ben(alias fun)(string msg, uint n = 1_000_000) {
  auto b = benchmark!fun(n);
  writefln( %s %s ms, msg, b[0].to!(msecs, int));
}

struct Matrix(int row, int col) {

private:
  alias row Row;
  alias col Col;
  alias Real[Row * Col] Data;

public:
  Data _data = void;
  alias _data this;
  this(const Real[Row*Col] data) pure nothrow { _data = data; }
}

M inverse(M)(const auto ref M m)  {
  writeln(m[]);
  M minv = m;
  return minv;
}

unittest {
  alias Matrix!(4, 4) Matrix4x4;
  auto m9 = Matrix4x4([4, 0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 0, 1]);
  ben!( {auto r = inverse(m9);} )(4x4 inverse:);
}
88

t1.d
88
import std.stdio;

void main(){ }
88

It took me a long time to pinpoint this because it's tricky to trigger the bug.

Once you have those two files, compile with this:

dmd -unittest t1.d bug.d

and then run t1:

./t1

The output you get should look like this:

...
[0, 4, 0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 0]


Obviously the output is wrong.  'm9' for some reason is getting
overwritten.  In my project this caused big problems because there are
other m# with different values, and their values would literally get
copied to m9.  Calling inverse() on m9 then would fail because the
other matrices are not invertible.  Placing a writeln() in inverse()
helped me realize that what was being passed to inverse() was being
modified somewhere.  I'm still now sure how m9 is being modified.

Another point, compiling with this:

dmd -unittest bug.d t1.d

and then running bug:

./bug

doesn't trigger the bug.


Could someone else please confirm this behavior?


Re: A very strange bug. DMD 2.058 64-bit Linux

2012-02-26 Thread Timon Gehr

On 02/26/2012 09:06 PM, Caligo wrote:

Once you have those two files, compile with this:

dmd -unittest t1.d bug.d

and then run t1:

./t1

The output you get should look like this:

...
[0, 4, 0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 0]



I get:

...
[0, 4, 0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 0]



Obviously the output is wrong.  'm9' for some reason is getting
overwritten.  In my project this caused big problems because there are
other m# with different values, and their values would literally get
copied to m9.  Calling inverse() on m9 then would fail because the
other matrices are not invertible.  Placing a writeln() in inverse()
helped me realize that what was being passed to inverse() was being
modified somewhere.  I'm still now sure how m9 is being modified.

Another point, compiling with this:

dmd -unittest bug.d t1.d

and then running bug:

./bug

doesn't trigger the bug.



I get:

...
[4, 0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 1, 0, 0, 1]



Could someone else please confirm this behavior?


I have used DMD 2.058 64-bit linux.


Re: A very strange bug. DMD 2.058 64-bit Linux

2012-02-26 Thread Caligo
Thanks.  I have reported the bug:
http://d.puremagic.com/issues/show_bug.cgi?id=7595