[Issue 19602] New: Under some circumstances: throwing Error subclasses unwinds without invoking dtors
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Mon Jan 21 23:37:32 UTC 2019
    
    
  
https://issues.dlang.org/show_bug.cgi?id=19602
          Issue ID: 19602
           Summary: Under some circumstances: throwing Error subclasses
                    unwinds without invoking dtors
           Product: D
           Version: D2
          Hardware: All
               URL: http://dlang.org/
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P3
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: eyal at weka.io
Reproduction:
import std.stdio;
import std.traits;
struct S {
    this(int) { writeln("this(int)"); }
    ~this() { writeln("~this()"); }
}
void dtorsOk() {
    with(S(1)) { throw new Error("Err"); } // dtor call generated here
}
// inferred as "nothrow"
auto sneakyThrow() { throw new Error("Err"); }
void failsToDtor() {
    with(S(1)) sneakyThrow(); // dtor call skipped here, incorrectly
}
// And this is the reason:
static assert(hasFunctionAttributes!(sneakyThrow, "nothrow"));
unittest {
    writeln("dtorsOk:");
    try dtorsOk();
    catch(Error) {}
    writeln("failsToDtor:");
    try failsToDtor();
    catch(Error) {}
}
Prints:
dtorsOk:
this(int)
~this()
failsToDtor:
this(int)
--
    
    
More information about the Digitalmars-d-bugs
mailing list