www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5258] New: [CTFE] Stack overflow with struct by ref

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5258

           Summary: [CTFE] Stack overflow with struct by ref
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc


--- Comment #0 from bearophile_hugs eml.cc 2010-11-22 17:09:12 PST ---
This D2 program generates a Stack Overflow with DMD 2.050 despite the stack
dept is very small:


struct Foo { int x; }
void bar(int n, ref Foo f) {
    if (n)
        bar(n - 1, f);
    else
        f.x++;
}
int spam() {
    bar(1, Foo());
    return 0;
}
enum _ = spam();
void main() {}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 22 2010
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5258


bearophile_hugs eml.cc changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |regression


--- Comment #1 from bearophile_hugs 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: -------
May 06 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5258



--- Comment #2 from Don <clugdbug 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: -------
May 06 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5258



--- Comment #3 from Don <clugdbug 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: -------
May 17 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5258


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


--- Comment #4 from Don <clugdbug yahoo.com.au> 2011-05-27 12:52:46 PDT ---
https://github.com/D-Programming-Language/dmd/commit/ff385f5a931b52eea27430ae6d4c6658876f05f0

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 27 2011
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5258


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |verylonglogin.reg gmail.com


--- Comment #5 from Don <clugdbug 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: -------
Jun 11 2011