efriedma-quic wrote:

If I understand correctly, a "lifetime-extended" cleanup deals with the case of 
a temporary whose lifetime continues beyond the expression.  In other words, it 
has different lifetimes depending on how you exit the expression: if the 
variable's lifetime begins, it lasts until the end of that variable's lifetime. 
 Otherwise, it only lasts until the end of the full-expression.  Due to the way 
it's structured, the current mechanism only works correctly with thrown 
exceptions; it doesn't work with other ways of exiting an expression.  This 
patch attempts to fix that.

Passing "0" to AddLifetimeExtendedCleanups() seems wrong.  For example, suppose 
you have the following:

```
int foo();
struct Printy {
  ~Printy() { }
};
struct Printies {
  const Printy &a;
  const Printy &b;
  ~Printies() {}
};
void f() {
  Printies p2{
    Printy(), 
    ({
      for (int i = 0; i < 10; ++i) {
        Printies p3{
          Printy(),
          ({
          if(foo()) {
            break;
          }
          Printy();
        })};
      }
      Printy();
    })};
}
```

The "break" needs to run some of the cleanups associated with lifetime-extended 
temporaries... but not all of them.

We might want to consider making the whole process of lifetime extensions a bit 
more explicit.  Currently, we lazily construct the set of temporaries as we 
evaluate the initializer, then reconstruct the cleanup stack at the end of the 
full-expression to reflect the lifetime extension.  Instead, we could have some 
separate code to compute the list of lifetime-extended temporaries associated 
with a given variable, and create cleanups for them before we start emitting 
code for the initializer.  That way, we don't need to mess with the cleanup 
stack later; we just need to make sure we correctly skip executing the cleanups 
which aren't supposed to run.

See also #12658.

https://github.com/llvm/llvm-project/pull/80698
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to