vcl/source/app/salvtables.cxx | 134 +++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 67 deletions(-)
New commits: commit 4b0f51efbcb9e71034089f431117e6bac92a26b2 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Tue Oct 25 14:39:53 2022 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Tue Oct 25 16:47:35 2022 +0200 Address a constexpr template point of instantiation issue ...that hits at least when building with Clang and --with-latest-c++ against recent libc++ or MSVC standard library (where C++20 and esp. C++23 made more and more class template member functions constexpr). My understanding is that there is some leeway at what point a compiler should instantiate such function specializations, and Clang decides to instantiate constexpr ones early (cf. <https://github.com/llvm/llvm-project/commit/242ad89a15d5466d166d47978bfff983d40ab511> "C++11 half of r147023: In C++11, additionally eagerly instantiate:" and its "Do not defer instantiations of constexpr functions" comment, and the discussion at <https://discourse.llvm.org/t/point-of-instantiation-of-constexpr-function-template/65129>). > In file included from vcl/source/app/salvtables.cxx:26: > In file included from workdir/UnoApiHeadersTarget/offapi/normal/com/sun/star/awt/XWindow.hpp:6: > In file included from workdir/UnoApiHeadersTarget/offapi/normal/com/sun/star/awt/XWindow.hdl:13: > In file included from workdir/UnoApiHeadersTarget/udkapi/normal/com/sun/star/lang/XComponent.hdl:7: > In file included from workdir/UnoApiHeadersTarget/udkapi/normal/com/sun/star/uno/XInterface.hdl:6: > In file included from include/com/sun/star/uno/Any.h:30: > In file included from include/rtl/ustring.hxx:34: > In file included from ~/llvm/inst/bin/../include/c++/v1/ostream:168: > ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:47:19: error: invalid application of 'sizeof' to an incomplete type 'SalFlashAttention' > static_assert(sizeof(_Tp) >= 0, "cannot delete an incomplete type"); > ^~~~~~~~~~~ > ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:281:7: note: in instantiation of member function 'std::default_delete<SalFlashAttention>::operator()' requested here > __ptr_.second()(__tmp); > ^ > ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:247:75: note: in instantiation of member function 'std::unique_ptr<SalFlashAttention>::reset' requested here > _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 ~unique_ptr() { reset(); } > ^ > vcl/source/app/salvtables.cxx:292:20: note: in instantiation of member function 'std::unique_ptr<SalFlashAttention>::~unique_ptr' requested here > SalInstanceWidget::SalInstanceWidget(vcl::Window* pWidget, SalInstanceBuilder* pBuilder, > ^ > vcl/inc/salvtables.hxx:172:7: note: forward declaration of 'SalFlashAttention' > class SalFlashAttention; > ^ Change-Id: I49523c8db5b3fdd4dc5614fdb5c6f8ced73f5eca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141821 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index d4f9b41e329c..7af5cccb4e6b 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -241,6 +241,73 @@ void SalMenu::ApplyPersona() {} SalMenuItem::~SalMenuItem() {} +class SalFlashAttention +{ +private: + VclPtr<vcl::Window> m_xWidget; + Timer m_aFlashTimer; + Color m_aOrigControlBackground; + Wallpaper m_aOrigBackground; + bool m_bOrigControlBackground; + int m_nFlashCount; + + void SetFlash() + { + Color aColor(Application::GetSettings().GetStyleSettings().GetHighlightColor()); + m_xWidget->SetControlBackground(aColor); + } + + void ClearFlash() + { + if (m_bOrigControlBackground) + m_xWidget->SetControlBackground(m_aOrigControlBackground); + else + m_xWidget->SetControlBackground(); + } + + void Flash() + { + constexpr int FlashesWanted = 1; + + if (m_nFlashCount % 2 == 0) + ClearFlash(); + else + SetFlash(); + + if (m_nFlashCount == FlashesWanted * 2) + return; + + ++m_nFlashCount; + + m_aFlashTimer.Start(); + } + + DECL_LINK(FlashTimeout, Timer*, void); + +public: + SalFlashAttention(VclPtr<vcl::Window> xWidget) + : m_xWidget(std::move(xWidget)) + , m_aFlashTimer("SalFlashAttention") + , m_bOrigControlBackground(false) + , m_nFlashCount(1) + { + m_aFlashTimer.SetTimeout(150); + m_aFlashTimer.SetInvokeHandler(LINK(this, SalFlashAttention, FlashTimeout)); + } + + void Start() + { + m_bOrigControlBackground = m_xWidget->IsControlBackground(); + if (m_bOrigControlBackground) + m_aOrigControlBackground = m_xWidget->GetControlBackground(); + m_aFlashTimer.Start(); + } + + ~SalFlashAttention() { ClearFlash(); } +}; + +IMPL_LINK_NOARG(SalFlashAttention, FlashTimeout, Timer*, void) { Flash(); } + void SalInstanceWidget::ensure_event_listener() { if (!m_bEventListener) @@ -599,73 +666,6 @@ VclPtr<VirtualDevice> SalInstanceWidget::create_virtual_device() const DeviceFormat::DEFAULT); } -class SalFlashAttention -{ -private: - VclPtr<vcl::Window> m_xWidget; - Timer m_aFlashTimer; - Color m_aOrigControlBackground; - Wallpaper m_aOrigBackground; - bool m_bOrigControlBackground; - int m_nFlashCount; - - void SetFlash() - { - Color aColor(Application::GetSettings().GetStyleSettings().GetHighlightColor()); - m_xWidget->SetControlBackground(aColor); - } - - void ClearFlash() - { - if (m_bOrigControlBackground) - m_xWidget->SetControlBackground(m_aOrigControlBackground); - else - m_xWidget->SetControlBackground(); - } - - void Flash() - { - constexpr int FlashesWanted = 1; - - if (m_nFlashCount % 2 == 0) - ClearFlash(); - else - SetFlash(); - - if (m_nFlashCount == FlashesWanted * 2) - return; - - ++m_nFlashCount; - - m_aFlashTimer.Start(); - } - - DECL_LINK(FlashTimeout, Timer*, void); - -public: - SalFlashAttention(VclPtr<vcl::Window> xWidget) - : m_xWidget(std::move(xWidget)) - , m_aFlashTimer("SalFlashAttention") - , m_bOrigControlBackground(false) - , m_nFlashCount(1) - { - m_aFlashTimer.SetTimeout(150); - m_aFlashTimer.SetInvokeHandler(LINK(this, SalFlashAttention, FlashTimeout)); - } - - void Start() - { - m_bOrigControlBackground = m_xWidget->IsControlBackground(); - if (m_bOrigControlBackground) - m_aOrigControlBackground = m_xWidget->GetControlBackground(); - m_aFlashTimer.Start(); - } - - ~SalFlashAttention() { ClearFlash(); } -}; - -IMPL_LINK_NOARG(SalFlashAttention, FlashTimeout, Timer*, void) { Flash(); } - void SalInstanceWidget::call_attention_to() { m_xFlashAttention.reset(new SalFlashAttention(m_xWidget));