<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55325>55325</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-format] Combining C++20 designated initializers and lambdas gets formatting messed up
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ifarbod
</td>
</tr>
</table>
<pre>
This is the code I have:
```cpp
#include <functional>
#include <iostream>
namespace zsl
{
template <typename T>
class Property
{
public:
using Getter = std::function<const T&(T&)>;
using Setter = std::function<void(T&, T)>;
struct GetterSetter
{
Getter get;
Setter set;
};
constexpr Property(T& ref, GetterSetter gettersetter =
{
.get = [](auto& var) constexpr { return var;},
.set = [](auto& var, auto value) { var = value; }
}) noexcept
: m_ref(ref), m_gettersetter(gettersetter)
{}
constexpr operator T() const noexcept
{
return m_gettersetter.get == nullptr ? m_ref : m_gettersetter.get(m_ref);
}
constexpr T& operator=(T value) noexcept
{
if (m_gettersetter.set != nullptr)
{
m_gettersetter.set(m_ref, value);
}
return m_ref;
}
private:
T& m_ref;
GetterSetter m_gettersetter;
};
} // namespace zsl
class ProperyTest
{
public:
zsl::Property<int> prop{m_something,
{
.get = [this](auto& var) constexpr
{
return var + 2;
},
.set = [this](auto& var, auto value) constexpr
{
var = value;
}}};
private:
int m_something = 0;
};
auto main(int argc, char** argv) -> int
{
ProperyTest t;
t.prop = 123;
std::cout << t.prop;
return 0;
}
```
What I get, after formatting with `clang-format -i Code.cpp`:
```
#include <functional>
#include <iostream>
namespace zsl {
template <typename T> class Property {
public:
using Getter = std::function<const T &(T &)>;
using Setter = std::function<void(T &, T)>;
struct GetterSetter {
Getter get;
Setter set;
};
constexpr Property(T& ref, GetterSetter gettersetter =
{
.get = [](auto& var) constexpr { return var;
}, .set = [](auto &var, auto value) { var = value; }
} // namespace zsl
) noexcept
: m_ref(ref), m_gettersetter(gettersetter)
{}
constexpr operator T() const noexcept {
return m_gettersetter.get == nullptr ? m_ref : m_gettersetter.get(m_ref);
}
constexpr T &operator=(T value) noexcept {
if (m_gettersetter.set != nullptr) {
m_gettersetter.set(m_ref, value);
}
return m_ref;
}
private:
T &m_ref;
GetterSetter m_gettersetter;
}
;
} // namespace zsl
class ProperyTest {
public:
zsl::Property<int> prop{m_something,
{.get = [this](auto &var) constexpr {return var + 2;
}, .set = [this](auto &var, auto value) constexpr {
var = value;
}
}
}
;
private:
int m_something = 0;
}
;
auto main(int argc, char **argv) -> int {
ProperyTest t;
t.prop = 123;
std::cout << t.prop;
return 0;
}
```
Notice the namespace comment in the middle of the namespace.
To reproduce, simply copy my input code and try to format it with any of the default styles, I tried WebKit and Microsoft but they look ugly too.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVWFuvozYQ_jXkxToRgZPbAw-57KlWVatKPdI-HhlwErcGI2zSZX99ZwwhmEsuu9pKRSgk2DPzzXgunxLKuAzeT1wRuPWJkUjGjHwmJ3pmjr9x3L3jbpyFW91RltVvPJ-nkShgr-PvDkUaaS5TKhz_09AGLpXOGU2uy-YzpQlTGY0Y-aZEvbDctndolmSCaqNElxlDCfLeqIkEVYr8kcuM5brsaMiKUPCocYLAVSieHskvTGuWg8o9UTrGDf7m4gLYiWSqNBjxFo63qh5rtOhvu4r-vK3oLHncqNihRkvPVRsEp4h0jatSel1s_CH1VcM_Mm1BwqsGpDpLznI_YNX4yb5m-TWAFViSswMCbuNBc_BQjce24R5IvKYgY4LjzLfOfA_aaaElGjjTHILRQgDyYFUXeWrWACxA9nYDOtVNnTuCP-G7KBhaQL2wYCSql_7WhKODfo-bU8m-RizTnUV_Q5IPE5KV-VyjmeSjHRBYsn-u7fO7GBwKPoaeapljfqyaqAyA6cW4DpgN5RJ09DgthMg0ev9WuVA7090PhmsP1728GcVtMuUCHg1C8lwD_wB8DnDQsIXGHK83a6G3gjmaa301V6d2DaxewQx4aEUW5W9EJMv5GbqT1WNMXPqSVjF1sqepzV6dwhsw6r3BTYa6Za8Llu9M6fuNEDWYdtWUPjTpFLrGJ5LBGxBNPpRMmD5Bn-sV4t1qBzF1u-L78oNKW4dhytjbEq93iE0J3-kXI6i6PeN7MHZ7zDDA6rZPeCiF4CRIK_5Gs3sjSwz-hPIUXENZmh8j9Cs6oX8wizf46ozOveAR40nbKYJWWwlE7Pmhp5gUBsbM862lZu5FssBA7-Cu91v76kO0vbDJRdujLyeqgYWY3gTnc8CiOcg8oVpjQP7h-kSQjwiaHl-qBfLCyQ7IyxRJCmjrkZefxlzIo6SF2HyFjFfoM0SF1EyFDFGVp4gKucNUBniKXRIj1GSQlvwfSUmTuQBkmIlgCL-DiWCfv9Hm_0Ny8jAxaYf3pzKRUYAmX-8ykDbOxymHnTxPs4serxhkFHfYhPHPlniURVRf-lziaSpxo0f9GIfoXyAwziGauuoU6Cg5GKjSEY2j87-dA8MDvl2_t4PfPdv7I35Iy61BT6pJ3x30bSfGJvzofH9suj8523-XmkPm4Z8N1zyMZJIwQMtTs5DwOBaMyIO9bdrW8y7BMkCJi4hhEBSHsVuCpqwkSQmaMsBs_s6gaUx0XhIIXs0VuK44BE3Li5GYHWghNPhcCqZQ4WcQ4iwmX1j4Kwiglt94lEslD5qEoBzESiKk_JsUR4HqZQ1wEgd-vPbXdKK5FiyA5GtTFUhCoCpJyFM8-h0kLtyeCxAUP6aQJjGg55pTwb9BeRvLgiZhTBWOPNWmQhAZBfuLbFLkIjhpnSk8MlPnR3CxCKcQW_ghxPnyeIGo_cUiaGJvXKkCvX2bz31vPjkFs-VqHVLfd-nrYrlY0HBN56tXFi7XbBaHKzYRNGRCBdXUm_DAcz3PnbtLD-Td2ZQtYhqv5uHc9VfebLF0Xl0GGSumaHgq8-MkDwyGsDgqWBRcaXVdhPYDIWDsoh8y_iTzgB9oHsp4YuAGBuu_RJVU4g">