[clang] [clang] Refactor: Introduce a new LifetimeKind for the assignment case, NFC (PR #99005)

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 16 01:34:39 PDT 2024


https://github.com/hokein created https://github.com/llvm/llvm-project/pull/99005

The current implementation for the assignment case uses a combination of the `LK_Extended` lifetime kind and the validity of `AEntity`, which is somewhat messy and doesn't align well with the intended mental model.

This patch introduces a dedicated lifetime kind to handle the assignment case, simplifying the implementation and improving clarity.

>From 0ba3ca0ac7538011b78376b30aa4aeded4a7fe54 Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Tue, 16 Jul 2024 10:23:44 +0200
Subject: [PATCH] [clang] Refactor: Introduce a new LifetimeKind for assignment
 cases, NFC

The current implementation for assignment case uses a combination of the
`LK_Extended` lifetime kind and the validity of `AEntity`, which is somewhat
messy and doesn't align well with the intended mental model.

This patch introduces a dedicated lifetime kind to handle assignment cases,
simplifying the implementation and improving clarity.
---
 clang/lib/Sema/CheckExprLifetime.cpp | 39 ++++++++++++++++------------
 1 file changed, 23 insertions(+), 16 deletions(-)

diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp
index 2f9ef28da2c3e..995e4cbadacfe 100644
--- a/clang/lib/Sema/CheckExprLifetime.cpp
+++ b/clang/lib/Sema/CheckExprLifetime.cpp
@@ -39,6 +39,11 @@ enum LifetimeKind {
   /// This is a mem-initializer: if it would extend a temporary (other than via
   /// a default member initializer), the program is ill-formed.
   LK_MemInitializer,
+
+  /// The lifetime of a temporary bound to this entity probably ends too soon,
+  /// because the entity is a pointer and we assign the address of a temporary
+  /// object to it.
+  LK_Assignment,
 };
 using LifetimeResult =
     llvm::PointerIntPair<const InitializedEntity *, 3, LifetimeKind>;
@@ -971,6 +976,8 @@ static void checkExprLifetimeImpl(Sema &SemaRef,
                                   const InitializedEntity *ExtendingEntity,
                                   LifetimeKind LK,
                                   const AssignedEntity *AEntity, Expr *Init) {
+  assert((AEntity && LK == LK_Assignment) ||
+         (InitEntity && LK != LK_Assignment));
   // If this entity doesn't have an interesting lifetime, don't bother looking
   // for temporaries within its initializer.
   if (LK == LK_FullExpression)
@@ -1008,19 +1015,7 @@ static void checkExprLifetimeImpl(Sema &SemaRef,
           return true;
       }
     }
-    if (AEntity) {
-      if (!MTE)
-        return false;
-      assert(shouldLifetimeExtendThroughPath(Path) ==
-                 PathLifetimeKind::NoExtend &&
-             "No lifetime extension for assignments");
-      if (!pathContainsInit(Path))
-        SemaRef.Diag(DiagLoc, diag::warn_dangling_pointer_assignment)
-            << AEntity->LHS << DiagRange;
-      return false;
-    }
 
-    assert(InitEntity && "only for initialization");
     switch (LK) {
     case LK_FullExpression:
       llvm_unreachable("already handled this");
@@ -1077,6 +1072,17 @@ static void checkExprLifetimeImpl(Sema &SemaRef,
       break;
     }
 
+    case LK_Assignment: {
+      if (!MTE)
+        return false;
+      assert(shouldLifetimeExtendThroughPath(Path) ==
+                 PathLifetimeKind::NoExtend &&
+             "No lifetime extension for assignments");
+      if (!pathContainsInit(Path))
+        SemaRef.Diag(DiagLoc, diag::warn_dangling_pointer_assignment)
+            << AEntity->LHS << DiagRange;
+      return false;
+    }
     case LK_MemInitializer: {
       if (MTE) {
         // Under C++ DR1696, if a mem-initializer (or a default member
@@ -1283,10 +1289,11 @@ void checkExprLifetime(Sema &SemaRef, const InitializedEntity &Entity,
 
 void checkExprLifetime(Sema &SemaRef, const AssignedEntity &Entity,
                        Expr *Init) {
-  LifetimeKind LK = LK_FullExpression;
-  if (Entity.LHS->getType()->isPointerType()) // builtin pointer type
-    LK = LK_Extended;
-  checkExprLifetimeImpl(SemaRef, nullptr, nullptr, LK, &Entity, Init);
+  if (!Entity.LHS->getType()->isPointerType()) // builtin pointer type
+    return;
+  checkExprLifetimeImpl(SemaRef, /*InitEntity=*/nullptr,
+                        /*ExtendingEntity=*/nullptr, LK_Assignment, &Entity,
+                        Init);
 }
 
 } // namespace clang::sema



More information about the cfe-commits mailing list