<div class="gmail_quote">On Tue, Jan 17, 2012 at 8:22 AM, Erik Verbruggen <span dir="ltr"><<a href="mailto:erik.verbruggen@me.com">erik.verbruggen@me.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I think the C++ standard* provides some help in making a choice about<br>
how to represent this. It doesn't actually say that ~A() evaluates after<br>
the enclosing statement. Instead it defines 'full-expressions' as an<br>
expression which is not a subexpression of any other expression<br>
([intro.execution] 1.9p10). As *part* of this full-expression, all<br>
temporary objects' non-trivial destructors must be called<br>
([class.temporary] 12.2p3). To me, that indicates that the destructor<br>
should be placed after the complete subexpression in the return<br>
statement, but within the return statement itself. This has the nice<br>
property of preserving the (very useful!) invariant that terminator<br>
statements are the last statement in the CFG block.<br>
</blockquote>
<br></div>
This would mean that a full expression of "return SomeClass();" would get split in two:</blockquote><div><br></div><div>A fine point, but an important one: "return SomeClass();" is not a full expression. It is a statement. The only full expression here is "SomeClass();". I think it is very natural to handle the full expression evaluation prior to handling the statement in the CFG.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> all the implicit destructors calls for the scope get placed between the return value calculation and the actual return of that value. If you would want to base code generation on the CFG, it would force an extra pass to identify whether calculated values should be constructed in a return value slot or not. So I think that using return/throw (and possibly goto) as markers, would be a simplification.</blockquote>
</div><br><div>I think we should cross this bridge when we get there. I strongly suspect that there are easy ways to solve the return value slot question no matter what representation we choose, and we should choose the representation of the CFG based on the language standard and the tightest model possible for the semantics specified there.</div>