[clang] [WinEH] Fix object delete crash (PR #180144)

via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 7 05:33:28 PST 2026


GkvJwa wrote:

@MuellerMP hello, I'm sorry to bother you again

We mentioned this sample earlier.
```
struct A {
  ~A();
};

void f() {
  __try {
    A* a = new A;
    delete a;
  } __finally {
  }
}
```

At the time, I analyzed that it was caused by the insertion of an extra `llvm.seh.try.end()/invoke.cont7` instruction.
```
....

invoke.cont7:                                     ; preds = %invoke.cont6
  invoke void @llvm.seh.try.end()
          to label %invoke.cont8 unwind label %ehcleanup10

.....

delete.end:                                       ; preds = %invoke.cont9, %invoke.cont3
  invoke void @llvm.seh.try.end()
          to label %invoke.cont13 unwind label %ehcleanup14

...
```
Upon further analysis, I realized that the problem stemmed from inserting too many SEH calls within the same function context in the current framework.At the same time, the code generated by MSVC does not generate as many `__try` blocks as LLVM.

Then, I removed the `EmitSehTryScopeEnd` instruction from that location. At this point, LLVM is no longer crashing, and the generated code is also correct.

Therefore, the problem here might be that in the same block, multiple emits(`Emit*ScopeEnd`/`Emit*ScopeBegin`) are not needed on Windows when use '/eha'. The system mechanism shouldn't require multiple nested calls within the same stack(the same function)

I think this is somewhat related to this PR(#167176). So I'd like to ask for your opinion. We may need to ensure that we don't nest multiple handlers when `SEH` is enabled.

CC @rnk @efriedma-quic

https://github.com/llvm/llvm-project/pull/180144


More information about the cfe-commits mailing list