================ @@ -1361,6 +1367,20 @@ class Sema final { // VLAs). bool InConditionallyConstantEvaluateContext = false; + /// Whether we are currently in a context in which all temporaries must be + /// lifetime-extended, even if they're not bound to a reference (for example, + /// in a for-range initializer). + bool IsInLifetimeExtendingContext = false; + + /// Whether we should materialize temporaries in discarded expressions. + /// + /// [C++23][class.temporary]/p2.6 when a prvalue that has type other than cv + /// void appears as a discarded-value expression ([expr.context]). + /// + /// We do not materialize temporaries by default in order to avoid creating + /// unnecessary temporary objects. + bool MaterializePRValueInDiscardedExpression = false; ---------------- yronglin wrote:
I think this variable and related function `needMaterializePRValueInDiscardedExpression()` should be renamed to `NeedMaterializePRValue` and `needMaterializePRValue()` , then it can use in other cases. In [class.temporary P2][http://eel.is/c++draft/class.temporary#2] The materialization of a temporary object is generally delayed as long as possible in order to avoid creating unnecessary temporary objects[.](http://eel.is/c++draft/class.temporary#2.sentence-1) [Note [3](http://eel.is/c++draft/class.temporary#note-3): Temporary objects are materialized: [(2.1)](http://eel.is/c++draft/class.temporary#2.1) when binding a reference to a prvalue ([[dcl.init.ref]](http://eel.is/c++draft/dcl.init.ref), [[expr.type.conv]](http://eel.is/c++draft/expr.type.conv), [[expr.dynamic.cast]](http://eel.is/c++draft/expr.dynamic.cast), [[expr.static.cast]](http://eel.is/c++draft/expr.static.cast), [[expr.const.cast]](http://eel.is/c++draft/expr.const.cast), [[expr.cast]](http://eel.is/c++draft/expr.cast)), [(2.2)](http://eel.is/c++draft/class.temporary#2.2) when performing member access on a class prvalue ([[expr.ref]](http://eel.is/c++draft/expr.ref), [[expr.mptr.oper]](http://eel.is/c++draft/expr.mptr.oper)), [(2.3)](http://eel.is/c++draft/class.temporary#2.3) when performing an array-to-pointer conversion or subscripting on an array prvalue ([[conv.array]](http://eel.is/c++draft/conv.array), [[expr.sub]](http://eel.is/c++draft/expr.sub)), [(2.4)](http://eel.is/c++draft/class.temporary#2.4) when initializing an object of type std::initializer_list<T> from a [braced-init-list](http://eel.is/c++draft/dcl.init.general#nt:braced-init-list) ([[dcl.init.list]](http://eel.is/c++draft/dcl.init.list)), [(2.5)](http://eel.is/c++draft/class.temporary#2.5) for certain unevaluated operands ([[expr.typeid]](http://eel.is/c++draft/expr.typeid), [[expr.sizeof]](http://eel.is/c++draft/expr.sizeof)), and [(2.6)](http://eel.is/c++draft/class.temporary#2.6) when a prvalue that has type other than cv void appears as a discarded-value expression ([[expr.context]](http://eel.is/c++draft/expr.context))[.](http://eel.is/c++draft/class.temporary#2.sentence-2) — end note] https://github.com/llvm/llvm-project/pull/76361 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits