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;

Reply via email to