[clang] [CIR] Implement cleanups for temporaries with automatic duration (PR #189754)

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 1 07:25:51 PDT 2026


================
@@ -542,3 +542,29 @@ void CIRGenFunction::popCleanupBlocks(
     }
   }
 }
+
+/// Pops cleanup blocks until the given savepoint is reached, then add the
+/// cleanups from the given savepoint in the lifetime-extended cleanups stack.
+void CIRGenFunction::popCleanupBlocks(
+    EHScopeStack::stable_iterator oldCleanupStackDepth,
+    size_t oldLifetimeExtendedSize, ArrayRef<mlir::Value *> valuesToReload) {
+  popCleanupBlocks(oldCleanupStackDepth, valuesToReload);
+
+  // Move our deferred cleanups onto the EH stack.
+  for (size_t i = oldLifetimeExtendedSize,
+              e = lifetimeExtendedCleanupStack.size();
+       i != e;) {
----------------
erichkeane wrote:

I'm frightened by this 'loop' formulation in a few ways.   The most of which is the addition of 'sizeofs' but using != for the comparison here.  It seems it doesn't take much of a bug to turn this into an infinite loop.

Could we turn this to a `<` and an assert to make sure it equals? Or some other sort of assert to make that work? 

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


More information about the cfe-commits mailing list