================
@@ -214,13 +256,26 @@ bool EHScopeStack::requiresCatchOrCleanup() const {
   return false;
 }
 
-static void emitCleanup(CIRGenFunction &cgf, EHScopeStack::Cleanup *cleanup,
+static void emitCleanup(CIRGenFunction &cgf, cir::CleanupScopeOp cleanupScope,
+                        EHScopeStack::Cleanup *cleanup,
                         EHScopeStack::Cleanup::Flags flags) {
+  CIRGenBuilderTy &builder = cgf.getBuilder();
+  mlir::Block &block = cleanupScope.getCleanupRegion().back();
+
+  mlir::OpBuilder::InsertionGuard guard(builder);
+  builder.setInsertionPointToStart(&block);
+
   // Ask the cleanup to emit itself.
   assert(cgf.haveInsertPoint() && "expected insertion point");
   assert(!cir::MissingFeatures::ehCleanupActiveFlag());
   cleanup->emit(cgf, flags);
   assert(cgf.haveInsertPoint() && "cleanup ended with no insertion point?");
+
+  if (block.empty() || !block.back().hasTrait<mlir::OpTrait::IsTerminator>()) {
----------------
andykaylor wrote:

This seems to be assuming that the emitted cleanup will have a single block. 
That may be true in practice, but I'd like to see an assertion to guard that 
assumption. It might be better to call `cleanupScope.getCleanupRegion().back()` 
again here, in case the emitted cleanup created multiple blocks.

The one case I could think of that might create multiple blocks is the NRVO 
cleanup, but I see that it is creating a `cir.if` statement rather than 
branching, so I think a single region with a single block is something we can 
expect.

https://github.com/llvm/llvm-project/pull/180276
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to