[Issue 19512] New: Exception during scope(exit) of an exception yields undefined behavior
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Dec 24 23:58:20 UTC 2018
https://issues.dlang.org/show_bug.cgi?id=19512
Issue ID: 19512
Summary: Exception during scope(exit) of an exception yields
undefined behavior
Product: D
Version: D2
Hardware: All
URL: http://dlang.org/
OS: All
Status: NEW
Severity: major
Priority: P3
Component: dmd
Assignee: nobody at puremagic.com
Reporter: eyal at weka.io
An exception during scope(exit) handler of an already-propagating exception
does not get handled correctly. Under some circumstances, it triggers missing
destructor bugs too.
Example program:
// use puts, not writeln, because puts is nothrow. any code that may throw
prevents some of the bug from reproducing
import core.stdc.stdio: puts;
struct C {
this(int x) {}
~this() { puts("C.~this()"); }
}
struct D {
auto c() { return C(1); }
}
D d;
void foo() {
with(d.c) {
puts("This code is reached");
// The exception here seems to long-jump back to the original exception
propagation
try { throw new Exception("Exc"); }
catch(Exception e) { puts("This handler is never reached"); }
// Iff ONLY nothrow things are done below here, then d.c's dtor does
not run at all!
// THIS CODE IS NOT REACHED:
puts("This code is NOT reached, and C's destructor never runs!");
}
}
void main() {
scope(exit) { foo(); }
throw new Throwable("Bomb");
}
--
More information about the Digitalmars-d-bugs
mailing list