================
@@ -297,11 +297,22 @@ class LifetimeChecker {
             // FIXME: Diagnose invalidated return escapes separately.
           } else
             llvm_unreachable("Unhandled OriginEscapesFact type");
-        } else if (const auto *RetEscape = dyn_cast<ReturnEscapeFact>(OEF))
+        } else if (const auto *RetEscape = dyn_cast<ReturnEscapeFact>(OEF)) {
           // Return stack address.
-          SemaHelper->reportUseAfterReturn(
-              IssueExpr, RetEscape->getReturnExpr(), MovedExpr, ExpiryLoc);
-        else if (const auto *FieldEscape = dyn_cast<FieldEscapeFact>(OEF))
+          const AccessPath &Path = L->getAccessPath();
+          bool IsReference =
+              cast<FunctionDecl>(FD)->getReturnType()->isReferenceType();
+          if (const auto *VD = Path.getAsValueDecl())
+            SemaHelper->reportUseAfterReturn(VD, IssueExpr,
+                                             RetEscape->getReturnExpr(),
+                                             MovedExpr, IsReference);
+          else if (const auto *MTE = Path.getAsMaterializeTemporaryExpr())
+            SemaHelper->reportUseAfterReturn(MTE, RetEscape->getReturnExpr(),
+                                             MovedExpr, IsReference);
+          else
+            llvm_unreachable(
+                "unexpected loan kind for return stack address warning");
+        } else if (const auto *FieldEscape = dyn_cast<FieldEscapeFact>(OEF))
----------------
usx95 wrote:

Yes. I think that would keep the code somewhat cleaner here. The input now is 
`IssueExpr` and `AccessPath` which is essentially the Loan abstraction, so it 
makes sense to introduce this dependency.

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

Reply via email to