================ @@ -964,11 +966,26 @@ static bool pathOnlyInitializesGslPointer(IndirectLocalPath &Path) { return false; } -void checkExprLifetime(Sema &SemaRef, const InitializedEntity &Entity, +void checkExprLifetime(Sema &SemaRef, const CheckingEntity &CEntity, Expr *Init) { - LifetimeResult LR = getEntityLifetime(&Entity); - LifetimeKind LK = LR.getInt(); - const InitializedEntity *ExtendingEntity = LR.getPointer(); + LifetimeKind LK = LK_FullExpression; + + const AssignedEntity *AEntity = nullptr; + // Local variables for initialized entity. + const InitializedEntity *InitEntity = nullptr; + const InitializedEntity *ExtendingEntity = nullptr; + if (auto IEntityP = std::get_if<const InitializedEntity *>(&CEntity)) { + InitEntity = *IEntityP; + auto LTResult = getEntityLifetime(InitEntity); + LK = LTResult.getInt(); + ExtendingEntity = LTResult.getPointer(); + } else if (auto AEntityP = std::get_if<const AssignedEntity *>(&CEntity)) { + AEntity = *AEntityP; + if (AEntity->LHS->getType()->isPointerType()) // builtin pointer type + LK = LK_Extended; + } else { + llvm_unreachable("unexpected kind"); + } // If this entity doesn't have an interesting lifetime, don't bother looking // for temporaries within its initializer. ---------------- usx95 wrote:
Another good refactoring would be to make `TemporaryVisitor`, `visitLocalsRetainedByReferenceBinding`, `visitLocalsRetainedByInitializer` as member functions of a separate class, say, `CheckLifetimeVisitor`. There share a lot of data like `IndirectLocalPath &Path`, `LocalVisitor Visit`. `Path` and `LocalVisitor` could be member var and member function respectively. (This is again not relevant and could be a separate patch). https://github.com/llvm/llvm-project/pull/96475 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits