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

    <tr>
        <th>Summary</th>
        <td>
            [Clang] `[[clang::lifetimebound]]` not propagated through copies
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    This:

```c++
auto f([[clang::lifetimebound]] int& r) {
  return [&]{
    return r;
 };
}

auto g(int i) {
  return f(i);
}

struct Closure {
  int& r;
  int operator()() const { return r; }
};

auto F([[clang::lifetimebound]] int& r) {
  return Closure{ r };
}

auto G(int i) {
  return F(i);
}
```

Gets two warnings:

```
<source>:8:12: warning: address of stack memory associated with parameter 'i' returned [-Wreturn-stack-address]
    8 | return f(i);
      |            ^
<source>:21:12: warning: address of stack memory associated with parameter 'i' returned [-Wreturn-stack-address]
   21 |   return F(i);
      | ^
```

But if we introduce a temporary variable: https://godbolt.org/z/PEq3PKsqv

```c++
auto g(int i) {
  auto l = f(i);
  return l;
}

auto G(int i) {
  auto l = F(i);
 return l;
}
```

... There are no longer any warnings.

Trying to apply `[[clang::lifetimebound]]` to the copy constructor, like:

```c++
struct Closure {
  int& r;
 Closure([[clang::lifetimebound]] const Closure&) = default;
  int operator()() const { return r; }
};
```

doesn't really do what is intended: The "lifetime analysis" is tied to the the temporary variable (`l`) instead of what the temporary variable was bound to (`int i`).

Lambda case is similar to the second case in #19605 (`auto f1`)

Maybe trivial copy constructors should "copy" the lifetimebound stuff too? Especially in this case as it's a NRVO variable
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVlGP4jYQ_jXmZbTI2JDAQx7YZbmH9tpTtWqfJ_GQuGfsnO0sor--cgiQ68J1rzqpUTabxJ5vZj5__giGoGtLVLDFI1tsJtjFxvnio45o1qFxnyelU8fipdGByTXjG8bP14yfzoqJx3T2b7GLDnZMLHu8x8qgrVOgXBu9o6j3VLrOKrbYsMUGtI1MZOCZWAHLBwgAT7HzFhKEyNLU69Bl0DN5fsnyzeUh3Y-K7MupmVhqG0HfTpOqTUP3MEL0XRXhybjQeRoDXMqX41fgWvIYnU8siNXpCpWzIabgcQNwTTXu4Vr69scwOdTeZ_9Xuj58m67tfbrOihhDfqAYIB4cHNBbbeu7Mhoe5VNwna-IyWcm10sm1zPB5Pocnm5RKU8hgNtBiFh9hj3tnT8ChuAqjZEUHHRsoEWPe4rkgYlcM5EPLZBK0nr44_T00GM8DKCJzovUlsDyp7sygf5IM0YHWzzfbETM_s9OxGyo894aXnu5NnBrNR-7CHoHB0qC8051FQFCpH3rPPojvKLXWBpKzTUxtv1qiy0T29qp0pk4db5mYvsXE9tPz1_kp5_Cl9d3usq9bdwPGmByc2uNho7Nf5L8CPotZd9AvkXddDqFl4Y8AXoC68A4W5MHtMfL3piOA178UdsaogNsW3OEhPcOK2AZTzGxIahcezwZT3KwZEhPYPRnepeTf4_tnf3lnWZ18sJLUNazLjegaIediT_aTm-thnIULBN5BE9ozBGUg0ODEXRISckqUknELw0BE-LcBaBFcww6MCHS1KhJndnu_97sBEgFZ9yk_GIF2oZIqNKO79PdCTpggJ6xBH5COOmzR_lKJj_jvlQIFQZKFQW91wb9uahAlbNqGLXAhJytMr4YME-_1rMT6hj0Ix5Lguj1q0bzRkcBQuM6oxIzaSyRkZJ9tdYQYrfbQXSOyS08h5Yq3TOtLcRGh1NNGEBHJvIACL_89vuvFwomqpBqJVc4oWKWC7HM5sv5ctIUOONZXu6kLFWWVSs-zyuOVUk8r7halquJLgQXc77ki5mUc55PyyrjKOc7XspKlLhjc0571GZqzOs-GdJEh9BRMeOz1ZJPDJZkwvmDyBdp1kPZ1YHNudEhhmtc1NH0n05PveAXm-_ZpNZFaL1rse6NPjbedXWTyNYUJp03xT8cVMemK6eV2zOxTSUM_x5a7_6kKjKx7fsITGyHVl4L8XcAAAD__zmL3JI">