summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2022-02-12 17:10:43 +0100
committerStephan Bergmann <sbergman@redhat.com>2022-02-12 19:37:43 +0100
commitd2ba5d98ec67e684c819ef80421eb496723a8d06 (patch)
tree050bcf0179c152892a6d4b8e841f71cfe541bef7 /sw
parent7cd3013a3704b8365e295f4260e242273d45d27e (diff)
Fix some tautological std::type_info (in-)equality comparisons
...which could never succeed. I became aware of this when Clang 15 trunk -std=c++2b, implementing <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1328r1.html> "Making std::type_info::operator== constexpr", pointed at two of the broken comparisons with > sw/source/uibase/app/docsh2.cxx:478:25: error: code will never be executed [-Werror,-Wunreachable-code] > pTmpFrame->GetFrame().Appear(); > ^~~~~~~~~ > sw/source/uibase/app/docsh2.cxx:475:33: error: code will never be executed [-Werror,-Wunreachable-code] > bOnly = false; > ^~~~~ (It didn't emit warnings pointing at any of the other broken comparisons, though.) All of these broken comparisons were regressions introduced with 89d39bc100aabf5dccbe77c0b5c0c85736e85b39 "tdf#94559: 4th step to remove rtti.hxx", replacing uses of the IS_TYPE macro (from include/tools/rtti.hxx, meanwhile removed with d64e535fe9a00b671cf1be3eb5632c0d5f4b8bea "Remove unused rtti.hxx"). I now added loplugin:typeidcomparison to also find the other broken comparisons introduced by that commit. (The remaining cases where that commit replaced uses of TYPE_INFO with typeid comparisons were correct and/or have meanwhile been replaced with code not using typeid, see 553ee72041d6f66e26156eb1ad0d9e3c13457f7a "simplify some use of typeid" and d656da9bc4f2df0bb99c65a288847e3fdd43a37c "~SwModify: do not silently tolerate clients registered past death".) The original IS_TYPE macro made sure not to dereference null pointers, > #define IS_TYPE(T,pObj) \ > ( pObj && (pObj)->Type() == TYPE(T) ) I don't know if any of the pointers now dereferenced in those typeid expressions can legitimately be null. But to be on the safe side, I replicated that check in the newly introduced isType (sw/inc/istype.hxx). (It is interesting to note that none of the static analysis that we routinely employ seems to have noticed these broken comparisons.) Change-Id: I65baffdd27bac1abf744283ff98c2dc864fa63b4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129865 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/istype.hxx21
-rw-r--r--sw/source/core/access/accmap.cxx3
-rw-r--r--sw/source/core/doc/doclay.cxx3
-rw-r--r--sw/source/uibase/app/docsh2.cxx7
4 files changed, 29 insertions, 5 deletions
diff --git a/sw/inc/istype.hxx b/sw/inc/istype.hxx
new file mode 100644
index 000000000000..ec7dac428d61
--- /dev/null
+++ b/sw/inc/istype.hxx
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <typeinfo>
+
+template <typename T1, typename T2> bool isType(T2* p)
+{
+ return p != nullptr && typeid(*p) == typeid(T1);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx
index 7704b16f3e52..e8a106aa5892 100644
--- a/sw/source/core/access/accmap.cxx
+++ b/sw/source/core/access/accmap.cxx
@@ -42,6 +42,7 @@
#include "acccell.hxx"
#include "acctable.hxx"
#include <fesh.hxx>
+#include <istype.hxx>
#include <rootfrm.hxx>
#include <txtfrm.hxx>
#include <hffrm.hxx>
@@ -198,7 +199,7 @@ void SwDrawModellListener_Impl::Notify( SfxBroadcaster& /*rBC*/,
if (pSdrHint->GetObject() &&
( dynamic_cast< const SwFlyDrawObj* >(pSdrHint->GetObject()) != nullptr ||
dynamic_cast< const SwVirtFlyDrawObj* >(pSdrHint->GetObject()) != nullptr ||
- typeid(SdrObject) == typeid(pSdrHint->GetObject()) ) )
+ isType<SdrObject>(pSdrHint->GetObject()) ) )
{
return;
}
diff --git a/sw/source/core/doc/doclay.cxx b/sw/source/core/doc/doclay.cxx
index 7d3ad61e46b4..34bf4fabbcac 100644
--- a/sw/source/core/doc/doclay.cxx
+++ b/sw/source/core/doc/doclay.cxx
@@ -30,6 +30,7 @@
#include <osl/diagnose.h>
#include <svx/svdouno.hxx>
#include <editeng/frmdiritem.hxx>
+#include <istype.hxx>
#include <swmodule.hxx>
#include <modcfg.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
@@ -139,7 +140,7 @@ SdrObject* SwDoc::CloneSdrObj( const SdrObject& rObj, bool bMoveWithinDoc,
SdrLayerID nLayerIdForClone = rObj.GetLayer();
if ( dynamic_cast<const SwFlyDrawObj*>( pObj) == nullptr &&
dynamic_cast<const SwVirtFlyDrawObj*>( pObj) == nullptr &&
- typeid(SdrObject) != typeid(pObj) )
+ !isType<SdrObject>(pObj) )
{
if ( getIDocumentDrawModelAccess().IsVisibleLayerId( nLayerIdForClone ) )
{
diff --git a/sw/source/uibase/app/docsh2.cxx b/sw/source/uibase/app/docsh2.cxx
index 9e606f0b4095..208848bf9a05 100644
--- a/sw/source/uibase/app/docsh2.cxx
+++ b/sw/source/uibase/app/docsh2.cxx
@@ -66,6 +66,7 @@
#include <basic/basmgr.hxx>
#include <comphelper/classids.hxx>
#include <fmtcol.hxx>
+#include <istype.hxx>
#include <view.hxx>
#include <docsh.hxx>
#include <docary.hxx>
@@ -467,13 +468,13 @@ void SwDocShell::Execute(SfxRequest& rReq)
SfxViewFrame *pTmpFrame = SfxViewFrame::GetFirst(this);
SfxViewShell* pViewShell = SfxViewShell::Current();
SwView* pCurrView = dynamic_cast< SwView *> ( pViewShell );
- bool bCurrent = typeid(SwPagePreview) == typeid( pViewShell );
+ bool bCurrent = isType<SwPagePreview>( pViewShell );
while( pTmpFrame ) // search Preview
{
- if( typeid(SwView) == typeid( pTmpFrame->GetViewShell()) )
+ if( isType<SwView>( pTmpFrame->GetViewShell()) )
bOnly = false;
- else if( typeid(SwPagePreview) == typeid( pTmpFrame->GetViewShell()))
+ else if( isType<SwPagePreview>( pTmpFrame->GetViewShell()))
{
pTmpFrame->GetFrame().Appear();
bFound = true;