Don <> changed:

           What    |Removed                     |Added
            Summary|foreach on closure          |foreach on closure
                   |corrupted after varargs     |corrupted after function
                   |call                        |call
         OS/Version|Linux                       |All
           Severity|major                       |critical

--- Comment #2 from Don <> 2010-07-13 15:12:13 PDT ---
Further reduction shows that it doesn't require varargs. Raising priority to
critical, since it means that virtually all closures are broken.
What's happening: on the call to inner, EAX should hold a pointer to
the closure variables (on the heap). But when there's another function call,
it's using EBX instead, and the EAX value is whatever garbage is left after the
function call.
So it gets the calling convention wrong.

void bug3560(int x){ }

void main()
    int localvar = 7;

    int inner(int delegate(ref int) dg) {
        int k = localvar; // BUG: &localvar == 0x24 (!)
        return 0;
    foreach (entry; &inner) { }

Configure issuemail:
------- You are receiving this mail because: -------

Reply via email to