summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compilerplugins/clang/optionalbool.cxx88
-rw-r--r--compilerplugins/clang/test/optionalbool.cxx27
-rw-r--r--cppcanvas/source/mtfrenderer/implrenderer.cxx4
-rw-r--r--cui/source/options/treeopt.cxx2
-rw-r--r--dbaccess/source/core/dataaccess/documentdefinition.cxx4
-rw-r--r--dbaccess/source/ui/browser/genericcontroller.cxx6
-rw-r--r--dbaccess/source/ui/browser/unodatbr.cxx8
-rw-r--r--dbaccess/source/ui/dlg/advancedsettings.cxx2
-rw-r--r--dbaccess/source/ui/dlg/optionalboolitem.hxx2
-rw-r--r--dbaccess/source/ui/misc/dbsubcomponentcontroller.cxx6
-rw-r--r--oox/source/drawingml/misccontexts.cxx2
-rw-r--r--oox/source/vml/vmltextboxcontext.cxx6
-rw-r--r--reportdesign/source/ui/report/ReportController.cxx2
-rw-r--r--sc/inc/fonthelper.hxx10
-rw-r--r--sc/source/core/data/dptabsrc.cxx2
-rw-r--r--sc/source/core/data/patattr.cxx2
-rw-r--r--sc/source/filter/oox/autofilterbuffer.cxx2
-rw-r--r--sc/source/filter/orcus/interface.cxx2
-rw-r--r--sc/source/ui/unoobj/miscuno.cxx2
-rw-r--r--sc/source/ui/view/editsh.cxx2
-rw-r--r--sd/source/ui/view/drviews7.cxx2
-rw-r--r--sfx2/source/sidebar/SidebarController.cxx12
-rw-r--r--solenv/CompilerTest_compilerplugins_clang.mk1
-rw-r--r--starmath/source/unomodel.cxx8
-rw-r--r--svx/source/form/fmmodel.cxx2
-rw-r--r--svx/source/xoutdev/xattr.cxx4
-rw-r--r--sw/source/core/text/frmpaint.cxx2
-rw-r--r--sw/source/core/txtnode/attrcontentcontrol.cxx2
-rw-r--r--sw/source/core/unocore/unofield.cxx4
-rw-r--r--sw/source/core/unocore/unoobj.cxx8
-rw-r--r--sw/source/filter/html/htmlforw.cxx8
-rw-r--r--sw/source/filter/xml/swxml.cxx4
-rw-r--r--sw/source/ui/vba/vbacontentcontrol.cxx8
-rw-r--r--sw/source/uibase/uno/unomod.cxx4
-rw-r--r--sw/source/uibase/uno/unotxdoc.cxx12
-rw-r--r--ucb/source/ucp/ext/ucpext_content.cxx2
-rw-r--r--vcl/source/font/LogicalFontInstance.cxx2
37 files changed, 191 insertions, 75 deletions
diff --git a/compilerplugins/clang/optionalbool.cxx b/compilerplugins/clang/optionalbool.cxx
new file mode 100644
index 000000000000..013bf1b4725c
--- /dev/null
+++ b/compilerplugins/clang/optionalbool.cxx
@@ -0,0 +1,88 @@
+/* -*- 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/.
+ */
+
+#ifndef LO_CLANG_SHARED_PLUGINS
+
+#include <cassert>
+#include <stack>
+
+#include "check.hxx"
+#include "plugin.hxx"
+#include "config_clang.h"
+
+// Check for uses of std::optional<bool> being assigned to bool, which generally does not do
+// what you would expect.
+
+namespace
+{
+class OptionalBool final : public loplugin::FilteringPlugin<OptionalBool>
+{
+public:
+ explicit OptionalBool(loplugin::InstantiationData const& data)
+ : FilteringPlugin(data)
+ {
+ }
+
+ bool preRun() override
+ {
+ if (!compiler.getLangOpts().CPlusPlus)
+ return false;
+ return true;
+ }
+
+ void run() override
+ {
+ if (preRun())
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+
+ bool VisitIfStmt(const IfStmt* ifStmt)
+ {
+ if (ignoreLocation(ifStmt))
+ return true;
+ m_ignoreIfCondition = ifStmt->getCond()->IgnoreImplicit();
+ return true;
+ }
+
+ bool VisitCXXMemberCallExpr(const CXXMemberCallExpr* memberCall)
+ {
+ if (ignoreLocation(memberCall))
+ return true;
+ if (m_ignoreIfCondition == memberCall)
+ return true;
+ // check if we are calling a 'operator bool' conversion method
+ auto conversionDecl = dyn_cast_or_null<CXXConversionDecl>(memberCall->getMethodDecl());
+ if (!conversionDecl || !conversionDecl->getConversionType()->isBooleanType())
+ return true;
+ auto ctsd = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
+ memberCall->getObjectType()->getAsRecordDecl());
+ if (!ctsd || ctsd->getTemplateArgs().size() < 1)
+ return true;
+ if (ctsd->getName() != "optional")
+ return true;
+ if (!ctsd->getTemplateArgs().get(0).getAsType()->isBooleanType())
+ return true;
+ report(DiagnosticsEngine::Warning,
+ "using conversion call to convert std::optional<bool> to bool probably does not do "
+ "what you expect, rather use has_value() or value_or()",
+ memberCall->getBeginLoc())
+ << memberCall->getSourceRange();
+ return true;
+ }
+
+private:
+ const Expr* m_ignoreIfCondition = nullptr;
+};
+
+loplugin::Plugin::Registration<OptionalBool> optionalbool("optionalbool");
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/compilerplugins/clang/test/optionalbool.cxx b/compilerplugins/clang/test/optionalbool.cxx
new file mode 100644
index 000000000000..02c3a84cf962
--- /dev/null
+++ b/compilerplugins/clang/test/optionalbool.cxx
@@ -0,0 +1,27 @@
+/* -*- 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/.
+ */
+#include "config_clang.h"
+#include <optional>
+
+namespace test1
+{
+std::optional<bool> get_optional_bool();
+void foo1()
+{
+ // expected-error@+1 {{using conversion call to convert std::optional<bool> to bool probably does not do what you expect, rather use has_value() or value_or() [loplugin:optionalbool]}}
+ bool foo(get_optional_bool());
+ (void)foo;
+
+ // no warning expected
+ if (std::optional<bool> b = get_optional_bool())
+ return;
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx
index 9d224f1146c4..e898d739d216 100644
--- a/cppcanvas/source/mtfrenderer/implrenderer.cxx
+++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx
@@ -1495,7 +1495,7 @@ namespace cppcanvas::internal
// TODO(Q2): define and use appropriate enumeration types
rState.textReliefStyle = rFont.GetRelief();
rState.textOverlineStyle = static_cast<sal_Int8>(rFont.GetOverline());
- rState.textUnderlineStyle = rParms.maFontUnderline ?
+ rState.textUnderlineStyle = rParms.maFontUnderline.has_value() ?
(*rParms.maFontUnderline ? sal_Int8(LINESTYLE_SINGLE) : sal_Int8(LINESTYLE_NONE)) :
static_cast<sal_Int8>(rFont.GetUnderline());
rState.textStrikeoutStyle = static_cast<sal_Int8>(rFont.GetStrikeout());
@@ -2932,7 +2932,7 @@ namespace cppcanvas::internal
if( rParams.maFontName ||
rParams.maFontWeight ||
rParams.maFontLetterForm ||
- rParams.maFontUnderline )
+ rParams.maFontUnderline.has_value() )
{
::cppcanvas::internal::OutDevState& rState = aStateStack.getState();
diff --git a/cui/source/options/treeopt.cxx b/cui/source/options/treeopt.cxx
index 3a637145e13d..1b419f22ea21 100644
--- a/cui/source/options/treeopt.cxx
+++ b/cui/source/options/treeopt.cxx
@@ -233,7 +233,7 @@ namespace {
bool MailMergeCfgIsEmailSupported()
{
std::optional<bool> b = officecfg::Office::Writer::MailMergeWizard::EMailSupported::get();
- return b && *b;
+ return b.has_value() && *b;
}
}
diff --git a/dbaccess/source/core/dataaccess/documentdefinition.cxx b/dbaccess/source/core/dataaccess/documentdefinition.cxx
index 28152e6c3b9a..242cfd5c9e1c 100644
--- a/dbaccess/source/core/dataaccess/documentdefinition.cxx
+++ b/dbaccess/source/core/dataaccess/documentdefinition.cxx
@@ -1387,7 +1387,7 @@ namespace
{
void lcl_putLoadArgs( ::comphelper::NamedValueCollection& _io_rArgs, const optional_bool& _bSuppressMacros, const optional_bool& _bReadOnly )
{
- if ( !!_bSuppressMacros )
+ if ( _bSuppressMacros.has_value() )
{
if ( *_bSuppressMacros )
{
@@ -1404,7 +1404,7 @@ namespace
}
}
- if ( !!_bReadOnly )
+ if ( _bReadOnly.has_value() )
_io_rArgs.put( "ReadOnly", *_bReadOnly );
}
}
diff --git a/dbaccess/source/ui/browser/genericcontroller.cxx b/dbaccess/source/ui/browser/genericcontroller.cxx
index 654ad2ff1525..54d58824ee45 100644
--- a/dbaccess/source/ui/browser/genericcontroller.cxx
+++ b/dbaccess/source/ui/browser/genericcontroller.cxx
@@ -331,9 +331,9 @@ namespace
// framework's implementation details
if ( !!_rFeatureState.sTitle )
_out_rStates.push_back( Any( *_rFeatureState.sTitle ) );
- if ( !!_rFeatureState.bChecked )
+ if ( _rFeatureState.bChecked.has_value() )
_out_rStates.push_back( Any( *_rFeatureState.bChecked ) );
- if ( !!_rFeatureState.bInvisible )
+ if ( _rFeatureState.bInvisible.has_value() )
_out_rStates.push_back( Any( Visibility( !*_rFeatureState.bInvisible ) ) );
if ( _rFeatureState.aValue.hasValue() )
_out_rStates.push_back( _rFeatureState.aValue );
@@ -1111,7 +1111,7 @@ bool OGenericUnoController::isCommandChecked(sal_uInt16 _nCommandId) const
{
FeatureState aState = GetState( _nCommandId );
- return aState.bChecked && *aState.bChecked;
+ return aState.bChecked.has_value() && *aState.bChecked;
}
bool OGenericUnoController::isCommandEnabled( const OUString& _rCompleteCommandURL ) const
diff --git a/dbaccess/source/ui/browser/unodatbr.cxx b/dbaccess/source/ui/browser/unodatbr.cxx
index 06081b665108..5fb250c4bde3 100644
--- a/dbaccess/source/ui/browser/unodatbr.cxx
+++ b/dbaccess/source/ui/browser/unodatbr.cxx
@@ -193,8 +193,8 @@ Any SAL_CALL SbaTableQueryBrowser::queryInterface(const Type& _rType)
{
if ( _rType.equals( cppu::UnoType<XScriptInvocationContext>::get() ) )
{
- OSL_PRECOND( !!m_aDocScriptSupport, "SbaTableQueryBrowser::queryInterface: did not initialize this, yet!" );
- if ( !!m_aDocScriptSupport && *m_aDocScriptSupport )
+ OSL_PRECOND( m_aDocScriptSupport.has_value(), "SbaTableQueryBrowser::queryInterface: did not initialize this, yet!" );
+ if ( m_aDocScriptSupport.has_value() && *m_aDocScriptSupport )
return Any( Reference< XScriptInvocationContext >( this ) );
return Any();
}
@@ -212,8 +212,8 @@ Sequence< Type > SAL_CALL SbaTableQueryBrowser::getTypes( )
SbaTableQueryBrowser_Base::getTypes()
) );
- OSL_PRECOND( !!m_aDocScriptSupport, "SbaTableQueryBrowser::getTypes: did not initialize this, yet!" );
- if ( !m_aDocScriptSupport || !*m_aDocScriptSupport )
+ OSL_PRECOND( m_aDocScriptSupport.has_value(), "SbaTableQueryBrowser::getTypes: did not initialize this, yet!" );
+ if ( !m_aDocScriptSupport.has_value() || !*m_aDocScriptSupport )
{
auto [begin, end] = asNonConstRange(aTypes);
auto newEnd = std::remove_if( begin, end,
diff --git a/dbaccess/source/ui/dlg/advancedsettings.cxx b/dbaccess/source/ui/dlg/advancedsettings.cxx
index 0770970d1b7e..935a5370de11 100644
--- a/dbaccess/source/ui/dlg/advancedsettings.cxx
+++ b/dbaccess/source/ui/dlg/advancedsettings.cxx
@@ -217,7 +217,7 @@ namespace dbaui
else
OSL_FAIL( "SpecialSettingsPage::implInitControls: unknown boolean item type!" );
- if ( !aValue )
+ if ( !aValue.has_value() )
{
booleanSetting.xControl->set_state(TRISTATE_INDET);
}
diff --git a/dbaccess/source/ui/dlg/optionalboolitem.hxx b/dbaccess/source/ui/dlg/optionalboolitem.hxx
index c500dfa2ac60..1c1d039e2650 100644
--- a/dbaccess/source/ui/dlg/optionalboolitem.hxx
+++ b/dbaccess/source/ui/dlg/optionalboolitem.hxx
@@ -37,7 +37,7 @@ namespace dbaui
virtual bool operator==( const SfxPoolItem& _rItem ) const override;
virtual OptionalBoolItem* Clone( SfxItemPool* _pPool = nullptr ) const override;
- bool HasValue() const { return !!m_aValue; }
+ bool HasValue() const { return m_aValue.has_value(); }
void ClearValue() { m_aValue.reset(); }
bool GetValue() const { return *m_aValue; }
void SetValue(bool _bValue) { m_aValue = _bValue; }
diff --git a/dbaccess/source/ui/misc/dbsubcomponentcontroller.cxx b/dbaccess/source/ui/misc/dbsubcomponentcontroller.cxx
index 12a73c78877f..759f202c0d4b 100644
--- a/dbaccess/source/ui/misc/dbsubcomponentcontroller.cxx
+++ b/dbaccess/source/ui/misc/dbsubcomponentcontroller.cxx
@@ -152,14 +152,14 @@ namespace dbaui
bool documentHasScriptSupport() const
{
- OSL_PRECOND( !!m_aDocScriptSupport,
+ OSL_PRECOND( m_aDocScriptSupport.has_value(),
"DBSubComponentController_Impl::documentHasScriptSupport: not completely initialized, yet - don't know!?" );
- return !!m_aDocScriptSupport && *m_aDocScriptSupport;
+ return m_aDocScriptSupport.has_value() && *m_aDocScriptSupport;
}
void setDocumentScriptSupport( const bool _bSupport )
{
- OSL_PRECOND( !m_aDocScriptSupport,
+ OSL_PRECOND( !m_aDocScriptSupport.has_value(),
"DBSubComponentController_Impl::setDocumentScriptSupport: already initialized!" );
m_aDocScriptSupport = ::std::optional< bool >( _bSupport );
}
diff --git a/oox/source/drawingml/misccontexts.cxx b/oox/source/drawingml/misccontexts.cxx
index 417b4f35e8a6..2eef9ab6133a 100644
--- a/oox/source/drawingml/misccontexts.cxx
+++ b/oox/source/drawingml/misccontexts.cxx
@@ -57,7 +57,7 @@ GradientFillContext::GradientFillContext(ContextHandler2Helper const & rParent,
auto oRotateWithShape = rAttribs.getBool(XML_rotWithShape);
mrGradientProps.moShadeFlip = rAttribs.getToken( XML_flip );
mrGradientProps.moRotateWithShape = oRotateWithShape;
- if (mpGradientFill && oRotateWithShape)
+ if (mpGradientFill && oRotateWithShape.has_value())
mpGradientFill->mbRotateWithShape = *oRotateWithShape;
}
diff --git a/oox/source/vml/vmltextboxcontext.cxx b/oox/source/vml/vmltextboxcontext.cxx
index b7b41cfc06f0..0a3f255d766d 100644
--- a/oox/source/vml/vmltextboxcontext.cxx
+++ b/oox/source/vml/vmltextboxcontext.cxx
@@ -60,15 +60,15 @@ TextPortionContext::TextPortionContext( ContextHandler2Helper const & rParent,
maFont.monEscapement = nElement;
break;
case XML_b:
- OSL_ENSURE( !maFont.mobBold, "TextPortionContext::TextPortionContext - nested <b> elements" );
+ OSL_ENSURE( !maFont.mobBold.has_value(), "TextPortionContext::TextPortionContext - nested <b> elements" );
maFont.mobBold = true;
break;
case XML_i:
- OSL_ENSURE( !maFont.mobItalic, "TextPortionContext::TextPortionContext - nested <i> elements" );
+ OSL_ENSURE( !maFont.mobItalic.has_value(), "TextPortionContext::TextPortionContext - nested <i> elements" );
maFont.mobItalic = true;
break;
case XML_s:
- OSL_ENSURE( !maFont.mobStrikeout, "TextPortionContext::TextPortionContext - nested <s> elements" );
+ OSL_ENSURE( !maFont.mobStrikeout.has_value(), "TextPortionContext::TextPortionContext - nested <s> elements" );
maFont.mobStrikeout = true;
break;
case OOX_TOKEN(dml, blip):
diff --git a/reportdesign/source/ui/report/ReportController.cxx b/reportdesign/source/ui/report/ReportController.cxx
index 873d17c353c1..bb869d7061e5 100644
--- a/reportdesign/source/ui/report/ReportController.cxx
+++ b/reportdesign/source/ui/report/ReportController.cxx
@@ -2714,7 +2714,7 @@ uno::Any SAL_CALL OReportController::getViewData()
sCommandURL = sCommandURL.copy( 5 );
Any aCommandState;
- if ( !!aFeatureState.bChecked )
+ if ( aFeatureState.bChecked.has_value() )
aCommandState <<= *aFeatureState.bChecked;
else if ( aFeatureState.aValue.hasValue() )
aCommandState = aFeatureState.aValue;
diff --git a/sc/inc/fonthelper.hxx b/sc/inc/fonthelper.hxx
index ae4a778570a9..1cf36baaf2c2 100644
--- a/sc/inc/fonthelper.hxx
+++ b/sc/inc/fonthelper.hxx
@@ -37,11 +37,11 @@ struct SC_DLLPUBLIC ScDxfFont
bool isEmpty() const
{
- return !(pFontAttr || nFontHeight ||
- eWeight || eItalic || eUnder ||
- eOver || bWordLine || eStrike ||
- bOutline || bShadow || eEmphasis ||
- eRelief || aColor || eLang);
+ return !(pFontAttr.has_value() || nFontHeight.has_value() ||
+ eWeight.has_value() || eItalic.has_value() || eUnder.has_value() ||
+ eOver.has_value() || bWordLine.has_value() || eStrike.has_value() ||
+ bOutline.has_value() || bShadow.has_value() || eEmphasis.has_value() ||
+ eRelief.has_value() || aColor.has_value() || eLang.has_value());
}
};
diff --git a/sc/source/core/data/dptabsrc.cxx b/sc/source/core/data/dptabsrc.cxx
index c9438671570d..f589e1b538e8 100644
--- a/sc/source/core/data/dptabsrc.cxx
+++ b/sc/source/core/data/dptabsrc.cxx
@@ -88,7 +88,7 @@ SC_SIMPLE_SERVICE_INFO( ScDPMember, "ScDPMember", "com.sun.star.sheet.
static bool lcl_GetBoolFromAny( const uno::Any& aAny )
{
auto b = o3tl::tryAccess<bool>(aAny);
- return b && *b;
+ return b.has_value() && *b;
}
ScDPSource::ScDPSource( ScDPTableData* pD ) :
diff --git a/sc/source/core/data/patattr.cxx b/sc/source/core/data/patattr.cxx
index e2cd22a390c6..7638652e6857 100644
--- a/sc/source/core/data/patattr.cxx
+++ b/sc/source/core/data/patattr.cxx
@@ -1200,7 +1200,7 @@ ScPatternAttr* ScPatternAttr::PutInPool( ScDocument* pDestDoc, ScDocument* pSrcD
bool ScPatternAttr::IsVisible() const
{
- if (!mxVisible)
+ if (!mxVisible.has_value())
mxVisible = CalcVisible();
return *mxVisible;
}
diff --git a/sc/source/filter/oox/autofilterbuffer.cxx b/sc/source/filter/oox/autofilterbuffer.cxx
index ca0f031923a9..9c9328176095 100644
--- a/sc/source/filter/oox/autofilterbuffer.cxx
+++ b/sc/source/filter/oox/autofilterbuffer.cxx
@@ -773,7 +773,7 @@ void AutoFilter::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRa
the global mode in obNeedsRegExp. If either one is still in
don't-care state, all is fine. If both are set, they must be
equal. */
- bool bRegExpCompatible = !obNeedsRegExp || !aSettings.mobNeedsRegExp || (obNeedsRegExp.value() == aSettings.mobNeedsRegExp.value());
+ bool bRegExpCompatible = !obNeedsRegExp.has_value() || !aSettings.mobNeedsRegExp.has_value() || (obNeedsRegExp.value() == aSettings.mobNeedsRegExp.value());
// check whether fields are connected by 'or' (see comments above).
if( rColumnFields.size() >= 2 )
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index 52907f5f69c2..a61d545d9151 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -1505,7 +1505,7 @@ void ScOrcusBorder::applyToItemSet( SfxItemSet& rSet ) const
void ScOrcusProtection::applyToItemSet( SfxItemSet& rSet ) const
{
- if (!mbLocked && !mbHidden && !mbPrintContent && !mbFormulaHidden)
+ if (!mbLocked.has_value() && !mbHidden.has_value() && !mbPrintContent.has_value() && !mbFormulaHidden.has_value())
return;
bool bLocked = mbLocked.value_or(true); // defaults to true.
diff --git a/sc/source/ui/unoobj/miscuno.cxx b/sc/source/ui/unoobj/miscuno.cxx
index 30104586e3ca..5c875bc0b751 100644
--- a/sc/source/ui/unoobj/miscuno.cxx
+++ b/sc/source/ui/unoobj/miscuno.cxx
@@ -139,7 +139,7 @@ OUString ScUnoHelpFunctions::GetStringProperty(
bool ScUnoHelpFunctions::GetBoolFromAny( const uno::Any& aAny )
{
auto b = o3tl::tryAccess<bool>(aAny);
- return b && *b;
+ return b.has_value() && *b;
}
sal_Int16 ScUnoHelpFunctions::GetInt16FromAny( const uno::Any& aAny )
diff --git a/sc/source/ui/view/editsh.cxx b/sc/source/ui/view/editsh.cxx
index 74d4add556b9..493ab18f78cc 100644
--- a/sc/source/ui/view/editsh.cxx
+++ b/sc/source/ui/view/editsh.cxx
@@ -837,7 +837,7 @@ void ScEditShell::GetState( SfxItemSet& rSet )
case SID_REMOVE_HYPERLINK:
{
bool bDisableEditHyperlink;
- if (!moAtContextMenu_DisableEditHyperlink)
+ if (!moAtContextMenu_DisableEditHyperlink.has_value())
bDisableEditHyperlink = ShouldDisableEditHyperlink();
else
{
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index a2f12e9ccaef..3bace958df28 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -1480,7 +1480,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
// Menuoption: Edit->Hyperlink
// Disable, if there is no hyperlink
bool bDisableEditHyperlink;
- if (!moAtContextMenu_DisableEditHyperlink)
+ if (!moAtContextMenu_DisableEditHyperlink.has_value())
bDisableEditHyperlink = ShouldDisableEditHyperlink();
else
{
diff --git a/sfx2/source/sidebar/SidebarController.cxx b/sfx2/source/sidebar/SidebarController.cxx
index 666870147875..4798e1a33435 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -502,7 +502,7 @@ void SidebarController::NotifyResize()
void SidebarController::ProcessNewWidth (const sal_Int32 nNewWidth)
{
- if ( ! mbIsDeckRequestedOpen)
+ if ( ! mbIsDeckRequestedOpen.has_value())
return;
if (*mbIsDeckRequestedOpen)
@@ -680,7 +680,7 @@ void SidebarController::SwitchToDeck (
std::u16string_view rsDeckId)
{
if ( msCurrentDeckId != rsDeckId
- || ! mbIsDeckOpen
+ || ! mbIsDeckOpen.has_value()
|| mnRequestedForceFlags!=SwitchFlag_NoForce)
{
std::shared_ptr<DeckDescriptor> xDeckDescriptor = mpResourceManager->GetDeckDescriptor(rsDeckId);
@@ -1272,17 +1272,17 @@ bool SidebarController::IsDeckOpen(const sal_Int32 nIndex)
OUString asDeckId(mpTabBar->GetDeckIdForIndex(nIndex));
return IsDeckVisible(asDeckId);
}
- return mbIsDeckOpen && *mbIsDeckOpen;
+ return mbIsDeckOpen.has_value() && *mbIsDeckOpen;
}
bool SidebarController::IsDeckVisible(std::u16string_view rsDeckId)
{
- return mbIsDeckOpen && *mbIsDeckOpen && msCurrentDeckId == rsDeckId;
+ return mbIsDeckOpen.has_value() && *mbIsDeckOpen && msCurrentDeckId == rsDeckId;
}
void SidebarController::UpdateDeckOpenState()
{
- if ( ! mbIsDeckRequestedOpen)
+ if ( ! mbIsDeckRequestedOpen.has_value() )
// No state requested.
return;
@@ -1290,7 +1290,7 @@ void SidebarController::UpdateDeckOpenState()
// Update (change) the open state when it either has not yet been initialized
// or when its value differs from the requested state.
- if ( mbIsDeckOpen && *mbIsDeckOpen == *mbIsDeckRequestedOpen )
+ if ( mbIsDeckOpen.has_value() && *mbIsDeckOpen == *mbIsDeckRequestedOpen )
return;
if (*mbIsDeckRequestedOpen)
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk
index cb48a66f4884..6404b5323ddf 100644
--- a/solenv/CompilerTest_compilerplugins_clang.mk
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -52,6 +52,7 @@ $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
compilerplugins/clang/test/noexcept \
compilerplugins/clang/test/noexceptmove \
compilerplugins/clang/test/nullptr \
+ compilerplugins/clang/test/optionalbool \
compilerplugins/clang/test/oslendian-1 \
compilerplugins/clang/test/oslendian-2 \
compilerplugins/clang/test/oslendian-3 \
diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx
index 5857c3832579..64ca28e692e1 100644
--- a/starmath/source/unomodel.cxx
+++ b/starmath/source/unomodel.cxx
@@ -455,8 +455,8 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any*
case HANDLE_FONT_NUMBERS_POSTURE :
case HANDLE_FONT_TEXT_POSTURE :
{
- auto bVal = o3tl::tryAccess<bool>(*pValues);
- if(!bVal)
+ std::optional<const bool> bVal = o3tl::tryAccess<bool>(*pValues);
+ if(!bVal.has_value())
throw IllegalArgumentException();
vcl::Font aNewFont(aFormat.GetFont((*ppEntries)->mnMemberId));
aNewFont.SetItalic(*bVal ? ITALIC_NORMAL : ITALIC_NONE);
@@ -472,8 +472,8 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any*
case HANDLE_FONT_NUMBERS_WEIGHT :
case HANDLE_FONT_TEXT_WEIGHT :
{
- auto bVal = o3tl::tryAccess<bool>(*pValues);
- if(!bVal)
+ std::optional<const bool> bVal = o3tl::tryAccess<bool>(*pValues);
+ if(!bVal.has_value())
throw IllegalArgumentException();
vcl::Font aNewFont(aFormat.GetFont((*ppEntries)->mnMemberId));
aNewFont.SetWeight(*bVal ? WEIGHT_BOLD : WEIGHT_NORMAL);
diff --git a/svx/source/form/fmmodel.cxx b/svx/source/form/fmmodel.cxx
index 58155f874c77..71fa374c04b3 100644
--- a/svx/source/form/fmmodel.cxx
+++ b/svx/source/form/fmmodel.cxx
@@ -151,7 +151,7 @@ bool FmFormModel::OpenInDesignModeIsDefaulted( )
bool FmFormModel::ControlsUseRefDevice() const
{
- if ( !m_pImpl->aControlsUseRefDevice )
+ if ( !m_pImpl->aControlsUseRefDevice.has_value() )
{
DocumentType eDocType = eUnknownDocumentType;
if ( m_pObjShell )
diff --git a/svx/source/xoutdev/xattr.cxx b/svx/source/xoutdev/xattr.cxx
index abf72bd6d6d4..5f5c51655f3e 100644
--- a/svx/source/xoutdev/xattr.cxx
+++ b/svx/source/xoutdev/xattr.cxx
@@ -1813,7 +1813,7 @@ bool XLineStartCenterItem::QueryValue( css::uno::Any& rVal, sal_uInt8 /*nMemberI
bool XLineStartCenterItem::PutValue( const css::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
{
auto b = o3tl::tryAccess<bool>(rVal);
- if( !b )
+ if( !b.has_value() )
return false;
SetValue( *b );
@@ -1852,7 +1852,7 @@ bool XLineEndCenterItem::QueryValue( css::uno::Any& rVal, sal_uInt8 /*nMemberId*
bool XLineEndCenterItem::PutValue( const css::uno::Any& rVal, sal_uInt8 /*nMemberId*/)
{
auto b = o3tl::tryAccess<bool>(rVal);
- if( !b )
+ if( !b.has_value() )
return false;
SetValue( *b );
diff --git a/sw/source/core/text/frmpaint.cxx b/sw/source/core/text/frmpaint.cxx
index e7e779eb0ea4..43f5922999d4 100644
--- a/sw/source/core/text/frmpaint.cxx
+++ b/sw/source/core/text/frmpaint.cxx
@@ -177,7 +177,7 @@ SwExtraPainter::SwExtraPainter( const SwTextFrame *pFrame, SwViewShell *pVwSh,
if( text::HoriOrientation::INSIDE == eHor || text::HoriOrientation::OUTSIDE == eHor )
{
- if (!oIsRightPage)
+ if (!oIsRightPage.has_value())
oIsRightPage = pFrame->FindPageFrame()->OnRightPage();
if (*oIsRightPage)
eHor = eHor == text::HoriOrientation::INSIDE ? text::HoriOrientation::LEFT : text::HoriOrientation::RIGHT;
diff --git a/sw/source/core/txtnode/attrcontentcontrol.cxx b/sw/source/core/txtnode/attrcontentcontrol.cxx
index c167f8da33e9..c8a76e4041df 100644
--- a/sw/source/core/txtnode/attrcontentcontrol.cxx
+++ b/sw/source/core/txtnode/attrcontentcontrol.cxx
@@ -501,7 +501,7 @@ std::optional<bool> SwContentControl::GetLock(bool bControl) const
else if (m_aLock.equalsIgnoreAsciiCase("contentLocked"))
oLock = !bControl;
- assert(oLock && "invalid or unknown lock state");
+ assert(oLock.has_value() && "invalid or unknown lock state");
return oLock;
}
diff --git a/sw/source/core/unocore/unofield.cxx b/sw/source/core/unocore/unofield.cxx
index 78b43b3158bd..d9924bcd834a 100644
--- a/sw/source/core/unocore/unofield.cxx
+++ b/sw/source/core/unocore/unofield.cxx
@@ -2275,8 +2275,8 @@ SwXTextField::setPropertyValue(
}
if (pBool)
{
- auto b = o3tl::tryAccess<bool>(rValue);
- if( !b )
+ std::optional<const bool> b = o3tl::tryAccess<bool>(rValue);
+ if( !b.has_value() )
throw lang::IllegalArgumentException();
*pBool = *b;
diff --git a/sw/source/core/unocore/unoobj.cxx b/sw/source/core/unocore/unoobj.cxx
index 14cceaee3f38..69ba9d3a6dbc 100644
--- a/sw/source/core/unocore/unoobj.cxx
+++ b/sw/source/core/unocore/unoobj.cxx
@@ -2927,8 +2927,8 @@ bool SwUnoCursorHelper::ConvertSortProperties(
bOldSortdescriptor = true;
sal_uInt16 nIndex = rPropName[13];
nIndex = nIndex - '0';
- auto bTemp = o3tl::tryAccess<bool>(aValue);
- if (bTemp && nIndex < 3)
+ std::optional<const bool> bTemp = o3tl::tryAccess<bool>(aValue);
+ if (bTemp.has_value() && nIndex < 3)
{
aKeys[nIndex]->bIsNumeric = *bTemp;
}
@@ -2944,8 +2944,8 @@ bool SwUnoCursorHelper::ConvertSortProperties(
bOldSortdescriptor = true;
sal_uInt16 nIndex = rPropName[15];
nIndex -= '0';
- auto bTemp = o3tl::tryAccess<bool>(aValue);
- if (bTemp && nIndex < 3)
+ std::optional<const bool> bTemp = o3tl::tryAccess<bool>(aValue);
+ if (bTemp.has_value() && nIndex < 3)
{
aKeys[nIndex]->eSortOrder = (*bTemp)
? SwSortOrder::Ascending : SwSortOrder::Descending;
diff --git a/sw/source/filter/html/htmlforw.cxx b/sw/source/filter/html/htmlforw.cxx
index ce0bfe7bb2cf..b35cd76a24a8 100644
--- a/sw/source/filter/html/htmlforw.cxx
+++ b/sw/source/filter/html/htmlforw.cxx
@@ -809,8 +809,8 @@ SwHTMLWriter& OutHTML_DrawFrameFormatAsControl( SwHTMLWriter& rWrt,
if( xPropSetInfo->hasPropertyByName( sMultiLine ) )
{
aTmp = xPropSet->getPropertyValue( sMultiLine );
- auto b = o3tl::tryAccess<bool>(aTmp);
- bMultiLine = b && *b;
+ std::optional<const bool> b = o3tl::tryAccess<bool>(aTmp);
+ bMultiLine = b.has_value() && *b;
}
if( bMultiLine )
@@ -837,8 +837,8 @@ SwHTMLWriter& OutHTML_DrawFrameFormatAsControl( SwHTMLWriter& rWrt,
{
const char *pWrapStr = nullptr;
auto aTmp2 = xPropSet->getPropertyValue( "HardLineBreaks" );
- auto b = o3tl::tryAccess<bool>(aTmp2);
- pWrapStr = (b && *b) ? OOO_STRING_SVTOOLS_HTML_WW_hard
+ std::optional<const bool> b = o3tl::tryAccess<bool>(aTmp2);
+ pWrapStr = (b.has_value() && *b) ? OOO_STRING_SVTOOLS_HTML_WW_hard
: OOO_STRING_SVTOOLS_HTML_WW_soft;
sOptions += OString::Concat(" " OOO_STRING_SVTOOLS_HTML_O_wrap "=\"") +
pWrapStr + "\"";
diff --git a/sw/source/filter/xml/swxml.cxx b/sw/source/filter/xml/swxml.cxx
index 4664748292e6..648f7fbbe083 100644
--- a/sw/source/filter/xml/swxml.cxx
+++ b/sw/source/filter/xml/swxml.cxx
@@ -314,8 +314,8 @@ ErrCode ReadThroughComponent(
Any aAny = xProps->getPropertyValue("Encrypted");
- auto b = o3tl::tryAccess<bool>(aAny);
- bool bEncrypted = b && *b;
+ std::optional<const bool> b = o3tl::tryAccess<bool>(aAny);
+ bool bEncrypted = b.has_value() && *b;
uno::Reference <io::XInputStream> xInputStream = xStream->getInputStream();
diff --git a/sw/source/ui/vba/vbacontentcontrol.cxx b/sw/source/ui/vba/vbacontentcontrol.cxx
index 8e8d8a12382b..dc4e4afc236a 100644
--- a/sw/source/ui/vba/vbacontentcontrol.cxx
+++ b/sw/source/ui/vba/vbacontentcontrol.cxx
@@ -481,20 +481,20 @@ sal_Int32 SwVbaContentControl::getLevel()
sal_Bool SwVbaContentControl::getLockContentControl()
{
std::optional<bool> oLock = m_pCC->GetLock(/*bControl=*/true);
- return oLock && *oLock;
+ return oLock.has_value() && *oLock;
}
void SwVbaContentControl::setLockContentControl(sal_Bool bSet)
{
std::optional<bool> oLock = m_pCC->GetLock(/*bControl=*/false);
- m_pCC->SetLock(/*bContents=*/oLock && *oLock, /*bControl=*/bSet);
+ m_pCC->SetLock(/*bContents=*/oLock.has_value() && *oLock, /*bControl=*/bSet);
}
sal_Bool SwVbaContentControl::getLockContents()
{
// If the theoretical design model says it is locked, then report as locked.
std::optional<bool> oLock = m_pCC->GetLock(/*bControl=*/false);
- if (oLock && *oLock)
+ if (oLock.has_value() && *oLock)
return true;
// Now check the real implementation.
@@ -513,7 +513,7 @@ void SwVbaContentControl::setLockContents(sal_Bool bSet)
{
// Set the lock both theoretically and actually.
std::optional<bool> oLock = m_pCC->GetLock(/*bControl=*/true);
- m_pCC->SetLock(/*bContents=*/bSet, /*bControl=*/oLock && *oLock);
+ m_pCC->SetLock(/*bContents=*/bSet, /*bControl=*/oLock.has_value() && *oLock);
// Checkbox/DropDown/Picture are normally locked in LO implementation - don't unlock them.
if (m_pCC->GetType() == SwContentControlType::CHECKBOX
diff --git a/sw/source/uibase/uno/unomod.cxx b/sw/source/uibase/uno/unomod.cxx
index 4599d8386b93..499f4ebea0e7 100644
--- a/sw/source/uibase/uno/unomod.cxx
+++ b/sw/source/uibase/uno/unomod.cxx
@@ -286,8 +286,8 @@ namespace
{
bool tryBoolAccess(const uno::Any &rValue)
{
- const auto xPrSet = o3tl::tryAccess<bool>(rValue);
- if (!xPrSet)
+ const std::optional<const bool> xPrSet = o3tl::tryAccess<bool>(rValue);
+ if (!xPrSet.has_value())
throw lang::IllegalArgumentException();
return *xPrSet;
}
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 6a4177f6e50d..397bf0cdb205 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -1060,8 +1060,8 @@ void SwXTextDocument::setPagePrintSettings(const Sequence< beans::PropertyValue
}
else if(sName == "IsLandscape")
{
- auto b = o3tl::tryAccess<bool>(rVal);
- bException = !b;
+ std::optional<const bool> b = o3tl::tryAccess<bool>(rVal);
+ bException = !b.has_value();
if (b)
{
aData.SetLandscape(*b);
@@ -1118,8 +1118,8 @@ void SwXTextDocument::printPages(const Sequence< beans::PropertyValue >& xOption
// Collate-Property
else if ( rProp.Name == UNO_NAME_COLLATE )
{
- auto b = o3tl::tryAccess<bool>(rProp.Value);
- if ( !b )
+ std::optional<const bool> b = o3tl::tryAccess<bool>(rProp.Value);
+ if ( !b.has_value() )
throw IllegalArgumentException();
aReq.AppendItem(SfxBoolItem( SID_PRINT_COLLATE, *b ) );
@@ -1128,8 +1128,8 @@ void SwXTextDocument::printPages(const Sequence< beans::PropertyValue >& xOption
// Sort-Property
else if ( rProp.Name == UNO_NAME_SORT )
{
- auto b = o3tl::tryAccess<bool>(rProp.Value);
- if ( !b )
+ std::optional<const bool> b = o3tl::tryAccess<bool>(rProp.Value);
+ if ( !b.has_value() )
throw IllegalArgumentException();
aReq.AppendItem(SfxBoolItem( SID_PRINT_SORT, *b ) );
diff --git a/ucb/source/ucp/ext/ucpext_content.cxx b/ucb/source/ucp/ext/ucpext_content.cxx
index 24101016810f..ee9966a52b30 100644
--- a/ucb/source/ucp/ext/ucpext_content.cxx
+++ b/ucb/source/ucp/ext/ucpext_content.cxx
@@ -577,7 +577,7 @@ namespace ucb::ucp::ext
bool Content::impl_isFolder()
{
- if ( !!m_aIsFolder )
+ if ( m_aIsFolder.has_value() )
return *m_aIsFolder;
bool bIsFolder = false;
diff --git a/vcl/source/font/LogicalFontInstance.cxx b/vcl/source/font/LogicalFontInstance.cxx
index ec9740fd8812..0c21cba47548 100644
--- a/vcl/source/font/LogicalFontInstance.cxx
+++ b/vcl/source/font/LogicalFontInstance.cxx
@@ -237,7 +237,7 @@ double LogicalFontInstance::GetGlyphWidth(sal_GlyphId nGlyph, bool bVertical, bo
bool LogicalFontInstance::IsGraphiteFont()
{
- if (!m_xbIsGraphiteFont)
+ if (!m_xbIsGraphiteFont.has_value())
{
m_xbIsGraphiteFont
= hb_graphite2_face_get_gr_face(hb_font_get_face(GetHbFont())) != nullptr;