diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2021-08-19 08:08:20 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2021-08-20 14:25:38 +0200 |
commit | 2bc1a0431becd1c6d4c888a6e301237dcecefd97 (patch) | |
tree | f1a10ef12eeb5e854c561f98abcc57cf32dd4f1f /compilerplugins | |
parent | 46d3fdeb4fa35e0575395a3a91213fd81fda0e50 (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.cxx | 16 | ||||
-rw-r--r-- | compilerplugins/clang/unusedcapturedefault.cxx | 60 |
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: */ |