================
@@ -10950,6 +10950,9 @@ bool 
ArrayExprEvaluator::VisitCXXParenListOrInitListExpr(
 }
 
 bool ArrayExprEvaluator::VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E) {
+
+  FullExpressionRAII Scope(Info);
+
----------------
zygoloid wrote:

This should be done after we evaluate the common expression, not before, and 
should be *inside* the `for` loop below so that we destroy temporaries after 
each iteration of the initialization loop. That is, the individual element 
initialization should be treated as a full-expression, but the evaluation of 
the source (typically array) expression should not.

This fixes a conformance issue with default arguments (though it's a little 
hard to observe given that it's hard to give constant-evaluated default 
arguments side effects). The relevant standard wording is 
https://eel.is/c++draft/class.temporary#5; adding a comment saying this is 
implementing C++ [class.temporary]/5 would be helpful.

IR generation gets this right already; the corresponding implementation there 
is this 
`RunCleanupsScope`:https://github.com/llvm/llvm-project/blob/d28a782542aff50abf2b072780748ce57d982705/clang/lib/CodeGen/CGExprAgg.cpp#L1882

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

Reply via email to