Skip to content

Commit a5b0b88

Browse files
committed
compiler: fix deferred calls may not be executed before exceptional forwarding
1 parent 60dda71 commit a5b0b88

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/julec/obj/cxx/expr.jule

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,15 +1654,19 @@ impl exprCoder {
16541654
if m.Func.Decl.IsVoid() {
16551655
mut v, _ := m.Err.Model.(&sema::Var)
16561656
if v != nil && v.Name == "error" {
1657+
self.oc.write("return __jule_VoidExceptional{.error=")
16571658
if hasDefer {
1658-
self.oc.write(deferStackName + ".call();\n")
1659-
self.oc.indent()
1659+
self.oc.write("({ auto __result = ")
16601660
}
1661-
self.oc.write("return __jule_VoidExceptional{.error=std::move(")
1661+
self.oc.write("std::move(")
16621662
// Handle error variable like ordinary variable.
16631663
// Because it may be captured, use captured variable handler.
16641664
self.var(v)
1665-
self.oc.write(")}")
1665+
self.oc.write(")")
1666+
if hasDefer {
1667+
self.oc.write(";" + deferStackName + ".call(); __result; })")
1668+
}
1669+
self.oc.write("}")
16661670
ret
16671671
}
16681672
self.oc.write("return __jule_VoidExceptional{.error=")
@@ -1672,9 +1676,15 @@ impl exprCoder {
16721676
mut v, _ := m.Err.Model.(&sema::Var)
16731677
if v != nil && v.Name == "error" {
16741678
self.oc.write(">{.error=")
1679+
if hasDefer {
1680+
self.oc.write("({ auto __result = ")
1681+
}
16751682
// Handle error variable like ordinary variable.
16761683
// Because it may be captured, use captured variable handler.
16771684
self.var(v)
1685+
if hasDefer {
1686+
self.oc.write(";" + deferStackName + ".call(); __result; })")
1687+
}
16781688
self.oc.write("}")
16791689
ret
16801690
}

0 commit comments

Comments
 (0)