summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2021-08-19 08:08:20 +0200
committerStephan Bergmann <sbergman@redhat.com>2021-08-20 14:25:38 +0200
commit2bc1a0431becd1c6d4c888a6e301237dcecefd97 (patch)
treef1a10ef12eeb5e854c561f98abcc57cf32dd4f1f /compilerplugins
parent46d3fdeb4fa35e0575395a3a91213fd81fda0e50 (diff)
New loplugin:unusedcapturedefault
In sc/qa/unit/ucalc_formula.cxx, dropping the capture-default from the lExpectedinF lambda revealed that MSVC in C++17 mode (i.e., when building without --with-latest-c++) requires ROW_RANGE (a local const int variable from the enclosing TestFormula::testTdf97369) to be captured, even though all uses of that variable within the lambda body are constant expressions. That is still true at least for the latest Visual Studio 2019 version 16.11.1. (This is not an issue for the lExpectedinH and lExpectedinI lambdas a few lines further down, as they, in addition to using that ROW_RANGE, also use the local const double variables SHIFT1 and SHIFT2, whose uses are not constant expressions, so they are implicitly captured and loplugin:unusedcapturedefault does not suggest dropping those lambdas' capture-defaults in the first place.) Change-Id: Iee7efb485187cbe8eba6a2d470afca4993eb1816 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120693 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/test/unusedcapturedefault.cxx16
-rw-r--r--compilerplugins/clang/unusedcapturedefault.cxx60
2 files changed, 76 insertions, 0 deletions
diff --git a/compilerplugins/clang/test/unusedcapturedefault.cxx b/compilerplugins/clang/test/unusedcapturedefault.cxx
new file mode 100644
index 000000000000..d98eec04da36
--- /dev/null
+++ b/compilerplugins/clang/test/unusedcapturedefault.cxx
@@ -0,0 +1,16 @@
+/* -*- 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/.
+ */
+
+auto f1()
+{
+ // expected-error@+1 {{unused capture-default [loplugin:unusedcapturedefault]}}
+ return [=] { return 0; };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/compilerplugins/clang/unusedcapturedefault.cxx b/compilerplugins/clang/unusedcapturedefault.cxx
new file mode 100644
index 000000000000..57f6669dc309
--- /dev/null
+++ b/compilerplugins/clang/unusedcapturedefault.cxx
@@ -0,0 +1,60 @@
+/* -*- 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 "plugin.hxx"
+
+namespace
+{
+class UnusedCaptureDefault : public loplugin::FilteringPlugin<UnusedCaptureDefault>
+{
+public:
+ explicit UnusedCaptureDefault(loplugin::InstantiationData const& data)
+ : FilteringPlugin(data)
+ {
+ }
+
+ bool preRun() override { return compiler.getLangOpts().CPlusPlus; }
+
+ bool VisitLambdaExpr(LambdaExpr const* expr)
+ {
+ if (ignoreLocation(expr))
+ {
+ return true;
+ }
+ if (expr->getCaptureDefault() == LCD_None)
+ {
+ return true;
+ }
+ if (expr->implicit_capture_begin() != expr->implicit_capture_end())
+ {
+ return true;
+ }
+ report(DiagnosticsEngine::Warning, "unused capture-default", expr->getCaptureDefaultLoc())
+ << expr->getSourceRange();
+ return true;
+ }
+
+private:
+ void run() override
+ {
+ if (preRun())
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+ }
+};
+
+loplugin::Plugin::Registration<UnusedCaptureDefault> unusedcapturedefault("unusedcapturedefault");
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */