Open
Description
As discussed in this week's meeting, we realized that permitting longjmp
out of a "C"
function will lose optimization potential in a case like this:
fn foo(x: &mut u32) {
*x += 1;
bar();
}
At least at present, we should be able to move the x
down below the call to bar()
, so long as we do it also on unwinding. However, longjmp would make that observable.
We discussed an idea where people annotate functions that "may longjmp" in some way -- two ideas were #[longjmp]
and #[pof]
, though neither is ideal. It would be UB for a function that is to be deallocated unless it carries this annotation. Further:
- The compiler can warn if a
#[longjmp]
function calls another longjmp fn (or a fn that may be longjmp, i.e., by fn pointer) with pending destructors in scope. This carries a risk of false warning since the fn may in fact not longjmp. - The compiler can warn if a non-longjmp fn calls a longjmp one. This carries a risk of missed warnings since calls by pointer could target a longjmp fn.
We would also suppress reordering optimizations around function calls in longjmp-functions.
Metadata
Metadata
Assignees
Labels
No labels