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

    <tr>
        <th>Summary</th>
        <td>
            Aggregate parens-init checks for dangling too aggressively
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          timsong-cpp
      </td>
    </tr>
</table>

<pre>
    Clang rejects the well-formed but dangling cases from http://eel.is/c++draft/dcl.init.general#example-3: 

```cpp
struct A {
  int a;
  int&& r;
};

int f();
int n = 10;

A a2(1, f());                   // well-formed, but dangling reference
A a4(1.0, 1);                   // well-formed, but dangling reference
```

```
<source>:9:9: error: reference member 'r' binds to a temporary object whose lifetime would be shorter than the lifetime of the constructed object
A a2(1, f());                   // well-formed, but dangling reference
        ^~~
<source>:3:9: note: reference member declared here
  int&& r;
        ^
<source>:10:11: error: reference member 'r' binds to a temporary object whose lifetime would be shorter than the lifetime of the constructed object
A a4(1.0, 1); // well-formed, but dangling reference
 ^
<source>:3:9: note: reference member declared here
  int&& r;
```

Now, these particular examples may well have justified a warning, but Clang also rejects

```cpp
void f(A);

void g() {
    f(A(1, 1));
}
```
in which both the temporary and the aggregate live to the end of the full-expression. It also warns on

```cpp
void h(int i) {
   f(A(1, static_cast<int&&>(i)));
}
```

```
<source>:16:31: warning: binding reference member 'r' to stack allocated parameter 'i' [-Wdangling-field]
    f(A(1, static_cast<int&&>(i)));
 ^
<source>:3:9: note: reference member declared here
 int&& r;
        ^
```
even though `i` outlives the aggregate.

This will affect uses of C++23 [`std::ranges::elements_of`](http://eel.is/c++draft/range.elementsof), which is an aggregate with a reference member that is intended to be used exactly like this.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVkGPozgT_TXOpRQEJkByyIFOJtJ3-U4r7XFk7AJ72tjINsn0ZX77ypDQ6Z7MqHfVWm2rQ8BUlV2vXr0U8151BnFPiidSHFdsDNK6fVC9t6Zb82FYNVa87A-amQ4cfkMePASJcEGt1611PQpoxgCCmU4r0wFnHj20zvYgQxhIXhN6IvSEqBPlCT1xQp8IfRKOtYHQk-A6UUaFpEODjmlCc_zO-kHjOid5DSQ9krS-Xst0_ufDMK_44EYeoAZSPc0rAMoEYCS_fya0JLQEt6yS6vh6P12jV0voltDd8iauGSD5EbL0nXkNjBK6zQg9LG6TJ_z8NwNwD1n0eoOawxYdGo5L9E2MnqTRMvvEyAuED3G9PuYHb0fHkeRfSF7vrh9A56yLN0tM6LFv0AGhlSO0gkYZ4SFYYBCwH6xj7gVsE2kDF2k9glYtBtUjXOyoBTQIXloX0EGQzEzUWkxsOz1za-Yyo7jG-jdKsHgWX378eIhLfsPF2IAPYRHINXMoQKLD39HxbrOHW0X61Vn23yzCA6b-A7h_lfonovyQ-_-3l3i2INEjDMwFxUfNHFxFyEPPXqZEQLIzwrfRB9UqFMDgwpxRprulNosk097elPL32nW2SkzEre815-5dN5P6Xtvg5jDTPls4_yprj1JVBi5ScQmNDXKq5yszmBHTCus6hx0LsfZnjPyJq2jEjQLtqPUavw8OvVfWJPC_MGcbcfBgzQfSlYRuo6qq93m9ScsHFhT_ypkPJD8spYyEoFt1zfkDaX9E3bIykmxqrVs983rqoTcsfd9kwcZT8mdgWlvOYlsMzLEew2ykohEpntZ_3hi_bhVqQYrjL2r5d5P-5I75mCy9hRLPGNXCjp0EUqaKlCnYMUT--LecSu4L8odUHi5Ka2BtG1VpjCODbeEwjwY0j8iRMvVBxPkhrx0zHfr5HjX2aIL_att4kOJI6PZDk8YUJLm523bC83BtDOWBmbseuKgggf0MXZAsRGNlAhqBIhKhwZiBiJLBg34BrZ4RglQ-WYl9Lnb5jq1wn5XVLi_KLKtWcr_bbUWJbCtYtS2KrOJb2ua8TctN1bKM0pXa05TmaR6vm21eJbSim6IoaFpuyoZvCrJJsWdKJ1qf-8S6bqW8H3FfZkVZrTRrUPtprKPU4AWml4TSOOW5ffRZN2PnySbVygf_GiWooHFfL0AMzKHx6ziiAZfInz201r3qeLB2hs17dUb9shqd3sd6-KUgnQpybBJue0JPcaPr13pwdvoloafpeLFm0_H_CgAA__9JMx7E">