diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2022-02-12 17:10:43 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2022-02-12 19:37:43 +0100 |
commit | d2ba5d98ec67e684c819ef80421eb496723a8d06 (patch) | |
tree | 050bcf0179c152892a6d4b8e841f71cfe541bef7 /sw | |
parent | 7cd3013a3704b8365e295f4260e242273d45d27e (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.hxx | 21 | ||||
-rw-r--r-- | sw/source/core/access/accmap.cxx | 3 | ||||
-rw-r--r-- | sw/source/core/doc/doclay.cxx | 3 | ||||
-rw-r--r-- | sw/source/uibase/app/docsh2.cxx | 7 |
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; |