re PR c++/47049 ([C++0x] ICE in write_unnamed_type_name with lambda use)
authorJason Merrill <jason@redhat.com>
Sat, 28 May 2011 00:53:49 +0000 (20:53 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 28 May 2011 00:53:49 +0000 (20:53 -0400)
PR c++/47049
* semantics.c (maybe_add_lambda_conv_op): Fix COMDAT sharing.
* decl.c (start_preparsed_function): Don't call comdat_linkage for
a template.

From-SVN: r174375

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

index 9ccdee5a178a586a4b1e01f85222a09be9a836a3..3419d518ffbe7c731362990f3de88d807ab7b98b 100644 (file)
@@ -1,5 +1,10 @@
 2011-05-27  Jason Merrill  <jason@redhat.com>
 
+       PR c++/47049
+       * semantics.c (maybe_add_lambda_conv_op): Fix COMDAT sharing.
+       * decl.c (start_preparsed_function): Don't call comdat_linkage for
+       a template.
+
        PR c++/47132
        * mangle.c (write_expression): Handle MODOP_EXPR.
 
index 3cc25bdbe332d589b4526f4a7f95fdd94d4bf329..8fe32592c5fb78134e375aca823101b60d386d44 100644 (file)
@@ -12672,6 +12672,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
        DECL_EXTERNAL (decl1) = 0;
 
       if (ctx != NULL_TREE && DECL_DECLARED_INLINE_P (ctx)
+         && !processing_template_decl
          && TREE_PUBLIC (ctx))
        /* This is a function in a local class in an extern inline
           function.  */
index 557bf4ce0b1de758b86fbf28effd0589fe58b61c..854bac7d6e95e343a4a012b5c01157d9e181c795 100644 (file)
@@ -8578,7 +8578,7 @@ maybe_add_lambda_conv_op (tree type)
     {
       /* Put the thunk in the same comdat group as the call op.  */
       struct cgraph_node *callop_node, *thunk_node;
-      DECL_COMDAT_GROUP (statfn) = DECL_COMDAT_GROUP (callop);
+      DECL_COMDAT_GROUP (statfn) = cxx_comdat_group (callop);
       callop_node = cgraph_get_create_node (callop);
       thunk_node = cgraph_get_create_node (statfn);
       gcc_assert (callop_node->same_comdat_group == NULL);
index 915cd906aaa122330bd1e87dfcd8c7ebaf73cf81..36edc225434e0d25995e11f88f5e48351df02091 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-27  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/lambda/lambda-template2.C: New.
+
 2011-05-27  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/18918
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C
new file mode 100644 (file)
index 0000000..12ffde7
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/47049
+// { dg-options -std=c++0x }
+
+enum { E = 0, F = 1 };
+template <int N, int M = ((N == 1) ? F : E)> class S {};
+template <int N>
+struct T
+{
+  static void
+  foo (S<N> *p)
+  {
+    S<N> u;
+    [&u] ()->bool {} ();
+  }
+};
+
+int main()
+{
+  T<0>().foo(0);
+}