[Issue 11447] Closure provide bogus values

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Nov 16 12:10:09 PST 2013


https://d.puremagic.com/issues/show_bug.cgi?id=11447



--- Comment #2 from deadalnix <deadalnix at gmail.com> 2013-11-16 12:10:06 PST ---
OK, I've been able to spend some time making this report look better.

a.d :
class A {
}

import std.algorithm;
import std.array;
struct TemplateInstancier {
    auto instanciateFromResolvedArgs(A a) {
        auto bs = [B(a)];

        static A gladeulfeurah;
        gladeulfeurah = a;
        // XXX: have to put array once again to avoid multiple map.
        string id = bs.map!(
            b => b.apply!(
                function string() { assert(0); },
                delegate string(i) {
                    assert(a is gladeulfeurah, "tagazok");
                    return "";
                }
            )
        ).join;
    }
}

enum Tag {
    Undefined,
    A,
}

struct B {
    A a;
    Tag tag;

    this(A a) {
        tag = Tag.A;
        this.a = a;
    }
}

auto apply(alias undefinedHandler, alias handler)(B b) {
    final switch(b.tag) with(Tag) {
        case Undefined :
            return undefinedHandler();

        case A :
            return handler(b.a);
    }
}

fail.d:
import a;

void main() {
    auto a = new A();
    TemplateInstancier().instanciateFromResolvedArgs(a);
}

Compile via:
dmd -c -offail.o fail.d -m64 -w -debug -gc
dmd -c -ofa.o a.d -m64 -w -debug -gc
gcc -o fail fail.o a.o -m64 -lphobos2 -export-dynamic -ldl

Run via:
./fail

The program assert fail with the message tagazok. The value of the variable a
in the closure is incorrect.

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


More information about the Digitalmars-d-bugs mailing list