<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">