================ @@ -5567,19 +5568,35 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) { ImmediateCallVisitor V(getASTContext()); if (!NestedDefaultChecking) V.TraverseDecl(Field); - if (V.HasImmediateCalls) { + + // CWG1815 + // Support lifetime extension of temporary created by aggregate + // initialization using a default member initializer. We should always rebuild + // the initializer if it contains any temporaries (if the initializer + // expression is an ExprWithCleanups). Then make sure the normal lifetime + // extension code recurses into the default initializer and does lifetime + // extension when warranted. + bool ContainsAnyTemporaries = + isa_and_present<ExprWithCleanups>(Field->getInClassInitializer()); + if (V.HasImmediateCalls || InLifetimeExtendingContext || + ContainsAnyTemporaries) { ---------------- yronglin wrote:
UUIC, the concerns in https://github.com/llvm/llvm-project/pull/87933#discussion_r1589797605 is that lifetime extension context will extend all temporaries in the initializer. Currently, lifetime extension context is just a flag and collect all top-level temporaries, in for-range statements, we extend these collected temporaries to __range var. But here we can ignore the collected temporaries, so I think we can only rebuild lifetime extending context when `Field->getInClassInitializer()->containsErrors() && (V.HasImmediateCalls || (InLifetimeExtendingContext && ContainsAnyTemporaries))`. @zygoloid @cor3ntin What do you think? https://github.com/llvm/llvm-project/pull/97308 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits