https://gcc.gnu.org/g:04ec3d4712519e32f85c034ff4237fcd5f9fbe39

commit r16-7094-g04ec3d4712519e32f85c034ff4237fcd5f9fbe39
Author: Lucas Chollet <[email protected]>
Date:   Mon Jan 26 18:16:53 2026 +0800

    c++: Fix false positive with -Wunused [PR114450]
    
    The patch fixes a bug in the detection of the usage of static variables
    inside generic lambdas.  The comment in finish_id_expression_1 already
    mentions this case, but the code didn't actually handle it.
    
            PR c++/114450
    
    gcc/cp/ChangeLog:
    
            * lambda.cc (generic_lambda_fn_p): Handle null argument.
            * semantics.cc (finish_id_expression_1): Check for generic lambda.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/warn/Wunused-var-42.C: New test.
    
    Co-authored-by: Jason Merrill <[email protected]>

Diff:
---
 gcc/cp/lambda.cc                           |  2 +-
 gcc/cp/semantics.cc                        |  4 +++-
 gcc/testsuite/g++.dg/warn/Wunused-var-42.C | 33 ++++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
index 402d5f7110a0..e1ff304ffe89 100644
--- a/gcc/cp/lambda.cc
+++ b/gcc/cp/lambda.cc
@@ -1153,7 +1153,7 @@ prepare_op_call (tree fn, int nargs)
 bool
 generic_lambda_fn_p (tree callop)
 {
-  return (LAMBDA_FUNCTION_P (callop)
+  return (callop && LAMBDA_FUNCTION_P (callop)
          && DECL_TEMPLATE_INFO (callop)
          && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (callop)));
 }
diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index 0a15b32a16d2..35bc48e49dc0 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -4814,7 +4814,9 @@ finish_id_expression_1 (tree id_expression,
       /* A use in unevaluated operand might not be instantiated appropriately
         if tsubst_copy builds a dummy parm, or if we never instantiate a
         generic lambda, so mark it now.  */
-      if (processing_template_decl && cp_unevaluated_operand)
+      if (processing_template_decl
+         && (cp_unevaluated_operand
+             || generic_lambda_fn_p (current_function_decl)))
        mark_type_use (decl);
 
       /* Disallow uses of local variables from containing functions, except
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-42.C 
b/gcc/testsuite/g++.dg/warn/Wunused-var-42.C
new file mode 100644
index 000000000000..35c438bbcc77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-42.C
@@ -0,0 +1,33 @@
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused" }
+
+template <typename F>
+void f (F &&d)
+{
+  static unsigned context;
+  d(context);
+}
+
+void g ()
+{
+  static int b;
+  f([](auto c) { return c <= b; });
+}
+
+void h ()
+{
+  static int b = 0; // { dg-warning "unused variable" }
+  f([](auto c) { return c <= 0; });
+}
+
+void i ()
+{
+  static int b = 0;
+  [](auto c) { return c <= b; };
+}
+
+void j ()
+{
+  static int b = 0; // { dg-warning "unused variable" }
+  [](auto c) { return c <= 0; };
+}

Reply via email to