re PR c++/55710 ([C++11] Linkage errors with lambdas)
authorJason Merrill <jason@redhat.com>
Wed, 13 Feb 2013 18:17:39 +0000 (13:17 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 13 Feb 2013 18:17:39 +0000 (13:17 -0500)
PR c++/55710
* semantics.c (maybe_add_lambda_conv_op): Mark static thunk
TREE_USED.

From-SVN: r196025

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

index ec1e7f2062880439cb75fb05667e603a8afcc046..7cb0653cea159f71983595cd3a95bf59cd6e9648 100644 (file)
@@ -1,5 +1,9 @@
 2013-02-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/55710
+       * semantics.c (maybe_add_lambda_conv_op): Mark static thunk
+       TREE_USED.
+
        PR c++/55879
        * semantics.c (cxx_bind_parameters_in_call): Undo DECL_BY_REFERENCE.
 
index 46c2e6438067a39dda90a6b0cc2256cc35b053dc..95158a5877160994481f80b829505c6b9535916b 100644 (file)
@@ -9559,6 +9559,8 @@ maybe_add_lambda_conv_op (tree type)
   body = begin_function_body ();
   compound_stmt = begin_compound_stmt (0);
 
+  /* decl_needed_p needs to see that it's used.  */
+  TREE_USED (statfn) = 1;
   finish_return_stmt (decay_conversion (statfn, tf_warning_or_error));
 
   finish_compound_stmt (compound_stmt);
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv7.C
new file mode 100644 (file)
index 0000000..89e4e4b
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/55710
+// { dg-do link { target c++11 } }
+
+template <class T>
+struct X {
+  static void (*code) ();
+};
+
+template <class T>
+void (*X<T>::code) () = []{};  // Line 7
+
+struct Y {
+  void (*code) () = []{} ; // Line 10
+  void operator()() { code(); }
+};
+
+int main () {
+  X<int>::code();
+  Y()();
+}