<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/114201>114201</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Dangling false positive if the the owner is also moved in the initializer.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:diagnostics,
            clang:memory-safety
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hokein
      </td>
    </tr>
</table>

<pre>
    This issue is identified in #112751.

```cpp
// case1
namespace std {
template<typename T>
struct unique_ptr {
  T &operator*();
  T *get() const [[clang::lifetimebound]];
};
} // namespace std

struct X {
  X(std::unique_ptr<int> up) :
 pointer(up.get()), owner(std::move(up)) {}

  int *pointer;
 std::unique_ptr<int> owner;
};
```

When we add the `clang::lifetimebound` annotation to `unique_ptr::get()`, clang emits a dangling-field warning for the `pointer(up.get())` member initializer. This warning is a false positive in this context, as the `owner` member is moved as part of the initialization, retaining ownership.

Another example occurs in designated-initializer cases:

```cpp
// case2
struct X {
   int *pointer;
   std::unique_ptr<int> owner;
};

X func(std::unique_ptr<int> up) {
   return {
      .pointer = up.get(),
      .owner = std::move(up)
   };
}
```

Fixing these false positives is hard because it would require tracking dependencies between expressions, which is beyond the capabilities of the current statement-local analysis.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVd2O4jgTfRpzUwIlDuHnIhd0MzxBS1_ffXLsgtSOY2fsStPs06_sQDfMTo9GK5kQ2cdVp8rnOCpGOjnERtRPot7P1MidD03nvyO5WevNpXnpKALFOCKkF4OO6UhogBwIWZWlXNflQhR7Ueyuz1UxDT0M1xl5EPIAWkUspxmneoyD0giRDYj10zTN2A9WMYrqmS8DJhS8iOrbtBo5jJphdPRjxP8PHD43AryAkCs_YFDsg5A7ITdCbkX1ANidkKcF0N5Fhlz3k7bKnUS1E9XO0hGZemz96Iyo92ncYoj1wztcy3qo5b4RV76v9zRfhdwkWE72WYmonsmxqL7BOCR2aX3aMXhyjEHIzTgsPujn8Qz-7PLSR8Tev2GGTpiceb2_JwVAjlMrboE_OvRbWlOmX3bidtz3Wf7XoYMzgjIGuENIaviqyasClHOeFZN3wD6B7ymkHZ-Fr4pUeA4G2BNHUGCUO1lyp_mR0Bo4q-DIneDowy35111cFdBj32IAcsSkLP2NYQFZ9rdAlJIclY0Ig4_E9IZJ_pww2jvGd06kVLylm7p1FzpCOhmTIIMKDP6YoR8pc-0pRkBWlJPmGLGj4cFcO-e5wwD4rvrBInitxxATG4PJy4rRzO8qyaaLH3L6A4fKr8X7pXTgP4snP1_hODr9h864oxOQx-AepgBgcaUHotrD43E_P-AyrYz6tX9u2J98_xvZH-g9HR13GPEnwaRLFDoVDLSo1RgRiOHsR2sg4I-RAgIHpb-n_QYHdAadJozQIp8RHeD7EDBG8i4moZw70l2K2eLFu8llWg2qJUuc9l0lpscQ0DFEVow9Op5br5UF5ZS9RIqLmWkqs622aoZNua4KuZHrejnrGrUqNkW7LSu10nVtjFzJssRtvS62ZbU02xk1spDLsqiKsijqulrItSrUUm5wpY-otqVYFtgrsgtr3_qFD6dZ_pA0ZbmURTmzqkUb87dHytv1YEidnI9MOgop05F9rvXY-3CZR3VEvqTVej8LTQo-b8dTFMvCUuT4mY6JLTb76_XwLwtPHUq_SQrJ5zb6q1ezw_HhWpiNwTYd85AdlT1zIu7GdqF9L-QhJb7-zYfg_0LNQh5y0VHIw7Xut0b-EwAA__8a40pI">