[Libreoffice-commits] core.git: compilerplugins/clang include/oox
Noel (via logerrit)
logerrit at kemper.freedesktop.org
Fri Jan 22 16:46:40 UTC 2021
compilerplugins/clang/pointerbool.cxx | 37 +++++++++++++++++++++++++++++
compilerplugins/clang/test/pointerbool.cxx | 14 ++++++++++
include/oox/dump/dumperbase.hxx | 2 -
3 files changed, 52 insertions(+), 1 deletion(-)
New commits:
commit 6907cbb8973c9637a07032ad1b885280e91f4d4c
Author: Noel <noel.grandin at collabora.co.uk>
AuthorDate: Fri Jan 22 13:59:23 2021 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Fri Jan 22 17:46:01 2021 +0100
improve loplugin:pointerbool
to look through template instantiations involving std::forward
motivated by
commit b1617acde182d1683bdfb529794d7456f8b4bf6d
drop RadioButton arg defaults
the nBits arg in builder.cxx was in the wrong place
Change-Id: I222ea2aeea6f44ae54839e824a247a8105392c2d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109789
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/compilerplugins/clang/pointerbool.cxx b/compilerplugins/clang/pointerbool.cxx
index 66c6a04b3697..6886e1fac63f 100644
--- a/compilerplugins/clang/pointerbool.cxx
+++ b/compilerplugins/clang/pointerbool.cxx
@@ -38,12 +38,42 @@ public:
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
}
+ bool shouldVisitTemplateInstantiations() const { return true; }
+
+ bool PreTraverseFunctionDecl(FunctionDecl* decl);
+ bool PostTraverseFunctionDecl(FunctionDecl* decl, bool);
+ bool TraverseFunctionDecl(FunctionDecl* decl);
bool VisitCallExpr(CallExpr const*);
private:
llvm::Optional<APSInt> getCallValue(const Expr* arg);
+ std::vector<FunctionDecl*> functions_;
};
+bool PointerBool::PreTraverseFunctionDecl(FunctionDecl* decl)
+{
+ functions_.push_back(decl);
+ return true;
+}
+
+bool PointerBool::PostTraverseFunctionDecl(FunctionDecl*, bool)
+{
+ assert(!functions_.empty());
+ functions_.pop_back();
+ return true;
+}
+
+bool PointerBool::TraverseFunctionDecl(FunctionDecl* decl)
+{
+ bool ret = true;
+ if (PreTraverseFunctionDecl(decl))
+ {
+ ret = FilteringPlugin::TraverseFunctionDecl(decl);
+ PostTraverseFunctionDecl(decl, ret);
+ }
+ return ret;
+}
+
bool PointerBool::VisitCallExpr(CallExpr const* callExpr)
{
if (ignoreLocation(callExpr))
@@ -98,6 +128,13 @@ bool PointerBool::VisitCallExpr(CallExpr const* callExpr)
<< arg->getSourceRange();
report(DiagnosticsEngine::Note, "method here", param->getLocation())
<< param->getSourceRange();
+ if (!functions_.empty())
+ {
+ auto callerFD = functions_.back();
+ if (callerFD->isTemplateInstantiation())
+ report(DiagnosticsEngine::Note, "instantiated from here",
+ callerFD->getPointOfInstantiation());
+ }
}
return true;
}
diff --git a/compilerplugins/clang/test/pointerbool.cxx b/compilerplugins/clang/test/pointerbool.cxx
index 276a95ae1e00..fcb4a9a31b57 100644
--- a/compilerplugins/clang/test/pointerbool.cxx
+++ b/compilerplugins/clang/test/pointerbool.cxx
@@ -29,4 +29,18 @@ void test1(int* p1)
func_bool(aSeq[0]);
}
+void func_bool2(bool); // expected-note {{method here [loplugin:pointerbool]}}
+
+template <typename... Args> void func_bool_via_forward_template(Args&&... args)
+{
+ // expected-error at +1 {{possibly unwanted implicit conversion when calling bool param [loplugin:pointerbool]}}
+ func_bool2(std::forward<Args>(args)...);
+}
+
+void test2(int p1)
+{
+ // expected-note at +1 {{instantiated from here [loplugin:pointerbool]}}
+ func_bool_via_forward_template(p1);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/include/oox/dump/dumperbase.hxx b/include/oox/dump/dumperbase.hxx
index bfdacf53b42c..9be2b341ff48 100644
--- a/include/oox/dump/dumperbase.hxx
+++ b/include/oox/dump/dumperbase.hxx
@@ -366,7 +366,7 @@ void StringHelper::appendValue( OUStringBuffer& rStr, Type nData, FormatType eFm
case FORMATTYPE_SHORTHEX: appendShortHex( rStr, nData ); break;
case FORMATTYPE_BIN: appendBin( rStr, nData ); break;
case FORMATTYPE_FIX: appendFix( rStr, nData ); break;
- case FORMATTYPE_BOOL: appendBool( rStr, nData ); break;
+ case FORMATTYPE_BOOL: appendBool( rStr, static_cast<bool>(nData) ); break; // avoid loplugin:pointerbool warning
default:;
}
}
More information about the Libreoffice-commits
mailing list