[clang] [Sema] Fix lifetime extension for temporaries in range-based for loops in C++23 (PR #145164)

via cfe-commits cfe-commits at lists.llvm.org
Sun Jul 6 07:33:05 PDT 2025


yronglin wrote:

> Forgot that the revert wouldn't include the `lifetimebound` attribute. I restructured the switch case like that, in order to catch both:
> 
> ```
>     case LK_Extended: {
>       if (!MTE) {
>         // The initialized entity has lifetime beyond the full-expression,
>         // and the local entity does too, so don't warn.
>         //
>         // FIXME: We should consider warning if a static / thread storage
>         // duration variable retains an automatic storage duration local.
>         return false;
>       }
>       
>       switch (shouldLifetimeExtendThroughPath(Path)) {
>       case PathLifetimeKind::Extend:
>         assert(!IsGslPtrValueFromGslTempOwner); // Just a test, to be sure that we aren't losing something here.
>                                                 // can be removed safely I guess.
>            
>         // Update the storage duration of the materialized temporary.
>         // FIXME: Rebuild the expression instead of mutating it.
>         MTE->setExtendingDecl(ExtendingEntity->getDecl(),
>                               ExtendingEntity->allocateManglingNumber());
>         // Also visit the temporaries lifetime-extended by this initializer.
>         return true;
>       
>     case PathLifetimeKind::NoExtend:
>       if (SemaRef.getLangOpts().CPlusPlus23 && InitEntity) {
>         if (const VarDecl *VD =
>             dyn_cast_if_present<VarDecl>(InitEntity->getDecl());
>             VD && VD->isCXXForRangeImplicitVar())
>           return false;
>       }
>           
>           
>       if (IsGslPtrValueFromGslTempOwner && DiagLoc.isValid()) {
>         SemaRef.Diag(DiagLoc, diag::warn_dangling_lifetime_pointer)
>             << DiagRange;
>         return false;
>       }
> 
>         // If the path goes through the initialization of a variable or field,
>         // it can't possibly reach a temporary created in this full-expression.
>         // We will have already diagnosed any problems with the initializer.
>         if (pathContainsInit(Path))
>           return false;
> 
>         SemaRef.Diag(DiagLoc, diag::warn_dangling_variable)
>             << RK << !InitEntity->getParent()
>             << ExtendingEntity->getDecl()->isImplicit()
>             << ExtendingEntity->getDecl() << Init->isGLValue() << DiagRange;
>         break;
>       }
>       break;
>     }
> ```

Could you push the changes to this PR?

https://github.com/llvm/llvm-project/pull/145164


More information about the cfe-commits mailing list