[llvm-branch-commits] [clang] [LifetimeSafety] Associate origins to all l-valued expressions (PR #156896)

Gábor Horváth via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Sep 4 08:54:13 PDT 2025


================
@@ -438,12 +452,31 @@ class FactGenerator : public ConstStmtVisitor<FactGenerator> {
   void VisitDeclStmt(const DeclStmt *DS) {
     for (const Decl *D : DS->decls())
       if (const auto *VD = dyn_cast<VarDecl>(D))
-        if (hasOrigin(VD->getType()))
+        if (hasOrigin(VD))
           if (const Expr *InitExpr = VD->getInit())
             addAssignOriginFact(*VD, *InitExpr);
   }
 
-  void VisitDeclRefExpr(const DeclRefExpr *DRE) { handleUse(DRE); }
+  void VisitDeclRefExpr(const DeclRefExpr *DRE) {
+    handleUse(DRE);
+    // For non-pointer/non-view types, a reference to the variable's storage
+    // is a borrow. We create a loan for it.
+    // For pointer/view types, we stick to the existing model for now and do
+    // not create an extra origin for the l-value expression itself.
+
+    // FIXME: A loan to `DeclRefExpr` for a pointer or view type can be
----------------
Xazax-hun wrote:

That being said, I think there is no ambiguity here. The DeclRefExpr is always referring to the lvalue. And we should always have the LValueToRValue conversion when we refer to the value. Handling that conversion correctly can help us never be ambiguous. 

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


More information about the llvm-branch-commits mailing list