re PR c++/50224 ([C++0x] bogus unused parameter warning (it is referenced in lambda))
authorJason Merrill <jason@redhat.com>
Tue, 30 Aug 2011 04:30:58 +0000 (00:30 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 30 Aug 2011 04:30:58 +0000 (00:30 -0400)
PR c++/50224
* semantics.c (finish_id_expression): Mark captured variables used.

From-SVN: r178277

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C [new file with mode: 0644]

index 17065de265d2002bfef9a8175623e664ffdd6360..315078aad33e36b3751e455a9a0b0d7614d8fd3f 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-29  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50224
+       * semantics.c (finish_id_expression): Mark captured variables used.
+
 2011-08-29  Jakub Jelinek  <jakub@redhat.com>
            Jason Merrill  <jason@redhat.com>
 
index 5deb2ebfbd168381e6fd71ac9572c9cce4ac8f1b..07f53b5cd127b85140c5ae9d1830adbe5673f659 100644 (file)
@@ -2949,6 +2949,9 @@ finish_id_expression (tree id_expression,
          tree lambda_expr = NULL_TREE;
          tree initializer = convert_from_reference (decl);
 
+         /* Mark it as used now even if the use is ill-formed.  */
+         mark_used (decl);
+
          /* Core issue 696: "[At the July 2009 meeting] the CWG expressed
             support for an approach in which a reference to a local
             [constant] automatic variable in a nested class or lambda body
index c503b69046db50f141335487016cf1fb895531e6..fe0a6aa11e2200d1e48bbc86c8ddf658716d1620 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-29  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50224
+       * g++.dg/cpp0x/lambda/lambda-use2.C: New.
+
 2011-08-29  Jakub Jelinek  <jakub@redhat.com>
            Jason Merrill  <jason@redhat.com>
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C
new file mode 100644 (file)
index 0000000..695a0b4
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/50224
+// { dg-options "-std=c++0x -Wunused-parameter" }
+
+struct T;
+
+void m(T& t) // ERROR here
+{
+  [&]{
+    t; // ``t`` is referenced here
+  };
+}