[C++] compiler incompatibility with lambdas
authorNathan Sidwell <nathan@acm.org>
Mon, 25 Mar 2019 12:22:47 +0000 (12:22 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 25 Mar 2019 12:22:47 +0000 (12:22 +0000)
https://gcc.gnu.org/ml/gcc-patches/2019-03/msg00982.html
* lambda.c (maybe_add_lambda_conv_op): Don't add to comdat group.
* g++.dg/abi/lambda-static-1.C: New.

From-SVN: r269915

gcc/cp/ChangeLog
gcc/cp/lambda.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/lambda-static-1.C [new file with mode: 0644]

index 16f1b8e..7589b30 100644 (file)
@@ -1,3 +1,7 @@
+2019-03-25  Nathan Sidwell  <nathan@acm.org>
+
+       * lambda.c (maybe_add_lambda_conv_op): Don't add to comdat group.
+
 2019-03-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/60702
index 3e17676..9366418 100644 (file)
@@ -1252,12 +1252,6 @@ maybe_add_lambda_conv_op (tree type)
 
   start_preparsed_function (statfn, NULL_TREE,
                            SF_PRE_PARSED | SF_INCLASS_INLINE);
-  if (DECL_ONE_ONLY (statfn))
-    {
-      /* Put the thunk in the same comdat group as the call op.  */
-      cgraph_node::get_create (statfn)->add_to_same_comdat_group
-       (cgraph_node::get_create (callop));
-    }
   tree body = begin_function_body ();
   tree compound_stmt = begin_compound_stmt (0);
   if (!generic_lambda_p)
index ef7ae1b..5aead43 100644 (file)
@@ -1,3 +1,7 @@
+2019-03-25  Nathan Sidwell  <nathan@acm.org>
+
+       * g++.dg/abi/lambda-static-1.C: New.
+
 2019-03-25  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/89802
diff --git a/gcc/testsuite/g++.dg/abi/lambda-static-1.C b/gcc/testsuite/g++.dg/abi/lambda-static-1.C
new file mode 100644 (file)
index 0000000..3d23ddc
--- /dev/null
@@ -0,0 +1,25 @@
+// { dg-do compile { target { c++14 && comdat_group } } }
+// { dg-additional-options -fno-inline }
+
+inline auto lamby () 
+{
+  return [] {};
+}
+
+void direct ()
+{
+  lamby ()();
+}
+
+void indirect ()
+{
+  void (*invoke) () = lamby ();
+
+  invoke ();
+}
+
+// The call operator and the static invoker should be comdat, but not
+// the same group.  (that would be a compiler incompatibility)
+
+// { dg-final { scan-assembler ".section\[\t ]*.text._ZZ5lambyvENKUlvE_clEv,\[^\n\r]*,_ZZ5lambyvENKUlvE_clEv,comdat" } }
+// { dg-final { scan-assembler ".section\[\t ]*.text._ZZ5lambyvENUlvE_4_FUNEv,\[^\n\r]*,_ZZ5lambyvENUlvE_4_FUNEv,comdat" } }