compilerplugins/clang/test/unusedcapturedefault.cxx | 11 +++++++++++ compilerplugins/clang/unusedcapturedefault.cxx | 6 ++++++ 2 files changed, 17 insertions(+)
New commits: commit a1f71ce7aa214ec89cb9f6608cff69c1ca724879 Author: Stephan Bergmann <[email protected]> AuthorDate: Fri Dec 19 09:41:59 2025 +0100 Commit: Stephan Bergmann <[email protected]> CommitDate: Fri Dec 19 13:04:13 2025 +0100 Fix loplugin:unusedcapturedefault for lambdas in template code ...as found failing at <https://gerrit.libreoffice.org/c/core/+/195869/1> "tdf#165233 Replaced lambda explicit capture with capture-default". The lambda class in f3 in compilerplugins/clang/test/unusedcapturedefault.cxx is > CXXRecordDecl 0x42964240 </home/sberg/lo/core/compilerplugins/clang/test/unusedcapturedefault.cxx:25:12> col:12 implicit class definition > |-DefinitionData lambda empty standard_layout trivially_copyable literal can_const_default_init > | |-DefaultConstructor defaulted_is_constexpr > | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param > | |-MoveConstructor exists simple trivial needs_implicit > | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param > | |-MoveAssignment > | `-Destructor simple irrelevant trivial constexpr needs_implicit > `-CXXMethodDecl 0x42964380 <col:16, col:30> col:12 operator() 'auto () const' inline > `-CompoundStmt 0x429644f0 <col:18, col:30> > `-ReturnStmt 0x429644e0 <col:20, col:27> > `-DeclRefExpr 0x429644c0 <col:27> 'const T' lvalue ParmVar 0x42963ec8 'x' 'T' refers_to_enclosing_variable_or_capture without any FieldDecls. Change-Id: I57bbb8ae3e052d3e00644228b83612e06ab37a0b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195879 Reviewed-by: Stephan Bergmann <[email protected]> Tested-by: Jenkins diff --git a/compilerplugins/clang/test/unusedcapturedefault.cxx b/compilerplugins/clang/test/unusedcapturedefault.cxx index d98eec04da36..686a82ab9172 100644 --- a/compilerplugins/clang/test/unusedcapturedefault.cxx +++ b/compilerplugins/clang/test/unusedcapturedefault.cxx @@ -13,4 +13,15 @@ auto f1() return [=] { return 0; }; } +auto f2() +{ + // expected-error@+1 {{unused capture-default [loplugin:unusedcapturedefault]}} + return [=](auto x) { return x; }; +} + +template <typename T> auto f3(T x) +{ + return [=]() { return x; }; +} + /* 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 index 57f6669dc309..a6716679d22e 100644 --- a/compilerplugins/clang/unusedcapturedefault.cxx +++ b/compilerplugins/clang/unusedcapturedefault.cxx @@ -37,6 +37,12 @@ public: { return true; } + if (expr->getLambdaClass()->isDependentType()) + { + // When the lambda appears within template code, the list of implicit captures can oddly + // be empty, so filter those out here: + return true; + } report(DiagnosticsEngine::Warning, "unused capture-default", expr->getCaptureDefaultLoc()) << expr->getSourceRange(); return true;
