diff options
-rw-r--r-- | compilerplugins/clang/simplifybool.cxx | 35 | ||||
-rw-r--r-- | compilerplugins/clang/test/simplifybool.cxx | 10 | ||||
-rw-r--r-- | cui/source/tabpages/tpline.cxx | 2 |
3 files changed, 36 insertions, 11 deletions
diff --git a/compilerplugins/clang/simplifybool.cxx b/compilerplugins/clang/simplifybool.cxx index 36c4854e96e8..83cbf2dc56f6 100644 --- a/compilerplugins/clang/simplifybool.cxx +++ b/compilerplugins/clang/simplifybool.cxx @@ -241,7 +241,30 @@ bool SimplifyBool::VisitUnaryLNot(UnaryOperator const * expr) { << expr->getSourceRange(); return true; } - if (auto binaryOp = dyn_cast<BinaryOperator>(expr->getSubExpr()->IgnoreParenImpCasts())) { + auto sub = expr->getSubExpr()->IgnoreParenImpCasts(); + auto reversed = false; +#if CLANG_VERSION >= 100000 + if (auto const rewritten = dyn_cast<CXXRewrittenBinaryOperator>(sub)) { + if (rewritten->isReversed()) { + if (rewritten->getOperator() == BO_EQ) { + auto const sem = rewritten->getSemanticForm(); + bool match; + if (auto const op1 = dyn_cast<BinaryOperator>(sem)) { + match = op1->getOpcode() == BO_EQ; + } else if (auto const op2 = dyn_cast<CXXOperatorCallExpr>(sem)) { + match = op2->getOperator() == OO_EqualEqual; + } else { + match = false; + } + if (match) { + sub = sem; + reversed = true; + } + } + } + } +#endif + if (auto binaryOp = dyn_cast<BinaryOperator>(sub)) { // Ignore macros, otherwise // OSL_ENSURE(!b, ...); // triggers. @@ -289,7 +312,7 @@ bool SimplifyBool::VisitUnaryLNot(UnaryOperator const * expr) { << binaryOp->getSourceRange(); } } - if (auto binaryOp = dyn_cast<CXXOperatorCallExpr>(expr->getSubExpr()->IgnoreParenImpCasts())) { + if (auto binaryOp = dyn_cast<CXXOperatorCallExpr>(sub)) { // Ignore macros, otherwise // OSL_ENSURE(!b, ...); // triggers. @@ -301,8 +324,8 @@ bool SimplifyBool::VisitUnaryLNot(UnaryOperator const * expr) { if (!(op == OO_EqualEqual || op == OO_ExclaimEqual)) return true; BinaryOperator::Opcode negatedOpcode = BinaryOperator::negateComparisonOp(BinaryOperator::getOverloadedOpcode(op)); - auto lhs = binaryOp->getArg(0)->IgnoreImpCasts()->getType()->getUnqualifiedDesugaredType(); - auto rhs = binaryOp->getArg(1)->IgnoreImpCasts()->getType()->getUnqualifiedDesugaredType(); + auto lhs = binaryOp->getArg(reversed ? 1 : 0)->IgnoreImpCasts()->getType()->getUnqualifiedDesugaredType(); + auto rhs = binaryOp->getArg(reversed ? 0 : 1)->IgnoreImpCasts()->getType()->getUnqualifiedDesugaredType(); auto const negOp = findOperator(compiler, negatedOpcode, lhs, rhs); if (!negOp) return true; @@ -323,8 +346,10 @@ bool SimplifyBool::VisitUnaryLNot(UnaryOperator const * expr) { << expr->getSourceRange(); if (negOp != ASSUME_OPERATOR_EXISTS) report( - DiagnosticsEngine::Note, "the presumed corresponding negated operator is declared here", + DiagnosticsEngine::Note, "the presumed corresponding negated operator for %0 and %1 is declared here", negOp->getLocation()) + << binaryOp->getArg(reversed ? 1 : 0)->IgnoreImpCasts()->getType() + << binaryOp->getArg(reversed ? 0 : 1)->IgnoreImpCasts()->getType() << negOp->getSourceRange(); } return true; diff --git a/compilerplugins/clang/test/simplifybool.cxx b/compilerplugins/clang/test/simplifybool.cxx index 75a26d22aa27..906feabee96f 100644 --- a/compilerplugins/clang/test/simplifybool.cxx +++ b/compilerplugins/clang/test/simplifybool.cxx @@ -8,11 +8,11 @@ */ #include <rtl/ustring.hxx> -// expected-note@rtl/ustring.hxx:* 2 {{the presumed corresponding negated operator is declared here [loplugin:simplifybool]}} +// expected-note@rtl/ustring.hxx:* 2 {{the presumed corresponding negated operator for 'rtl::OUString' and 'rtl::OUString' is declared here [loplugin:simplifybool]}} #include <rtl/string.hxx> -// expected-note@rtl/string.hxx:* {{the presumed corresponding negated operator is declared here [loplugin:simplifybool]}} +// expected-note@rtl/string.hxx:* {{the presumed corresponding negated operator for 'rtl::OString' and 'rtl::OString' is declared here [loplugin:simplifybool]}} #include <basegfx/vector/b3dvector.hxx> -// expected-note@basegfx/tuple/b3dtuple.hxx:* {{the presumed corresponding negated operator is declared here [loplugin:simplifybool]}} +// expected-note@basegfx/tuple/b3dtuple.hxx:* {{the presumed corresponding negated operator for 'basegfx::B3DVector' and 'basegfx::B3DVector' is declared here [loplugin:simplifybool]}} #include <map> @@ -82,7 +82,7 @@ struct Record2 { bool operator==(const Record2&) const; bool operator!=(const Record2&) const; - // expected-note@-1 {{the presumed corresponding negated operator is declared here [loplugin:simplifybool]}} + // expected-note@-1 {{the presumed corresponding negated operator for 'group3::Record2' and 'group3::Record2' is declared here [loplugin:simplifybool]}} }; struct Record3 @@ -91,7 +91,7 @@ struct Record3 bool operator==(const Record3&, const Record3&); bool operator!=(const Record3&, const Record3&); -// expected-note@-1 {{the presumed corresponding negated operator is declared here [loplugin:simplifybool]}} +// expected-note@-1 {{the presumed corresponding negated operator for 'group3::Record3' and 'group3::Record3' is declared here [loplugin:simplifybool]}} void testRecord() { diff --git a/cui/source/tabpages/tpline.cxx b/cui/source/tabpages/tpline.cxx index 3cc694a7ebc6..89fc0dc227ef 100644 --- a/cui/source/tabpages/tpline.cxx +++ b/cui/source/tabpages/tpline.cxx @@ -478,7 +478,7 @@ bool SvxLineTabPage::FillItemSet( SfxItemSet* rAttrs ) else if( m_pLineEndList->Count() > static_cast<long>( nPos - 1 ) ) pItem.reset(new XLineStartItem( m_xLbStartStyle->get_active_text(), m_pLineEndList->GetLineEnd( nPos - 1 )->GetLineEnd() )); pOld = GetOldItem( *rAttrs, XATTR_LINESTART ); - if( pItem && ( !pOld || !( *static_cast<const XLineEndItem*>(pOld) == *pItem ) ) ) + if( pItem && ( !pOld || *pOld != *pItem ) ) { rAttrs->Put( *pItem ); bModified = true; |