c++: -Wunused, constant, and generic lambda [PR96311]
authorJason Merrill <jason@redhat.com>
Mon, 5 Apr 2021 20:22:51 +0000 (16:22 -0400)
committerJason Merrill <jason@redhat.com>
Mon, 5 Apr 2021 21:27:24 +0000 (17:27 -0400)
We never called mark_use for a return value in a function with dependent
return type.  In that situation we don't know if the use is as an rvalue or
lvalue, but we can use mark_exp_read instead.

gcc/cp/ChangeLog:

PR c++/96311
* typeck.c (check_return_expr): Call mark_exp_read in dependent
case.

gcc/testsuite/ChangeLog:

PR c++/96311
* g++.dg/cpp1y/lambda-generic-Wunused.C: New test.

gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp1y/lambda-generic-Wunused.C [new file with mode: 0644]

index 8535ecc..11dee7d 100644 (file)
@@ -10215,6 +10215,9 @@ check_return_expr (tree retval, bool *no_warning)
     dependent:
       /* We should not have changed the return value.  */
       gcc_assert (retval == saved_retval);
+      /* We don't know if this is an lvalue or rvalue use, but
+        either way we can mark it as read.  */
+      mark_exp_read (retval);
       return retval;
     }
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-Wunused.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-Wunused.C
new file mode 100644 (file)
index 0000000..b43cbe6
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/96311
+// { dg-do compile { target c++14 } }
+// { dg-additional-options -Wunused }
+
+auto foo()
+{
+  constexpr int used = 0;
+  return
+    [](auto unused)
+    {
+      return used;
+    };
+}
+
+int main()
+{
+  foo()(42);
+}