"let _ = foo();" is differently effectful from just "foo();" #2735

Closed
bblum opened this Issue Jun 28, 2012 · 4 comments

Comments

Projects
None yet
2 participants
@bblum
Contributor

bblum commented Jun 28, 2012

See #2734. In that sample code, which segfaults, removing the characters "let _ =" causes it to no longer segfault. No idea why; maybe it causes it to optimise away the destructor call?

@ghost ghost assigned catamorphism Jul 5, 2012

@catamorphism

This comment has been minimized.

Show comment
Hide comment
@catamorphism

catamorphism Jul 5, 2012

Contributor

I'll see if this is still a bug now.

Contributor

catamorphism commented Jul 5, 2012

I'll see if this is still a bug now.

@bblum bblum reopened this Aug 2, 2012

@bblum

This comment has been minimized.

Show comment
Hide comment
@bblum

bblum Aug 2, 2012

Contributor

This is still in the air. The following code prints "First" then "Second", but without the let _ =, it prints "Second" then "First".

class defer {
    f: fn@();
    new(f: fn@()) {
        self.f = f;
    }   
    drop { self.f(); }
}

fn main() {
    let _ = do defer {
        #error["Second"];
    };  
    #error["First"];
}

I'm not sure if the answer is "Well, too bad, there are no guarantees on when destructors get run", but I want to add this defer thing to libcore, and can't in good conscience as long as its behaviour is unpredictable.

Contributor

bblum commented Aug 2, 2012

This is still in the air. The following code prints "First" then "Second", but without the let _ =, it prints "Second" then "First".

class defer {
    f: fn@();
    new(f: fn@()) {
        self.f = f;
    }   
    drop { self.f(); }
}

fn main() {
    let _ = do defer {
        #error["Second"];
    };  
    #error["First"];
}

I'm not sure if the answer is "Well, too bad, there are no guarantees on when destructors get run", but I want to add this defer thing to libcore, and can't in good conscience as long as its behaviour is unpredictable.

@catamorphism

This comment has been minimized.

Show comment
Hide comment
@catamorphism

catamorphism Aug 8, 2012

Contributor

I have a fix for this, which I'm testing. However, for reference, what you want to do to get the behavior that bblum actually wanted was to write:

let _x = do ...

which means the destructor for the RHS won't run until the end of the enclosing scope, since _x is a perfectly cromulent identifier.

Contributor

catamorphism commented Aug 8, 2012

I have a fix for this, which I'm testing. However, for reference, what you want to do to get the behavior that bblum actually wanted was to write:

let _x = do ...

which means the destructor for the RHS won't run until the end of the enclosing scope, since _x is a perfectly cromulent identifier.

@catamorphism

This comment has been minimized.

Show comment
Hide comment
@catamorphism

catamorphism Aug 8, 2012

Contributor

My opinion is that let _ = e; should behave just like e; Feel free to argue about it, but for now I'm closing this.

Contributor

catamorphism commented Aug 8, 2012

My opinion is that let _ = e; should behave just like e; Feel free to argue about it, but for now I'm closing this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment