[cfe-dev] [LLVMdev] [LLVMDev] Object in a try-catch block not being destroyed even after an exception

John McCall rjmccall at apple.com
Tue Jun 19 18:54:49 PDT 2012

On Jun 19, 2012, at 6:30 PM, Jordan Rose wrote:
> On Jun 19, 2012, at 18:25 , Richard Smith <richard at metafoo.co.uk> wrote:
>>> I believe the intent of the standard is quite clearly to have the local
>>> variable destroyed in reverse order of construction w.r.t. the temporaries,
>>> much like a return value must be.
>> That does not match my expectation, which is that in:
>>  S s(T(), T());
>> the T temporaries should *always* be destroyed before the S object is.
> To take this a step further, if the code looked like this:
> {
>   S s(T(), T());
>   doSomethingElse();
> }
> …the S object should not be destroyed until doSomethingElse() finishes. The T objects, OTOH, will be destroyed at the end of the S object's decl statement (or thereabouts).
> But if I /remove/ the call to doSomethingElse(), suddenly the S object is destroyed first?

Along normal control flow, there's no debate this we always see this:
  s(temp1, temp2); // assuming left-to-right evaluation for sake of argument
  doSomethingElse(); // if present

Annotating this with exceptional edges, we would have:
  temp1.T(); // resume
  temp2.T(); // temp1.~T(); resume
  s(temp1, temp2); // temp2.~T(); temp1.~T(); resume
  temp2.~T(); // ??
  temp1.~T(); // s.~S(); resume
  doSomethingElse(); // s.~S(); resume
  s.~S(); // resume
The presence of doSomethingElse does not affect the ordering here, and I'm not sure why you're suggesting that my interpretation would make it so.  The only question is what the ordering of destructors is out of temp2.~T().

I'll respond to Richard in more detail.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120619/d9a143e0/attachment.html>

More information about the cfe-dev mailing list