compilerplugins/clang/stringview.cxx | 28 ++++++++++++++++------------ compilerplugins/clang/test/stringview.cxx | 3 +++ 2 files changed, 19 insertions(+), 12 deletions(-)
New commits: commit 0ac45af39c534ce17a4a76a370add4ffa4fa92f9 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Wed Nov 10 16:26:05 2021 +0100 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Nov 10 17:58:24 2021 +0100 Avoid unhelpful loplugin:stringview from implicit conversions > compilerplugins/clang/test/stringview.cxx Line 149: instead of an 'rtl::OString' constructed from a 'const rtl::OStringLiteral<4>', pass a 'std::string_view' [loplugin:stringview] > compilerplugins/clang/test/stringview.cxx Line 150: instead of an 'rtl::OUString' constructed from a 'const rtl::OUStringLiteral<4>', pass a 'std::u16string_view' [loplugin:stringview] (see the discussion at <https://gerrit.libreoffice.org/c/core/+/124950> "operator==(OString, OStringLiteral)") Change-Id: I5481bef8b8bad7bf9bdf4fff29161f0809051f2b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124990 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/compilerplugins/clang/stringview.cxx b/compilerplugins/clang/stringview.cxx index 4043d7a67e60..b3a0323d2923 100644 --- a/compilerplugins/clang/stringview.cxx +++ b/compilerplugins/clang/stringview.cxx @@ -75,18 +75,18 @@ bool StringView::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* cxxOperator auto op = cxxOperatorCallExpr->getOperator(); if (op == OO_Plus && cxxOperatorCallExpr->getNumArgs() == 2) { - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(0))); - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(0)); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(1)); } if (compat::isComparisonOp(cxxOperatorCallExpr)) { - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(0))); - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(0)); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(1)); } else if (op == OO_PlusEqual) - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(1)); else if (op == OO_Subscript) - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(0))); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(0)); else if (op == OO_Equal) { if (loplugin::TypeCheck(cxxOperatorCallExpr->getType()) @@ -98,7 +98,7 @@ bool StringView::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* cxxOperator .Namespace("rtl") .GlobalNamespace()) { - handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); + handleSubExprThatCouldBeView(cxxOperatorCallExpr->getArg(1)); } } return true; @@ -130,7 +130,8 @@ bool StringView::VisitImplicitCastExpr(ImplicitCastExpr const* expr) void StringView::handleSubExprThatCouldBeView(Expr const* subExpr) { - auto const e = subExpr->IgnoreParens(); + auto const e0 = compat::IgnoreImplicit(subExpr); + auto const e = e0->IgnoreParens(); auto const tc = loplugin::TypeCheck(e->getType()); if (!(tc.Class("OString").Namespace("rtl").GlobalNamespace() || tc.Class("OUString").Namespace("rtl").GlobalNamespace())) @@ -139,7 +140,10 @@ void StringView::handleSubExprThatCouldBeView(Expr const* subExpr) } if (auto const e1 = dyn_cast<CXXConstructExpr>(e)) { - handleCXXConstructExpr(e1); + if (e0 == subExpr) + { + handleCXXConstructExpr(e1); + } } else if (auto const e2 = dyn_cast<CXXFunctionalCastExpr>(e)) { @@ -301,11 +305,11 @@ bool StringView::VisitCXXMemberCallExpr(CXXMemberCallExpr const* expr) auto const dc = loplugin::DeclCheck(expr->getMethodDecl()); if (dc.Function("append") || dc.Function("indexOf") || dc.Function("lastIndexOf")) { - handleSubExprThatCouldBeView(compat::IgnoreImplicit(expr->getArg(0))); + handleSubExprThatCouldBeView(expr->getArg(0)); } else if (dc.Function("insert")) { - handleSubExprThatCouldBeView(compat::IgnoreImplicit(expr->getArg(1))); + handleSubExprThatCouldBeView(expr->getArg(1)); } return true; } @@ -330,7 +334,7 @@ bool StringView::VisitCXXConstructExpr(CXXConstructExpr const* expr) return true; } if (expr->getNumArgs() > 0) - handleSubExprThatCouldBeView(compat::IgnoreImplicit(expr->getArg(0))); + handleSubExprThatCouldBeView(expr->getArg(0)); return true; } diff --git a/compilerplugins/clang/test/stringview.cxx b/compilerplugins/clang/test/stringview.cxx index 63c8548a0b45..c03fbb84cb32 100644 --- a/compilerplugins/clang/test/stringview.cxx +++ b/compilerplugins/clang/test/stringview.cxx @@ -145,6 +145,9 @@ void f5(char const* s1, sal_Int32 n1, char16_t const* s2, sal_Int32 n2, OString call_view(OUString(OUString::number(0))); // expected-error-re@+1 {{instead of an 'rtl::OUString' constructed from a 'typename std::enable_if_t<ToStringHelper<OUString>::allowOUStringConcat && ToStringHelper<OUString>::allowOUStringConcat, OUStringConcat<OUString, OUString>{{ ?}}>' (aka 'rtl::OUStringConcat<rtl::OUString, rtl::OUString>'), pass a 'std::u16string_view' via 'rtl::OUStringConcatenation' [loplugin:stringview]}} call_view(OUString(s4 + s4)); + + (void)(s3 == l1); + (void)(s4 == l2); } void f5(OUString s)