================
@@ -3017,6 +3009,13 @@ StmtResult Sema::BuildCXXForRangeStmt(
   if (getLangOpts().OpenMP >= 50 && BeginDeclStmt.isUsable())
     OpenMP().ActOnOpenMPLoopInitialization(ForLoc, BeginDeclStmt.get());
 
+  // P2718R0 - Lifetime extension in range-based for loops.
----------------
yronglin wrote:

Eg.

The lifetime of temporary in for-range-init was not extended. Because the sema 
will not ran into this branch: 
https://github.com/llvm/llvm-project/blob/e2d7cd685d40edd302da7396d9b9c97087e6ff20/clang/lib/Sema/SemaStmt.cpp#L2731

```cpp
template <typename T>
int test1() {
    int x = 5;
    int sum = 0;
    for (int _ : f1(g(x))) sum += x;
    sum += x;
    return sum;
}
```

But lifetime of the temporary in this for-range-init was correct extended:
```cpp
template <typename T>
T test1() {
    T x = 5;
    T sum = 0;
    for (T _ : f1(g(x))) sum += x;
    sum += x;
    return sum;
}
```

So just simply move the lifetime extension logic will fix this issue.

https://github.com/llvm/llvm-project/pull/177191
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to