http://d.puremagic.com/issues/show_bug.cgi?id=5845
Summary: [CTFE] "stack overflow" with ref ulong argument + CTFE benchmark Product: D Version: D2 Platform: x86 OS/Version: Windows Status: NEW Keywords: rejects-valid Severity: normal Priority: P2 Component: DMD AssignedTo: nob...@puremagic.com ReportedBy: bearophile_h...@eml.cc --- Comment #0 from bearophile_h...@eml.cc 2011-04-14 18:14:14 PDT --- This program generates a "stack overflow" with DMD2 2.052, but it compiles and runs correctly with DMD1 v1.026. The problem appears to be here: uint solve(int niv, int dx, ref ulong diag45, ref ulong diag135, ref ulong cols) { Removing the ref avoids the problem: uint solve(int niv, int dx, ulong diag45, ulong diag135, ulong cols) { Additionally: this program (with enum result=nqueen(10);) can also be used as one benchmark for CTFE speed (if run at runtime it allocates no heap memory). 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, ulong diag45, ulong diag135, ulong cols) { // OK uint solve(int niv, int dx, ref ulong diag45, ref ulong diag135, ref ulong cols) { // stack overflow 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) { 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(8); 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: -------