[Issue 5258] [CTFE] Stack overflow with struct by ref

2011-06-11 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=5258


Don clugd...@yahoo.com.au changed:

   What|Removed |Added

 CC||verylonglogin@gmail.com


--- Comment #5 from Don clugd...@yahoo.com.au 2011-06-11 22:33:41 PDT ---
*** Issue 6131 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 5258] [CTFE] Stack overflow with struct by ref

2011-05-17 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=5258



--- Comment #3 from Don clugd...@yahoo.com.au 2011-05-17 14:22:02 PDT ---
The bug reported in comment 1 is bug 5845, which is a different bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 5258] [CTFE] Stack overflow with struct by ref

2011-05-06 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=5258


bearophile_h...@eml.cc changed:

   What|Removed |Added

   Severity|normal  |regression


--- Comment #1 from bearophile_h...@eml.cc 2011-05-06 02:51:16 PDT ---
This CTFE bug is present in DMD v1.068beta still, but it seems absent in DMD
v1.042.

A longer example that gives the correct answer with DMD 1.042 but produces
stack overflow with DMD v1.068beta:


import std.c.stdio: printf;

bool test(int k, int j, ulong diag45, ulong diag135, ulong cols) {
return ((cols (1UL  j)) +
(diag135  (1UL  (j + k))) +
(diag45   (1UL  (32 + j - k))) ) == 0;
}

void mark(int k, int j, ref ulong diag45, ref ulong diag135, ref ulong cols) {
cols^= (1UL  j);
diag135 ^= (1UL  (j + k));
diag45  ^= (1UL  (32 + j - k));
}

uint solve(int niv, int dx, ref ulong diag45, ref ulong diag135, ref ulong
cols) {
uint solutions_found;

if (niv) {
for (int i = 0; i  dx; i++)
if (test(niv, i, diag45, diag135, cols)) {
mark(niv, i, diag45, diag135, cols);
solutions_found += solve(niv - 1, dx, diag45, diag135, cols);
mark(niv, i, diag45, diag135, cols);
}
} else {
for (int i = 0; i  dx; i++)
solutions_found += test(0, i, diag45, diag135, cols);
}

return solutions_found;
}

ulong nqueen(int n) {
// masques
ulong diag45  = 0; // / diagonal bitboard
ulong diag135 = 0; // \ diagonal bitboard
ulong cols= 0; // column bitboard

return solve(n - 1, n, diag45, diag135, cols);
}

const ulong result = nqueen(9);

void main() {
// NQUEENS: 1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2_680, 14_200, 73_712,
365_596
printf(%lld\n, result);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---


[Issue 5258] [CTFE] Stack overflow with struct by ref

2011-05-06 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=5258



--- Comment #2 from Don clugd...@yahoo.com.au 2011-05-06 04:09:57 PDT ---
This is a pseudo-regression: it was never doing what it was supposed to. The
test case happened to give the correct results on a previous version, but only
because one bug hid another. Slight changes would make it fail.

Ref parameters are not going to work reliably in CTFE until pointers are
implemented. Which is not happening in this release.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
--- You are receiving this mail because: ---